CGCOEFF_DP Function

private function CGCOEFF_DP(J1, M1, J2, M2, J3, M3) result(CGCOEFF)

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).

Arguments

Type IntentOptional 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, .

Return Value real(kind=dp)


Calls

proc~~cgcoeff_dp~~CallsGraph proc~cgcoeff_dp CGCOEFF_DP interface~log_fact LOG_FACT proc~cgcoeff_dp->interface~log_fact proc~log_fact_dp LOG_FACT_DP interface~log_fact->proc~log_fact_dp

Called by

proc~~cgcoeff_dp~~CalledByGraph proc~cgcoeff_dp CGCOEFF_DP interface~cgcoeff CGCOEFF interface~cgcoeff->proc~cgcoeff_dp proc~gwi_dp GWI_DP proc~gwi_dp->interface~cgcoeff proc~gwj_dp GWJ_DP proc~gwj_dp->interface~cgcoeff proc~symbol3j_dp SYMBOL3J_DP proc~symbol3j_dp->interface~cgcoeff interface~gwi GWI interface~gwi->proc~gwi_dp interface~gwj GWJ interface~gwj->proc~gwj_dp interface~symbol3j SYMBOL3J interface~symbol3j->proc~symbol3j_dp proc~run_gwi_sweep RUN_GWI_SWEEP proc~run_gwi_sweep->interface~gwi proc~run_gwj_sweep RUN_GWJ_SWEEP proc~run_gwj_sweep->interface~gwj proc~test1_gw TEST1_GW proc~test1_gw->interface~gwi proc~test2_gw TEST2_GW proc~test2_gw->interface~gwi proc~test2_gw->interface~gwj program~gwi_gwj_sweep GWI_GWJ_SWEEP program~gwi_gwj_sweep->proc~run_gwi_sweep program~gwi_gwj_sweep->proc~run_gwj_sweep program~main MAIN program~main->proc~test1_gw program~main->proc~test2_gw

Source Code

  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