PVSH_TOR_DP Function

private function PVSH_TOR_DP(L, K, THETA, PHI) result(PVSH_TOR)

Toroidal member of the polar vector spherical harmonic basis, -- purely horizontal (zero radial component), identical in form to L_SSH but normalized by . This is the horizontal-field piece of a toroidal magnetic field, for a toroidal stream function . Zero for (no toroidal monopole).

Warning

Built on the unnormalized ASSOC_LEGENDRE_AND_DERIV -- inherits its stability limit (safe for at any ), not PVSH_TOR_ALL's . See STABILITY_FINDINGS.md at the repo root, Part 2.

Returns: , complex 3-vector.

Arguments

Type IntentOptional Attributes Name
integer(kind=i4), intent(in) :: L

Degree, .

integer(kind=i4), intent(in) :: K

Order, .

real(kind=dp), intent(in) :: THETA

Colatitude in radians, .

real(kind=dp), intent(in) :: PHI

Longitude in radians, .

Return Value complex(kind=dp), DIMENSION(3)


Calls

proc~~pvsh_tor_dp~~CallsGraph proc~pvsh_tor_dp PVSH_TOR_DP dcos dcos proc~pvsh_tor_dp->dcos dsin dsin proc~pvsh_tor_dp->dsin interface~assoc_legendre_and_deriv ASSOC_LEGENDRE_AND_DERIV proc~pvsh_tor_dp->interface~assoc_legendre_and_deriv interface~log_fact LOG_FACT proc~pvsh_tor_dp->interface~log_fact proc~assoc_legendre_and_deriv_dp ASSOC_LEGENDRE_AND_DERIV_DP interface~assoc_legendre_and_deriv->proc~assoc_legendre_and_deriv_dp proc~log_fact_dp LOG_FACT_DP interface~log_fact->proc~log_fact_dp proc~assoc_legendre_and_deriv_dp->interface~log_fact

Called by

proc~~pvsh_tor_dp~~CalledByGraph proc~pvsh_tor_dp PVSH_TOR_DP interface~pvsh_tor PVSH_TOR interface~pvsh_tor->proc~pvsh_tor_dp proc~batch_pvsh_tor_cons BATCH_PVSH_TOR_CONS proc~batch_pvsh_tor_cons->interface~pvsh_tor proc~field_known FIELD_KNOWN proc~field_known->interface~pvsh_tor proc~field_known_tor FIELD_KNOWN_TOR proc~field_known_tor->interface~pvsh_tor proc~field_quad_bump FIELD_QUAD_BUMP proc~field_quad_bump->interface~pvsh_tor proc~run_gwj_sweep RUN_GWJ_SWEEP proc~run_gwj_sweep->interface~pvsh_tor proc~test2_vsh TEST2_VSH proc~test2_vsh->interface~pvsh_tor proc~vsh_tor_dp VSH_TOR_DP proc~vsh_tor_dp->interface~pvsh_tor interface~vsh_tor VSH_TOR interface~vsh_tor->proc~vsh_tor_dp proc~run_part_b~2 RUN_PART_B proc~run_part_b~2->proc~field_quad_bump program~gwi_gwj_sweep GWI_GWJ_SWEEP program~gwi_gwj_sweep->proc~run_gwj_sweep program~main MAIN program~main->proc~batch_pvsh_tor_cons program~main->proc~test2_vsh proc~batch_vsh_tor_cons BATCH_VSH_TOR_CONS program~main->proc~batch_vsh_tor_cons proc~test1_vsh TEST1_VSH program~main->proc~test1_vsh proc~batch_vsh_tor_cons->interface~vsh_tor proc~bench_vsh_tor BENCH_VSH_TOR proc~bench_vsh_tor->interface~vsh_tor proc~test1_vsh->interface~vsh_tor program~convergence_main CONVERGENCE_MAIN program~convergence_main->interface~vsh_tor program~convergence_main->proc~batch_vsh_tor_cons program~vsh_decomposition_tor VSH_DECOMPOSITION_TOR program~vsh_decomposition_tor->proc~run_part_b~2 program~bench_main BENCH_MAIN program~bench_main->proc~bench_vsh_tor

Source Code

  FUNCTION PVSH_TOR_DP(L,K,THETA,PHI) RESULT(PVSH_TOR)
  IMPLICIT NONE
  INTEGER(KIND=i4), INTENT(IN) :: L
  INTEGER(KIND=i4), INTENT(IN) :: K
  REAL(KIND=dp), INTENT(IN) :: THETA
  REAL(KIND=dp), INTENT(IN) :: PHI
  REAL(KIND=dp) :: SINTH,NORM,PLK,DPLK,SCALE
  COMPLEX(KIND=dp) :: EPHIM,YLM,GTH,GPH
  COMPLEX(KIND=dp), DIMENSION(3) :: PVSH_TOR
  PVSH_TOR(1) = DCMPLX(0.d0, 0.d0)
  IF (L .GT. 0) THEN
    SINTH = DSIN(THETA)
    NORM  = DSQRT((2.d0*L+1.d0)/(4.d0*pi))* &
            EXP(0.5_dp*(LOG_FACT(L-K)-LOG_FACT(L+K)))
    CALL ASSOC_LEGENDRE_AND_DERIV(L, K, DCOS(THETA), PLK, DPLK)
    EPHIM = EXP(j*K*PHI)
    YLM   = NORM * PLK * EPHIM
    GTH   = -SINTH * NORM * DPLK * EPHIM
    IF (SINTH .NE. 0.d0) THEN
      GPH = j*K*YLM/SINTH
    ELSE
      GPH = DCMPLX(0.d0, 0.d0)
    END IF
    SCALE = 1.d0/DSQRT(L*(L+1.d0))
    PVSH_TOR(2) =  j*GPH*SCALE
    PVSH_TOR(3) = -j*GTH*SCALE
  ELSE
    PVSH_TOR(2) = DCMPLX(0.d0, 0.d0)
    PVSH_TOR(3) = DCMPLX(0.d0, 0.d0)
  END IF
  RETURN
  END FUNCTION PVSH_TOR_DP