Evaluate 3D MHD energy NOTE: set callEvalaux >0 if not called before for the same Uin !!
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_sol_var_MHD3D), | intent(in) | :: | Uin |
input solution |
||
| logical, | intent(in) | :: | callEvalAux |
set True if evalAux was not called on Uin |
||
| 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 |
total integral of MHD3D energy W_MHD3D= int ( p/(gamma-1) + 1/(2mu_0) |B|^2) detJ ds dtheta dzeta
FUNCTION EvalEnergy(Uin,callEvalAux,JacCheck) RESULT(W_MHD3D) ! MODULES USE MODgvec_MPI , ONLY: par_AllReduce USE MODgvec_MHD3D_Vars , ONLY: mu_0,sgammM1 USE MODgvec_sol_var_MHD3D, ONLY:t_sol_var_MHD3D IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES CLASS(t_sol_var_MHD3D), INTENT(IN ) :: Uin !! input solution LOGICAL , INTENT(IN ) :: callEvalAux !! set True if evalAux was not called on Uin 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 REAL(wp) :: W_MHD3D !! total integral of MHD3D energy !! W_MHD3D= int ( p/(gamma-1) + 1/(2mu_0) |B|^2) detJ ds dtheta dzeta !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iGP,i_mn REAL(wp) :: Wmag_GP !! magnetic energy at gauss points !! = 1/(dtheta*dzeta) * ( int [1/detJ * b_alpha*g_{alpha,beta}*b_beta]_iGP dtheta dzeta ) REAL(wp) :: Vprime_GP !! = 1/(dtheta*dzeta) *( int detJ|_iGP ,dtheta dzeta) REAL(wp) :: Wmag,Wpres !=================================================================================================================================== !WRITE(UNIT_stdOut,'(4X,A,I4)')'COMPUTE ENERGY... on rank:',myRank __PERFON('EvalEnergy') IF(callEvalAux) THEN CALL EvalAux(Uin,JacCheck) IF(JacCheck.EQ.-1) THEN W_MHD3D=1.0e30_wp WRITE(UNIT_stdOut,'(A)')'... detJ<0 in EvalAux ' __PERFOFF('EvalEnergy') RETURN !accept detJ<0 END IF ELSE IF(JacCheck.EQ.-1) THEN CALL abort(__STAMP__, & 'You seem to have called EvalAux before, with a Jacobian smaller that 1.0e-12!!!' ) END IF END IF Wmag = 0.0_wp Wpres= 0.0_wp !$OMP PARALLEL DO & !$OMP SCHEDULE(STATIC) DEFAULT(NONE) & !$OMP PRIVATE(iGP,i_mn,Wmag_GP,Vprime_GP) & !$OMP REDUCTION(+:Wmag,Wpres) & !$OMP SHARED(nGP_str,nGP_end,mn_IP,bbcov_sJ,detJ,pres_GP,w_GP) DO iGP=nGP_str,nGP_end Wmag_GP=0.0_wp !$OMP SIMD REDUCTION(+:Wmag_GP) DO i_mn=1,mn_IP Wmag_GP = Wmag_GP+ bbcov_sJ(i_mn,iGP) END DO Vprime_GP = 0.0_wp !$OMP SIMD REDUCTION(+:Vprime_GP) DO i_mn=1,mn_IP Vprime_GP = Vprime_GP+ detJ(i_mn,iGP) END DO Wmag = Wmag + Wmag_GP*w_GP(iGP) Wpres = Wpres + Vprime_GP*pres_GP(iGP)*w_GP(iGP) END DO !iGP !$OMP END PARALLEL DO W_MHD3D= dthet_dzeta* ( 0.5_wp *Wmag + mu_0*sgammM1*Wpres) __PERFON('reduce_W_MHD3D') CALL par_AllReduce(W_MHD3D,'SUM') __PERFOFF('reduce_W_MHD3D') __PERFOFF('EvalEnergy') ! SWRITE(UNIT_stdOut,'(A,E21.11)')'... DONE: ',W_MHD3D END FUNCTION EvalEnergy