389 real(wp) :: rhoe, dyne, rhos
390 real(wp) :: rho,
rm, m1, m2,
mct
393# 65 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
394 real(wp),
dimension(num_fluids) :: p_infpt, sk, hk, gk, ek, rhok
395# 67 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
398 integer :: i,
j,
k,
l
410# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
412# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
413#if defined(MFC_OpenACC)
414# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
416# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
417#elif defined(MFC_OpenMP)
418# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
420# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
422# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
424# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
426# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
428# 80 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
430# 82 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
434 rho = 0.0_wp; tvf = 0.0_wp
436# 86 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
437#if defined(MFC_OpenACC)
438# 86 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
440# 86 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
441#elif defined(MFC_OpenMP)
442# 86 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
444# 86 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
448 rho = rho +
q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(
j,
k,
l)
451 tvf = tvf +
q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(
j,
k,
l)
470# 110 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
471#if defined(MFC_OpenACC)
472# 110 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
474# 110 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
475#elif defined(MFC_OpenMP)
476# 110 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
478# 110 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
480 do i = eqn_idx%mom%beg, eqn_idx%mom%end
494 if ((relax_model == 6) .and. ((
q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(
j,
k, &
512# 142 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
513#if defined(MFC_OpenACC)
514# 142 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
516# 142 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
517#elif defined(MFC_OpenMP)
518# 142 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
520# 142 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
524 sk(i) = cvs(i)*log((ts**isentrope_n(i))/((ps + isentrope_b(i))**(isentrope_n(i) - 1.0_wp))) + qvps(i)
527 hk(i) = isentrope_n(i)*cvs(i)*ts + qvs(i)
530 gk(i) = hk(i) - ts*sk(i)
533 rhok(i) =
f_sg_thermal(ps, ts, isentrope_n(i), isentrope_b(i), cvs(i))
536 ek(i) = (ps + isentrope_n(i)*isentrope_b(i))/(ps + isentrope_b(i))*cvs(i)*ts + qvs(i)
542# 162 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
543#if defined(MFC_OpenACC)
544# 162 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
546# 162 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
547#elif defined(MFC_OpenMP)
548# 162 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
550# 162 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
563 rhos = rhos +
q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(
j,
k,
l)*sk(i)
569# 179 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
570#if defined(MFC_OpenACC)
571# 179 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
573# 179 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
574#elif defined(MFC_OpenMP)
575# 179 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
577# 179 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
579# 179 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
589# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
591# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
593# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
595# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
597# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
599# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
601# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
603# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
605# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
607# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
609# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
611# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
613# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
615# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
617# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
619# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
621# 187 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
625 integer,
intent(in) :: j, k, l, MFL
626 real(wp),
intent(out) :: pS
627 real(wp),
dimension(1:),
intent(out) :: p_infpT
628 type(
scalar_field),
dimension(sys_size),
intent(in) :: q_cons_vf
629 real(wp),
intent(in) :: rhoe
630 real(wp),
intent(out) :: TS
631 real(wp) :: gp, gpp, hp, pO, mCP, mQ
632 real(wp) :: p_infpT_sum
635 mcp = 0.0_wp; mq = 0.0_wp; p_infpt_sum = 0._wp
637# 201 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
638#if defined(MFC_OpenACC)
639# 201 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
641# 201 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
642#elif defined(MFC_OpenMP)
643# 201 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
645# 201 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
648 p_infpt(i) = isentrope_b(i)
649 p_infpt_sum = p_infpt_sum + abs(p_infpt(i))
653# 207 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
654#if defined(MFC_OpenACC)
655# 207 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
657# 207 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
658#elif defined(MFC_OpenMP)
659# 207 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
661# 207 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
665 mcp = mcp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*isentrope_n(i)
668 mq = mq + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
671# 224 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
674 if ((rhoe - mq - minval(p_infpt)) < 0.0_wp)
then
675 if ((mfl == 0) .or. (mfl == 1))
then
699 do while ((abs(ps - po) > palpha_eps) .and. (abs(ps - po) > (palpha_eps/1.e4_wp)*abs(po)) .or. (ns == 0))
709 gpp = 0.0_wp; gp = 0.0_wp; hp = 0.0_wp
711# 262 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
712#if defined(MFC_OpenACC)
713# 262 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
715# 262 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
716#elif defined(MFC_OpenMP)
717# 262 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
719# 262 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
722 gp = gp + (isentrope_n(i) - 1.0_wp)*q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
723 & l)*cvs(i)*(rhoe + ps - mq)/(mcp*(ps + p_infpt(i)))
725 gpp = gpp + (isentrope_n(i) - 1.0_wp)*q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
726 & l)*cvs(i)*(p_infpt(i) - rhoe + mq)/(mcp*(ps + p_infpt(i))**2)
729 hp = 1.0_wp/(rhoe + ps - mq) + 1.0_wp/(ps + minval(p_infpt))
732 ps = po + ((1.0_wp - gp)/gpp)/(1.0_wp - (1.0_wp - gp + abs(1.0_wp - gp))/(2.0_wp*gpp)*hp)
736 ts = (rhoe + ps - mq)/mcp
743 subroutine s_compute_ptg_residual(ml, mT, pS, j, k, l, q_cons_vf, rhoe, R2D, TS, mCP, mQ, mCVGP, mCVGP2, mCPD)
746# 287 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
748# 287 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
750# 287 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
752# 287 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
754# 287 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
756# 287 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
758# 287 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
761 real(wp),
intent(in) :: ml, mT, pS, rhoe
762 integer,
intent(in) :: j, k, l
763 type(
scalar_field),
dimension(sys_size),
intent(in) :: q_cons_vf
764 real(wp),
dimension(2),
intent(out) :: R2D
765 real(wp),
intent(out) :: TS, mCP, mQ, mCVGP, mCVGP2, mCPD
770 mcp = ml*cvs(
lp)*isentrope_n(
lp) + (mt - ml)*cvs(
vp)*isentrope_n(
vp)
771 mq = ml*qvs(
lp) + (mt - ml)*qvs(
vp)
772 mcvgp = 0.0_wp; mcvgp2 = 0.0_wp; mcpd = 0.0_wp; mqd = 0.0_wp
774# 301 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
775#if defined(MFC_OpenACC)
776# 301 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
778# 301 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
779#elif defined(MFC_OpenMP)
780# 301 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
782# 301 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
785 if ((i /=
lp) .and. (i /=
vp))
then
786 mcp = mcp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*isentrope_n(i)
787 mq = mq + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
788 mcvgp = mcvgp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*(isentrope_n(i) - 1)/(ps + isentrope_b(i))
789 mcvgp2 = mcvgp2 + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
790 & l)*cvs(i)*(isentrope_n(i) - 1)/((ps + isentrope_b(i))**2)
791 mqd = mqd + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
792 mcpd = mcpd + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*isentrope_n(i)
796 ts = 1.0_wp/(mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps &
797 & + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) + mcvgp)
800 r2d(1) = ts*((cvs(
lp)*isentrope_n(
lp) - cvs(
vp)*isentrope_n(
vp))*(1 - log(ts)) - (qvps(
lp) - qvps(
vp)) + cvs(
lp) &
801 & *(isentrope_n(
lp) - 1)*log(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)*log(ps + isentrope_b(
vp))) &
802 & + qvs(
lp) - qvs(
vp)
805 r2d(2) = rhoe + ps + ml*(qvs(
vp) - qvs(
lp)) - mt*qvs(
vp) - mqd + (ml*(isentrope_n(
vp)*cvs(
vp) - isentrope_n(
lp)*cvs(
lp)) &
806 & - mt*isentrope_n(
vp)*cvs(
vp) - mcpd)/(ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp) &
807 & *(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + mcvgp)
819# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
821# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
823# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
825# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
827# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
829# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
831# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
833# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
835# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
837# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
839# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
841# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
843# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
845# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
847# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
849# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
851# 336 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
854 integer,
intent(in) :: j, k, l
855 real(wp),
intent(inout) :: pS
856 real(wp),
intent(in) :: rhoe
857 type(
scalar_field),
dimension(sys_size),
intent(inout) :: q_cons_vf
858 real(wp),
intent(inout) :: TS
859 real(wp),
dimension(2, 2) :: Jac, InvJac
860 real(wp),
dimension(2) :: R2D, R2D_try, DeltamP
861 real(wp) :: mCP, mCPD, mCVGP, mCVGP2, mQ
862 real(wp) :: ml, ml_try, mT, pS_try, pmin, lambda, resnorm, resnorm_try
863 real(wp) :: dFdT, dTdm, dTdp, detJ
867 mt = q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + q_cons_vf(
vp + eqn_idx%cont%beg - 1)%sf(j, k, l)
868 ml = q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(j, k, l)
871 if (((ps < 0.0_wp) .and. ((q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + q_cons_vf(
vp + eqn_idx%cont%beg - 1)%sf(j, &
873 & l)) > ((rhoe - isentrope_n(
lp)*isentrope_b(
lp)/(isentrope_n(
lp) - 1))/qvs(
lp)))) .or. ((ps >= 0.0_wp) &
874 & .and. (ps < 1.0e-1_wp)))
then
879 pmin = -min(isentrope_b(
lp), isentrope_b(
vp)) + 1.0_wp
881 call s_compute_ptg_residual(ml, mt, ps, j, k, l, q_cons_vf, rhoe, r2d, ts, mcp, mq, mcvgp, mcvgp2, mcpd)
882 resnorm = sqrt(r2d(1)**2 + r2d(2)**2)
886 if ((resnorm <= ptgalpha_eps) .or. (resnorm <= (ptgalpha_eps/1.e6_wp)*rhoe))
exit
889 dfdt = -(cvs(
lp)*isentrope_n(
lp) - cvs(
vp)*isentrope_n(
vp))*log(ts) - (qvps(
lp) - qvps(
vp)) + cvs(
lp)*(isentrope_n(
lp) &
890 & - 1)*log(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)*log(ps + isentrope_b(
vp))
891 dtdm = -(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) &
893 dtdp = (mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))**2 + ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps &
894 & + isentrope_b(
lp))**2 - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))**2) + mcvgp2)*ts**2
896 jac(1, 1) = dfdt*dtdm
898 & 2) = dfdt*dtdp + ts*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps &
899 & + isentrope_b(
vp)))
901 & 1) = qvs(
vp) - qvs(
lp) + (cvs(
vp)*isentrope_n(
vp) - cvs(
lp)*isentrope_n(
lp))/(ml*(cvs(
lp)*(isentrope_n(
lp) - 1) &
902 & /(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) + mt*cvs(
vp)*(isentrope_n(
vp) &
903 & - 1)/(ps + isentrope_b(
vp)) + mcvgp) - (ml*(cvs(
vp)*isentrope_n(
vp) - cvs(
lp)*isentrope_n(
lp)) - mt*cvs(
vp) &
904 & *isentrope_n(
vp) - mcpd)*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1) &
905 & /(ps + isentrope_b(
vp)))/((ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) &
906 & - 1)/(ps + isentrope_b(
vp))) + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + mcvgp)**2)
908 & 2) = 1 + (ml*(cvs(
vp)*isentrope_n(
vp) - cvs(
lp)*isentrope_n(
lp)) - mt*cvs(
vp)*isentrope_n(
vp) - mcpd) &
909 & *(ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp))**2 - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps &
910 & + isentrope_b(
vp))**2) + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))**2 + mcvgp2)/(ml*(cvs(
lp) &
911 & *(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) &
912 & + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + mcvgp)**2
914 detj = jac(1, 1)*jac(2, 2) - jac(1, 2)*jac(2, 1)
916 if (detj == 0.0_wp)
exit
918 invjac(1, 1) = jac(2, 2)/detj
919 invjac(1, 2) = -jac(1, 2)/detj
920 invjac(2, 1) = -jac(2, 1)/detj
921 invjac(2, 2) = jac(1, 1)/detj
923 deltamp(1) = -(invjac(1, 1)*r2d(1) + invjac(1, 2)*r2d(2))
924 deltamp(2) = -(invjac(2, 1)*r2d(1) + invjac(2, 2)*r2d(2))
930 ml_try = min(max(ml + lambda*deltamp(1), 0.0_wp), mt)
931 ps_try = max(ps + lambda*deltamp(2), pmin)
932 call s_compute_ptg_residual(ml_try, mt, ps_try, j, k, l, q_cons_vf, rhoe, r2d_try, ts, mcp, mq, mcvgp, mcvgp2, mcpd)
933 resnorm_try = sqrt(r2d_try(1)**2 + r2d_try(2)**2)
934 if ((resnorm_try < resnorm) .or. (ls ==
ptg_ls_max))
exit
935 lambda = 0.5_wp*lambda
939 ml = ml_try; ps = ps_try; r2d = r2d_try; resnorm = resnorm_try
943 q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = ml
944 q_cons_vf(
vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mt - ml
946 ts = (rhoe + ps - mq)/mcp