| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(t_fBase), | intent(in) | :: | LA_fbase_in | |||
| real(kind=wp), | intent(in) | :: | phiPrime_s |
toroidal and poloidal flux s derivatives at s_pos |
||
| real(kind=wp), | intent(in) | :: | ChiPrime_s |
toroidal and poloidal flux s derivatives at s_pos |
||
| real(kind=wp), | intent(in), | DIMENSION(1:LA_fbase_in%mn_IP) | :: | gam_tt |
g_tt/J evaluated on IP points |
|
| real(kind=wp), | intent(in), | DIMENSION(1:LA_fbase_in%mn_IP) | :: | gam_tz |
g_tz/J evaluated on IP points |
|
| real(kind=wp), | intent(in), | DIMENSION(1:LA_fbase_in%mn_IP) | :: | gam_zz |
g_zz/J evaluated on IP points |
|
| real(kind=wp), | intent(out) | :: | LA_s(1:LA_fbase_in%modes) |
lambda at spos |
SUBROUTINE Lambda_setup_and_solve(LA_fbase_in,phiPrime_s,ChiPrime_s,gam_tt,gam_tz,gam_zz,LA_s) ! MODULES USE MODgvec_LinAlg,ONLY: SOLVE USE MODgvec_fbase ,ONLY: t_fbase IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES TYPE(t_fbase),INTENT(IN) :: LA_fbase_in !< base classes belong to solution U_in REAL(wp),INTENT(IN) :: phiPrime_s,ChiPrime_s !! toroidal and poloidal flux s derivatives at s_pos REAL(wp),DIMENSION(1:LA_fbase_in%mn_IP), INTENT(IN) :: gam_tt !! g_tt/J evaluated on IP points REAL(wp),DIMENSION(1:LA_fbase_in%mn_IP), INTENT(IN) :: gam_tz !! g_tz/J evaluated on IP points REAL(wp),DIMENSION(1:LA_fbase_in%mn_IP), INTENT(IN) :: gam_zz !! g_zz/J evaluated on IP points !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL(wp) , INTENT( OUT) :: LA_s(1:LA_fbase_in%modes) !! lambda at spos !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iMode,jMode,mn_IP,LA_modes REAL(wp) :: Amat(1:LA_fbase_in%modes,1:LA_fbase_in%modes) REAL(wp),DIMENSION(1:LA_fbase_in%modes) :: RHS,sAdiag ! REAL(wp) :: gam_ta_da,gam_za_da REAL(wp) :: sum_gam_ta_da,sum_gam_za_da REAL(wp),DIMENSION(1:LA_fbase_in%mn_IP,1:LA_fbase_in%modes) :: gam_ta_da,gam_za_da !=================================================================================================================================== __PERFON('setup_1') LA_modes=LA_fbase_in%modes mn_IP =LA_fbase_in%mn_IP !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(iMode) & !$OMP SHARED(mn_IP,LA_modes,LA_fbase_in,sAdiag) !estimate of 1/Adiag for preconditioning (=1 for m=n=0) DO iMode=1,LA_modes sAdiag(iMode)=1.0_wp/(MAX(1.0_wp,REAL((LA_fbase_in%Xmn(1,iMode))**2+LA_fbase_in%Xmn(2,iMode)**2 ,wp) )*REAL(mn_IP,wp)) !sAdiag(iMode)=1.0_wp END DO !iMode !$OMP END PARALLEL DO !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(iMode) & !$OMP SHARED(gam_ta_da,gam_za_da,LA_modes,gam_tt,gam_tz,gam_zz,LA_fbase_in) DO iMode=1,LA_modes gam_ta_da(:,iMode)=gam_tz(:)*LA_fbase_in%base_dthet_IP(:,iMode) - gam_tt(:)*LA_fbase_in%base_dzeta_IP(:,iMode) gam_za_da(:,iMode)=gam_zz(:)*LA_fbase_in%base_dthet_IP(:,iMode) - gam_tz(:)*LA_fbase_in%base_dzeta_IP(:,iMode) END DO!iMode !$OMP END PARALLEL DO __PERFOFF('setup_1') __PERFON('setup_Amat') !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(jMode) & !$OMP SHARED(Amat,gam_ta_da,gam_za_da,LA_fbase_in,LA_modes,PhiPrime_s,sAdiag) DO jMode=1,LA_modes !m=n=0 should not be in lambda, but check IF (LA_fbase_in%zero_odd_even(jMode).NE.MN_ZERO) THEN CALL LA_fbase_in%projectIPtoDOF(.FALSE., PhiPrime_s,DERIV_ZETA,gam_ta_da(:,jMode),Amat(:,jMode)) CALL LA_fbase_in%projectIPtoDOF(.TRUE. ,-PhiPrime_s,DERIV_THET,gam_za_da(:,jMode),Amat(:,jMode)) Amat(:,jMode) = Amat(:,jMode) *sAdiag(:) ELSE Amat(: ,jMode)=0.0_wp Amat(jMode,jMode)=1.0_wp END IF END DO!jMode !$OMP END PARALLEL DO __PERFOFF('setup_Amat') __PERFON('setup_rhs') !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(iMode,sum_gam_ta_da,sum_gam_za_da) & !$OMP SHARED(RHS,gam_ta_da,gam_za_da,LA_fbase_in,LA_modes,chiPrime_s,PhiPrime_s,sAdiag) DO iMode=1,LA_modes !m=n=0 should not be in lambda, but check IF (LA_fbase_in%zero_odd_even(iMode).NE.MN_ZERO) THEN sum_gam_ta_da=SUM(gam_ta_da(:,iMode)) sum_gam_za_da=SUM(gam_za_da(:,iMode)) ! 1/J( iota (g_thet,zeta dsigma_dthet - g_thet,thet dsigma_dzeta ) ! +(g_zeta,zeta dsigma_dthet - g_zeta,thet dsigma_dzeta ) ) RHS(iMode) = (chiPrime_s*sum_gam_ta_da +phiPrime_s*sum_gam_za_da) *sAdiag(iMode) ELSE RHS(iMode) = 0.0_wp END IF END DO!iMode !$OMP END PARALLEL DO __PERFOFF('setup_rhs') __PERFON('solve') LA_s=SOLVE(Amat,RHS) __PERFOFF('solve') END SUBROUTINE Lambda_setup_and_solve