Part A: DECOMPOSE FIELD_KNOWN_TOR, confirm exact recovery of
the eight known unit a_tor coefficients and near-zero everywhere
else, and confirm a_rad/a_pol are near-zero at every mode (the
direct purity check). Writes
examples/vsh_decomposition_tor/known_modes.dat.
a_tor coefficient error or the max a_rad/a_pol purity leakage
exceeds TOL_A.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i4), | intent(inout) | :: | N_FAIL |
Running failure counter, incremented if either the max |
SUBROUTINE RUN_PART_A(N_FAIL) IMPLICIT NONE INTEGER(KIND=i4), INTENT(INOUT) :: N_FAIL INTEGER(KIND=i4), PARAMETER :: LMAX_QUAD_A = 30 INTEGER(KIND=i4), PARAMETER :: NPHI_A = 32 COMPLEX(KIND=dp) :: A_RAD((LMAX_A+1)**2), A_POL((LMAX_A+1)**2), & A_TOR((LMAX_A+1)**2) REAL(KIND=dp) :: EXPECTED, MAX_ERR, MAX_PURITY INTEGER(KIND=i4) :: L, M, IDX, K CALL DECOMPOSE(FIELD_KNOWN_TOR, LMAX_A, LMAX_QUAD_A, NPHI_A, & A_RAD, A_POL, A_TOR) OPEN(UNIT=73, FILE="./examples/vsh_decomposition_tor/known_modes.dat") WRITE(73,'(A)') '# L M Re(a_rad) Im(a_rad) Re(a_pol) Im(a_pol) '// & 'Re(a_tor) Im(a_tor) expected' MAX_ERR = 0.0_dp MAX_PURITY = 0.0_dp DO L = 0, LMAX_A DO M = -L, L IDX = YLM_INDEX(L, M) EXPECTED = 0.0_dp DO K = 1, N_KNOWN IF (L_KNOWN(K) == L .AND. M_KNOWN(K) == M) EXPECTED = 1.0_dp ENDDO MAX_ERR = MAX(MAX_ERR, ABS(A_TOR(IDX)-EXPECTED)) MAX_PURITY = MAX(MAX_PURITY, ABS(A_RAD(IDX)), ABS(A_POL(IDX))) WRITE(73,*) L, M, DBLE(A_RAD(IDX)), AIMAG(A_RAD(IDX)), & DBLE(A_POL(IDX)), AIMAG(A_POL(IDX)), & DBLE(A_TOR(IDX)), AIMAG(A_TOR(IDX)), EXPECTED ENDDO ENDDO CLOSE(73) IF (MAX_ERR > TOL_A) THEN N_FAIL = N_FAIL + 1 WRITE(*,'(A,ES10.3)') "FAIL known_mode_recovery max_err=", MAX_ERR ELSE WRITE(*,'(A,ES10.3)') "PASS known_mode_recovery max_err=", MAX_ERR END IF IF (MAX_PURITY > TOL_A) THEN N_FAIL = N_FAIL + 1 WRITE(*,'(A,ES10.3)') "FAIL toroidal_purity max_leakage=", MAX_PURITY ELSE WRITE(*,'(A,ES10.3)') "PASS toroidal_purity max_leakage=", MAX_PURITY END IF END SUBROUTINE RUN_PART_A