PageRenderTime 68ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/phys/module_sf_gfs.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1767 lines | 1103 code | 59 blank | 605 comment | 7 complexity | 14ab5460849b4731c1df6fb8bf02c89f MD5 | raw file
Possible License(s): AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. !!WRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_sf_gfs
  4. CONTAINS
  5. !-------------------------------------------------------------------
  6. SUBROUTINE SF_GFS(U3D,V3D,T3D,QV3D,P3D, &
  7. CP,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  8. ZNT,UST,PSIM,PSIH, &
  9. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, &
  10. QGH,QSFC,U10,V10, &
  11. GZ1OZ0,WSPD,BR,ISFFLX, &
  12. EP1,EP2,KARMAN,itimestep, &
  13. ids,ide, jds,jde, kds,kde, &
  14. ims,ime, jms,jme, kms,kme, &
  15. its,ite, jts,jte, kts,kte )
  16. !-------------------------------------------------------------------
  17. USE MODULE_GFS_MACHINE, ONLY : kind_phys
  18. USE MODULE_GFS_FUNCPHYS , ONLY : gfuncphys,fpvs
  19. !-------------------------------------------------------------------
  20. IMPLICIT NONE
  21. !-------------------------------------------------------------------
  22. !-- U3D 3D u-velocity interpolated to theta points (m/s)
  23. !-- V3D 3D v-velocity interpolated to theta points (m/s)
  24. !-- T3D temperature (K)
  25. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  26. !-- P3D 3D pressure (Pa)
  27. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  28. !-- ROVCP R/CP
  29. !-- R gas constant for dry air (J/kg/K)
  30. !-- XLV latent heat of vaporization for water (J/kg)
  31. !-- PSFC surface pressure (Pa)
  32. !-- ZNT roughness length (m)
  33. !-- UST u* in similarity theory (m/s)
  34. !-- PSIM similarity stability function for momentum
  35. !-- PSIH similarity stability function for heat
  36. !-- XLAND land mask (1 for land, 2 for water)
  37. !-- HFX upward heat flux at the surface (W/m^2)
  38. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  39. !-- LH net upward latent heat flux at surface (W/m^2)
  40. !-- TSK surface temperature (K)
  41. !-- FLHC exchange coefficient for heat (m/s)
  42. !-- FLQC exchange coefficient for moisture (m/s)
  43. !-- QGH lowest-level saturated mixing ratio
  44. !-- U10 diagnostic 10m u wind
  45. !-- V10 diagnostic 10m v wind
  46. !-- GZ1OZ0 log(z/z0) where z0 is roughness length
  47. !-- WSPD wind speed at lowest model level (m/s)
  48. !-- BR bulk Richardson number in surface layer
  49. !-- ISFFLX isfflx=1 for surface heat and moisture fluxes
  50. !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
  51. !-- KARMAN Von Karman constant
  52. !-- ids start index for i in domain
  53. !-- ide end index for i in domain
  54. !-- jds start index for j in domain
  55. !-- jde end index for j in domain
  56. !-- kds start index for k in domain
  57. !-- kde end index for k in domain
  58. !-- ims start index for i in memory
  59. !-- ime end index for i in memory
  60. !-- jms start index for j in memory
  61. !-- jme end index for j in memory
  62. !-- kms start index for k in memory
  63. !-- kme end index for k in memory
  64. !-- its start index for i in tile
  65. !-- ite end index for i in tile
  66. !-- jts start index for j in tile
  67. !-- jte end index for j in tile
  68. !-- kts start index for k in tile
  69. !-- kte end index for k in tile
  70. !-------------------------------------------------------------------
  71. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  72. ims,ime, jms,jme, kms,kme, &
  73. its,ite, jts,jte, kts,kte, &
  74. ISFFLX,itimestep
  75. REAL, INTENT(IN) :: &
  76. CP, &
  77. EP1, &
  78. EP2, &
  79. KARMAN, &
  80. R, &
  81. ROVCP, &
  82. XLV
  83. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
  84. P3D, &
  85. QV3D, &
  86. T3D, &
  87. U3D, &
  88. V3D
  89. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
  90. TSK, &
  91. PSFC, &
  92. XLAND
  93. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
  94. UST, &
  95. ZNT
  96. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
  97. BR, &
  98. CHS, &
  99. CHS2, &
  100. CPM, &
  101. CQS2, &
  102. FLHC, &
  103. FLQC, &
  104. GZ1OZ0, &
  105. HFX, &
  106. LH, &
  107. PSIM, &
  108. PSIH, &
  109. QFX, &
  110. QGH, &
  111. QSFC, &
  112. U10, &
  113. V10, &
  114. WSPD
  115. !--------------------------- LOCAL VARS ------------------------------
  116. REAL :: ESAT
  117. REAL (kind=kind_phys) :: &
  118. RHOX
  119. REAL (kind=kind_phys), DIMENSION(its:ite) :: &
  120. CH, &
  121. CM, &
  122. DDVEL, &
  123. DRAIN, &
  124. EP, &
  125. EVAP, &
  126. FH, &
  127. FH2, &
  128. FM, &
  129. HFLX, &
  130. PH, &
  131. PM, &
  132. PRSL1, &
  133. PRSLKI, &
  134. PS, &
  135. Q1, &
  136. Q2M, &
  137. QSS, &
  138. QSURF, &
  139. RB, &
  140. RCL, &
  141. RHO1, &
  142. SLIMSK, &
  143. STRESS, &
  144. T1, &
  145. T2M, &
  146. THGB, &
  147. THX, &
  148. TSKIN, &
  149. SHELEG, &
  150. U1, &
  151. U10M, &
  152. USTAR, &
  153. V1, &
  154. V10M, &
  155. WIND, &
  156. Z0RL, &
  157. Z1
  158. INTEGER :: &
  159. I, &
  160. IM, &
  161. J, &
  162. K, &
  163. KM
  164. if(itimestep.eq.0) then
  165. CALL GFUNCPHYS
  166. endif
  167. IM=ITE-ITS+1
  168. KM=KTE-KTS+1
  169. DO J=jts,jte
  170. DO i=its,ite
  171. DDVEL(I)=0.
  172. RCL(i)=1.
  173. PRSL1(i)=P3D(i,kts,j)*.001
  174. PS(i)=PSFC(i,j)*.001
  175. Q1(I) = QV3D(i,kts,j)
  176. ! QSURF(I)=QSFC(I,J)
  177. QSURF(I)=0.
  178. SHELEG(I)=0.
  179. SLIMSK(i)=ABS(XLAND(i,j)-2.)
  180. TSKIN(i)=TSK(i,j)
  181. T1(I) = T3D(i,kts,j)
  182. U1(I) = U3D(i,kts,j)
  183. USTAR(I) = UST(i,j)
  184. V1(I) = V3D(i,kts,j)
  185. Z0RL(I) = ZNT(i,j)*100.
  186. ENDDO
  187. DO i=its,ite
  188. PRSLKI(i)=(PS(I)/PRSL1(I))**ROVCP
  189. THGB(I)=TSKIN(i)*(100./PS(I))**ROVCP
  190. THX(I)=T1(i)*(100./PRSL1(I))**ROVCP
  191. RHO1(I)=PRSL1(I)*1000./(R*T1(I)*(1.+EP1*Q1(I)))
  192. Q1(I)=Q1(I)/(1.+Q1(I))
  193. ENDDO
  194. CALL PROGTM(IM,KM,PS,U1,V1,T1,Q1, &
  195. SHELEG,TSKIN,QSURF, &
  196. !WRF SMC,STC,DM,SOILTYP,SIGMAF,VEGTYPE,CANOPY,DLWFLX, &
  197. !WRF SLRAD,SNOWMT,DELT, &
  198. Z0RL, &
  199. !WRF TG3,GFLUX,F10M, &
  200. U10M,V10M,T2M,Q2M, &
  201. !WRF ZSOIL, &
  202. CM,CH,RB, &
  203. !WRF RHSCNPY,RHSMC,AIM,BIM,CIM, &
  204. RCL,PRSL1,PRSLKI,SLIMSK, &
  205. DRAIN,EVAP,HFLX,STRESS,EP, &
  206. FM,FH,USTAR,WIND,DDVEL, &
  207. PM,PH,FH2,QSS,Z1 )
  208. DO i=its,ite
  209. U10(i,j)=U10M(i)
  210. V10(i,j)=V10M(i)
  211. BR(i,j)=RB(i)
  212. CHS(I,J)=CH(I)*WIND(I)
  213. CHS2(I,J)=USTAR(I)*KARMAN/FH2(I)
  214. CPM(I,J)=CP*(1.+0.8*QV3D(i,kts,j))
  215. esat = fpvs(t1(i))
  216. QGH(I,J)=ep2*esat/(1000.*ps(i)-esat)
  217. QSFC(I,J)=qss(i)
  218. PSIH(i,j)=PH(i)
  219. PSIM(i,j)=PM(i)
  220. UST(i,j)=ustar(i)
  221. WSPD(i,j)=WIND(i)
  222. ZNT(i,j)=Z0RL(i)*.01
  223. ENDDO
  224. DO i=its,ite
  225. FLHC(i,j)=CPM(I,J)*RHO1(I)*CHS(I,J)
  226. FLQC(i,j)=RHO1(I)*CHS(I,J)
  227. GZ1OZ0(i,j)=LOG(Z1(I)/(Z0RL(I)*.01))
  228. CQS2(i,j)=CHS2(I,J)
  229. ENDDO
  230. IF (ISFFLX.EQ.0) THEN
  231. DO i=its,ite
  232. HFX(i,j)=0.
  233. LH(i,j)=0.
  234. QFX(i,j)=0.
  235. ENDDO
  236. ELSE
  237. DO i=its,ite
  238. IF(XLAND(I,J)-1.5.GT.0.)THEN
  239. HFX(I,J)=FLHC(I,J)*(THGB(I)-THX(I))
  240. ELSEIF(XLAND(I,J)-1.5.LT.0.)THEN
  241. HFX(I,J)=FLHC(I,J)*(THGB(I)-THX(I))
  242. HFX(I,J)=AMAX1(HFX(I,J),-250.)
  243. ENDIF
  244. QFX(I,J)=FLQC(I,J)*(QSFC(I,J)-Q1(I))
  245. QFX(I,J)=AMAX1(QFX(I,J),0.)
  246. LH(I,J)=XLV*QFX(I,J)
  247. ENDDO
  248. ENDIF
  249. ENDDO
  250. END SUBROUTINE SF_GFS
  251. !-------------------------------------------------------------------
  252. SUBROUTINE PROGTM(IM,KM,PS,U1,V1,T1,Q1, &
  253. & SHELEG,TSKIN,QSURF, &
  254. !WRF & SMC,STC,DM,SOILTYP,SIGMAF,VEGTYPE,CANOPY, &
  255. !WRF & DLWFLX,SLRAD,SNOWMT,DELT, &
  256. & Z0RL, &
  257. !WRF & TG3,GFLUX,F10M, &
  258. & U10M,V10M,T2M,Q2M, &
  259. !WRF & ZSOIL, &
  260. & CM, CH, RB, &
  261. !WRF & RHSCNPY,RHSMC,AIM,BIM,CIM, &
  262. & RCL,PRSL1,PRSLKI,SLIMSK, &
  263. & DRAIN,EVAP,HFLX,STRESS,EP, &
  264. & FM,FH,USTAR,WIND,DDVEL, &
  265. & PM,PH,FH2,QSS,Z1 )
  266. !
  267. USE MODULE_GFS_MACHINE, ONLY : kind_phys
  268. USE MODULE_GFS_FUNCPHYS, ONLY : fpvs
  269. USE MODULE_GFS_PHYSCONS, grav => con_g, SBC => con_sbc, HVAP => con_HVAP &
  270. &, CP => con_CP, HFUS => con_HFUS, JCAL => con_JCAL &
  271. &, EPS => con_eps, EPSM1 => con_epsm1, t0c => con_t0c &
  272. &, RVRDM1 => con_FVirt, RD => con_RD
  273. implicit none
  274. !
  275. ! include 'constant.h'
  276. !
  277. integer IM, km
  278. !
  279. real(kind=kind_phys), parameter :: cpinv=1.0/cp, HVAPI=1.0/HVAP
  280. real(kind=kind_phys) DELT
  281. INTEGER SOILTYP(IM), VEGTYPE(IM)
  282. real(kind=kind_phys) PS(IM), U1(IM), V1(IM), &
  283. & T1(IM), Q1(IM), SHELEG(IM), &
  284. & TSKIN(IM), QSURF(IM), SMC(IM,KM), &
  285. & STC(IM,KM), DM(IM), SIGMAF(IM), &
  286. & CANOPY(IM), DLWFLX(IM), SLRAD(IM), &
  287. & SNOWMT(IM), Z0RL(IM), TG3(IM), &
  288. & GFLUX(IM), F10M(IM), U10M(IM), &
  289. & V10M(IM), T2M(IM), Q2M(IM), &
  290. & ZSOIL(IM,KM), CM(IM), CH(IM), &
  291. & RB(IM), RHSCNPY(IM), RHSMC(IM,KM), &
  292. & AIM(IM,KM), BIM(IM,KM), CIM(IM,KM), &
  293. & RCL(IM), PRSL1(IM), PRSLKI(IM), &
  294. & SLIMSK(IM), DRAIN(IM), EVAP(IM), &
  295. & HFLX(IM), RNET(IM), EP(IM), &
  296. & FM(IM), FH(IM), USTAR(IM), &
  297. & WIND(IM), DDVEL(IM), STRESS(IM)
  298. !
  299. ! Locals
  300. !
  301. integer k,i
  302. !
  303. real(kind=kind_phys) CANFAC(IM), &
  304. & DDZ(IM), DDZ2(IM), DELTA(IM), &
  305. & DEW(IM), DF1(IM), DFT0(IM), &
  306. & DFT2(IM), DFT1(IM), &
  307. & DMDZ(IM), DMDZ2(IM), DTDZ1(IM), &
  308. & DTDZ2(IM), DTV(IM), EC(IM), &
  309. & EDIR(IM), ETPFAC(IM), &
  310. & FACTSNW(IM), FH2(IM), FM10(IM), &
  311. & FX(IM), GX(IM), &
  312. & HCPCT(IM), HL1(IM), HL12(IM), &
  313. & HLINF(IM), PARTLND(IM), PH(IM), &
  314. & PH2(IM), PM(IM), PM10(IM), &
  315. & PSURF(IM), Q0(IM), QS1(IM), &
  316. & QSS(IM), RAT(IM), RCAP(IM), &
  317. & RCH(IM), RHO(IM), RS(IM), &
  318. & RSMALL(IM), SLWD(IM), SMCZ(IM), &
  319. & SNET(IM), SNOEVP(IM), SNOWD(IM), &
  320. & T1O(IM), T2MO(IM), TERM1(IM), &
  321. & TERM2(IM), THETA1(IM), THV1(IM), &
  322. & TREF(IM), TSURF(IM), TV1(IM), &
  323. & TVS(IM), TSURFO(IM), TWILT(IM), &
  324. & XX(IM), XRCL(IM), YY(IM), &
  325. & Z0(IM), Z0MAX(IM), Z1(IM), &
  326. & ZTMAX(IM), ZZ(IM), PS1(IM)
  327. !
  328. real(kind=kind_phys) a0, a0p, a1, a1p, aa, aa0, &
  329. & aa1, adtv, alpha, arnu, b1, b1p, &
  330. & b2, b2p, bb, bb0, bb1, bb2, &
  331. & bfact, ca, cc, cc1, cc2, cfactr, &
  332. & ch2o, charnock, cice, convrad, cq, csoil, &
  333. & ctfil1,ctfil2, delt2, df2, dfsnow, &
  334. & elocp, eth, ff, FMS, &
  335. !WRF & fhs, funcdf, funckt,g, hl0, hl0inf, &
  336. & fhs, g, hl0, hl0inf, &
  337. & hl110, hlt, hltinf,OLINF, rcq, rcs, &
  338. & rct, restar, rhoh2o,rnu, RSI, &
  339. & rss, scanop, sig2k, sigma, smcdry, &
  340. & t12, t14, tflx, tgice, topt, &
  341. & val, vis, zbot, snomin, tem
  342. !
  343. !
  344. PARAMETER (CHARNOCK=.014,CA=.4)!C CA IS THE VON KARMAN CONSTANT
  345. PARAMETER (G=grav,sigma=sbc)
  346. PARAMETER (ALPHA=5.,A0=-3.975,A1=12.32,B1=-7.755,B2=6.041)
  347. PARAMETER (A0P=-7.941,A1P=24.75,B1P=-8.705,B2P=7.899,VIS=1.4E-5)
  348. PARAMETER (AA1=-1.076,BB1=.7045,CC1=-.05808)
  349. PARAMETER (BB2=-.1954,CC2=.009999)
  350. PARAMETER (ELOCP=HVAP/CP,DFSNOW=.31,CH2O=4.2E6,CSOIL=1.26E6)
  351. PARAMETER (SCANOP=.5,CFACTR=.5,ZBOT=-3.,TGICE=271.2)
  352. PARAMETER (CICE=1880.*917.,topt=298.)
  353. PARAMETER (RHOH2O=1000.,CONVRAD=JCAL*1.E4/60.)
  354. PARAMETER (CTFIL1=.5,CTFIL2=1.-CTFIL1)
  355. PARAMETER (RNU=1.51E-5,ARNU=.135*RNU)
  356. parameter (snomin=1.0e-9)
  357. !
  358. LOGICAL FLAG(IM), FLAGSNW(IM)
  359. !WRF real(kind=kind_phys) KT1(IM), KT2(IM), KTSOIL, &
  360. real(kind=kind_phys) KT1(IM), KT2(IM), &
  361. & ET(IM,KM), &
  362. & STSOIL(IM,KM), AI(IM,KM), BI(IM,KM), &
  363. & CI(IM,KM), RHSTC(IM,KM)
  364. real(kind=kind_phys) rsmax(13), rgl(13), rsmin(13), hs(13), &
  365. & smmax(9), smdry(9), smref(9), smwlt(9)
  366. !
  367. ! the 13 vegetation types are:
  368. !
  369. ! 1 ... broadleave-evergreen trees (tropical forest)
  370. ! 2 ... broadleave-deciduous trees
  371. ! 3 ... broadleave and needle leave trees (mixed forest)
  372. ! 4 ... needleleave-evergreen trees
  373. ! 5 ... needleleave-deciduous trees (larch)
  374. ! 6 ... broadleave trees with groundcover (savanna)
  375. ! 7 ... groundcover only (perenial)
  376. ! 8 ... broadleave shrubs with perenial groundcover
  377. ! 9 ... broadleave shrubs with bare soil
  378. ! 10 ... dwarf trees and shrubs with ground cover (trunda)
  379. ! 11 ... bare soil
  380. ! 12 ... cultivations (use parameters from type 7)
  381. ! 13 ... glacial
  382. !
  383. data rsmax/13*5000./
  384. data rsmin/150.,100.,125.,150.,100.,70.,40., &
  385. & 300.,400.,150.,999.,40.,999./
  386. data rgl/5*30.,65.,4*100.,999.,100.,999./
  387. data hs/41.69,54.53,51.93,47.35,47.35,54.53,36.35, &
  388. & 3*42.00,999.,36.35,999./
  389. data smmax/.421,.464,.468,.434,.406,.465,.404,.439,.421/
  390. data smdry/.07,.14,.22,.08,.18,.16,.12,.10,.07/
  391. data smref/.283,.387,.412,.312,.338,.382,.315,.329,.283/
  392. data smwlt/.029,.119,.139,.047,.010,.103,.069,.066,.029/
  393. !
  394. !!! save rsmax, rsmin, rgl, hs, smmax, smdry, smref, smwlt
  395. !
  396. !WRF DELT2 = DELT * 2.
  397. !
  398. ! ESTIMATE SIGMA ** K AT 2 M
  399. !
  400. SIG2K = 1. - 4. * G * 2. / (CP * 280.)
  401. !
  402. ! INITIALIZE VARIABLES. ALL UNITS ARE SUPPOSEDLY M.K.S. UNLESS SPECIFIE
  403. ! PSURF IS IN PASCALS
  404. ! WIND IS WIND SPEED, THETA1 IS ADIABATIC SURFACE TEMP FROM LEVEL 1
  405. ! RHO IS DENSITY, QS1 IS SAT. HUM. AT LEVEL1 AND QSS IS SAT. HUM. AT
  406. ! SURFACE
  407. ! CONVERT SLRAD TO THE CIVILIZED UNIT FROM LANGLEY MINUTE-1 K-4
  408. ! SURFACE ROUGHNESS LENGTH IS CONVERTED TO M FROM CM
  409. !
  410. !!
  411. ! qs1 = fpvs(t1)
  412. ! qss = fpvs(tskin)
  413. DO I=1,IM
  414. XRCL(I) = SQRT(RCL(I))
  415. PSURF(I) = 1000. * PS(I)
  416. PS1(I) = 1000. * PRSL1(I)
  417. ! SLWD(I) = SLRAD(I) * CONVRAD
  418. !WRF SLWD(I) = SLRAD(I)
  419. !
  420. ! DLWFLX has been given a negative sign for downward longwave
  421. ! snet is the net shortwave flux
  422. !
  423. !WRF SNET(I) = -SLWD(I) - DLWFLX(I)
  424. WIND(I) = XRCL(I) * SQRT(U1(I) * U1(I) + V1(I) * V1(I)) &
  425. & + MAX(0.0_kind_phys, MIN(DDVEL(I), 30.0_kind_phys))
  426. WIND(I) = MAX(WIND(I),1._kind_phys)
  427. Q0(I) = MAX(Q1(I),1.E-8_kind_phys)
  428. TSURF(I) = TSKIN(I)
  429. THETA1(I) = T1(I) * PRSLKI(I)
  430. TV1(I) = T1(I) * (1. + RVRDM1 * Q0(I))
  431. THV1(I) = THETA1(I) * (1. + RVRDM1 * Q0(I))
  432. TVS(I) = TSURF(I) * (1. + RVRDM1 * Q0(I))
  433. RHO(I) = PS1(I) / (RD * TV1(I))
  434. !jfe QS1(I) = 1000. * FPVS(T1(I))
  435. qs1(i) = fpvs(t1(i))
  436. QS1(I) = EPS * QS1(I) / (PS1(I) + EPSM1 * QS1(I))
  437. QS1(I) = MAX(QS1(I), 1.E-8_kind_phys)
  438. Q0(I) = min(QS1(I),Q0(I))
  439. !jfe QSS(I) = 1000. * FPVS(TSURF(I))
  440. qss(i) = fpvs(tskin(i))
  441. QSS(I) = EPS * QSS(I) / (PSURF(I) + EPSM1 * QSS(I))
  442. ! RS = PLANTR
  443. RS(I) = 0.
  444. !WRF if(VEGTYPE(I).gt.0.) RS(I) = rsmin(VEGTYPE(I))
  445. Z0(I) = .01 * Z0RL(i)
  446. !WRF CANOPY(I)= MAX(CANOPY(I),0._kind_phys)
  447. DM(I) = 1.
  448. !WRF
  449. GOTO 1111
  450. !WRF
  451. FACTSNW(I) = 10.
  452. IF(SLIMSK(I).EQ.2.) FACTSNW(I) = 3.
  453. !
  454. ! SNOW DEPTH IN WATER EQUIVALENT IS CONVERTED FROM MM TO M UNIT
  455. !
  456. SNOWD(I) = SHELEG(I) / 1000.
  457. FLAGSNW(I) = .FALSE.
  458. !
  459. ! WHEN SNOW DEPTH IS LESS THAN 1 MM, A PATCHY SNOW IS ASSUMED AND
  460. ! SOIL IS ALLOWED TO INTERACT WITH THE ATMOSPHERE.
  461. ! WE SHOULD EVENTUALLY MOVE TO A LINEAR COMBINATION OF SOIL AND
  462. ! SNOW UNDER THE CONDITION OF PATCHY SNOW.
  463. !
  464. IF(SNOWD(I).GT..001.OR.SLIMSK(I).EQ.2.) RS(I) = 0.
  465. IF(SNOWD(I).GT..001) FLAGSNW(I) = .TRUE.
  466. !##DG IF(LAT.EQ.LATD) THEN
  467. !##DG PRINT *, ' WIND,TV1,TVS,Q1,QS1,SNOW,SLIMSK=',
  468. !##DG& WIND,TV1,TVS,Q1,QS1,SNOWD,SLIMSK
  469. !##DG PRINT *, ' SNET, SLWD =', SNET, SLWD(I)
  470. !##DG ENDIF
  471. IF(SLIMSK(I).EQ.0.) THEN
  472. ZSOIL(I,1) = 0.
  473. ELSEIF(SLIMSK(I).EQ.1.) THEN
  474. ZSOIL(I,1) = -.10
  475. ELSE
  476. ZSOIL(I,1) = -3. / KM
  477. ENDIF
  478. !WRF
  479. 1111 CONTINUE
  480. !WRF
  481. ENDDO
  482. !!
  483. !WRF
  484. GOTO 2222
  485. !WRF
  486. DO K = 2, KM
  487. DO I=1,IM
  488. IF(SLIMSK(I).EQ.0.) THEN
  489. ZSOIL(I,K) = 0.
  490. ELSEIF(SLIMSK(I).EQ.1.) THEN
  491. ZSOIL(I,K) = ZSOIL(I,K-1) &
  492. & + (-2. - ZSOIL(I,1)) / (KM - 1)
  493. ELSE
  494. ZSOIL(I,K) = - 3. * FLOAT(K) / FLOAT(KM)
  495. ENDIF
  496. ENDDO
  497. ENDDO
  498. !WRF
  499. 2222 CONTINUE
  500. !WRF
  501. !!
  502. DO I=1,IM
  503. Z1(I) = -RD * TV1(I) * LOG(PS1(I)/PSURF(I)) / G
  504. DRAIN(I) = 0.
  505. ENDDO
  506. !!
  507. DO K = 1, KM
  508. DO I=1,IM
  509. ET(I,K) = 0.
  510. RHSMC(I,K) = 0.
  511. AIM(I,K) = 0.
  512. BIM(I,K) = 1.
  513. CIM(I,K) = 0.
  514. STSOIL(I,K) = STC(I,K)
  515. ENDDO
  516. ENDDO
  517. DO I=1,IM
  518. EDIR(I) = 0.
  519. EC(I) = 0.
  520. EVAP(I) = 0.
  521. EP(I) = 0.
  522. SNOWMT(I) = 0.
  523. GFLUX(I) = 0.
  524. RHSCNPY(I) = 0.
  525. FX(I) = 0.
  526. ETPFAC(I) = 0.
  527. CANFAC(I) = 0.
  528. ENDDO
  529. !
  530. ! COMPUTE STABILITY DEPENDENT EXCHANGE COEFFICIENTS
  531. !
  532. ! THIS PORTION OF THE CODE IS PRESENTLY SUPPRESSED
  533. !
  534. DO I=1,IM
  535. IF(SLIMSK(I).EQ.0.) THEN
  536. USTAR(I) = SQRT(G * Z0(I) / CHARNOCK)
  537. ENDIF
  538. !
  539. ! COMPUTE STABILITY INDICES (RB AND HLINF)
  540. !
  541. Z0MAX(I) = MIN(Z0(I),0.1 * Z1(I))
  542. ZTMAX(I) = Z0MAX(I)
  543. IF(SLIMSK(I).EQ.0.) THEN
  544. RESTAR = USTAR(I) * Z0MAX(I) / VIS
  545. RESTAR = MAX(RESTAR,.000001_kind_phys)
  546. ! RESTAR = ALOG(RESTAR)
  547. ! RESTAR = MIN(RESTAR,5.)
  548. ! RESTAR = MAX(RESTAR,-5.)
  549. ! RAT(I) = AA1 + BB1 * RESTAR + CC1 * RESTAR ** 2
  550. ! RAT(I) = RAT(I) / (1. + BB2 * RESTAR
  551. ! & + CC2 * RESTAR ** 2)
  552. ! Rat taken from Zeng, Zhao and Dickinson 1997
  553. RAT(I) = 2.67 * restar ** .25 - 2.57
  554. RAT(I) = min(RAT(I),7._kind_phys)
  555. ZTMAX(I) = Z0MAX(I) * EXP(-RAT(I))
  556. ENDIF
  557. ENDDO
  558. !##DG IF(LAT.EQ.LATD) THEN
  559. !##DG PRINT *, ' z0max, ztmax, restar, RAT(I) =',
  560. !##DG & z0max, ztmax, restar, RAT(I)
  561. !##DG ENDIF
  562. DO I = 1, IM
  563. DTV(I) = THV1(I) - TVS(I)
  564. ADTV = ABS(DTV(I))
  565. ADTV = MAX(ADTV,.001_kind_phys)
  566. DTV(I) = SIGN(1._kind_phys,DTV(I)) * ADTV
  567. RB(I) = G * DTV(I) * Z1(I) / (.5 * (THV1(I) + TVS(I)) &
  568. & * WIND(I) * WIND(I))
  569. RB(I) = MAX(RB(I),-5000._kind_phys)
  570. ! FM(I) = LOG((Z0MAX(I)+Z1(I)) / Z0MAX(I))
  571. ! FH(I) = LOG((ZTMAX(I)+Z1(I)) / ZTMAX(I))
  572. FM(I) = LOG((Z1(I)) / Z0MAX(I))
  573. FH(I) = LOG((Z1(I)) / ZTMAX(I))
  574. HLINF(I) = RB(I) * FM(I) * FM(I) / FH(I)
  575. FM10(I) = LOG((Z0MAX(I)+10.) / Z0MAX(I))
  576. FH2(I) = LOG((ZTMAX(I)+2.) / ZTMAX(I))
  577. ENDDO
  578. !##DG IF(LAT.EQ.LATD) THEN
  579. !##DG PRINT *, ' DTV, RB(I), FM(I), FH(I), HLINF =',
  580. !##DG & dtv, rb, FM(I), FH(I), hlinf
  581. !##DG ENDIF
  582. !
  583. ! STABLE CASE
  584. !
  585. DO I = 1, IM
  586. IF(DTV(I).GE.0.) THEN
  587. HL1(I) = HLINF(I)
  588. ENDIF
  589. IF(DTV(I).GE.0..AND.HLINF(I).GT..25) THEN
  590. HL0INF = Z0MAX(I) * HLINF(I) / Z1(I)
  591. HLTINF = ZTMAX(I) * HLINF(I) / Z1(I)
  592. AA = SQRT(1. + 4. * ALPHA * HLINF(I))
  593. AA0 = SQRT(1. + 4. * ALPHA * HL0INF)
  594. BB = AA
  595. BB0 = SQRT(1. + 4. * ALPHA * HLTINF)
  596. PM(I) = AA0 - AA + LOG((AA + 1.) / (AA0 + 1.))
  597. PH(I) = BB0 - BB + LOG((BB + 1.) / (BB0 + 1.))
  598. FMS = FM(I) - PM(I)
  599. FHS = FH(I) - PH(I)
  600. HL1(I) = FMS * FMS * RB(I) / FHS
  601. ENDIF
  602. ENDDO
  603. !
  604. ! SECOND ITERATION
  605. !
  606. DO I = 1, IM
  607. IF(DTV(I).GE.0.) THEN
  608. HL0 = Z0MAX(I) * HL1(I) / Z1(I)
  609. HLT = ZTMAX(I) * HL1(I) / Z1(I)
  610. AA = SQRT(1. + 4. * ALPHA * HL1(I))
  611. AA0 = SQRT(1. + 4. * ALPHA * HL0)
  612. BB = AA
  613. BB0 = SQRT(1. + 4. * ALPHA * HLT)
  614. PM(I) = AA0 - AA + LOG((AA + 1.) / (AA0 + 1.))
  615. PH(I) = BB0 - BB + LOG((BB + 1.) / (BB0 + 1.))
  616. HL110 = HL1(I) * 10. / Z1(I)
  617. AA = SQRT(1. + 4. * ALPHA * HL110)
  618. PM10(I) = AA0 - AA + LOG((AA + 1.) / (AA0 + 1.))
  619. HL12(I) = HL1(I) * 2. / Z1(I)
  620. ! AA = SQRT(1. + 4. * ALPHA * HL12(I))
  621. BB = SQRT(1. + 4. * ALPHA * HL12(I))
  622. PH2(I) = BB0 - BB + LOG((BB + 1.) / (BB0 + 1.))
  623. ENDIF
  624. ENDDO
  625. !!
  626. !##DG IF(LAT.EQ.LATD) THEN
  627. !##DG PRINT *, ' HL1(I), PM, PH =',
  628. !##DG & HL1(I), pm, ph
  629. !##DG ENDIF
  630. !
  631. ! UNSTABLE CASE
  632. !
  633. !
  634. ! CHECK FOR UNPHYSICAL OBUKHOV LENGTH
  635. !
  636. DO I=1,IM
  637. IF(DTV(I).LT.0.) THEN
  638. OLINF = Z1(I) / HLINF(I)
  639. IF(ABS(OLINF).LE.50. * Z0MAX(I)) THEN
  640. HLINF(I) = -Z1(I) / (50. * Z0MAX(I))
  641. ENDIF
  642. ENDIF
  643. ENDDO
  644. !
  645. ! GET PM AND PH
  646. !
  647. DO I = 1, IM
  648. IF(DTV(I).LT.0..AND.HLINF(I).GE.-.5) THEN
  649. HL1(I) = HLINF(I)
  650. PM(I) = (A0 + A1 * HL1(I)) * HL1(I) &
  651. & / (1. + B1 * HL1(I) + B2 * HL1(I) * HL1(I))
  652. PH(I) = (A0P + A1P * HL1(I)) * HL1(I) &
  653. & / (1. + B1P * HL1(I) + B2P * HL1(I) * HL1(I))
  654. HL110 = HL1(I) * 10. / Z1(I)
  655. PM10(I) = (A0 + A1 * HL110) * HL110 &
  656. & / (1. + B1 * HL110 + B2 * HL110 * HL110)
  657. HL12(I) = HL1(I) * 2. / Z1(I)
  658. PH2(I) = (A0P + A1P * HL12(I)) * HL12(I) &
  659. & / (1. + B1P * HL12(I) + B2P * HL12(I) * HL12(I))
  660. ENDIF
  661. IF(DTV(I).LT.0.AND.HLINF(I).LT.-.5) THEN
  662. HL1(I) = -HLINF(I)
  663. PM(I) = LOG(HL1(I)) + 2. * HL1(I) ** (-.25) - .8776
  664. PH(I) = LOG(HL1(I)) + .5 * HL1(I) ** (-.5) + 1.386
  665. HL110 = HL1(I) * 10. / Z1(I)
  666. PM10(I) = LOG(HL110) + 2. * HL110 ** (-.25) - .8776
  667. HL12(I) = HL1(I) * 2. / Z1(I)
  668. PH2(I) = LOG(HL12(I)) + .5 * HL12(I) ** (-.5) + 1.386
  669. ENDIF
  670. ENDDO
  671. !
  672. ! FINISH THE EXCHANGE COEFFICIENT COMPUTATION TO PROVIDE FM AND FH
  673. !
  674. DO I = 1, IM
  675. FM(I) = FM(I) - PM(I)
  676. FH(I) = FH(I) - PH(I)
  677. FM10(I) = FM10(I) - PM10(I)
  678. FH2(I) = FH2(I) - PH2(I)
  679. CM(I) = CA * CA / (FM(I) * FM(I))
  680. CH(I) = CA * CA / (FM(I) * FH(I))
  681. CQ = CH(I)
  682. STRESS(I) = CM(I) * WIND(I) * WIND(I)
  683. USTAR(I) = SQRT(STRESS(I))
  684. ! USTAR(I) = SQRT(CM(I) * WIND(I) * WIND(I))
  685. ENDDO
  686. !##DG IF(LAT.EQ.LATD) THEN
  687. !##DG PRINT *, ' FM, FH, CM, CH(I), USTAR =',
  688. !##DG & FM, FH, CM, ch, USTAR
  689. !##DG ENDIF
  690. !
  691. ! UPDATE Z0 OVER OCEAN
  692. !
  693. DO I = 1, IM
  694. IF(SLIMSK(I).EQ.0.) THEN
  695. Z0(I) = (CHARNOCK / G) * USTAR(I) ** 2
  696. ! NEW IMPLEMENTATION OF Z0
  697. ! CC = USTAR(I) * Z0 / RNU
  698. ! PP = CC / (1. + CC)
  699. ! FF = G * ARNU / (CHARNOCK * USTAR(I) ** 3)
  700. ! Z0 = ARNU / (USTAR(I) * FF ** PP)
  701. Z0(I) = MIN(Z0(I),.1_kind_phys)
  702. Z0(I) = MAX(Z0(I),1.E-7_kind_phys)
  703. Z0RL(I) = 100. * Z0(I)
  704. ENDIF
  705. ENDDO
  706. GOTO 5555
  707. !
  708. ! RCP = RHO CP CH V
  709. !
  710. DO I = 1, IM
  711. RCH(I) = RHO(I) * CP * CH(I) * WIND(I)
  712. ENDDO
  713. !
  714. ! SENSIBLE AND LATENT HEAT FLUX OVER OPEN WATER
  715. !
  716. DO I = 1, IM
  717. IF(SLIMSK(I).EQ.0.) THEN
  718. EVAP(I) = ELOCP * RCH(I) * (QSS(I) - Q1(I))
  719. DM(I) = 1.
  720. QSURF(I) = QSS(I)
  721. ENDIF
  722. ENDDO
  723. !
  724. ! COMPUTE SOIL/SNOW/ICE HEAT FLUX IN PREPARATION FOR SURFACE ENERGY
  725. ! BALANCE CALCULATION
  726. !
  727. DO I = 1, IM
  728. GFLUX(I) = 0.
  729. IF(SLIMSK(I).EQ.1.) THEN
  730. SMCZ(I) = .5 * (SMC(I,1) + .20)
  731. DFT0(I) = KTSOIL(SMCZ(I),SOILTYP(I))
  732. ELSEIF(SLIMSK(I).EQ.2.) THEN
  733. ! DF FOR ICE IS TAKEN FROM MAYKUT AND UNTERSTEINER
  734. ! DF IS IN SI UNIT OF W K-1 M-1
  735. DFT0(I) = 2.2
  736. ENDIF
  737. ENDDO
  738. !!
  739. DO I=1,IM
  740. IF(SLIMSK(I).NE.0.) THEN
  741. ! IF(SNOWD(I).GT..001) THEN
  742. IF(FLAGSNW(I)) THEN
  743. !
  744. ! WHEN SNOW COVERED, GROUND HEAT FLUX COMES FROM SNOW
  745. !
  746. TFLX = MIN(T1(I), TSURF(I))
  747. GFLUX(I) = -DFSNOW * (TFLX - STSOIL(I,1)) &
  748. & / (FACTSNW(I) * MAX(SNOWD(I),.001_kind_phys))
  749. ELSE
  750. GFLUX(I) = DFT0(I) * (STSOIL(I,1) - TSURF(I)) &
  751. & / (-.5 * ZSOIL(I,1))
  752. ENDIF
  753. GFLUX(I) = MAX(GFLUX(I),-200._kind_phys)
  754. GFLUX(I) = MIN(GFLUX(I),+200._kind_phys)
  755. ENDIF
  756. ENDDO
  757. DO I = 1, IM
  758. FLAG(I) = SLIMSK(I).NE.0.
  759. PARTLND(I) = 1.
  760. IF(SNOWD(I).GT.0..AND.SNOWD(I).LE..001) THEN
  761. PARTLND(I) = 1. - SNOWD(I) / .001
  762. ENDIF
  763. ENDDO
  764. DO I = 1, IM
  765. SNOEVP(I) = 0.
  766. if(SNOWD(I).gt..001) PARTLND(I) = 0.
  767. ENDDO
  768. !
  769. ! COMPUTE POTENTIAL EVAPORATION FOR LAND AND SEA ICE
  770. !
  771. DO I = 1, IM
  772. IF(FLAG(I)) THEN
  773. T12 = T1(I) * T1(I)
  774. T14 = T12 * T12
  775. !
  776. ! RCAP = FNET - SIGMA T**4 + GFLX - RHO CP CH V (T1-THETA1)
  777. !
  778. RCAP(I) = -SLWD(I) - SIGMA * T14 + GFLUX(I) &
  779. & - RCH(I) * (T1(I) - THETA1(I))
  780. !
  781. ! RSMALL = 4 SIGMA T**3 / RCH(I) + 1
  782. !
  783. RSMALL(I) = 4. * SIGMA * T1(I) * T12 / RCH(I) + 1.
  784. !
  785. ! DELTA = L / CP * DQS/DT
  786. !
  787. DELTA(I) = ELOCP * EPS * HVAP * QS1(I) / (RD * T12)
  788. !
  789. ! POTENTIAL EVAPOTRANSPIRATION ( WATTS / M**2 ) AND
  790. ! POTENTIAL EVAPORATION
  791. !
  792. TERM1(I) = ELOCP * RSMALL(I) * RCH(I)*(QS1(I)-Q0(I))
  793. TERM2(I) = RCAP(I) * DELTA(I)
  794. EP(I) = (ELOCP * RSMALL(I) * RCH(I) * (QS1(I) - Q0(I)) &
  795. & + RCAP(I) * DELTA(I))
  796. EP(I) = EP(I) / (RSMALL(I) + DELTA(I))
  797. ENDIF
  798. ENDDO
  799. !
  800. ! ACTUAL EVAPORATION OVER LAND IN THREE PARTS : EDIR, ET, AND EC
  801. !
  802. ! DIRECT EVAPORATION FROM SOIL, THE UNIT GOES FROM M S-1 TO KG M-2 S-1
  803. !
  804. DO I = 1, IM
  805. FLAG(I) = SLIMSK(I).EQ.1..AND.EP(I).GT.0.
  806. ENDDO
  807. DO I = 1, IM
  808. IF(FLAG(I)) THEN
  809. DF1(I) = FUNCDF(SMC(I,1),SOILTYP(I))
  810. KT1(I) = FUNCKT(SMC(I,1),SOILTYP(I))
  811. endif
  812. if(FLAG(I).and.STC(I,1).lt.t0c) then
  813. DF1(I) = 0.
  814. KT1(I) = 0.
  815. endif
  816. IF(FLAG(I)) THEN
  817. ! TREF = .75 * THSAT(SOILTYP(I))
  818. TREF(I) = smref(SOILTYP(I))
  819. ! TWILT = TWLT(SOILTYP(I))
  820. TWILT(I) = smwlt(SOILTYP(I))
  821. smcdry = smdry(SOILTYP(I))
  822. ! FX(I) = -2. * DF1(I) * (SMC(I,1) - .23) / ZSOIL(I,1)
  823. ! & - KT1(I)
  824. FX(I) = -2. * DF1(I) * (SMC(I,1) - smcdry) / ZSOIL(I,1) &
  825. & - KT1(I)
  826. FX(I) = MIN(FX(I), EP(I)/HVAP)
  827. FX(I) = MAX(FX(I),0._kind_phys)
  828. !
  829. ! SIGMAF IS THE FRACTION OF AREA COVERED BY VEGETATION
  830. !
  831. EDIR(I) = FX(I) * (1. - SIGMAF(I)) * PARTLND(I)
  832. ENDIF
  833. ENDDO
  834. !
  835. ! calculate stomatal resistance
  836. !
  837. DO I = 1, IM
  838. if(FLAG(I)) then
  839. !
  840. ! resistance due to PAR. We use net solar flux as proxy at the present time
  841. !
  842. ff = .55 * 2. * SNET(I) / rgl(VEGTYPE(I))
  843. rcs = (ff + RS(I)/rsmax(VEGTYPE(I))) / (1. + ff)
  844. rcs = max(rcs,.0001_kind_phys)
  845. rct = 1.
  846. rcq = 1.
  847. !
  848. ! resistance due to thermal effect
  849. !
  850. ! rct = 1. - .0016 * (topt - theta1) ** 2
  851. ! rct = max(rct,.0001)
  852. !
  853. ! resistance due to humidity
  854. !
  855. ! rcq = 1. / (1. + hs(VEGTYPE(I)) * (QS1(I) - Q0(I)))
  856. ! rcq = max(rcq,.0001)
  857. !
  858. ! compute resistance without the effect of soil moisture
  859. !
  860. RS(I) = RS(I) / (rcs * rct * rcq)
  861. endif
  862. ENDDO
  863. !
  864. ! TRANSPIRATION FROM ALL LEVELS OF THE SOIL
  865. !
  866. DO I = 1, IM
  867. IF(FLAG(I)) THEN
  868. CANFAC(I) = (CANOPY(I) / SCANOP) ** CFACTR
  869. endif
  870. IF(FLAG(I)) THEN
  871. ETPFAC(I) = SIGMAF(I) &
  872. & * (1. - CANFAC(I)) / HVAP
  873. GX(I) = (SMC(I,1) - TWILT(I)) / (TREF(I) - TWILT(I))
  874. GX(I) = MAX(GX(I),0._kind_phys)
  875. GX(I) = MIN(GX(I),1._kind_phys)
  876. !
  877. ! resistance due to soil moisture deficit
  878. !
  879. rss = GX(I) * (ZSOIL(I,1) / ZSOIL(I,km))
  880. rss = max(rss,.0001_kind_phys)
  881. RSI = RS(I) / rss
  882. !
  883. ! transpiration a la Monteith
  884. !
  885. eth = (TERM1(I) + TERM2(I)) / &
  886. & (DELTA(I) + RSMALL(I) * (1. + RSI * CH(I) * WIND(I)))
  887. ET(I,1) = ETPFAC(I) * eth &
  888. & * PARTLND(I)
  889. ENDIF
  890. ENDDO
  891. !!
  892. DO K = 2, KM
  893. DO I=1,IM
  894. IF(FLAG(I)) THEN
  895. GX(I) = (SMC(I,K) - TWILT(I)) / (TREF(I) - TWILT(I))
  896. GX(I) = MAX(GX(I),0._kind_phys)
  897. GX(I) = MIN(GX(I),1._kind_phys)
  898. !
  899. ! resistance due to soil moisture deficit
  900. !
  901. rss = GX(I) * ((ZSOIL(I,k) - ZSOIL(I,k-1))/ZSOIL(I,km))
  902. rss = max(rss,1.e-6_kind_phys)
  903. RSI = RS(I) / rss
  904. !
  905. ! transpiration a la Monteith
  906. !
  907. eth = (TERM1(I) + TERM2(I)) / &
  908. & (DELTA(I) + RSMALL(I) * (1. + RSI * CH(I) * WIND(I)))
  909. ET(I,K) = eth &
  910. & * ETPFAC(I) * PARTLND(I)
  911. ENDIF
  912. ENDDO
  913. ENDDO
  914. !!
  915. 400 CONTINUE
  916. !
  917. ! CANOPY RE-EVAPORATION
  918. !
  919. DO I=1,IM
  920. IF(FLAG(I)) THEN
  921. EC(I) = SIGMAF(I) * CANFAC(I) * EP(I) / HVAP
  922. EC(I) = EC(I) * PARTLND(I)
  923. EC(I) = min(EC(I),CANOPY(I)/delt)
  924. ENDIF
  925. ENDDO
  926. !
  927. ! SUM UP TOTAL EVAPORATION
  928. !
  929. DO I = 1, IM
  930. IF(FLAG(I)) THEN
  931. EVAP(I) = EDIR(I) + EC(I)
  932. ENDIF
  933. ENDDO
  934. !!
  935. DO K = 1, KM
  936. DO I=1,IM
  937. IF(FLAG(I)) THEN
  938. EVAP(I) = EVAP(I) + ET(I,K)
  939. ENDIF
  940. ENDDO
  941. ENDDO
  942. !!
  943. !
  944. ! RETURN EVAP UNIT FROM KG M-2 S-1 TO WATTS M-2
  945. !
  946. DO I=1,IM
  947. IF(FLAG(I)) THEN
  948. EVAP(I) = MIN(EVAP(I)*HVAP,EP(I))
  949. ENDIF
  950. ENDDO
  951. !##DG IF(LAT.EQ.LATD) THEN
  952. !##DG PRINT *, 'FX(I), SIGMAF, EDIR(I), ETPFAC=', FX(I)*HVAP,SIGMAF,
  953. !##DG& EDIR(I)*HVAP,ETPFAC*HVAP
  954. !##DG PRINT *, ' ET =', (ET(K)*HVAP,K=1,KM)
  955. !##DG PRINT *, ' CANFAC(I), EC(I), EVAP', CANFAC(I),EC(I)*HVAP,EVAP
  956. !##DG ENDIF
  957. !
  958. ! EVAPORATION OVER BARE SEA ICE
  959. !
  960. DO I = 1, IM
  961. ! IF(SLIMSK(I).EQ.2.AND.SNOWD(I).LE..001) THEN
  962. IF(SLIMSK(I).EQ.2.) THEN
  963. EVAP(I) = PARTLND(I) * EP(I)
  964. ENDIF
  965. ENDDO
  966. !
  967. ! TREAT DOWNWARD MOISTURE FLUX SITUATION
  968. ! (EVAP WAS PRESET TO ZERO SO NO UPDATE NEEDED)
  969. ! DEW IS CONVERTED FROM KG M-2 TO M TO CONFORM TO PRECIP UNIT
  970. !
  971. DO I = 1, IM
  972. FLAG(I) = SLIMSK(I).NE.0..AND.EP(I).LE.0.
  973. DEW(I) = 0.
  974. ENDDO
  975. DO I = 1, IM
  976. IF(FLAG(I)) THEN
  977. DEW(I) = -EP(I) * DELT / (HVAP * RHOH2O)
  978. EVAP(I) = EP(I)
  979. DEW(I) = DEW(I) * PARTLND(I)
  980. EVAP(I) = EVAP(I) * PARTLND(I)
  981. DM(I) = 1.
  982. ENDIF
  983. ENDDO
  984. !
  985. ! SNOW COVERED LAND AND SEA ICE
  986. !
  987. DO I = 1, IM
  988. FLAG(I) = SLIMSK(I).NE.0..AND.SNOWD(I).GT.0.
  989. ENDDO
  990. !
  991. ! CHANGE OF SNOW DEPTH DUE TO EVAPORATION OR SUBLIMATION
  992. !
  993. ! CONVERT EVAP FROM KG M-2 S-1 TO M S-1 TO DETERMINE THE REDUCTION OF S
  994. !
  995. DO I = 1, IM
  996. IF(FLAG(I)) THEN
  997. BFACT = SNOWD(I) / (DELT * EP(I) / (HVAP * RHOH2O))
  998. BFACT = MIN(BFACT,1._kind_phys)
  999. !
  1000. ! THE EVAPORATION OF SNOW
  1001. !
  1002. IF(EP(I).LE.0.) BFACT = 1.
  1003. IF(SNOWD(I).LE..001) THEN
  1004. ! EVAP = (SNOWD(I)/.001)*BFACT*EP(I) + EVAP
  1005. ! SNOEVP(I) = bfact * EP(I) * (1. - PARTLND(I))
  1006. ! EVAP = EVAP + SNOEVP(I)
  1007. SNOEVP(I) = bfact * EP(I)
  1008. ! EVAP = EVAP + SNOEVP(I) * (1. - PARTLND(I))
  1009. EVAP(I)=EVAP(I)+SNOEVP(I)*(1.-PARTLND(I))
  1010. ELSE
  1011. ! EVAP(I) = BFACT * EP(I)
  1012. SNOEVP(I) = bfact * EP(I)
  1013. EVAP(I) = SNOEVP(I)
  1014. ENDIF
  1015. TSURF(I) = T1(I) + &
  1016. & (RCAP(I) - GFLUX(I) - DFSNOW * (T1(I) - STSOIL(I,1)) &
  1017. & /(FACTSNW(I) * MAX(SNOWD(I),.001_kind_phys)) &
  1018. ! & + THETA1 - T1 &
  1019. ! & - BFACT * EP(I)) / (RSMALL(I) * RCH(I) &
  1020. & - SNOEVP(I)) / (RSMALL(I) * RCH(I) &
  1021. & + DFSNOW / (FACTSNW(I)* MAX(SNOWD(I),.001_kind_phys)))
  1022. ! SNOWD(I) = SNOWD(I) - BFACT * EP(I) * DELT / (RHOH2O * HVAP)
  1023. SNOWD(I) = SNOWD(I) - SNOEVP(I) * delt / (rhoh2o * hvap)
  1024. SNOWD(I) = MAX(SNOWD(I),0._kind_phys)
  1025. ENDIF
  1026. ENDDO
  1027. !
  1028. ! SNOW MELT (M)
  1029. !
  1030. 500 CONTINUE
  1031. DO I = 1, IM
  1032. FLAG(I) = SLIMSK(I).NE.0. &
  1033. & .AND.SNOWD(I).GT..0
  1034. ENDDO
  1035. DO I = 1, IM
  1036. IF(FLAG(I).AND.TSURF(I).GT.T0C) THEN
  1037. SNOWMT(I) = RCH(I) * RSMALL(I) * DELT &
  1038. & * (TSURF(I) - T0C) / (RHOH2O * HFUS)
  1039. SNOWMT(I) = min(SNOWMT(I),SNOWD(I))
  1040. SNOWD(I) = SNOWD(I) - SNOWMT(I)
  1041. SNOWD(I) = MAX(SNOWD(I),0._kind_phys)
  1042. TSURF(I) = MAX(T0C,TSURF(I) &
  1043. & -HFUS*SNOWMT(I)*RHOH2O/(RCH(I)*RSMALL(I)*DELT))
  1044. ENDIF
  1045. ENDDO
  1046. !
  1047. ! We need to re-evaluate evaporation because of snow melt
  1048. ! the skin temperature is now bounded to 0 deg C
  1049. !
  1050. ! qss = fpvs(tsurf)
  1051. DO I = 1, IM
  1052. ! IF (SNOWD(I) .GT. 0.0) THEN
  1053. IF (SNOWD(I) .GT. snomin) THEN
  1054. !jfe QSS(I) = 1000. * FPVS(TSURF(I))
  1055. qss(i) = fpvs(tsurf(i))
  1056. QSS(I) = EPS * QSS(I) / (PSURF(I) + EPSM1 * QSS(I))
  1057. EVAP(I) = elocp * RCH(I) * (QSS(I) - Q0(I))
  1058. ENDIF
  1059. ENDDO
  1060. !
  1061. ! PREPARE TENDENCY TERMS FOR THE SOIL MOISTURE FIELD WITHOUT PRECIPITAT
  1062. ! THE UNIT OF MOISTURE FLUX NEEDS TO BECOME M S-1 FOR SOIL MOISTURE
  1063. ! HENCE THE FACTOR OF RHOH2O
  1064. !
  1065. DO I = 1, IM
  1066. FLAG(I) = SLIMSK(I).EQ.1.
  1067. if(FLAG(I)) then
  1068. DF1(I) = FUNCDF(SMCZ(I),SOILTYP(I))
  1069. KT1(I) = FUNCKT(SMCZ(I),SOILTYP(I))
  1070. endif
  1071. if(FLAG(I).and.STC(I,1).lt.t0c) then
  1072. DF1(I) = 0.
  1073. KT1(I) = 0.
  1074. endif
  1075. IF(FLAG(I)) THEN
  1076. RHSCNPY(I) = -EC(I) + SIGMAF(I) * RHOH2O * DEW(I) / DELT
  1077. SMCZ(I) = MAX(SMC(I,1), SMC(I,2))
  1078. DMDZ(I) = (SMC(I,1) - SMC(I,2)) / (-.5 * ZSOIL(I,2))
  1079. RHSMC(I,1) = (DF1(I) * DMDZ(I) + KT1(I) &
  1080. & + (EDIR(I) + ET(I,1))) / (ZSOIL(I,1) * RHOH2O)
  1081. RHSMC(I,1) = RHSMC(I,1) - (1. - SIGMAF(I)) * DEW(I) / &
  1082. & ( ZSOIL(I,1) * delt)
  1083. DDZ(I) = 1. / (-.5 * ZSOIL(I,2))
  1084. !
  1085. ! AIM, BIM, AND CIM ARE THE ELEMENTS OF THE TRIDIAGONAL MATRIX FOR THE
  1086. ! IMPLICIT UPDATE OF THE SOIL MOISTURE
  1087. !
  1088. AIM(I,1) = 0.
  1089. BIM(I,1) = DF1(I) * DDZ(I) / (-ZSOIL(I,1) * RHOH2O)
  1090. CIM(I,1) = -BIM(I,1)
  1091. ENDIF
  1092. ENDDO
  1093. !!
  1094. DO K = 2, KM
  1095. IF(K.LT.KM) THEN
  1096. DO I=1,IM
  1097. IF(FLAG(I)) THEN
  1098. DF2 = FUNCDF(SMCZ(I),SOILTYP(I))
  1099. KT2(I) = FUNCKT(SMCZ(I),SOILTYP(I))
  1100. ENDIF
  1101. IF(FLAG(I).and.STC(I,k).lt.t0c) THEN
  1102. df2 = 0.
  1103. KT2(I) = 0.
  1104. ENDIF
  1105. IF(FLAG(I)) THEN
  1106. DMDZ2(I) = (SMC(I,K) - SMC(I,K+1)) &
  1107. & / (.5 * (ZSOIL(I,K-1) - ZSOIL(I,K+1)))
  1108. SMCZ(I) = MAX(SMC(I,K), SMC(I,K+1))
  1109. RHSMC(I,K) = (DF2 * DMDZ2(I) + KT2(I) &
  1110. & - DF1(I) * DMDZ(I) - KT1(I) + ET(I,K)) &
  1111. & / (RHOH2O*(ZSOIL(I,K) - ZSOIL(I,K-1)))
  1112. DDZ2(I) = 2. / (ZSOIL(I,K-1) - ZSOIL(I,K+1))
  1113. CIM(I,K) = -DF2 * DDZ2(I) &
  1114. & / ((ZSOIL(I,K-1) - ZSOIL(I,K))*RHOH2O)
  1115. ENDIF
  1116. ENDDO
  1117. ELSE
  1118. DO I = 1, IM
  1119. IF(FLAG(I)) THEN
  1120. KT2(I) = FUNCKT(SMC(I,K),SOILTYP(I))
  1121. ENDIF
  1122. if(FLAG(I).and.STC(I,k).lt.t0c) KT2(I) = 0.
  1123. IF(FLAG(I)) THEN
  1124. RHSMC(I,K) = (KT2(I) &
  1125. & - DF1(I) * DMDZ(I) - KT1(I) + ET(I,K)) &
  1126. & / (RHOH2O*(ZSOIL(I,K) - ZSOIL(I,K-1)))
  1127. DRAIN(I) = KT2(I)
  1128. CIM(I,K) = 0.
  1129. ENDIF
  1130. ENDDO
  1131. ENDIF
  1132. DO I = 1, IM
  1133. IF(FLAG(I)) THEN
  1134. AIM(I,K) = -DF1(I) * DDZ(I) &
  1135. & / ((ZSOIL(I,K-1) - ZSOIL(I,K))*RHOH2O)
  1136. BIM(I,K) = -(AIM(I,K) + CIM(I,K))
  1137. DF1(I) = DF2
  1138. KT1(I) = KT2(I)
  1139. DMDZ(I) = DMDZ2(I)
  1140. DDZ(I) = DDZ2(I)
  1141. ENDIF
  1142. ENDDO
  1143. ENDDO
  1144. !!
  1145. 600 CONTINUE
  1146. !
  1147. ! UPDATE SOIL TEMPERATURE AND SEA ICE TEMPERATURE
  1148. !
  1149. DO I=1,IM
  1150. FLAG(I) = SLIMSK(I).NE.0.
  1151. ENDDO
  1152. !
  1153. ! SURFACE TEMPERATURE IS PART OF THE UPDATE WHEN SNOW IS ABSENT
  1154. !
  1155. DO I=1,IM
  1156. ! IF(FLAG(I).AND.SNOWD(I).LE..001) THEN
  1157. IF(FLAG(I).AND..NOT.FLAGSNW(I)) THEN
  1158. YY(I) = T1(I) + &
  1159. ! & (RCAP(I)-GFLUX(I) + THETA1 - T1(I) &
  1160. & (RCAP(I)-GFLUX(I) &
  1161. & - EVAP(I)) / (RSMALL(I) * RCH(I))
  1162. ZZ(I) = 1. + DFT0(I) / (-.5 * ZSOIL(I,1) * RCH(I) * RSMALL(I))
  1163. XX(I) = DFT0(I) * (STSOIL(I,1) - YY(I)) / &
  1164. & (.5 * ZSOIL(I,1) * ZZ(I))
  1165. ENDIF
  1166. ! IF(FLAG(I).AND.SNOWD(I).GT..001) THEN
  1167. IF(FLAG(I).AND.FLAGSNW(I)) THEN
  1168. YY(I) = STSOIL(I,1)
  1169. !
  1170. ! HEAT FLUX FROM SNOW IS EXPLICIT IN TIME
  1171. !
  1172. ZZ(I) = 1.
  1173. XX(I) = DFSNOW * (STSOIL(I,1) - TSURF(I)) &
  1174. & / (-FACTSNW(I) * MAX(SNOWD(I),.001_kind_phys))
  1175. ENDIF
  1176. ENDDO
  1177. !
  1178. ! COMPUTE THE FORCING AND THE IMPLICIT MATRIX ELEMENTS FOR UPDATE
  1179. !
  1180. ! CH2O IS THE HEAT CAPACITY OF WATER AND CSOIL IS THE HEAT CAPACITY OF
  1181. !
  1182. DO I = 1, IM
  1183. IF(FLAG(I)) THEN
  1184. SMCZ(I) = MAX(SMC(I,1), SMC(I,2))
  1185. DTDZ1(I) = (STSOIL(I,1) - STSOIL(I,2)) / (-.5 * ZSOIL(I,2))
  1186. IF(SLIMSK(I).EQ.1.) THEN
  1187. DFT1(I) = KTSOIL(SMCZ(I),SOILTYP(I))
  1188. HCPCT(I) = SMC(I,1) * CH2O + (1. - SMC(I,1)) * CSOIL
  1189. ELSE
  1190. DFT1(I) = DFT0(I)
  1191. HCPCT(I) = CICE
  1192. ENDIF
  1193. DFT2(I) = DFT1(I)
  1194. DDZ(I) = 1. / (-.5 * ZSOIL(I,2))
  1195. !
  1196. ! AI, BI, AND CI ARE THE ELEMENTS OF THE TRIDIAGONAL MATRIX FOR THE
  1197. ! IMPLICIT UPDATE OF THE SOIL TEMPERATURE
  1198. !
  1199. AI(I,1) = 0.
  1200. BI(I,1) = DFT1(I) * DDZ(I) / (-ZSOIL(I,1) * HCPCT(I))
  1201. CI(I,1) = -BI(I,1)
  1202. BI(I,1) = BI(I,1) &
  1203. & + DFT0(I) / (.5 * ZSOIL(I,1) **2 * HCPCT(I) * ZZ(I))
  1204. ! SS = DFT0(I) * (STSOIL(I,1) - YY(I)) &
  1205. ! & / (.5 * ZSOIL(I,1) * ZZ(I))
  1206. ! RHSTC(1) = (DFT1(I) * DTDZ1(I) - SS)
  1207. RHSTC(I,1) = (DFT1(I) * DTDZ1(I) - XX(I)) &
  1208. & / (ZSOIL(I,1) * HCPCT(I))
  1209. ENDIF
  1210. ENDDO
  1211. !!
  1212. DO K = 2, KM
  1213. DO I=1,IM
  1214. IF(SLIMSK(I).EQ.1.) THEN
  1215. HCPCT(I) = SMC(I,K) * CH2O + (1. - SMC(I,K)) * CSOIL
  1216. ELSEIF(SLIMSK(I).EQ.2.) THEN
  1217. HCPCT(I) = CICE
  1218. ENDIF
  1219. ENDDO
  1220. IF(K.LT.KM) THEN
  1221. DO I = 1, IM
  1222. IF(FLAG(I)) THEN
  1223. DTDZ2(I) = (STSOIL(I,K) - STSOIL(I,K+1)) &
  1224. & / (.5 * (ZSOIL(I,K-1) - ZSOIL(I,K+1)))
  1225. SMCZ(I) = MAX(SMC(I,K), SMC(I,K+1))
  1226. IF(SLIMSK(I).EQ.1.) THEN
  1227. DFT2(I) = KTSOIL(SMCZ(I),SOILTYP(I))
  1228. ENDIF
  1229. DDZ2(I) = 2. / (ZSOIL(I,K-1) - ZSOIL(I,K+1))
  1230. CI(I,K) = -DFT2(I) * DDZ2(I) &
  1231. & / ((ZSOIL(I,K-1) - ZSOIL(I,K)) * HCPCT(I))
  1232. ENDIF
  1233. ENDDO
  1234. ELSE
  1235. !
  1236. ! AT THE BOTTOM, CLIMATOLOGY IS ASSUMED AT 2M DEPTH FOR LAND AND
  1237. ! FREEZING TEMPERATURE IS ASSUMED FOR SEA ICE AT Z(KM)
  1238. DO I = 1, IM
  1239. IF(SLIMSK(I).EQ.1.) THEN
  1240. DTDZ2(I) = (STSOIL(I,K) - TG3(I)) &
  1241. & / (.5 * (ZSOIL(I,K-1) + ZSOIL(I,K)) - ZBOT)
  1242. DFT2(I) = KTSOIL(SMC(I,K),SOILTYP(I))
  1243. CI(I,K) = 0.
  1244. ENDIF
  1245. IF(SLIMSK(I).EQ.2.) THEN
  1246. DTDZ2(I) = (STSOIL(I,K) - TGICE) &
  1247. & / (.5 * ZSOIL(I,K-1) - .5 * ZSOIL(I,K))
  1248. DFT2(I) = DFT1(I)
  1249. CI(I,K) = 0.
  1250. ENDIF
  1251. ENDDO
  1252. ENDIF
  1253. DO I = 1, IM
  1254. IF(FLAG(I)) THEN
  1255. RHSTC(I,K) = (DFT2(I) * DTDZ2(I) - DFT1(I) * DTDZ1(I)) &
  1256. & / ((ZSOIL(I,K) - ZSOIL(I,K-1)) * HCPCT(I))
  1257. AI(I,K) = -DFT1(I) * DDZ(I) &
  1258. & / ((ZSOIL(I,K-1) - ZSOIL(I,K)) * HCPCT(I))
  1259. BI(I,K) = -(AI(I,K) + CI(I,K))
  1260. DFT1(I) = DFT2(I)
  1261. DTDZ1(I) = DTDZ2(I)
  1262. DDZ(I) = DDZ2(I)
  1263. ENDIF
  1264. ENDDO
  1265. ENDDO
  1266. !!
  1267. 700 CONTINUE
  1268. !
  1269. ! SOLVE THE TRI-DIAGONAL MATRIX
  1270. !
  1271. DO K = 1, KM
  1272. DO I=1,IM
  1273. IF(FLAG(I)) THEN
  1274. RHSTC(I,K) = RHSTC(I,K) * DELT2
  1275. AI(I,K) = AI(I,K) * DELT2
  1276. BI(I,K) =

Large files files are truncated, but you can click here to view the full file