37 subroutine crtm_ade_efr( geom,p,T,delp,sea_frac,q,ql,qi,ql_ade,qi_ade,ql_efr,qi_efr)
43 real(kind=
kind_real),
intent(in) :: p(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
44 real(kind=
kind_real),
intent(in) :: t(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
45 real(kind=
kind_real),
intent(in) :: delp(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
46 real(kind=
kind_real),
intent(in) :: sea_frac(geom%isc:geom%iec,geom%jsc:geom%jec)
47 real(kind=
kind_real),
intent(in) :: q(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
48 real(kind=
kind_real),
intent(in) :: ql(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
49 real(kind=
kind_real),
intent(in) :: qi(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
51 real(kind=
kind_real),
intent(out) :: ql_ade(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
52 real(kind=
kind_real),
intent(out) :: qi_ade(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
53 real(kind=
kind_real),
intent(out) :: ql_efr(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
54 real(kind=
kind_real),
intent(out) :: qi_efr(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
57 integer :: isc,iec,jsc,jec,npz
59 logical,
allocatable :: seamask(:,:)
60 real(kind=
kind_real) :: tem1, tem2, tem3, kgkg_to_kgm2
74 ql_ade = 0.0_kind_real
75 qi_ade = 0.0_kind_real
76 ql_efr = 0.0_kind_real
77 qi_efr = 0.0_kind_real
82 allocate(seamask(isc:iec,jsc:jec))
86 seamask(i,j) = min(max(0.0_kind_real,sea_frac(i,j)),1.0_kind_real) >= 0.99_kind_real
96 if (seamask(i,j))
then
98 kgkg_to_kgm2 = delp(i,j,k) /
grav
99 ql_ade(i,j,k) = max(ql(i,j,k),0.0_kind_real) * kgkg_to_kgm2
100 qi_ade(i,j,k) = max(qi(i,j,k),0.0_kind_real) * kgkg_to_kgm2
102 if (t(i,j,k) -
tice > -20.0_kind_real)
then
103 ql_ade(i,j,k) = max(1.001_kind_real*1.0e-6_kind_real,ql_ade(i,j,k))
106 if (t(i,j,k) <
tice)
then
107 qi_ade(i,j,k) = max(1.001_kind_real*1.0e-6_kind_real,qi_ade(i,j,k))
120 if (seamask(i,j))
then
121 tem1 = max(0.0_kind_real,(
tice-t(i,j,k))*0.05_kind_real)
122 ql_efr(i,j,k) = 5.0_kind_real + 5.0_kind_real * min(1.0_kind_real, tem1)
135 if (seamask(i,j))
then
137 tem2 = t(i,j,k) -
tice
139 tem3 = tem1 * qi_ade(i,j,k) * (p(i,j,k)/delp(i,j,k))/t(i,j,k) * (1.0_kind_real +
zvir * max(q(i,j,k),0.0_kind_real))
141 if (tem2 < -50.0_kind_real )
then
142 qi_efr(i,j,k) = (1250._kind_real/9.917_kind_real)*tem3**0.109_kind_real
143 elseif (tem2 < -40.0_kind_real )
then
144 qi_efr(i,j,k) = (1250._kind_real/9.337_kind_real)*tem3**0.08_kind_real
145 elseif (tem2 < -30.0_kind_real )
then
146 qi_efr(i,j,k) = (1250._kind_real/9.208_kind_real)*tem3**0.055_kind_real
148 qi_efr(i,j,k) = (1250._kind_real/9.387_kind_real)*tem3**0.031_kind_real
158 ql_ade = max(0.0_kind_real,ql_ade)
159 qi_ade = max(0.0_kind_real,qi_ade)
160 ql_efr = max(0.0_kind_real,ql_efr)
161 qi_efr = max(0.0_kind_real,qi_efr)
177 real(kind=
kind_real),
intent(in ) :: q(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
178 real(kind=
kind_real),
intent(out) :: qmr(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
181 integer :: isc,iec,jsc,jec,npz
183 real(kind=
kind_real) :: q_pos(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
184 real(kind=
kind_real) :: c3(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
202 if (q_pos(i,j,k) < 0.0_kind_real)
then
203 q_pos(i,j,k) = 0.0_kind_real
212 c3 = 1.0_kind_real / (1.0_kind_real - q_pos)
213 qmr = 1000.0_kind_real * q_pos * c3
225 real(kind=
kind_real),
intent(in ) :: q(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
226 real(kind=
kind_real),
intent(in ) :: q_tl(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
227 real(kind=
kind_real),
intent(out) :: qmr_tl(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
230 integer :: isc,iec,jsc,jec,npz
232 real(kind=
kind_real) :: q_pos(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
233 real(kind=
kind_real) :: q_tl_pos(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
234 real(kind=
kind_real) :: c3(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
235 real(kind=
kind_real) :: c3_tl(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
254 if (q_pos(i,j,k) < 0.0_kind_real)
then
255 q_pos(i,j,k) = 0.0_kind_real
256 q_tl_pos(i,j,k) = 0.0_kind_real
265 c3 = 1.0_kind_real / (1.0_kind_real - q_pos)
266 c3_tl = -((-q_tl_pos)/(1.0_kind_real-q_pos)**2)
267 qmr_tl = 1000.0_kind_real*(q_tl_pos*c3+q_pos*c3_tl)
279 real(kind=
kind_real),
intent(in ) :: q(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
280 real(kind=
kind_real),
intent(inout) :: q_ad(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
281 real(kind=
kind_real),
intent(inout) :: qmr_ad(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
284 integer :: isc,iec,jsc,jec,npz
286 real(kind=
kind_real) :: q_pos(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
287 real(kind=
kind_real) :: q_ad_pos(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
288 real(kind=
kind_real) :: c3(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
289 real(kind=
kind_real) :: c3_ad(geom%isc:geom%iec,geom%jsc:geom%jec, 1:geom%npz)
307 if (q_pos(i,j,k) < 0.0_kind_real)
then
308 q_pos(i,j,k) = 0.0_kind_real
317 c3 = 1.0_kind_real/(1.0_kind_real-q_pos)
318 c3_ad = 1000.0_kind_real*q_pos*qmr_ad
319 q_ad_pos = c3_ad/(1.0_kind_real-q_pos)**2 + 1000.0_kind_real*c3*qmr_ad
328 if (q_pos(i,j,k) < 0.0_kind_real)
then
329 q_ad_pos(i,j,k) = 0.0_kind_real
335 q_ad = q_ad + q_ad_pos
348 real(kind=
kind_real),
intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
349 real(kind=
kind_real),
intent(inout) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
350 real(kind=
kind_real),
intent(inout) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
362 real(kind=
kind_real),
intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
363 real(kind=
kind_real),
intent(inout) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
364 real(kind=
kind_real),
intent(in) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
376 real(kind=
kind_real),
intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
377 real(kind=
kind_real),
intent(in) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
378 real(kind=
kind_real),
intent(inout) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
386 subroutine q4_to_q2(geom,qils,qicn,qlls,qlcn,qi,ql,qilsf,qicnf)
390 real(kind=
kind_real),
intent(in) :: qils(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
391 real(kind=
kind_real),
intent(in) :: qicn(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
392 real(kind=
kind_real),
intent(in) :: qlls(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
393 real(kind=
kind_real),
intent(in) :: qlcn(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
394 real(kind=
kind_real),
intent(out) :: ql(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
395 real(kind=
kind_real),
intent(out) :: qi(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
396 real(kind=
kind_real),
optional,
intent(out) :: qilsf(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
397 real(kind=
kind_real),
optional,
intent(out) :: qicnf(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
405 if (
present(qilsf))
then
406 qilsf = 0.0_kind_real
407 where (qi > 0.0_kind_real) qilsf = qils / qi
409 if (
present(qicnf))
then
410 qicnf = 0.0_kind_real
411 where (qi > 0.0_kind_real) qicnf = qicn / qi
418 subroutine q2_to_q4(geom,qi,ql,qilsf,qicnf,qils,qicn,qlls,qlcn)
422 real(kind=
kind_real),
intent(in) :: ql(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
423 real(kind=
kind_real),
intent(in) :: qi(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
424 real(kind=
kind_real),
intent(in) :: qilsf(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
425 real(kind=
kind_real),
intent(in) :: qicnf(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
426 real(kind=
kind_real),
intent(out) :: qils(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
427 real(kind=
kind_real),
intent(out) :: qicn(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
428 real(kind=
kind_real),
intent(out) :: qlls(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
429 real(kind=
kind_real),
intent(out) :: qlcn(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
433 qlls = qi * (1.0_kind_real - qilsf)
435 qlcn = qi * (1.0_kind_real - qicnf)
447 real(kind=
kind_real),
intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
448 real(kind=
kind_real),
intent(in) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
449 real(kind=
kind_real),
intent(inout) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
461 real(kind=
kind_real),
intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
462 real(kind=
kind_real),
intent(in) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
463 real(kind=
kind_real),
intent(inout) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
475 real(kind=
kind_real),
intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
476 real(kind=
kind_real),
intent(inout) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
477 real(kind=
kind_real),
intent(in) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
489 real(kind=
kind_real),
intent(in) :: delp(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
490 real(kind=
kind_real),
intent(in) :: t(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
491 real(kind=
kind_real),
intent(in) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
492 real(kind=
kind_real),
intent(out) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz)
495 real(kind=
kind_real),
allocatable :: pe(:,:,:)
496 real(kind=
kind_real),
allocatable :: pm(:,:,:)
498 allocate(pe(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz+1))
499 allocate(pm(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz ))
503 do j = geom%jsc,geom%jec
504 do i = geom%isc,geom%iec
505 call qsmith(geom%npz,t(i,j,:),q(i,j,:),pm(i,j,:),qsat(i,j,:))
519 integer,
intent(in) :: nlev
521 real(kind_real),
intent(in) :: sphum(nlev)
522 real(kind_real),
intent(in) :: pl(nlev)
523 real(kind_real),
intent(out) :: qs(nlev)
525 real(kind_real),
parameter :: esl = 0.621971831
526 real(kind_real),
allocatable :: table(:), des(:)
528 real(kind_real) :: es
529 real(kind_real) :: ap1, eps10
531 integer,
parameter :: length=2621
533 eps10 = 10.0_kind_real*esl
535 allocate ( table(length) )
538 allocate ( des(length) )
540 des(k) = table(k+1) - table(k)
542 des(length) = des(length-1)
545 ap1 = 10.0_kind_real*dim(t(k),
tice-160.0_kind_real) + 1.0_kind_real
546 ap1 = min(2621.0_kind_real, ap1)
548 es = table(it) + (ap1-it)*des(it)
549 qs(k) = esl*es*(1.0_kind_real+
zvir*sphum(k))/(pl(k))
552 deallocate(table,des)
562 integer,
intent(in) :: n
563 real(kind=
kind_real),
intent(inout) :: table(n)
565 real(kind=
kind_real) :: tem, aa, b, c, d, e
567 real(kind=
kind_real),
parameter :: dt=0.1_kind_real
568 real(kind=
kind_real),
parameter :: esbasw = 1013246.0_kind_real
569 real(kind=
kind_real),
parameter :: tbasw = 373.16_kind_real
570 real(kind=
kind_real),
parameter :: tbasi = 273.16_kind_real
571 real(kind=
kind_real),
parameter :: tmin = tbasi - 160.0_kind_real
575 tem = tmin+dt*real(i-1)
576 aa = -7.90298_kind_real*(tbasw/tem-1)
577 b = 5.02808_kind_real*log10(tbasw/tem)
578 c = -1.3816e-07_kind_real*(10.0_kind_real**((1.0_kind_real-tem/tbasw)*11.344_kind_real)-1.0_kind_real)
579 d = 8.1328e-03_kind_real*(10.0_kind_real**((tbasw/tem-1.0_kind_real)*(-3.49149_kind_real))-1.0_kind_real)
581 table(i) = 0.1_kind_real*10.0_kind_real**(aa+b+c+d+e)