MAIN Program

Uses

  • program~~main~~UsesGraph program~main MAIN module~globals GLOBALS program~main->module~globals module~kinds KINDS program~main->module~kinds module~tests TESTS program~main->module~tests module~globals->module~kinds module~tests->module~globals module~tests->module~kinds module~vsh VSH module~tests->module~vsh module~vsh->module~globals module~vsh->module~kinds

Driver for the full TESTS validation suite (run via ctest, target vsh_validation): runs every cross-validation, batch-consistency, and identity check in TESTS, writes each one's full per-point data to ./validation/*.dat, prints a PASS/FAIL line per check, and exits non-zero if any check failed (the signal ctest uses for a pass/fail build gate).


Calls

program~~main~~CallsGraph program~main MAIN proc~batch_alm_cons BATCH_ALM_CONS program~main->proc~batch_alm_cons proc~batch_dalm_cons BATCH_DALM_CONS program~main->proc~batch_dalm_cons proc~batch_grad_ssh_cons BATCH_GRAD_SSH_CONS program~main->proc~batch_grad_ssh_cons proc~batch_l_ssh_cons BATCH_L_SSH_CONS program~main->proc~batch_l_ssh_cons proc~batch_pvsh_pol_cons BATCH_PVSH_POL_CONS program~main->proc~batch_pvsh_pol_cons proc~batch_pvsh_rad_cons BATCH_PVSH_RAD_CONS program~main->proc~batch_pvsh_rad_cons proc~batch_pvsh_tor_cons BATCH_PVSH_TOR_CONS program~main->proc~batch_pvsh_tor_cons proc~batch_ssh_cons BATCH_SSH_CONS program~main->proc~batch_ssh_cons proc~batch_vsh_pol_dn_cons BATCH_VSH_POL_DN_CONS program~main->proc~batch_vsh_pol_dn_cons proc~batch_vsh_pol_up_cons BATCH_VSH_POL_UP_CONS program~main->proc~batch_vsh_pol_up_cons proc~batch_vsh_tor_cons BATCH_VSH_TOR_CONS program~main->proc~batch_vsh_tor_cons proc~pvsh_pol_tor_ortho PVSH_POL_TOR_ORTHO program~main->proc~pvsh_pol_tor_ortho proc~ssh_ortho SSH_ORTHO program~main->proc~ssh_ortho proc~test1_analytic TEST1_ANALYTIC program~main->proc~test1_analytic proc~test1_gw TEST1_GW program~main->proc~test1_gw proc~test1_vsh TEST1_VSH program~main->proc~test1_vsh proc~test2_analytic TEST2_ANALYTIC program~main->proc~test2_analytic proc~test2_gw TEST2_GW program~main->proc~test2_gw proc~test2_vsh TEST2_VSH program~main->proc~test2_vsh proc~vsh_pol_inversion VSH_POL_INVERSION program~main->proc~vsh_pol_inversion interface~assoc_legendre ASSOC_LEGENDRE proc~batch_alm_cons->interface~assoc_legendre interface~assoc_legendre_all ASSOC_LEGENDRE_ALL proc~batch_alm_cons->interface~assoc_legendre_all proc~plm_index PLM_INDEX proc~batch_alm_cons->proc~plm_index proc~batch_dalm_cons->interface~assoc_legendre_all interface~ddx_assoc_legendre DDX_ASSOC_LEGENDRE proc~batch_dalm_cons->interface~ddx_assoc_legendre interface~ddx_assoc_legendre_all DDX_ASSOC_LEGENDRE_ALL proc~batch_dalm_cons->interface~ddx_assoc_legendre_all proc~batch_dalm_cons->proc~plm_index interface~grad_ssh GRAD_SSH proc~batch_grad_ssh_cons->interface~grad_ssh interface~grad_ssh_all GRAD_SSH_ALL proc~batch_grad_ssh_cons->interface~grad_ssh_all proc~ylm_index YLM_INDEX proc~batch_grad_ssh_cons->proc~ylm_index interface~l_ssh L_SSH proc~batch_l_ssh_cons->interface~l_ssh interface~l_ssh_all L_SSH_ALL proc~batch_l_ssh_cons->interface~l_ssh_all proc~batch_l_ssh_cons->proc~ylm_index interface~pvsh_pol PVSH_POL proc~batch_pvsh_pol_cons->interface~pvsh_pol interface~pvsh_pol_all PVSH_POL_ALL proc~batch_pvsh_pol_cons->interface~pvsh_pol_all proc~batch_pvsh_pol_cons->proc~ylm_index interface~pvsh_rad PVSH_RAD proc~batch_pvsh_rad_cons->interface~pvsh_rad interface~pvsh_rad_all PVSH_RAD_ALL proc~batch_pvsh_rad_cons->interface~pvsh_rad_all proc~batch_pvsh_rad_cons->proc~ylm_index interface~pvsh_tor PVSH_TOR proc~batch_pvsh_tor_cons->interface~pvsh_tor interface~pvsh_tor_all PVSH_TOR_ALL proc~batch_pvsh_tor_cons->interface~pvsh_tor_all proc~batch_pvsh_tor_cons->proc~ylm_index dimag dimag proc~batch_ssh_cons->dimag interface~ssh SSH proc~batch_ssh_cons->interface~ssh interface~ssh_all SSH_ALL proc~batch_ssh_cons->interface~ssh_all proc~batch_ssh_cons->proc~ylm_index interface~vsh_pol_dn VSH_POL_DN proc~batch_vsh_pol_dn_cons->interface~vsh_pol_dn interface~vsh_pol_dn_all VSH_POL_DN_ALL proc~batch_vsh_pol_dn_cons->interface~vsh_pol_dn_all proc~batch_vsh_pol_dn_cons->proc~ylm_index interface~vsh_pol_up VSH_POL_UP proc~batch_vsh_pol_up_cons->interface~vsh_pol_up interface~vsh_pol_up_all VSH_POL_UP_ALL proc~batch_vsh_pol_up_cons->interface~vsh_pol_up_all proc~batch_vsh_pol_up_cons->proc~ylm_index interface~vsh_tor VSH_TOR proc~batch_vsh_tor_cons->interface~vsh_tor interface~vsh_tor_all VSH_TOR_ALL proc~batch_vsh_tor_cons->interface~vsh_tor_all proc~batch_vsh_tor_cons->proc~ylm_index interface~dot DOT proc~pvsh_pol_tor_ortho->interface~dot proc~pvsh_pol_tor_ortho->interface~pvsh_pol_all proc~pvsh_pol_tor_ortho->interface~pvsh_tor_all proc~pvsh_pol_tor_ortho->proc~ylm_index proc~ssh_ortho->interface~assoc_legendre_all interface~log_fact LOG_FACT proc~ssh_ortho->interface~log_fact proc~ssh_ortho->proc~plm_index dcos dcos proc~test1_analytic->dcos dsin dsin proc~test1_analytic->dsin interface~gwi GWI proc~test1_gw->interface~gwi proc~test1_gw->interface~ssh proc~test1_vsh->interface~dot proc~test1_vsh->interface~vsh_pol_dn proc~test1_vsh->interface~vsh_pol_up proc~test1_vsh->interface~vsh_tor proc~test2_analytic->dcos proc~test2_analytic->dsin proc~test2_gw->interface~gwi interface~gwj GWJ proc~test2_gw->interface~gwj proc~test2_gw->interface~ssh proc~test2_vsh->interface~dot proc~test2_vsh->interface~pvsh_pol proc~test2_vsh->interface~pvsh_rad proc~test2_vsh->interface~pvsh_tor proc~vsh_pol_inversion->interface~pvsh_pol_all proc~vsh_pol_inversion->interface~pvsh_rad_all proc~vsh_pol_inversion->interface~vsh_pol_dn_all proc~vsh_pol_inversion->interface~vsh_pol_up_all proc~vsh_pol_inversion->proc~ylm_index proc~assoc_legendre_dp ASSOC_LEGENDRE_DP interface~assoc_legendre->proc~assoc_legendre_dp proc~assoc_legendre_all_dp ASSOC_LEGENDRE_ALL_DP interface~assoc_legendre_all->proc~assoc_legendre_all_dp proc~ddx_assoc_legendre_dp DDX_ASSOC_LEGENDRE_DP interface~ddx_assoc_legendre->proc~ddx_assoc_legendre_dp proc~ddx_assoc_legendre_all_dp DDX_ASSOC_LEGENDRE_ALL_DP interface~ddx_assoc_legendre_all->proc~ddx_assoc_legendre_all_dp proc~dot_dp DOT_DP interface~dot->proc~dot_dp proc~grad_ssh_dp GRAD_SSH_DP interface~grad_ssh->proc~grad_ssh_dp proc~grad_ssh_all_dp GRAD_SSH_ALL_DP interface~grad_ssh_all->proc~grad_ssh_all_dp proc~gwi_dp GWI_DP interface~gwi->proc~gwi_dp proc~gwj_dp GWJ_DP interface~gwj->proc~gwj_dp proc~l_ssh_dp L_SSH_DP interface~l_ssh->proc~l_ssh_dp proc~l_ssh_all_dp L_SSH_ALL_DP interface~l_ssh_all->proc~l_ssh_all_dp proc~log_fact_dp LOG_FACT_DP interface~log_fact->proc~log_fact_dp proc~pvsh_pol_dp PVSH_POL_DP interface~pvsh_pol->proc~pvsh_pol_dp proc~pvsh_pol_all_dp PVSH_POL_ALL_DP interface~pvsh_pol_all->proc~pvsh_pol_all_dp proc~pvsh_rad_dp PVSH_RAD_DP interface~pvsh_rad->proc~pvsh_rad_dp proc~pvsh_rad_all_dp PVSH_RAD_ALL_DP interface~pvsh_rad_all->proc~pvsh_rad_all_dp proc~pvsh_tor_dp PVSH_TOR_DP interface~pvsh_tor->proc~pvsh_tor_dp proc~pvsh_tor_all_dp PVSH_TOR_ALL_DP interface~pvsh_tor_all->proc~pvsh_tor_all_dp proc~ssh_dp SSH_DP interface~ssh->proc~ssh_dp proc~ssh_all_dp SSH_ALL_DP interface~ssh_all->proc~ssh_all_dp proc~vsh_pol_dn_dp VSH_POL_DN_DP interface~vsh_pol_dn->proc~vsh_pol_dn_dp proc~vsh_pol_dn_all_dp VSH_POL_DN_ALL_DP interface~vsh_pol_dn_all->proc~vsh_pol_dn_all_dp proc~vsh_pol_up_dp VSH_POL_UP_DP interface~vsh_pol_up->proc~vsh_pol_up_dp proc~vsh_pol_up_all_dp VSH_POL_UP_ALL_DP interface~vsh_pol_up_all->proc~vsh_pol_up_all_dp proc~vsh_tor_dp VSH_TOR_DP interface~vsh_tor->proc~vsh_tor_dp proc~vsh_tor_all_dp VSH_TOR_ALL_DP interface~vsh_tor_all->proc~vsh_tor_all_dp proc~assoc_legendre_all_dp->proc~plm_index proc~assoc_legendre_dp->interface~log_fact proc~ddx_assoc_legendre_all_dp->proc~plm_index interface~assoc_legendre_and_deriv ASSOC_LEGENDRE_AND_DERIV proc~ddx_assoc_legendre_dp->interface~assoc_legendre_and_deriv interface~vsh_core VSH_CORE proc~grad_ssh_all_dp->interface~vsh_core proc~grad_ssh_dp->dcos proc~grad_ssh_dp->dsin proc~grad_ssh_dp->interface~log_fact proc~grad_ssh_dp->interface~assoc_legendre_and_deriv interface~cgcoeff CGCOEFF proc~gwi_dp->interface~cgcoeff proc~gwj_dp->interface~cgcoeff proc~l_ssh_all_dp->interface~vsh_core proc~l_ssh_dp->dcos proc~l_ssh_dp->dsin proc~l_ssh_dp->interface~log_fact proc~l_ssh_dp->interface~assoc_legendre_and_deriv proc~pvsh_pol_all_dp->proc~ylm_index proc~pvsh_pol_all_dp->interface~vsh_core proc~pvsh_pol_dp->dcos proc~pvsh_pol_dp->dsin proc~pvsh_pol_dp->interface~log_fact proc~pvsh_pol_dp->interface~assoc_legendre_and_deriv proc~pvsh_rad_all_dp->interface~vsh_core proc~pvsh_rad_dp->interface~ssh proc~pvsh_tor_all_dp->proc~ylm_index proc~pvsh_tor_all_dp->interface~vsh_core proc~pvsh_tor_dp->dcos proc~pvsh_tor_dp->dsin proc~pvsh_tor_dp->interface~log_fact proc~pvsh_tor_dp->interface~assoc_legendre_and_deriv proc~ssh_all_dp->dcos proc~ssh_all_dp->proc~plm_index proc~ssh_all_dp->proc~ylm_index interface~assoc_legendre_norm_all ASSOC_LEGENDRE_NORM_ALL proc~ssh_all_dp->interface~assoc_legendre_norm_all proc~ssh_dp->dcos proc~ssh_dp->interface~assoc_legendre proc~ssh_dp->interface~log_fact proc~vsh_pol_dn_all_dp->proc~ylm_index proc~vsh_pol_dn_all_dp->interface~vsh_core proc~vsh_pol_dn_dp->dcos proc~vsh_pol_dn_dp->dsin proc~vsh_pol_dn_dp->interface~log_fact proc~vsh_pol_dn_dp->interface~assoc_legendre_and_deriv proc~vsh_pol_up_all_dp->proc~ylm_index proc~vsh_pol_up_all_dp->interface~vsh_core proc~vsh_pol_up_dp->dcos proc~vsh_pol_up_dp->dsin proc~vsh_pol_up_dp->interface~log_fact proc~vsh_pol_up_dp->interface~assoc_legendre_and_deriv proc~vsh_tor_all_dp->interface~pvsh_tor_all proc~vsh_tor_dp->interface~pvsh_tor proc~assoc_legendre_and_deriv_dp ASSOC_LEGENDRE_AND_DERIV_DP interface~assoc_legendre_and_deriv->proc~assoc_legendre_and_deriv_dp proc~assoc_legendre_norm_all_dp ASSOC_LEGENDRE_NORM_ALL_DP interface~assoc_legendre_norm_all->proc~assoc_legendre_norm_all_dp proc~cgcoeff_dp CGCOEFF_DP interface~cgcoeff->proc~cgcoeff_dp proc~vsh_core_dp VSH_CORE_DP interface~vsh_core->proc~vsh_core_dp proc~assoc_legendre_and_deriv_dp->interface~log_fact proc~assoc_legendre_norm_all_dp->proc~plm_index proc~cgcoeff_dp->interface~log_fact proc~vsh_core_dp->dcos proc~vsh_core_dp->dsin proc~vsh_core_dp->proc~plm_index proc~vsh_core_dp->proc~ylm_index proc~vsh_core_dp->interface~assoc_legendre_norm_all interface~ddx_assoc_legendre_norm_all DDX_ASSOC_LEGENDRE_NORM_ALL proc~vsh_core_dp->interface~ddx_assoc_legendre_norm_all proc~ddx_assoc_legendre_norm_all_dp DDX_ASSOC_LEGENDRE_NORM_ALL_DP interface~ddx_assoc_legendre_norm_all->proc~ddx_assoc_legendre_norm_all_dp proc~ddx_assoc_legendre_norm_all_dp->proc~plm_index

Variables

Type Attributes Name Initial
integer(kind=i4) :: I
real(kind=dp) :: MAX_ERR
integer(kind=i4), parameter :: NTHETA = 100
integer(kind=i4) :: N_FAIL
integer(kind=i4) :: STATUS
complex(kind=dp), DIMENSION(NTHETA) :: TEST1A
complex(kind=dp), DIMENSION(NTHETA) :: TEST1B
complex(kind=dp), DIMENSION(NTHETA) :: TEST1C
complex(kind=dp), DIMENSION(NTHETA) :: TEST2A
complex(kind=dp), DIMENSION(NTHETA) :: TEST2B
complex(kind=dp), DIMENSION(NTHETA) :: TEST2C

Source Code

PROGRAM MAIN
USE KINDS,   ONLY: dp, i4
USE GLOBALS, ONLY: pi
USE TESTS,   ONLY: &
  TEST1_ANALYTIC, TEST1_VSH, TEST1_GW, &
  TEST2_ANALYTIC, TEST2_VSH, TEST2_GW, &
  BATCH_ALM_CONS, BATCH_DALM_CONS, BATCH_SSH_CONS, &
  SSH_ORTHO, BATCH_GRAD_SSH_CONS, BATCH_L_SSH_CONS, &
  BATCH_PVSH_RAD_CONS, BATCH_PVSH_POL_CONS, BATCH_PVSH_TOR_CONS, &
  BATCH_VSH_TOR_CONS, BATCH_VSH_POL_UP_CONS, BATCH_VSH_POL_DN_CONS, &
  PVSH_POL_TOR_ORTHO, VSH_POL_INVERSION
IMPLICIT NONE

INTEGER(KIND=i4) :: NTHETA, I, STATUS, N_FAIL
PARAMETER (NTHETA=100)
COMPLEX(KIND=dp), DIMENSION(NTHETA) :: TEST1A, TEST1B, TEST1C
COMPLEX(KIND=dp), DIMENSION(NTHETA) :: TEST2A, TEST2B, TEST2C
REAL(KIND=dp)    :: MAX_ERR

N_FAIL = 0

! ── Cross-validation tests ──────────────────────────────────────────────────
TEST1A = TEST1_ANALYTIC(NTHETA)
TEST1B = TEST1_VSH(NTHETA)
TEST1C = TEST1_GW(NTHETA)

TEST2A = TEST2_ANALYTIC(NTHETA)
TEST2B = TEST2_VSH(NTHETA)
TEST2C = TEST2_GW(NTHETA)

OPEN(UNIT=11, FILE="./validation/TEST1.dat")
OPEN(UNIT=12, FILE="./validation/TEST2.dat")
DO I=1,NTHETA
  WRITE(11,*) (I-1)*pi/(NTHETA-1),TEST1A(I),TEST1B(I),TEST1C(I)
ENDDO
DO I=1,NTHETA
  WRITE(12,*) (I-1)*pi/(NTHETA-1),TEST2A(I),TEST2B(I),TEST2C(I)
ENDDO
CLOSE(11)
CLOSE(12)

MAX_ERR = MAXVAL(ABS(TEST1A - TEST1B))
IF (MAX_ERR > 1.0E-12_dp) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A,ES10.3)') "FAIL  test1_analytic_vs_vsh       max_err=", MAX_ERR
ELSE
  WRITE(*,'(A)') "PASS  test1_analytic_vs_vsh"
END IF

MAX_ERR = MAXVAL(ABS(TEST1A - TEST1C))
IF (MAX_ERR > 1.0E-12_dp) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A,ES10.3)') "FAIL  test1_analytic_vs_gw        max_err=", MAX_ERR
ELSE
  WRITE(*,'(A)') "PASS  test1_analytic_vs_gw"
END IF

MAX_ERR = MAXVAL(ABS(TEST2A - TEST2B))
IF (MAX_ERR > 1.0E-12_dp) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A,ES10.3)') "FAIL  test2_analytic_vs_vsh       max_err=", MAX_ERR
ELSE
  WRITE(*,'(A)') "PASS  test2_analytic_vs_vsh"
END IF

MAX_ERR = MAXVAL(ABS(TEST2A - TEST2C))
IF (MAX_ERR > 1.0E-12_dp) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A,ES10.3)') "FAIL  test2_analytic_vs_gw        max_err=", MAX_ERR
ELSE
  WRITE(*,'(A)') "PASS  test2_analytic_vs_gw"
END IF

! ── Batch consistency tests ──────────────────────────────────────────────────
OPEN(UNIT=21, FILE="./validation/batch_alm_cons.dat")
CALL BATCH_ALM_CONS(8, 20, 21, STATUS)
CLOSE(21)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_alm_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_alm_cons"
END IF

OPEN(UNIT=22, FILE="./validation/batch_dalm_cons.dat")
CALL BATCH_DALM_CONS(8, 20, 22, STATUS)
CLOSE(22)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_dalm_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_dalm_cons"
END IF

OPEN(UNIT=23, FILE="./validation/batch_ssh_cons.dat")
CALL BATCH_SSH_CONS(5, 15, 23, STATUS)
CLOSE(23)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_ssh_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_ssh_cons"
END IF

OPEN(UNIT=24, FILE="./validation/ssh_ortho.dat")
CALL SSH_ORTHO(6, 10000, 24, STATUS)
CLOSE(24)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  ssh_ortho"
ELSE
  WRITE(*,'(A)') "PASS  ssh_ortho"
END IF

OPEN(UNIT=31, FILE="./validation/batch_grad_ssh_cons.dat")
CALL BATCH_GRAD_SSH_CONS(5, 15, 31, STATUS)
CLOSE(31)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_grad_ssh_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_grad_ssh_cons"
END IF

OPEN(UNIT=32, FILE="./validation/batch_l_ssh_cons.dat")
CALL BATCH_L_SSH_CONS(5, 15, 32, STATUS)
CLOSE(32)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_l_ssh_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_l_ssh_cons"
END IF

OPEN(UNIT=33, FILE="./validation/batch_pvsh_rad_cons.dat")
CALL BATCH_PVSH_RAD_CONS(5, 15, 33, STATUS)
CLOSE(33)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_pvsh_rad_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_pvsh_rad_cons"
END IF

OPEN(UNIT=34, FILE="./validation/batch_pvsh_pol_cons.dat")
CALL BATCH_PVSH_POL_CONS(5, 15, 34, STATUS)
CLOSE(34)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_pvsh_pol_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_pvsh_pol_cons"
END IF

OPEN(UNIT=35, FILE="./validation/batch_pvsh_tor_cons.dat")
CALL BATCH_PVSH_TOR_CONS(5, 15, 35, STATUS)
CLOSE(35)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_pvsh_tor_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_pvsh_tor_cons"
END IF

OPEN(UNIT=36, FILE="./validation/batch_vsh_tor_cons.dat")
CALL BATCH_VSH_TOR_CONS(5, 15, 36, STATUS)
CLOSE(36)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_vsh_tor_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_vsh_tor_cons"
END IF

OPEN(UNIT=37, FILE="./validation/batch_vsh_pol_up_cons.dat")
CALL BATCH_VSH_POL_UP_CONS(5, 15, 37, STATUS)
CLOSE(37)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_vsh_pol_up_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_vsh_pol_up_cons"
END IF

OPEN(UNIT=38, FILE="./validation/batch_vsh_pol_dn_cons.dat")
CALL BATCH_VSH_POL_DN_CONS(5, 15, 38, STATUS)
CLOSE(38)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  batch_vsh_pol_dn_cons"
ELSE
  WRITE(*,'(A)') "PASS  batch_vsh_pol_dn_cons"
END IF

OPEN(UNIT=39, FILE="./validation/pvsh_pol_tor_ortho.dat")
CALL PVSH_POL_TOR_ORTHO(5, 15, 39, STATUS)
CLOSE(39)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  pvsh_pol_tor_ortho"
ELSE
  WRITE(*,'(A)') "PASS  pvsh_pol_tor_ortho"
END IF

OPEN(UNIT=40, FILE="./validation/vsh_pol_inversion.dat")
CALL VSH_POL_INVERSION(5, 15, 40, STATUS)
CLOSE(40)
IF (STATUS /= 0) THEN
  N_FAIL = N_FAIL + 1
  WRITE(*,'(A)') "FAIL  vsh_pol_inversion"
ELSE
  WRITE(*,'(A)') "PASS  vsh_pol_inversion"
END IF

! ── Summary ──────────────────────────────────────────────────────────────────
IF (N_FAIL > 0) THEN
  WRITE(*,'(A,I0,A)') "RESULT: FAILED - ", N_FAIL, " test(s) failed"
  STOP 1
ELSE
  WRITE(*,'(A)') "RESULT: PASSED - all tests"
END IF

END PROGRAM MAIN