Evaluate auxiliary variables at input state, writes onto module variables!!! This includes the check of the Jacobian, which is crucial for the validity of the computations. only a positive Jacobian is accepted.
| 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<1e-12max|detJ|. if 2 on input, no abort, unchanged if min(detJ)>=1e-12max|detJ|, else return -3 negative Jacobian everywhere (left-handed coordinates), -2 relative Jacobian too small, -1 Jacobian with sign change. |
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<1e-12*max|detJ|. !! if 2 on input, no abort, unchanged if min(detJ)>=1e-12*max|detJ|, else return !! -3 negative Jacobian everywhere (left-handed coordinates), !! -2 relative Jacobian too small, !! -1 Jacobian with sign change. !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iGP,i_mn,IP_GP(2),JacError REAL(wp) :: min_detJ,max_detJ,min_abs_detJ,max_abs_detJ !=================================================================================================================================== IF(JacCheck.LE.-1) THEN CALL abort(__STAMP__, & 'You already called EvalAux, with a bad Jacobian, detJ < 1e-12*max|detJ|!!!', IntInfo=JacCheck ) 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) max_detJ =-HUGE(1.0_wp) !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) & !$OMP PRIVATE(iGP,i_mn) & !$OMP REDUCTION(min:min_detJ) & !$OMP REDUCTION(max:max_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)) max_detJ = MAX(max_detJ,detJ(i_mn,iGP)) END DO !i_mn END DO !iGP !$OMP END PARALLEL DO __PERFOFF('loop_1') CALL par_AllReduce(min_detJ,'MIN') CALL par_AllReduce(max_detJ,'MAX') !max|detJ| = max(|min(detJ)|,|max(detJ)|) max_abs_detJ = MAX(ABS(min_detJ),ABS(max_detJ)) !check relative Jacobian J/max|J| JacError=0 IF(min_detJ .LT.1.0e-12_wp*max_abs_detJ) THEN !detJ < 1e-12*max|detJ| IF(max_detJ .LT. -1.0e-12_wp*max_abs_detJ) THEN JacError=-3 ! all detJ is negative, left-handed coordinates found (max(detJ) < -1e-12*max|detJ|) ELSEIF(MIN(ABS(min_detJ),ABS(max_detJ)) .LE. 1.0e-12_wp*max_abs_detJ) THEN JacError=-2 ! relative Jacobian too small ( |min(detJ)|<= 1e-12*max|detJ| or |max(detJ)|<= 1e-12*max|detJ| ) ELSE JacError=-1 ! negative Jacobian found with sign change (min(detJ) < -1e-12*max|detJ| and max(detJ) > 1e-12*max|detJ| ) END IF END IF IF(JacError.NE.0) 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)) SELECT CASE(JacError) CASE(-3) CALL abort(__STAMP__, & 'EvalAux: negative Jacobian found everywhere (max(detJ) < -1e-12*max|detJ|). Left-handed coordinates cannot be used!!!', IntInfo=myRank ) CASE(-2) CALL abort(__STAMP__, & 'EvalAux: relative Jacobian too small (|min(detJ)| <= 1e-12*max|detJ| or |max(detJ)|<= 1e-12*max|detJ|). !!!', IntInfo=myRank ) CASE(-1) CALL abort(__STAMP__, & 'EvalAux: negative Jacobian found with sign change (min(detJ) < -1e-12*max|detJ| and max(detJ) > 1e-12*max|detJ| )!!!', IntInfo=myRank ) END SELECT CASE(2) !quiet check, give back JacCheck=JacError END SELECT ELSE JacCheck=1 !set to default for safety (abort if detJ<0) END IF IF(JacCheck.LE.-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