Clebsch-Gordan coefficient for coupling two angular momenta to a total , via the closed-form Racah sum (evaluated in log-factorial form for numerical stability at large arguments -- see LOG_FACT): where . Adapted from David Simpson (NASA GSFC). Automatically returns 0 for any invalid combination -- violated triangle inequality , , or -- so it is always safe to call with an arbitrary sextuple of integers, e.g. when sweeping a parameter range.
Returns: , real (0 if selection rules are violated).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i4), | intent(in) | :: | J1 |
First angular momentum, . |
||
| integer(kind=i4), | intent(in) | :: | M1 |
First projection, . |
||
| integer(kind=i4), | intent(in) | :: | J2 |
Second angular momentum, . |
||
| integer(kind=i4), | intent(in) | :: | M2 |
Second projection, . |
||
| integer(kind=i4), | intent(in) | :: | J3 |
Coupled angular momentum, . |
||
| integer(kind=i4), | intent(in) | :: | M3 |
Coupled projection, . |
FUNCTION CGCOEFF_DP(J1,M1,J2,M2,J3,M3) RESULT(CGCOEFF) IMPLICIT NONE INTEGER(KIND=i4), INTENT(IN) :: J1 INTEGER(KIND=i4), INTENT(IN) :: M1 INTEGER(KIND=i4), INTENT(IN) :: J2 INTEGER(KIND=i4), INTENT(IN) :: M2 INTEGER(KIND=i4), INTENT(IN) :: J3 INTEGER(KIND=i4), INTENT(IN) :: M3 INTEGER(KIND=i4) :: K,KMIN,KMAX REAL(KIND=dp) :: SUMK,TERM,CGCOEFF IF ((J3 .LT. ABS(J1-J2)) .OR. & (J3 .GT. (J1+J2)) .OR. & (ABS(M1) .GT. J1) .OR. & (ABS(M2) .GT. J2) .OR. & (ABS(M3) .GT. J3) .OR. & ((M1+M2) .NE. M3)) THEN CGCOEFF = 0.0d0 ELSE CGCOEFF = DSQRT(2.0_dp*J3+1.0_dp)* & EXP(-0.5_dp*LOG_FACT(J1+J2+J3+1)) CGCOEFF = CGCOEFF * EXP(0.5_dp*(LOG_FACT(J1+J2-J3)+ & LOG_FACT(J2+J3-J1)+LOG_FACT(J3+J1-J2))) CGCOEFF = CGCOEFF * EXP(0.5_dp*(LOG_FACT(J1+M1)+ & LOG_FACT(J1-M1)+LOG_FACT(J2+M2)+LOG_FACT(J2-M2)+ & LOG_FACT(J3+M3)+LOG_FACT(J3-M3))) SUMK = 0.0_dp KMIN = MAX(0, J1-J3+M2, J2-J3-M1) KMAX = MIN(J1+J2-J3, J1-M1, J2+M2) IF (KMIN .LE. KMAX) THEN TERM = LOG_FACT(J1+J2-J3-KMIN)+LOG_FACT(J3-J1-M2+KMIN)+ & LOG_FACT(J3-J2+M1+KMIN)+LOG_FACT(J1-M1-KMIN)+ & LOG_FACT(J2+M2-KMIN)+LOG_FACT(KMIN) DO K = KMIN, KMAX IF (MOD(K,2) == 1) THEN SUMK = SUMK - EXP(-TERM) ELSE SUMK = SUMK + EXP(-TERM) END IF IF (K .LT. KMAX) THEN TERM = TERM & - LOG(DBLE(J1+J2-J3-K)) & + LOG(DBLE(J3-J1-M2+K+1)) & + LOG(DBLE(J3-J2+M1+K+1)) & - LOG(DBLE(J1-M1-K)) & - LOG(DBLE(J2+M2-K)) & + LOG(DBLE(K+1)) END IF END DO END IF CGCOEFF = CGCOEFF*SUMK ENDIF RETURN END FUNCTION CGCOEFF_DP