402 real(wp) :: rhoe, dyne, rhos
403 real(wp) :: rho,
rm, m1, m2,
mct
406# 66 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
407 real(wp),
dimension(num_fluids) :: p_infpt, sk, hk, gk, ek, rhok
408# 68 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
411 integer :: i,
j,
k,
l
423# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
425# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
426#if defined(MFC_OpenACC)
427# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
429# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
430#elif defined(MFC_OpenMP)
431# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
433# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
435# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
437# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
439# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
441# 81 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
443# 83 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
447 rho = 0.0_wp; tvf = 0.0_wp
449# 87 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
450#if defined(MFC_OpenACC)
451# 87 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
453# 87 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
454#elif defined(MFC_OpenMP)
455# 87 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
457# 87 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
461 rho = rho +
q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(
j,
k,
l)
464 tvf = tvf +
q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(
j,
k,
l)
483# 111 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
484#if defined(MFC_OpenACC)
485# 111 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
487# 111 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
488#elif defined(MFC_OpenMP)
489# 111 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
491# 111 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
493 do i = eqn_idx%mom%beg, eqn_idx%mom%end
507 if ((relax_model == 6) .and. ((
q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(
j,
k, &
525# 143 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
526#if defined(MFC_OpenACC)
527# 143 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
529# 143 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
530#elif defined(MFC_OpenMP)
531# 143 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
533# 143 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
537 sk(i) = cvs(i)*log((ts**isentrope_n(i))/((ps + isentrope_b(i))**(isentrope_n(i) - 1.0_wp))) + qvps(i)
540 hk(i) = isentrope_n(i)*cvs(i)*ts + qvs(i)
543 gk(i) = hk(i) - ts*sk(i)
546 rhok(i) =
f_sg_thermal(ps, ts, isentrope_n(i), isentrope_b(i), cvs(i))
549 ek(i) = (ps + isentrope_n(i)*isentrope_b(i))/(ps + isentrope_b(i))*cvs(i)*ts + qvs(i)
555# 163 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
556#if defined(MFC_OpenACC)
557# 163 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
559# 163 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
560#elif defined(MFC_OpenMP)
561# 163 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
563# 163 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
576 rhos = rhos +
q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(
j,
k,
l)*sk(i)
582# 180 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
583#if defined(MFC_OpenACC)
584# 180 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
586# 180 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
587#elif defined(MFC_OpenMP)
588# 180 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
590# 180 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
592# 180 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
602# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
604# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
606# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
608# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
610# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
612# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
614# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
616# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
618# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
620# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
622# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
624# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
626# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
628# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
630# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
632# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
634# 188 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
638 integer,
intent(in) :: j, k, l, MFL
639 real(wp),
intent(out) :: pS
640 real(wp),
dimension(1:),
intent(out) :: p_infpT
641 type(
scalar_field),
dimension(sys_size),
intent(in) :: q_cons_vf
642 real(wp),
intent(in) :: rhoe
643 real(wp),
intent(out) :: TS
644 real(wp) :: gp, gpp, hp, pO, mCP, mQ
645 real(wp) :: p_infpT_sum
648 mcp = 0.0_wp; mq = 0.0_wp; p_infpt_sum = 0._wp
650# 202 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
651#if defined(MFC_OpenACC)
652# 202 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
654# 202 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
655#elif defined(MFC_OpenMP)
656# 202 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
658# 202 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
661 p_infpt(i) = isentrope_b(i)
662 p_infpt_sum = p_infpt_sum + abs(p_infpt(i))
666# 208 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
667#if defined(MFC_OpenACC)
668# 208 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
670# 208 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
671#elif defined(MFC_OpenMP)
672# 208 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
674# 208 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
678 mcp = mcp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*isentrope_n(i)
681 mq = mq + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
684# 225 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
687 if ((rhoe - mq - minval(p_infpt)) < 0.0_wp)
then
688 if ((mfl == 0) .or. (mfl == 1))
then
712 do while ((abs(ps - po) > palpha_eps) .and. (abs(ps - po) > (palpha_eps/1.e4_wp)*abs(po)) .or. (ns == 0))
722 gpp = 0.0_wp; gp = 0.0_wp; hp = 0.0_wp
724# 263 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
725#if defined(MFC_OpenACC)
726# 263 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
728# 263 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
729#elif defined(MFC_OpenMP)
730# 263 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
732# 263 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
735 gp = gp + (isentrope_n(i) - 1.0_wp)*q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
736 & l)*cvs(i)*(rhoe + ps - mq)/(mcp*(ps + p_infpt(i)))
738 gpp = gpp + (isentrope_n(i) - 1.0_wp)*q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
739 & l)*cvs(i)*(p_infpt(i) - rhoe + mq)/(mcp*(ps + p_infpt(i))**2)
742 hp = 1.0_wp/(rhoe + ps - mq) + 1.0_wp/(ps + minval(p_infpt))
745 ps = po + ((1.0_wp - gp)/gpp)/(1.0_wp - (1.0_wp - gp + abs(1.0_wp - gp))/(2.0_wp*gpp)*hp)
749 ts = (rhoe + ps - mq)/mcp
756 subroutine s_compute_ptg_residual(ml, mT, pS, j, k, l, q_cons_vf, rhoe, R2D, TS, mCP, mQ, mCVGP, mCVGP2, mCPD)
759# 288 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
761# 288 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
763# 288 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
765# 288 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
767# 288 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
769# 288 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
771# 288 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
774 real(wp),
intent(in) :: ml, mT, pS, rhoe
775 integer,
intent(in) :: j, k, l
776 type(
scalar_field),
dimension(sys_size),
intent(in) :: q_cons_vf
777 real(wp),
dimension(2),
intent(out) :: R2D
778 real(wp),
intent(out) :: TS, mCP, mQ, mCVGP, mCVGP2, mCPD
783 mcp = ml*cvs(
lp)*isentrope_n(
lp) + (mt - ml)*cvs(
vp)*isentrope_n(
vp)
784 mq = ml*qvs(
lp) + (mt - ml)*qvs(
vp)
785 mcvgp = 0.0_wp; mcvgp2 = 0.0_wp; mcpd = 0.0_wp; mqd = 0.0_wp
787# 302 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
788#if defined(MFC_OpenACC)
789# 302 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
791# 302 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
792#elif defined(MFC_OpenMP)
793# 302 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
795# 302 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
798 if ((i /=
lp) .and. (i /=
vp))
then
799 mcp = mcp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*isentrope_n(i)
800 mq = mq + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
801 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))
802 mcvgp2 = mcvgp2 + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
803 & l)*cvs(i)*(isentrope_n(i) - 1)/((ps + isentrope_b(i))**2)
804 mqd = mqd + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
805 mcpd = mcpd + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*isentrope_n(i)
809 ts = 1.0_wp/(mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps &
810 & + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) + mcvgp)
813 r2d(1) = ts*((cvs(
lp)*isentrope_n(
lp) - cvs(
vp)*isentrope_n(
vp))*(1 - log(ts)) - (qvps(
lp) - qvps(
vp)) + cvs(
lp) &
814 & *(isentrope_n(
lp) - 1)*log(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)*log(ps + isentrope_b(
vp))) &
815 & + qvs(
lp) - qvs(
vp)
818 r2d(2) = rhoe + ps + ml*(qvs(
vp) - qvs(
lp)) - mt*qvs(
vp) - mqd + (ml*(isentrope_n(
vp)*cvs(
vp) - isentrope_n(
lp)*cvs(
lp)) &
819 & - mt*isentrope_n(
vp)*cvs(
vp) - mcpd)/(ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp) &
820 & *(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + mcvgp)
832# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
834# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
836# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
838# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
840# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
842# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
844# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
846# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
848# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
850# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
852# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
854# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
856# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
858# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
860# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
862# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
864# 337 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
867 integer,
intent(in) :: j, k, l
868 real(wp),
intent(inout) :: pS
869 real(wp),
intent(in) :: rhoe
870 type(
scalar_field),
dimension(sys_size),
intent(inout) :: q_cons_vf
871 real(wp),
intent(inout) :: TS
872 real(wp),
dimension(2, 2) :: Jac, InvJac
873 real(wp),
dimension(2) :: R2D, R2D_try, DeltamP
874 real(wp) :: mCP, mCPD, mCVGP, mCVGP2, mQ
875 real(wp) :: ml, ml_try, mT, pS_try, pmin, lambda, resnorm, resnorm_try
876 real(wp) :: dFdT, dTdm, dTdp, detJ
880 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)
881 ml = q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(j, k, l)
884 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, &
886 & l)) > ((rhoe - isentrope_n(
lp)*isentrope_b(
lp)/(isentrope_n(
lp) - 1))/qvs(
lp)))) .or. ((ps >= 0.0_wp) &
887 & .and. (ps < 1.0e-1_wp)))
then
892 pmin = -min(isentrope_b(
lp), isentrope_b(
vp)) + 1.0_wp
894 call s_compute_ptg_residual(ml, mt, ps, j, k, l, q_cons_vf, rhoe, r2d, ts, mcp, mq, mcvgp, mcvgp2, mcpd)
895 resnorm = sqrt(r2d(1)**2 + r2d(2)**2)
899 if ((resnorm <= ptgalpha_eps) .or. (resnorm <= (ptgalpha_eps/1.e6_wp)*rhoe))
exit
902 dfdt = -(cvs(
lp)*isentrope_n(
lp) - cvs(
vp)*isentrope_n(
vp))*log(ts) - (qvps(
lp) - qvps(
vp)) + cvs(
lp)*(isentrope_n(
lp) &
903 & - 1)*log(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)*log(ps + isentrope_b(
vp))
904 dtdm = -(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) &
906 dtdp = (mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))**2 + ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps &
907 & + isentrope_b(
lp))**2 - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))**2) + mcvgp2)*ts**2
909 jac(1, 1) = dfdt*dtdm
911 & 2) = dfdt*dtdp + ts*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps &
912 & + isentrope_b(
vp)))
914 & 1) = qvs(
vp) - qvs(
lp) + (cvs(
vp)*isentrope_n(
vp) - cvs(
lp)*isentrope_n(
lp))/(ml*(cvs(
lp)*(isentrope_n(
lp) - 1) &
915 & /(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) + mt*cvs(
vp)*(isentrope_n(
vp) &
916 & - 1)/(ps + isentrope_b(
vp)) + mcvgp) - (ml*(cvs(
vp)*isentrope_n(
vp) - cvs(
lp)*isentrope_n(
lp)) - mt*cvs(
vp) &
917 & *isentrope_n(
vp) - mcpd)*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1) &
918 & /(ps + isentrope_b(
vp)))/((ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) &
919 & - 1)/(ps + isentrope_b(
vp))) + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + mcvgp)**2)
921 & 2) = 1 + (ml*(cvs(
vp)*isentrope_n(
vp) - cvs(
lp)*isentrope_n(
lp)) - mt*cvs(
vp)*isentrope_n(
vp) - mcpd) &
922 & *(ml*(cvs(
lp)*(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp))**2 - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps &
923 & + isentrope_b(
vp))**2) + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))**2 + mcvgp2)/(ml*(cvs(
lp) &
924 & *(isentrope_n(
lp) - 1)/(ps + isentrope_b(
lp)) - cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp))) &
925 & + mt*cvs(
vp)*(isentrope_n(
vp) - 1)/(ps + isentrope_b(
vp)) + mcvgp)**2
927 detj = jac(1, 1)*jac(2, 2) - jac(1, 2)*jac(2, 1)
929 if (detj == 0.0_wp)
exit
931 invjac(1, 1) = jac(2, 2)/detj
932 invjac(1, 2) = -jac(1, 2)/detj
933 invjac(2, 1) = -jac(2, 1)/detj
934 invjac(2, 2) = jac(1, 1)/detj
936 deltamp(1) = -(invjac(1, 1)*r2d(1) + invjac(1, 2)*r2d(2))
937 deltamp(2) = -(invjac(2, 1)*r2d(1) + invjac(2, 2)*r2d(2))
943 ml_try = min(max(ml + lambda*deltamp(1), 0.0_wp), mt)
944 ps_try = max(ps + lambda*deltamp(2), pmin)
945 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)
946 resnorm_try = sqrt(r2d_try(1)**2 + r2d_try(2)**2)
947 if ((resnorm_try < resnorm) .or. (ls ==
ptg_ls_max))
exit
948 lambda = 0.5_wp*lambda
952 ml = ml_try; ps = ps_try; r2d = r2d_try; resnorm = resnorm_try
956 q_cons_vf(
lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = ml
957 q_cons_vf(
vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mt - ml
959 ts = (rhoe + ps - mq)/mcp