cylm02.f Source File


Source Code

  !-------------------------------------------------------------------------------
  !> Summary: Computes complex spherical Harmonics and their derivative 
  !> Author: 
  !> Category: xc-potential, special-functions , KKRimp
  !> Deprecated: True 
  !> Preparation of cylm0(=ylm(ip,i)), cylmt1(=dylm/dtheta),
  !> cylmt2(=d2ylm/dt2),
  !> cylmf1, cylmf2 are for fai.
  !> cylmtf=d2ylm/dfdt
  !> i=1,2,....,(lmax+1)**2
  !>
  !> @warning
  !> A hard coded loop dimension is used here (parameter `ijd`)
  !> @endwarning
  !------------------------------------------------------------------------------- 
      SUBROUTINE CYLM02(LMAX,COSX,FAI,LPOT2P,LMMAXD,THET,YLM,DYLMT1,
     +                  DYLMT2,DYLMF1,DYLMF2,DYLMTF)
c
C     .. Parameters ..
      INTEGER IJD
      PARAMETER (IJD=434)
C     ..
C     .. Scalar Arguments ..
      INTEGER LMAX,LMMAXD,LPOT2P
C     ..
C     .. Array Arguments ..
      DOUBLE PRECISION COSX(IJD),DYLMF1(IJD,LMMAXD),DYLMF2(IJD,LMMAXD),
     +                 DYLMT1(IJD,LMMAXD),DYLMT2(IJD,LMMAXD),
     +                 DYLMTF(IJD,LMMAXD),FAI(IJD),THET(IJD),
     +                 YLM(IJD,LMMAXD)
C     ..
C     .. Local Scalars ..
      DOUBLE COMPLEX CI,EM1F,EM2F,EP1F,EP2F
      DOUBLE PRECISION AAA,CCC,DI,FI,ONE,PI,SSS
      INTEGER I,IP,L,LLMAX,LM,LM1,LM1M,LM2,LMM,LMM1,LMM1M,LMM2,M,MM
C     ..
C     .. Local Arrays ..
      DOUBLE COMPLEX CYLM0(LMMAXD),CYLMF1(LMMAXD),CYLMF2(LMMAXD),
     +               CYLMT1(LMMAXD),CYLMT2(LMMAXD),CYLMTF(LMMAXD)
      DOUBLE PRECISION BB1(LMMAXD),YL(LPOT2P)
C     ..
C     .. External Subroutines ..
!       EXTERNAL SPHER,TRAREA
C     ..
C     .. Intrinsic Functions ..
      INTRINSIC ACOS,ATAN,CMPLX,CONJG,COS,DBLE,SIN,SQRT
C     ..
      CI = CMPLX(0.d0,1.d0)
      ONE = 1.d0
      PI = 4.d0*ATAN(ONE)
      LLMAX = (LMAX+1)**2

      DO 120 IP = 1,IJD

        THET(IP) = ACOS(COSX(IP))
        FI = FAI(IP)
        DI = 2*FAI(IP)
        EP1F = CMPLX(COS(FI),SIN(FI))
        EM1F = CONJG(EP1F)
        EP2F = CMPLX(COS(DI),SIN(DI))
        EM2F = CONJG(EP2F)

        DO 50 L = 0,LMAX
c
          CALL SPHER(YL,L,COSX(IP))
          DO 10 M = -L,L
            MM = L + M + 1
            I = (L+1)**2 - L + M
            AAA = M*FAI(IP)
            CCC = COS(AAA)
            SSS = SIN(AAA)
            CYLM0(I) = YL(MM)*CMPLX(CCC,SSS)
   10     CONTINUE

          DO 20 M = -L,L
            I = (L+1)**2 - L + M
            CYLMT1(I) = 0.D0
            CYLMT2(I) = 0.D0
            CYLMTF(I) = 0.D0
   20     CONTINUE

          DO 30 M = -L,L
            I = (L+1)**2 - L + M

            LMM1M = L - M - 1
            LMM = L - M
            LMM1 = L - M + 1
            LMM2 = L - M + 2
            LM1M = L + M - 1
            LM = L + M
            LM1 = L + M + 1
            LM2 = L + M + 2

            CYLMT2(I) = CYLMT2(I) - (LMM*LM1+LMM1*LM)/4.D0*CYLM0(I)

            IF (M+2.LE.L) CYLMT2(I) = CYLMT2(I) +
     +                                SQRT(DBLE(LMM1M*LMM*LM1*LM2))/4*
     +                                CYLM0(I+2)*EM2F

            IF (M+1.LE.L) CYLMT1(I) = CYLMT1(I) +
     +                                SQRT(DBLE(LMM*LM1))/2*CYLM0(I+1)*
     +                                EM1F

            IF (M-1.GE.-L) CYLMT1(I) = CYLMT1(I) -
     +                                 SQRT(DBLE(LM*LMM1))/2*CYLM0(I-1)*
     +                                 EP1F

            IF (M-2.GE.-L) CYLMT2(I) = CYLMT2(I) +
     +                                 SQRT(DBLE(LMM1*LMM2*LM1M*LM))/4*
     +                                 CYLM0(I-2)*EP2F

   30     CONTINUE

          DO 40 M = -L,L
            I = (L+1)**2 - L + M
            CYLMF1(I) = CI*M*CYLM0(I)
            CYLMF2(I) = -M*M*CYLM0(I)
            CYLMTF(I) = CI*M*CYLMT1(I)
   40     CONTINUE

   50   CONTINUE
c
c        calculate real spherical harmonics differenciated
c
c
c        write(6,9005) (cylm0(i),i=1,5)
c9005 format(1x,' cylm0',4f10.5)
        CALL TRAREA(CYLM0,BB1,LMAX)

        DO 60 M = 1,LLMAX
          YLM(IP,M) = BB1(M)
   60   CONTINUE
c
c        write(6,9006) (ylm(ip,i),i=1,5)
c9006 format(1x,' ylm',10f10.5)
c
c
        CALL TRAREA(CYLMT1,BB1,LMAX)
        DO 70 M = 1,LLMAX
          DYLMT1(IP,M) = BB1(M)
   70   CONTINUE
C
        CALL TRAREA(CYLMT2,BB1,LMAX)
        DO 80 M = 1,LLMAX
          DYLMT2(IP,M) = BB1(M)
   80   CONTINUE
c
        CALL TRAREA(CYLMF1,BB1,LMAX)
        DO 90 M = 1,LLMAX
          DYLMF1(IP,M) = BB1(M)
   90   CONTINUE
C
        CALL TRAREA(CYLMF2,BB1,LMAX)
        DO 100 M = 1,LLMAX
          DYLMF2(IP,M) = BB1(M)
  100   CONTINUE
C
        CALL TRAREA(CYLMTF,BB1,LMAX)
        DO 110 M = 1,LLMAX
          DYLMTF(IP,M) = BB1(M)
  110   CONTINUE
C
  120 CONTINUE
      RETURN
      END SUBROUTINE