Solve for lambda on one given flux surface (spos_in), using weak form of J^s=0: d/dzeta(B_theta)-d/dtheta(B_zeta)=0
Note that the mapping defined by X1 and X2 must be fully initialized, since derivatives in s must be taken!
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | spos_in |
s position to evaluate lambda |
||
| class(c_hmap), | intent(in) | :: | hmap_in | |||
| class(c_hmap_auxvar), | intent(in) | :: | hmap_xv(X1_base_in%f%mn_IP) | |||
| class(t_base), | intent(in) | :: | X1_base_in | |||
| class(t_base), | intent(in) | :: | X2_base_in | |||
| type(t_fBase), | intent(in) | :: | LA_fbase_in | |||
| real(kind=wp), | intent(in) | :: | X1_in(1:X1_base_in%s%nBase,1:X1_base_in%f%modes) |
U%X1 variable, is reshaped to 2D at input |
||
| real(kind=wp), | intent(in) | :: | X2_in(1:X2_base_in%s%nBase,1:X2_base_in%f%modes) |
U%X2 variable, is reshaped to 2D at input |
||
| real(kind=wp), | intent(out) | :: | LA_s(1:LA_fbase_in%modes) |
lambda at spos |
||
| real(kind=wp), | intent(in) | :: | phiPrime_s |
toroidal flux derivative phi' at the position s |
||
| real(kind=wp), | intent(in) | :: | chiPrime_s |
poloidal flux derivative chi' at the position s |
SUBROUTINE Lambda_solve(spos_in,hmap_in,hmap_xv,X1_base_in,X2_base_in,LA_fbase_in,X1_in,X2_in,LA_s,phiPrime_s,chiPrime_s) ! MODULES USE MODgvec_Globals, ONLY:n_warnings_occured USE MODgvec_base ,ONLY: t_base USE MODgvec_fbase ,ONLY: t_fbase USE MODgvec_hmap ,ONLY: PP_T_HMAP,PP_T_HMAP_AUXVAR IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES CLASS(t_base),INTENT(IN) :: X1_base_in,X2_base_in !< base classes belong to solution X1_in,X2_in TYPE(t_fbase),INTENT(IN) :: LA_fbase_in !< base class belong to solution LA_s #ifdef PP_WHICH_HMAP TYPE(PP_T_HMAP), INTENT(IN) :: hmap_in TYPE(PP_T_HMAP_AUXVAR), INTENT(IN) :: hmap_xv(X1_base_in%f%mn_IP) !< auxiliary variables for hmap, must be pre-computed #else CLASS(PP_T_HMAP), INTENT(IN) :: hmap_in CLASS(PP_T_HMAP_AUXVAR), INTENT(IN) :: hmap_xv(X1_base_in%f%mn_IP) !< auxiliary variables for hmap, must be pre-computed #endif REAL(wp) , INTENT(IN) :: spos_in !! s position to evaluate lambda REAL(wp) , INTENT(IN) :: X1_in(1:X1_base_in%s%nBase,1:X1_base_in%f%modes) !! U%X1 variable, is reshaped to 2D at input REAL(wp) , INTENT(IN) :: X2_in(1:X2_base_in%s%nBase,1:X2_base_in%f%modes) !! U%X2 variable, is reshaped to 2D at input REAL(wp) , INTENT(IN) :: phiPrime_s !! toroidal flux derivative phi' at the position s REAL(wp) , INTENT(IN) :: chiPrime_s !! poloidal flux derivative chi' at the position s !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL(wp) , INTENT( OUT) :: LA_s(1:LA_fbase_in%modes) !! lambda at spos !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iMode,i_mn,mn_IP REAL(wp) :: spos,minJ REAL(wp),DIMENSION(1:X1_base_in%f%modes) :: X1_s,X1_ds !! X1 solution at spos REAL(wp),DIMENSION(1:X2_base_in%f%modes) :: X2_s,X2_ds !! X1 solution at spos REAL(wp),DIMENSION(1:X1_base_in%f%mn_IP) :: X1_s_IP,dX1ds,dX1dthet,dX1dzeta, & !mn_IP should be same for all! X2_s_IP,dX2ds,dX2dthet,dX2dzeta, & detJ,gam_tt,gam_tz,gam_zz !=================================================================================================================================== __PERFON('lambda_solve') spos=MIN(1.0_wp-1.0e-12_wp,MAX(1.0e-04_wp,spos_in)) mn_IP = X1_base_in%f%mn_IP IF(X2_base_in%f%mn_IP.NE.mn_IP) CALL abort(__STAMP__,& 'X2 mn_IP /= X1 mn_IP') IF(LA_fbase_in%mn_IP .NE.mn_IP) CALL abort(__STAMP__,& 'LA mn_IP /= X1 mn_IP') !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) & !$OMP DEFAULT(NONE) & !$OMP PRIVATE(iMode) & !$OMP SHARED(spos,X1_s,X1_ds,X1_base_in,X1_in) DO iMode=1,X1_base_in%f%modes X1_s( iMode) = X1_base_in%s%evalDOF_s(spos, 0,X1_in(:,iMode)) X1_ds(iMode) = X1_base_in%s%evalDOF_s(spos,DERIV_S,X1_in(:,iMode)) END DO !$OMP END PARALLEL DO !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) & !$OMP DEFAULT(NONE) & !$OMP PRIVATE(iMode) & !$OMP SHARED(spos,X2_s,X2_ds,X2_base_in,X2_in) DO iMode=1,X2_base_in%f%modes X2_s( iMode) = X2_base_in%s%evalDOF_s(spos, 0,X2_in(:,iMode)) X2_ds(iMode) = X2_base_in%s%evalDOF_s(spos,DERIV_S,X2_in(:,iMode)) END DO !$OMP END PARALLEL DO X1_s_IP = X1_base_in%f%evalDOF_IP( 0,X1_s ) dX1ds = X1_base_in%f%evalDOF_IP( 0,X1_ds) dX1dthet = X1_base_in%f%evalDOF_IP(DERIV_THET,X1_s ) dX1dzeta = X1_base_in%f%evalDOF_IP(DERIV_ZETA,X1_s ) X2_s_IP = X2_base_in%f%evalDOF_IP( 0,X2_s ) dX2ds = X2_base_in%f%evalDOF_IP( 0,X2_ds) dX2dthet = X2_base_in%f%evalDOF_IP(DERIV_THET,X2_s ) dX2dzeta = X2_base_in%f%evalDOF_IP(DERIV_ZETA,X2_s ) !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) & !$OMP DEFAULT(NONE) & !$OMP PRIVATE(i_mn) & !$OMP SHARED(mn_IP,X1_s_IP,X2_s_IP,dX1ds,dX2ds,dX1dthet,dX2dthet,detJ,hmap_in,hmap_xv) DO i_mn=1,mn_IP detJ(i_mn)= (dX1ds(i_mn)*dX2dthet(i_mn)-dX1dthet(i_mn)*dX2ds(i_mn)) & *hmap_in%eval_Jh_aux(X1_s_IP(i_mn),X2_s_IP(i_mn),hmap_xv(i_mn)) !J_p*J_h END DO !i_mn !$OMP END PARALLEL DO minJ=MINVAL(detJ) IF(minJ.LT.1.0e-12) THEN n_warnings_occured=n_warnings_occured+1 i_mn= MINLOC(detJ(:),1) WRITE(UNIT_stdOut,'(4X,A8,I8,4(A,E11.3))')'WARNING ',n_warnings_occured, & ' : min(J)= ',MINVAL(detJ),' at s= ',spos, & ' theta= ',X1_base_in%f%x_IP(1,i_mn), & ' zeta= ',X1_base_in%f%x_IP(2,i_mn) i_mn= MAXLOC(detJ(:),1) WRITE(UNIT_stdOut,'(4X,16X,4(A,E11.3))')' ...max(J)= ',MAXVAL(detJ),' at s= ',spos, & ' theta= ',X1_base_in%f%x_IP(1,i_mn), & ' zeta= ',X1_base_in%f%x_IP(2,i_mn) ! CALL abort(__STAMP__, & ! 'Lambda_solve: Jacobian smaller that 1.0e-12!!!' ) END IF !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) & !$OMP DEFAULT(NONE) & !$OMP PRIVATE(i_mn) & !$OMP SHARED(mn_IP,gam_tt,gam_tz,gam_zz,detJ,hmap_in,hmap_xv,X1_s_IP,X2_s_IP,dX1dthet,dX2dthet,dX1dzeta,dX2dzeta) DO i_mn=1,mn_IP gam_tt(i_mn) = hmap_in%eval_gij_aux(dX1dthet(i_mn),dX2dthet(i_mn),0.0_wp, & X1_s_IP(i_mn), X2_s_IP(i_mn), & dX1dthet(i_mn),dX2dthet(i_mn),0.0_wp, & hmap_xv(i_mn)) / detJ(i_mn) gam_tz(i_mn) = hmap_in%eval_gij_aux(dX1dthet(i_mn),dX2dthet(i_mn),0.0_wp, & X1_s_IP(i_mn), X2_s_IP(i_mn), & dX1dzeta(i_mn),dX2dzeta(i_mn),1.0_wp, & hmap_xv(i_mn)) / detJ(i_mn) gam_zz(i_mn) = hmap_in%eval_gij_aux(dX1dzeta(i_mn),dX2dzeta(i_mn),1.0_wp, & X1_s_IP(i_mn), X2_s_IP(i_mn), & dX1dzeta(i_mn),dX2dzeta(i_mn),1.0_wp, & hmap_xv(i_mn)) / detJ(i_mn) END DO !i_mn !$OMP END PARALLEL DO CALL lambda_setup_and_solve(LA_fbase_in,phiPrime_s,ChiPrime_s,gam_tt,gam_tz,gam_zz,LA_s) __PERFOFF('lambda_solve') END SUBROUTINE Lambda_solve