6 subroutine canopy_levs_init(im, km, nkc, nkt, &
7 ntrac, ntqv, ntke, & ! ndtend, &
8 zi, zl, zm, & ! in: 3D meters
9 prsl, prsi, & ! in: 3D (Pa)
14 zmom_can3, zmid_can3, &
15 sigmom_can, sigmid_can, &
18 dv_can, du_can, tdt_can, rtg_can, &
19 t1_can, qv_can, dens_can, &
20 ws_can, dkt_can, dku_can, &
25 use machine ,
only : kind_phys
30 integer,
intent(in) :: im, km, nkc, nkt, ntrac, ntqv, ntke
32 real(kind=kind_phys),
intent(in) :: zi(im, km+1), zl(im, km), &
34 prsi(im, km+1), prsl(im, km)
35 real(kind=kind_phys),
intent(in) :: dv(im, km), du(im, km), &
36 tdt(im, km), rtg(im, km,ntrac)
37 real(kind=kind_phys),
intent(in) :: u1(im, km), v1(im, km), t1(im,km)
38 real(kind=kind_phys),
intent(in) :: dens(im, km), dkt(im, km), dku(im,km)
42 real(kind=kind_phys),
intent(in) :: q1(im, km, ntrac)
44 real(kind=kind_phys),
intent(out) :: &
51 rtg_can(im, km, ntrac) , &
60 prsi_can(im, nkt+1) , &
65 q1_can(im, nkt, ntrac) , &
68 zmom_can3(im, nkt+1) , &
69 zmid_can3(im, nkt) , &
70 sigmom_can(im, nkt+1) , &
73 character(len=*),
intent(out) :: errmsg
74 integer,
intent(out) :: errflg
96 q1_2m(:, :) = q1(:,1, :)
106 du_can(:,kc) = du(:,k)
107 dv_can(:,kc) = dv(:,k)
108 tdt_can(:,kc) = tdt(:,k)
110 rtg_can(:,kc, 1:ntrac-1) = rtg(:,k, 1:ntrac-1)
111 rtg_can(:,kc, ntke ) = rtg(:,k, ntke )
123 zl_can(:,kc) = zl(:,k)
124 zm_can(:,kc) = zm(:,k)
127 prsl_can(:,kc) = prsl(:,k)
128 prsi_can(:,kc) = prsi(:,k)
129 t1_can(:,kc) = t1(:,k)
130 dens_can(:,kc) = dens(:,k)
133 dkt_can(:,kc) = dkt(:,k)
134 dku_can(:,kc) = dku(:,k)
137 ws_can(:,kc) = sqrt(u1(:,k)**2+v1(:,k)**2)
140 q1_can(:,kc, 1:ntrac-1) = q1(:,k, 1:ntrac-1)
143 q1_can(:,kc, ntke ) = q1(:,k, ntke )
146 qv_can(:,kc) = q1(:,k, ntqv)
149 prsi_can(:,km + nkc +1 ) = prsi(:,km+1)
155 du_can(:,kc) = du(:,1)
156 dv_can(:,kc) = dv(:,1)
157 tdt_can(:,kc) = tdt(:,1)
159 rtg_can(:,kc, 1:ntrac-1) = rtg(:,1, 1:ntrac-1)
160 rtg_can(:,kc, ntke ) = rtg(:,1, ntke )
163 zl_can(:,kc) = zl(:,1)
164 zm_can(:,kc) = zm(:,1)
167 prsl_can(:,kc) = prsl(:,1)
168 prsi_can(:,kc) = prsi(:,1)
169 t1_can(:,kc) = t1(:,1)
170 dens_can(:,kc) = dens(:,1)
173 dkt_can(:,kc) = dkt(:,1)
174 dku_can(:,kc) = dku(:,1)
177 ws_can(:,kc) = sqrt(u1(:,1)**2+v1(:,1)**2)
180 q1_can(:,kc, 1:ntrac-1) = q1(:,1, 1:ntrac-1)
183 q1_can(:,kc, ntke ) = q1(:,1, ntke )
186 qv_can(:,kc) = q1(:,1, ntqv)
190 end subroutine canopy_levs_init
194 subroutine canopy_levs_run(im, km, nkc, nkt, &
195 ntrac, ntqv, ntke, & ! in
196 RDGAS, PI, & ! in ?? units ??
197 zi, zl, zm, & ! in: 1D zm(i,k) = zi(i,k+1)
200 garea, u10m, v10m, fm,fh, &
209 zmom_can3, zmid_can3, &
210 sigmom_can, sigmid_can, &
212 prsl_can, prsi_can, &
213 dv_can, du_can, tdt_can, rtg_can, &
214 t1_can, qv_can, dens_can, &
215 ws_can, dkt_can, dku_can, &
219 use machine ,
only : kind_phys
227 integer,
intent(in) :: im, km, nkc, nkt, ntrac, ntqv, ntke
228 real(kind=kind_phys),
intent(in) :: rdgas, pi
230 real(kind=kind_phys),
intent(in) :: zi(im,km+1), zl(im,km), &
232 prsi(im,km+1), prsl(im,km)
233 real(kind=kind_phys),
intent(in) :: dv(im,km), du(im,km), &
234 tdt(im,km), rtg(im,km,ntrac)
236 real(kind=kind_phys),
intent(in) :: u1(im,km), v1(im,km), t1(im,km)
237 real(kind=kind_phys),
intent(in) :: dens(im,km), dkt(im,km), dku(im,km)
239 real(kind=kind_phys),
intent(in) :: psfc(im)
240 real(kind=kind_phys),
intent(in) :: cfch(im), garea(im), u10m(im), v10m(im), &
241 spd1(im),stress(im), &
242 t2m(im), q2m(im), fm(im), fh(im), &
246 real(kind=kind_phys),
intent(in) :: q1(im, km, ntrac)
248 real(kind=kind_phys),
intent(in) :: frt_mask(im)
250 integer,
intent(out) :: kmod (im, km) , kcan3 (im, nkc)
252 real(kind=kind_phys),
intent(out) :: &
258 rtg_can(im, km, ntrac) , &
265 prsl_can(im, nkt) , &
266 prsi_can(im, nkt+1) , &
267 dens_can(im, nkt) , &
271 q1_can(im, nkt, ntrac) , &
274 zmom_can3(im, nkt+1) , &
275 zmid_can3(im, nkt) , &
276 sigmom_can(im, nkt+1) , &
279 character(len=*),
intent(out) :: errmsg
280 integer,
intent(out) :: errflg
284 integer(kind=4) :: kcan_top
285 real (kind=kind_phys) :: hcan
287 logical :: sfcflg(im)
289 integer(kind=4) :: ka (im) , &
292 real(kind=kind_phys) :: zmid3(km) , &
298 ta_can3(nkt), ta3(km) , &
299 qv_can3(nkt), qv3(km) , &
300 ws_can3(nkt), ws3(km) , &
301 dkt_can3(nkt), dkt3(km) , &
302 dku_can3(nkt), dku3(km) , &
303 prsl_can3(nkt), prsl3(km) , &
304 prsi_can3(nkt+1), prsi3(km+1), &
305 dens_can3(nkt), dens3(km) , &
309 real(kind=kind_phys) :: &
310 dxdy(im), ustar(im), &
313 safe_inv_mo_length(im)
319 logical(kind=4) :: flag_error
320 integer(kind=4) :: k, kk, kc, k2, II, npass
322 real(kind=kind_phys) :: tmp
323 real(kind=kind_phys) :: hol, a1, b1, c1, rat
327 real(kind=kind_phys),
parameter :: del = 0.2
328 real(kind=kind_phys),
parameter :: min_kt = 0.1
329 real(kind=kind_phys),
parameter :: zfmin=1.e-8
330 real(kind=kind_phys),
parameter :: rimin=-100.
331 real(kind=kind_phys),
parameter :: karman=0.4
332 real(kind=kind_phys),
parameter :: threshold = 1.e06
333 real(kind=kind_phys),
parameter :: epsilon = 1.e-10
335 real(kind=kind_phys) :: zm2, zr, td, hd, ddel
336 real(kind=kind_phys) :: uh, uspr, wndr, sigw, tl, ktr, kur
339 real(kind=kind_phys),
dimension(3),
parameter :: can_frac = (/1.0, 0.5, 0.2/)
341 logical(kind=4) :: local_dbg
347 local_dbg = (.false.)
355 q1_2m(:, :) = q1(:,1,:)
364 du_can(:,kc) = du(:,k)
365 dv_can(:,kc) = dv(:,k)
366 tdt_can(:,kc) = tdt(:,k)
368 rtg_can(:,kc, 1:ntrac-1) = rtg(:,k, 1:ntrac-1)
369 rtg_can(:,kc, ntke ) = rtg(:,k, ntke )
380 prsl_can(:,kc) = prsl(:,k)
381 prsi_can(:,kc) = prsi(:,k)
382 t1_can(:,kc) = t1(:,k)
383 dens_can(:,kc) = dens(:,k)
386 dkt_can(:,kc) = dkt(:,k)
387 dku_can(:,kc) = dku(:,k)
390 ws_can(:,kc) = sqrt(u1(:,k)**2+v1(:,k)**2)
393 q1_can(:,kc, 1:ntrac-1) = q1(:,k, 1:ntrac-1)
396 q1_can(:,kc, ntke ) = q1(:,k, ntke )
399 qv_can(:,kc) = q1(:,k, ntqv)
402 prsi_can(:,nkt+1 ) = prsi(:,km+1)
407 du_can(:,kc) = du(:,1)
408 dv_can(:,kc) = dv(:,1)
409 tdt_can(:,kc) = tdt(:,1)
411 rtg_can(:,kc, 1:ntrac-1) = rtg(:,1, 1:ntrac-1)
412 rtg_can(:,kc, ntke ) = rtg(:,1, ntke )
414 prsl_can(:,kc) = prsl(:,1)
415 prsi_can(:,kc) = prsi(:,1)
416 t1_can(:,kc) = t1(:,1)
417 dens_can(:,kc) = dens(:,1)
419 dkt_can(:,kc) = dkt(:,1)
420 dku_can(:,kc) = dku(:,1)
421 ws_can(:,kc) = sqrt(u1(:,1)**2+v1(:,1)**2)
424 q1_can(:,kc, 1:ntrac-1) = q1(:,1, 1:ntrac-1)
427 q1_can(:,kc, ntke ) = q1(:,1, ntke )
430 qv_can(:,kc) = q1(:,1, ntqv)
438 if(rbsoil(i) > 0.) sfcflg(i) = .false.
442 ustar(i) = sqrt(stress(i))
454 zol(i) = max(rbsoil(i)*fm(i)*fm(i)/fh(i),rimin)
456 zol(i) = min(zol(i),-zfmin)
458 zol(i) = max(zol(i),zfmin)
464 IF (frt_mask(i) <= 0.)
THEN
478 prsl3(ii) = prsl(i,k)
479 dens3(ii) = dens(i,k)
480 ws3(ii) = sqrt(u1(i,k)**2+v1(i,k)**2)
486 ii = (km + 1) + 1 - k
488 prsi3(ii) = prsi(i,k)
490 sigmom3(ii) = prsi(i, k) / psfc(i)
499 sigmom_can(i, kk) = sigmom3(k)
503 prsl_can3(kk) = prsl3(k)
504 prsi_can3(kk) = prsi3(k)
505 dens_can3(kk) = dens3(k)
507 dkt_can3(kk) = dkt3(k)
508 dku_can3(kk) = dku3(k)
518 sigmom_can(i, kk) = sigmom3(km)
520 ta_can3(kk) = ta3(km)
521 qv_can3(kk) = qv3(km)
522 prsl_can3(kk) = prsl3(km)
523 prsi_can3(kk) = prsi3(km)
524 dens_can3(kk) = dens3(km)
525 ws_can3(kk) = ws3(km)
526 dkt_can3(kk) = dkt3(km)
527 dku_can3(kk) = dku3(km)
530 prsi_can3( nkt+1) = prsi3(km+1)
531 sigmom_can(i, nkt+1) = 1.0
536 ELSE IF (frt_mask(i) > 0.)
THEN
544 zcan3(kc) = hcan * can_frac(kc)
569 sigmid2(ii) = prsl(i,k)/ psfc(i)
586 prsl3(ii) = prsl(i,k)
587 dens3(ii) = dens(i,k)
588 ws3(ii) = sqrt(u1(i,k)**2+v1(i,k)**2)
595 mol3(ii) = zol(i)/zl(i,k)
599 ii = (km + 1) + 1 - k
601 prsi3(ii) = prsi(i,k)
603 sigmom3(ii) = prsi(i, k)/ psfc(i)
615 if (zmid3(l) > hcan)
then
626 safe_inv_mo_length(i) = ilmo(i)
627 if (abs(ilmo(i)) > threshold)
then
628 safe_inv_mo_length(i) = sign(threshold, ilmo(i))
638 if (abs(zmid3(k) - zcan3(kc)) < del)
then
639 ddel = max(0.0, del - abs(zcan3(kc) - zmid3(k)))
640 zcan3(kc) = zcan3(kc) + sign(ddel, zcan3(kc) - zmid3(k))
664 zmid_can3(i,k) = zmid3(k)
671 zmid_can3(i,km+kc) = zcan3(kc)
682 if (zmid_can3(i, km) < zmid_can3(i,km+1))
then
696 if (zmid_can3(i, k) > zmid_can3(i, k-1))
then
698 tmp = zmid_can3(i, k-1)
699 zmid_can3(i, k-1) = zmid_can3(i,k)
700 zmid_can3(i, k) = tmp
706 write(errmsg,fmt=
'(*(a))')
'NKC+1 passes insufficient to sort canopy array ' // &
707 'in canopy_levs.F90. Scream and die.'
724 if (zmid_can3(i, kk) == zcan3(kc))
then
739 if (zmid_can3(i, kk) == zmid3(k))
then
752 if (kcan3(i,kc) < 1)
then
755 write(errmsg,*)
'canopy_levs: kcan undefined: ', kc, kcan3(i,kc)
761 if (kmod(i,k) < 1)
then
764 write(errmsg,*)
'cannopy_levs: kmod undefined: ',k, kmod(i,k)
787 do k = 1, kcan_top - 1
790 zmom_can3(i,k) = zmom3(k)
794 inner0:
do k = kcan_top, km-1
799 if (zmid_can3(i,k) == zmid3(k) .and. zmid_can3(i,k+1) == zmid3(k+1))
then
802 zmom_can3(i,k) = zmom3(k)
815 zmom_can3(i,ka(i)) = zmom3(ka(i))
817 zmom_can3(i,k) = (zmid_can3(i,k-1) + zmid_can3(i,k)) * 0.5
826 sigmid_can(:,:) = 0.0
837 sigmid_can(i, kk) = sigmid2(k)
845 do k2 = kcan_top, km+1
846 if (zcan3(kc) > z2(k2) .and. zcan3(kc) <= z2(k2-1))
then
849 sigmid_can(i, kcan3(i,kc)) = sigmid2(k2-1) + &
850 (sigmid2(k2) - sigmid2(k2-1)) / &
851 ( z2(k2) - z2(k2-1)) * &
852 (zcan3(kc) - z2(k2-1))
860 if (klower_can(kc) < 1)
then
863 write(errmsg,*)
'canopy_levs: klower_can is unassigned at i, kc: ', i, kc
864 write(errmsg,*)
'canopy_levs: zcan3(kc): ',zcan3(kc)
866 do kk = kcan_top, km+1
867 write(errmsg,*)
'canopy_levs: kk z2(kk) which should bracket the above zcan3: ',kk, z2(kk)
870 write(errmsg,*)
'canopy_levs: kk z2(kk) full set of z2 values: ', kk, z2(kk)
873 write(errmsg,*)
'canopy_levs: kc zcan3(kc) hcan fr(kc) for full set of zcan3 values: ',kk, zcan3(kk), hcan, can_frac(kk)
888 if ((klower_can(kc) /= klower_can(kc)) .or. &
889 (klower_can(kc) <= 0) .or. &
890 (klower_can(kc) > km+ 1) )
then
912 inner2:
do k = 1, km-1
913 if (sigmid_can(i, k) == sigmid2(k) .and. sigmid_can(i, k+1) == sigmid2(k+1) )
then
914 sigmom_can(i, k) = sigmom3(k)
921 sigmom_can(i, ka(i)) = sigmom3(ka(i))
923 sigmom_can(i, k) = (sigmid_can(i, k-1) + sigmid_can(i, k)) * 0.5
925 sigmom_can(i, nkt+1) = 1.0
940 prsl_can3(kk) = prsl3(k)
941 prsi_can3(kk) = prsi3(k)
942 dens_can3(kk) = dens3(k)
944 dkt_can3(kk) = dkt3(k)
945 dku_can3(kk) = dku3(k)
963 if (klower_can(kc) <= km)
then
967 zm2 = (zcan3(kc) - z2(k2-1)) / (z2(k2) - z2(k2-1))
970 td = ( ta3(k2) - ta3(k2-1)) * zm2
971 hd = ( qv3(k2) - qv3(k2-1)) * zm2
972 ta_can3(kk) = ta3(k2-1) + td
973 qv_can3(kk) = qv3(k2-1) + hd
978 if (zcan3(kc) - z2(km+1) >= 2.0)
then
981 zm2 = (zcan3(kc) - z2(km+1) - 2.0) / (z2(km) - z2(km+1) - 2.0)
984 td = (ta3(km) - t2m( i ) ) * zm2
985 hd = (qv3(km) - q2m( i ) ) * zm2
986 ta_can3(kk) = t2m( i ) + td
987 qv_can3(kk) = q2m( i ) + hd
992 ta_can3(kk) = t2m( i )
993 qv_can3(kk) = q2m( i )
1005 prsl_can3(kk) = sigmid_can(i, kk) * psfc(i)
1006 prsi_can3(kk) = sigmom_can(i, kk) * psfc(i)
1014 dens_can3(kk) = prsl_can3(kk) / ( rdgas * ta_can3(kk))
1039 prsi_can3(nkt+1) = prsi3(km+1)
1044 if ( ta_can3(kk) < 150.0)
then
1045 write(errmsg,*)
'canopy_levs: suspicious temperature detected in canopy_levs after creation (kk value): ',&
1050 write(errmsg,*)
'canopy_levs: value of zcan(kc) z2(km+1) and difference at this value of ic for kk: ',&
1051 kc,
' are: ',zcan3(kc),z2(km+1), zcan3(kc)-z2(km+1)
1055 write(errmsg,*)
'canopy_levs: value of zmid_can for = ', i,
' at k = ',k,
' is: ',zmid_can3(i,k)
1059 write(errmsg,*)
'canopy_levs: values of kcan zcan and original zcan for = ', i,
' at kc = ',kc,
' are: ',&
1060 kcan3(i,kc), zcan3(kc), hcan * can_frac(kc)
1064 write(errmsg,*)
'canopy_levs: value of kmod and z for = ', i,
' at k = ',k,
' are: ',kmod(i,k), zmid3(k)
1068 write(errmsg,*)
'canopy_levs: value of klower_can at this grid point for kc: ',kc,
' is: ',klower_can(kc)
1082 zr = (zmid3(km) - z2(km+1)) / hcan
1101 uspr = ustar(i) / karman * &
1102 log((zmid3(km) - z2(km+1) - 0.75 * hcan) / &
1107 uspr = uh * exp(- 2.0 * ( 1.0 - zr))
1112 wndr = spd1(i) / uspr
1116 zr = (zcan3(kc) - z2(km+1)) / hcan
1118 uspr = log((zcan3(kc) - z2(km+1) - 0.75 * hcan) / &
1119 (0.07530 * hcan)) * ustar(i)
1121 uspr = uh * exp(- 2.0 * (1.0 - (zcan3(kc) - z2(km+1)) / hcan))
1124 ws_can3(kk) = wndr * uspr
1128 zr = (zmid3(km) - z2(km+1)) / hcan
1132 hol = hcan * safe_inv_mo_length(i)
1140 if(hol >= -0.1 .and. hol < 0.1)
then
1146 if(hol >= 0.1 .and. hol < 0.9)
then
1147 rat = 4.375 - 3.75 * hol
1148 a1 = 0.125 * rat + 0.125
1149 b1 = 0.125 * rat - 0.125
1155 if(hol >= 0.9 .or. dkt3(km) <= min_kt)
then
1168 sigw = ustar(i) * 0.25
1171 sigw = ustar(i) * ( a1 + b1 * cos(pi / 1.06818 * &
1172 (1.25 - (zmid3(km) - z2(km+1)) / hcan)))
1174 sigw = ustar(i) * c1
1179 tl = hcan / ustar(i) * &
1180 (0.256 * ((zmid3(km) - z2(km+1) - 0.75 * hcan) / hcan) + &
1181 0.492 * exp(-(0.256 * ((zmid3(km) - z2(km+1)) / hcan) / 0.492)))
1185 ktr = dkt3(km) / (sigw * sigw * tl)
1186 kur = dku3(km) / (sigw * sigw * tl)
1194 zr = (zcan3(kc) - z2(km+1)) / hcan
1204 sigw = ustar(i) * 0.25
1207 sigw = ustar(i) * ( a1 + b1 * cos(pi / 1.06818 * &
1208 (1.25 - (zcan3(kc) - z2(km+1))/hcan)))
1210 sigw = ustar(i) * c1
1215 tl = hcan / ustar(i) * &
1216 (0.256 * ( (zcan3(kc) - z2(km+1) - 0.75 * hcan) / hcan) + &
1217 (0.492 * exp(-(0.256 * (zcan3(kc) - z2(km+1)) / hcan) / 0.492) ) )
1219 dkt_can3(kk) = (sigw * sigw * tl) * ktr
1220 dku_can3(kk) = (sigw * sigw * tl) * kur
1227 if (kcan3(i, kc) == 0)
then
1228 write(errmsg,fmt=
'(*(a,i0,a,i0))')
'kcan zero inside canopy_levs at i=', i,
' kc=', kc
1245 zl_can(i,ii) = zmid_can3(i, k)
1246 zm_can(i,ii) = zmom_can3(i, k)
1247 prsl_can(i,ii) = prsl_can3(k)
1249 t1_can(i,ii) = ta_can3(k)
1250 qv_can(i,ii) = qv_can3(k)
1251 dens_can(i,ii) = dens_can3(k)
1252 ws_can(i,ii) = ws_can3(k)
1253 dkt_can(i,ii) = dkt_can3(k)
1254 dku_can(i,ii) = dku_can3(k)
1260 ii = (nkt+1) + 1 - k
1271 prsi_can(i,ii) = prsi_can3(k)
1283 end subroutine canopy_levs_run
1285 end module canopy_levs_mod