VSH_CORE_DP Subroutine

private subroutine VSH_CORE_DP(YLM_OUT, GSSH_TH, GSSH_PH, LMAX, THETA, PHI)

Private helper shared by every batch VSH routine (GRAD_SSH_ALL, L_SSH_ALL, PVSH_RAD_ALL, PVSH_POL_ALL, PVSH_TOR_ALL, VSH_TOR_ALL, VSH_POL_UP_ALL, VSH_POL_DN_ALL): computes and its two angular gradient components (GRAD_SSH's parts) for every in one pass, so each caller only has to apply its own linear combination/normalization on top.

Warning

Inherits ASSOC_LEGENDRE_NORM_ALL's -dependent stability limit (safe for unconditionally) -- see STABILITY_FINDINGS.md at the repo root.

YLM_INDEX(l,m). Y_\ell^m ), same size/indexing. Y_\ell^m ), same size/indexing.

Arguments

Type IntentOptional Attributes Name
complex(kind=dp), intent(out) :: YLM_OUT((LMAX+1)**2)
complex(kind=dp), intent(out) :: GSSH_TH((LMAX+1)**2)
complex(kind=dp), intent(out) :: GSSH_PH((LMAX+1)**2)
integer(kind=i4), intent(in) :: LMAX

Maximum degree, .

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

Colatitude in radians, .

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

Longitude in radians, .


Calls

proc~~vsh_core_dp~~CallsGraph proc~vsh_core_dp VSH_CORE_DP dcos dcos proc~vsh_core_dp->dcos dsin dsin proc~vsh_core_dp->dsin interface~assoc_legendre_norm_all ASSOC_LEGENDRE_NORM_ALL 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~plm_index PLM_INDEX proc~vsh_core_dp->proc~plm_index proc~ylm_index YLM_INDEX proc~vsh_core_dp->proc~ylm_index proc~assoc_legendre_norm_all_dp ASSOC_LEGENDRE_NORM_ALL_DP interface~assoc_legendre_norm_all->proc~assoc_legendre_norm_all_dp 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~assoc_legendre_norm_all_dp->proc~plm_index proc~ddx_assoc_legendre_norm_all_dp->proc~plm_index

Called by

proc~~vsh_core_dp~~CalledByGraph proc~vsh_core_dp VSH_CORE_DP interface~vsh_core VSH_CORE interface~vsh_core->proc~vsh_core_dp proc~grad_ssh_all_dp GRAD_SSH_ALL_DP proc~grad_ssh_all_dp->interface~vsh_core proc~l_ssh_all_dp L_SSH_ALL_DP proc~l_ssh_all_dp->interface~vsh_core proc~pvsh_pol_all_dp PVSH_POL_ALL_DP proc~pvsh_pol_all_dp->interface~vsh_core proc~pvsh_rad_all_dp PVSH_RAD_ALL_DP proc~pvsh_rad_all_dp->interface~vsh_core proc~pvsh_tor_all_dp PVSH_TOR_ALL_DP proc~pvsh_tor_all_dp->interface~vsh_core proc~vsh_pol_dn_all_dp VSH_POL_DN_ALL_DP proc~vsh_pol_dn_all_dp->interface~vsh_core proc~vsh_pol_up_all_dp VSH_POL_UP_ALL_DP proc~vsh_pol_up_all_dp->interface~vsh_core interface~grad_ssh_all GRAD_SSH_ALL interface~grad_ssh_all->proc~grad_ssh_all_dp interface~l_ssh_all L_SSH_ALL interface~l_ssh_all->proc~l_ssh_all_dp interface~pvsh_pol_all PVSH_POL_ALL interface~pvsh_pol_all->proc~pvsh_pol_all_dp interface~pvsh_rad_all PVSH_RAD_ALL interface~pvsh_rad_all->proc~pvsh_rad_all_dp interface~pvsh_tor_all PVSH_TOR_ALL interface~pvsh_tor_all->proc~pvsh_tor_all_dp interface~vsh_pol_dn_all VSH_POL_DN_ALL interface~vsh_pol_dn_all->proc~vsh_pol_dn_all_dp interface~vsh_pol_up_all VSH_POL_UP_ALL interface~vsh_pol_up_all->proc~vsh_pol_up_all_dp proc~batch_grad_ssh_cons BATCH_GRAD_SSH_CONS proc~batch_grad_ssh_cons->interface~grad_ssh_all proc~batch_l_ssh_cons BATCH_L_SSH_CONS proc~batch_l_ssh_cons->interface~l_ssh_all proc~batch_pvsh_pol_cons BATCH_PVSH_POL_CONS proc~batch_pvsh_pol_cons->interface~pvsh_pol_all proc~batch_pvsh_rad_cons BATCH_PVSH_RAD_CONS proc~batch_pvsh_rad_cons->interface~pvsh_rad_all proc~batch_pvsh_tor_cons BATCH_PVSH_TOR_CONS proc~batch_pvsh_tor_cons->interface~pvsh_tor_all proc~batch_vsh_pol_dn_cons BATCH_VSH_POL_DN_CONS proc~batch_vsh_pol_dn_cons->interface~vsh_pol_dn_all proc~batch_vsh_pol_up_cons BATCH_VSH_POL_UP_CONS proc~batch_vsh_pol_up_cons->interface~vsh_pol_up_all proc~bench_vsh_pol_dn BENCH_VSH_POL_DN proc~bench_vsh_pol_dn->interface~vsh_pol_dn_all proc~bench_vsh_pol_up BENCH_VSH_POL_UP proc~bench_vsh_pol_up->interface~vsh_pol_up_all proc~decompose DECOMPOSE proc~decompose->interface~pvsh_pol_all proc~decompose->interface~pvsh_rad_all proc~decompose->interface~pvsh_tor_all proc~decompose~2 DECOMPOSE proc~decompose~2->interface~pvsh_pol_all proc~decompose~2->interface~pvsh_rad_all proc~decompose~2->interface~pvsh_tor_all proc~pvsh_pol_tor_ortho PVSH_POL_TOR_ORTHO proc~pvsh_pol_tor_ortho->interface~pvsh_pol_all proc~pvsh_pol_tor_ortho->interface~pvsh_tor_all proc~reconstruct RECONSTRUCT proc~reconstruct->interface~pvsh_pol_all proc~reconstruct->interface~pvsh_rad_all proc~reconstruct->interface~pvsh_tor_all proc~reconstruct~2 RECONSTRUCT proc~reconstruct~2->interface~pvsh_pol_all proc~reconstruct~2->interface~pvsh_rad_all proc~reconstruct~2->interface~pvsh_tor_all proc~vsh_pol_inversion VSH_POL_INVERSION 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_tor_all_dp VSH_TOR_ALL_DP proc~vsh_tor_all_dp->interface~pvsh_tor_all program~convergence_main CONVERGENCE_MAIN program~convergence_main->interface~vsh_pol_dn_all program~convergence_main->interface~vsh_pol_up_all program~convergence_main->proc~batch_vsh_pol_dn_cons program~convergence_main->proc~batch_vsh_pol_up_cons interface~vsh_tor_all VSH_TOR_ALL program~convergence_main->interface~vsh_tor_all proc~batch_vsh_tor_cons BATCH_VSH_TOR_CONS program~convergence_main->proc~batch_vsh_tor_cons interface~vsh_tor_all->proc~vsh_tor_all_dp proc~run_part_a RUN_PART_A proc~run_part_a->proc~decompose proc~run_part_a~2 RUN_PART_A proc~run_part_a~2->proc~decompose~2 proc~run_part_b RUN_PART_B proc~run_part_b->proc~decompose proc~run_part_b->proc~reconstruct proc~run_part_b~2 RUN_PART_B proc~run_part_b~2->proc~decompose~2 proc~run_part_b~2->proc~reconstruct~2 program~bench_main BENCH_MAIN program~bench_main->proc~bench_vsh_pol_dn program~bench_main->proc~bench_vsh_pol_up proc~bench_vsh_tor BENCH_VSH_TOR program~bench_main->proc~bench_vsh_tor program~main MAIN program~main->proc~batch_grad_ssh_cons program~main->proc~batch_l_ssh_cons program~main->proc~batch_pvsh_pol_cons program~main->proc~batch_pvsh_rad_cons program~main->proc~batch_pvsh_tor_cons program~main->proc~batch_vsh_pol_dn_cons program~main->proc~batch_vsh_pol_up_cons program~main->proc~pvsh_pol_tor_ortho program~main->proc~vsh_pol_inversion program~main->proc~batch_vsh_tor_cons proc~batch_vsh_tor_cons->interface~vsh_tor_all proc~bench_vsh_tor->interface~vsh_tor_all program~vsh_decomposition VSH_DECOMPOSITION program~vsh_decomposition->proc~run_part_a program~vsh_decomposition->proc~run_part_b program~vsh_decomposition_tor VSH_DECOMPOSITION_TOR program~vsh_decomposition_tor->proc~run_part_a~2 program~vsh_decomposition_tor->proc~run_part_b~2

Source Code

  SUBROUTINE VSH_CORE_DP(YLM_OUT, GSSH_TH, GSSH_PH, &
                      LMAX, THETA, PHI)
  IMPLICIT NONE
  INTEGER(KIND=i4), INTENT(IN)  :: LMAX
  REAL(KIND=dp),    INTENT(IN)  :: THETA
  REAL(KIND=dp),    INTENT(IN)  :: PHI
  COMPLEX(KIND=dp), INTENT(OUT) :: YLM_OUT((LMAX+1)**2)
  COMPLEX(KIND=dp), INTENT(OUT) :: GSSH_TH((LMAX+1)**2)
  COMPLEX(KIND=dp), INTENT(OUT) :: GSSH_PH((LMAX+1)**2)
  INTEGER(KIND=i4) :: L, M, PSIZE
  REAL(KIND=dp), ALLOCATABLE :: PNORM(:), DPNORM(:)
  REAL(KIND=dp)    :: SINTH, SIGN_M
  COMPLEX(KIND=dp) :: EPHIM, YP, GTH_P, GPH_P
  PSIZE = (LMAX+1)*(LMAX+2)/2
  ALLOCATE(PNORM(PSIZE), DPNORM(PSIZE))
  CALL ASSOC_LEGENDRE_NORM_ALL(PNORM, LMAX, DCOS(THETA))
  CALL DDX_ASSOC_LEGENDRE_NORM_ALL(DPNORM, PNORM, LMAX, &
                                  DCOS(THETA))
  SINTH = DSIN(THETA)
  DO L = 0, LMAX
    DO M = 0, L
      EPHIM = EXP(j*M*PHI)
      YP    = PNORM(PLM_INDEX(L,M)) * EPHIM
      GTH_P = -SINTH * DPNORM(PLM_INDEX(L,M)) * EPHIM
      IF (SINTH .NE. 0.d0) THEN
        GPH_P = j*M*YP/SINTH
      ELSE
        GPH_P = DCMPLX(0.d0, 0.d0)
      END IF
      YLM_OUT(YLM_INDEX(L, M)) = YP
      GSSH_TH(YLM_INDEX(L, M)) = GTH_P
      GSSH_PH(YLM_INDEX(L, M)) = GPH_P
      IF (M .GT. 0) THEN
        SIGN_M = 1.0_dp - 2.0_dp * MOD(M, 2)
        YLM_OUT(YLM_INDEX(L,-M)) = SIGN_M * CONJG(YP)
        GSSH_TH(YLM_INDEX(L,-M)) = SIGN_M * CONJG(GTH_P)
        GSSH_PH(YLM_INDEX(L,-M)) = SIGN_M * CONJG(GPH_P)
      END IF
    END DO
  END DO
  DEALLOCATE(PNORM, DPNORM)
  END SUBROUTINE VSH_CORE_DP