PVSH_POL_DP Function

private function PVSH_POL_DP(L, K, THETA, PHI) result(PVSH_POL)

Poloidal (horizontal) member of the polar vector spherical harmonic basis, -- purely horizontal (zero radial component), i.e. GRAD_SSH normalized by . Combined with a radial stream function , this is the horizontal-field piece of a poloidal field, . Zero for (a constant has no horizontal gradient).

Warning

Built on the unnormalized ASSOC_LEGENDRE_AND_DERIV -- inherits its stability limit (safe for at any ), not PVSH_POL_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_pol_dp~~CallsGraph proc~pvsh_pol_dp PVSH_POL_DP dcos dcos proc~pvsh_pol_dp->dcos dsin dsin proc~pvsh_pol_dp->dsin interface~assoc_legendre_and_deriv ASSOC_LEGENDRE_AND_DERIV proc~pvsh_pol_dp->interface~assoc_legendre_and_deriv interface~log_fact LOG_FACT proc~pvsh_pol_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_pol_dp~~CalledByGraph proc~pvsh_pol_dp PVSH_POL_DP interface~pvsh_pol PVSH_POL interface~pvsh_pol->proc~pvsh_pol_dp proc~batch_pvsh_pol_cons BATCH_PVSH_POL_CONS proc~batch_pvsh_pol_cons->interface~pvsh_pol proc~field_known FIELD_KNOWN proc~field_known->interface~pvsh_pol proc~run_gwj_sweep RUN_GWJ_SWEEP proc~run_gwj_sweep->interface~pvsh_pol proc~test2_vsh TEST2_VSH proc~test2_vsh->interface~pvsh_pol program~dipole_flux_expulsion DIPOLE_FLUX_EXPULSION program~dipole_flux_expulsion->interface~pvsh_pol program~dipole_synthesis DIPOLE_SYNTHESIS program~dipole_synthesis->interface~pvsh_pol program~dipole_uniform_sphere DIPOLE_UNIFORM_SPHERE program~dipole_uniform_sphere->interface~pvsh_pol program~gwi_gwj_sweep GWI_GWJ_SWEEP program~gwi_gwj_sweep->proc~run_gwj_sweep program~main MAIN program~main->proc~batch_pvsh_pol_cons program~main->proc~test2_vsh

Source Code

  FUNCTION PVSH_POL_DP(L,K,THETA,PHI) RESULT(PVSH_POL)
  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_POL
  PVSH_POL(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_POL(2) = GTH*SCALE
    PVSH_POL(3) = GPH*SCALE
  ELSE
    PVSH_POL(2) = DCMPLX(0.d0, 0.d0)
    PVSH_POL(3) = DCMPLX(0.d0, 0.d0)
  END IF
  RETURN
  END FUNCTION PVSH_POL_DP