33 #include "../base/base_uses.f90"
46 MODULE PROCEDURE rvy_lm, rry_lm, cvy_lm, ccy_lm
50 MODULE PROCEDURE dry_lm, dcy_lm
53 INTERFACE clebsch_gordon
54 MODULE PROCEDURE clebsch_gordon_real, clebsch_gordon_complex
57 INTERFACE clebsch_gordon_getm
61 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'spherical_harmonics'
63 REAL(KIND=
dp),
DIMENSION(:, :, :),
ALLOCATABLE :: cg_table
65 REAL(KIND=
dp) :: osq2, sq2
79 SUBROUTINE clebsch_gordon_complex(l1, m1, l2, m2, clm)
80 INTEGER,
INTENT(IN) :: l1, m1, l2, m2
81 REAL(KIND=
dp),
DIMENSION(:),
INTENT(OUT) :: clm
83 INTEGER :: icase, ind, l, lm, lp, n
88 IF (n >
SIZE(clm)) cpabort(
"Array too small")
90 IF ((m1 >= 0 .AND. m2 >= 0) .OR. (m1 < 0 .AND. m2 < 0))
THEN
95 ind = order(l1, m1, l2, m2)
97 DO lp = mod(l, 2), l, 2
99 clm(lm) = cg_table(ind, lm, icase)
102 END SUBROUTINE clebsch_gordon_complex
112 SUBROUTINE clebsch_gordon_real(l1, m1, l2, m2, rlm)
113 INTEGER,
INTENT(IN) :: l1, m1, l2, m2
114 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(OUT) :: rlm
116 INTEGER :: icase1, icase2, ind, l, lm, lp, mm(2), n
122 IF (n >
SIZE(rlm, 1)) cpabort(
"Array too small")
124 ind = order(l1, m1, l2, m2)
126 IF ((m1 >= 0 .AND. m2 >= 0) .OR. (m1 < 0 .AND. m2 < 0))
THEN
134 DO lp = mod(l, 2), l, 2
136 xsi = get_factor(m1, m2, mm(1))
137 rlm(lm, 1) = xsi*cg_table(ind, lm, icase1)
138 xsi = get_factor(m1, m2, mm(2))
139 rlm(lm, 2) = xsi*cg_table(ind, lm, icase2)
142 END SUBROUTINE clebsch_gordon_real
150 FUNCTION getm(m1, m2)
RESULT(m)
151 INTEGER,
INTENT(IN) :: m1, m2
152 INTEGER,
DIMENSION(2) :: m
158 IF (m1*m2 < 0 .OR. (m1*m2 == 0 .AND. (m1 < 0 .OR. m2 < 0)))
THEN
176 FUNCTION get_factor(m1, m2, m)
RESULT(f)
177 INTEGER,
INTENT(IN) :: m1, m2, m
183 IF (abs(m1) >= abs(m2))
THEN
192 ELSE IF (m == 0)
THEN
193 IF (abs(mx) /= abs(my))
WRITE (*,
'(A,3I6)')
" 1) Illegal Case ", m1, m2, m
199 ELSE IF (abs(mx) + abs(my) == m)
THEN
201 IF (mx < 0) f = -osq2
202 ELSE IF (abs(mx) + abs(my) == -m)
THEN
204 ELSE IF (abs(mx) - abs(my) == -m)
THEN
205 IF (mx*my > 0)
WRITE (*,
'(A,3I6)')
" 2) Illegal Case ", m1, m2, m
206 IF (mx > 0) f = -osq2
208 ELSE IF (abs(mx) - abs(my) == m)
THEN
209 IF (mx*my < 0)
WRITE (*,
'(A,3I6)')
" 3) Illegal Case ", m1, m2, m
212 WRITE (*,
'(A,3I6)')
" 4) Illegal Case ", m1, m2, m
214 END FUNCTION get_factor
220 CHARACTER(len=*),
PARAMETER :: routinen =
'clebsch_gordon_deallocate'
224 CALL timeset(routinen, handle)
226 IF (
ALLOCATED(cg_table))
THEN
227 DEALLOCATE (cg_table)
229 CALL timestop(handle)
238 INTEGER,
INTENT(IN) :: l
240 CHARACTER(len=*),
PARAMETER :: routinen =
'clebsch_gordon_init'
242 INTEGER :: handle, i1, i2, ix, iy, l1, l2, lp, m, &
245 CALL timeset(routinen, handle)
250 IF (l < 0) cpabort(
"l < 0")
251 IF (
ALLOCATED(cg_table))
THEN
252 DEALLOCATE (cg_table)
255 n = (l**4 + 6*l**3 + 15*l**2 + 18*l + 8)/8
257 ALLOCATE (cg_table(n, m, 2))
262 iy = (l1*(l1 + 1))/2 + m1 + 1
265 IF (l1 == l2) ml = m1
267 ix = (l2*(l2 + 1))/2 + m2 + 1
268 i1 = (ix*(ix - 1))/2 + iy
269 DO lp = mod(l1 + l2, 2), l1 + l2, 2
272 cg_table(i1, i2, 1) = cgc(l1, m1, l2, m2, lp, mp)
275 cg_table(i1, i2, 2) = cgc(l1, m1, lp, mp, l2, m2)
277 cg_table(i1, i2, 2) = cgc(l2, m2, lp, mp, l1, m1)
285 CALL timestop(handle)
299 FUNCTION cgc(l1, m1, l2, m2, lp, mp)
300 INTEGER,
INTENT(IN) :: l1, m1, l2, m2, lp, mp
303 INTEGER :: la, lb, ll, ma, mb, s, t, tmax, tmin, &
305 REAL(kind=
dp) :: f1, f2, pref
309 IF (m1 < 0 .OR. m2 < 0 .OR. mp < 0)
THEN
310 WRITE (*, *) l1, l2, lp
311 WRITE (*, *) m1, m2, mp
312 cpabort(
"Illegal input values")
326 IF (mod(la + lb + lp, 2) == 0 .AND. la + lb >= lp .AND. lp >= lb - la &
327 .AND. lb - mb >= 0)
THEN
328 ll = (2*lp + 1)*(2*la + 1)*(2*lb + 1)
329 pref = 1.0_dp/sqrt(4.0_dp*
pi)*0.5_dp*sqrt(real(ll,
dp)* &
330 (sfac(lp - mp)/sfac(lp + mp))* &
331 (sfac(la - ma)/sfac(la + ma))*(sfac(lb - mb)/sfac(lb + mb)))
333 tmin = max(0, -lb + la - mp)
334 tmax = min(lb + la - mp, lp - mp, la - ma)
335 f1 = real(2*(-1)**(s - lb - ma), kind=
dp)*(sfac(lb + mb)/sfac(lb - mb))* &
336 sfac(la + ma)/(sfac(s - lp)*sfac(s - lb))*sfac(2*s - 2*la)/sfac(s - la)* &
337 (sfac(s)/sfac(2*s + 1))
341 z2 = la + lb - mp - t
343 z4 = lb - la + mp + t
345 f2 = f2 + (-1)**t*(sfac(z1)/(sfac(t)*sfac(z3)))*(sfac(z2)/(sfac(z4)*sfac(z5)))
361 INTEGER,
INTENT(IN) :: n
362 REAL(kind=
dp) :: sfac
367 cpabort(
"Factorials greater than 170! cannot be computed with double-precision")
371 sfac = real(i, kind=
dp)*sfac
373 ELSE IF (n >= 0)
THEN
389 FUNCTION order(l1, m1, l2, m2)
RESULT(ind)
390 INTEGER,
INTENT(IN) :: l1, m1, l2, m2
393 INTEGER :: i1, i2, ix, iy
395 i1 = (l1*(l1 + 1))/2 + abs(m1) + 1
396 i2 = (l2*(l2 + 1))/2 + abs(m2) + 1
399 ind = (ix*(ix - 1))/2 + iy
411 SUBROUTINE rvy_lm(r, y, l, m)
421 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: r
422 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: y
423 INTEGER,
INTENT(IN) :: l, m
426 REAL(kind=
dp) :: cp, lmm, lpm, pf, plm, rxy, sp, t, z
430 cpabort(
"Negative l value")
432 pf = sqrt(1.0_dp/(4.0_dp*
pi))
433 IF (m /= 0) cpabort(
"l = 0 and m value out of bounds")
438 cpabort(
"l = 1 and m value out of bounds")
440 pf = sqrt(3.0_dp/(4.0_dp*
pi))
443 pf = sqrt(3.0_dp/(4.0_dp*
pi))
446 pf = sqrt(3.0_dp/(4.0_dp*
pi))
452 cpabort(
"l = 2 and m value out of bounds")
454 pf = sqrt(15.0_dp/(16.0_dp*
pi))
455 y(:) = pf*(r(1, :)*r(1, :) - r(2, :)*r(2, :))
457 pf = sqrt(15.0_dp/(4.0_dp*
pi))
458 y(:) = pf*r(3, :)*r(1, :)
460 pf = sqrt(5.0_dp/(16.0_dp*
pi))
461 y(:) = pf*(3.0_dp*r(3, :)*r(3, :) - 1.0_dp)
463 pf = sqrt(15.0_dp/(4.0_dp*
pi))
464 y(:) = pf*r(3, :)*r(2, :)
466 pf = sqrt(15.0_dp/(16.0_dp*
pi))
467 y(:) = pf*2.0_dp*r(1, :)*r(2, :)
472 cpabort(
"l = 3 and m value out of bounds")
474 pf = sqrt(35.0_dp/(32.0_dp*
pi))
475 y(:) = pf*r(1, :)*(r(1, :)**2 - 3.0_dp*r(2, :)**2)
477 pf = sqrt(105.0_dp/(16.0_dp*
pi))
478 y(:) = pf*r(3, :)*(r(1, :)**2 - r(2, :)**2)
480 pf = sqrt(21.0_dp/(32.0_dp*
pi))
481 y(:) = pf*r(1, :)*(5.0_dp*r(3, :)*r(3, :) - 1.0_dp)
483 pf = sqrt(7.0_dp/(16.0_dp*
pi))
484 y(:) = pf*r(3, :)*(5.0_dp*r(3, :)*r(3, :) - 3.0_dp)
486 pf = sqrt(21.0_dp/(32.0_dp*
pi))
487 y(:) = pf*r(2, :)*(5.0_dp*r(3, :)*r(3, :) - 1.0_dp)
489 pf = sqrt(105.0_dp/(16.0_dp*
pi))
490 y(:) = pf*2.0_dp*r(1, :)*r(2, :)*r(3, :)
492 pf = sqrt(35.0_dp/(32.0_dp*
pi))
493 y(:) = pf*r(2, :)*(3.0_dp*r(1, :)**2 - r(2, :)**2)
496 IF (m < -l .OR. m > l) cpabort(
"m value out of bounds")
497 lpm =
fac(l + abs(m))
498 lmm =
fac(l - abs(m))
504 IF (abs(lpm) < epsilon(1.0_dp))
THEN
505 pf = real(2*l + 1, kind=
dp)/t
507 pf = (real(2*l + 1, kind=
dp)*lmm)/(t*lpm)
517 rxy = sqrt(r(1, i)**2 + r(2, i)**2)
518 IF (rxy < epsilon(1.0_dp))
THEN
524 y(i) = pf*plm*cosn(m, cp, sp)
526 y(i) = pf*plm*sinn(-m, cp, sp)
533 END SUBROUTINE rvy_lm
542 SUBROUTINE rry_lm(r, y, l, m)
552 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: r
553 REAL(kind=
dp),
INTENT(OUT) :: y
554 INTEGER,
INTENT(IN) :: l, m
556 REAL(kind=
dp) :: cp, lmm, lpm, pf, plm, rxy, sp, t, z
560 cpabort(
"Negative l value")
562 pf = sqrt(1.0_dp/(4.0_dp*
pi))
563 IF (m /= 0) cpabort(
"l = 0 and m value out of bounds")
568 cpabort(
"l = 1 and m value out of bounds")
570 pf = sqrt(3.0_dp/(4.0_dp*
pi))
573 pf = sqrt(3.0_dp/(4.0_dp*
pi))
576 pf = sqrt(3.0_dp/(4.0_dp*
pi))
582 cpabort(
"l = 2 and m value out of bounds")
584 pf = sqrt(15.0_dp/(16.0_dp*
pi))
585 y = pf*(r(1)*r(1) - r(2)*r(2))
587 pf = sqrt(15.0_dp/(4.0_dp*
pi))
590 pf = sqrt(5.0_dp/(16.0_dp*
pi))
591 y = pf*(3.0_dp*r(3)*r(3) - 1.0_dp)
593 pf = sqrt(15.0_dp/(4.0_dp*
pi))
596 pf = sqrt(15.0_dp/(16.0_dp*
pi))
597 y = pf*2.0_dp*r(1)*r(2)
602 cpabort(
"l = 3 and m value out of bounds")
604 pf = sqrt(35.0_dp/(32.0_dp*
pi))
605 y = pf*r(1)*(r(1)**2 - 3.0_dp*r(2)**2)
607 pf = sqrt(105.0_dp/(16.0_dp*
pi))
608 y = pf*r(3)*(r(1)**2 - r(2)**2)
610 pf = sqrt(21.0_dp/(32.0_dp*
pi))
611 y = pf*r(1)*(5.0_dp*r(3)*r(3) - 1.0_dp)
613 pf = sqrt(7.0_dp/(16.0_dp*
pi))
614 y = pf*r(3)*(5.0_dp*r(3)*r(3) - 3.0_dp)
616 pf = sqrt(21.0_dp/(32.0_dp*
pi))
617 y = pf*r(2)*(5.0_dp*r(3)*r(3) - 1.0_dp)
619 pf = sqrt(105.0_dp/(16.0_dp*
pi))
620 y = pf*2.0_dp*r(1)*r(2)*r(3)
622 pf = sqrt(35.0_dp/(32.0_dp*
pi))
623 y = pf*r(2)*(3.0_dp*r(1)**2 - r(2)**2)
626 IF (m < -l .OR. m > l) cpabort(
"m value out of bounds")
627 lpm =
fac(l + abs(m))
628 lmm =
fac(l - abs(m))
634 IF (abs(lpm) < epsilon(1.0_dp))
THEN
635 pf = real(2*l + 1, kind=
dp)/t
637 pf = (real(2*l + 1, kind=
dp)*lmm)/(t*lpm)
645 rxy = sqrt(r(1)**2 + r(2)**2)
646 IF (rxy < epsilon(1.0_dp))
THEN
652 y = pf*plm*cosn(m, cp, sp)
654 y = pf*plm*sinn(-m, cp, sp)
660 END SUBROUTINE rry_lm
669 SUBROUTINE cvy_lm(r, y, l, m)
679 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: r
680 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(OUT) :: y
681 INTEGER,
INTENT(IN) :: l, m
684 REAL(kind=
dp) :: cp, lmm, lpm, pf, plm, rxy, sp, t, ym, &
690 cpabort(
"Negative l value")
692 pf = sqrt(1.0_dp/(4.0_dp*
pi))
693 IF (m /= 0) cpabort(
"l = 0 and m value out of bounds")
698 cpabort(
"l = 1 and m value out of bounds")
700 pf = sqrt(3.0_dp/(8.0_dp*
pi))
704 y(i) = pf*cmplx(yp, ym, kind=
dp)
707 pf = sqrt(3.0_dp/(4.0_dp*
pi))
710 pf = sqrt(3.0_dp/(8.0_dp*
pi))
714 y(i) = pf*cmplx(yp, -ym, kind=
dp)
720 cpabort(
"l = 2 and m value out of bounds")
722 pf = sqrt(15.0_dp/(32.0_dp*
pi))
724 yp = (r(1, i)*r(1, i) - r(2, i)*r(2, i))
725 ym = 2.0_dp*r(1, i)*r(2, i)
726 y(i) = pf*cmplx(yp, ym, kind=
dp)
729 pf = sqrt(15.0_dp/(8.0_dp*
pi))
733 y(i) = pf*cmplx(yp, ym, kind=
dp)
736 pf = sqrt(5.0_dp/(16.0_dp*
pi))
737 y(:) = pf*(3.0_dp*r(3, :)*r(3, :) - 1.0_dp)
739 pf = sqrt(15.0_dp/(8.0_dp*
pi))
743 y(i) = pf*cmplx(yp, -ym, kind=
dp)
746 pf = sqrt(15.0_dp/(32.0_dp*
pi))
748 yp = (r(1, i)*r(1, i) - r(2, i)*r(2, i))
749 ym = 2.0_dp*r(1, i)*r(2, i)
750 y(i) = pf*cmplx(yp, -ym, kind=
dp)
756 cpabort(
"l = 3 and m value out of bounds")
758 pf = sqrt(35.0_dp/(64.0_dp*
pi))
760 yp = r(1, i)*(r(1, i)**2 - 3.0_dp*r(2, i)**2)
761 ym = r(2, i)*(3.0_dp*r(1, i)**2 - r(2, i)**2)
762 y(i) = pf*cmplx(yp, ym, kind=
dp)
765 pf = sqrt(105.0_dp/(32.0_dp*
pi))
767 yp = r(3, i)*(r(1, i)**2 - r(2, i)**2)
768 ym = 2.0_dp*r(1, i)*r(2, i)*r(3, i)
769 y(i) = pf*cmplx(yp, ym, kind=
dp)
772 pf = sqrt(21.0_dp/(64.0_dp*
pi))
774 yp = r(1, i)*(5.0_dp*r(3, i)*r(3, i) - 1.0_dp)
775 ym = r(2, i)*(5.0_dp*r(3, i)*r(3, i) - 1.0_dp)
776 y(i) = pf*cmplx(yp, ym, kind=
dp)
779 pf = sqrt(7.0_dp/(16.0_dp*
pi))
780 y(:) = pf*r(3, :)*(5.0_dp*r(3, :)*r(3, :) - 3.0_dp)
782 pf = sqrt(21.0_dp/(64.0_dp*
pi))
784 yp = r(1, i)*(5.0_dp*r(3, i)*r(3, i) - 1.0_dp)
785 ym = r(2, i)*(5.0_dp*r(3, i)*r(3, i) - 1.0_dp)
786 y(i) = pf*cmplx(yp, -ym, kind=
dp)
789 pf = sqrt(105.0_dp/(32.0_dp*
pi))
791 yp = r(3, i)*(r(1, i)**2 - r(2, i)**2)
792 ym = 2.0_dp*r(1, i)*r(2, i)*r(3, i)
793 y(i) = pf*cmplx(yp, -ym, kind=
dp)
796 pf = sqrt(35.0_dp/(64.0_dp*
pi))
798 yp = r(1, i)*(r(1, i)**2 - 3.0_dp*r(2, i)**2)
799 ym = r(2, i)*(3.0_dp*r(1, i)**2 - r(2, i)**2)
800 y(i) = pf*cmplx(yp, -ym, kind=
dp)
804 IF (m < -l .OR. m > l) cpabort(
"m value out of bounds")
805 lpm =
fac(l + abs(m))
806 lmm =
fac(l - abs(m))
808 IF (abs(lpm) < epsilon(1.0_dp))
THEN
809 pf = real(2*l + 1, kind=
dp)/t
811 pf = (real(2*l + 1, kind=
dp)*lmm)/(t*lpm)
820 rxy = sqrt(r(1, i)**2 + r(2, i)**2)
821 IF (rxy < epsilon(1.0_dp))
THEN
829 y(i) = pf*plm*cmplx(yp, ym, kind=
dp)
831 yp = cosn(-m, cp, sp)
832 ym = sinn(-m, cp, sp)
833 y(i) = pf*plm*cmplx(yp, -ym, kind=
dp)
840 END SUBROUTINE cvy_lm
849 SUBROUTINE ccy_lm(r, y, l, m)
859 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: r
860 COMPLEX(KIND=dp),
INTENT(OUT) :: y
861 INTEGER,
INTENT(IN) :: l, m
863 REAL(kind=
dp) :: cp, lmm, lpm, pf, plm, rxy, sp, t, ym, &
868 cpabort(
"Negative l value")
870 pf = sqrt(1.0_dp/(4.0_dp*
pi))
871 IF (m /= 0) cpabort(
"l = 0 and m value out of bounds")
876 cpabort(
"l = 1 and m value out of bounds")
878 pf = sqrt(3.0_dp/(8.0_dp*
pi))
881 y = pf*cmplx(yp, ym, kind=
dp)
883 pf = sqrt(3.0_dp/(4.0_dp*
pi))
886 pf = sqrt(3.0_dp/(8.0_dp*
pi))
889 y = pf*cmplx(yp, -ym, kind=
dp)
894 cpabort(
"l = 2 and m value out of bounds")
896 pf = sqrt(15.0_dp/(32.0_dp*
pi))
897 yp = (r(1)*r(1) - r(2)*r(2))
898 ym = 2.0_dp*r(1)*r(2)
899 y = pf*cmplx(yp, ym, kind=
dp)
901 pf = sqrt(15.0_dp/(8.0_dp*
pi))
904 y = pf*cmplx(yp, ym, kind=
dp)
906 pf = sqrt(5.0_dp/(16.0_dp*
pi))
907 y = pf*(3.0_dp*r(3)*r(3) - 1.0_dp)
909 pf = sqrt(15.0_dp/(8.0_dp*
pi))
912 y = pf*cmplx(yp, -ym, kind=
dp)
914 pf = sqrt(15.0_dp/(32.0_dp*
pi))
915 yp = (r(1)*r(1) - r(2)*r(2))
916 ym = 2.0_dp*r(1)*r(2)
917 y = pf*cmplx(yp, -ym, kind=
dp)
922 cpabort(
"l = 3 and m value out of bounds")
924 pf = sqrt(35.0_dp/(64.0_dp*
pi))
925 yp = r(1)*(r(1)**2 - 3.0_dp*r(2)**2)
926 ym = r(2)*(3.0_dp*r(1)**2 - r(2)**2)
927 y = pf*cmplx(yp, ym, kind=
dp)
929 pf = sqrt(105.0_dp/(32.0_dp*
pi))
930 yp = r(3)*(r(1)**2 - r(2)**2)
931 ym = 2.0_dp*r(1)*r(2)*r(3)
932 y = pf*cmplx(yp, ym, kind=
dp)
934 pf = sqrt(21.0_dp/(64.0_dp*
pi))
935 yp = r(1)*(5.0_dp*r(3)*r(3) - 1.0_dp)
936 ym = r(2)*(5.0_dp*r(3)*r(3) - 1.0_dp)
937 y = pf*cmplx(yp, ym, kind=
dp)
939 pf = sqrt(7.0_dp/(16.0_dp*
pi))
940 y = pf*r(3)*(5.0_dp*r(3)*r(3) - 3.0_dp)
942 pf = sqrt(21.0_dp/(64.0_dp*
pi))
943 yp = r(1)*(5.0_dp*r(3)*r(3) - 1.0_dp)
944 ym = r(2)*(5.0_dp*r(3)*r(3) - 1.0_dp)
945 y = pf*cmplx(yp, -ym, kind=
dp)
947 pf = sqrt(105.0_dp/(32.0_dp*
pi))
948 yp = r(3)*(r(1)**2 - r(2)**2)
949 ym = 2.0_dp*r(1)*r(2)*r(3)
950 y = pf*cmplx(yp, -ym, kind=
dp)
952 pf = sqrt(35.0_dp/(64.0_dp*
pi))
953 yp = r(1)*(r(1)**2 - 3.0_dp*r(2)**2)
954 ym = r(2)*(3.0_dp*r(1)**2 - r(2)**2)
955 y = pf*cmplx(yp, -ym, kind=
dp)
958 IF (m < -l .OR. m > l) cpabort(
"m value out of bounds")
959 lpm =
fac(l + abs(m))
960 lmm =
fac(l - abs(m))
962 IF (abs(lpm) < epsilon(1.0_dp))
THEN
963 pf = real(2*l + 1, kind=
dp)/t
965 pf = (real(2*l + 1, kind=
dp)*lmm)/(t*lpm)
973 rxy = sqrt(r(1)**2 + r(2)**2)
974 IF (rxy < epsilon(1.0_dp))
THEN
982 y = pf*plm*cmplx(yp, ym, kind=
dp)
984 yp = cosn(-m, cp, sp)
985 ym = sinn(-m, cp, sp)
986 y = pf*plm*cmplx(yp, -ym, kind=
dp)
992 END SUBROUTINE ccy_lm
1003 SUBROUTINE dry_lm(c, dy, l, m)
1019 REAL(kind=
dp),
DIMENSION(2),
INTENT(IN) :: c
1020 REAL(kind=
dp),
DIMENSION(2),
INTENT(OUT) :: dy
1021 INTEGER,
INTENT(IN) :: l, m
1023 REAL(kind=
dp) :: cp, ct, dplm, lmm, lpm, p, pf, rxy, sp, &
1025 REAL(kind=
dp),
DIMENSION(3) :: r
1041 CALL y_lm(r, y, l, -m)
1042 dy(2) = -real(m, kind=
dp)*y
1048 cpabort(
"Negative l value")
1050 IF (m /= 0) cpabort(
"l = 0 and m value out of bounds")
1055 cpabort(
"l = 1 and m value out of bounds")
1057 pf = sqrt(3.0_dp/(4.0_dp*
pi))
1060 pf = sqrt(3.0_dp/(4.0_dp*
pi))
1063 pf = sqrt(3.0_dp/(4.0_dp*
pi))
1069 cpabort(
"l = 2 and m value out of bounds")
1071 pf = sqrt(15.0_dp/(16.0_dp*
pi))
1072 dy(1) = pf*2.0_dp*st*ct*cos(2._dp*p)
1074 pf = sqrt(15.0_dp/(4.0_dp*
pi))
1075 dy(1) = pf*cp*(ct*ct - st*st)
1077 pf = sqrt(5.0_dp/(16.0_dp*
pi))
1078 dy(1) = -pf*6.0_dp*ct*st
1080 pf = sqrt(15.0_dp/(4.0_dp*
pi))
1081 dy(1) = pf*sp*(ct*ct - st*st)
1083 pf = sqrt(15.0_dp/(16.0_dp*
pi))
1084 dy(1) = pf*2.0_dp*st*ct*sin(2._dp*p)
1089 cpabort(
"l = 3 and m value out of bounds")
1091 pf = sqrt(35.0_dp/(32.0_dp*
pi))
1092 dy(1) = pf*3.0_dp*cos(3._dp*p)*ct*st*st
1094 pf = sqrt(105.0_dp/(16.0_dp*
pi))
1095 dy(1) = pf*2.0_dp*cos(2._dp*p)*ct*st
1097 pf = sqrt(21.0_dp/(32.0_dp*
pi))
1098 dy(1) = pf*cp*(ct*(5.0_dp*ct - 1.0_dp) - 5.0_dp*st*st)
1100 pf = sqrt(7.0_dp/(16.0_dp*
pi))
1101 dy(1) = pf*r(3)*(3.0_dp - 15.0_dp*ct*ct)*st
1103 pf = sqrt(21.0_dp/(32.0_dp*
pi))
1104 dy(1) = pf*sp*(ct*(5.0_dp*ct - 1.0_dp) - 5.0_dp*st*st)
1106 pf = sqrt(105.0_dp/(16.0_dp*
pi))
1107 dy(1) = pf*2.0_dp*sin(2._dp*p)*ct*st
1109 pf = sqrt(35.0_dp/(32.0_dp*
pi))
1110 dy(1) = pf*3.0_dp*sin(3._dp*p)*ct*st*st
1113 IF (m < -l .OR. m > l) cpabort(
"m value out of bounds")
1114 lpm =
fac(l + abs(m))
1115 lmm =
fac(l - abs(m))
1121 IF (abs(lpm) < epsilon(1.0_dp))
THEN
1122 pf = real(2*l + 1, kind=
dp)/tt
1124 pf = (real(2*l + 1, kind=
dp)*lmm)/(tt*lpm)
1132 rxy = sqrt(r(1)**2 + r(2)**2)
1133 IF (rxy < epsilon(1.0_dp))
THEN
1137 y = pf*dplm*cosn(m, cp, sp)
1139 y = pf*dplm*sinn(-m, cp, sp)
1145 END SUBROUTINE dry_lm
1154 SUBROUTINE dcy_lm(c, dy, l, m)
1172 REAL(kind=
dp),
DIMENSION(2),
INTENT(IN) :: c
1173 COMPLEX(KIND=dp),
DIMENSION(2),
INTENT(OUT) :: dy
1174 INTEGER,
INTENT(IN) :: l, m
1176 REAL(kind=
dp),
DIMENSION(2) :: dd
1178 cpabort(
"Not implemented")
1179 CALL dry_lm(c, dd, l, m)
1180 dy(1) = cmplx(dd(1), 0.0_dp, kind=
dp)
1181 dy(2) = cmplx(dd(2), 0.0_dp, kind=
dp)
1183 END SUBROUTINE dcy_lm
1194 REAL(kind=
dp),
INTENT(IN) :: x
1195 INTEGER,
INTENT(IN) :: l, m
1196 REAL(kind=
dp) :: plm
1198 INTEGER :: il, im, mm
1199 REAL(kind=
dp) :: fact, pll, pmm, pmmp1, somx2
1201 IF (abs(x) > 1.0_dp) cpabort(
"x value > 1")
1204 cpabort(
"Negative l value")
1208 SELECT CASE (abs(m))
1210 cpabort(
"l = 1 and m value out of bounds")
1212 plm = sqrt(1.0_dp - x*x)
1217 SELECT CASE (abs(m))
1219 cpabort(
"l = 2 and m value out of bounds")
1221 plm = 3.0_dp*(1.0_dp - x*x)
1223 plm = 3.0_dp*x*sqrt(1.0_dp - x*x)
1225 plm = 1.5_dp*x*x - 0.5_dp
1228 SELECT CASE (abs(m))
1230 cpabort(
"l = 3 and m value out of bounds")
1232 plm = 15.0_dp*(1.0_dp - x*x)**1.5_dp
1234 plm = 15.0_dp*x*(1.0_dp - x*x)
1236 plm = (7.5_dp*x*x - 1.5_dp)*sqrt(1.0_dp - x*x)
1238 plm = 2.5_dp*x**3 - 1.5_dp*x
1241 SELECT CASE (abs(m))
1243 cpabort(
"l = 4 and m value out of bounds")
1245 plm = 105.0_dp*(1.0_dp - x*x)**2
1247 plm = 105.0_dp*x*(1.0_dp - x*x)**1.5_dp
1249 plm = (52.5_dp*x*x - 7.5_dp)*(1.0_dp - x*x)
1251 plm = (17.5_dp*x**3 - 7.5_dp*x)*sqrt(1.0_dp - x*x)
1253 plm = 4.375_dp*x**4 - 3.75_dp*x**2 + 0.375_dp
1256 SELECT CASE (abs(m))
1258 cpabort(
"l = 5 and m value out of bounds")
1260 plm = 945.0_dp*(1.0_dp - x*x)**2.5_dp
1262 plm = 945.0_dp*x*(1.0_dp - x*x)**2
1264 plm = -(-472.5_dp*x*x + 52.5_dp)*(1.0_dp - x*x)**1.5_dp
1266 plm = (157.5_dp*x**3 - 52.5_dp*x)*(1.0_dp - x*x)
1268 plm = -(-39.375_dp*x**4 + 26.25_dp*x*x - &
1269 1.875_dp)*sqrt(1.0_dp - x*x)
1271 plm = 7.875_dp*x**5 - 8.75_dp*x**3 + 1.875_dp*x
1274 SELECT CASE (abs(m))
1276 cpabort(
"l = 6 and m value out of bounds")
1278 plm = 10395.0_dp*(1.0_dp - x*x)**3
1280 plm = 10395.0_dp*x*(1.0_dp - x*x)**2.5_dp
1282 plm = (5197.5_dp*x*x - 472.5_dp)*(1.0_dp - x*x)**2
1284 plm = -(-1732.5_dp*x**3 + 472.5_dp*x)* &
1285 (1.0_dp - x*x)**1.5_dp
1287 plm = (433.125_dp*x**4 - 236.25_dp*x**2 + &
1288 13.125_dp)*(1.0_dp - x*x)
1290 plm = -(-86.625_dp*x**5 + 78.75_dp*x**3 - &
1291 13.125_dp*x)*sqrt(1.0_dp - x*x)
1293 plm = 14.4375_dp*x**6 - 19.6875_dp*x**4 + &
1294 6.5625_dp*x**2 - 0.3125_dp
1298 IF (mm > l) cpabort(
"m out of bounds")
1302 somx2 = sqrt((1.0_dp - x)*(1.0_dp + x))
1305 pmm = pmm*fact*somx2
1306 fact = fact + 2.0_dp
1312 pmmp1 = x*real(2*mm + 1, kind=
dp)*pmm
1313 IF (l == mm + 1)
THEN
1317 pll = (x*real(2*il - 1, kind=
dp)*pmmp1 - &
1318 REAL(il + mm - 1, kind=
dp)*pmm)/real(il - mm, kind=
dp)
1337 REAL(kind=
dp),
INTENT(IN) :: x
1338 INTEGER,
INTENT(IN) :: l, m
1339 REAL(kind=
dp) :: dplm
1343 IF (abs(x) > 1.0_dp) cpabort(
"x value > 1")
1348 SELECT CASE (abs(m))
1350 cpabort(
"l = 1 and m value out of bounds")
1352 dplm = -x/sqrt(1.0_dp - x*x)
1357 SELECT CASE (abs(m))
1359 cpabort(
"l = 2 and m value out of bounds")
1363 dplm = 3.0_dp*sqrt(1.0_dp - x*x) - 3.0_dp*x*x/sqrt(1.0_dp - x*x)
1368 SELECT CASE (abs(m))
1370 cpabort(
"l = 3 and m value out of bounds")
1372 dplm = -45.0_dp*sqrt(1.0_dp - x*x)*x
1374 dplm = 15.0_dp*(1.0_dp - x*x) - 30.0_dp*x*x
1376 dplm = 15.0_dp*x*sqrt(1.0_dp - x*x) - (x*(7.5_dp*x*x - 1.5_dp))/sqrt(1.0_dp - x*x)
1378 dplm = 7.5_dp*x*x - 1.5_dp
1381 SELECT CASE (abs(m))
1383 cpabort(
"l = 4 and m value out of bounds")
1385 dplm = -420*x*(1 - x*x)
1387 dplm = 105.0_dp*((1.0_dp - x*x)**1.5_dp - 3.0_dp*x*x*(1.0_dp - x*x)**0.5_dp)
1389 dplm = 105.0_dp*x*(1.0_dp - x*x) - 2.0_dp*x*(52.5_dp*x*x - 7.5_dp)
1391 IF (abs(x) - 1.0_dp < epsilon(1.0_dp))
THEN
1394 dplm = (17.5_dp*3.0_dp*x**2 - 7.5_dp)*sqrt(1.0_dp - x*x) - &
1395 x*(17.5_dp*x**3 - 7.5_dp*x)/sqrt(1.0_dp - x*x)
1398 dplm = 4.375_dp*4.0_dp*x**3 - 3.75_dp*2.0_dp*x
1401 SELECT CASE (abs(m))
1403 cpabort(
"l = 5 and m value out of bounds")
1405 dplm = -945.0_dp*5.0_dp*x*(1.0_dp - x*x)**1.5_dp
1407 dplm = 945.0_dp*((1.0_dp - x*x)**2 - 2.0_dp*x*x*(1.0_dp - x*x))
1409 dplm = 945.0_dp*x*(1.0_dp - x*x)**1.5_dp - &
1410 3.0_dp*x*(472.5_dp*x*x - 52.5_dp)*(1.0_dp - x*x)**0.5_dp
1412 dplm = (3.0_dp*157.5_dp*x**2 - 52.5_dp)*(1.0_dp - x*x) - &
1413 (157.5_dp*x**3 - 52.5_dp*x)*(-2.0_dp*x)
1415 IF (abs(x) - 1.0_dp < epsilon(1.0_dp))
THEN
1418 dplm = -(-39.375_dp*4.0_dp*x*x*x + 2.0_dp*26.25_dp*x)*sqrt(1.0_dp - x*x) + &
1419 x*(-39.375_dp*x**4 + 26.25_dp*x*x - 1.875_dp)/sqrt(1.0_dp - x*x)
1422 dplm = 5.0_dp*7.875_dp*x**4 - 3.0_dp*8.75_dp*x**2 + 1.875_dp
1425 SELECT CASE (abs(m))
1427 cpabort(
"l = 6 and m value out of bounds")
1429 dplm = -10395.0_dp*6.0_dp*x*(1.0_dp - x*x)**2
1431 dplm = 10395.0_dp*((1.0_dp - x*x)**2.5_dp - 5.0_dp*x*x*(1.0_dp - x*x)**1.5_dp)
1433 dplm = 2.0_dp*5197.5_dp*x*(1.0_dp - x*x)**2 - &
1434 4.0_dp*x*(5197.5_dp*x*x - 472.5_dp)*(1.0_dp - x*x)
1436 dplm = -(-3.0_dp*1732.5_dp*x*x + 472.5_dp)*(1.0_dp - x*x)**1.5_dp + &
1437 (-1732.5_dp*x**3 + 472.5_dp*x)*3.0_dp*x*(1.0_dp - x*x)**0.5_dp
1439 dplm = (433.125_dp*4.0_dp*x**3 - 2.0_dp*236.25_dp*x)*(1.0_dp - x*x) - &
1440 2.0_dp*x*(433.125_dp*x**4 - 236.25_dp*x**2 + 13.125_dp)
1442 IF (abs(x) - 1.0_dp < epsilon(1.0_dp))
THEN
1445 dplm = -(-5.0_dp*86.625_dp*x**4 + 3.0_dp*78.75_dp**2 - 13.125_dp)*sqrt(1.0_dp - x*x) + &
1446 x*(-86.625_dp*x**5 + 78.75_dp*x**3 - 13.125_dp*x)/sqrt(1.0_dp - x*x)
1449 dplm = 14.4375_dp*6.0_dp*x**5 - 19.6875_dp*4.0_dp*x**3 + &
1454 IF (mm > l) cpabort(
"m out of bounds")
1457 IF (abs(x) - 1.0_dp < epsilon(1.0_dp))
THEN
1460 dplm = -real(l + 1,
dp)*x/(x**2 - 1.0_dp)*
legendre(x, l, m) &
1461 + real(l - m + 1,
dp)/(x**2 - 1.0_dp)*
legendre(x, l + 1, m)
1473 FUNCTION dpof1(x, l)
1475 REAL(kind=
dp),
INTENT(IN) :: x
1476 INTEGER,
INTENT(IN) :: l
1477 REAL(kind=
dp) :: dpof1
1479 IF (abs(x) - 1.0_dp > epsilon(1.0_dp))
THEN
1480 cpabort(
"|x| is not 1")
1482 IF (x > 0.0_dp)
THEN
1485 cpabort(
"Negative l value")
1501 cpabort(
"Not implemented")
1506 cpabort(
"Negative l value")
1522 cpabort(
"Not implemented")
1534 FUNCTION choose(n, k)
1536 INTEGER,
INTENT(IN) :: n, k
1537 REAL(kind=
dp) :: choose
1540 choose = real(nint(
fac(n)/(
fac(k)*
fac(n - k))), kind=
dp)
1554 FUNCTION cosn(n, c, s)
1556 INTEGER,
INTENT(IN) :: n
1557 REAL(kind=
dp),
INTENT(IN) :: c, s
1558 REAL(kind=
dp) :: cosn
1563 IF (abs(c) < epsilon(1.0_dp) .OR. n == 0)
THEN
1564 IF (mod(n, 2) == 0)
THEN
1565 cosn = (-1.0_dp)**int(n/2)
1574 cosn = cosn + choose(n, j)
1575 ELSE IF (mod(j/2, 2) == 0)
THEN
1576 cosn = cosn + choose(n, j)*s**j
1578 cosn = cosn - choose(n, j)*s**j
1583 cosn = cosn + choose(n, j)*c**i
1584 ELSE IF (mod(j/2, 2) == 0)
THEN
1585 cosn = cosn + choose(n, j)*c**i*s**j
1587 cosn = cosn - choose(n, j)*c**i*s**j
1602 FUNCTION dcosn_dcp(n, c, s)
1604 INTEGER,
INTENT(IN) :: n
1605 REAL(kind=
dp),
INTENT(IN) :: c, s
1606 REAL(kind=
dp) :: dcosn_dcp
1612 IF (s < epsilon(1.0_dp))
THEN
1617 dcosn_dcp = dcosn_dcp
1620 IF (mod(j/2, 2) == 0)
THEN
1621 dcosn_dcp = dcosn_dcp + choose(n, j)*real(i,
dp)*c**(i - 1)*s**j
1623 dcosn_dcp = dcosn_dcp - choose(n, j)*real(i,
dp)*c**(i - 1)*s**j
1629 END FUNCTION dcosn_dcp
1638 FUNCTION dcosn_dsp(n, c, s)
1640 INTEGER,
INTENT(IN) :: n
1641 REAL(kind=
dp),
INTENT(IN) :: c, s
1642 REAL(kind=
dp) :: dcosn_dsp
1647 IF (c < epsilon(1.0_dp) .OR. s < epsilon(1.0_dp))
THEN
1653 dcosn_dsp = dcosn_dsp
1655 IF (mod(j/2, 2) == 0)
THEN
1656 dcosn_dsp = dcosn_dsp + choose(n, j)*real(j,
dp)*s**(j - 1)*c**i
1658 dcosn_dsp = dcosn_dsp - choose(n, j)*real(j,
dp)*s**(j - 1)*c**i
1664 END FUNCTION dcosn_dsp
1673 FUNCTION sinn(n, c, s)
1675 INTEGER,
INTENT(IN) :: n
1676 REAL(kind=
dp),
INTENT(IN) :: c, s
1677 REAL(kind=
dp) :: sinn
1683 IF (abs(s) < epsilon(1.0_dp) .OR. n == 0)
THEN
1685 ELSE IF (abs(c) < epsilon(1.0_dp))
THEN
1686 IF (mod(n, 2) == 0)
THEN
1689 sinn = s*(-1.0_dp)**int((n - 1)/2)
1695 IF (mod(j/2, 2) == 0)
THEN
1696 sinn = sinn + choose(n, j)*s**j
1698 sinn = sinn - choose(n, j)*s**j
1702 IF (mod(j/2, 2) == 0)
THEN
1703 sinn = sinn + choose(n, j)*c**i*s**j
1705 sinn = sinn - choose(n, j)*c**i*s**j
1720 FUNCTION dsinn_dcp(n, c, s)
1722 INTEGER,
INTENT(IN) :: n
1723 REAL(kind=
dp),
INTENT(IN) :: c, s
1724 REAL(kind=
dp) :: dsinn_dcp
1730 IF (c < epsilon(1.0_dp) .OR. s < epsilon(1.0_dp))
THEN
1735 dsinn_dcp = dsinn_dcp
1738 IF (mod(j/2, 2) == 0)
THEN
1739 dsinn_dcp = dsinn_dcp + choose(n, j)*real(i,
dp)*c**(i - 1)*s**j
1741 dsinn_dcp = dsinn_dcp - choose(n, j)*real(i,
dp)*c**(i - 1)*s**j
1747 END FUNCTION dsinn_dcp
1756 FUNCTION dsinn_dsp(n, c, s)
1758 INTEGER,
INTENT(IN) :: n
1759 REAL(kind=
dp),
INTENT(IN) :: c, s
1760 REAL(kind=
dp) :: dsinn_dsp
1766 IF (c < epsilon(1.0_dp) .OR. s < epsilon(1.0_dp))
THEN
1772 dsinn_dsp = dsinn_dsp
1774 IF (mod(j/2, 2) == 0)
THEN
1775 dsinn_dsp = dsinn_dsp + choose(n, j)*c**i*real(j,
dp)*s**(j - 1)
1777 dsinn_dsp = dsinn_dsp - choose(n, j)*c**i*real(j,
dp)*s**(j - 1)
1783 END FUNCTION dsinn_dsp
1801 REAL(kind=
dp),
INTENT(IN) :: j1, m1, j2, m2, j, m
1802 REAL(kind=
dp),
INTENT(OUT) :: cg_coeff
1805 REAL(kind=
dp) :: sumk, t
1809 cpabort(
"The angular momentum quantum number j1 has to be nonnegative")
1810 IF (.NOT. (is_integer(j1) .OR. is_integer(2.0_dp*j1))) &
1811 cpabort(
"The angular momentum quantum number j1 has to be integer or half-integer")
1813 cpabort(
"The angular momentum quantum number j2 has to be nonnegative")
1814 IF (.NOT. (is_integer(j2) .OR. is_integer(2.0_dp*j2))) &
1815 cpabort(
"The angular momentum quantum number j2 has to be integer or half-integer")
1817 cpabort(
"The angular momentum quantum number J has to be nonnegative")
1818 IF (.NOT. (is_integer(j) .OR. is_integer(2.0_dp*j))) &
1819 cpabort(
"The angular momentum quantum number J has to be integer or half-integer")
1820 IF ((abs(m1) - j1) > epsilon(m1)) &
1821 cpabort(
"The angular momentum quantum number m1 has to satisfy -j1 <= m1 <= j1")
1822 IF (.NOT. (is_integer(m1) .OR. is_integer(2.0_dp*m1))) &
1823 cpabort(
"The angular momentum quantum number m1 has to be integer or half-integer")
1824 IF ((abs(m2) - j2) > epsilon(m2)) &
1825 cpabort(
"The angular momentum quantum number m2 has to satisfy -j2 <= m1 <= j2")
1826 IF (.NOT. (is_integer(m2) .OR. is_integer(2.0_dp*m2))) &
1827 cpabort(
"The angular momentum quantum number m2 has to be integer or half-integer")
1828 IF ((abs(m) - j) > epsilon(m)) &
1829 cpabort(
"The angular momentum quantum number M has to satisfy -J <= M <= J")
1830 IF (.NOT. (is_integer(m) .OR. is_integer(2.0_dp*m))) &
1831 cpabort(
"The angular momentum quantum number M has to be integer or half-integer")
1833 IF (is_integer(j1 + j2 + j) .AND. &
1834 is_integer(j1 + m1) .AND. &
1835 is_integer(j2 + m2) .AND. &
1836 is_integer(j + m) .AND. &
1837 is_integer(j - j1 - m2) .AND. &
1838 is_integer(j - j2 + m1))
THEN
1839 IF ((j < abs(j1 - j2)) .OR. &
1840 (j > j1 + j2) .OR. &
1841 (abs(m1) > j1) .OR. &
1842 (abs(m2) > j2) .OR. &
1848 kmax = nint(max(j1 + j2 - j, j1 - j + m2, j2 - j - m1, j1 - m1, j2 + m2))
1850 IF (j1 + j2 - j - k < 0.0_dp) cycle
1851 IF (j - j1 - m2 + k < 0.0_dp) cycle
1852 IF (j - j2 + m1 + k < 0.0_dp) cycle
1853 IF (j1 - m1 - k < 0.0_dp) cycle
1854 IF (j2 + m2 - k < 0.0_dp) cycle
1855 t = sfac(nint(j1 + j2 - j - k))*sfac(nint(j - j1 - m2 + k))* &
1856 sfac(nint(j - j2 + m1 + k))*sfac(nint(j1 - m1 - k))* &
1857 sfac(nint(j2 + m2 - k))*sfac(k)
1858 IF (mod(k, 2) == 1) t = -t
1859 sumk = sumk + 1.0_dp/t
1861 cg_coeff = sqrt((2.0_dp*j + 1)/sfac(nint(j1 + j2 + j + 1.0_dp)))* &
1862 sqrt(sfac(nint(j1 + j2 - j))*sfac(nint(j2 + j - j1))*sfac(nint(j + j1 - j2)))* &
1863 sqrt(sfac(nint(j1 + m1))*sfac(nint(j1 - m1))* &
1864 sfac(nint(j2 + m2))*sfac(nint(j2 - m2))* &
1865 sfac(nint(j + m))*sfac(nint(j - m)))*sumk
1868 cpabort(
"Invalid set of input parameters < j1 m1 j2 m2 | J M > specified")
1889 REAL(kind=
dp),
INTENT(IN) :: j1, m1, j2, m2, j3, m3
1890 REAL(kind=
dp),
INTENT(OUT) :: w_3j
1892 REAL(kind=
dp) :: cg_coeff
1894 IF ((abs(m1 + m2 + m3) < epsilon(m1)) .AND. &
1895 (abs(j1 - j2) <= j3) .AND. (j3 <= abs(j1 + j2)) .AND. &
1896 is_integer(j1 + j2 + j3))
THEN
1897 IF (is_integer(j1 - j2 - m3))
THEN
1899 w_3j = (-1.0_dp)**int(j1 - j2 - m3)*cg_coeff/sqrt(2.0_dp*j3 + 1.0_dp)
1901 cpabort(
"j1 - j2 - m3 results in an invalid non-integer exponent")
1915 FUNCTION is_integer(x)
1917 REAL(kind=
dp),
INTENT(IN) :: x
1918 LOGICAL :: is_integer
1920 IF ((abs(x) - aint(abs(x), kind=
dp)) > epsilon(x))
THEN
1921 is_integer = .false.
1926 END FUNCTION is_integer
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
integer, parameter, public maxfac
real(kind=dp), dimension(0:maxfac), parameter, public fac
Calculate spherical harmonics.
real(kind=dp) function, public legendre(x, l, m)
...
subroutine, public clebsch_gordon_coefficient(j1, m1, j2, m2, J, M, CG_coeff)
Compute the Clebsch-Gordon coefficient C = < j1 m1 j2 m2 | J M > = < j1 j2; m1 m2 | J M >
subroutine, public wigner_3j(j1, m1, j2, m2, j3, m3, W_3j)
Compute the Wigner 3-j symbol / j1 j2 j3 \ \ m1 m2 m3 / using the Clebsch-Gordon coefficients.
subroutine, public clebsch_gordon_init(l)
...
subroutine, public clebsch_gordon_deallocate()
...
real(kind=dp) function, public dlegendre(x, l, m)
...