56 use physcons,
only : rdgas => con_rd_dyn, &
57 rvgas => con_rv_dyn, &
59 hlv => con_hvap_dyn, &
60 hlf => con_hfus_dyn, &
63 use machine,
only: kind_grid, kind_dyn
64 use module_gfdlmp_param,
only: ql_gen, qi_gen, qi0_max, ql_mlt, ql0_max, qi_lim, qs_mlt
65 use module_gfdlmp_param,
only: icloud_f, sat_adj0, t_sub, cld_min
66 use module_gfdlmp_param,
only: tau_r2g, tau_smlt, tau_i2s, tau_v2l, tau_l2v, tau_imlt, tau_l2r
67 use module_gfdlmp_param,
only: rad_rain, rad_snow, rad_graupel, dw_ocean, dw_land, tintqs
72 virq_qpz, vicpqd_qpz, &
80 public fv_sat_adj_init, fv_sat_adj_run, fv_sat_adj_final
82 logical :: is_initialized = .false.
84 real(kind=kind_dyn),
parameter :: rrg = -rdgas/grav
86 real(kind=kind_dyn),
parameter :: cp_vap = 4.0 * rvgas
87 real(kind=kind_dyn),
parameter :: cv_air = cp_air - rdgas
88 real(kind=kind_dyn),
parameter :: cv_vap = 3.0 * rvgas
99 real(kind=kind_dyn),
parameter :: c_ice = 1972.0
100 real(kind=kind_dyn),
parameter :: c_liq = 4185.5
101 real(kind=kind_dyn),
parameter :: dc_vap = cp_vap - c_liq
102 real(kind=kind_dyn),
parameter :: dc_ice = c_liq - c_ice
103 real(kind=kind_dyn),
parameter :: tice = 273.16
104 real(kind=kind_dyn),
parameter :: t_wfr = tice - 40.
105 real(kind=kind_dyn),
parameter :: lv0 = hlv - dc_vap * tice
106 real(kind=kind_dyn),
parameter :: li00 = hlf - dc_ice * tice
108 real (kind_grid),
parameter :: e00 = 611.21
109 real (kind_grid),
parameter :: d2ice = dc_vap + dc_ice
110 real (kind_grid),
parameter :: li2 = lv0 + li00
111 real(kind=kind_dyn),
parameter :: lat2 = (hlv + hlf) ** 2
112 real(kind=kind_dyn) :: d0_vap
113 real(kind=kind_dyn) :: lv00
114 real(kind=kind_dyn),
allocatable :: table(:), table2(:), tablew(:), des2(:), desw(:)
122subroutine fv_sat_adj_init(do_sat_adj, kmp, nwat, ngas, rilist, cpilist, &
123 mpirank, mpiroot, errmsg, errflg)
128 logical,
intent(in ) :: do_sat_adj
129 integer,
intent(in ) :: kmp
130 integer,
intent(in ) :: nwat
131 integer,
intent(in ) :: ngas
132 real(kind_dyn),
intent(in ) :: rilist(0:ngas)
133 real(kind_dyn),
intent(in ) :: cpilist(0:ngas)
134 integer,
intent(in ) :: mpirank
135 integer,
intent(in ) :: mpiroot
136 character(len=*),
intent( out) :: errmsg
137 integer,
intent( out) :: errflg
140 integer,
parameter :: length = 2621
148 if (.not.do_sat_adj)
then
149 write(errmsg,
'(a)')
'Logic error: fv_sat_adj_init is called but do_sat_adj is set to false'
154 if (.not.nwat==6)
then
155 write(errmsg,
'(a)')
'Logic error: fv_sat_adj requires six water species (nwat=6)'
160 if (is_initialized)
return
164 allocate (table(length))
165 allocate (table2(length))
166 allocate (tablew(length))
167 allocate (des2(length))
168 allocate (desw(length))
170 call qs_table (length)
171 call qs_table2 (length)
172 call qs_tablew (length)
175 des2(i) = max(0., table2(i + 1) - table2(i))
176 desw(i) = max(0., tablew(i + 1) - tablew(i))
178 des2(length) = des2(length - 1)
179 desw(length) = desw(length - 1)
182 call multi_gases_init(ngas,nwat,rilist,cpilist,mpirank==mpiroot)
185 is_initialized = .true.
187end subroutine fv_sat_adj_init
194subroutine fv_sat_adj_final (errmsg, errflg)
198 character(len=*),
intent(out) :: errmsg
199 integer,
intent(out) :: errflg
205 if (.not.is_initialized)
return
207 if (
allocated(table ))
deallocate(table )
208 if (
allocated(table2))
deallocate(table2)
209 if (
allocated(tablew))
deallocate(tablew)
210 if (
allocated(des2 ))
deallocate(des2 )
211 if (
allocated(desw ))
deallocate(desw )
214 call multi_gases_final()
217 is_initialized = .false.
219end subroutine fv_sat_adj_final
234subroutine fv_sat_adj_run(mdt, zvir, is, ie, isd, ied, isc1, iec1, isc2, iec2, kmp, km, kmdelz, js, je, jsd, jed, jsc1, jec1, jsc2, jec2, &
235 ng, hydrostatic, fast_mp_consv, te0_2d, te0, ngas, qvi, qv, ql, qi, qr, &
236 qs, qg, hs, peln, delz, delp, pt, pkz, q_con, akap, cappa, area, dtdt, &
237 out_dt, last_step, do_qa, qa, &
238 nthreads, errmsg, errflg)
243 real(kind=kind_dyn),
intent(in) :: mdt
244 real(kind=kind_dyn),
intent(in) :: zvir
245 integer,
intent(in) :: is
246 integer,
intent(in) :: ie
247 integer,
intent(in) :: isd
248 integer,
intent(in) :: ied
249 integer,
intent(in) :: isc1
250 integer,
intent(in) :: iec1
251 integer,
intent(in) :: isc2
252 integer,
intent(in) :: iec2
253 integer,
intent(in) :: kmp
254 integer,
intent(in) :: km
255 integer,
intent(in) :: kmdelz
256 integer,
intent(in) :: js
257 integer,
intent(in) :: je
258 integer,
intent(in) :: jsd
259 integer,
intent(in) :: jed
260 integer,
intent(in) :: jsc1
261 integer,
intent(in) :: jec1
262 integer,
intent(in) :: jsc2
263 integer,
intent(in) :: jec2
264 integer,
intent(in) :: ng
265 logical,
intent(in) :: hydrostatic
266 logical,
intent(in) :: fast_mp_consv
267 real(kind=kind_dyn),
intent(inout) :: te0_2d(is:ie, js:je)
268 real(kind=kind_dyn),
intent( out) :: te0(isd:ied, jsd:jed, 1:km)
270 integer,
intent(in) :: ngas
272 real(kind=kind_dyn),
intent(inout) :: qvi(isd:ied, jsd:jed, 1:km, 1:ngas)
274 real(kind=kind_dyn),
intent(inout) :: qvi(:,:,:,:)
276 real(kind=kind_dyn),
intent(inout) :: qv(isd:ied, jsd:jed, 1:km)
277 real(kind=kind_dyn),
intent(inout) :: ql(isd:ied, jsd:jed, 1:km)
278 real(kind=kind_dyn),
intent(inout) :: qi(isd:ied, jsd:jed, 1:km)
279 real(kind=kind_dyn),
intent(inout) :: qr(isd:ied, jsd:jed, 1:km)
280 real(kind=kind_dyn),
intent(inout) :: qs(isd:ied, jsd:jed, 1:km)
281 real(kind=kind_dyn),
intent(inout) :: qg(isd:ied, jsd:jed, 1:km)
282 real(kind=kind_dyn),
intent(in) :: hs(isd:ied, jsd:jed)
283 real(kind=kind_dyn),
intent(in) :: peln(is:ie, 1:km+1, js:je)
285 real(kind=kind_dyn),
intent(in) :: delz(is:ie, js:je, 1:kmdelz)
286 real(kind=kind_dyn),
intent(in) :: delp(isd:ied, jsd:jed, 1:km)
287 real(kind=kind_dyn),
intent(inout) :: pt(isd:ied, jsd:jed, 1:km)
288 real(kind=kind_dyn),
intent(inout) :: pkz(is:ie, js:je, 1:km)
290 real(kind=kind_dyn),
intent(inout) :: q_con(isd:ied, jsd:jed, 1:km)
292 real(kind=kind_dyn),
intent(inout) :: q_con(isd:isd, jsd:jsd, 1)
294 real(kind=kind_dyn),
intent(in) :: akap
296 real(kind=kind_dyn),
intent(inout) :: cappa(isd:ied, jsd:jed, 1:km)
298 real(kind=kind_dyn),
intent(inout) :: cappa(isd:ied, jsd:jed, 1)
305 real(kind_grid),
intent(in) :: area(isd:ied, jsd:jed)
306 real(kind=kind_dyn),
intent(inout) :: dtdt(is:ie, js:je, 1:km)
307 logical,
intent(in) :: out_dt
308 logical,
intent(in) :: last_step
309 logical,
intent(in) :: do_qa
310 real(kind=kind_dyn),
intent( out) :: qa(isd:ied, jsd:jed, 1:km)
311 integer,
intent(in) :: nthreads
312 character(len=*),
intent( out) :: errmsg
313 integer,
intent( out) :: errflg
316 real(kind=kind_dyn),
dimension(is:ie,js:je) :: dpln
341 dpln(i,j) = peln(i,k+1,j) - peln(i,k,j)
344 if (hydrostatic)
then
349 call fv_sat_adj_work(abs(mdt), zvir, is, ie, js, je, ng, hydrostatic, fast_mp_consv, &
352 qvi(isd,jsd,k,1:ngas), &
356 ql(isd,jsd,k), qi(isd,jsd,k), &
357 qr(isd,jsd,k), qs(isd,jsd,k), qg(isd,jsd,k), &
358 hs, dpln, delz(is:,js:,kdelz), pt(isd,jsd,k), delp(isd,jsd,k),&
359 q_con(isd:,jsd:,k), cappa(isd:,jsd:,k), area, dtdt(is,js,k), &
360 out_dt, last_step, do_qa, qa(isd,jsd,k))
361 if ( .not. hydrostatic )
then
365 pkz(i,j,k) = exp(cappa(i,j,k)*log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k)))
368 pkz(i,j,k) = exp(akap*(virqd(q(i,j,k,1:num_gas))/vicpqd(q(i,j,k,1:num_gas))*log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k)))
370 pkz(i,j,k) = exp(akap*log(rrg*delp(i,j,k)/delz(i,j,k)*pt(i,j,k)))
379 if ( fast_mp_consv )
then
384 te0_2d(i,j) = te0_2d(i,j) + te0(i,j,k)
397end subroutine fv_sat_adj_run
403subroutine fv_sat_adj_work(mdt, zvir, is, ie, js, je, ng, hydrostatic, consv_te, te0, &
409 ql, qi, qr, qs, qg, hs, dpln, delz, pt, dp, q_con, cappa, &
410 area, dtdt, out_dt, last_step, do_qa, qa)
415 integer,
intent (in) :: is, ie, js, je, ng
416 logical,
intent (in) :: hydrostatic, consv_te, out_dt, last_step, do_qa
417 real(kind=kind_dyn),
intent (in) :: zvir, mdt
418 real(kind=kind_dyn),
intent (in),
dimension (is - ng:ie + ng, js - ng:je + ng) :: dp, hs
419 real(kind=kind_dyn),
intent (in),
dimension (is:ie, js:je) :: dpln, delz
420 real(kind=kind_dyn),
intent (inout),
dimension (is - ng:ie + ng, js - ng:je + ng) :: pt
422 real(kind=kind_dyn),
intent (inout),
dimension (is - ng:ie + ng, js - ng:je + ng, 1:1, 1:num_gas) :: qvi
424 real(kind=kind_dyn),
intent (inout),
dimension (is - ng:ie + ng, js - ng:je + ng) :: qv
426 real(kind=kind_dyn),
intent (inout),
dimension (is - ng:ie + ng, js - ng:je + ng) :: ql, qi, qr, qs, qg
427 real(kind=kind_dyn),
intent (inout),
dimension (is - ng:ie + ng, js - ng:je + ng) :: q_con, cappa
428 real(kind=kind_dyn),
intent (inout),
dimension (is:ie, js:je) :: dtdt
429 real(kind=kind_dyn),
intent (out),
dimension (is - ng:ie + ng, js - ng:je + ng) :: qa, te0
430 real (kind_grid),
intent (in),
dimension (is - ng:ie + ng, js - ng:je + ng) :: area
434 real,
dimension (is - ng:ie + ng, js - ng:je + ng) :: qv
436 real(kind=kind_dyn),
dimension (is:ie) :: wqsat, dq2dt, qpz, cvm, t0, pt1, qstar
437 real(kind=kind_dyn),
dimension (is:ie) :: icp2, lcp2, tcp2, tcp3
438 real(kind=kind_dyn),
dimension (is:ie) :: den, q_liq, q_sol, q_cond, src, sink, hvar
439 real(kind=kind_dyn),
dimension (is:ie) :: mc_air, lhl, lhi
440 real(kind=kind_dyn) :: qsw, rh
441 real(kind=kind_dyn) :: tc, qsi, dqsdt, dq, dq0, pidep, qi_crt, tmp, dtmp
442 real(kind=kind_dyn) :: tin, rqi, q_plus, q_minus
443 real(kind=kind_dyn) :: sdt, dt_bigg, adj_fac
444 real(kind=kind_dyn) :: fac_smlt, fac_r2g, fac_i2s, fac_imlt, fac_l2r, fac_v2l, fac_l2v
445 real(kind=kind_dyn) :: factor, qim, tice0, c_air, c_vap, dw
449 qv(:,:) = qvi(:,:,1,1)
460 fac_i2s = 1. - exp(- mdt / tau_i2s)
461 fac_v2l = 1. - exp(- sdt / tau_v2l)
462 fac_r2g = 1. - exp(- mdt / tau_r2g)
463 fac_l2r = 1. - exp(- mdt / tau_l2r)
465 fac_l2v = 1. - exp(- sdt / tau_l2v)
466 fac_l2v = min(sat_adj0, fac_l2v)
468 fac_imlt = 1. - exp(- sdt / tau_imlt)
469 fac_smlt = 1. - exp(- mdt / tau_smlt)
475 if (hydrostatic)
then
482 d0_vap = c_vap - c_liq
483 lv00 = hlv - d0_vap * tice
490 q_liq(i) = ql(i, j) + qr(i, j)
491 q_sol(i) = qi(i, j) + qs(i, j) + qg(i, j)
492 qpz(i) = q_liq(i) + q_sol(i)
494 pt1(i) = pt(i, j) / virq_qpz(qvi(i,j,1,1:num_gas),qpz(i))
497 pt1(i) = pt(i, j) / ((1 + zvir * qv(i, j)) * (1 - qpz(i)))
499 pt1(i) = pt(i, j) / (1 + zvir * qv(i, j))
503 qpz(i) = qpz(i) + qv(i, j)
510 if (hydrostatic)
then
512 den(i) = dp(i, j) / (dpln(i, j) * rdgas * pt(i, j))
516 den(i) = - dp(i, j) / (grav * delz(i, j))
526 if (hydrostatic)
then
527 c_air = cp_air * vicpqd_qpz(qvi(i,j,1,1:num_gas),qpz(i))
529 c_air = cv_air * vicvqd_qpz(qvi(i,j,1,1:num_gas),qpz(i))
532 mc_air(i) = (1. - qpz(i)) * c_air
533 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
534 lhi(i) = li00 + dc_ice * pt1(i)
535 icp2(i) = lhi(i) / cvm(i)
543 if (hydrostatic)
then
546 c_air = cp_air * vicpqd_qpz(qvi(i,j,1,1:num_gas),qpz(i))
548 te0(i, j) = - c_air * t0(i)
553 te0(i, j) = - cvm(i) * t0(i)
556 c_air = cv_air * vicvqd_qpz(qvi(i,j,1,1:num_gas),qpz(i))
558 te0(i, j) = - c_air * t0(i)
569 if (qi(i, j) < 0.)
then
570 qs(i, j) = qs(i, j) + qi(i, j)
580 if (qi(i, j) > 1.e-8 .and. pt1(i) > tice)
then
581 sink(i) = min(qi(i, j), fac_imlt * (pt1(i) - tice) / icp2(i))
582 qi(i, j) = qi(i, j) - sink(i)
588 ql(i, j) = ql(i, j) + sink(i)
589 q_liq(i) = q_liq(i) + sink(i)
590 q_sol(i) = q_sol(i) - sink(i)
591 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
592 pt1(i) = pt1(i) - sink(i) * lhi(i) / cvm(i)
601 lhi(i) = li00 + dc_ice * pt1(i)
602 icp2(i) = lhi(i) / cvm(i)
610 if (qs(i, j) < 0.)
then
611 qg(i, j) = qg(i, j) + qs(i, j)
613 elseif (qg(i, j) < 0.)
then
614 tmp = min(- qg(i, j), max(0., qs(i, j)))
615 qg(i, j) = qg(i, j) + tmp
616 qs(i, j) = qs(i, j) - tmp
627 if (ql(i, j) < 0.)
then
628 tmp = min(- ql(i, j), max(0., qr(i, j)))
629 ql(i, j) = ql(i, j) + tmp
630 qr(i, j) = qr(i, j) - tmp
631 elseif (qr(i, j) < 0.)
then
632 tmp = min(- qr(i, j), max(0., ql(i, j)))
633 ql(i, j) = ql(i, j) - tmp
634 qr(i, j) = qr(i, j) + tmp
643 dtmp = tice - 48. - pt1(i)
644 if (ql(i, j) > 0. .and. dtmp > 0.)
then
645 sink(i) = min(ql(i, j), dtmp / icp2(i))
646 ql(i, j) = ql(i, j) - sink(i)
647 qi(i, j) = qi(i, j) + sink(i)
648 q_liq(i) = q_liq(i) - sink(i)
649 q_sol(i) = q_sol(i) + sink(i)
650 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
651 pt1(i) = pt1(i) + sink(i) * lhi(i) / cvm(i)
660 lhl(i) = lv00 + d0_vap * pt1(i)
661 lhi(i) = li00 + dc_ice * pt1(i)
662 lcp2(i) = lhl(i) / cvm(i)
663 icp2(i) = lhi(i) / cvm(i)
664 tcp3(i) = lcp2(i) + icp2(i) * min(1., dim(tice, pt1(i)) /48.)
671 call wqs2_vect (is, ie, pt1, den, wqsat, dq2dt)
675 dq0 = (qv(i, j) - wqsat(i)) / (1. + tcp3(i) * dq2dt(i))
677 src(i) = min(adj_fac * dq0, max(ql_gen - ql(i, j), fac_v2l * dq0))
683 factor = - min(1., fac_l2v * 10. * (1. - qv(i, j) / wqsat(i)))
684 src(i) = - min(ql(i, j), factor * dq0)
686 qv(i, j) = qv(i, j) - src(i)
688 qvi(i,j,1,1) = qv(i, j)
690 ql(i, j) = ql(i, j) + src(i)
691 q_liq(i) = q_liq(i) + src(i)
692 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
693 pt1(i) = pt1(i) + src(i) * lhl(i) / cvm(i)
701 lhl(i) = lv00 + d0_vap * pt1(i)
702 lhi(i) = li00 + dc_ice * pt1(i)
703 lcp2(i) = lhl(i) / cvm(i)
704 icp2(i) = lhi(i) / cvm(i)
705 tcp3(i) = lcp2(i) + icp2(i) * min(1., dim(tice, pt1(i)) / 48.)
716 call wqs2_vect (is, ie, pt1, den, wqsat, dq2dt)
719 dq0 = (qv(i, j) - wqsat(i)) / (1. + tcp3(i) * dq2dt(i))
726 factor = - min(1., fac_l2v * 10. * (1. - qv(i, j) / wqsat(i)))
727 src(i) = - min(ql(i, j), factor * dq0)
730 qv(i, j) = qv(i, j) - src(i)
732 qvi(i,j,1,1) = qv(i,j)
734 ql(i, j) = ql(i, j) + src(i)
735 q_liq(i) = q_liq(i) + src(i)
736 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
737 pt1(i) = pt1(i) + src(i) * lhl(i) / cvm(i)
745 lhl(i) = lv00 + d0_vap * pt1(i)
746 lhi(i) = li00 + dc_ice * pt1(i)
747 lcp2(i) = lhl(i) / cvm(i)
748 icp2(i) = lhi(i) / cvm(i)
758 dtmp = t_wfr - pt1(i)
759 if (ql(i, j) > 0. .and. dtmp > 0.)
then
760 sink(i) = min(ql(i, j), ql(i, j) * dtmp * 0.125, dtmp / icp2(i))
761 ql(i, j) = ql(i, j) - sink(i)
762 qi(i, j) = qi(i, j) + sink(i)
763 q_liq(i) = q_liq(i) - sink(i)
764 q_sol(i) = q_sol(i) + sink(i)
765 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
766 pt1(i) = pt1(i) + sink(i) * lhi(i) / cvm(i)
775 lhi(i) = li00 + dc_ice * pt1(i)
776 icp2(i) = lhi(i) / cvm(i)
785 if (ql(i, j) > 0.0 .and. tc > 0.)
then
786 sink(i) = 3.3333e-10 * dt_bigg * (exp(0.66 * tc) - 1.) * den(i) * ql(i, j) ** 2
787 sink(i) = min(ql(i, j), tc / icp2(i), sink(i))
788 ql(i, j) = ql(i, j) - sink(i)
789 qi(i, j) = qi(i, j) + sink(i)
790 q_liq(i) = q_liq(i) - sink(i)
791 q_sol(i) = q_sol(i) + sink(i)
792 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
793 pt1(i) = pt1(i) + sink(i) * lhi(i) / cvm(i)
802 lhi(i) = li00 + dc_ice * pt1(i)
803 icp2(i) = lhi(i) / cvm(i)
811 dtmp = (tice - 0.1) - pt1(i)
812 if (qr(i, j) > 1.e-7 .and. dtmp > 0.)
then
813 tmp = min(1., (dtmp * 0.025) ** 2) * qr(i, j)
814 sink(i) = min(tmp, fac_r2g * dtmp / icp2(i))
815 qr(i, j) = qr(i, j) - sink(i)
816 qg(i, j) = qg(i, j) + sink(i)
817 q_liq(i) = q_liq(i) - sink(i)
818 q_sol(i) = q_sol(i) + sink(i)
819 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
820 pt1(i) = pt1(i) + sink(i) * lhi(i) / cvm(i)
829 lhi(i) = li00 + dc_ice * pt1(i)
830 icp2(i) = lhi(i) / cvm(i)
838 dtmp = pt1(i) - (tice + 0.1)
839 if (qs(i, j) > 1.e-7 .and. dtmp > 0.)
then
840 tmp = min(1., (dtmp * 0.1) ** 2) * qs(i, j)
841 sink(i) = min(tmp, fac_smlt * dtmp / icp2(i))
842 tmp = min(sink(i), dim(qs_mlt, ql(i, j)))
843 qs(i, j) = qs(i, j) - sink(i)
844 ql(i, j) = ql(i, j) + tmp
845 qr(i, j) = qr(i, j) + sink(i) - tmp
847 q_liq(i) = q_liq(i) + sink(i)
848 q_sol(i) = q_sol(i) - sink(i)
849 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
850 pt1(i) = pt1(i) - sink(i) * lhi(i) / cvm(i)
859 if (ql(i, j) > ql0_max)
then
860 sink(i) = fac_l2r * (ql(i, j) - ql0_max)
861 qr(i, j) = qr(i, j) + sink(i)
862 ql(i, j) = ql(i, j) - sink(i)
871 lhi(i) = li00 + dc_ice * pt1(i)
872 lhl(i) = lv00 + d0_vap * pt1(i)
873 lcp2(i) = lhl(i) / cvm(i)
874 icp2(i) = lhi(i) / cvm(i)
875 tcp2(i) = lcp2(i) + icp2(i)
884 if (pt1(i) < t_sub)
then
885 src(i) = dim(qv(i, j), 1.e-6)
886 elseif (pt1(i) < tice0)
then
887 qsi = iqs2(pt1(i), den(i), dqsdt)
889 sink(i) = adj_fac * dq / (1. + tcp2(i) * dqsdt)
890 if (qi(i, j) > 1.e-8)
then
891 pidep = sdt * dq * 349138.78 * exp(0.875 * log(qi(i, j) * den(i))) &
892 / (qsi * den(i) * lat2 / (0.0243 * rvgas * pt1(i) ** 2) + 4.42478e4)
898 qi_crt = qi_gen * min(qi_lim, 0.1 * tmp) / den(i)
899 src(i) = min(sink(i), max(qi_crt - qi(i, j), pidep), tmp / tcp2(i))
901 pidep = pidep * min(1., dim(pt1(i), t_sub) * 0.2)
902 src(i) = max(pidep, sink(i), - qi(i, j))
905 qv(i, j) = qv(i, j) - src(i)
907 qvi(i,j,1,1) = qv(i,j)
909 qi(i, j) = qi(i, j) + src(i)
910 q_sol(i) = q_sol(i) + src(i)
911 cvm(i) = mc_air(i) + qv(i, j) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
912 pt1(i) = pt1(i) + src(i) * (lhl(i) + lhi(i)) / cvm(i)
921 q_con(i, j) = q_liq(i) + q_sol(i)
923 pt(i, j) = pt1(i) * virq_qpz(qvi(i,j,1,1:num_gas),q_con(i,j))
925 tmp = 1. + zvir * qv(i, j)
926 pt(i, j) = pt1(i) * tmp * (1. - q_con(i, j))
929 cappa(i, j) = tmp / (tmp + cvm(i))
932 q_con(i, j) = q_liq(i) + q_sol(i)
933 pt(i, j) = pt1(i) * virq_qpz(qvi(i,j,1,1:num_gas),q_con(i,j)) * (1. - q_con(i,j))
935 pt(i, j) = pt1(i) * (1. + zvir * qv(i, j))
945 if (qg(i, j) < 0.)
then
946 tmp = min(- qg(i, j), max(0., qi(i, j)))
947 qg(i, j) = qg(i, j) + tmp
948 qi(i, j) = qi(i, j) - tmp
957 qim = qi0_max / den(i)
958 if (qi(i, j) > qim)
then
959 sink(i) = fac_i2s * (qi(i, j) - qim)
960 qi(i, j) = qi(i, j) - sink(i)
961 qs(i, j) = qs(i, j) + sink(i)
967 dtdt(i, j) = dtdt(i, j) + pt1(i) - t0(i)
977 if (hydrostatic)
then
979 c_air = cp_air * vicpqd_qpz(qvi(i,j,1,1:num_gas),qpz(i))
981 te0(i, j) = dp(i, j) * (te0(i, j) + c_air * pt1(i))
984 te0(i, j) = dp(i, j) * (te0(i, j) + cvm(i) * pt1(i))
987 c_air = cv_air * vicvqd_qpz(qvi(i,j,1,1:num_gas),qpz(i))
989 te0(i, j) = dp(i, j) * (te0(i, j) + c_air * pt1(i))
1000 lhi(i) = li00 + dc_ice * pt1(i)
1001 lhl(i) = lv00 + d0_vap * pt1(i)
1002 cvm(i) = mc_air(i) + (qv(i, j) + q_liq(i) + q_sol(i)) * c_vap
1003 lcp2(i) = lhl(i) / cvm(i)
1004 icp2(i) = lhi(i) / cvm(i)
1011 if (do_qa .and. last_step)
then
1018 if (rad_graupel)
then
1020 q_sol(i) = qi(i, j) + qs(i, j) + qg(i, j)
1024 q_sol(i) = qi(i, j) + qs(i, j)
1034 q_liq(i) = ql(i, j) + qr(i, j)
1042 q_cond(i) = q_sol(i) + q_liq(i)
1054 tin = pt1(i) - (lcp2(i) * q_cond(i) + icp2(i) * q_sol(i))
1063 if (tin <= t_wfr)
then
1065 qstar(i) = iqs1(tin, den(i))
1066 elseif (tin >= tice)
then
1068 qstar(i) = wqs1(tin, den(i))
1071 qsi = iqs1(tin, den(i))
1072 qsw = wqs1(tin, den(i))
1073 if (q_cond(i) > 1.e-6)
then
1074 rqi = q_sol(i) / q_cond(i)
1077 rqi = ((tice - tin) / (tice - t_wfr))
1079 qstar(i) = rqi * qsi + (1. - rqi) * qsw
1082 dw = dw_ocean + (dw_land - dw_ocean) * min(1., abs(hs(i, j)) / (10. * grav))
1084 hvar(i) = min(0.2, max(0.01, dw * sqrt(sqrt(area(i, j)) / 100.e3)))
1092 rh = qpz(i) / qstar(i)
1100 if (rh > 0.75 .and. qpz(i) > 1.e-8)
then
1101 dq = hvar(i) * qpz(i)
1102 q_plus = qpz(i) + dq
1103 q_minus = qpz(i) - dq
1104 if (icloud_f == 2)
then
1105 if (qpz(i) > qstar(i))
then
1107 elseif (qstar(i) < q_plus .and. q_cond(i) > 1.e-8)
then
1108 qa(i, j) = ((q_plus - qstar(i)) / dq) ** 2
1109 qa(i, j) = min(1., qa(i, j))
1114 if (qstar(i) < q_minus)
then
1117 if (qstar(i) < q_plus)
then
1118 if (icloud_f == 0)
then
1119 qa(i, j) = (q_plus - qstar(i)) / (dq + dq)
1121 qa(i, j) = (q_plus - qstar(i)) / (2. * dq * (1. - q_cond(i)))
1127 if (q_cond(i) > 1.e-8)
then
1128 qa(i, j) = max(cld_min, qa(i, j))
1130 qa(i, j) = min(1., qa(i, j))
1143end subroutine fv_sat_adj_work
1151real(kind=kind_dyn) function wqs1 (ta, den)
1158 real(kind=kind_dyn),
intent (in) :: ta, den
1160 real(kind=kind_dyn) :: es, ap1, tmin
1165 ap1 = 10. * dim(ta, tmin) + 1.
1166 ap1 = min(2621., ap1)
1168 es = tablew(it) + (ap1 - it) * desw(it)
1169 wqs1 = es / (rvgas * ta * den)
1178real(kind=kind_dyn) function iqs1 (ta, den)
1185 real(kind=kind_dyn),
intent (in) :: ta, den
1187 real(kind=kind_dyn) :: es, ap1, tmin
1192 ap1 = 10. * dim(ta, tmin) + 1.
1193 ap1 = min(2621., ap1)
1195 es = table2(it) + (ap1 - it) * des2(it)
1196 iqs1 = es / (rvgas * ta * den)
1205real(kind=kind_dyn) function wqs2 (ta, den, dqdt)
1212 real(kind=kind_dyn),
intent (in) :: ta, den
1214 real(kind=kind_dyn),
intent (out) :: dqdt
1216 real(kind=kind_dyn) :: es, ap1, tmin
1221 ap1 = 10. * dim(ta, tmin) + 1.
1222 ap1 = min(2621., ap1)
1224 es = tablew(it) + (ap1 - it) * desw(it)
1225 wqs2 = es / (rvgas * ta * den)
1228 dqdt = 10. * (desw(it) + (ap1 - it) * (desw(it + 1) - desw(it))) / (rvgas * ta * den)
1238subroutine wqs2_vect (is, ie, ta, den, wqsat, dqdt)
1245 integer,
intent (in) :: is, ie
1247 real(kind=kind_dyn),
intent (in),
dimension (is:ie) :: ta, den
1249 real(kind=kind_dyn),
intent (out),
dimension (is:ie) :: wqsat, dqdt
1251 real(kind=kind_dyn) :: es, ap1, tmin
1258 ap1 = 10. * dim(ta(i), tmin) + 1.
1259 ap1 = min(2621., ap1)
1261 es = tablew(it) + (ap1 - it) * desw(it)
1262 wqsat(i) = es / (rvgas * ta(i) * den(i))
1265 dqdt(i) = 10. * (desw(it) + (ap1 - it) * (desw(it + 1) - desw(it))) / (rvgas * ta(i) * den(i))
1268end subroutine wqs2_vect
1275real(kind=kind_dyn) function iqs2 (ta, den, dqdt)
1282 real(kind=kind_dyn),
intent (in) :: ta, den
1284 real(kind=kind_dyn),
intent (out) :: dqdt
1286 real(kind=kind_dyn) :: es, ap1, tmin
1291 ap1 = 10. * dim(ta, tmin) + 1.
1292 ap1 = min(2621., ap1)
1294 es = table2(it) + (ap1 - it) * des2(it)
1295 iqs2 = es / (rvgas * ta * den)
1298 dqdt = 10. * (des2(it) + (ap1 - it) * (des2(it + 1) - des2(it))) / (rvgas * ta * den)
1308subroutine qs_table (n)
1312 integer,
intent (in) :: n
1313 real (kind_grid) :: delt = 0.1
1314 real (kind_grid) :: tmin, tem, esh20
1315 real (kind_grid) :: wice, wh2o, fac0, fac1, fac2
1316 real (kind_grid) :: esupc (200)
1326 tem = tmin + delt * real(i - 1)
1327 fac0 = (tem - tice) / (tem * tice)
1329 fac2 = (d2ice * log(tem / tice) + fac1) / rvgas
1330 table(i) = e00 * exp(fac2)
1338 tem = 253.16 + delt * real(i - 1)
1339 fac0 = (tem - tice) / (tem * tice)
1341 fac2 = (dc_vap * log(tem / tice) + fac1) / rvgas
1342 esh20 = e00 * exp(fac2)
1346 table(i + 1400) = esh20
1355 tem = 253.16 + delt * real(i - 1)
1356 wice = 0.05 * (tice - tem)
1357 wh2o = 0.05 * (tem - 253.16)
1358 table(i + 1400) = wice * table(i + 1400) + wh2o * esupc(i)
1361end subroutine qs_table
1369subroutine qs_tablew (n)
1373 integer,
intent (in) :: n
1374 real (kind_grid) :: delt = 0.1
1375 real (kind_grid) :: tmin, tem, fac0, fac1, fac2
1385 tem = tmin + delt * real(i - 1)
1386 fac0 = (tem - tice) / (tem * tice)
1388 fac2 = (dc_vap * log(tem / tice) + fac1) / rvgas
1389 tablew(i) = e00 * exp(fac2)
1392end subroutine qs_tablew
1400subroutine qs_table2 (n)
1404 integer,
intent (in) :: n
1405 real (kind_grid) :: delt = 0.1
1406 real (kind_grid) :: tmin, tem0, tem1, fac0, fac1, fac2
1407 integer :: i, i0, i1
1412 tem0 = tmin + delt * real(i - 1)
1413 fac0 = (tem0 - tice) / (tem0 * tice)
1419 fac2 = (d2ice * log(tem0 / tice) + fac1) / rvgas
1425 fac2 = (dc_vap * log(tem0 / tice) + fac1) / rvgas
1427 table2(i) = e00 * exp(fac2)
1436 tem0 = 0.25 * (table2(i0 - 1) + 2. * table(i0) + table2(i0 + 1))
1437 tem1 = 0.25 * (table2(i1 - 1) + 2. * table(i1) + table2(i1 + 1))
1441end subroutine qs_table2
The module 'multi_gases' peforms multi constitutents computations.
This module contains the GFDL in-core fast saturation adjustment called in FV3 dynamics solver.