File: C:\NOAA\NEMS_11731\src\atmos\phys\sfc_sice.f
1
2 subroutine sfc_sice &
3
4
5 ( im, km, ps, u1, v1, t1, q1, delt, &
6 & sfcemis, dlwflx, sfcnsw, sfcdsw, srflag, &
7 & cm, ch, prsl1, prslki, slimsk, ddvel, &
8 & flag_iter, mom4ice, lsm, lprnt,ipr, &
9
10 , fice, tice, weasd, tskin, tprcp, stc, ep, &
11
12 , qsurf, snowmt, gflux, cmm, chh, evap, hflx &
13 & )
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 use machine , only : kind_phys
96 use funcphys, only : fpvs
97 use physcons, only : sbc => con_sbc, hvap => con_hvap, &
98 & tgice => con_tice, cp => con_cp, &
99 & eps => con_eps, epsm1 => con_epsm1, &
100 & grav => con_g, rvrdm1 => con_fvirt, &
101 & t0c => con_t0c, rd => con_rd
102
103 implicit none
104
105
106 integer, parameter :: kmi = 2
107 real(kind=kind_phys), parameter :: cpinv = 1.0/cp
108 real(kind=kind_phys), parameter :: hvapi = 1.0/hvap
109 real(kind=kind_phys), parameter :: elocp = hvap/cp
110 real(kind=kind_phys), parameter :: himax = 8.0
111 real(kind=kind_phys), parameter :: himin = 0.1
112 real(kind=kind_phys), parameter :: hsmax = 2.0
113 real(kind=kind_phys), parameter :: timin = 173.0
114 real(kind=kind_phys), parameter :: albfw = 0.06
115 real(kind=kind_phys), parameter :: dsi = 1.0/0.33
116
117
118 integer, intent(in) :: im, km, lsm, ipr
119 logical, intent(in) :: lprnt
120
121 real (kind=kind_phys), dimension(im), intent(in) :: ps, u1, v1, &
122 & t1, q1, sfcemis, dlwflx, sfcnsw, sfcdsw, srflag, cm, ch, &
123 & prsl1, prslki, slimsk, ddvel
124
125 real (kind=kind_phys), intent(in) :: delt
126
127 logical, intent(in) :: flag_iter(im), mom4ice
128
129
130 real (kind=kind_phys), dimension(im), intent(inout) :: hice, &
131 & fice, tice, weasd, tskin, tprcp, ep
132
133 real (kind=kind_phys), dimension(im,km), intent(inout) :: stc
134
135
136 real (kind=kind_phys), dimension(im), intent(out) :: snwdph, &
137 & qsurf, snowmt, gflux, cmm, chh, evap, hflx
138
139
140 real (kind=kind_phys), dimension(im) :: ffw, evapi, evapw, &
141 & hflxi, hflxw, sneti, snetw, qssi, qssw, hfd, hfi, hfw, &
142 & focn, snof, hi_save, hs_save, psurf, q0, qs1, rch, rho, &
143 & snowd, theta1, tv1, ps1, wind
144
145 real (kind=kind_phys) :: cimin, t12, t14, tem, stsice(im,kmi)
146
147 integer :: i, k
148
149 logical :: flag(im)
150
151
152
153
154
155 if (mom4ice) then
156 cimin = 0.15
157 else
158 cimin = 0.50
159 endif
160
161
162
163 do i = 1, im
164 flag(i) = (slimsk(i)>=2.0) .and. flag_iter(i)
165 enddo
166
167 if (mom4ice) then
168 do i = 1, im
169 if (flag(i)) then
170 hi_save(i) = hice(i)
171 hs_save(i) = weasd(i) * 0.001
172 endif
173 enddo
174 endif
175
176 do i = 1, im
177 if (flag_iter(i) .and. slimsk(i)<1.5) then
178 hice(i) = 0.0
179 fice(i) = 0.0
180 endif
181 enddo
182
183
184
185 if (.not. mom4ice .and. lsm > 0) then
186 do i = 1, im
187 if (flag(i)) then
188 if (srflag(i) == 1.0) then
189 ep(i) = 0.0
190 weasd(i) = weasd(i) + 1.e3*tprcp(i)
191 tprcp(i) = 0.0
192 endif
193 endif
194 enddo
195 endif
196
197
198
199
200
201
202
203 do i = 1, im
204 if (flag(i)) then
205 psurf(i) = 1000.0 * ps(i)
206 ps1(i) = 1000.0 * prsl1(i)
207
208
209
210
211 (i) = sqrt(u1(i)*u1(i) + v1(i)*v1(i)) &
212 & + max(0.0, min(ddvel(i), 30.0))
213 wind(i) = max(wind(i), 1.0)
214
215 q0(i) = max(q1(i), 1.0e-8)
216
217 (i) = t1(i) * prslki(i)
218 tv1(i) = t1(i) * (1.0 + rvrdm1*q0(i))
219 rho(i) = prsl1(i) / (rd*tv1(i))
220 qs1(i) = fpvs(t1(i))
221 qs1(i) = eps*qs1(i) / (prsl1(i) + epsm1*qs1(i))
222 qs1(i) = max(qs1(i), 1.e-8)
223 q0 (i) = min(qs1(i), q0(i))
224
225 ffw(i) = 1.0 - fice(i)
226 if (fice(i) < cimin) then
227 print *,'warning: ice fraction is low:', fice(i)
228 fice(i) = cimin
229 ffw (i) = 1.0 - fice(i)
230 tice(i) = tgice
231 tskin(i)= tgice
232 print *,'fix ice fraction: reset it to:', fice(i)
233 endif
234
235 qssi(i) = fpvs(tice(i))
236 qssi(i) = eps*qssi(i) / (ps(i) + epsm1*qssi(i))
237 qssw(i) = fpvs(tgice)
238 qssw(i) = eps*qssw(i) / (ps(i) + epsm1*qssw(i))
239
240
241
242 if (mom4ice) then
243 snowd(i) = weasd(i) * 0.001 / fice(i)
244 else
245 snowd(i) = weasd(i) * 0.001
246 endif
247
248
249
250
251
252
253 endif
254 enddo
255
256
257 do i = 1, im
258 if (flag(i)) then
259
260
261
262 (i) = cm(i) * wind(i)
263 chh(i) = rho(i) * ch(i) * wind(i)
264 rch(i) = chh(i) * cp
265
266
267
268 (i) = elocp * rch(i) * (qssi(i) - q0(i))
269 evapw(i) = elocp * rch(i) * (qssw(i) - q0(i))
270
271 endif
272 enddo
273
274
275
276 do k = 1, kmi
277 do i = 1, im
278 if (flag(i)) then
279 stsice(i,k) = stc(i,k)
280 endif
281 enddo
282 enddo
283
284 if (lprnt) write(0,*)' tice=',tice(ipr)
285
286 do i = 1, im
287 if (flag(i)) then
288 snetw(i) = sfcdsw(i) * (1.0 - albfw)
289 snetw(i) = min(3.0*sfcnsw(i)/(1.0+2.0*ffw(i)), snetw(i))
290 sneti(i) = (sfcnsw(i) - ffw(i)*snetw(i)) / fice(i)
291
292 t12 = tice(i) * tice(i)
293 t14 = t12 * t12
294
295
296
297 (i) = -dlwflx(i) + sfcemis(i)*sbc*t14 + evapi(i) &
298 & + rch(i)*(tice(i) - theta1(i))
299 hfd(i) = 4.0*sfcemis(i)*sbc*tice(i)*t12 &
300 & + (1.0 + elocp*eps*hvap*qs1(i)/(rd*t12)) * rch(i)
301
302 t12 = tgice * tgice
303 t14 = t12 * t12
304
305
306
307
308
309
310 (i) = 2.0
311 (i) = 0.0
312
313 (i) = max( min( hice(i), himax ), himin )
314 snowd(i) = min( snowd(i), hsmax )
315
316 if (snowd(i) > (2.0*hice(i))) then
317 print *, 'warning: too much snow :',snowd(i)
318 snowd(i) = 2.0 * hice(i)
319 print *,'fix: decrease snow depth to:',snowd(i)
320 endif
321 endif
322 enddo
323
324 if (lprnt) write(0,*)' tice2=',tice(ipr)
325 call ice3lay
326
327
328
329
330
331 if (lprnt) write(0,*)' tice3=',tice(ipr)
332 if (mom4ice) then
333 do i = 1, im
334 if (flag(i)) then
335 hice(i) = hi_save(i)
336 snowd(i) = hs_save(i)
337 endif
338 enddo
339 endif
340
341 do i = 1, im
342 if (flag(i)) then
343 if (tice(i) < timin) then
344 print *,'warning: snow/ice temperature is too low:',tice(i)
345 &,' i=',i
346 tice(i) = timin
347 print *,'fix snow/ice temperature: reset it to:',tice(i)
348 endif
349
350 if (stsice(i,1) < timin) then
351 print *,'warning: layer 1 ice temp is too low:',stsice(i,1)
352 &,' i=',i
353 stsice(i,1) = timin
354 print *,'fix layer 1 ice temp: reset it to:',stsice(i,1)
355 endif
356
357 if (stsice(i,2) < timin) then
358 print *,'warning: layer 2 ice temp is too low:',stsice(i,2)
359 stsice(i,2) = timin
360 print *,'fix layer 2 ice temp: reset it to:',stsice(i,2)
361 endif
362
363 tskin(i) = tice(i)*fice(i) + tgice*ffw(i)
364 endif
365 enddo
366
367 do k = 1, kmi
368 do i = 1, im
369 if (flag(i)) then
370 stc(i,k) = min(stsice(i,k), t0c)
371 endif
372 enddo
373 enddo
374
375
376
377 do i = 1, im
378 if (flag(i)) then
379 hflxi(i) = rch(i) * (tice(i) - theta1(i))
380 hflxw(i) = rch(i) * (tgice - theta1(i))
381 hflx(i) = fice(i)*hflxi(i) + ffw(i)*hflxw(i)
382 evap(i) = fice(i)*evapi(i) + ffw(i)*evapw(i)
383 endif
384 enddo
385
386
387
388 do i = 1, im
389 if (flag(i)) then
390 qsurf(i) = q1(i) + evap(i) / (elocp*rch(i))
391
392
393
394 (i) = snowd(i) * 1000.0
395 snwdph(i) = weasd(i) * dsi
396 endif
397 enddo
398
399 do i = 1, im
400 if (flag(i)) then
401 tem = 1.0 / rho(i)
402 hflx(i) = hflx(i) * tem * cpinv
403 evap(i) = evap(i) * tem * hvapi
404 endif
405 enddo
406
407 return
408
409
410 contains
411
412
413
414
415 subroutine ice3lay
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478 real (kind=kind_phys), parameter :: ds = 330.0
479 real (kind=kind_phys), parameter :: dw =1000.0
480 real (kind=kind_phys), parameter :: t0c =273.15
481 real (kind=kind_phys), parameter :: ks = 0.31
482 real (kind=kind_phys), parameter :: i0 = 0.3
483 real (kind=kind_phys), parameter :: ki = 2.03
484 real (kind=kind_phys), parameter :: di = 917.0
485 real (kind=kind_phys), parameter :: ci = 2054.0
486 real (kind=kind_phys), parameter :: li = 3.34e5
487 real (kind=kind_phys), parameter :: si = 1.0
488 real (kind=kind_phys), parameter :: mu = 0.054
489 real (kind=kind_phys), parameter :: tfi = -mu*si
490 real (kind=kind_phys), parameter :: tfw = -1.8
491 real (kind=kind_phys), parameter :: tfi0 = tfi-0.0001
492 real (kind=kind_phys), parameter :: dici = di*ci
493 real (kind=kind_phys), parameter :: dili = di*li
494 real (kind=kind_phys), parameter :: dsli = ds*li
495 real (kind=kind_phys), parameter :: ki4 = ki*4.0
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518 real (kind=kind_phys), dimension(im) :: hdi, hsni, a, b, ip, &
519 & a1, b1, c1, a10, b10, k12, k32, h1, h2, dh, f1, tsf, &
520 & tmelt, bmelt
521
522 real (kind=kind_phys) :: dt2, dt4, dt6
523
524 integer :: i
525
526
527
528 = 2.0 * delt
529 dt4 = 4.0 * delt
530 dt6 = 6.0 * delt
531
532 do i = 1, im
533 if (flag(i)) then
534 snowd(i) = snowd(i) * dw / ds
535 hdi(i) = (ds*snowd(i) + di*hice(i)) / dw
536
537 if (hice(i) < hdi(i)) then
538 snowd(i) = snowd(i) + hice(i) - hdi(i)
539 hsni (i) = (hdi(i) - hice(i)) * ds / di
540 hice (i) = hice(i) + hsni(i)
541 endif
542
543 snof(i) = snof(i) * dw / ds
544 tice(i) = tice(i) - t0c
545 stsice(i,1) = min(stsice(i,1)-t0c, tfi0)
546 (i,2) = min(stsice(i,2)-t0c, tfi0)
547
548 (i) = i0 * sneti(i)
549 if (snowd(i) > 0.0) then
550 tsf(i) = 0.0
551 ip (i) = 0.0
552 else
553 tsf(i) = tfi
554 ip (i) = i0 * sneti(i)
555 endif
556 tice(i) = min(tice(i), tsf(i))
557
558
559
560 (i) = hfd(i)
561 a(i) = hfi(i) - sneti(i) + ip(i) - tice(i)*b(i)
562 (i) = ki4*ks / (ks*hice(i) + ki4*snowd(i))
563 k32(i) = 2.0 * ki / hice(i)
564
565 a10(i) = dici*hice(i)/dt2 + k32(i)*(dt4*k32(i) + dici*hice(i))&
566 & / (dt6*k32(i) + dici*hice(i))
567 b10(i) = -di*hice(i) * (ci*stsice(i,1) + li*tfi/stsice(i,1)) &
568 & / dt2 - ip(i) &
569 & - k32(i)*(dt4*k32(i)*tfw + dici*hice(i)*stsice(i,2)) &
570 & / (dt6*k32(i) + dici*hice(i))
571
572 a1(i) = a10(i) + k12(i)*b(i) / (k12(i) + b(i))
573 b1(i) = b10(i) + a(i)*k12(i) / (k12(i) + b(i))
574 c1(i) = dili*tfi / dt2*hice(i)
575
576 stsice(i,1) = -(sqrt(b1(i)*b1(i) - 4.0*a1(i)*c1(i)) &
577 & + b1(i))/(2.0*a1(i))
578 tice(i) = (k12(i)*stsice(i,1) - a(i)) / (k12(i) + b(i))
579
580 if (tice(i) > tsf(i)) then
581 a1(i) = a10(i) + k12(i)
582 b1(i) = b10(i) - k12(i)*tsf(i)
583 stsice(i,1) = -(sqrt(b1(i)*b1(i) - 4.0*a1(i)*c1(i)) &
584 & + b1(i)) / (2.0*a1(i))
585 tice(i) = tsf(i)
586 tmelt(i) = (k12(i)*(stsice(i,1) - tsf(i)) &
587 & - (a(i) + b(i)*tsf(i))) * delt
588 else
589 tmelt(i) = 0.0
590 snowd(i) = snowd(i) + snof(i)*delt
591 endif
592
593 stsice(i,2) = (dt2*k32(i)*(stsice(i,1) + 2.0*tfw) &
594 & + dici*hice(i)*stsice(i,2)) &
595 & / (dt6*k32(i) + dici*hice(i))
596
597 bmelt(i) = (focn(i) + ki4*(stsice(i,2) - tfw)/hice(i)) * delt
598
599
600
601 (i) = 0.5 * hice(i)
602 h2(i) = 0.5 * hice(i)
603
604
605
606 if (tmelt(i) <= snowd(i)*dsli) then
607 snowmt(i) = tmelt(i) / dsli
608 snowd (i) = snowd(i) - tmelt(i)/dsli
609 else
610 snowmt(i) = snowd(i)
611 h1(i) = h1(i) - (tmelt(i) - snowd(i)*dsli) &
612 & / (di * (ci - li/stsice(i,1)) * (tfi - stsice(i,1)))
613 snowd(i) = 0.0
614 endif
615
616
617
618 if (bmelt(i) < 0.0) then
619 dh(i) = -bmelt(i) / (dili + dici*(tfi - tfw))
620 stsice(i,2) = (h2(i)*stsice(i,2) + dh(i)*tfw) &
621 & / (h2(i) + dh(i))
622 h2(i) = h2(i) + dh(i)
623 else
624 h2(i) = h2(i) - bmelt(i) / (dili + dici*(tfi - stsice(i,2)))
625 endif
626
627
628
629 (i) = h1(i) + h2(i)
630
631 if (hice(i) > 0.0) then
632 if (h1(i) > 0.5*hice(i)) then
633 f1(i) = 1.0 - 2.0*h2(i) / hice(i)
634 stsice(i,2) = f1(i) &
635 & * (stsice(i,1) + li*tfi/(ci*stsice(i,1))) &
636 & + (1.0 - f1(i))*stsice(i,2)
637
638 if (stsice(i,2) > tfi) then
639 hice(i) = hice(i) - h2(i)*ci*(stsice(i,2) - tfi) &
640 & / (li*delt)
641 stsice(i,2) = tfi
642 endif
643 else
644 f1(i) = 2.0 * h1(i) / hice(i)
645 stsice(i,1) = f1(i) &
646 & * (stsice(i,1) + li*tfi/(ci*stsice(i,1))) &
647 & + (1.0 - f1(i))*stsice(i,2)
648 stsice(i,1) = (stsice(i,1) - sqrt(stsice(i,1)*stsice(i,1) &
649 & - 4.0*tfi*li/ci)) / 2.0
650 endif
651
652 k12(i) = ki4*ks / (ks*hice(i) + ki4*snowd(i))
653 gflux(i) = k12(i) * (stsice(i,1) - tice(i))
654 else
655 snowd(i) = snowd(i) + (h1(i)*(ci*(stsice(i,1) - tfi) &
656 & - li*(1.0 - tfi/stsice(i,1))) &
657 & + h2(i)*(ci*(stsice(i,2) - tfi) - li)) / li
658
659 hice(i) = max(0.0, snowd(i)*ds/di)
660 snowd(i) = 0.0
661 stsice(i,1) = tfw
662 stsice(i,2) = tfw
663 gflux(i) = 0.0
664 endif
665
666 (i) = fice(i) * gflux(i)
667 snowmt(i) = snowmt(i) * ds / dw
668 snowd(i) = snowd(i) * ds / dw
669 tice(i) = tice(i) + t0c
670 stsice(i,1) = stsice(i,1) + t0c
671 stsice(i,2) = stsice(i,2) + t0c
672 endif
673 enddo
674
675 return
676
677 end subroutine ice3lay
678
679
680
681
682
683
684
685 end subroutine sfc_sice
686
687