GWI vs. the brute-force Gaunt-coefficient integral (via SHGLQ
theta-quadrature times a uniform phi sum), swept over
JMAX, all valid . Writes
examples/gwi_gwj_sweep/gwi_check.dat.
across the sweep exceeds TOL.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i4), | intent(inout) | :: | N_FAIL |
Running failure counter, incremented if the max error |
SUBROUTINE RUN_GWI_SWEEP(N_FAIL) IMPLICIT NONE INTEGER(KIND=i4), INTENT(INOUT) :: N_FAIL REAL(KIND=dp) :: ZERO(LMAX_QUAD+1), WTHETA(LMAX_QUAD+1) REAL(KIND=dp) :: DPHI, THETA, PHI, MAX_ERR, ABSDIFF COMPLEX(KIND=dp) :: CLOSED, BRUTE INTEGER(KIND=i4) :: J1, J2, M1, M2, L, M, IQ, IP CALL SHGLQ(ZERO, WTHETA, LMAX_QUAD) DPHI = 2.d0*pi/NPHI MAX_ERR = 0.0_dp OPEN(UNIT=81, FILE="./examples/gwi_gwj_sweep/gwi_check.dat") WRITE(81,'(A)') '# J1 M1 J2 M2 L M '// & 'Re(closed) Im(closed) Re(brute) Im(brute) absdiff' DO J1 = 0, JMAX DO J2 = 0, JMAX DO M1 = -J1, J1 DO M2 = -J2, J2 DO L = ABS(J1-J2), J1+J2 M = M1+M2 IF (ABS(M) > L) CYCLE CLOSED = GWI(J1,M1,J2,M2,L,M) BRUTE = DCMPLX(0.d0, 0.d0) DO IQ = 1, LMAX_QUAD+1 THETA = DACOS(ZERO(IQ)) DO IP = 0, NPHI-1 PHI = IP*DPHI BRUTE = BRUTE + WTHETA(IQ)*DPHI * SSH(J1,M1,THETA,PHI) * & SSH(J2,M2,THETA,PHI) * CONJG(SSH(L,M,THETA,PHI)) ENDDO ENDDO ABSDIFF = ABS(CLOSED-BRUTE) MAX_ERR = MAX(MAX_ERR, ABSDIFF) WRITE(81,*) J1, M1, J2, M2, L, M, DBLE(CLOSED), AIMAG(CLOSED), & DBLE(BRUTE), AIMAG(BRUTE), ABSDIFF ENDDO ENDDO ENDDO ENDDO ENDDO CLOSE(81) IF (MAX_ERR > TOL) THEN N_FAIL = N_FAIL + 1 WRITE(*,'(A,ES10.3)') "FAIL gwi_gaunt_sweep max_err=", MAX_ERR ELSE WRITE(*,'(A,ES10.3)') "PASS gwi_gaunt_sweep max_err=", MAX_ERR END IF END SUBROUTINE RUN_GWI_SWEEP