Part A: DECOMPOSE FIELD_KNOWN, confirm exact recovery of the
eight known unit coefficients and near-zero everywhere else. Writes
examples/vsh_decomposition/known_modes.dat.
coefficient error exceeds TOL_A.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i4), | intent(inout) | :: | N_FAIL |
Running failure counter, incremented if 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 INTEGER(KIND=i4) :: L, M, IDX, K CALL DECOMPOSE(FIELD_KNOWN, LMAX_A, LMAX_QUAD_A, NPHI_A, A_RAD, A_POL, A_TOR) OPEN(UNIT=71, FILE="./examples/vsh_decomposition/known_modes.dat") WRITE(71,'(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 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_RAD(IDX)-EXPECTED), & ABS(A_POL(IDX)-EXPECTED), ABS(A_TOR(IDX)-EXPECTED)) WRITE(71,*) 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(71) 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 END SUBROUTINE RUN_PART_A