28 ( im, hvap, cp, hfus, jcal, eps, epsm1, rvrdm1, rd, rhw0, &
29 pi, tgice, sbc, ps, u1, v1, usfco, vsfco, use_oceanuv, t1, &
30 q1, tref, cm, ch, lseaspray, fm, fm10, &
31 prsl1, prslki, prsik1, prslk1, wet, use_lake_model, xlon, &
33 sfcemis, dlwflx, sfcnsw, rain, timestep, kdt, solhr,xcosz, &
34 wind, flag_iter, flag_guess, nstf_name1, nstf_name4, &
35 nstf_name5, lprnt, ipr, thsfc_loc, &
36 tskin, tsurf, xt, xs, xu, xv, xz, zm, xtts, xzts, dt_cool, &
37 z_c, c_0, c_d, w_0, w_d, d_conv, ifd, qrain, &
38 qsurf, gflux, cmm, chh, evap, hflx, ep, errmsg, errflg &
172 integer,
intent(in) :: im, kdt, ipr, nstf_name1, nstf_name4, nstf_name5
173 logical,
intent(in) :: use_oceanuv
175 real (kind=kind_phys),
intent(in) :: hvap, cp, hfus, jcal, eps, &
176 epsm1, rvrdm1, rd, rhw0, sbc, pi, tgice
177 real (kind=kind_phys),
dimension(:),
intent(in) :: ps, u1, v1, &
178 usfco, vsfco, t1, q1, cm, ch, fm, fm10, &
179 prsl1, prslki, prsik1, prslk1, xlon, xcosz, &
180 sinlat, stress, sfcemis, dlwflx, sfcnsw, rain, wind
181 real (kind=kind_phys),
dimension(:),
intent(in) :: tref
182 real (kind=kind_phys),
intent(in) :: timestep
183 real (kind=kind_phys),
intent(in) :: solhr
186 logical,
intent(in) :: lseaspray
188 logical,
dimension(:),
intent(in) :: flag_iter, flag_guess, wet
189 integer,
dimension(:),
intent(in) :: use_lake_model
190 logical,
intent(in) :: lprnt
191 logical,
intent(in) :: thsfc_loc
195 real (kind=kind_phys),
dimension(:),
intent(inout) :: tskin, &
197 real (kind=kind_phys),
dimension(:),
intent(inout) :: &
198 xt, xs, xu, xv, xz, zm, xtts, xzts, dt_cool, &
199 z_c, c_0, c_d, w_0, w_d, d_conv, ifd, qrain
202 real (kind=kind_phys),
dimension(:),
intent(inout) :: qsurf, gflux, cmm, chh, evap, hflx, ep
204 character(len=*),
intent(out) :: errmsg
205 integer,
intent(out) :: errflg
212 real (kind=kind_phys),
dimension(im) :: q0, qss, rch, rho_a, theta1, tv1, wndmag
214 real(kind=kind_phys) :: elocp,tem,cpinv,hvapi
219 real (kind=kind_phys),
dimension(im) :: xt_old, xs_old, xu_old, xv_old, xz_old, &
220 zm_old,xtts_old, xzts_old, ifd_old, tref_old, tskin_old, dt_cool_old,z_c_old
222 real(kind=kind_phys) :: ulwflx(im), nswsfc(im)
226 real(kind=kind_phys) :: alpha,beta,rho_w,f_nsol,sss,sep, cosa,sina,taux,tauy, &
227 grav,dz,t0,ttop0,ttop
229 real(kind=kind_phys) :: le,fc,dwat,dtmp,wetc,alfac,ustar_a,rich
230 real(kind=kind_phys) :: rnl_ts,hs_ts,hl_ts,rf_ts,q_ts
231 real(kind=kind_phys) :: fw,q_warm
232 real(kind=kind_phys) :: t12,alon,tsea,sstc,dta,dtz
233 real(kind=kind_phys) :: zsea1,zsea2,soltim
238 real (kind=kind_phys) :: f10m, u10m, v10m, ws10, ru10, qss1, &
239 bb1, hflxs, evaps, ptem
244 real (kind=kind_phys),
parameter :: alps=0.75,bets=0.75,gams=0.15, &
245 ws10cr=30., conlf=7.2e-9, consf=6.4e-8
246 real (kind=kind_phys) :: windrel
253 if (nstf_name1 == 0)
return
266 flag(i) = wet(i) .and. flag_iter(i) .and. use_lake_model(i)/=1
267 do_nst = do_nst .or. flag(i)
269 if (.not. do_nst)
return
275 if(wet(i) .and. flag_guess(i) .and. use_lake_model(i)/=1)
then
282 xtts_old(i) = xtts(i)
283 xzts_old(i) = xzts(i)
285 tskin_old(i) = tskin(i)
286 dt_cool_old(i) = dt_cool(i)
300 nswsfc(i) = sfcnsw(i)
301 wndmag(i) = sqrt(u1(i)*u1(i) + v1(i)*v1(i))
303 q0(i) = max(q1(i), 1.0e-8_kp)
306 theta1(i) = t1(i) * prslki(i)
308 theta1(i) = t1(i) / prslk1(i)
311 tv1(i) = t1(i) * (one + rvrdm1*q0(i))
312 rho_a(i) = prsl1(i) / (rd*tv1(i))
313 qss(i) = fpvs(tsurf(i))
314 qss(i) = eps*qss(i) / (ps(i) + epsm1*qss(i))
323 if (use_oceanuv)
then
324 windrel= sqrt( (u1(i)-usfco(i))**2 + (v1(i)-vsfco(i))**2 )
325 rch(i) = rho_a(i) * cp * ch(i) * windrel
326 cmm(i) = cm(i) * windrel
327 chh(i) = rho_a(i) * ch(i) * windrel
329 rch(i) = rho_a(i) * cp * ch(i) * wind(i)
330 cmm(i) = cm(i) * wind(i)
331 chh(i) = rho_a(i) * ch(i) * wind(i)
336 evap(i) = elocp * rch(i) * (qss(i) - q0(i))
340 hflx(i) = rch(i) * (tsurf(i) - theta1(i))
342 hflx(i) = rch(i) * (tsurf(i)/prsik1(i) - theta1(i))
353 zsea1 = 0.001_kp*real(nstf_name4)
354 zsea2 = 0.001_kp*real(nstf_name5)
363 ulwflx(i) = sfcemis(i) * sbc * t12 * t12
364 alon = xlon(i)*rad2deg
365 grav =
grv(sinlat(i))
366 soltim = mod(alon/15.0_kp + solhr, 24.0_kp)*3600.0_kp
368 call rhocoef(tsea,sss,rho_w,alpha,beta)
372 le = (2.501_kp-0.00237_kp*tsea)*1.0e6_kp
373 dwat = 2.11e-5_kp*(t1(i)/t0k)**1.94_kp
374 dtmp = (one+3.309e-3_kp*(t1(i)-t0k)-1.44e-6_kp*(t1(i)-t0k) &
375 * (t1(i)-t0k))*0.02411_kp/(rho_a(i)*cp)
376 wetc = 622.0_kp*le*qss(i)/(rd*t1(i)*t1(i))
377 alfac = one / (one + (wetc*le*dwat)/(cp*dtmp))
378 tem = (1.0e3_kp * rain(i) / rho_w) * alfac * cp_w
379 qrain(i) = tem * (tsea-t1(i)+1.0e3_kp*(qss(i)-q0(i))*le/cp)
383 f_nsol = hflx(i) + evap(i) + ulwflx(i) - dlwflx(i) + omg_sh*qrain(i)
389 sep = sss*(evap(i)/le-rain(i))/rho_w
390 ustar_a = sqrt(stress(i)/rho_a(i))
394 rnl_ts = 4.0_kp*sfcemis(i)*sbc*tsea*tsea*tsea
396 hl_ts = rch(i)*elocp*eps*hvap*qss(i)/(rd*t12)
397 rf_ts = tem * (one+rch(i)*hl_ts)
398 q_ts = rnl_ts + hs_ts + hl_ts + omg_sh*rf_ts
404 call cool_skin(ustar_a,f_nsol,nswsfc(i),evap(i),sss,alpha,beta, &
405 rho_w,rho_a(i),tsea,q_ts,hl_ts,grav,le, &
406 dt_cool(i),z_c(i),c_0(i),c_d(i))
408 tem = one / wndmag(i)
411 taux = max(stress(i),tau_min)*cosa
412 tauy = max(stress(i),tau_min)*sina
413 fc = const_rot*sinlat(i)
417 if ( (soltim > solar_time_6am .and. ifd(i) == zero) )
then
426 if ( f_nsol > zero .and. xt(i) > zero )
then
427 call convdepth(kdt,timestep,nswsfc(i),f_nsol,sss,sep,rho_w, &
428 alpha,beta,xt(i),xs(i),xz(i),d_conv(i))
450 call dtm_1p(kdt,timestep,rich,taux,tauy,nswsfc(i), &
451 f_nsol,sss,sep,q_ts,hl_ts,rho_w,alpha,beta,alon, &
452 sinlat(i),soltim,grav,le,d_conv(i), &
453 xt(i),xs(i),xu(i),xv(i),xz(i),xzts(i),xtts(i))
458 if ( xt(i) > zero )
then
462 if ( xz(i) >= z_w_max )
then
465 call dtl_reset(xt(i),xs(i),xu(i),xv(i),xz(i),xtts(i), xzts(i))
472 if ( d_conv(i) > zero .and. xt(i) > zero )
then
477 call dtm_1p_fca(d_conv(i),xt(i),xtts(i),xz(i),xzts(i))
478 if ( xz(i) >= z_w_max )
then
479 call dtl_reset (xt(i),xs(i),xu(i),xv(i),xz(i),xzts(i),xtts(i))
486 dz = min(xz(i),max(d_conv(i),delz))
492 q_warm = fw*nswsfc(i)-f_nsol
496 if ( q_warm > zero )
then
497 call cal_ttop(kdt,timestep,q_warm,rho_w,dz, xt(i),xz(i),ttop0)
504 ttop = ((xt(i)+xt(i))/xz(i))*(one-dz/((xz(i)+xz(i))))
511 if ( ttop > ttop0 )
then
512 call dtm_1p_tla(dz,ttop0,xt(i),xtts(i),xz(i),xzts(i))
516 if ( xz(i) >= z_w_max )
then
517 call dtl_reset (xt(i),xs(i),xu(i),xv(i),xz(i),xzts(i),xtts(i))
526 t0 = (xt(i)+xt(i))/xz(i)
527 if ( t0 > tw_max )
then
529 if ( xz(i) >= z_w_max )
then
530 call dtl_reset (xt(i),xs(i),xu(i),xv(i),xz(i),xzts(i),xtts(i))
538 sstc = tref(i) + (xt(i)+xt(i))/xz(i) - dt_cool(i)
540 if ( sstc > sst_max )
then
542 call dtm_1p_mta(dta,xt(i),xtts(i),xz(i),xzts(i))
545 if ( xz(i) >= z_w_max )
then
546 call dtl_reset (xt(i),xs(i),xu(i),xv(i),xz(i),xzts(i),xtts(i))
552 if ( abs(soltim) < 2.0_kp*timestep )
then
553 call dtl_reset (xt(i),xs(i),xu(i),xv(i),xz(i),xzts(i),xtts(i))
562 call get_dtzm_point(xt(i),xz(i),dt_cool(i),z_c(i), zsea1,zsea2,dtz)
563 tsurf(i) = max(tgice, tref(i) + dtz )
569 if ( xt(i) > zero )
then
570 call cal_w(kdt,xz(i),xt(i),xzts(i),xtts(i),w_0(i),w_d(i))
592 if (wet(i) .and. use_lake_model(i)/=1)
then
593 if (flag_guess(i))
then
600 xtts(i) = xtts_old(i)
601 xzts(i) = xzts_old(i)
603 tskin(i) = tskin_old(i)
604 dt_cool(i) = dt_cool_old(i)
611 if ( nstf_name1 > 1 )
then
620 if ( nstf_name1 > 1 )
then
625 qss(i) = fpvs( tskin(i) )
626 qss(i) = eps*qss(i) / (ps(i) + epsm1*qss(i))
628 evap(i) = elocp*rch(i) * (qss(i) - q0(i))
631 hflx(i) = rch(i) * (tskin(i) - theta1(i))
633 hflx(i) = rch(i) * (tskin(i)/prsik1(i) - theta1(i))
643 if(lseaspray .and. flag(i))
then
644 f10m = fm10(i) / fm(i)
647 ws10 = sqrt(u10m*u10m + v10m*v10m)
649 ws10 = min(ws10,ws10cr)
650 tem = .015 * ws10 * ws10
651 ru10 = 1. - .087 * log(10./tem)
653 qss1 = eps * qss1 / (prsl1(i) + epsm1 * qss1)
654 tem = rd * cp * t1(i) * t1(i)
655 tem = 1. + eps * hvap * hvap * qss1 / tem
657 evaps = conlf * (ws10**5.4) * ru10 * bb1
658 evaps = evaps * rho_a(i) * hvap * (qss1 - q0(i))
659 evap(i) = evap(i) + alps * evaps
660 hflxs = consf * (ws10**3.4) * ru10
661 hflxs = hflxs * rho_a(i) * cp * (tskin(i) - t1(i))
663 hflx(i) = hflx(i) + bets * hflxs - ptem * evaps
670 hflx(i) = hflx(i) * tem * cpinv
671 evap(i) = evap(i) * tem * hvapi
subroutine sfc_nst_run(im, hvap, cp, hfus, jcal, eps, epsm1, rvrdm1, rd, rhw0, pi, tgice, sbc, ps, u1, v1, usfco, vsfco, use_oceanuv, t1, q1, tref, cm, ch, lseaspray, fm, fm10, prsl1, prslki, prsik1, prslk1, wet, use_lake_model, xlon, sinlat, stress, sfcemis, dlwflx, sfcnsw, rain, timestep, kdt, solhr, xcosz, wind, flag_iter, flag_guess, nstf_name1, nstf_name4, nstf_name5, lprnt, ipr, thsfc_loc, tskin, tsurf, xt, xs, xu, xv, xz, zm, xtts, xzts, dt_cool, z_c, c_0, c_d, w_0, w_d, d_conv, ifd, qrain, qsurf, gflux, cmm, chh, evap, hflx, ep, errmsg, errflg)