spher.f Source File


Source Code

  !-------------------------------------------------------------------------------
  !> Summary: Spherical harmonics except the factor \(\exp{i m \phi}\)
  !> Author: 
  !> Category: special-functions, numerical-tools, KKRimp
  !> Deprecated: True 
  !> Spherical harmonics except the factor \(\exp{i m \phi}\)
  !> \(m=-l\) to \(l\) , for given \(l\).
  !> \(x=cos(\theta)\)
  !-------------------------------------------------------------------------------
      SUBROUTINE SPHER(YLM,L,X)
C     .. Scalar Arguments ..
      DOUBLE PRECISION X
      INTEGER L
C     ..
C     .. Array Arguments ..
      DOUBLE PRECISION YLM(*)
C     ..
C     .. Local Scalars ..
      DOUBLE PRECISION FAC,OVR1,PI,QQ
      INTEGER I,II,L2,LM,LN,M,NN
C     ..
C     .. Intrinsic Functions ..
      INTRINSIC ABS,ATAN,DBLE,SQRT
C     ..
      PI = 4.0D0*ATAN(1.0D0)
c
c
      OVR1 = ABS(X) - 1.D0
      IF (OVR1.GT.0.1D-12) THEN
        WRITE (6,FMT=9000) X
        STOP
      ELSE IF (ABS(OVR1).LT.1.D-10) THEN
        IF (X.GT.0.0D0) THEN
          FAC = 1.0D0
        ELSE
          FAC = (-1)**L
        END IF
        L2 = 2*L + 1
        DO 10 I = 1,L2
          YLM(I) = 0.0D0
   10   CONTINUE
        YLM(L+1) = SQRT(DBLE(L2)/ (4.0D0*PI))*FAC
        RETURN
      END IF
c
c l<0
      IF (L.LT.0) THEN
        WRITE (6,FMT=*) ' === l=',L,' < 0  : in sub.spher. ==='
        STOP '=== stop in sub.spher. (l<0) ==='
c l=0
      ELSE IF (L.EQ.0) THEN
        YLM(1) = SQRT(1.0D0/ (4.0D0*PI))
c l=1
      ELSE IF (L.EQ.1) THEN
        FAC = SQRT(3.0D0/ (4.0D0*PI))
        YLM(1) = FAC*SQRT((1.0D0-X*X)/2.0D0)
        YLM(2) = FAC*X
        YLM(3) = -YLM(1)
c l>1
      ELSE
        YLM(1) = 1.0D0
        YLM(2) = X
        DO 20 I = 2,L
          YLM(I+1) = ((2*I-1)*X*YLM(I)- (I-1)*YLM(I-1))/I
   20   CONTINUE
        FAC = 1.0D0/SQRT(1.0D0-X*X)
        DO 40 M = 1,L
          LM = L + M
          YLM(LM+1) = FAC* (- (L-M+1)*X*YLM(LM)+ (LM-1)*YLM(L))
          IF (M.LT.L) THEN
            NN = M + 1
            DO 30 I = NN,L
              II = L - I + NN
              YLM(II) = FAC* (- (II-M)*X*YLM(II)+ (II+M-2)*YLM(II-1))
   30       CONTINUE
          END IF
   40   CONTINUE
        FAC = SQRT((2*L+1)/ (4.0D0*PI))
        YLM(L+1) = FAC*YLM(L+1)
        DO 50 M = 1,L
          FAC = -FAC/SQRT(DBLE((L+M)* (L-M+1)))
          LM = L + 1 + M
          LN = L + 1 - M
          QQ = YLM(LM)
          YLM(LM) = FAC*QQ
          YLM(LN) = ABS(FAC)*QQ
   50   CONTINUE
      END IF
c
      RETURN
 9000 FORMAT (/,/,3x,'==invalid argument for spher; x=',D24.16,' ==')
      END SUBROUTINE