Evaluate auxiliary variables at input state, writes onto module variables!!!
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_sol_var_MHD3D), | intent(in) | :: | dofs_in |
input solution |
||
| integer, | intent(inout) | :: | JacCheck |
if 1 on input: abort if detJ<0. if 2 on input, no abort, unchanged if detJ>0 ,return -1 if detJ<=0 |
SUBROUTINE EvalAux(dofs_in,JacCheck) ! MODULES USE MODgvec_MPI , ONLY: par_AllReduce USE MODgvec_Globals , ONLY: n_warnings_occured,myRank USE MODgvec_MHD3D_vars , ONLY: X1_base,X2_base,LA_base,hmap,hmap_auxvar USE MODgvec_sol_var_MHD3D , ONLY: t_sol_var_MHD3D IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES CLASS(t_sol_var_MHD3D), INTENT(IN ) :: dofs_in !! input solution INTEGER , INTENT(INOUT) :: JacCheck !! if 1 on input: abort if detJ<0. !! if 2 on input, no abort, unchanged if detJ>0 ,return -1 if detJ<=0 !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iGP,i_mn,IP_GP(2) REAL(wp) :: min_detJ !=================================================================================================================================== IF(JacCheck.EQ.-1) THEN CALL abort(__STAMP__, & 'You already called EvalAux, with a Jacobian smaller that 1.0e-12!!!' ) END IF __PERFON('EvalAux') __PERFON('EvalDOF_1') !2D data: interpolation points x gauss-points !CALL X1_base%evalDOF((/0,0/) ,Uin%X1,X1_IP_GP ) !CALL X1_base%evalDOF((/0,DERIV_THET/),Uin%X1,dX1_dthet ) !CALL X1_base%evalDOF((/0,DERIV_ZETA/),Uin%X1,dX1_dzeta) CALL X1_base%evalDOF_all(dofs_in%X1, y_IP_GP=X1_IP_GP, & dy_dthet_IP_GP=dX1_dthet, & dy_dzeta_IP_GP=dX1_dzeta ) CALL X1_base%evalDOF((/DERIV_S,0/) , dofs_in%X1, dX1_ds ) !CALL X2_base%evalDOF((/0,0/) ,Uin%X2,X2_IP_GP ) !CALL X2_base%evalDOF((/0,DERIV_THET/),Uin%X2,dX2_dthet ) !CALL X2_base%evalDOF((/0,DERIV_ZETA/),Uin%X2,dX2_dzeta ) CALL X2_base%evalDOF_all(dofs_in%X2, y_IP_GP=X2_IP_GP, & dy_dthet_IP_GP=dX2_dthet, & dy_dzeta_IP_GP=dX2_dzeta ) CALL X2_base%evalDOF((/DERIV_S,0/) , dofs_in%X2, dX2_ds ) __PERFOFF('EvalDOF_1') __PERFON('eval_hmap') CALL hmap%eval_all((/X1_base%f%mn_nyq(1),X1_base%f%mn_nyq(2),nGP_end-nGP_str+1/),2,hmap_auxvar, & X1_IP_GP,X2_IP_GP,dX1_dthet,dX2_dthet,dX1_dzeta,dX2_dzeta, & J_h, g_tt, g_tz,g_zz, & Jh_dq1,gtt_dq1,gtz_dq1,gzz_dq1, & Jh_dq2,gtt_dq2,gtz_dq2,gzz_dq2, & g_t1,g_t2,g_z1,g_z2,Gh11,Gh22) __PERFOFF('eval_hmap') __PERFON('loop_1') min_detJ =HUGE(1.0_wp) !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) & !$OMP PRIVATE(iGP,i_mn) & !$OMP REDUCTION(min:min_detJ) & !$OMP SHARED(nGP_str,nGP_end,mn_IP,J_p,J_h,detJ,dX1_ds,dX2_dthet,dX2_ds,dX1_dthet) DO iGP=nGP_str,nGP_end DO i_mn=1,mn_IP J_p( i_mn,iGP) = ( dX1_ds(i_mn,iGP)*dX2_dthet(i_mn,iGP) & -dX2_ds(i_mn,iGP)*dX1_dthet(i_mn,iGP) ) detJ(i_mn,iGP) = J_p(i_mn,iGP)*J_h(i_mn,iGP) min_detJ = MIN(min_detJ,detJ(i_mn,iGP)) END DO !i_mn END DO !iGP !$OMP END PARALLEL DO __PERFOFF('loop_1') !check Jacobian IF(min_detJ .LT.1.0e-12_wp) THEN SELECT CASE(JacCheck) CASE(1) n_warnings_occured=n_warnings_occured+1 IP_GP= MINLOC(detJ(:,nGP_str:nGP_end)) WRITE(UNIT_stdOut,'(4X,A8,I8,4(A,E11.3))')'WARNING ',n_warnings_occured, & & ' : min(J)= ',MINVAL(detJ(:,nGP_str:nGP_end)),' at s= ',s_GP(IP_GP(2)), & & ' theta= ',X1_base%f%x_IP(1,IP_GP(1)), & & ' zeta= ',X1_base%f%x_IP(2,IP_GP(1)) IP_GP= MAXLOC(detJ(:,:)) WRITE(UNIT_stdOut,'(4X,16X,4(A,E11.3))')' ...max(J)= ',MAXVAL(detJ(:,nGP_str:nGP_end)),' at s= ',s_GP(IP_GP(2)), & & ' theta= ',X1_base%f%x_IP(1,IP_GP(1)), & & ' zeta= ',X1_base%f%x_IP(2,IP_GP(1)) CALL abort(__STAMP__, & 'EvalAux: Jacobian smaller that 1.0e-12 !!!', IntInfo=myRank ) CASE(2) !quiet check, give back JacCheck=-1 END SELECT ELSE JacCheck=1 !set to default for safety (abort if detJ<0) END IF CALL par_AllReduce(JacCheck,'MIN') IF(JacCheck.EQ.-1) THEN __PERFOFF('EvalAux') RETURN END IF __PERFON('EvalDOF_2') !2D data: interpolation points x gauss-points !CALL LA_base%evalDOF((/0,DERIV_THET/),Uin%LA,dLA_dthet) !CALL LA_base%evalDOF((/0,DERIV_ZETA/),Uin%LA,dLA_dzeta) CALL LA_base%evalDOF_all(dofs_in%LA, dy_dthet_IP_GP=dLA_dthet, & dy_dzeta_IP_GP=dLA_dzeta ) __PERFOFF('EvalDOF_2') __PERFON('loop_2') !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) & !$OMP PRIVATE(iGP,i_mn) & !$OMP SHARED(nGP_str,nGP_end,mn_IP,b_thet,b_zeta,sJ_p,sJ_h,sdetJ,sJ_bcov_thet,sJ_bcov_zeta,bbcov_sJ, & !$OMP J_p,J_h,chiPrime_GP,phiPrime_GP,dLA_dzeta,dLA_dthet,g_tt,g_tz,g_zz) DO iGP=nGP_str,nGP_end DO i_mn=1,mn_IP b_thet(i_mn,iGP) = (chiPrime_GP(iGP)- phiPrime_GP(iGP)*dLA_dzeta(i_mn,iGP)) !b_theta b_zeta(i_mn,iGP) = phiPrime_GP(iGP)*(1.0_wp + dLA_dthet(i_mn,iGP)) !b_zeta sJ_p(i_mn,iGP) = 1.0_wp/J_p(i_mn,iGP) sJ_h(i_mn,iGP) = 1.0_wp/J_h(i_mn,iGP) sdetJ(i_mn,iGP) = sJ_p(i_mn,iGP)* sJ_h(i_mn,iGP) sJ_bcov_thet(i_mn,iGP) = (g_tt(i_mn,iGP)*b_thet(i_mn,iGP) + g_tz(i_mn,iGP)*b_zeta(i_mn,iGP))*sdetJ(i_mn,iGP) sJ_bcov_zeta(i_mn,iGP) = (g_tz(i_mn,iGP)*b_thet(i_mn,iGP) + g_zz(i_mn,iGP)*b_zeta(i_mn,iGP))*sdetJ(i_mn,iGP) bbcov_sJ( i_mn,iGP) = b_thet( i_mn,iGP)*sJ_bcov_thet(i_mn,iGP) & +b_zeta( i_mn,iGP)*sJ_bcov_zeta(i_mn,iGP) END DO !i_mn END DO !iGP !$OMP END PARALLEL DO __PERFOFF('loop_2') __PERFOFF('EvalAux') END SUBROUTINE EvalAux