VSH_POL_DN_DP Function

private function VSH_POL_DN_DP(L, K, THETA, PHI) result(VSH_POL_DN)

The member of the standard (total-angular-momentum coupled) vector spherical harmonic basis, built from the polar basis by i.e. PVSH_RAD and PVSH_POL rotated together by an -dependent angle (see VSH_POL_UP for the companion rotation). Zero for (no ).

Warning

At this does not reproduce the classic 2:1 magnetic-dipole radial:horizontal ratio -- VSH_POL_DN(1,0,...) is proportional to , a 1:-1 ratio. VSH_POL_UP is the one that reproduces the dipole pattern.

Warning

Built on the unnormalized ASSOC_LEGENDRE_AND_DERIV -- inherits its stability limit (safe for at any ), not VSH_POL_DN_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~~vsh_pol_dn_dp~~CallsGraph proc~vsh_pol_dn_dp VSH_POL_DN_DP dcos dcos proc~vsh_pol_dn_dp->dcos dsin dsin proc~vsh_pol_dn_dp->dsin interface~assoc_legendre_and_deriv ASSOC_LEGENDRE_AND_DERIV proc~vsh_pol_dn_dp->interface~assoc_legendre_and_deriv interface~log_fact LOG_FACT proc~vsh_pol_dn_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~~vsh_pol_dn_dp~~CalledByGraph proc~vsh_pol_dn_dp VSH_POL_DN_DP interface~vsh_pol_dn VSH_POL_DN interface~vsh_pol_dn->proc~vsh_pol_dn_dp proc~batch_vsh_pol_dn_cons BATCH_VSH_POL_DN_CONS proc~batch_vsh_pol_dn_cons->interface~vsh_pol_dn proc~bench_vsh_pol_dn BENCH_VSH_POL_DN proc~bench_vsh_pol_dn->interface~vsh_pol_dn proc~test1_vsh TEST1_VSH proc~test1_vsh->interface~vsh_pol_dn program~convergence_main CONVERGENCE_MAIN program~convergence_main->interface~vsh_pol_dn program~convergence_main->proc~batch_vsh_pol_dn_cons program~bench_main BENCH_MAIN program~bench_main->proc~bench_vsh_pol_dn program~main MAIN program~main->proc~batch_vsh_pol_dn_cons program~main->proc~test1_vsh

Source Code

  FUNCTION VSH_POL_DN_DP(L,K,THETA,PHI) RESULT(VSH_POL_DN)
  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,SC1,SC23
  COMPLEX(KIND=dp) :: EPHIM,YLM,GTH,GPH
  COMPLEX(KIND=dp), DIMENSION(3) :: VSH_POL_DN
  VSH_POL_DN(1) = DCMPLX(0.d0, 0.d0)
  VSH_POL_DN(2) = DCMPLX(0.d0, 0.d0)
  VSH_POL_DN(3) = 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
    SC1  = DSQRT(DBLE(L)/(2*L+1.d0))
    SC23 = 1.d0/DSQRT((2*L+1.d0)*DBLE(L))
    VSH_POL_DN(1) = SC1  * YLM
    VSH_POL_DN(2) = SC23 * GTH
    VSH_POL_DN(3) = SC23 * GPH
  END IF
  RETURN
  END FUNCTION VSH_POL_DN_DP