PageRenderTime 138ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 2ms

/wrfv2_fire/phys/module_sf_noahmplsm.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 8875 lines | 5630 code | 1321 blank | 1924 comment | 120 complexity | 9bdab95b1e3a0cc9ff0a5e1b9fd0b8d3 MD5 | raw file
Possible License(s): AGPL-1.0
  1. module noahmp_globals
  2. ! Maybe most of these can be moved to a REDPRM use statement?
  3. use module_sf_noahlsm, only: &
  4. & SLCATS, &
  5. & LUCATS, &
  6. & CSOIL_DATA, &
  7. & BB, &
  8. & SATDK, &
  9. & SATDW, &
  10. & F11, &
  11. & SATPSI, &
  12. & QTZ, &
  13. & DRYSMC, &
  14. & MAXSMC, &
  15. & REFSMC, &
  16. & WLTSMC, &
  17. & RSTBL, &
  18. & RGLTBL, &
  19. & HSTBL, &
  20. & NROTBL, &
  21. & TOPT_DATA, &
  22. & RSMAX_DATA, &
  23. & ZBOT_DATA, &
  24. & CZIL_DATA, &
  25. & FRZK_DATA, &
  26. & SLOPE_DATA, &
  27. & REFDK_DATA, &
  28. & REFKDT_DATA
  29. implicit none
  30. ! ==================================================================================================
  31. !------------------------------------------------------------------------------------------!
  32. ! Physical Constants: !
  33. !------------------------------------------------------------------------------------------!
  34. REAL, PARAMETER :: GRAV = 9.80616 !acceleration due to gravity (m/s2)
  35. REAL, PARAMETER :: SB = 5.67E-08 !Stefan-Boltzmann constant (w/m2/k4)
  36. REAL, PARAMETER :: VKC = 0.40 !von Karman constant
  37. REAL, PARAMETER :: TFRZ = 273.16 !freezing/melting point (k)
  38. REAL, PARAMETER :: HSUB = 2.8440E06 !latent heat of sublimation (j/kg)
  39. REAL, PARAMETER :: HVAP = 2.5104E06 !latent heat of vaporization (j/kg)
  40. REAL, PARAMETER :: HFUS = 0.3336E06 !latent heat of fusion (j/kg)
  41. REAL, PARAMETER :: CWAT = 4.188E06 !specific heat capacity of water (j/m3/k)
  42. REAL, PARAMETER :: CICE = 2.094E06 !specific heat capacity of ice (j/m3/k)
  43. REAL, PARAMETER :: CPAIR = 1004.64 !heat capacity dry air at const pres (j/kg/k)
  44. REAL, PARAMETER :: TKWAT = 0.6 !thermal conductivity of water (w/m/k)
  45. REAL, PARAMETER :: TKICE = 2.2 !thermal conductivity of ice (w/m/k)
  46. REAL, PARAMETER :: TKAIR = 0.023 !thermal conductivity of air (w/m/k)
  47. REAL, PARAMETER :: RAIR = 287.04 !gas constant for dry air (j/kg/k)
  48. REAL, PARAMETER :: RW = 461.269 !gas constant for water vapor (j/kg/k)
  49. REAL, PARAMETER :: DENH2O = 1000. !density of water (kg/m3)
  50. REAL, PARAMETER :: DENICE = 917. !density of ice (kg/m3)
  51. !------------------------------------------------------------------------------------------!
  52. ! From the VEGPARM.TBL tables, as functions of vegetation category.
  53. !------------------------------------------------------------------------------------------!
  54. INTEGER :: NROOT !rooting depth [as the number of layers] ( Assigned in REDPRM )
  55. REAL :: RGL !parameter used in radiation stress function ( Assigned in REDPRM )
  56. REAL :: RSMIN !minimum Canopy Resistance [s/m] ( Assigned in REDPRM )
  57. REAL :: HS !parameter used in vapor pressure deficit function ( Assigned in REDPRM )
  58. REAL :: RSMAX !maximum stomatal resistance ( Assigned in REDPRM )
  59. REAL :: TOPT !optimum transpiration air temperature.
  60. !KWM CHARACTER(LEN=256) :: LUTYPE
  61. !KWM INTEGER :: LUCATS, BARE
  62. !KWM INTEGER, PARAMETER :: NLUS=50
  63. !KWM INTEGER, DIMENSION(1:NLUS) :: NROTBL
  64. !KWM REAL, DIMENSION(1:NLUS) :: RSTBL, RGLTBL, HSTBL
  65. !KWM REAL :: TOPT_DATA,RSMAX_DATA
  66. ! not further used in this version (niu):
  67. !KWM REAL, DIMENSION(1:NLUS) :: SNUPTBL, LAITBL, &
  68. !KWM ALBTBL, SHDTBL, MAXALB
  69. !KWM REAL :: CMCMAX_DATA,CFACTR_DATA,SBETA_DATA,&
  70. !KWM SALP_DATA ,SMLOW_DATA ,SMHIGH_DATA
  71. !KWM REAL, DIMENSION(NLUS) :: LAIMINTBL !KWM
  72. !KWM REAL, DIMENSION(NLUS) :: LAIMAXTBL !KWM
  73. !KWM REAL, DIMENSION(NLUS) :: EMISSMINTBL !KWM
  74. !KWM REAL, DIMENSION(NLUS) :: EMISSMAXTBL !KWM
  75. !KWM REAL, DIMENSION(NLUS) :: ALBEDOMINTBL !KWM
  76. !KWM REAL, DIMENSION(NLUS) :: ALBEDOMAXTBL !KWM
  77. !KWM REAL, DIMENSION(NLUS) :: Z0MINTBL !KWM
  78. !KWM REAL, DIMENSION(NLUS) :: Z0MAXTBL !KWM
  79. !------------------------------------------------------------------------------------------!
  80. ! From the SOILPARM.TBL tables, as functions of soil category.
  81. !------------------------------------------------------------------------------------------!
  82. REAL :: BEXP !B parameter ( Assigned in REDPRM )
  83. REAL :: SMCDRY !dry soil moisture threshold where direct evap from top
  84. !layer ends (volumetric) ( Assigned in REDPRM )
  85. REAL :: F1 !soil thermal diffusivity/conductivity coef ( Assigned in REDPRM )
  86. REAL :: SMCMAX !porosity, saturated value of soil moisture (volumetric)
  87. REAL :: SMCREF !reference soil moisture (field capacity) (volumetric) ( Assigned in REDPRM )
  88. REAL :: PSISAT !saturated soil matric potential ( Assigned in REDPRM )
  89. REAL :: DKSAT !saturated soil hydraulic conductivity ( Assigned in REDPRM )
  90. REAL :: DWSAT !saturated soil hydraulic diffusivity ( Assigned in REDPRM )
  91. REAL :: SMCWLT !wilting point soil moisture (volumetric) ( Assigned in REDPRM )
  92. REAL :: QUARTZ !soil quartz content ( Assigned in REDPRM )
  93. !KWM CHARACTER*4 SLTYPE
  94. !KWM INTEGER :: SLCATS
  95. !KWM INTEGER, PARAMETER :: NSLTYPE=30
  96. !KWM REAL, DIMENSION (1:NSLTYPE) :: BB,DRYSMC,F11, &
  97. !KWM MAXSMC, REFSMC,SATPSI,SATDK,SATDW, WLTSMC,QTZ
  98. !------------------------------------------------------------------------------------------!
  99. ! From the GENPARM.TBL file
  100. !------------------------------------------------------------------------------------------!
  101. REAL :: SLOPE !slope index (0 - 1) ( Assigned in REDPRM )
  102. REAL :: CSOIL !vol. soil heat capacity [j/m3/K] ( Assigned in REDPRM )
  103. REAL :: ZBOT !Depth (m) of lower boundary soil temperature ( Assigned in REDPRM )
  104. REAL :: CZIL !Calculate roughness length of heat ( Assigned in REDPRM )
  105. REAL :: KDT !used in compute maximum infiltration rate (in INFIL) ( Assigned in REDPRM )
  106. REAL :: FRZX !used in compute maximum infiltration rate (in INFIL) ( Assigned in REDPRM )
  107. ! LSM GENERAL PARAMETERS
  108. !KWM INTEGER :: SLPCATS
  109. !KWM INTEGER, PARAMETER :: NSLOPE=30
  110. !KWM REAL, DIMENSION (1:NSLOPE) :: SLOPE_DATA
  111. !KWM REAL :: FXEXP_DATA,CSOIL_DATA,REFDK_DATA , &
  112. !KWM REFKDT_DATA,FRZK_DATA ,ZBOT_DATA ,CZIL_DATA
  113. ! =====================================options for different schemes================================
  114. ! options for dynamic vegetation:
  115. ! 1 -> off (use table LAI; use FVEG = SHDFAC from input)
  116. ! 2 -> on (together with OPT_CRS = 1)
  117. ! 3 -> off (use table LAI; calculate FVEG)
  118. ! 4 -> off (use table LAI; use maximum vegetation fraction)
  119. INTEGER :: DVEG != 2 !
  120. ! options for canopy stomatal resistance
  121. ! 1-> Ball-Berry; 2->Jarvis
  122. INTEGER :: OPT_CRS != 1 !(must 1 when DVEG = 2)
  123. ! options for soil moisture factor for stomatal resistance
  124. ! 1-> Noah (soil moisture)
  125. ! 2-> CLM (matric potential)
  126. ! 3-> SSiB (matric potential)
  127. INTEGER :: OPT_BTR != 1 !(suggested 1)
  128. ! options for runoff and groundwater
  129. ! 1 -> TOPMODEL with groundwater (Niu et al. 2007 JGR) ;
  130. ! 2 -> TOPMODEL with an equilibrium water table (Niu et al. 2005 JGR) ;
  131. ! 3 -> original surface and subsurface runoff (free drainage)
  132. ! 4 -> BATS surface and subsurface runoff (free drainage)
  133. INTEGER :: OPT_RUN != 1 !(suggested 1)
  134. ! options for surface layer drag coeff (CH & CM)
  135. ! 1->M-O ; 2->original Noah (Chen97); 3->MYJ consistent; 4->YSU consistent.
  136. INTEGER :: OPT_SFC != 1 !(1 or 2 or 3 or 4)
  137. ! options for supercooled liquid water (or ice fraction)
  138. ! 1-> no iteration (Niu and Yang, 2006 JHM); 2: Koren's iteration
  139. INTEGER :: OPT_FRZ != 1 !(1 or 2)
  140. ! options for frozen soil permeability
  141. ! 1 -> linear effects, more permeable (Niu and Yang, 2006, JHM)
  142. ! 2 -> nonlinear effects, less permeable (old)
  143. INTEGER :: OPT_INF != 1 !(suggested 1)
  144. ! options for radiation transfer
  145. ! 1 -> modified two-stream (gap = F(solar angle, 3D structure ...)<1-FVEG)
  146. ! 2 -> two-stream applied to grid-cell (gap = 0)
  147. ! 3 -> two-stream applied to vegetated fraction (gap=1-FVEG)
  148. INTEGER :: OPT_RAD != 1 !(suggested 1)
  149. ! options for ground snow surface albedo
  150. ! 1-> BATS; 2 -> CLASS
  151. INTEGER :: OPT_ALB != 2 !(suggested 2)
  152. ! options for partitioning precipitation into rainfall & snowfall
  153. ! 1 -> Jordan (1991); 2 -> BATS: when SFCTMP<TFRZ+2.2 ; 3-> SFCTMP<TFRZ
  154. INTEGER :: OPT_SNF != 1 !(suggested 1)
  155. ! options for lower boundary condition of soil temperature
  156. ! 1 -> zero heat flux from bottom (ZBOT and TBOT not used)
  157. ! 2 -> TBOT at ZBOT (8m) read from a file (original Noah)
  158. INTEGER :: OPT_TBOT != 2 !(suggested 2)
  159. ! options for snow/soil temperature time scheme (only layer 1)
  160. ! 1 -> semi-implicit; 2 -> full implicit (original Noah)
  161. INTEGER :: OPT_STC != 1 !(suggested 1)
  162. ! ==================================================================================================
  163. ! runoff parameters used for SIMTOP and SIMGM:
  164. REAL, PARAMETER :: TIMEAN = 10.5 !gridcell mean topgraphic index (global mean)
  165. REAL, PARAMETER :: FSATMX = 0.38 !maximum surface saturated fraction (global mean)
  166. ! adjustable parameters for snow processes
  167. REAL, PARAMETER :: M = 1.0 ! 2.50 !melting factor (-)
  168. REAL, PARAMETER :: Z0SNO = 0.002 !snow surface roughness length (m) (0.002)
  169. REAL, PARAMETER :: SSI = 0.03 !liquid water holding capacity for snowpack (m3/m3) (0.03)
  170. REAL, PARAMETER :: SWEMX = 1.00 !new snow mass to fully cover old snow (mm)
  171. !equivalent to 10mm depth (density = 100 kg/m3)
  172. ! NOTES: things to add or improve
  173. ! 1. lake model: explicit representation of lake water storage, sunlight through lake
  174. ! with different purity, turbulent mixing of surface laker water, snow on frozen lake, etc.
  175. ! 2. shallow snow wihtout a layer: melting energy
  176. ! 3. urban model to be added.
  177. ! 4. irrigation
  178. !------------------------------------------------------------------------------------------!
  179. END MODULE NOAHMP_GLOBALS
  180. !------------------------------------------------------------------------------------------!
  181. !------------------------------------------------------------------------------------------!
  182. MODULE NOAHMP_VEG_PARAMETERS
  183. IMPLICIT NONE
  184. INTEGER, PARAMETER :: MAX_VEG_PARAMS = 33
  185. INTEGER, PARAMETER :: MVT = 27
  186. INTEGER, PARAMETER :: MBAND = 2
  187. INTEGER, PRIVATE :: ISURBAN
  188. INTEGER :: ISWATER
  189. INTEGER :: ISBARREN
  190. INTEGER :: ISSNOW
  191. INTEGER :: EBLFOREST
  192. REAL :: CH2OP(MVT) !maximum intercepted h2o per unit lai+sai (mm)
  193. REAL :: DLEAF(MVT) !characteristic leaf dimension (m)
  194. REAL :: Z0MVT(MVT) !momentum roughness length (m)
  195. REAL :: HVT(MVT) !top of canopy (m)
  196. REAL :: HVB(MVT) !bottom of canopy (m)
  197. REAL :: DEN(MVT) !tree density (no. of trunks per m2)
  198. REAL :: RC(MVT) !tree crown radius (m)
  199. REAL :: SAIM(MVT,12) !monthly stem area index, one-sided
  200. REAL :: LAIM(MVT,12) !monthly leaf area index, one-sided
  201. REAL :: SLA(MVT) !single-side leaf area per Kg [m2/kg]
  202. REAL :: DILEFC(MVT) !coeficient for leaf stress death [1/s]
  203. REAL :: DILEFW(MVT) !coeficient for leaf stress death [1/s]
  204. REAL :: FRAGR(MVT) !fraction of growth respiration !original was 0.3
  205. REAL :: LTOVRC(MVT) !leaf turnover [1/s]
  206. REAL :: C3PSN(MVT) !photosynthetic pathway: 0. = c4, 1. = c3
  207. REAL :: KC25(MVT) !co2 michaelis-menten constant at 25c (pa)
  208. REAL :: AKC(MVT) !q10 for kc25
  209. REAL :: KO25(MVT) !o2 michaelis-menten constant at 25c (pa)
  210. REAL :: AKO(MVT) !q10 for ko25
  211. REAL :: VCMX25(MVT) !maximum rate of carboxylation at 25c (umol co2/m**2/s)
  212. REAL :: AVCMX(MVT) !q10 for vcmx25
  213. REAL :: BP(MVT) !minimum leaf conductance (umol/m**2/s)
  214. REAL :: MP(MVT) !slope of conductance-to-photosynthesis relationship
  215. REAL :: QE25(MVT) !quantum efficiency at 25c (umol co2 / umol photon)
  216. REAL :: AQE(MVT) !q10 for qe25
  217. REAL :: RMF25(MVT) !leaf maintenance respiration at 25c (umol co2/m**2/s)
  218. REAL :: RMS25(MVT) !stem maintenance respiration at 25c (umol co2/kg bio/s)
  219. REAL :: RMR25(MVT) !root maintenance respiration at 25c (umol co2/kg bio/s)
  220. REAL :: ARM(MVT) !q10 for maintenance respiration
  221. REAL :: FOLNMX(MVT) !foliage nitrogen concentration when f(n)=1 (%)
  222. REAL :: TMIN(MVT) !minimum temperature for photosynthesis (k)
  223. REAL :: XL(MVT) !leaf/stem orientation index
  224. REAL :: RHOL(MVT,MBAND) !leaf reflectance: 1=vis, 2=nir
  225. REAL :: RHOS(MVT,MBAND) !stem reflectance: 1=vis, 2=nir
  226. REAL :: TAUL(MVT,MBAND) !leaf transmittance: 1=vis, 2=nir
  227. REAL :: TAUS(MVT,MBAND) !stem transmittance: 1=vis, 2=nir
  228. REAL :: MRP(MVT) !microbial respiration parameter (umol co2 /kg c/ s)
  229. REAL :: CWPVT(MVT) !empirical canopy wind parameter
  230. REAL :: WRRAT(MVT) !wood to non-wood ratio
  231. REAL :: WDPOOL(MVT) !wood pool (switch 1 or 0) depending on woody or not [-]
  232. REAL :: TDLEF(MVT) !characteristic T for leaf freezing [K]
  233. INTEGER :: IK,IM
  234. REAL :: TMP10(MVT*MBAND)
  235. REAL :: TMP11(MVT*MBAND)
  236. REAL :: TMP12(MVT*MBAND)
  237. REAL :: TMP13(MVT*MBAND)
  238. REAL :: TMP14(MVT*12)
  239. REAL :: TMP15(MVT*12)
  240. REAL :: TMP16(MVT*5)
  241. real slarea(MVT)
  242. real eps(MVT,5)
  243. CONTAINS
  244. subroutine read_mp_veg_parameters(DATASET_IDENTIFIER)
  245. implicit none
  246. character(len=*), intent(in) :: DATASET_IDENTIFIER
  247. integer :: ierr
  248. ! Temporary arrays used in reshaping namelist arrays
  249. REAL :: TMP10(MVT*MBAND)
  250. REAL :: TMP11(MVT*MBAND)
  251. REAL :: TMP12(MVT*MBAND)
  252. REAL :: TMP13(MVT*MBAND)
  253. REAL :: TMP14(MVT*12)
  254. REAL :: TMP15(MVT*12)
  255. REAL :: TMP16(MVT*5)
  256. integer :: NVEG
  257. character(len=256) :: VEG_DATASET_DESCRIPTION
  258. NAMELIST / noah_mp_usgs_veg_categories / VEG_DATASET_DESCRIPTION, NVEG
  259. NAMELIST / noah_mp_usgs_parameters / ISURBAN, ISWATER, ISBARREN, ISSNOW, EBLFOREST, &
  260. CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, RHOL, RHOS, TAUL, TAUS, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, &
  261. LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , BP, MP, QE25, RMS25, RMR25, ARM, FOLNMX, WDPOOL, WRRAT, MRP, &
  262. SAIM, LAIM, SLAREA, EPS
  263. NAMELIST / noah_mp_modis_veg_categories / VEG_DATASET_DESCRIPTION, NVEG
  264. NAMELIST / noah_mp_modis_parameters / ISURBAN, ISWATER, ISBARREN, ISSNOW, EBLFOREST, &
  265. CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, RHOL, RHOS, TAUL, TAUS, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, &
  266. LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , BP, MP, QE25, RMS25, RMR25, ARM, FOLNMX, WDPOOL, WRRAT, MRP, &
  267. SAIM, LAIM, SLAREA, EPS
  268. ! Initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything.
  269. CH2OP = -1.E36
  270. DLEAF = -1.E36
  271. Z0MVT = -1.E36
  272. HVT = -1.E36
  273. HVB = -1.E36
  274. DEN = -1.E36
  275. RC = -1.E36
  276. RHOL = -1.E36
  277. RHOS = -1.E36
  278. TAUL = -1.E36
  279. TAUS = -1.E36
  280. XL = -1.E36
  281. CWPVT = -1.E36
  282. C3PSN = -1.E36
  283. KC25 = -1.E36
  284. AKC = -1.E36
  285. KO25 = -1.E36
  286. AKO = -1.E36
  287. AVCMX = -1.E36
  288. AQE = -1.E36
  289. LTOVRC = -1.E36
  290. DILEFC = -1.E36
  291. DILEFW = -1.E36
  292. RMF25 = -1.E36
  293. SLA = -1.E36
  294. FRAGR = -1.E36
  295. TMIN = -1.E36
  296. VCMX25 = -1.E36
  297. TDLEF = -1.E36
  298. BP = -1.E36
  299. MP = -1.E36
  300. QE25 = -1.E36
  301. RMS25 = -1.E36
  302. RMR25 = -1.E36
  303. ARM = -1.E36
  304. FOLNMX = -1.E36
  305. WDPOOL = -1.E36
  306. WRRAT = -1.E36
  307. MRP = -1.E36
  308. SAIM = -1.E36
  309. LAIM = -1.E36
  310. SLAREA = -1.E36
  311. EPS = -1.E36
  312. open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr)
  313. if (ierr /= 0) then
  314. write(*,'("****** Error ******************************************************")')
  315. write(*,'("Cannot find file MPTABLE.TBL")')
  316. write(*,'("STOP")')
  317. write(*,'("*******************************************************************")')
  318. call wrf_error_fatal("STOP in Noah-MP read_mp_veg_parameters")
  319. endif
  320. if ( trim(DATASET_IDENTIFIER) == "USGS" ) then
  321. read(15,noah_mp_usgs_veg_categories)
  322. read(15,noah_mp_usgs_parameters)
  323. else if ( trim(DATASET_IDENTIFIER) == "MODIFIED_IGBP_MODIS_NOAH" ) then
  324. read(15,noah_mp_modis_veg_categories)
  325. read(15,noah_mp_modis_parameters)
  326. else
  327. write(*,'("Unrecognized DATASET_IDENTIFIER in subroutine READ_MP_VEG_PARAMETERS")')
  328. write(*,'("DATASET_IDENTIFIER = ''", A, "''")') trim(DATASET_IDENTIFIER)
  329. call wrf_error_fatal("STOP in Noah-MP read_mp_veg_parameters")
  330. endif
  331. close(15)
  332. ! Problem. Namelist reading of 2-d arrays doesn't work well when the arrays are declared with larger dimension than the
  333. ! variables in the provided namelist. So we need to reshape the 2-d arrays after we've read them.
  334. if ( MVT > NVEG ) then
  335. !
  336. ! Reshape the 2-d arrays:
  337. !
  338. TMP10 = reshape( RHOL, (/ MVT*size(RHOL,2) /))
  339. TMP11 = reshape( RHOS, (/ MVT*size(RHOS,2) /))
  340. TMP12 = reshape( TAUL, (/ MVT*size(TAUL,2) /))
  341. TMP13 = reshape( TAUS, (/ MVT*size(TAUS,2) /))
  342. TMP14 = reshape( SAIM, (/ MVT*size(SAIM,2) /))
  343. TMP15 = reshape( LAIM, (/ MVT*size(LAIM,2) /))
  344. TMP16 = reshape( EPS, (/ MVT*size(EPS ,2) /))
  345. RHOL(1:NVEG,:) = reshape( TMP10, (/ NVEG, size(RHOL,2) /))
  346. RHOS(1:NVEG,:) = reshape( TMP11, (/ NVEG, size(RHOS,2) /))
  347. TAUL(1:NVEG,:) = reshape( TMP12, (/ NVEG, size(TAUL,2) /))
  348. TAUS(1:NVEG,:) = reshape( TMP13, (/ NVEG, size(TAUS,2) /))
  349. SAIM(1:NVEG,:) = reshape( TMP14, (/ NVEG, size(SAIM,2) /))
  350. LAIM(1:NVEG,:) = reshape( TMP15, (/ NVEG, size(LAIM,2) /))
  351. EPS(1:NVEG,:) = reshape( TMP16, (/ NVEG, size(EPS,2) /))
  352. RHOL(NVEG+1:MVT,:) = -1.E36
  353. RHOS(NVEG+1:MVT,:) = -1.E36
  354. TAUL(NVEG+1:MVT,:) = -1.E36
  355. TAUS(NVEG+1:MVT,:) = -1.E36
  356. SAIM(NVEG+1:MVT,:) = -1.E36
  357. LAIM(NVEG+1:MVT,:) = -1.E36
  358. EPS( NVEG+1:MVT,:) = -1.E36
  359. endif
  360. end subroutine read_mp_veg_parameters
  361. END MODULE NOAHMP_VEG_PARAMETERS
  362. ! ==================================================================================================
  363. ! ==================================================================================================
  364. MODULE NOAHMP_RAD_PARAMETERS
  365. IMPLICIT NONE
  366. INTEGER I ! loop index
  367. INTEGER, PARAMETER :: MSC = 9
  368. INTEGER, PARAMETER :: MBAND = 2
  369. REAL :: ALBSAT(MSC,MBAND) !saturated soil albedos: 1=vis, 2=nir
  370. REAL :: ALBDRY(MSC,MBAND) !dry soil albedos: 1=vis, 2=nir
  371. REAL :: ALBICE(MBAND) !albedo land ice: 1=vis, 2=nir
  372. REAL :: ALBLAK(MBAND) !albedo frozen lakes: 1=vis, 2=nir
  373. REAL :: OMEGAS(MBAND) !two-stream parameter omega for snow
  374. REAL :: BETADS !two-stream parameter betad for snow
  375. REAL :: BETAIS !two-stream parameter betad for snow
  376. REAL :: EG(2) !emissivity
  377. ! saturated soil albedos: 1=vis, 2=nir
  378. DATA(ALBSAT(I,1),I=1,8)/0.15,0.11,0.10,0.09,0.08,0.07,0.06,0.05/
  379. DATA(ALBSAT(I,2),I=1,8)/0.30,0.22,0.20,0.18,0.16,0.14,0.12,0.10/
  380. ! dry soil albedos: 1=vis, 2=nir
  381. DATA(ALBDRY(I,1),I=1,8)/0.27,0.22,0.20,0.18,0.16,0.14,0.12,0.10/
  382. DATA(ALBDRY(I,2),I=1,8)/0.54,0.44,0.40,0.36,0.32,0.28,0.24,0.20/
  383. ! albedo land ice: 1=vis, 2=nir
  384. DATA (ALBICE(I),I=1,MBAND) /0.80, 0.55/
  385. ! albedo frozen lakes: 1=vis, 2=nir
  386. DATA (ALBLAK(I),I=1,MBAND) /0.60, 0.40/
  387. ! omega,betad,betai for snow
  388. DATA (OMEGAS(I),I=1,MBAND) /0.8, 0.4/
  389. DATA BETADS, BETAIS /0.5, 0.5/
  390. ! emissivity ground surface
  391. DATA EG /0.97, 0.98/ ! 1-soil;2-lake
  392. END MODULE NOAHMP_RAD_PARAMETERS
  393. ! ==================================================================================================
  394. MODULE NOAHMP_ROUTINES
  395. USE NOAHMP_GLOBALS
  396. IMPLICIT NONE
  397. public :: noahmp_options
  398. public :: NOAHMP_SFLX
  399. public :: REDPRM
  400. public :: FRH2O
  401. private :: ATM
  402. private :: PHENOLOGY
  403. private :: ENERGY
  404. private :: THERMOPROP
  405. private :: CSNOW
  406. private :: TDFCND
  407. private :: RADIATION
  408. private :: ALBEDO
  409. private :: SNOW_AGE
  410. private :: SNOWALB_BATS
  411. private :: SNOWALB_CLASS
  412. private :: GROUNDALB
  413. private :: TWOSTREAM
  414. private :: SURRAD
  415. private :: VEGE_FLUX
  416. private :: SFCDIF1
  417. private :: SFCDIF2
  418. private :: STOMATA
  419. private :: CANRES
  420. private :: ESAT
  421. private :: RAGRB
  422. private :: BARE_FLUX
  423. private :: TSNOSOI
  424. private :: HRT
  425. private :: HSTEP
  426. private :: ROSR12
  427. private :: PHASECHANGE
  428. private :: WATER
  429. private :: CANWATER
  430. private :: SNOWWATER
  431. private :: SNOWFALL
  432. private :: COMBINE
  433. private :: DIVIDE
  434. private :: COMBO
  435. private :: COMPACT
  436. private :: SNOWH2O
  437. private :: SOILWATER
  438. private :: ZWTEQ
  439. private :: INFIL
  440. private :: SRT
  441. private :: WDFCND1
  442. private :: WDFCND2
  443. ! private :: INFIL
  444. private :: SSTEP
  445. private :: GROUNDWATER
  446. private :: CARBON
  447. private :: CO2FLUX
  448. ! private :: BVOCFLUX
  449. ! private :: CH4FLUX
  450. private :: ERROR
  451. contains
  452. !
  453. ! ==================================================================================================
  454. SUBROUTINE NOAHMP_SFLX (&
  455. & ILOC , JLOC , LAT , YEARLEN , JULIAN , COSZ , & ! IN : Time/Space-related
  456. & DT , DX , DZ8W , NSOIL , ZSOIL , NSNOW , & ! IN : Model configuration
  457. & SHDFAC , SHDMAX , VEGTYP , ISURBAN , ICE , IST , & ! IN : Vegetation/Soil characteristics
  458. & ISC , & ! IN : Vegetation/Soil characteristics
  459. & IZ0TLND , & ! IN : User options
  460. & SFCTMP , SFCPRS , PSFC , UU , VV , Q2 , & ! IN : Forcing
  461. & QC , SOLDN , LWDN , PRCP , TBOT , CO2AIR , & ! IN : Forcing
  462. & O2AIR , FOLN , FICEOLD , PBLH , & ! IN : Forcing
  463. & ZLVL , ALBOLD , SNEQVO , & ! IN/OUT :
  464. & STC , SH2O , SMC , TAH , EAH , FWET , & ! IN/OUT :
  465. & CANLIQ , CANICE , TV , TG , QSFC , QSNOW , & ! IN/OUT :
  466. & ISNOW , ZSNSO , SNOWH , SNEQV , SNICE , SNLIQ , & ! IN/OUT :
  467. & ZWT , WA , WT , WSLAKE , LFMASS , RTMASS , & ! IN/OUT :
  468. & STMASS , WOOD , STBLCP , FASTCP , LAI , SAI , & ! IN/OUT :
  469. & CM , CH , CHSTAR , & ! IN/OUT :
  470. & FSA , FSR , FIRA , FSH , SSOIL , FCEV , & ! OUT :
  471. & FGEV , FCTR , ECAN , ETRAN , EDIR , TRAD , & ! OUT :
  472. & TS , TGB , TGV , T2MV , T2MB , TSTAR , & ! OUT :
  473. & Q1 , Q2V , Q2B , RUNSRF , RUNSUB , APAR , & ! OUT :
  474. & PSN , SAV , SAG , FSNO , NEE , GPP , & ! OUT :
  475. & NPP , FVEG , ALBEDO , QMELT , PONDING , PONDING1, & ! OUT :
  476. & PONDING2, RSSUN , RSSHA , BGAP , WGAP , GAP , & ! OUT :
  477. & ERRWAT , CHV , CHB , EMISSI) ! OUT :
  478. ! --------------------------------------------------------------------------------------------------
  479. ! Initial code: Guo-Yue Niu, Oct. 2007
  480. ! --------------------------------------------------------------------------------------------------
  481. USE NOAHMP_VEG_PARAMETERS
  482. USE NOAHMP_RAD_PARAMETERS
  483. ! --------------------------------------------------------------------------------------------------
  484. implicit none
  485. ! --------------------------------------------------------------------------------------------------
  486. ! input
  487. INTEGER , INTENT(IN) :: ICE !ice (ice = 1)
  488. INTEGER , INTENT(IN) :: IST !surface type 1->soil; 2->lake
  489. INTEGER , INTENT(IN) :: VEGTYP !vegetation type
  490. INTEGER , INTENT(IN) :: ISC !soil color type (1-lighest; 8-darkest)
  491. INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers
  492. INTEGER , INTENT(IN) :: NSOIL !no. of soil layers
  493. INTEGER , INTENT(IN) :: ILOC !grid index
  494. INTEGER , INTENT(IN) :: JLOC !grid index
  495. REAL , INTENT(IN) :: DT !time step [sec]
  496. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !layer-bottom depth from soil surf (m)
  497. REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) lowest model layer
  498. REAL , INTENT(IN) :: SFCTMP !surface air temperature [K]
  499. REAL , INTENT(IN) :: UU !wind speed in eastward dir (m/s)
  500. REAL , INTENT(IN) :: VV !wind speed in northward dir (m/s)
  501. REAL , INTENT(IN) :: SOLDN !downward shortwave radiation (w/m2)
  502. REAL , INTENT(IN) :: PRCP !precipitation rate (kg m-2 s-1)
  503. REAL , INTENT(IN) :: LWDN !downward longwave radiation (w/m2)
  504. REAL , INTENT(IN) :: SFCPRS !pressure (pa)
  505. REAL , INTENT(INOUT) :: ZLVL !reference height (m)
  506. REAL , INTENT(IN) :: COSZ !cosine solar zenith angle [0-1]
  507. REAL , INTENT(IN) :: TBOT !bottom condition for soil temp. [K]
  508. REAL , INTENT(IN) :: FOLN !foliage nitrogen (%) [1-saturated]
  509. REAL , INTENT(IN) :: SHDFAC !green vegetation fraction [0.0-1.0]
  510. INTEGER , INTENT(IN) :: YEARLEN!Number of days in the particular year.
  511. REAL , INTENT(IN) :: JULIAN !Julian day of year (floating point)
  512. REAL , INTENT(IN) :: LAT !latitude (radians)
  513. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD!ice fraction at last timestep
  514. !jref:start; in
  515. INTEGER , INTENT(IN) :: ISURBAN
  516. INTEGER , INTENT(IN) :: IZ0TLND
  517. REAL , INTENT(IN) :: QC !cloud water mixing ratio
  518. REAL , INTENT(IN) :: PBLH !planetary boundary layer height
  519. REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer
  520. REAL , INTENT(IN) :: PSFC !pressure at lowest model layer
  521. REAL , INTENT(IN) :: DZ8W !thickness of lowest layer
  522. REAL , INTENT(IN) :: DX
  523. REAL , INTENT(IN) :: SHDMAX !yearly max vegetation fraction
  524. !jref:end
  525. ! input/output : need arbitary intial values
  526. REAL , INTENT(INOUT) :: QSNOW !snowfall [mm/s]
  527. REAL , INTENT(INOUT) :: FWET !wetted or snowed fraction of canopy (-)
  528. REAL , INTENT(INOUT) :: SNEQVO !snow mass at last time step (mm)
  529. REAL , INTENT(INOUT) :: EAH !canopy air vapor pressure (pa)
  530. REAL , INTENT(INOUT) :: TAH !canopy air tmeperature (k)
  531. REAL , INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type)
  532. REAL , INTENT(INOUT) :: CM !momentum drag coefficient
  533. REAL , INTENT(INOUT) :: CH !sensible heat exchange coefficient
  534. ! prognostic variables
  535. INTEGER , INTENT(INOUT) :: ISNOW !actual no. of snow layers [-]
  536. REAL , INTENT(INOUT) :: CANLIQ !intercepted liquid water (mm)
  537. REAL , INTENT(INOUT) :: CANICE !intercepted ice mass (mm)
  538. REAL , INTENT(INOUT) :: SNEQV !snow water eqv. [mm]
  539. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !soil moisture (ice + liq.) [m3/m3]
  540. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !layer-bottom depth from snow surf [m]
  541. REAL , INTENT(INOUT) :: SNOWH !snow height [m]
  542. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm]
  543. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  544. REAL , INTENT(INOUT) :: TV !vegetation temperature (k)
  545. REAL , INTENT(INOUT) :: TG !ground temperature (k)
  546. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil temperature [k]
  547. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil moisture [m3/m3]
  548. REAL , INTENT(INOUT) :: ZWT !depth to water table [m]
  549. REAL , INTENT(INOUT) :: WA !water storage in aquifer [mm]
  550. REAL , INTENT(INOUT) :: WT !water in aquifer&saturated soil [mm]
  551. REAL , INTENT(INOUT) :: WSLAKE !lake water storage (can be neg.) (mm)
  552. ! output
  553. REAL , INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2)
  554. REAL , INTENT(OUT) :: FSR !total reflected solar radiation (w/m2)
  555. REAL , INTENT(OUT) :: FIRA !total net LW rad (w/m2) [+ to atm]
  556. REAL , INTENT(OUT) :: FSH !total sensible heat (w/m2) [+ to atm]
  557. REAL , INTENT(OUT) :: FCEV !canopy evap heat (w/m2) [+ to atm]
  558. REAL , INTENT(OUT) :: FGEV !ground evap heat (w/m2) [+ to atm]
  559. REAL , INTENT(OUT) :: FCTR !transpiration heat (w/m2) [+ to atm]
  560. REAL , INTENT(OUT) :: SSOIL !ground heat flux (w/m2) [+ to soil]
  561. REAL , INTENT(OUT) :: TRAD !surface radiative temperature (k)
  562. REAL , INTENT(OUT) :: TS !surface temperature (k)
  563. REAL , INTENT(OUT) :: ECAN !evaporation of intercepted water (mm/s)
  564. REAL , INTENT(OUT) :: ETRAN !transpiration rate (mm/s)
  565. REAL , INTENT(OUT) :: EDIR !soil surface evaporation rate (mm/s]
  566. REAL , INTENT(OUT) :: RUNSRF !surface runoff [mm/s]
  567. REAL , INTENT(OUT) :: RUNSUB !baseflow (saturation excess) [mm/s]
  568. REAL , INTENT(OUT) :: PSN !total photosynthesis (umol co2/m2/s) [+]
  569. REAL , INTENT(OUT) :: APAR !photosyn active energy by canopy (w/m2)
  570. REAL , INTENT(OUT) :: SAV !solar rad absorbed by veg. (w/m2)
  571. REAL , INTENT(OUT) :: SAG !solar rad absorbed by ground (w/m2)
  572. REAL , INTENT(OUT) :: FSNO !snow cover fraction on the ground (-)
  573. REAL , INTENT(OUT) :: FVEG !green vegetation fraction [0.0-1.0]
  574. REAL , INTENT(OUT) :: ALBEDO !surface albedo [-]
  575. REAL , INTENT(OUT) :: ERRWAT !water error [kg m{-2}]
  576. REAL , INTENT(OUT) :: QMELT !snowmelt [mm/s]
  577. REAL , INTENT(OUT) :: PONDING!surface ponding [mm]
  578. REAL , INTENT(OUT) :: PONDING1!surface ponding [mm]
  579. REAL , INTENT(OUT) :: PONDING2!surface ponding [mm]
  580. !jref:start; output
  581. REAL , INTENT(OUT) :: CHSTAR !effective exchange coefficient
  582. REAL , INTENT(OUT) :: TSTAR !effective skin temperature
  583. REAL , INTENT(OUT) :: T2MV !2-m air temperature over vegetated part [k]
  584. REAL , INTENT(OUT) :: T2MB !2-m air temperature over bare ground part [k]
  585. REAL, INTENT(OUT) :: RSSUN !sunlit leaf stomatal resistance (s/m)
  586. REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m)
  587. REAL, INTENT(OUT) :: BGAP
  588. REAL, INTENT(OUT) :: WGAP
  589. REAL, INTENT(OUT) :: GAP
  590. REAL, INTENT(OUT) :: TGV
  591. REAL, INTENT(OUT) :: TGB
  592. REAL, INTENT(OUT) :: Q1
  593. REAL, INTENT(OUT) :: EMISSI
  594. !jref:end
  595. ! local
  596. INTEGER :: IZ !do-loop index
  597. INTEGER, DIMENSION(-NSNOW+1:NSOIL) :: IMELT !phase change index [1-melt; 2-freeze]
  598. REAL :: CMC !intercepted water (CANICE+CANLIQ) (mm)
  599. REAL :: TAUX !wind stress: e-w (n/m2)
  600. REAL :: TAUY !wind stress: n-s (n/m2)
  601. REAL :: RHOAIR !density air (kg/m3)
  602. ! REAL, DIMENSION( 1: 5) :: VOCFLX !voc fluxes [ug C m-2 h-1]
  603. REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZSNSO !snow/soil layer thickness [m]
  604. REAL :: THAIR !potential temperature (k)
  605. REAL :: QAIR !specific humidity (kg/kg) (q2/(1+q2))
  606. REAL :: EAIR !vapor pressure air (pa)
  607. REAL, DIMENSION( 1: 2) :: SOLAD !incoming direct solar rad (w/m2)
  608. REAL, DIMENSION( 1: 2) :: SOLAI !incoming diffuse solar rad (w/m2)
  609. REAL :: QPRECC !convective precipitation (mm/s)
  610. REAL :: QPRECL !large-scale precipitation (mm/s)
  611. REAL :: IGS !growing season index (0=off, 1=on)
  612. REAL :: ELAI !leaf area index, after burying by snow
  613. REAL :: ESAI !stem area index, after burying by snow
  614. REAL :: BEVAP !soil water evaporation factor (0 - 1)
  615. REAL, DIMENSION( 1:NSOIL) :: BTRANI !Soil water transpiration factor (0 - 1)
  616. REAL :: BTRAN !soil water transpiration factor (0 - 1)
  617. REAL :: HTOP !top of canopy layer (m)
  618. REAL :: QIN !groundwater recharge [mm/s]
  619. REAL :: QDIS !groundwater discharge [mm/s]
  620. REAL, DIMENSION( 1:NSOIL) :: SICE !soil ice content (m3/m3)
  621. REAL, DIMENSION(-NSNOW+1: 0) :: SNICEV !partial volume ice of snow [m3/m3]
  622. REAL, DIMENSION(-NSNOW+1: 0) :: SNLIQV !partial volume liq of snow [m3/m3]
  623. REAL, DIMENSION(-NSNOW+1: 0) :: EPORE !effective porosity [m3/m3]
  624. REAL :: TOTSC !total soil carbon (g/m2)
  625. REAL :: TOTLB !total living carbon (g/m2)
  626. REAL :: T2M !2-meter air temperature (k)
  627. REAL :: QDEW !ground surface dew rate [mm/s]
  628. REAL :: QVAP !ground surface evap. rate [mm/s]
  629. REAL :: LATHEA !latent heat [j/kg]
  630. REAL :: SWDOWN !downward solar [w/m2]
  631. REAL :: BEG_WB !water storage at begin of a step [mm]
  632. !jref:start
  633. REAL :: FSRV
  634. REAL :: FSRG
  635. REAL,INTENT(OUT) :: Q2V
  636. REAL,INTENT(OUT) :: Q2B
  637. REAL :: Q2E
  638. REAL :: QFX
  639. REAL,INTENT(OUT) :: CHV !sensible heat exchange coefficient over vegetated fraction
  640. REAL,INTENT(OUT) :: CHB !sensible heat exchange coefficient over bare-ground
  641. !jref:end
  642. ! carbon
  643. ! inputs
  644. REAL , INTENT(IN) :: CO2AIR !atmospheric co2 concentration (pa)
  645. REAL , INTENT(IN) :: O2AIR !atmospheric o2 concentration (pa)
  646. ! inputs and outputs : prognostic variables
  647. REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2]
  648. REAL , INTENT(INOUT) :: RTMASS !mass of fine roots [g/m2]
  649. REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2]
  650. REAL , INTENT(INOUT) :: WOOD !mass of wood (incl. woody roots) [g/m2]
  651. REAL , INTENT(INOUT) :: STBLCP !stable carbon in deep soil [g/m2]
  652. REAL , INTENT(INOUT) :: FASTCP !short-lived carbon, shallow soil [g/m2]
  653. REAL , INTENT(INOUT) :: LAI !leaf area index [-]
  654. REAL , INTENT(INOUT) :: SAI !stem area index [-]
  655. ! outputs
  656. REAL , INTENT(OUT) :: NEE !net ecosys exchange (g/m2/s CO2)
  657. REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s C]
  658. REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2/s C]
  659. REAL :: AUTORS !net ecosystem respiration (g/m2/s C)
  660. REAL :: HETERS !organic respiration (g/m2/s C)
  661. REAL :: TROOT !root-zone averaged temperature (k)
  662. ! INTENT (OUT) variables need to be assigned a value. These normally get assigned values
  663. ! only if DVEG == 2.
  664. nee = 0.0
  665. npp = 0.0
  666. gpp = 0.0
  667. ! --------------------------------------------------------------------------------------------------
  668. ! re-process atmospheric forcing
  669. CALL ATM (SFCPRS ,SFCTMP ,Q2 ,PRCP ,SOLDN ,COSZ ,THAIR , &
  670. QAIR ,EAIR ,RHOAIR ,QPRECC ,QPRECL ,SOLAD ,SOLAI , &
  671. SWDOWN )
  672. ! snow/soil layer thickness (m)
  673. DO IZ = ISNOW+1, NSOIL
  674. IF(IZ == ISNOW+1) THEN
  675. DZSNSO(IZ) = - ZSNSO(IZ)
  676. ELSE
  677. DZSNSO(IZ) = ZSNSO(IZ-1) - ZSNSO(IZ)
  678. END IF
  679. END DO
  680. ! root-zone temperature
  681. TROOT = 0.
  682. DO IZ=1,NROOT
  683. TROOT = TROOT + STC(IZ)*DZSNSO(IZ)/(-ZSOIL(NROOT))
  684. ENDDO
  685. ! total water storage for water balance check
  686. IF(IST == 1) THEN
  687. BEG_WB = CANLIQ + CANICE + SNEQV + WA
  688. DO IZ = 1,NSOIL
  689. BEG_WB = BEG_WB + SMC(IZ) * DZSNSO(IZ) * 1000.
  690. END DO
  691. END IF
  692. ! vegetation phenology
  693. CALL PHENOLOGY (VEGTYP , SNOWH , TV , LAT , YEARLEN , JULIAN , & !in
  694. LAI , SAI , TROOT , HTOP , ELAI , ESAI ,IGS)
  695. !input GVF should be consistent with LAI
  696. IF(DVEG == 1) THEN
  697. FVEG = SHDFAC
  698. IF(FVEG <= 0.05) FVEG = 0.05
  699. ELSE IF (DVEG == 2 .or. DVEG == 3) THEN
  700. FVEG = 1.-EXP(-0.52*(LAI+SAI))
  701. IF(FVEG <= 0.05) FVEG = 0.05
  702. ELSE IF (DVEG == 4) THEN
  703. FVEG = SHDMAX
  704. IF(FVEG <= 0.05) FVEG = 0.05
  705. ELSE
  706. WRITE(*,*) "-------- FATAL CALLED IN SFLX -----------"
  707. CALL wrf_error_fatal("Namelist parameter DVEG unknown")
  708. ENDIF
  709. ! CALL PHENOLOGY (VEGTYP,IMONTH ,IDAY ,SNOWH ,TV ,LAT , & !in
  710. ! LAI ,SAI ,TROOT , & !in
  711. ! HTOP ,ELAI ,ESAI ,IGS ) !out
  712. ! compute energy budget (momentum & energy fluxes and phase changes)
  713. CALL ENERGY (ICE ,VEGTYP ,IST ,ISC ,NSNOW ,NSOIL , & !in
  714. ISNOW ,NROOT ,DT ,RHOAIR ,SFCPRS ,QAIR , & !in
  715. SFCTMP ,THAIR ,LWDN ,UU ,VV ,ZLVL , & !in
  716. CO2AIR ,O2AIR ,SOLAD ,SOLAI ,COSZ ,IGS , & !in
  717. EAIR ,HTOP ,TBOT ,ZBOT ,ZSNSO ,ZSOIL , & !in
  718. ELAI ,ESAI ,CSOIL ,FWET ,FOLN , & !in
  719. FVEG , & !in
  720. QSNOW ,DZSNSO ,LAT ,CANLIQ ,CANICE ,iloc, jloc , & !in
  721. IMELT ,SNICEV ,SNLIQV ,EPORE ,T2M ,FSNO , & !out
  722. SAV ,SAG ,QMELT ,FSA ,FSR ,TAUX , & !out
  723. TAUY ,FIRA ,FSH ,FCEV ,FGEV ,FCTR , & !out
  724. TRAD ,PSN ,APAR ,SSOIL ,BTRANI ,BTRAN , & !out
  725. PONDING,TS ,LATHEA , & !out
  726. TV ,TG ,STC ,SNOWH ,EAH ,TAH , & !inout
  727. SNEQVO ,SNEQV ,SH2O ,SMC ,SNICE ,SNLIQ , & !inout
  728. ALBOLD ,CM ,CH ,DX ,DZ8W ,Q2 , & !inout
  729. !jref:start
  730. QC ,PBLH ,QSFC ,PSFC ,ISURBAN,IZ0TLND, & !in
  731. CHSTAR ,TSTAR ,T2MV ,T2MB ,FSRV , &
  732. FSRG ,RSSUN ,RSSHA ,BGAP ,WGAP, GAP,TGV,TGB,&
  733. Q1 ,Q2V ,Q2B ,Q2E ,CHV ,CHB , & !out
  734. EMISSI) !out
  735. !jref:end
  736. SICE(:) = MAX(0.0, SMC(:) - SH2O(:))
  737. SNEQVO = SNEQV
  738. QVAP = MAX( FGEV/LATHEA, 0.) ! positive part of fgev
  739. QDEW = ABS( MIN(FGEV/LATHEA, 0.)) ! negative part of fgev
  740. EDIR = QVAP - QDEW
  741. ! compute water budgets (water storages, ET components, and runoff)
  742. CALL WATER (VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & !in
  743. VV ,FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in
  744. ESAI ,SFCTMP ,QVAP ,QDEW ,ZSOIL ,BTRANI , & !in
  745. FICEOLD,PONDING,TG ,IST ,FVEG ,iloc,jloc , & !in
  746. ISNOW ,CANLIQ ,CANICE ,TV ,SNOWH ,SNEQV , & !inout
  747. SNICE ,SNLIQ ,STC ,ZSNSO ,SH2O ,SMC , & !inout
  748. SICE ,ZWT ,WA ,WT ,DZSNSO ,WSLAKE , & !inout
  749. CMC ,ECAN ,ETRAN ,FWET ,RUNSRF ,RUNSUB , & !out
  750. QIN ,QDIS ,QSNOW ,PONDING1 ,PONDING2,&
  751. ISURBAN) !out
  752. ! write(*,'(a20,10F15.5)') 'SFLX:RUNOFF=',RUNSRF*DT,RUNSUB*DT,EDIR*DT
  753. ! compute carbon budgets (carbon storages and co2 & bvoc fluxes)
  754. IF (DVEG == 2) THEN
  755. CALL CARBON (NSNOW ,NSOIL ,VEGTYP ,NROOT ,DT ,ZSOIL , & !in
  756. DZSNSO ,STC ,SMC ,TV ,TG ,PSN , & !in
  757. FOLN ,SMCMAX ,BTRAN ,APAR ,FVEG ,IGS , & !in
  758. TROOT ,IST ,LAT ,iloc ,jloc , & !in
  759. LFMASS ,RTMASS ,STMASS ,WOOD ,STBLCP ,FASTCP , & !inout
  760. GPP ,NPP ,NEE ,AUTORS ,HETERS ,TOTSC , & !out
  761. TOTLB ,LAI ,SAI ) !out
  762. END IF
  763. ! water and energy balance check
  764. CALL ERROR (SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & !in
  765. FGEV ,FCTR ,SSOIL ,BEG_WB ,CANLIQ ,CANICE , & !in
  766. SNEQV ,WA ,SMC ,DZSNSO ,PRCP ,ECAN , & !in
  767. ETRAN ,EDIR ,RUNSRF ,RUNSUB ,DT ,NSOIL , & !in
  768. NSNOW ,IST ,ERRWAT ,ILOC , JLOC ,FVEG , &
  769. SAV ,SAG ,FSRV ,FSRG) !in ( Except ERRWAT, which is out )
  770. ! urban - jref
  771. QFX = ETRAN + ECAN + EDIR
  772. IF ( VEGTYP == ISURBAN ) THEN
  773. QSFC = (QFX/RHOAIR*CHSTAR) + QAIR
  774. Q2B = QSFC
  775. END IF
  776. IF(SWDOWN.NE.0.) THEN
  777. ALBEDO = FSR / SWDOWN
  778. ELSE
  779. ALBEDO = -999.9
  780. END IF
  781. END SUBROUTINE NOAHMP_SFLX
  782. ! ==================================================================================================
  783. SUBROUTINE ATM (SFCPRS ,SFCTMP ,Q2 ,PRCP ,SOLDN ,COSZ ,THAIR , &
  784. QAIR ,EAIR ,RHOAIR ,QPRECC ,QPRECL ,SOLAD ,SOLAI , &
  785. SWDOWN )
  786. ! --------------------------------------------------------------------------------------------------
  787. ! re-process atmospheric forcing
  788. ! --------------------------------------------------------------------------------------------------
  789. IMPLICIT NONE
  790. ! --------------------------------------------------------------------------------------------------
  791. ! inputs
  792. REAL , INTENT(IN) :: SFCPRS !pressure (pa)
  793. REAL , INTENT(IN) :: SFCTMP !surface air temperature [k]
  794. REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg)
  795. REAL , INTENT(IN) :: SOLDN !downward shortwave radiation (w/m2)
  796. REAL , INTENT(IN) :: PRCP !precipitation rate (kg m-2 s-1)
  797. REAL , INTENT(IN) :: COSZ !cosine solar zenith angle [0-1]
  798. ! outputs
  799. REAL , INTENT(OUT) :: THAIR !potential temperature (k)
  800. REAL , INTENT(OUT) :: QAIR !specific humidity (kg/kg) (q2/(1+q2))
  801. REAL , INTENT(OUT) :: EAIR !vapor pressure air (pa)
  802. REAL, DIMENSION( 1: 2), INTENT(OUT) :: SOLAD !incoming direct solar radiation (w/m2)
  803. REAL, DIMENSION( 1: 2), INTENT(OUT) :: SOLAI !incoming diffuse solar radiation (w/m2)
  804. REAL , INTENT(OUT) :: QPRECC !convective precipitation (mm/s)
  805. REAL , INTENT(OUT) :: QPRECL !large-scale precipitation (mm/s)
  806. REAL , INTENT(OUT) :: RHOAIR !density air (kg/m3)
  807. REAL , INTENT(OUT) :: SWDOWN !downward solar filtered by sun angle [w/m2]
  808. !locals
  809. REAL :: PAIR !atm bottom level pressure (pa)
  810. ! --------------------------------------------------------------------------------------------------
  811. !jref: seems like PAIR should be P1000mb??
  812. PAIR = SFCPRS ! atm bottom level pressure (pa)
  813. THAIR = SFCTMP * (SFCPRS/PAIR)**(RAIR/CPAIR)
  814. !jref: mixing ratio to specific
  815. QAIR = Q2 / (1.0+Q2) ! mixing ratio to specific humidity [kg/kg]
  816. ! QAIR = Q2 ! GLDAS forcing: Q2 = specific humidity [kg/kg]
  817. EAIR = QAIR*SFCPRS / (0.622+0.378*QAIR)
  818. RHOAIR = (SFCPRS-0.378*EAIR) / (RAIR*SFCTMP)
  819. QPRECC = 0.10 * PRCP ! should be from the atmospheric model
  820. QPRECL = 0.90 * PRCP ! should be from the atmospheric model
  821. IF(COSZ <= 0.) THEN
  822. SWDOWN = 0.
  823. ELSE
  824. SWDOWN = SOLDN
  825. END IF
  826. SOLAD(1) = SWDOWN*0.7*0.5 ! direct vis
  827. SOLAD(2) = SWDOWN*0.7*0.5 ! direct nir
  828. SOLAI(1) = SWDOWN*0.3*0.5 ! diffuse vis
  829. SOLAI(2) = SWDOWN*0.3*0.5 ! diffuse nir
  830. END SUBROUTINE ATM
  831. ! ==================================================================================================
  832. ! --------------------------------------------------------------------------------------------------
  833. SUBROUTINE PHENOLOGY (VEGTYP , SNOWH , TV , LAT , YEARLEN , JULIAN , & !in
  834. LAI , SAI , TROOT , HTOP , ELAI , ESAI , IGS)
  835. ! --------------------------------------------------------------------------------------------------
  836. ! vegetation phenology considering vegeation canopy being buries by snow and evolution in time
  837. ! --------------------------------------------------------------------------------------------------
  838. USE NOAHMP_VEG_PARAMETERS
  839. ! --------------------------------------------------------------------------------------------------
  840. IMPLICIT NONE
  841. ! --------------------------------------------------------------------------------------------------
  842. ! inputs
  843. INTEGER , INTENT(IN ) :: VEGTYP !vegetation type
  844. REAL , INTENT(IN ) :: SNOWH !snow height [m]
  845. REAL , INTENT(IN ) :: TV !vegetation temperature (k)
  846. REAL , INTENT(IN ) :: LAT !latitude (radians)
  847. INTEGER , INTENT(IN ) :: YEARLEN!Number of days in the particular year
  848. REAL , INTENT(IN ) :: JULIAN !Julian day of year (fractional) ( 0 <= JULIAN < YEARLEN )
  849. real , INTENT(IN ) :: TROOT !root-zone averaged temperature (k)
  850. REAL , INTENT(INOUT) :: LAI !LAI, unadjusted for burying by snow
  851. REAL , INTENT(INOUT) :: SAI !SAI, unadjusted for burying by snow
  852. ! outputs
  853. REAL , INTENT(OUT ) :: HTOP !top of canopy layer (m)
  854. REAL , INTENT(OUT ) :: ELAI !leaf area index, after burying by snow
  855. REAL , INTENT(OUT ) :: ESAI !stem area index, after burying by snow
  856. REAL , INTENT(OUT ) :: IGS !growing season index (0=off, 1=on)
  857. ! locals
  858. REAL :: DB !thickness of canopy buried by snow (m)
  859. REAL :: FB !fraction of canopy buried by snow
  860. REAL :: SNOWHC !critical snow depth at which short vege
  861. !is fully covered by snow
  862. INTEGER :: K !index
  863. INTEGER :: IT1,IT2 !interpolation months
  864. REAL :: DAY !current day of year ( 0 <= DAY < YEARLEN )
  865. REAL :: WT1,WT2 !interpolation weights
  866. REAL :: T !current month (1.00, ..., 12.00)
  867. ! --------------------------------------------------------------------------------------------------
  868. IF ( DVEG == 1 .or. DVEG == 3 .or. DVEG == 4 ) THEN
  869. IF (LAT >= 0.) THEN
  870. ! Northern Hemisphere
  871. DAY = JULIAN
  872. ELSE
  873. ! Southern Hemisphere. DAY is shifted by 1/2 year.
  874. DAY = MOD ( JULIAN + ( 0.5 * YEARLEN ) , REAL(YEARLEN) )
  875. ENDIF
  876. T = 12. * DAY / REAL(YEARLEN)
  877. IT1 = T + 0.5
  878. IT2 = IT1 + 1
  879. WT1 = (IT1+0.5) - T
  880. WT2 = 1.-WT1
  881. IF (IT1 .LT. 1) IT1 = 12
  882. IF (IT2 .GT. 12) IT2 = 1
  883. LAI = WT1*LAIM(VEGTYP,IT1) + WT2*LAIM(VEGTYP,IT2)
  884. SAI = WT1*SAIM(VEGTYP,IT1) + WT2*SAIM(VEGTYP,IT2)
  885. ENDIF
  886. IF ( ( VEGTYP == ISWATER ) .OR. ( VEGTYP == ISBARREN ) .OR. ( VEGTYP == ISSNOW ) ) THEN
  887. LAI = 0.
  888. SAI = 0.
  889. ENDIF
  890. !buried by snow
  891. DB = MIN( MAX(SNOWH - HVB(VEGTYP),0.), HVT(VEGTYP)-HVB(VEGTYP) )
  892. FB = DB / MAX(1.E-06,HVT(VEGTYP)-HVB(VEGTYP))
  893. IF(HVT(VEGTYP)> 0. .AND. HVT(VEGTYP) <= 0.5) THEN
  894. SNOWHC = HVT(VEGTYP)*EXP(-SNOWH/0.1)
  895. FB = MIN(SNOWH,SNOWHC)/SNOWHC
  896. ENDIF
  897. ELAI = LAI*(1.-FB)
  898. ESAI = SAI*(1.-FB)
  899. IF (TV .GT. TMIN(VEGTYP)) THEN
  900. IGS = 1.
  901. ELSE
  902. IGS = 0.
  903. ENDIF
  904. HTOP = HVT(VEGTYP)
  905. END SUBROUTINE PHENOLOGY
  906. ! ==================================================================================================
  907. SUBROUTINE ERROR (SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , &
  908. FGEV ,FCTR ,SSOIL ,BEG_WB ,CANLIQ ,CANICE , &
  909. SNEQV ,WA ,SMC ,DZSNSO ,PRCP ,ECAN , &
  910. ETRAN ,EDIR ,RUNSRF ,RUNSUB ,DT ,NSOIL , &
  911. NSNOW ,IST ,ERRWAT, ILOC ,JLOC ,FVEG , &
  912. SAV ,SAG ,FSRV ,FSRG)
  913. ! --------------------------------------------------------------------------------------------------
  914. ! check surface energy balance and water balance
  915. ! --------------------------------------------------------------------------------------------------
  916. IMPLICIT NONE
  917. ! --------------------------------------------------------------------------------------------------
  918. ! inputs
  919. INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers
  920. INTEGER , INTENT(IN) :: NSOIL !number of soil layers
  921. INTEGER , INTENT(IN) :: IST !surface type 1->soil; 2->lake
  922. INTEGER , INTENT(IN) :: ILOC !grid index
  923. INTEGER , INTENT(IN) :: JLOC !grid index
  924. REAL , INTENT(IN) :: SWDOWN !downward solar filtered by sun angle [w/m2]
  925. REAL , INTENT(IN) :: FSA !total absorbed solar radiation (w/m2)
  926. REAL , INTENT(IN) :: FSR !total reflected solar radiation (w/m2)
  927. REAL , INTENT(IN) :: FIRA !total net longwave rad (w/m2) [+ to atm]
  928. REAL , INTENT(IN) :: FSH !total sensible heat (w/m2) [+ to atm]
  929. REAL , INTENT(IN) :: FCEV !canopy evaporation heat (w/m2) [+ to atm]
  930. REAL , INTENT(IN) :: FGEV !ground evaporation heat (w/m2) [+ to atm]
  931. REAL , INTENT(IN) :: FCTR !transpiration heat flux (w/m2) [+ to atm]
  932. REAL , INTENT(IN) :: SSOIL !ground heat flux (w/m2) [+ to soil]
  933. REAL , INTENT(IN) :: FVEG
  934. REAL , INTENT(IN) :: SAV
  935. REAL , INTENT(IN) :: SAG
  936. REAL , INTENT(IN) :: FSRV
  937. REAL , INTENT(IN) :: FSRG
  938. REAL , INTENT(IN) :: PRCP !precipitation rate (kg m-2 s-1)
  939. REAL , INTENT(IN) :: ECAN !evaporation of intercepted water (mm/s)
  940. REAL , INTENT(IN) :: ETRAN !transpiration rate (mm/s)
  941. REAL , INTENT(IN) :: EDIR !soil surface evaporation rate[mm/s]
  942. REAL , INTENT(IN) :: RUNSRF !surface runoff [mm/s]
  943. REAL , INTENT(IN) :: RUNSUB !baseflow (saturation excess) [mm/s]
  944. REAL , INTENT(IN) :: CANLIQ !intercepted liquid water (mm)
  945. REAL , INTENT(IN) :: CANICE !intercepted ice mass (mm)
  946. REAL , INTENT(IN) :: SNEQV !snow water eqv. [mm]
  947. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture (ice + liq.) [m3/m3]
  948. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m]
  949. REAL , INTENT(IN) :: WA !water storage in aquifer [mm]
  950. REAL , INTENT(IN) :: DT !time step [sec]
  951. REAL , INTENT(IN) :: BEG_WB !water storage at begin of a timesetp [mm]
  952. REAL , INTENT(OUT) :: ERRWAT !error in water balance [mm/timestep]
  953. INTEGER :: IZ !do-loop index
  954. REAL :: END_WB !water storage at end of a timestep [mm]
  955. !KWM REAL :: ERRWAT !error in water balance [mm/timestep]
  956. REAL :: ERRENG !error in surface energy balance [w/m2]
  957. REAL :: ERRSW !error in shortwave radiation balance [w/m2]
  958. REAL :: FSRVG
  959. CHARACTER(len=256) :: message
  960. ! --------------------------------------------------------------------------------------------------
  961. !jref:start
  962. ! ERRSW = SWDOWN - (FSA + FSR)
  963. ERRSW = SWDOWN - (SAV+SAG + FSRV+FSRG)
  964. ! WRITE(*,*) "ERRSW =",ERRSW
  965. IF (ERRSW > 0.01) THEN ! w/m2
  966. WRITE(*,*) "VEGETATION!"
  967. WRITE(*,*) "SWDOWN*FVEG =",SWDOWN*FVEG
  968. WRITE(*,*) "FVEG*(SAV+SAG) =",FVEG*SAV + SAG
  969. WRITE(*,*) "FVEG*(FSRV +FSRG)=",FVEG*FSRV + FSRG
  970. WRITE(*,*) "GROUND!"
  971. WRITE(*,*) "(1-.FVEG)*SWDOWN =",(1.-FVEG)*SWDOWN
  972. WRITE(*,*) "(1.-FVEG)*SAG =",(1.-FVEG)*SAG
  973. WRITE(*,*) "(1.-FVEG)*FSRG=",(1.-FVEG)*FSRG
  974. WRITE(*,*) "FSRV =",FSRV
  975. WRITE(*,*) "FSRG =",FSRG
  976. WRITE(*,*) "FSR =",FSR
  977. WRITE(*,*) "SAV =",SAV
  978. WRITE(*,*) "SAG =",SAG
  979. WRITE(*,*) "FSA =",FSA
  980. !jref:end
  981. WRITE(message,*) 'ERRSW =',ERRSW
  982. call wrf_message(trim(message))
  983. call wrf_error_fatal("Stop in Noah-MP")
  984. END IF
  985. !jref:start - FSA changed to FVEG(SAV+SAG)+(1-FVEG)*SAG
  986. ERRENG = FVEG*SAV+SAG-(FIRA+FSH+FCEV+FGEV+FCTR+SSOIL)
  987. ! WRITE(*,*) "ERRENG =",ERRENG
  988. IF(ERRENG > 0.01) THEN
  989. write(message,*) 'ERRENG =',ERRENG
  990. call wrf_message(trim(message))
  991. WRITE(message,'(i6,1x,i6,1x,7F10.4)')ILOC,JLOC,FSA,FIRA,FSH,FCEV,FGEV,FCTR,SSOIL
  992. call wrf_message(trim(message))
  993. call wrf_error_fatal("Energy budget problem in NOAHMP LSM")
  994. END IF
  995. IF (IST == 1) THEN !soil
  996. END_WB = CANLIQ + CANICE + SNEQV + WA
  997. DO IZ = 1,NSOIL
  998. END_WB = END_WB + SMC(IZ) * DZSNSO(IZ) * 1000.
  999. END DO
  1000. ERRWAT = END_WB-BEG_WB-(PRCP-ECAN-ETRAN-EDIR-RUNSRF-RUNSUB)*DT
  1001. IF(ABS(ERRWAT) > 0.1) THEN
  1002. if (ERRWAT > 0) then
  1003. call wrf_message ('The model is gaining water (ERRWAT is positive)')
  1004. else
  1005. call wrf_message('The model is losing water (ERRWAT is negative)')
  1006. endif
  1007. write(message, *) 'ERRWAT =',ERRWAT, "kg m{-2} timestep{-1}"
  1008. call wrf_message(trim(message))
  1009. WRITE(message,'(" I J END_WB BEG_WB PRCP ECAN EDIR ETRAN RUNSRF RUNSUB")')
  1010. call wrf_message(trim(message))
  1011. WRITE(message,'(i6,1x,i6,1x,2f15.3,8f11.5)')ILOC,JLOC,END_WB,BEG_WB,PRCP*DT,ECAN*DT,&
  1012. EDIR*DT,ETRAN*DT,RUNSRF*DT,RUNSUB*DT
  1013. call wrf_message(trim(message))
  1014. call wrf_error_fatal("Water budget problem in NOAHMP LSM")
  1015. END IF
  1016. ELSE !KWM
  1017. ERRWAT = 0.0 !KWM
  1018. ENDIF
  1019. END SUBROUTINE ERROR
  1020. ! ==================================================================================================
  1021. ! --------------------------------------------------------------------------------------------------
  1022. SUBROUTINE ENERGY (ICE ,VEGTYP ,IST ,ISC ,NSNOW ,NSOIL , & !in
  1023. ISNOW ,NROOT ,DT ,RHOAIR ,SFCPRS ,QAIR , & !in
  1024. SFCTMP ,THAIR ,LWDN ,UU ,VV ,ZREF , & !in
  1025. CO2AIR ,O2AIR ,SOLAD ,SOLAI ,COSZ ,IGS , & !in
  1026. EAIR ,HTOP ,TBOT ,ZBOT ,ZSNSO ,ZSOIL , & !in
  1027. ELAI ,ESAI ,CSOIL ,FWET ,FOLN , & !in
  1028. FVEG , & !in
  1029. QSNOW ,DZSNSO ,LAT ,CANLIQ ,CANICE ,ILOC , JLOC, & !in
  1030. IMELT ,SNICEV ,SNLIQV ,EPORE ,T2M ,FSNO , & !out
  1031. SAV ,SAG ,QMELT ,FSA ,FSR ,TAUX , & !out
  1032. TAUY ,FIRA ,FSH ,FCEV ,FGEV ,FCTR , & !out
  1033. TRAD ,PSN ,APAR ,SSOIL ,BTRANI ,BTRAN , & !out
  1034. PONDING,TS ,LATHEA , & !out
  1035. TV ,TG ,STC ,SNOWH ,EAH ,TAH , & !inout
  1036. SNEQVO ,SNEQV ,SH2O ,SMC ,SNICE ,SNLIQ , & !inout
  1037. ALBOLD ,CM ,CH ,DX ,DZ8W ,Q2 , & !inout
  1038. !jref:start
  1039. QC ,PBLH ,QSFC ,PSFC ,ISURBAN,IZ0TLND, & !in
  1040. CHSTAR ,TSTAR ,T2MV ,T2MB ,FSRV , &
  1041. FSRG ,RSSUN ,RSSHA ,BGAP ,WGAP,GAP,TGV,TGB,&
  1042. Q1 ,Q2V ,Q2B ,Q2E ,CHV ,CHB, EMISSI ) !out
  1043. !jref:end
  1044. ! --------------------------------------------------------------------------------------------------
  1045. ! --------------------------------------------------------------------------------------------------
  1046. USE NOAHMP_VEG_PARAMETERS
  1047. USE NOAHMP_RAD_PARAMETERS
  1048. ! --------------------------------------------------------------------------------------------------
  1049. ! we use different approaches to deal with subgrid features of radiation transfer and turbulent
  1050. ! transfer. We use 'tile' approach to compute turbulent fluxes, while we use modified two-
  1051. ! stream to compute radiation transfer. Tile approach, assemblying vegetation canopies together,
  1052. ! may expose too much ground surfaces (either covered by snow or grass) to solar radiation. The
  1053. ! modified two-stream assumes vegetation covers fully the gridcell but with gaps between tree
  1054. ! crowns.
  1055. ! --------------------------------------------------------------------------------------------------
  1056. ! turbulence transfer : 'tile' approach to compute energy fluxes in vegetated fraction and
  1057. ! bare fraction separately and then sum them up weighted by fraction
  1058. ! --------------------------------------
  1059. ! / O O O O O O O O / /
  1060. ! / | | | | | | | | / /
  1061. ! / O O O O O O O O / /
  1062. ! / | | |tile1| | | | / tile2 /
  1063. ! / O O O O O O O O / bare /
  1064. ! / | | | vegetated | | / /
  1065. ! / O O O O O O O O / /
  1066. ! / | | | | | | | | / /
  1067. ! --------------------------------------
  1068. ! --------------------------------------------------------------------------------------------------
  1069. ! radiation transfer : modified two-stream (Yang and Friedl, 2003, JGR; Niu ang Yang, 2004, JGR)
  1070. ! -------------------------------------- two-stream treats leaves as
  1071. ! / O O O O O O O O / cloud over the entire grid-cell,
  1072. ! / | | | | | | | | / while the modified two-stream
  1073. ! / O O O O O O O O / aggregates cloudy leaves into
  1074. ! / | | | | | | | | / tree crowns with gaps (as shown in
  1075. ! / O O O O O O O O / the left figure). We assume these
  1076. ! / | | | | | | | | / tree crowns are evenly distributed
  1077. ! / O O O O O O O O / within the gridcell with 100% veg
  1078. ! / | | | | | | | | / fraction, but with gaps. The 'tile'
  1079. ! -------------------------------------- approach overlaps too much shadows.
  1080. ! --------------------------------------------------------------------------------------------------
  1081. IMPLICIT NONE
  1082. ! --------------------------------------------------------------------------------------------------
  1083. ! inputs
  1084. integer , INTENT(IN) :: ILOC
  1085. integer , INTENT(IN) :: JLOC
  1086. INTEGER , INTENT(IN) :: ICE !ice (ice = 1)
  1087. INTEGER , INTENT(IN) :: VEGTYP !vegetation physiology type
  1088. INTEGER , INTENT(IN) :: IST !surface type: 1->soil; 2->lake
  1089. INTEGER , INTENT(IN) :: ISC !soil color type (1-lighest; 8-darkest)
  1090. INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers
  1091. INTEGER , INTENT(IN) :: NSOIL !number of soil layers
  1092. INTEGER , INTENT(IN) :: NROOT !number of root layers
  1093. INTEGER , INTENT(IN) :: ISNOW !actual no. of snow layers
  1094. REAL , INTENT(IN) :: DT !time step [sec]
  1095. REAL , INTENT(IN) :: QSNOW !snowfall on the ground (mm/s)
  1096. REAL , INTENT(IN) :: RHOAIR !density air (kg/m3)
  1097. REAL , INTENT(IN) :: EAIR !vapor pressure air (pa)
  1098. REAL , INTENT(IN) :: SFCPRS !pressure (pa)
  1099. REAL , INTENT(IN) :: QAIR !specific humidity (kg/kg)
  1100. REAL , INTENT(IN) :: SFCTMP !air temperature (k)
  1101. REAL , INTENT(IN) :: THAIR !potential temperature (k)
  1102. REAL , INTENT(IN) :: LWDN !downward longwave radiation (w/m2)
  1103. REAL , INTENT(IN) :: UU !wind speed in e-w dir (m/s)
  1104. REAL , INTENT(IN) :: VV !wind speed in n-s dir (m/s)
  1105. REAL , DIMENSION( 1: 2), INTENT(IN) :: SOLAD !incoming direct solar rad. (w/m2)
  1106. REAL , DIMENSION( 1: 2), INTENT(IN) :: SOLAI !incoming diffuse solar rad. (w/m2)
  1107. REAL , INTENT(IN) :: COSZ !cosine solar zenith angle (0-1)
  1108. REAL , INTENT(IN) :: ELAI !LAI adjusted for burying by snow
  1109. REAL , INTENT(IN) :: ESAI !LAI adjusted for burying by snow
  1110. REAL , INTENT(IN) :: CSOIL !vol. soil heat capacity [j/m3/k]
  1111. REAL , INTENT(IN) :: FWET !fraction of canopy that is wet [-]
  1112. REAL , INTENT(IN) :: HTOP !top of canopy layer (m)
  1113. REAL , INTENT(IN) :: FVEG !greeness vegetation fraction (-)
  1114. REAL , INTENT(IN) :: LAT !latitude (radians)
  1115. REAL , INTENT(IN) :: CANLIQ !canopy-intercepted liquid water (mm)
  1116. REAL , INTENT(IN) :: CANICE !canopy-intercepted ice mass (mm)
  1117. REAL , INTENT(IN) :: FOLN !foliage nitrogen (%)
  1118. REAL , INTENT(IN) :: CO2AIR !atmospheric co2 concentration (pa)
  1119. REAL , INTENT(IN) :: O2AIR !atmospheric o2 concentration (pa)
  1120. REAL , INTENT(IN) :: IGS !growing season index (0=off, 1=on)
  1121. REAL , INTENT(IN) :: ZREF !reference height (m)
  1122. REAL , INTENT(IN) :: TBOT !bottom condition for soil temp. (k)
  1123. REAL , INTENT(IN) :: ZBOT !depth for TBOT [m]
  1124. REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !layer-bottom depth from snow surf [m]
  1125. REAL , DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !layer-bottom depth from soil surf [m]
  1126. REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !depth of snow & soil layer-bottom [m]
  1127. !jref:start; in
  1128. INTEGER , INTENT(IN) :: ISURBAN
  1129. INTEGER , INTENT(IN) :: IZ0TLND
  1130. REAL , INTENT(IN) :: QC !cloud water mixing ratio
  1131. REAL , INTENT(IN) :: PBLH !planetary boundary layer height
  1132. REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer
  1133. REAL , INTENT(IN) :: PSFC !pressure at lowest model layer
  1134. REAL , INTENT(IN) :: DX !horisontal resolution
  1135. REAL , INTENT(IN) :: DZ8W !thickness of lowest layer
  1136. REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg)
  1137. !jref:end
  1138. ! outputs
  1139. INTEGER, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: IMELT !phase change index [1-melt; 2-freeze]
  1140. REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume ice [m3/m3]
  1141. REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume liq. water [m3/m3]
  1142. REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3]
  1143. REAL , INTENT(OUT) :: FSNO !snow cover fraction (-)
  1144. REAL , INTENT(OUT) :: QMELT !snowmelt [mm/s]
  1145. REAL , INTENT(OUT) :: PONDING!pounding at ground [mm]
  1146. REAL , INTENT(OUT) :: SAV !solar rad. absorbed by veg. (w/m2)
  1147. REAL , INTENT(OUT) :: SAG !solar rad. absorbed by ground (w/m2)
  1148. REAL , INTENT(OUT) :: FSA !tot. absorbed solar radiation (w/m2)
  1149. REAL , INTENT(OUT) :: FSR !tot. reflected solar radiation (w/m2)
  1150. REAL , INTENT(OUT) :: TAUX !wind stress: e-w (n/m2)
  1151. REAL , INTENT(OUT) :: TAUY !wind stress: n-s (n/m2)
  1152. REAL , INTENT(OUT) :: FIRA !total net LW. rad (w/m2) [+ to atm]
  1153. REAL , INTENT(OUT) :: FSH !total sensible heat (w/m2) [+ to atm]
  1154. REAL , INTENT(OUT) :: FCEV !canopy evaporation (w/m2) [+ to atm]
  1155. REAL , INTENT(OUT) :: FGEV !ground evaporation (w/m2) [+ to atm]
  1156. REAL , INTENT(OUT) :: FCTR !transpiration (w/m2) [+ to atm]
  1157. REAL , INTENT(OUT) :: TRAD !radiative temperature (k)
  1158. REAL , INTENT(OUT) :: T2M !2 m height air temperature (k)
  1159. REAL , INTENT(OUT) :: PSN !total photosyn. (umolco2/m2/s) [+]
  1160. REAL , INTENT(OUT) :: APAR !total photosyn. active energy (w/m2)
  1161. REAL , INTENT(OUT) :: SSOIL !ground heat flux (w/m2) [+ to soil]
  1162. REAL , DIMENSION( 1:NSOIL), INTENT(OUT) :: BTRANI !soil water transpiration factor (0-1)
  1163. REAL , INTENT(OUT) :: BTRAN !soil water transpiration factor (0-1)
  1164. REAL , INTENT(OUT) :: LATHEA !latent heat vap./sublimation (j/kg)
  1165. !jref:start
  1166. REAL , INTENT(OUT) :: FSRV !veg. reflected solar radiation (w/m2)
  1167. REAL , INTENT(OUT) :: FSRG !ground reflected solar radiation (w/m2)
  1168. REAL, INTENT(OUT) :: RSSUN !sunlit leaf stomatal resistance (s/m)
  1169. REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m)
  1170. !jref:end - out for debug
  1171. !jref:start; output
  1172. REAL , INTENT(OUT) :: CHSTAR !effective exchange coefficient
  1173. REAL , INTENT(OUT) :: TSTAR !effective skin temperature
  1174. REAL , INTENT(OUT) :: T2MV !2-m air temperature over vegetated part [k]
  1175. REAL , INTENT(OUT) :: T2MB !2-m air temperature over bare ground part [k]
  1176. REAL , INTENT(OUT) :: BGAP
  1177. REAL , INTENT(OUT) :: WGAP
  1178. REAL , INTENT(OUT) :: GAP
  1179. !jref:end
  1180. ! input & output
  1181. REAL , INTENT(INOUT) :: TS !surface temperature (k)
  1182. REAL , INTENT(INOUT) :: TV !vegetation temperature (k)
  1183. REAL , INTENT(INOUT) :: TG !ground temperature (k)
  1184. REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil temperature [k]
  1185. REAL , INTENT(INOUT) :: SNOWH !snow height [m]
  1186. REAL , INTENT(INOUT) :: SNEQV !snow mass (mm)
  1187. REAL , INTENT(INOUT) :: SNEQVO !snow mass at last time step (mm)
  1188. REAL , DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil moisture [m3/m3]
  1189. REAL , DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !soil moisture (ice + liq.) [m3/m3]
  1190. REAL , DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow ice mass (kg/m2)
  1191. REAL , DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow liq mass (kg/m2)
  1192. REAL , INTENT(INOUT) :: EAH !canopy air vapor pressure (pa)
  1193. REAL , INTENT(INOUT) :: TAH !canopy air temperature (k)
  1194. REAL , INTENT(INOUT) :: ALBOLD !snow albedo at last time step(CLASS type)
  1195. REAL , INTENT(INOUT) :: CM !momentum drag coefficient
  1196. REAL , INTENT(INOUT) :: CH !sensible heat exchange coefficient
  1197. REAL , INTENT(INOUT) :: Q1
  1198. ! REAL :: Q2E
  1199. REAL, INTENT(OUT) :: EMISSI
  1200. ! local
  1201. INTEGER :: IZ !do-loop index
  1202. LOGICAL :: VEG !true if vegetated surface
  1203. REAL :: UR !wind speed at height ZLVL (m/s)
  1204. REAL :: ZLVL !reference height (m)
  1205. REAL :: FSUN !sunlit fraction of canopy [-]
  1206. REAL :: RB !leaf boundary layer resistance (s/m)
  1207. REAL :: RSURF !ground surface resistance (s/m)
  1208. REAL :: L_RSURF!Dry-layer thickness for computing RSURF (Sakaguchi and Zeng, 2009)
  1209. REAL :: D_RSURF!Reduced vapor diffusivity in soil for computing RSURF (SZ09)
  1210. REAL :: BEVAP !soil water evaporation factor (0- 1)
  1211. REAL :: MOL !Monin-Obukhov length (m)
  1212. REAL :: VAI !sum of LAI + stem area index [m2/m2]
  1213. REAL :: CWP !canopy wind extinction parameter
  1214. REAL :: ZPD !zero plane displacement (m)
  1215. REAL :: Z0M !z0 momentum (m)
  1216. REAL :: ZPDG !zero plane displacement (m)
  1217. REAL :: Z0MG !z0 momentum, ground (m)
  1218. REAL :: EMV !vegetation emissivity
  1219. REAL :: EMG !ground emissivity
  1220. REAL :: FIRE !emitted IR (w/m2)
  1221. REAL :: LAISUN !sunlit leaf area index (m2/m2)
  1222. REAL :: LAISHA !shaded leaf area index (m2/m2)
  1223. REAL :: PSNSUN !sunlit photosynthesis (umolco2/m2/s)
  1224. REAL :: PSNSHA !shaded photosynthesis (umolco2/m2/s)
  1225. !jref:start - for debug
  1226. ! REAL :: RSSUN !sunlit stomatal resistance (s/m)
  1227. ! REAL :: RSSHA !shaded stomatal resistance (s/m)
  1228. !jref:end - for debug
  1229. REAL :: PARSUN !par absorbed per sunlit LAI (w/m2)
  1230. REAL :: PARSHA !par absorbed per shaded LAI (w/m2)
  1231. REAL, DIMENSION(-NSNOW+1:NSOIL) :: FACT !temporary used in phase change
  1232. REAL, DIMENSION(-NSNOW+1:NSOIL) :: DF !thermal conductivity [w/m/k]
  1233. REAL, DIMENSION(-NSNOW+1:NSOIL) :: HCPCT !heat capacity [j/m3/k]
  1234. REAL :: BDSNO !bulk density of snow (kg/m3)
  1235. REAL :: FMELT !melting factor for snow cover frac
  1236. REAL :: GX !temporary variable
  1237. REAL, DIMENSION(-NSNOW+1:NSOIL) :: PHI !light through water (w/m2)
  1238. REAL :: GAMMA !psychrometric constant (pa/k)
  1239. REAL :: PSI !surface layer soil matrix potential (m)
  1240. REAL :: RHSUR !raltive humidity in surface soil/snow air space (-)
  1241. ! temperature and fluxes over vegetated fraction
  1242. REAL :: TAUXV !wind stress: e-w dir [n/m2]
  1243. REAL :: TAUYV !wind stress: n-s dir [n/m2]
  1244. REAL :: IRC !canopy net LW rad. [w/m2] [+ to atm]
  1245. REAL :: IRG !ground net LW rad. [w/m2] [+ to atm]
  1246. REAL :: SHC !canopy sen. heat [w/m2] [+ to atm]
  1247. REAL :: SHG !ground sen. heat [w/m2] [+ to atm]
  1248. !jref:start
  1249. REAL,INTENT(OUT) :: Q2V
  1250. REAL,INTENT(OUT) :: Q2B
  1251. REAL,INTENT(OUT) :: Q2E
  1252. !jref:end
  1253. REAL :: EVC !canopy evap. heat [w/m2] [+ to atm]
  1254. REAL :: EVG !ground evap. heat [w/m2] [+ to atm]
  1255. REAL :: TR !transpiration heat [w/m2] [+ to atm]
  1256. REAL :: GHV !ground heat flux [w/m2] [+ to soil]
  1257. REAL,INTENT(OUT) :: TGV !ground surface temp. [k]
  1258. REAL :: CMV !momentum drag coefficient
  1259. REAL,INTENT(OUT) :: CHV !sensible heat exchange coefficient
  1260. ! temperature and fluxes over bare soil fraction
  1261. REAL :: TAUXB !wind stress: e-w dir [n/m2]
  1262. REAL :: TAUYB !wind stress: n-s dir [n/m2]
  1263. REAL :: IRB !net longwave rad. [w/m2] [+ to atm]
  1264. REAL :: SHB !sensible heat [w/m2] [+ to atm]
  1265. REAL :: EVB !evaporation heat [w/m2] [+ to atm]
  1266. REAL :: GHB !ground heat flux [w/m2] [+ to soil]
  1267. REAL,INTENT(OUT) :: TGB !ground surface temp. [k]
  1268. REAL :: CMB !momentum drag coefficient
  1269. REAL,INTENT(OUT) :: CHB !sensible heat exchange coefficient
  1270. !jref:start
  1271. REAL :: CAH2 !sensible heat conductance, canopy air to ZLVL air (m/s)
  1272. REAL :: EHB2 !sensible heat conductance, canopy air to ZLVL air (m/s)
  1273. REAL :: noahmpres
  1274. !jref:end
  1275. REAL, PARAMETER :: MPE = 1.E-6
  1276. REAL, PARAMETER :: PSIWLT = -150. !metric potential for wilting point (m)
  1277. REAL, PARAMETER :: Z0 = 0.01 ! Bare-soil roughness length (m) (i.e., under the canopy)
  1278. ! ---------------------------------------------------------------------------------------------------
  1279. ! initialize fluxes from veg. fraction
  1280. TAUXV = 0.
  1281. TAUYV = 0.
  1282. IRC = 0.
  1283. SHC = 0.
  1284. IRG = 0.
  1285. SHG = 0.
  1286. EVG = 0.
  1287. EVC = 0.
  1288. TR = 0.
  1289. GHV = 0.
  1290. PSNSUN = 0.
  1291. PSNSHA = 0.
  1292. ! wind speed at reference height: ur >= 1
  1293. UR = MAX( SQRT(UU**2.+VV**2.), 1. )
  1294. ! vegetated or non-vegetated
  1295. VAI = ELAI + ESAI
  1296. VEG = .FALSE.
  1297. IF(VAI > 0.) VEG = .TRUE.
  1298. ! ground snow cover fraction [Niu and Yang, 2007, JGR]
  1299. FSNO = 0.
  1300. IF(SNOWH.GT.0.) THEN
  1301. BDSNO = SNEQV / SNOWH
  1302. FMELT = (BDSNO/100.)**M
  1303. FSNO = TANH( SNOWH /(2.5* Z0 * FMELT))
  1304. ENDIF
  1305. ! ground roughness length
  1306. IF(IST == 2) THEN
  1307. IF(TG .LE. TFRZ) THEN
  1308. Z0MG = 0.01 * (1.0-FSNO) + FSNO * Z0SNO
  1309. ELSE
  1310. Z0MG = 0.01
  1311. END IF
  1312. ELSE
  1313. Z0MG = Z0 * (1.0-FSNO) + FSNO * Z0SNO
  1314. END IF
  1315. ! roughness length and displacement height
  1316. ZPDG = SNOWH
  1317. IF(VEG) THEN
  1318. Z0M = Z0MVT(VEGTYP)
  1319. ZPD = 0.65 * HTOP
  1320. IF(SNOWH.GT.ZPD) ZPD = SNOWH
  1321. ELSE
  1322. Z0M = Z0MG
  1323. ZPD = ZPDG
  1324. END IF
  1325. ZLVL = MAX(ZPD,HTOP) + ZREF
  1326. IF(ZPDG >= ZLVL) ZLVL = ZPDG + ZREF
  1327. ! UR = UR*LOG(ZLVL/Z0M)/LOG(10./Z0M) !input UR is at 10m
  1328. ! canopy wind absorption coeffcient
  1329. CWP = CWPVT(VEGTYP)
  1330. ! Thermal properties of soil, snow, lake, and frozen soil
  1331. CALL THERMOPROP (NSOIL ,NSNOW ,ISNOW ,IST ,DZSNSO , & !in
  1332. DT ,SNOWH ,SNICE ,SNLIQ ,CSOIL , & !in
  1333. SMC ,SH2O ,TG ,STC ,UR , & !in
  1334. LAT ,Z0M ,ZLVL ,VEGTYP ,ISURBAN , & !in
  1335. DF ,HCPCT ,SNICEV ,SNLIQV ,EPORE , & !out
  1336. FACT ) !out
  1337. ! Solar radiation: absorbed & reflected by the ground and canopy
  1338. CALL RADIATION (VEGTYP ,IST ,ISC ,ICE ,NSOIL , & !in
  1339. SNEQVO ,SNEQV ,DT ,COSZ ,SNOWH , & !in
  1340. TG ,TV ,FSNO ,QSNOW ,FWET , & !in
  1341. ELAI ,ESAI ,SMC ,SOLAD ,SOLAI , & !in
  1342. FVEG ,ILOC ,JLOC , & !in
  1343. ALBOLD , & !inout
  1344. FSUN ,LAISUN ,LAISHA ,PARSUN ,PARSHA , & !out
  1345. SAV ,SAG ,FSR ,FSA ,FSRV , &
  1346. FSRG ,BGAP ,WGAP ,GAP) !out
  1347. ! vegetation and ground emissivity
  1348. EMV = 1. - EXP(-(ELAI+ESAI)/1.0)
  1349. IF (ICE == 1) THEN
  1350. EMG = 0.98*(1.-FSNO) + 1.0*FSNO
  1351. ELSE
  1352. EMG = EG(IST)*(1.-FSNO) + 1.0*FSNO
  1353. END IF
  1354. ! soil moisture factor controlling stomatal resistance
  1355. BTRAN = 0.
  1356. IF(IST ==1 ) THEN
  1357. DO IZ = 1, NROOT
  1358. IF(OPT_BTR == 1) then ! Noah
  1359. GX = (SH2O(IZ)-SMCWLT) / (SMCREF-SMCWLT)
  1360. END IF
  1361. IF(OPT_BTR == 2) then ! CLM
  1362. PSI = MAX(PSIWLT,-PSISAT*(MAX(0.01,SH2O(IZ))/SMCMAX)**(-BEXP) )
  1363. GX = (1.-PSI/PSIWLT)/(1.+PSISAT/PSIWLT)
  1364. END IF
  1365. IF(OPT_BTR == 3) then ! SSiB
  1366. PSI = MAX(PSIWLT,-PSISAT*(MAX(0.01,SH2O(IZ))/SMCMAX)**(-BEXP) )
  1367. GX = 1.-EXP(-5.8*(LOG(PSIWLT/PSI)))
  1368. END IF
  1369. GX = MIN(1.,MAX(0.,GX))
  1370. BTRANI(IZ) = MAX(MPE,DZSNSO(IZ) / (-ZSOIL(NROOT)) * GX)
  1371. BTRAN = BTRAN + BTRANI(IZ)
  1372. END DO
  1373. BTRAN = MAX(MPE,BTRAN)
  1374. BTRANI(1:NROOT) = BTRANI(1:NROOT)/BTRAN
  1375. END IF
  1376. ! soil surface resistance for ground evap.
  1377. BEVAP = MAX(0.0,SH2O(1)/SMCMAX)
  1378. IF(IST == 2) THEN
  1379. RSURF = 1. ! avoid being divided by 0
  1380. RHSUR = 1.0
  1381. ELSE
  1382. ! RSURF based on Sakaguchi and Zeng, 2009
  1383. ! taking the "residual water content" to be the wilting point,
  1384. ! and correcting the exponent on the D term (typo in SZ09 ?)
  1385. L_RSURF = (-ZSOIL(1)) * ( exp ( (1.0 - MIN(1.0,SH2O(1)/SMCMAX)) ** 5 ) - 1.0 ) / ( 2.71828 - 1.0 )
  1386. D_RSURF = 2.2E-5 * SMCMAX * SMCMAX * ( 1.0 - SMCWLT / SMCMAX ) ** (2.0+3.0/BEXP)
  1387. RSURF = L_RSURF / D_RSURF
  1388. ! Older RSURF computations:
  1389. ! RSURF = FSNO * 1. + (1.-FSNO)* EXP(8.25-4.225*BEVAP) !Sellers (1992)
  1390. ! RSURF = FSNO * 1. + (1.-FSNO)* EXP(8.25-6.0 *BEVAP) !adjusted to decrease RSURF for wet soil
  1391. IF(SH2O(1) < 0.01 .and. SNOWH == 0.) RSURF = 1.E6
  1392. PSI = -PSISAT*(MAX(0.01,SH2O(1))/SMCMAX)**(-BEXP)
  1393. RHSUR = FSNO + (1.-FSNO) * EXP(PSI*GRAV/(RW*TG))
  1394. END IF
  1395. ! urban - jref
  1396. IF (VEGTYP == ISURBAN .and. SNOWH == 0. ) THEN
  1397. RSURF = 1.E6
  1398. ENDIF
  1399. ! set psychrometric constant
  1400. IF (SFCTMP .GT. TFRZ) THEN
  1401. LATHEA = HVAP
  1402. ELSE
  1403. LATHEA = HSUB
  1404. END IF
  1405. GAMMA = CPAIR*SFCPRS/(0.622*LATHEA)
  1406. ! Surface temperatures of the ground and canopy and energy fluxes
  1407. IF (VEG) THEN
  1408. TGV = TG
  1409. CMV = CM
  1410. CHV = CH
  1411. CALL VEGE_FLUX (NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & !in
  1412. DT ,SAV ,SAG ,LWDN ,UR , & !in
  1413. UU ,VV ,SFCTMP ,THAIR ,QAIR , & !in
  1414. EAIR ,RHOAIR ,SNOWH ,VAI ,GAMMA , & !in
  1415. FWET ,LAISUN ,LAISHA ,CWP ,DZSNSO , & !in
  1416. HTOP ,ZLVL ,ZPD ,Z0M ,FVEG , & !in
  1417. Z0MG ,EMV ,EMG ,CANLIQ , & !in
  1418. CANICE ,STC ,DF ,RSSUN ,RSSHA , & !in
  1419. RSURF ,LATHEA ,PARSUN ,PARSHA ,IGS , & !in
  1420. FOLN ,CO2AIR ,O2AIR ,BTRAN ,SFCPRS , & !in
  1421. RHSUR ,ILOC ,JLOC ,Q2 , & !in
  1422. EAH ,TAH ,TV ,TGV ,CMV , & !inout
  1423. CHV ,DX ,DZ8W , & !inout
  1424. TAUXV ,TAUYV ,IRG ,IRC ,SHG , & !out
  1425. SHC ,EVG ,EVC ,TR ,GHV , & !out
  1426. T2MV ,PSNSUN ,PSNSHA , & !out
  1427. !jref:start
  1428. QC ,PBLH ,QSFC ,PSFC ,ISURBAN , & !in
  1429. IZ0TLND ,Q2V ,CAH2) !inout
  1430. !jref:end
  1431. END IF
  1432. TGB = TG
  1433. CMB = CM
  1434. CHB = CH
  1435. CALL BARE_FLUX (NSNOW ,NSOIL ,ISNOW ,DT ,SAG , & !in
  1436. LWDN ,UR ,UU ,VV ,SFCTMP , & !in
  1437. THAIR ,QAIR ,EAIR ,RHOAIR ,SNOWH , & !in
  1438. DZSNSO ,ZLVL ,ZPDG ,Z0MG , & !in
  1439. EMG ,STC ,DF ,RSURF ,LATHEA , & !in
  1440. GAMMA ,RHSUR ,ILOC ,JLOC ,Q2 , & !in
  1441. TGB ,CMB ,CHB , & !inout
  1442. TAUXB ,TAUYB ,IRB ,SHB ,EVB , & !out
  1443. GHB ,T2MB ,DX ,DZ8W ,VEGTYP , & !out
  1444. !jref:start
  1445. QC ,PBLH ,QSFC ,PSFC ,ISURBAN , & !in
  1446. IZ0TLND ,SFCPRS ,Q2B, EHB2) !in
  1447. !jref:end
  1448. !energy balance at vege canopy: SAV =(IRC+SHC+EVC+TR) *FVEG at FVEG
  1449. !energy balance at vege ground: SAG* FVEG =(IRG+SHG+EVG+GHV) *FVEG at FVEG
  1450. !energy balance at bare ground: SAG*(1.-FVEG)=(IRB+SHB+EVB+GHB)*(1.-FVEG) at 1-FVEG
  1451. IF (VEG) THEN
  1452. TAUX = FVEG * TAUXV + (1.0 - FVEG) * TAUXB
  1453. TAUY = FVEG * TAUYV + (1.0 - FVEG) * TAUYB
  1454. FIRA = FVEG * IRG + (1.0 - FVEG) * IRB + FVEG * IRC
  1455. FSH = FVEG * SHG + (1.0 - FVEG) * SHB + FVEG * SHC
  1456. FGEV = FVEG * EVG + (1.0 - FVEG) * EVB
  1457. SSOIL = FVEG * GHV + (1.0 - FVEG) * GHB
  1458. FCEV = FVEG * EVC
  1459. FCTR = FVEG * TR
  1460. TG = FVEG * TGV + (1.0 - FVEG) * TGB
  1461. T2M = FVEG * T2MV + (1.0 - FVEG) * T2MB
  1462. TS = FVEG * TV + (1.0 - FVEG) * TGB
  1463. CM = FVEG * CMV + (1.0 - FVEG) * CMB ! better way to average?
  1464. CH = FVEG * CHV + (1.0 - FVEG) * CHB
  1465. Q1 = FVEG * (EAH*0.622/(SFCPRS - 0.378*EAH)) + (1.0 - FVEG)*QSFC
  1466. Q2E = FVEG * Q2V + (1.0 - FVEG) * Q2B
  1467. ELSE
  1468. TAUX = TAUXB
  1469. TAUY = TAUYB
  1470. FIRA = IRB
  1471. FSH = SHB
  1472. FGEV = EVB
  1473. SSOIL = GHB
  1474. TG = TGB
  1475. T2M = T2MB
  1476. FCEV = 0.
  1477. FCTR = 0.
  1478. TS = TG
  1479. CM = CMB
  1480. CH = CHB
  1481. Q1 = QSFC
  1482. Q2E = Q2B
  1483. END IF
  1484. FIRE = LWDN + FIRA
  1485. IF(FIRE <=0.) THEN
  1486. WRITE(6,*) 'emitted longwave <0; skin T may be wrong due to inconsistent'
  1487. WRITE(6,*) 'input of SHDFAC with LAI'
  1488. WRITE(6,*) ILOC, JLOC, 'SHDFAC=',FVEG,'VAI=',VAI,'TV=',TV,'TG=',TG
  1489. WRITE(6,*) 'LWDN=',LWDN,'FIRA=',FIRA,'SNOWH=',SNOWH
  1490. call wrf_error_fatal("STOP in Noah-MP")
  1491. END IF
  1492. ! Compute a net emissivity
  1493. EMISSI = FVEG * ( EMG*(1-EMV) + EMV + EMV*(1-EMV)*(1-EMG) ) + &
  1494. (1-FVEG) * EMG
  1495. ! When we're computing a TRAD, subtract from the emitted IR the
  1496. ! reflected portion of the incoming LWDN, so we're just
  1497. ! considering the IR originating in the canopy/ground system.
  1498. TRAD = ( ( FIRE - (1-EMISSI)*LWDN ) / (EMISSI*SB) ) ** 0.25
  1499. ! Old TRAD calculation not taking into account Emissivity:
  1500. ! TRAD = (FIRE/SB)**0.25
  1501. APAR = PARSUN*LAISUN + PARSHA*LAISHA
  1502. PSN = PSNSUN*LAISUN + PSNSHA*LAISHA
  1503. ! effective parameters for PBL and diagnostics
  1504. CALL EPARM(ILOC ,JLOC ,TAH ,TGB ,FVEG ,&
  1505. CHV ,CHB ,VEG ,CHSTAR ,TSTAR) !inout
  1506. ! 3L snow & 4L soil temperatures
  1507. CALL TSNOSOI (ICE ,NSOIL ,NSNOW ,ISNOW ,IST , & !in
  1508. TBOT ,ZSNSO ,SSOIL ,DF ,HCPCT , & !in
  1509. ZBOT ,SAG ,DT ,SNOWH ,DZSNSO , & !in
  1510. TG ,ILOC ,JLOC , & !in
  1511. STC ) !inout
  1512. ! adjusting snow surface temperature
  1513. IF(OPT_STC == 2) THEN
  1514. IF (SNOWH > 0.05 .AND. TG > TFRZ) THEN
  1515. TGV = TFRZ
  1516. TGB = TFRZ
  1517. IF (VEG) THEN
  1518. TG = FVEG * TGV + (1.0 - FVEG) * TGB
  1519. TS = FVEG * TV + (1.0 - FVEG) * TGB
  1520. ELSE
  1521. TG = TGB
  1522. TS = TGB
  1523. END IF
  1524. END IF
  1525. END IF
  1526. ! Energy released or consumed by snow & frozen soil
  1527. CALL PHASECHANGE (NSNOW ,NSOIL ,ISNOW ,DT ,FACT , & !in
  1528. DZSNSO ,HCPCT ,IST ,ILOC ,JLOC , & !in
  1529. STC ,SNICE ,SNLIQ ,SNEQV ,SNOWH , & !inout
  1530. SMC ,SH2O , & !inout
  1531. QMELT ,IMELT ,PONDING ) !out
  1532. END SUBROUTINE ENERGY
  1533. ! ==================================================================================================
  1534. SUBROUTINE THERMOPROP (NSOIL ,NSNOW ,ISNOW ,IST ,DZSNSO , & !in
  1535. DT ,SNOWH ,SNICE ,SNLIQ ,CSOIL , & !in
  1536. SMC ,SH2O ,TG ,STC ,UR , & !in
  1537. LAT ,Z0M ,ZLVL ,VEGTYP ,ISURBAN , & !in
  1538. DF ,HCPCT ,SNICEV ,SNLIQV ,EPORE , & !out
  1539. FACT ) !out
  1540. ! -------------------------------------------------------------------------------------------------
  1541. ! -------------------------------------------------------------------------------------------------
  1542. IMPLICIT NONE
  1543. ! --------------------------------------------------------------------------------------------------
  1544. ! inputs
  1545. INTEGER , INTENT(IN) :: NSOIL !number of soil layers
  1546. INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers
  1547. INTEGER , INTENT(IN) :: ISNOW !actual no. of snow layers
  1548. INTEGER , INTENT(IN) :: IST !surface type
  1549. REAL , INTENT(IN) :: DT !time step [s]
  1550. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow ice mass (kg/m2)
  1551. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow liq mass (kg/m2)
  1552. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thickness of snow/soil layers [m]
  1553. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture (ice + liq.) [m3/m3]
  1554. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SH2O !liquid soil moisture [m3/m3]
  1555. REAL , INTENT(IN) :: SNOWH !snow height [m]
  1556. REAL , INTENT(IN) :: CSOIL !vol. soil heat capacity [j/m3/k]
  1557. REAL, INTENT(IN) :: TG !surface temperature (k)
  1558. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil/lake temp. (k)
  1559. REAL, INTENT(IN) :: UR !wind speed at ZLVL (m/s)
  1560. REAL, INTENT(IN) :: LAT !latitude (radians)
  1561. REAL, INTENT(IN) :: Z0M !roughness length (m)
  1562. REAL, INTENT(IN) :: ZLVL !reference height (m)
  1563. INTEGER , INTENT(IN) :: VEGTYP !vegtyp type
  1564. INTEGER , INTENT(IN) :: ISURBAN !urban type
  1565. ! outputs
  1566. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: DF !thermal conductivity [w/m/k]
  1567. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: HCPCT !heat capacity [j/m3/k]
  1568. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume of ice [m3/m3]
  1569. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume of liquid water [m3/m3]
  1570. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3]
  1571. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: FACT !computing energy for phase change
  1572. ! --------------------------------------------------------------------------------------------------
  1573. ! locals
  1574. INTEGER :: IZ
  1575. REAL, DIMENSION(-NSNOW+1: 0) :: CVSNO !volumetric specific heat (j/m3/k)
  1576. REAL, DIMENSION(-NSNOW+1: 0) :: TKSNO !snow thermal conductivity (j/m3/k)
  1577. REAL, DIMENSION( 1:NSOIL) :: SICE !soil ice content
  1578. ! --------------------------------------------------------------------------------------------------
  1579. ! compute snow thermal conductivity and heat capacity
  1580. CALL CSNOW (ISNOW ,NSNOW ,NSOIL ,SNICE ,SNLIQ ,DZSNSO , & !in
  1581. TKSNO ,CVSNO ,SNICEV ,SNLIQV ,EPORE ) !out
  1582. DO IZ = ISNOW+1, 0
  1583. DF (IZ) = TKSNO(IZ)
  1584. HCPCT(IZ) = CVSNO(IZ)
  1585. END DO
  1586. ! compute soil thermal properties
  1587. DO IZ = 1, NSOIL
  1588. SICE(IZ) = SMC(IZ) - SH2O(IZ)
  1589. HCPCT(IZ) = SH2O(IZ)*CWAT + (1.0-SMCMAX)*CSOIL &
  1590. + (SMCMAX-SMC(IZ))*CPAIR + SICE(IZ)*CICE
  1591. CALL TDFCND (DF(IZ), SMC(IZ), SH2O(IZ))
  1592. END DO
  1593. IF ( VEGTYP == ISURBAN ) THEN
  1594. DO IZ = 1,NSOIL
  1595. DF(IZ) = 3.24
  1596. END DO
  1597. ENDIF
  1598. ! heat flux reduction effect from the overlying green canopy, adapted from
  1599. ! section 2.1.2 of Peters-Lidard et al. (1997, JGR, VOL 102(D4)).
  1600. ! not in use because of the separation of the canopy layer from the ground.
  1601. ! but this may represent the effects of leaf litter (Niu comments)
  1602. ! DF1 = DF1 * EXP (SBETA * SHDFAC)
  1603. ! compute lake thermal properties
  1604. ! (no consideration of turbulent mixing for this version)
  1605. IF(IST == 2) THEN
  1606. DO IZ = 1, NSOIL
  1607. IF(STC(IZ) > TFRZ) THEN
  1608. HCPCT(IZ) = CWAT
  1609. DF(IZ) = TKWAT !+ KEDDY * CWAT
  1610. ELSE
  1611. HCPCT(IZ) = CICE
  1612. DF(IZ) = TKICE
  1613. END IF
  1614. END DO
  1615. END IF
  1616. ! combine a temporary variable used for melting/freezing of snow and frozen soil
  1617. DO IZ = ISNOW+1,NSOIL
  1618. FACT(IZ) = DT/(HCPCT(IZ)*DZSNSO(IZ))
  1619. END DO
  1620. ! snow/soil interface
  1621. IF(ISNOW == 0) THEN
  1622. DF(1) = (DF(1)*DZSNSO(1)+0.35*SNOWH) / (SNOWH +DZSNSO(1))
  1623. ELSE
  1624. DF(1) = (DF(1)*DZSNSO(1)+DF(0)*DZSNSO(0)) / (DZSNSO(0)+DZSNSO(1))
  1625. END IF
  1626. END SUBROUTINE THERMOPROP
  1627. ! ==================================================================================================
  1628. ! --------------------------------------------------------------------------------------------------
  1629. SUBROUTINE CSNOW (ISNOW ,NSNOW ,NSOIL ,SNICE ,SNLIQ ,DZSNSO , & !in
  1630. TKSNO ,CVSNO ,SNICEV ,SNLIQV ,EPORE ) !out
  1631. ! --------------------------------------------------------------------------------------------------
  1632. ! Snow bulk density,volumetric capacity, and thermal conductivity
  1633. !---------------------------------------------------------------------------------------------------
  1634. IMPLICIT NONE
  1635. !---------------------------------------------------------------------------------------------------
  1636. ! inputs
  1637. INTEGER, INTENT(IN) :: ISNOW !number of snow layers (-)
  1638. INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers
  1639. INTEGER , INTENT(IN) :: NSOIL !number of soil layers
  1640. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow ice mass (kg/m2)
  1641. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow liq mass (kg/m2)
  1642. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m]
  1643. ! outputs
  1644. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: CVSNO !volumetric specific heat (j/m3/k)
  1645. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: TKSNO !thermal conductivity (w/m/k)
  1646. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume of ice [m3/m3]
  1647. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume of liquid water [m3/m3]
  1648. REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3]
  1649. ! locals
  1650. INTEGER :: IZ
  1651. REAL, DIMENSION(-NSNOW+1: 0) :: BDSNOI !bulk density of snow(kg/m3)
  1652. !---------------------------------------------------------------------------------------------------
  1653. ! thermal capacity of snow
  1654. DO IZ = ISNOW+1, 0
  1655. SNICEV(IZ) = MIN(1., SNICE(IZ)/(DZSNSO(IZ)*DENICE) )
  1656. EPORE(IZ) = 1. - SNICEV(IZ)
  1657. SNLIQV(IZ) = MIN(EPORE(IZ),SNLIQ(IZ)/(DZSNSO(IZ)*DENH2O))
  1658. ENDDO
  1659. DO IZ = ISNOW+1, 0
  1660. BDSNOI(IZ) = (SNICE(IZ)+SNLIQ(IZ))/DZSNSO(IZ)
  1661. CVSNO(IZ) = CICE*SNICEV(IZ)+CWAT*SNLIQV(IZ)
  1662. ! CVSNO(IZ) = 0.525E06 ! constant
  1663. enddo
  1664. ! thermal conductivity of snow
  1665. DO IZ = ISNOW+1, 0
  1666. TKSNO(IZ) = 3.2217E-6*BDSNOI(IZ)**2. ! Stieglitz(yen,1965)
  1667. ! TKSNO(IZ) = 2E-2+2.5E-6*BDSNOI(IZ)*BDSNOI(IZ) ! Anderson, 1976
  1668. ! TKSNO(IZ) = 0.35 ! constant
  1669. ! TKSNO(IZ) = 2.576E-6*BDSNOI(IZ)**2. + 0.074 ! Verseghy (1991)
  1670. ! TKSNO(IZ) = 2.22*(BDSNOI(IZ)/1000.)**1.88 ! Douvill(Yen, 1981)
  1671. ENDDO
  1672. END SUBROUTINE CSNOW
  1673. !===================================================================================================
  1674. ! --------------------------------------------------------------------------------------------------
  1675. SUBROUTINE TDFCND ( DF, SMC, SH2O)
  1676. ! --------------------------------------------------------------------------------------------------
  1677. ! Calculate thermal diffusivity and conductivity of the soil.
  1678. ! Peters-Lidard approach (Peters-Lidard et al., 1998)
  1679. ! --------------------------------------------------------------------------------------------------
  1680. ! Code history:
  1681. ! June 2001 changes: frozen soil condition.
  1682. ! --------------------------------------------------------------------------------------------------
  1683. IMPLICIT NONE
  1684. REAL, INTENT(IN) :: SMC ! total soil water
  1685. REAL, INTENT(IN) :: SH2O ! liq. soil water
  1686. REAL, INTENT(OUT) :: DF ! thermal diffusivity
  1687. ! local variables
  1688. REAL :: AKE
  1689. REAL :: GAMMD
  1690. REAL :: THKDRY
  1691. REAL :: THKO ! thermal conductivity for other soil components
  1692. REAL :: THKQTZ ! thermal conductivity for quartz
  1693. REAL :: THKSAT !
  1694. REAL :: THKS ! thermal conductivity for the solids
  1695. REAL :: THKW ! water thermal conductivity
  1696. REAL :: SATRATIO
  1697. REAL :: XU
  1698. REAL :: XUNFROZ
  1699. ! --------------------------------------------------------------------------------------------------
  1700. ! We now get quartz as an input argument (set in routine redprm):
  1701. ! DATA QUARTZ /0.82, 0.10, 0.25, 0.60, 0.52,
  1702. ! & 0.35, 0.60, 0.40, 0.82/
  1703. ! --------------------------------------------------------------------------------------------------
  1704. ! If the soil has any moisture content compute a partial sum/product
  1705. ! otherwise use a constant value which works well with most soils
  1706. ! --------------------------------------------------------------------------------------------------
  1707. ! QUARTZ ....QUARTZ CONTENT (SOIL TYPE DEPENDENT)
  1708. ! --------------------------------------------------------------------------------------------------
  1709. ! USE AS IN PETERS-LIDARD, 1998 (MODIF. FROM JOHANSEN, 1975).
  1710. ! PABLO GRUNMANN, 08/17/98
  1711. ! Refs.:
  1712. ! Farouki, O.T.,1986: Thermal properties of soils. Series on Rock
  1713. ! and Soil Mechanics, Vol. 11, Trans Tech, 136 pp.
  1714. ! Johansen, O., 1975: Thermal conductivity of soils. PH.D. Thesis,
  1715. ! University of Trondheim,
  1716. ! Peters-Lidard, C. D., et al., 1998: The effect of soil thermal
  1717. ! conductivity parameterization on surface energy fluxes
  1718. ! and temperatures. Journal of The Atmospheric Sciences,
  1719. ! Vol. 55, pp. 1209-1224.
  1720. ! --------------------------------------------------------------------------------------------------
  1721. ! NEEDS PARAMETERS
  1722. ! POROSITY(SOIL TYPE):
  1723. ! POROS = SMCMAX
  1724. ! SATURATION RATIO:
  1725. ! PARAMETERS W/(M.K)
  1726. SATRATIO = SMC / SMCMAX
  1727. THKW = 0.57
  1728. ! IF (QUARTZ .LE. 0.2) THKO = 3.0
  1729. THKO = 2.0
  1730. ! SOLIDS' CONDUCTIVITY
  1731. ! QUARTZ' CONDUCTIVITY
  1732. THKQTZ = 7.7
  1733. ! UNFROZEN FRACTION (FROM 1., i.e., 100%LIQUID, TO 0. (100% FROZEN))
  1734. THKS = (THKQTZ ** QUARTZ)* (THKO ** (1. - QUARTZ))
  1735. ! UNFROZEN VOLUME FOR SATURATION (POROSITY*XUNFROZ)
  1736. XUNFROZ = SH2O / SMC
  1737. ! SATURATED THERMAL CONDUCTIVITY
  1738. XU = XUNFROZ * SMCMAX
  1739. ! DRY DENSITY IN KG/M3
  1740. THKSAT = THKS ** (1. - SMCMAX)* TKICE ** (SMCMAX - XU)* THKW ** &
  1741. (XU)
  1742. ! DRY THERMAL CONDUCTIVITY IN W.M-1.K-1
  1743. GAMMD = (1. - SMCMAX)*2700.
  1744. THKDRY = (0.135* GAMMD+ 64.7)/ (2700. - 0.947* GAMMD)
  1745. ! FROZEN
  1746. IF ( (SH2O + 0.0005) < SMC ) THEN
  1747. AKE = SATRATIO
  1748. ! UNFROZEN
  1749. ! RANGE OF VALIDITY FOR THE KERSTEN NUMBER (AKE)
  1750. ELSE
  1751. ! KERSTEN NUMBER (USING "FINE" FORMULA, VALID FOR SOILS CONTAINING AT
  1752. ! LEAST 5% OF PARTICLES WITH DIAMETER LESS THAN 2.E-6 METERS.)
  1753. ! (FOR "COARSE" FORMULA, SEE PETERS-LIDARD ET AL., 1998).
  1754. IF ( SATRATIO > 0.1 ) THEN
  1755. AKE = LOG10 (SATRATIO) + 1.0
  1756. ! USE K = KDRY
  1757. ELSE
  1758. AKE = 0.0
  1759. END IF
  1760. ! THERMAL CONDUCTIVITY
  1761. END IF
  1762. DF = AKE * (THKSAT - THKDRY) + THKDRY
  1763. end subroutine TDFCND
  1764. ! ==================================================================================================
  1765. SUBROUTINE RADIATION (VEGTYP ,IST ,ISC ,ICE ,NSOIL , & !in
  1766. SNEQVO ,SNEQV ,DT ,COSZ ,SNOWH , & !in
  1767. TG ,TV ,FSNO ,QSNOW ,FWET , & !in
  1768. ELAI ,ESAI ,SMC ,SOLAD ,SOLAI , & !in
  1769. FVEG ,ILOC ,JLOC , & !in
  1770. ALBOLD , & !inout
  1771. FSUN ,LAISUN ,LAISHA ,PARSUN ,PARSHA , & !out
  1772. SAV ,SAG ,FSR ,FSA ,FSRV , &
  1773. FSRG ,BGAP ,WGAP,GAP) !out
  1774. ! --------------------------------------------------------------------------------------------------
  1775. IMPLICIT NONE
  1776. ! --------------------------------------------------------------------------------------------------
  1777. ! input
  1778. INTEGER, INTENT(IN) :: ILOC
  1779. INTEGER, INTENT(IN) :: JLOC
  1780. INTEGER, INTENT(IN) :: VEGTYP !vegetation type
  1781. INTEGER, INTENT(IN) :: IST !surface type
  1782. INTEGER, INTENT(IN) :: ISC !soil color type (1-lighest; 8-darkest)
  1783. INTEGER, INTENT(IN) :: ICE !ice (ice = 1)
  1784. INTEGER, INTENT(IN) :: NSOIL !number of soil layers
  1785. REAL, INTENT(IN) :: DT !time step [s]
  1786. REAL, INTENT(IN) :: QSNOW !snowfall (mm/s)
  1787. REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm)
  1788. REAL, INTENT(IN) :: SNEQV !snow mass (mm)
  1789. REAL, INTENT(IN) :: SNOWH !snow height (mm)
  1790. REAL, INTENT(IN) :: COSZ !cosine solar zenith angle (0-1)
  1791. REAL, INTENT(IN) :: TG !ground temperature (k)
  1792. REAL, INTENT(IN) :: TV !vegetation temperature (k)
  1793. REAL, INTENT(IN) :: ELAI !LAI, one-sided, adjusted for burying by snow
  1794. REAL, INTENT(IN) :: ESAI !SAI, one-sided, adjusted for burying by snow
  1795. REAL, INTENT(IN) :: FWET !fraction of canopy that is wet
  1796. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !volumetric soil water [m3/m3]
  1797. REAL, DIMENSION(1:2) , INTENT(IN) :: SOLAD !incoming direct solar radiation (w/m2)
  1798. REAL, DIMENSION(1:2) , INTENT(IN) :: SOLAI !incoming diffuse solar radiation (w/m2)
  1799. REAL, INTENT(IN) :: FSNO !snow cover fraction (-)
  1800. REAL, INTENT(IN) :: FVEG !green vegetation fraction [0.0-1.0]
  1801. ! inout
  1802. REAL, INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type)
  1803. ! output
  1804. REAL, INTENT(OUT) :: FSUN !sunlit fraction of canopy (-)
  1805. REAL, INTENT(OUT) :: LAISUN !sunlit leaf area (-)
  1806. REAL, INTENT(OUT) :: LAISHA !shaded leaf area (-)
  1807. REAL, INTENT(OUT) :: PARSUN !average absorbed par for sunlit leaves (w/m2)
  1808. REAL, INTENT(OUT) :: PARSHA !average absorbed par for shaded leaves (w/m2)
  1809. REAL, INTENT(OUT) :: SAV !solar radiation absorbed by vegetation (w/m2)
  1810. REAL, INTENT(OUT) :: SAG !solar radiation absorbed by ground (w/m2)
  1811. REAL, INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2)
  1812. REAL, INTENT(OUT) :: FSR !total reflected solar radiation (w/m2)
  1813. !jref:start
  1814. REAL, INTENT(OUT) :: FSRV !veg. reflected solar radiation (w/m2)
  1815. REAL, INTENT(OUT) :: FSRG !ground reflected solar radiation (w/m2)
  1816. REAL, INTENT(OUT) :: BGAP
  1817. REAL, INTENT(OUT) :: WGAP
  1818. REAL, INTENT(OUT) :: GAP
  1819. !jref:end
  1820. ! local
  1821. REAL :: FAGE !snow age function (0 - new snow)
  1822. REAL, DIMENSION(1:2) :: ALBGRD !ground albedo (direct)
  1823. REAL, DIMENSION(1:2) :: ALBGRI !ground albedo (diffuse)
  1824. REAL, DIMENSION(1:2) :: ALBD !surface albedo (direct)
  1825. REAL, DIMENSION(1:2) :: ALBI !surface albedo (diffuse)
  1826. REAL, DIMENSION(1:2) :: FABD !flux abs by veg (per unit direct flux)
  1827. REAL, DIMENSION(1:2) :: FABI !flux abs by veg (per unit diffuse flux)
  1828. REAL, DIMENSION(1:2) :: FTDD !down direct flux below veg (per unit dir flux)
  1829. REAL, DIMENSION(1:2) :: FTID !down diffuse flux below veg (per unit dir flux)
  1830. REAL, DIMENSION(1:2) :: FTII !down diffuse flux below veg (per unit dif flux)
  1831. !jref:start
  1832. REAL, DIMENSION(1:2) :: FREVI
  1833. REAL, DIMENSION(1:2) :: FREVD
  1834. REAL, DIMENSION(1:2) :: FREGI
  1835. REAL, DIMENSION(1:2) :: FREGD
  1836. !jref:end
  1837. REAL :: FSHA !shaded fraction of canopy
  1838. REAL :: VAI !total LAI + stem area index, one sided
  1839. REAL,PARAMETER :: MPE = 1.E-6
  1840. LOGICAL VEG !true: vegetated for surface temperature calculation
  1841. ! --------------------------------------------------------------------------------------------------
  1842. ! surface abeldo
  1843. CALL ALBEDO (VEGTYP ,IST ,ISC ,ICE ,NSOIL , & !in
  1844. DT ,COSZ ,FAGE ,ELAI ,ESAI , & !in
  1845. TG ,TV ,SNOWH ,FSNO ,FWET , & !in
  1846. SMC ,SNEQVO ,SNEQV ,QSNOW ,FVEG , & !in
  1847. ILOC ,JLOC , & !in
  1848. ALBOLD , & !inout
  1849. ALBGRD ,ALBGRI ,ALBD ,ALBI ,FABD , & !out
  1850. FABI ,FTDD ,FTID ,FTII ,FSUN , & !) !out
  1851. FREVI ,FREVD ,FREGD ,FREGI ,BGAP , & !inout
  1852. WGAP ,GAP)
  1853. ! surface radiation
  1854. FSHA = 1.-FSUN
  1855. LAISUN = ELAI*FSUN
  1856. LAISHA = ELAI*FSHA
  1857. VAI = ELAI+ ESAI
  1858. IF (VAI .GT. 0.) THEN
  1859. VEG = .TRUE.
  1860. ELSE
  1861. VEG = .FALSE.
  1862. END IF
  1863. CALL SURRAD (MPE ,FSUN ,FSHA ,ELAI ,VAI , & !in
  1864. LAISUN ,LAISHA ,SOLAD ,SOLAI ,FABD , & !in
  1865. FABI ,FTDD ,FTID ,FTII ,ALBGRD , & !in
  1866. ALBGRI ,ALBD ,ALBI ,ILOC ,JLOC , & !in
  1867. PARSUN ,PARSHA ,SAV ,SAG ,FSA , & !out
  1868. FSR , & !out
  1869. FREVI ,FREVD ,FREGD ,FREGI ,FSRV , & !inout
  1870. FSRG)
  1871. END SUBROUTINE RADIATION
  1872. ! ==================================================================================================
  1873. ! --------------------------------------------------------------------------------------------------
  1874. SUBROUTINE ALBEDO (VEGTYP ,IST ,ISC ,ICE ,NSOIL , & !in
  1875. DT ,COSZ ,FAGE ,ELAI ,ESAI , & !in
  1876. TG ,TV ,SNOWH ,FSNO ,FWET , & !in
  1877. SMC ,SNEQVO ,SNEQV ,QSNOW ,FVEG , & !in
  1878. ILOC ,JLOC , & !in
  1879. ALBOLD , & !inout
  1880. ALBGRD ,ALBGRI ,ALBD ,ALBI ,FABD , & !out
  1881. FABI ,FTDD ,FTID ,FTII ,FSUN , & !out
  1882. FREVI ,FREVD ,FREGD ,FREGI ,BGAP , & !out
  1883. WGAP ,GAP)
  1884. ! --------------------------------------------------------------------------------------------------
  1885. ! surface albedos. also fluxes (per unit incoming direct and diffuse
  1886. ! radiation) reflected, transmitted, and absorbed by vegetation.
  1887. ! also sunlit fraction of the canopy.
  1888. ! --------------------------------------------------------------------------------------------------
  1889. USE NOAHMP_VEG_PARAMETERS
  1890. ! --------------------------------------------------------------------------------------------------
  1891. IMPLICIT NONE
  1892. ! --------------------------------------------------------------------------------------------------
  1893. ! input
  1894. INTEGER, INTENT(IN) :: ILOC
  1895. INTEGER, INTENT(IN) :: JLOC
  1896. INTEGER, INTENT(IN) :: NSOIL !number of soil layers
  1897. INTEGER, INTENT(IN) :: VEGTYP !vegetation type
  1898. INTEGER, INTENT(IN) :: IST !surface type
  1899. INTEGER, INTENT(IN) :: ISC !soil color type (1-lighest; 8-darkest)
  1900. INTEGER, INTENT(IN) :: ICE !ice (ice = 1)
  1901. REAL, INTENT(IN) :: DT !time step [sec]
  1902. REAL, INTENT(IN) :: QSNOW !snowfall
  1903. REAL, INTENT(IN) :: COSZ !cosine solar zenith angle for next time step
  1904. REAL, INTENT(IN) :: SNOWH !snow height (mm)
  1905. REAL, INTENT(IN) :: TG !ground temperature (k)
  1906. REAL, INTENT(IN) :: TV !vegetation temperature (k)
  1907. REAL, INTENT(IN) :: ELAI !LAI, one-sided, adjusted for burying by snow
  1908. REAL, INTENT(IN) :: ESAI !SAI, one-sided, adjusted for burying by snow
  1909. REAL, INTENT(IN) :: FSNO !fraction of grid covered by snow
  1910. REAL, INTENT(IN) :: FWET !fraction of canopy that is wet
  1911. REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm)
  1912. REAL, INTENT(IN) :: SNEQV !snow mass (mm)
  1913. REAL, INTENT(IN) :: FVEG !green vegetation fraction [0.0-1.0]
  1914. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !volumetric soil water (m3/m3)
  1915. ! inout
  1916. REAL, INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type)
  1917. ! output
  1918. REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRD !ground albedo (direct)
  1919. REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRI !ground albedo (diffuse)
  1920. REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBD !surface albedo (direct)
  1921. REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBI !surface albedo (diffuse)
  1922. REAL, DIMENSION(1: 2), INTENT(OUT) :: FABD !flux abs by veg (per unit direct flux)
  1923. REAL, DIMENSION(1: 2), INTENT(OUT) :: FABI !flux abs by veg (per unit diffuse flux)
  1924. REAL, DIMENSION(1: 2), INTENT(OUT) :: FTDD !down direct flux below veg (per unit dir flux)
  1925. REAL, DIMENSION(1: 2), INTENT(OUT) :: FTID !down diffuse flux below veg (per unit dir flux)
  1926. REAL, DIMENSION(1: 2), INTENT(OUT) :: FTII !down diffuse flux below veg (per unit dif flux)
  1927. REAL, INTENT(OUT) :: FSUN !sunlit fraction of canopy (-)
  1928. !jref:start
  1929. REAL, DIMENSION(1: 2), INTENT(OUT) :: FREVD
  1930. REAL, DIMENSION(1: 2), INTENT(OUT) :: FREVI
  1931. REAL, DIMENSION(1: 2), INTENT(OUT) :: FREGD
  1932. REAL, DIMENSION(1: 2), INTENT(OUT) :: FREGI
  1933. REAL, INTENT(OUT) :: BGAP
  1934. REAL, INTENT(OUT) :: WGAP
  1935. REAL, INTENT(OUT) :: GAP
  1936. !jref:end
  1937. ! ------------------------------------------------------------------------
  1938. ! ------------------------ local variables -------------------------------
  1939. ! local
  1940. REAL :: FAGE !snow age function
  1941. REAL :: ALB
  1942. INTEGER :: IB !indices
  1943. INTEGER :: NBAND !number of solar radiation wave bands
  1944. INTEGER :: IC !direct beam: ic=0; diffuse: ic=1
  1945. REAL :: WL !fraction of LAI+SAI that is LAI
  1946. REAL :: WS !fraction of LAI+SAI that is SAI
  1947. REAL :: MPE !prevents overflow for division by zero
  1948. REAL, DIMENSION(1:2) :: RHO !leaf/stem reflectance weighted by fraction LAI and SAI
  1949. REAL, DIMENSION(1:2) :: TAU !leaf/stem transmittance weighted by fraction LAI and SAI
  1950. REAL, DIMENSION(1:2) :: FTDI !down direct flux below veg per unit dif flux = 0
  1951. REAL, DIMENSION(1:2) :: ALBSND !snow albedo (direct)
  1952. REAL, DIMENSION(1:2) :: ALBSNI !snow albedo (diffuse)
  1953. REAL :: VAI !ELAI+ESAI
  1954. REAL :: GDIR !average projected leaf/stem area in solar direction
  1955. REAL :: EXT !optical depth direct beam per unit leaf + stem area
  1956. ! --------------------------------------------------------------------------------------------------
  1957. NBAND = 2
  1958. MPE = 1.E-06
  1959. BGAP = 0.
  1960. WGAP = 0.
  1961. GAP = 0.
  1962. ! initialize output because solar radiation only done if COSZ > 0
  1963. DO IB = 1, NBAND
  1964. ALBD(IB) = 0.
  1965. ALBI(IB) = 0.
  1966. ALBGRD(IB) = 0.
  1967. ALBGRI(IB) = 0.
  1968. FABD(IB) = 0.
  1969. FABI(IB) = 0.
  1970. FTDD(IB) = 0.
  1971. FTID(IB) = 0.
  1972. FTII(IB) = 0.
  1973. IF (IB.EQ.1) FSUN = 0.
  1974. END DO
  1975. IF(COSZ <= 0) GOTO 100
  1976. ! weight reflectance/transmittance by LAI and SAI
  1977. DO IB = 1, NBAND
  1978. VAI = ELAI + ESAI
  1979. WL = ELAI / MAX(VAI,MPE)
  1980. WS = ESAI / MAX(VAI,MPE)
  1981. RHO(IB) = MAX(RHOL(VEGTYP,IB)*WL+RHOS(VEGTYP,IB)*WS, MPE)
  1982. TAU(IB) = MAX(TAUL(VEGTYP,IB)*WL+TAUS(VEGTYP,IB)*WS, MPE)
  1983. END DO
  1984. ! snow age
  1985. CALL SNOW_AGE (DT,TG,SNEQVO,SNEQV,FAGE)
  1986. ! snow albedos: only if COSZ > 0 and FSNO > 0
  1987. IF(OPT_ALB == 1) &
  1988. CALL SNOWALB_BATS (NBAND, FSNO,COSZ,FAGE,ALBSND,ALBSNI)
  1989. IF(OPT_ALB == 2) THEN
  1990. CALL SNOWALB_CLASS (NBAND,QSNOW,DT,ALB,ALBOLD,ALBSND,ALBSNI,ILOC,JLOC)
  1991. ALBOLD = ALB
  1992. END IF
  1993. ! ground surface albedo
  1994. CALL GROUNDALB (NSOIL ,NBAND ,ICE ,IST ,ISC , & !in
  1995. FSNO ,SMC ,ALBSND ,ALBSNI ,COSZ , & !in
  1996. TG ,ILOC ,JLOC , & !in
  1997. ALBGRD ,ALBGRI ) !out
  1998. ! loop over NBAND wavebands to calculate surface albedos and solar
  1999. ! fluxes for unit incoming direct (IC=0) and diffuse flux (IC=1)
  2000. DO IB = 1, NBAND
  2001. IC = 0 ! direct
  2002. CALL TWOSTREAM (IB ,IC ,VEGTYP ,COSZ ,VAI , & !in
  2003. FWET ,TV ,ALBGRD ,ALBGRI ,RHO , & !in
  2004. TAU ,FVEG ,IST ,ILOC ,JLOC , & !in
  2005. FABD ,ALBD ,FTDD ,FTID ,GDIR , &!) !out
  2006. FREVD ,FREGD ,BGAP ,WGAP ,GAP)
  2007. IC = 1 ! diffuse
  2008. CALL TWOSTREAM (IB ,IC ,VEGTYP ,COSZ ,VAI , & !in
  2009. FWET ,TV ,ALBGRD ,ALBGRI ,RHO , & !in
  2010. TAU ,FVEG ,IST ,ILOC ,JLOC , & !in
  2011. FABI ,ALBI ,FTDI ,FTII ,GDIR , & !) !out
  2012. FREVI ,FREGI ,BGAP ,WGAP ,GAP)
  2013. END DO
  2014. ! sunlit fraction of canopy. set FSUN = 0 if FSUN < 0.01.
  2015. EXT = GDIR/COSZ * SQRT(1.-RHO(1)-TAU(1))
  2016. FSUN = (1.-EXP(-EXT*VAI)) / MAX(EXT*VAI,MPE)
  2017. EXT = FSUN
  2018. IF (EXT .LT. 0.01) THEN
  2019. WL = 0.
  2020. ELSE
  2021. WL = EXT
  2022. END IF
  2023. FSUN = WL
  2024. 100 CONTINUE
  2025. END SUBROUTINE ALBEDO
  2026. ! ==================================================================================================
  2027. ! --------------------------------------------------------------------------------------------------
  2028. SUBROUTINE SURRAD (MPE ,FSUN ,FSHA ,ELAI ,VAI , & !in
  2029. LAISUN ,LAISHA ,SOLAD ,SOLAI ,FABD , & !in
  2030. FABI ,FTDD ,FTID ,FTII ,ALBGRD , & !in
  2031. ALBGRI ,ALBD ,ALBI ,ILOC ,JLOC , & !in
  2032. PARSUN ,PARSHA ,SAV ,SAG ,FSA , & !out
  2033. FSR , & !) !out
  2034. FREVI ,FREVD ,FREGD ,FREGI ,FSRV , &
  2035. FSRG) !inout
  2036. ! --------------------------------------------------------------------------------------------------
  2037. IMPLICIT NONE
  2038. ! --------------------------------------------------------------------------------------------------
  2039. ! input
  2040. INTEGER, INTENT(IN) :: ILOC
  2041. INTEGER, INTENT(IN) :: JLOC
  2042. REAL, INTENT(IN) :: MPE !prevents underflow errors if division by zero
  2043. REAL, INTENT(IN) :: FSUN !sunlit fraction of canopy
  2044. REAL, INTENT(IN) :: FSHA !shaded fraction of canopy
  2045. REAL, INTENT(IN) :: ELAI !leaf area, one-sided
  2046. REAL, INTENT(IN) :: VAI !leaf + stem area, one-sided
  2047. REAL, INTENT(IN) :: LAISUN !sunlit leaf area index, one-sided
  2048. REAL, INTENT(IN) :: LAISHA !shaded leaf area index, one-sided
  2049. REAL, DIMENSION(1:2), INTENT(IN) :: SOLAD !incoming direct solar radiation (w/m2)
  2050. REAL, DIMENSION(1:2), INTENT(IN) :: SOLAI !incoming diffuse solar radiation (w/m2)
  2051. REAL, DIMENSION(1:2), INTENT(IN) :: FABD !flux abs by veg (per unit incoming direct flux)
  2052. REAL, DIMENSION(1:2), INTENT(IN) :: FABI !flux abs by veg (per unit incoming diffuse flux)
  2053. REAL, DIMENSION(1:2), INTENT(IN) :: FTDD !down dir flux below veg (per incoming dir flux)
  2054. REAL, DIMENSION(1:2), INTENT(IN) :: FTID !down dif flux below veg (per incoming dir flux)
  2055. REAL, DIMENSION(1:2), INTENT(IN) :: FTII !down dif flux below veg (per incoming dif flux)
  2056. REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRD !ground albedo (direct)
  2057. REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRI !ground albedo (diffuse)
  2058. REAL, DIMENSION(1:2), INTENT(IN) :: ALBD !overall surface albedo (direct)
  2059. REAL, DIMENSION(1:2), INTENT(IN) :: ALBI !overall surface albedo (diffuse)
  2060. REAL, DIMENSION(1:2), INTENT(IN) :: FREVD !overall surface albedo veg (direct)
  2061. REAL, DIMENSION(1:2), INTENT(IN) :: FREVI !overall surface albedo veg (diffuse)
  2062. REAL, DIMENSION(1:2), INTENT(IN) :: FREGD !overall surface albedo grd (direct)
  2063. REAL, DIMENSION(1:2), INTENT(IN) :: FREGI !overall surface albedo grd (diffuse)
  2064. ! output
  2065. REAL, INTENT(OUT) :: PARSUN !average absorbed par for sunlit leaves (w/m2)
  2066. REAL, INTENT(OUT) :: PARSHA !average absorbed par for shaded leaves (w/m2)
  2067. REAL, INTENT(OUT) :: SAV !solar radiation absorbed by vegetation (w/m2)
  2068. REAL, INTENT(OUT) :: SAG !solar radiation absorbed by ground (w/m2)
  2069. REAL, INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2)
  2070. REAL, INTENT(OUT) :: FSR !total reflected solar radiation (w/m2)
  2071. REAL, INTENT(OUT) :: FSRV !reflected solar radiation by vegetation
  2072. REAL, INTENT(OUT) :: FSRG !reflected solar radiation by ground
  2073. ! ------------------------ local variables ----------------------------------------------------
  2074. INTEGER :: IB !waveband number (1=vis, 2=nir)
  2075. INTEGER :: NBAND !number of solar radiation waveband classes
  2076. REAL :: ABS !absorbed solar radiation (w/m2)
  2077. REAL :: RNIR !reflected solar radiation [nir] (w/m2)
  2078. REAL :: RVIS !reflected solar radiation [vis] (w/m2)
  2079. REAL :: LAIFRA !leaf area fraction of canopy
  2080. REAL :: TRD !transmitted solar radiation: direct (w/m2)
  2081. REAL :: TRI !transmitted solar radiation: diffuse (w/m2)
  2082. REAL, DIMENSION(1:2) :: CAD !direct beam absorbed by canopy (w/m2)
  2083. REAL, DIMENSION(1:2) :: CAI !diffuse radiation absorbed by canopy (w/m2)
  2084. ! ---------------------------------------------------------------------------------------------
  2085. NBAND = 2
  2086. ! zero summed solar fluxes
  2087. SAG = 0.
  2088. SAV = 0.
  2089. FSA = 0.
  2090. ! loop over nband wavebands
  2091. DO IB = 1, NBAND
  2092. ! absorbed by canopy
  2093. CAD(IB) = SOLAD(IB)*FABD(IB)
  2094. CAI(IB) = SOLAI(IB)*FABI(IB)
  2095. SAV = SAV + CAD(IB) + CAI(IB)
  2096. FSA = FSA + CAD(IB) + CAI(IB)
  2097. ! transmitted solar fluxes incident on ground
  2098. TRD = SOLAD(IB)*FTDD(IB)
  2099. TRI = SOLAD(IB)*FTID(IB) + SOLAI(IB)*FTII(IB)
  2100. ! solar radiation absorbed by ground surface
  2101. ABS = TRD*(1.-ALBGRD(IB)) + TRI*(1.-ALBGRI(IB))
  2102. SAG = SAG + ABS
  2103. FSA = FSA + ABS
  2104. END DO
  2105. ! partition visible canopy absorption to sunlit and shaded fractions
  2106. ! to get average absorbed par for sunlit and shaded leaves
  2107. LAIFRA = ELAI / MAX(VAI,MPE)
  2108. IF (FSUN .GT. 0.) THEN
  2109. PARSUN = (CAD(1)+FSUN*CAI(1)) * LAIFRA / MAX(LAISUN,MPE)
  2110. PARSHA = (FSHA*CAI(1))*LAIFRA / MAX(LAISHA,MPE)
  2111. ELSE
  2112. PARSUN = 0.
  2113. PARSHA = (CAD(1)+CAI(1))*LAIFRA /MAX(LAISHA,MPE)
  2114. ENDIF
  2115. ! reflected solar radiation
  2116. RVIS = ALBD(1)*SOLAD(1) + ALBI(1)*SOLAI(1)
  2117. RNIR = ALBD(2)*SOLAD(2) + ALBI(2)*SOLAI(2)
  2118. FSR = RVIS + RNIR
  2119. ! reflected solar radiation of veg. and ground (combined ground)
  2120. FSRV = FREVD(1)*SOLAD(1)+FREVI(1)*SOLAI(1)+FREVD(2)*SOLAD(2)+FREVI(2)*SOLAI(2)
  2121. FSRG = FREGD(1)*SOLAD(1)+FREGI(1)*SOLAI(1)+FREGD(2)*SOLAD(2)+FREGI(2)*SOLAI(2)
  2122. END SUBROUTINE SURRAD
  2123. ! ==================================================================================================
  2124. ! --------------------------------------------------------------------------------------------------
  2125. SUBROUTINE SNOW_AGE (DT,TG,SNEQVO,SNEQV,FAGE)
  2126. ! --------------------------------------------------------------------------------------------------
  2127. IMPLICIT NONE
  2128. ! ------------------------ code history ------------------------------------------------------------
  2129. ! from BATS
  2130. ! ------------------------ input/output variables --------------------------------------------------
  2131. !input
  2132. REAL, INTENT(IN) :: DT !main time step (s)
  2133. REAL, INTENT(IN) :: TG !ground temperature (k)
  2134. REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm)
  2135. REAL, INTENT(IN) :: SNEQV !snow water per unit ground area (mm)
  2136. !output
  2137. REAL, INTENT(OUT) :: FAGE !snow age
  2138. !local
  2139. REAL :: TAUSS !non-dimensional snow age
  2140. REAL :: TAGE !total aging effects
  2141. REAL :: AGE1 !effects of grain growth due to vapor diffusion
  2142. REAL :: AGE2 !effects of grain growth at freezing of melt water
  2143. REAL :: AGE3 !effects of soot
  2144. REAL :: DELA !temporary variable
  2145. REAL :: SGE !temporary variable
  2146. REAL :: DELS !temporary variable
  2147. REAL :: DELA0 !temporary variable
  2148. REAL :: ARG !temporary variable
  2149. ! See Yang et al. (1997) J.of Climate for detail.
  2150. !---------------------------------------------------------------------------------------------------
  2151. IF(SNEQV.LE.0.0) THEN
  2152. TAUSS = 0.
  2153. ELSE IF (SNEQV.GT.800.) THEN
  2154. TAUSS = 0.
  2155. ELSE
  2156. TAUSS = 0.
  2157. DELA0 = 1.E-6*DT
  2158. ARG = 5.E3*(1./TFRZ-1./TG)
  2159. AGE1 = EXP(ARG)
  2160. AGE2 = EXP(AMIN1(0.,10.*ARG))
  2161. AGE3 = 0.3
  2162. TAGE = AGE1+AGE2+AGE3
  2163. DELA = DELA0*TAGE
  2164. DELS = AMAX1(0.0,SNEQV-SNEQVO) / SWEMX
  2165. SGE = (TAUSS+DELA)*(1.0-DELS)
  2166. TAUSS = AMAX1(0.,SGE)
  2167. ENDIF
  2168. FAGE= TAUSS/(TAUSS+1.)
  2169. END SUBROUTINE SNOW_AGE
  2170. ! ==================================================================================================
  2171. ! --------------------------------------------------------------------------------------------------
  2172. SUBROUTINE SNOWALB_BATS (NBAND,FSNO,COSZ,FAGE,ALBSND,ALBSNI)
  2173. ! --------------------------------------------------------------------------------------------------
  2174. IMPLICIT NONE
  2175. ! --------------------------------------------------------------------------------------------------
  2176. ! input
  2177. INTEGER,INTENT(IN) :: NBAND !number of waveband classes
  2178. REAL,INTENT(IN) :: COSZ !cosine solar zenith angle
  2179. REAL,INTENT(IN) :: FSNO !snow cover fraction (-)
  2180. REAL,INTENT(IN) :: FAGE !snow age correction
  2181. ! output
  2182. REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSND !snow albedo for direct(1=vis, 2=nir)
  2183. REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSNI !snow albedo for diffuse
  2184. ! ---------------------------------------------------------------------------------------------
  2185. ! ------------------------ local variables ----------------------------------------------------
  2186. INTEGER :: IB !waveband class
  2187. REAL :: FZEN !zenith angle correction
  2188. REAL :: CF1 !temperary variable
  2189. REAL :: SL2 !2.*SL
  2190. REAL :: SL1 !1/SL
  2191. REAL :: SL !adjustable parameter
  2192. REAL, PARAMETER :: C1 = 0.2 !default in BATS
  2193. REAL, PARAMETER :: C2 = 0.5 !default in BATS
  2194. ! REAL, PARAMETER :: C1 = 0.2 * 2. ! double the default to match Sleepers River's
  2195. ! REAL, PARAMETER :: C2 = 0.5 * 2. ! snow surface albedo (double aging effects)
  2196. ! ---------------------------------------------------------------------------------------------
  2197. ! zero albedos for all points
  2198. ALBSND(1: NBAND) = 0.
  2199. ALBSNI(1: NBAND) = 0.
  2200. ! when cosz > 0
  2201. SL=2.0
  2202. SL1=1./SL
  2203. SL2=2.*SL
  2204. CF1=((1.+SL1)/(1.+SL2*COSZ)-SL1)
  2205. FZEN=AMAX1(CF1,0.)
  2206. ALBSNI(1)=0.95*(1.-C1*FAGE)
  2207. ALBSNI(2)=0.65*(1.-C2*FAGE)
  2208. ALBSND(1)=ALBSNI(1)+0.4*FZEN*(1.-ALBSNI(1)) ! vis direct
  2209. ALBSND(2)=ALBSNI(2)+0.4*FZEN*(1.-ALBSNI(2)) ! nir direct
  2210. END SUBROUTINE SNOWALB_BATS
  2211. ! ==================================================================================================
  2212. ! --------------------------------------------------------------------------------------------------
  2213. SUBROUTINE SNOWALB_CLASS (NBAND,QSNOW,DT,ALB,ALBOLD,ALBSND,ALBSNI,ILOC,JLOC)
  2214. ! --------------------------------------------------------------------------------------------------
  2215. IMPLICIT NONE
  2216. ! --------------------------------------------------------------------------------------------------
  2217. ! input
  2218. INTEGER,INTENT(IN) :: ILOC !grid index
  2219. INTEGER,INTENT(IN) :: JLOC !grid index
  2220. INTEGER,INTENT(IN) :: NBAND !number of waveband classes
  2221. REAL,INTENT(IN) :: QSNOW !snowfall (mm/s)
  2222. REAL,INTENT(IN) :: DT !time step (sec)
  2223. REAL,INTENT(IN) :: ALBOLD !snow albedo at last time step
  2224. ! in & out
  2225. REAL, INTENT(INOUT) :: ALB !
  2226. ! output
  2227. REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSND !snow albedo for direct(1=vis, 2=nir)
  2228. REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSNI !snow albedo for diffuse
  2229. ! ---------------------------------------------------------------------------------------------
  2230. ! ------------------------ local variables ----------------------------------------------------
  2231. INTEGER :: IB !waveband class
  2232. ! ---------------------------------------------------------------------------------------------
  2233. ! zero albedos for all points
  2234. ALBSND(1: NBAND) = 0.
  2235. ALBSNI(1: NBAND) = 0.
  2236. ! when cosz > 0
  2237. ALB = 0.55 + (ALBOLD-0.55) * EXP(-0.01*DT/3600.)
  2238. ! 1 mm fresh snow(SWE) -- 10mm snow depth, assumed the fresh snow density 100kg/m3
  2239. ! here assume 1cm snow depth will fully cover the old snow
  2240. IF (QSNOW > 0.) then
  2241. ALB = ALB + MIN(QSNOW*DT,SWEMX) * (0.84-ALB)/(SWEMX)
  2242. ENDIF
  2243. ALBSNI(1)= ALB ! vis diffuse
  2244. ALBSNI(2)= ALB ! nir diffuse
  2245. ALBSND(1)= ALB ! vis direct
  2246. ALBSND(2)= ALB ! nir direct
  2247. END SUBROUTINE SNOWALB_CLASS
  2248. ! ==================================================================================================
  2249. ! --------------------------------------------------------------------------------------------------
  2250. SUBROUTINE GROUNDALB (NSOIL ,NBAND ,ICE ,IST ,ISC , & !in
  2251. FSNO ,SMC ,ALBSND ,ALBSNI ,COSZ , & !in
  2252. TG ,ILOC ,JLOC , & !in
  2253. ALBGRD ,ALBGRI ) !out
  2254. ! --------------------------------------------------------------------------------------------------
  2255. USE NOAHMP_RAD_PARAMETERS
  2256. ! --------------------------------------------------------------------------------------------------
  2257. IMPLICIT NONE
  2258. ! --------------------------------------------------------------------------------------------------
  2259. !input
  2260. INTEGER, INTENT(IN) :: ILOC !grid index
  2261. INTEGER, INTENT(IN) :: JLOC !grid index
  2262. INTEGER, INTENT(IN) :: NSOIL !number of soil layers
  2263. INTEGER, INTENT(IN) :: NBAND !number of solar radiation waveband classes
  2264. INTEGER, INTENT(IN) :: ICE !value of ist for land ice
  2265. INTEGER, INTENT(IN) :: IST !surface type
  2266. INTEGER, INTENT(IN) :: ISC !soil color class (1-lighest; 8-darkest)
  2267. REAL, INTENT(IN) :: FSNO !fraction of surface covered with snow (-)
  2268. REAL, INTENT(IN) :: TG !ground temperature (k)
  2269. REAL, INTENT(IN) :: COSZ !cosine solar zenith angle (0-1)
  2270. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !volumetric soil water content (m3/m3)
  2271. REAL, DIMENSION(1: 2), INTENT(IN) :: ALBSND !direct beam snow albedo (vis, nir)
  2272. REAL, DIMENSION(1: 2), INTENT(IN) :: ALBSNI !diffuse snow albedo (vis, nir)
  2273. !output
  2274. REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRD !ground albedo (direct beam: vis, nir)
  2275. REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRI !ground albedo (diffuse: vis, nir)
  2276. !local
  2277. INTEGER :: IB !waveband number (1=vis, 2=nir)
  2278. REAL :: INC !soil water correction factor for soil albedo
  2279. REAL :: ALBSOD !soil albedo (direct)
  2280. REAL :: ALBSOI !soil albedo (diffuse)
  2281. ! --------------------------------------------------------------------------------------------------
  2282. DO IB = 1, NBAND
  2283. INC = MAX(0.11-0.40*SMC(1), 0.)
  2284. IF (IST .EQ. 1) THEN !soil
  2285. ALBSOD = MIN(ALBSAT(ISC,IB)+INC,ALBDRY(ISC,IB))
  2286. ALBSOI = ALBSOD
  2287. ELSE IF (TG .GT. TFRZ) THEN !unfrozen lake, wetland
  2288. ALBSOD = 0.06/(MAX(0.01,COSZ)**1.7 + 0.15)
  2289. ALBSOI = 0.06
  2290. ELSE !frozen lake, wetland
  2291. ALBSOD = ALBLAK(IB)
  2292. ALBSOI = ALBSOD
  2293. END IF
  2294. ! increase desert and semi-desert albedos
  2295. IF (IST .EQ. 1 .AND. ISC .EQ. 9) THEN
  2296. ALBSOD = ALBSOD + 0.10
  2297. ALBSOI = ALBSOI + 0.10
  2298. end if
  2299. ALBGRD(IB) = ALBSOD*(1.-FSNO) + ALBSND(IB)*FSNO
  2300. ALBGRI(IB) = ALBSOI*(1.-FSNO) + ALBSNI(IB)*FSNO
  2301. END DO
  2302. END SUBROUTINE GROUNDALB
  2303. ! ==================================================================================================
  2304. ! --------------------------------------------------------------------------------------------------
  2305. SUBROUTINE TWOSTREAM (IB ,IC ,VEGTYP ,COSZ ,VAI , & !in
  2306. FWET ,T ,ALBGRD ,ALBGRI ,RHO , & !in
  2307. TAU ,FVEG ,IST ,ILOC ,JLOC , & !in
  2308. FAB ,FRE ,FTD ,FTI ,GDIR , & !) !out
  2309. FREV ,FREG ,BGAP ,WGAP ,GAP)
  2310. ! --------------------------------------------------------------------------------------------------
  2311. ! use two-stream approximation of Dickinson (1983) Adv Geophysics
  2312. ! 25:305-353 and Sellers (1985) Int J Remote Sensing 6:1335-1372
  2313. ! to calculate fluxes absorbed by vegetation, reflected by vegetation,
  2314. ! and transmitted through vegetation for unit incoming direct or diffuse
  2315. ! flux given an underlying surface with known albedo.
  2316. ! --------------------------------------------------------------------------------------------------
  2317. USE NOAHMP_VEG_PARAMETERS
  2318. USE NOAHMP_RAD_PARAMETERS
  2319. ! --------------------------------------------------------------------------------------------------
  2320. IMPLICIT NONE
  2321. ! --------------------------------------------------------------------------------------------------
  2322. ! input
  2323. INTEGER, INTENT(IN) :: ILOC !grid index
  2324. INTEGER, INTENT(IN) :: JLOC !grid index
  2325. INTEGER, INTENT(IN) :: IST !surface type
  2326. INTEGER, INTENT(IN) :: IB !waveband number
  2327. INTEGER, INTENT(IN) :: IC !0=unit incoming direct; 1=unit incoming diffuse
  2328. INTEGER, INTENT(IN) :: VEGTYP !vegetation type
  2329. REAL, INTENT(IN) :: COSZ !cosine of direct zenith angle (0-1)
  2330. REAL, INTENT(IN) :: VAI !one-sided leaf+stem area index (m2/m2)
  2331. REAL, INTENT(IN) :: FWET !fraction of lai, sai that is wetted (-)
  2332. REAL, INTENT(IN) :: T !surface temperature (k)
  2333. REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRD !direct albedo of underlying surface (-)
  2334. REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRI !diffuse albedo of underlying surface (-)
  2335. REAL, DIMENSION(1:2), INTENT(IN) :: RHO !leaf+stem reflectance
  2336. REAL, DIMENSION(1:2), INTENT(IN) :: TAU !leaf+stem transmittance
  2337. REAL, INTENT(IN) :: FVEG !green vegetation fraction [0.0-1.0]
  2338. ! output
  2339. REAL, DIMENSION(1:2), INTENT(OUT) :: FAB !flux abs by veg layer (per unit incoming flux)
  2340. REAL, DIMENSION(1:2), INTENT(OUT) :: FRE !flux refl above veg layer (per unit incoming flux)
  2341. REAL, DIMENSION(1:2), INTENT(OUT) :: FTD !down dir flux below veg layer (per unit in flux)
  2342. REAL, DIMENSION(1:2), INTENT(OUT) :: FTI !down dif flux below veg layer (per unit in flux)
  2343. REAL, INTENT(OUT) :: GDIR !projected leaf+stem area in solar direction
  2344. REAL, DIMENSION(1:2), INTENT(OUT) :: FREV !flux reflected by veg layer (per unit incoming flux)
  2345. REAL, DIMENSION(1:2), INTENT(OUT) :: FREG !flux reflected by ground (per unit incoming flux)
  2346. ! local
  2347. REAL :: OMEGA !fraction of intercepted radiation that is scattered
  2348. REAL :: OMEGAL !omega for leaves
  2349. REAL :: BETAI !upscatter parameter for diffuse radiation
  2350. REAL :: BETAIL !betai for leaves
  2351. REAL :: BETAD !upscatter parameter for direct beam radiation
  2352. REAL :: BETADL !betad for leaves
  2353. REAL :: EXT !optical depth of direct beam per unit leaf area
  2354. REAL :: AVMU !average diffuse optical depth
  2355. REAL :: COSZI !0.001 <= cosz <= 1.000
  2356. REAL :: ASU !single scattering albedo
  2357. REAL :: CHIL ! -0.4 <= xl <= 0.6
  2358. REAL :: TMP0,TMP1,TMP2,TMP3,TMP4,TMP5,TMP6,TMP7,TMP8,TMP9
  2359. REAL :: P1,P2,P3,P4,S1,S2,U1,U2,U3
  2360. REAL :: B,C,D,D1,D2,F,H,H1,H2,H3,H4,H5,H6,H7,H8,H9,H10
  2361. REAL :: PHI1,PHI2,SIGMA
  2362. REAL :: FTDS,FTIS,FRES
  2363. !jref:start
  2364. REAL :: FREVEG,FREBAR,FTDVEG,FTIVEG,FTDBAR,FTIBAR
  2365. REAL :: THETAZ
  2366. !jref:end
  2367. ! variables for the modified two-stream scheme
  2368. ! Niu and Yang (2004), JGR
  2369. REAL, PARAMETER :: PAI = 3.14159265
  2370. REAL :: HD !crown depth (m)
  2371. REAL :: BB !vertical crown radius (m)
  2372. REAL :: THETAP !angle conversion from SZA
  2373. REAL :: FA !foliage volume density (m-1)
  2374. REAL :: NEWVAI !effective LSAI (-)
  2375. REAL,INTENT(INOUT) :: BGAP !between canopy gap fraction for beam (-)
  2376. REAL,INTENT(INOUT) :: WGAP !within canopy gap fraction for beam (-)
  2377. REAL :: KOPEN !gap fraction for diffue light (-)
  2378. REAL, INTENT(OUT) :: GAP !total gap fraction for beam ( <=1-shafac )
  2379. ! -----------------------------------------------------------------
  2380. ! compute within and between gaps
  2381. if(VAI == 0.0) THEN
  2382. GAP = 1.0
  2383. KOPEN = 1.0
  2384. ELSE
  2385. IF(OPT_RAD == 1) THEN
  2386. HD = HVT(VEGTYP) - HVB(VEGTYP)
  2387. BB = 0.5 * HD
  2388. THETAP = ATAN(BB/RC(VEGTYP) * TAN(ACOS(MAX(0.01,COSZ))) )
  2389. BGAP = EXP(-DEN(VEGTYP) * PAI * RC(VEGTYP)**2/COS(THETAP) )
  2390. FA = VAI/(1.33 * PAI * RC(VEGTYP)**3.0 *(BB/RC(VEGTYP))*DEN(VEGTYP))
  2391. NEWVAI = HD*FA
  2392. WGAP = (1.0-BGAP) * EXP(-0.5*NEWVAI/COSZ)
  2393. !jref - BGAP scaled to be less or equal to (1.-FVEG)
  2394. BGAP = (1.0-FVEG)*BGAP
  2395. WGAP = FVEG*WGAP
  2396. GAP = MIN(1.0-FVEG, BGAP+WGAP)
  2397. KOPEN = 0.05
  2398. END IF
  2399. IF(OPT_RAD == 2) THEN
  2400. GAP = 0.0
  2401. KOPEN = 0.0
  2402. END IF
  2403. IF(OPT_RAD == 3) THEN
  2404. GAP = 1.0-FVEG
  2405. KOPEN = 0.0
  2406. END IF
  2407. end if
  2408. ! calculate two-stream parameters OMEGA, BETAD, BETAI, AVMU, GDIR, EXT.
  2409. ! OMEGA, BETAD, BETAI are adjusted for snow. values for OMEGA*BETAD
  2410. ! and OMEGA*BETAI are calculated and then divided by the new OMEGA
  2411. ! because the product OMEGA*BETAI, OMEGA*BETAD is used in solution.
  2412. ! also, the transmittances and reflectances (TAU, RHO) are linear
  2413. ! weights of leaf and stem values.
  2414. COSZI = MAX(0.001, COSZ)
  2415. CHIL = MIN( MAX(XL(VEGTYP), -0.4), 0.6)
  2416. IF (ABS(CHIL) .LE. 0.01) CHIL = 0.01
  2417. PHI1 = 0.5 - 0.633*CHIL - 0.330*CHIL*CHIL
  2418. PHI2 = 0.877 * (1.-2.*PHI1)
  2419. GDIR = PHI1 + PHI2*COSZI
  2420. EXT = GDIR/COSZI
  2421. AVMU = ( 1. - PHI1/PHI2 * LOG((PHI1+PHI2)/PHI1) ) / PHI2
  2422. OMEGAL = RHO(IB) + TAU(IB)
  2423. TMP0 = GDIR + PHI2*COSZI
  2424. TMP1 = PHI1*COSZI
  2425. ASU = 0.5*OMEGAL*GDIR/TMP0 * ( 1.-TMP1/TMP0*LOG((TMP1+TMP0)/TMP1) )
  2426. BETADL = (1.+AVMU*EXT)/(OMEGAL*AVMU*EXT)*ASU
  2427. BETAIL = 0.5 * ( RHO(IB)+TAU(IB) + (RHO(IB)-TAU(IB)) &
  2428. * ((1.+CHIL)/2.)**2 ) / OMEGAL
  2429. ! adjust omega, betad, and betai for intercepted snow
  2430. IF (T .GT. TFRZ) THEN !no snow
  2431. TMP0 = OMEGAL
  2432. TMP1 = BETADL
  2433. TMP2 = BETAIL
  2434. ELSE
  2435. TMP0 = (1.-FWET)*OMEGAL + FWET*OMEGAS(IB)
  2436. TMP1 = ( (1.-FWET)*OMEGAL*BETADL + FWET*OMEGAS(IB)*BETADS ) / TMP0
  2437. TMP2 = ( (1.-FWET)*OMEGAL*BETAIL + FWET*OMEGAS(IB)*BETAIS ) / TMP0
  2438. END IF
  2439. OMEGA = TMP0
  2440. BETAD = TMP1
  2441. BETAI = TMP2
  2442. ! absorbed, reflected, transmitted fluxes per unit incoming radiation
  2443. B = 1. - OMEGA + OMEGA*BETAI
  2444. C = OMEGA*BETAI
  2445. TMP0 = AVMU*EXT
  2446. D = TMP0 * OMEGA*BETAD
  2447. F = TMP0 * OMEGA*(1.-BETAD)
  2448. TMP1 = B*B - C*C
  2449. H = SQRT(TMP1) / AVMU
  2450. SIGMA = TMP0*TMP0 - TMP1
  2451. if(SIGMA == 0.) SIGMA = 1.e-6
  2452. P1 = B + AVMU*H
  2453. P2 = B - AVMU*H
  2454. P3 = B + TMP0
  2455. P4 = B - TMP0
  2456. S1 = EXP(-H*VAI)
  2457. S2 = EXP(-EXT*VAI)
  2458. IF (IC .EQ. 0) THEN
  2459. U1 = B - C/ALBGRD(IB)
  2460. U2 = B - C*ALBGRD(IB)
  2461. U3 = F + C*ALBGRD(IB)
  2462. ELSE
  2463. U1 = B - C/ALBGRI(IB)
  2464. U2 = B - C*ALBGRI(IB)
  2465. U3 = F + C*ALBGRI(IB)
  2466. END IF
  2467. TMP2 = U1 - AVMU*H
  2468. TMP3 = U1 + AVMU*H
  2469. D1 = P1*TMP2/S1 - P2*TMP3*S1
  2470. TMP4 = U2 + AVMU*H
  2471. TMP5 = U2 - AVMU*H
  2472. D2 = TMP4/S1 - TMP5*S1
  2473. H1 = -D*P4 - C*F
  2474. TMP6 = D - H1*P3/SIGMA
  2475. TMP7 = ( D - C - H1/SIGMA*(U1+TMP0) ) * S2
  2476. H2 = ( TMP6*TMP2/S1 - P2*TMP7 ) / D1
  2477. H3 = - ( TMP6*TMP3*S1 - P1*TMP7 ) / D1
  2478. H4 = -F*P3 - C*D
  2479. TMP8 = H4/SIGMA
  2480. TMP9 = ( U3 - TMP8*(U2-TMP0) ) * S2
  2481. H5 = - ( TMP8*TMP4/S1 + TMP9 ) / D2
  2482. H6 = ( TMP8*TMP5*S1 + TMP9 ) / D2
  2483. H7 = (C*TMP2) / (D1*S1)
  2484. H8 = (-C*TMP3*S1) / D1
  2485. H9 = TMP4 / (D2*S1)
  2486. H10 = (-TMP5*S1) / D2
  2487. ! downward direct and diffuse fluxes below vegetation
  2488. ! Niu and Yang (2004), JGR.
  2489. IF (IC .EQ. 0) THEN
  2490. FTDS = S2 *(1.0-GAP) + GAP
  2491. FTIS = (H4*S2/SIGMA + H5*S1 + H6/S1)*(1.0-GAP)
  2492. ELSE
  2493. FTDS = 0.
  2494. FTIS = (H9*S1 + H10/S1)*(1.0-KOPEN) + KOPEN
  2495. END IF
  2496. FTD(IB) = FTDS
  2497. FTI(IB) = FTIS
  2498. ! flux reflected by the surface (veg. and ground)
  2499. IF (IC .EQ. 0) THEN
  2500. FRES = (H1/SIGMA + H2 + H3)*(1.0-GAP ) + ALBGRD(IB)*GAP
  2501. !jref - separate veg. and ground reflection
  2502. FREVEG = (H1/SIGMA + H2 + H3)*(1.0-GAP )
  2503. FREBAR = ALBGRD(IB)*GAP
  2504. ELSE
  2505. FRES = (H7 + H8) *(1.0-KOPEN) + ALBGRI(IB)*KOPEN
  2506. !jref - separate veg. and ground reflection
  2507. FREVEG = (H7 + H8) *(1.0-KOPEN)+ALBGRI(IB)*KOPEN
  2508. FREBAR = 0
  2509. END IF
  2510. FRE(IB) = FRES
  2511. FREV(IB) = FREVEG
  2512. FREG(IB) = FREBAR
  2513. ! flux absorbed by vegetation
  2514. FAB(IB) = 1. - FRE(IB) - (1.-ALBGRD(IB))*FTD(IB) &
  2515. - (1.-ALBGRI(IB))*FTI(IB)
  2516. END SUBROUTINE TWOSTREAM
  2517. ! ==================================================================================================
  2518. SUBROUTINE VEGE_FLUX(NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & !in
  2519. DT ,SAV ,SAG ,LWDN ,UR , & !in
  2520. UU ,VV ,SFCTMP ,THAIR ,QAIR , & !in
  2521. EAIR ,RHOAIR ,SNOWH ,VAI ,GAMMA , & !in
  2522. FWET ,LAISUN ,LAISHA ,CWP ,DZSNSO , & !in
  2523. HTOP ,ZLVL ,ZPD ,Z0M ,FVEG , & !in
  2524. Z0MG ,EMV ,EMG ,CANLIQ , & !in
  2525. CANICE ,STC ,DF ,RSSUN ,RSSHA , & !in
  2526. RSURF ,LATHEA ,PARSUN ,PARSHA ,IGS , & !in
  2527. FOLN ,CO2AIR ,O2AIR ,BTRAN ,SFCPRS , & !in
  2528. RHSUR ,ILOC ,JLOC ,Q2 , & !in
  2529. EAH ,TAH ,TV ,TG ,CM , & !inout
  2530. CH ,DX ,DZ8W , & !
  2531. TAUXV ,TAUYV ,IRG ,IRC ,SHG , & !out
  2532. SHC ,EVG ,EVC ,TR ,GH , & !out
  2533. T2MV ,PSNSUN ,PSNSHA , & !out
  2534. QC ,PBLH ,QSFC ,PSFC ,ISURBAN , & !in
  2535. IZ0TLND ,Q2V ,CAH2) !inout
  2536. ! --------------------------------------------------------------------------------------------------
  2537. ! use newton-raphson iteration to solve for vegetation (tv) and
  2538. ! ground (tg) temperatures that balance the surface energy budgets
  2539. ! vegetated:
  2540. ! -SAV + IRC[TV] + SHC[TV] + EVC[TV] + TR[TV] = 0
  2541. ! -SAG + IRG[TG] + SHG[TG] + EVG[TG] + GH[TG] = 0
  2542. ! --------------------------------------------------------------------------------------------------
  2543. USE NOAHMP_VEG_PARAMETERS
  2544. USE MODULE_MODEL_CONSTANTS
  2545. ! --------------------------------------------------------------------------------------------------
  2546. IMPLICIT NONE
  2547. ! --------------------------------------------------------------------------------------------------
  2548. ! input
  2549. INTEGER, INTENT(IN) :: ILOC !grid index
  2550. INTEGER, INTENT(IN) :: JLOC !grid index
  2551. LOGICAL, INTENT(IN) :: VEG !true if vegetated surface
  2552. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  2553. INTEGER, INTENT(IN) :: NSOIL !number of soil layers
  2554. INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers
  2555. INTEGER, INTENT(IN) :: VEGTYP !vegetation physiology type
  2556. REAL, INTENT(IN) :: FVEG !greeness vegetation fraction (-)
  2557. REAL, INTENT(IN) :: SAV !solar rad absorbed by veg (w/m2)
  2558. REAL, INTENT(IN) :: SAG !solar rad absorbed by ground (w/m2)
  2559. REAL, INTENT(IN) :: LWDN !atmospheric longwave radiation (w/m2)
  2560. REAL, INTENT(IN) :: UR !wind speed at height zlvl (m/s)
  2561. REAL, INTENT(IN) :: UU !wind speed in eastward dir (m/s)
  2562. REAL, INTENT(IN) :: VV !wind speed in northward dir (m/s)
  2563. REAL, INTENT(IN) :: SFCTMP !air temperature at reference height (k)
  2564. REAL, INTENT(IN) :: THAIR !potential temp at reference height (k)
  2565. REAL, INTENT(IN) :: EAIR !vapor pressure air at zlvl (pa)
  2566. REAL, INTENT(IN) :: QAIR !specific humidity at zlvl (kg/kg)
  2567. REAL, INTENT(IN) :: RHOAIR !density air (kg/m**3)
  2568. REAL, INTENT(IN) :: DT !time step (s)
  2569. REAL, INTENT(IN) :: SNOWH !actual snow depth [m]
  2570. REAL, INTENT(IN) :: FWET !wetted fraction of canopy
  2571. REAL, INTENT(IN) :: HTOP !top of canopy layer (m)
  2572. REAL, INTENT(IN) :: CWP !canopy wind parameter
  2573. REAL, INTENT(IN) :: VAI !total leaf area index + stem area index
  2574. REAL, INTENT(IN) :: LAISUN !sunlit leaf area index, one-sided (m2/m2)
  2575. REAL, INTENT(IN) :: LAISHA !shaded leaf area index, one-sided (m2/m2)
  2576. REAL, INTENT(IN) :: ZLVL !reference height (m)
  2577. REAL, INTENT(IN) :: ZPD !zero plane displacement (m)
  2578. REAL, INTENT(IN) :: Z0M !roughness length, momentum (m)
  2579. REAL, INTENT(IN) :: Z0MG !roughness length, momentum, ground (m)
  2580. REAL, INTENT(IN) :: EMV !vegetation emissivity
  2581. REAL, INTENT(IN) :: EMG !ground emissivity
  2582. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !soil/snow temperature (k)
  2583. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity of snow/soil (w/m/k)
  2584. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thinkness of snow/soil layers (m)
  2585. REAL, INTENT(IN) :: CANLIQ !intercepted liquid water (mm)
  2586. REAL, INTENT(IN) :: CANICE !intercepted ice mass (mm)
  2587. REAL, INTENT(IN) :: RSURF !ground surface resistance (s/m)
  2588. REAL, INTENT(IN) :: GAMMA !psychrometric constant (pa/K)
  2589. REAL, INTENT(IN) :: LATHEA !latent heat of vaporization/subli (j/kg)
  2590. REAL, INTENT(IN) :: PARSUN !par absorbed per unit sunlit lai (w/m2)
  2591. REAL, INTENT(IN) :: PARSHA !par absorbed per unit shaded lai (w/m2)
  2592. REAL, INTENT(IN) :: FOLN !foliage nitrogen (%)
  2593. REAL, INTENT(IN) :: CO2AIR !atmospheric co2 concentration (pa)
  2594. REAL, INTENT(IN) :: O2AIR !atmospheric o2 concentration (pa)
  2595. REAL, INTENT(IN) :: IGS !growing season index (0=off, 1=on)
  2596. REAL, INTENT(IN) :: SFCPRS !pressure (pa)
  2597. REAL, INTENT(IN) :: BTRAN !soil water transpiration factor (0 to 1)
  2598. REAL, INTENT(IN) :: RHSUR !raltive humidity in surface soil/snow air space (-)
  2599. INTEGER , INTENT(IN) :: ISURBAN
  2600. INTEGER , INTENT(IN) :: IZ0TLND
  2601. REAL , INTENT(IN) :: QC !cloud water mixing ratio
  2602. REAL , INTENT(IN) :: PBLH !planetary boundary layer height
  2603. REAL , INTENT(IN) :: PSFC !pressure at lowest model layer
  2604. REAL , INTENT(IN) :: DX !grid spacing
  2605. REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg)
  2606. REAL , INTENT(IN) :: DZ8W !thickness of lowest layer
  2607. REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer
  2608. ! input/output
  2609. REAL, INTENT(INOUT) :: EAH !canopy air vapor pressure (pa)
  2610. REAL, INTENT(INOUT) :: TAH !canopy air temperature (k)
  2611. REAL, INTENT(INOUT) :: TV !vegetation temperature (k)
  2612. REAL, INTENT(INOUT) :: TG !ground temperature (k)
  2613. REAL, INTENT(INOUT) :: CM !momentum drag coefficient
  2614. REAL, INTENT(INOUT) :: CH !sensible heat exchange coefficient
  2615. ! output
  2616. ! -FSA + FIRA + FSH + (FCEV + FCTR + FGEV) + FCST + SSOIL = 0
  2617. REAL, INTENT(OUT) :: TAUXV !wind stress: e-w (n/m2)
  2618. REAL, INTENT(OUT) :: TAUYV !wind stress: n-s (n/m2)
  2619. REAL, INTENT(OUT) :: IRC !net longwave radiation (w/m2) [+= to atm]
  2620. REAL, INTENT(OUT) :: SHC !sensible heat flux (w/m2) [+= to atm]
  2621. REAL, INTENT(OUT) :: EVC !evaporation heat flux (w/m2) [+= to atm]
  2622. REAL, INTENT(OUT) :: IRG !net longwave radiation (w/m2) [+= to atm]
  2623. REAL, INTENT(OUT) :: SHG !sensible heat flux (w/m2) [+= to atm]
  2624. REAL, INTENT(OUT) :: EVG !evaporation heat flux (w/m2) [+= to atm]
  2625. REAL, INTENT(OUT) :: TR !transpiration heat flux (w/m2)[+= to atm]
  2626. REAL, INTENT(OUT) :: GH !ground heat (w/m2) [+ = to soil]
  2627. REAL, INTENT(OUT) :: T2MV !2 m height air temperature (k)
  2628. REAL, INTENT(OUT) :: PSNSUN !sunlit leaf photosynthesis (umolco2/m2/s)
  2629. REAL, INTENT(OUT) :: PSNSHA !shaded leaf photosynthesis (umolco2/m2/s)
  2630. REAL, INTENT(OUT) :: Q2V
  2631. REAL :: CAH !sensible heat conductance, canopy air to ZLVL air (m/s)
  2632. REAL :: U10V !10 m wind speed in eastward dir (m/s)
  2633. REAL :: V10V !10 m wind speed in eastward dir (m/s)
  2634. REAL :: WSPD
  2635. ! ------------------------ local variables ----------------------------------------------------
  2636. REAL :: CW !water vapor exchange coefficient
  2637. REAL :: FV !friction velocity (m/s)
  2638. REAL :: WSTAR !friction velocity n vertical direction (m/s) (only for SFCDIF2)
  2639. REAL :: Z0H !roughness length, sensible heat (m)
  2640. REAL :: Z0HG !roughness length, sensible heat (m)
  2641. REAL :: RB !bulk leaf boundary layer resistance (s/m)
  2642. REAL :: RAMC !aerodynamic resistance for momentum (s/m)
  2643. REAL :: RAHC !aerodynamic resistance for sensible heat (s/m)
  2644. REAL :: RAWC !aerodynamic resistance for water vapor (s/m)
  2645. REAL :: RAMG !aerodynamic resistance for momentum (s/m)
  2646. REAL :: RAHG !aerodynamic resistance for sensible heat (s/m)
  2647. REAL :: RAWG !aerodynamic resistance for water vapor (s/m)
  2648. REAL, INTENT(OUT) :: RSSUN !sunlit leaf stomatal resistance (s/m)
  2649. REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m)
  2650. REAL :: MOL !Monin-Obukhov length (m)
  2651. REAL :: DTV !change in tv, last iteration (k)
  2652. REAL :: DTG !change in tg, last iteration (k)
  2653. REAL :: AIR,CIR !coefficients for ir as function of ts**4
  2654. REAL :: CSH !coefficients for sh as function of ts
  2655. REAL :: CEV !coefficients for ev as function of esat[ts]
  2656. REAL :: CGH !coefficients for st as function of ts
  2657. REAL :: ATR,CTR !coefficients for tr as function of esat[ts]
  2658. REAL :: ATA,BTA !coefficients for tah as function of ts
  2659. REAL :: AEA,BEA !coefficients for eah as function of esat[ts]
  2660. REAL :: ESTV !saturation vapor pressure at tv (pa)
  2661. REAL :: ESTG !saturation vapor pressure at tg (pa)
  2662. REAL :: DESTV !d(es)/dt at ts (pa/k)
  2663. REAL :: DESTG !d(es)/dt at tg (pa/k)
  2664. REAL :: ESATW !es for water
  2665. REAL :: ESATI !es for ice
  2666. REAL :: DSATW !d(es)/dt at tg (pa/k) for water
  2667. REAL :: DSATI !d(es)/dt at tg (pa/k) for ice
  2668. REAL :: FM !momentum stability correction, weighted by prior iters
  2669. REAL :: FH !sen heat stability correction, weighted by prior iters
  2670. REAL :: FHG !sen heat stability correction, ground
  2671. REAL :: HCAN !canopy height (m) [note: hcan >= z0mg]
  2672. REAL :: A !temporary calculation
  2673. REAL :: B !temporary calculation
  2674. REAL :: CVH !sensible heat conductance, leaf surface to canopy air (m/s)
  2675. REAL :: CAW !latent heat conductance, canopy air ZLVL air (m/s)
  2676. REAL :: CTW !transpiration conductance, leaf to canopy air (m/s)
  2677. REAL :: CEW !evaporation conductance, leaf to canopy air (m/s)
  2678. REAL :: CGW !latent heat conductance, ground to canopy air (m/s)
  2679. REAL :: COND !sum of conductances (s/m)
  2680. REAL :: UC !wind speed at top of canopy (m/s)
  2681. REAL :: KH !turbulent transfer coefficient, sensible heat, (m2/s)
  2682. REAL :: H !temporary sensible heat flux (w/m2)
  2683. REAL :: HG !temporary sensible heat flux (w/m2)
  2684. REAL :: MOZ !Monin-Obukhov stability parameter
  2685. REAL :: MOZG !Monin-Obukhov stability parameter
  2686. REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration
  2687. REAL :: THVAIR
  2688. REAL :: THAH
  2689. REAL :: RAHC2 !aerodynamic resistance for sensible heat (s/m)
  2690. REAL :: RAWC2 !aerodynamic resistance for water vapor (s/m)
  2691. REAL, INTENT(OUT):: CAH2 !sensible heat conductance for diagnostics
  2692. REAL :: CH2V !exchange coefficient for 2m over vegetation.
  2693. REAL :: CQ2V !exchange coefficient for 2m over vegetation.
  2694. REAL :: EAH2 !2m vapor pressure over canopy
  2695. REAL :: QFX !moisture flux
  2696. REAL :: E1
  2697. REAL :: VAIE !total leaf area index + stem area index,effective
  2698. REAL :: LAISUNE !sunlit leaf area index, one-sided (m2/m2),effective
  2699. REAL :: LAISHAE !shaded leaf area index, one-sided (m2/m2),effective
  2700. INTEGER :: K !index
  2701. INTEGER :: ITER !iteration index
  2702. !jref - NITERC test from 5 to 20
  2703. INTEGER, PARAMETER :: NITERC = 20 !number of iterations for surface temperature
  2704. !jref - NITERG test from 3-5
  2705. INTEGER, PARAMETER :: NITERG = 5 !number of iterations for ground temperature
  2706. INTEGER :: MOZSGN !number of times MOZ changes sign
  2707. REAL :: MPE !prevents overflow error if division by zero
  2708. INTEGER :: LITER !Last iteration
  2709. REAL :: T, TDC !Kelvin to degree Celsius with limit -50 to +50
  2710. character(len=80) :: message
  2711. TDC(T) = MIN( 50., MAX(-50.,(T-TFRZ)) )
  2712. ! ---------------------------------------------------------------------------------------------
  2713. MPE = 1E-6
  2714. LITER = 0
  2715. FV = 0.1
  2716. ! ---------------------------------------------------------------------------------------------
  2717. ! initialization variables that do not depend on stability iteration
  2718. ! ---------------------------------------------------------------------------------------------
  2719. DTV = 0.
  2720. DTG = 0.
  2721. MOZSGN = 0
  2722. MOZOLD = 0.
  2723. HG = 0.
  2724. H = 0.
  2725. QFX = 0.
  2726. ! convert grid-cell LAI to the fractional vegetated area (FVEG)
  2727. VAIE = MIN(6.,VAI / FVEG)
  2728. LAISUNE = MIN(6.,LAISUN / FVEG)
  2729. LAISHAE = MIN(6.,LAISHA / FVEG)
  2730. ! saturation vapor pressure at ground temperature
  2731. T = TDC(TG)
  2732. CALL ESAT(T, ESATW, ESATI, DSATW, DSATI)
  2733. IF (T .GT. 0.) THEN
  2734. ESTG = ESATW
  2735. ELSE
  2736. ESTG = ESATI
  2737. END IF
  2738. !jref - consistent surface specific humidity for sfcdif3 and sfcdif4
  2739. QSFC = 0.622*EAIR/(PSFC-0.378*EAIR)
  2740. ! canopy height
  2741. HCAN = HTOP
  2742. UC = UR*LOG(HCAN/Z0M)/LOG(ZLVL/Z0M)
  2743. IF((HCAN-ZPD) <= 0.) THEN
  2744. WRITE(message,*) "CRITICAL PROBLEM: HCAN <= ZPD"
  2745. call wrf_message ( message )
  2746. WRITE(message,*) 'i,j point=',ILOC, JLOC
  2747. call wrf_message ( message )
  2748. WRITE(message,*) 'HCAN =',HCAN
  2749. call wrf_message ( message )
  2750. WRITE(message,*) 'ZPD =',ZPD
  2751. call wrf_message ( message )
  2752. write (message, *) 'SNOWH =',SNOWH
  2753. call wrf_message ( message )
  2754. call wrf_error_fatal ( "CRITICAL PROBLEM IN MODULE_SF_NOAHMPLSM:VEGEFLUX" )
  2755. END IF
  2756. ! prepare for longwave rad.
  2757. AIR = -EMV*(1.+(1.-EMV)*(1.-EMG))*LWDN - EMV*EMG*SB*TG**4
  2758. CIR = (2.-EMV*(1.-EMG))*EMV*SB
  2759. ! ---------------------------------------------------------------------------------------------
  2760. loop1: DO ITER = 1, NITERC ! begin stability iteration
  2761. IF(ITER == 1) THEN
  2762. Z0H = Z0M
  2763. Z0HG = Z0MG
  2764. ELSE
  2765. Z0H = Z0M !* EXP(-CZIL*0.4*258.2*SQRT(FV*Z0M))
  2766. Z0HG = Z0MG !* EXP(-CZIL*0.4*258.2*SQRT(FV*Z0MG))
  2767. END IF
  2768. ! aerodyn resistances between heights zlvl and d+z0v
  2769. IF(OPT_SFC == 1) THEN
  2770. CALL SFCDIF1(ITER ,SFCTMP ,RHOAIR ,H ,QAIR , & !in
  2771. ZLVL ,ZPD ,Z0M ,Z0H ,UR , & !in
  2772. MPE ,ILOC ,JLOC , & !in
  2773. MOZ ,MOZSGN ,FM ,FH , & !inout
  2774. CM ,CH ,FV ) !out
  2775. ENDIF
  2776. IF(OPT_SFC == 2) THEN
  2777. CALL SFCDIF2(ITER ,Z0M ,TAH ,THAIR ,UR , & !in
  2778. CZIL ,ZLVL ,ILOC ,JLOC , & !in
  2779. CM ,CH ,MOZ ,WSTAR , & !in
  2780. FV ) !out
  2781. ! Undo the multiplication by windspeed that SFCDIF2
  2782. ! applies to exchange coefficients CH and CM:
  2783. CH = CH / UR
  2784. CM = CM / UR
  2785. ENDIF
  2786. IF(OPT_SFC == 3) THEN
  2787. CALL SFCDIF3(ILOC ,JLOC ,TAH ,QSFC ,PSFC ,& !in
  2788. PBLH ,Z0M ,Z0MG ,VEGTYP ,ISURBAN,& !in
  2789. IZ0TLND,UC ,ITER ,NITERC ,SFCTMP ,& !in
  2790. THAIR ,QAIR ,QC ,ZLVL , & !in
  2791. SFCPRS ,FV ,CM ,CH ,CH2V ,& !inout
  2792. CQ2V ,MOZ) !out
  2793. ! Undo the multiplication by windspeed that SFCDIF3
  2794. ! applies to exchange coefficients CH and CM:
  2795. CH = CH / UR
  2796. CM = CM / UR
  2797. CH2V = CH2V / UR
  2798. ENDIF
  2799. IF(OPT_SFC == 4) THEN
  2800. CALL SFCDIF4(ILOC ,JLOC ,UU ,VV ,SFCTMP ,& !in
  2801. SFCPRS ,PSFC ,PBLH ,DX ,Z0M ,&
  2802. TAH ,QAIR ,ZLVL ,IZ0TLND,QSFC ,&
  2803. H ,QFX ,CM ,CH ,CH2V ,&
  2804. CQ2V ,MOZ ,FV ,U10V ,V10V)
  2805. ! Undo the multiplication by windspeed that SFCDIF4
  2806. ! applies to exchange coefficients CH and CM:
  2807. CH = CH / UR
  2808. CM = CM / UR
  2809. CH2V = CH2V / UR
  2810. ENDIF
  2811. RAMC = MAX(1.,1./(CM*UR))
  2812. RAHC = MAX(1.,1./(CH*UR))
  2813. RAWC = RAHC
  2814. IF (OPT_SFC == 3 .OR. OPT_SFC == 4 ) THEN
  2815. RAHC2 = MAX(1.,1./(CH2V*UR))
  2816. RAWC2 = RAHC2
  2817. CAH2 = 1./RAHC2
  2818. CQ2V = CAH2
  2819. ENDIF
  2820. ! aerodyn resistance between heights z0g and d+z0v, RAG, and leaf
  2821. ! boundary layer resistance, RB
  2822. CALL RAGRB(ITER ,VAIE ,RHOAIR ,HG ,TAH , & !in
  2823. ZPD ,Z0MG ,Z0HG ,HCAN ,UC , & !in
  2824. Z0H ,FV ,CWP ,VEGTYP ,MPE , & !in
  2825. TV ,MOZG ,FHG ,ILOC ,JLOC , & !inout
  2826. RAMG ,RAHG ,RAWG ,RB ) !out
  2827. ! es and d(es)/dt evaluated at tv
  2828. T = TDC(TV)
  2829. CALL ESAT(T, ESATW, ESATI, DSATW, DSATI)
  2830. IF (T .GT. 0.) THEN
  2831. ESTV = ESATW
  2832. DESTV = DSATW
  2833. ELSE
  2834. ESTV = ESATI
  2835. DESTV = DSATI
  2836. END IF
  2837. ! stomatal resistance
  2838. IF(ITER == 1) THEN
  2839. IF (OPT_CRS == 1) then ! Ball-Berry
  2840. CALL STOMATA (VEGTYP,MPE ,PARSUN ,FOLN ,ILOC , JLOC , & !in
  2841. TV ,ESTV ,EAH ,SFCTMP,SFCPRS, & !in
  2842. O2AIR ,CO2AIR,IGS ,BTRAN ,RB , & !in
  2843. RSSUN ,PSNSUN) !out
  2844. CALL STOMATA (VEGTYP,MPE ,PARSHA ,FOLN ,ILOC , JLOC , & !in
  2845. TV ,ESTV ,EAH ,SFCTMP,SFCPRS, & !in
  2846. O2AIR ,CO2AIR,IGS ,BTRAN ,RB , & !in
  2847. RSSHA ,PSNSHA) !out
  2848. END IF
  2849. IF (OPT_CRS == 2) then ! Jarvis
  2850. CALL CANRES (PARSUN,TV ,BTRAN ,EAH ,SFCPRS, & !in
  2851. RSSUN ,PSNSUN,ILOC ,JLOC ) !out
  2852. CALL CANRES (PARSHA,TV ,BTRAN ,EAH ,SFCPRS, & !in
  2853. RSSHA ,PSNSHA,ILOC ,JLOC ) !out
  2854. END IF
  2855. END IF
  2856. ! prepare for sensible heat flux above veg.
  2857. CAH = 1./RAHC
  2858. CVH = 2.*VAIE/RB
  2859. CGH = 1./RAHG
  2860. COND = CAH + CVH + CGH
  2861. ATA = (SFCTMP*CAH + TG*CGH) / COND
  2862. BTA = CVH/COND
  2863. CSH = (1.-BTA)*RHOAIR*CPAIR*CVH
  2864. ! prepare for latent heat flux above veg.
  2865. CAW = 1./RAWC
  2866. CEW = FWET*VAIE/RB
  2867. CTW = (1.-FWET)*(LAISUNE/(RB+RSSUN) + LAISHAE/(RB+RSSHA))
  2868. CGW = 1./(RAWG+RSURF)
  2869. COND = CAW + CEW + CTW + CGW
  2870. AEA = (EAIR*CAW + ESTG*CGW) / COND
  2871. BEA = (CEW+CTW)/COND
  2872. CEV = (1.-BEA)*CEW*RHOAIR*CPAIR/GAMMA
  2873. CTR = (1.-BEA)*CTW*RHOAIR*CPAIR/GAMMA
  2874. ! evaluate surface fluxes with current temperature and solve for dts
  2875. TAH = ATA + BTA*TV ! canopy air T.
  2876. EAH = AEA + BEA*ESTV ! canopy air e
  2877. IRC = AIR + CIR*TV**4
  2878. SHC = RHOAIR*CPAIR*CVH * ( TV-TAH)
  2879. EVC = RHOAIR*CPAIR*CEW * (ESTV-EAH) / GAMMA
  2880. TR = RHOAIR*CPAIR*CTW * (ESTV-EAH) / GAMMA
  2881. EVC = MIN(CANLIQ*LATHEA/DT,EVC)
  2882. B = SAV-IRC-SHC-EVC-TR !additional w/m2
  2883. A = 4.*CIR*TV**3 + CSH + (CEV+CTR)*DESTV !volumetric heat capacity
  2884. DTV = B/A
  2885. IRC = IRC + 4.*CIR*TV**3*DTV
  2886. SHC = SHC + CSH*DTV
  2887. EVC = EVC + CEV*DESTV*DTV
  2888. TR = TR + CTR*DESTV*DTV
  2889. ! update vegetation surface temperature
  2890. TV = TV + DTV
  2891. ! for computing M-O length in the next iteration
  2892. H = RHOAIR*CPAIR*(TAH - SFCTMP) /RAHC
  2893. HG = RHOAIR*CPAIR*(TG - TAH) /RAHG
  2894. ! consistent specific humidity from canopy air vapor pressure
  2895. QSFC = (0.622*EAH)/(SFCPRS-0.378*EAH)
  2896. ! added moisture flux for sfcdif4
  2897. IF ( OPT_SFC == 4 ) THEN
  2898. QFX = (QSFC-QAIR)*RHOAIR*CAW !*CPAIR/GAMMA
  2899. ENDIF
  2900. IF (LITER == 1) THEN
  2901. exit loop1
  2902. ENDIF
  2903. IF (ITER >= 5 .AND. ABS(DTV) <= 0.01 .AND. LITER == 0) THEN
  2904. LITER = 1
  2905. ENDIF
  2906. END DO loop1 ! end stability iteration
  2907. ! under-canopy fluxes and tg
  2908. AIR = - EMG*(1.-EMV)*LWDN - EMG*EMV*SB*TV**4
  2909. CIR = EMG*SB
  2910. CSH = RHOAIR*CPAIR/RAHG
  2911. CEV = RHOAIR*CPAIR / (GAMMA*(RAWG+RSURF))
  2912. CGH = 2.*DF(ISNOW+1)/DZSNSO(ISNOW+1)
  2913. loop2: DO ITER = 1, NITERG
  2914. T = TDC(TG)
  2915. CALL ESAT(T, ESATW, ESATI, DSATW, DSATI)
  2916. IF (T .GT. 0.) THEN
  2917. ESTG = ESATW
  2918. DESTG = DSATW
  2919. ELSE
  2920. ESTG = ESATI
  2921. DESTG = DSATI
  2922. END IF
  2923. IRG = CIR*TG**4 + AIR
  2924. SHG = CSH * (TG - TAH )
  2925. EVG = CEV * (ESTG*RHSUR - EAH )
  2926. GH = CGH * (TG - STC(ISNOW+1))
  2927. B = SAG-IRG-SHG-EVG-GH
  2928. A = 4.*CIR*TG**3+CSH+CEV*DESTG+CGH
  2929. DTG = B/A
  2930. IRG = IRG + 4.*CIR*TG**3*DTG
  2931. SHG = SHG + CSH*DTG
  2932. EVG = EVG + CEV*DESTG*DTG
  2933. GH = GH + CGH*DTG
  2934. TG = TG + DTG
  2935. END DO loop2
  2936. ! if snow on ground and TG > TFRZ: reset TG = TFRZ. reevaluate ground fluxes.
  2937. IF(OPT_STC == 1) THEN
  2938. IF (SNOWH > 0.05 .AND. TG > TFRZ) THEN
  2939. TG = TFRZ
  2940. IRG = CIR*TG**4 - EMG*(1.-EMV)*LWDN - EMG*EMV*SB*TV**4
  2941. SHG = CSH * (TG - TAH)
  2942. EVG = CEV * (ESTG*RHSUR - EAH)
  2943. GH = SAG - (IRG+SHG+EVG)
  2944. END IF
  2945. END IF
  2946. ! wind stresses
  2947. TAUXV = -RHOAIR*CM*UR*UU
  2948. TAUYV = -RHOAIR*CM*UR*VV
  2949. ! consistent vegetation air temperature and vapor pressure since TG is not consistent with the TAH/EAH
  2950. ! calculation.
  2951. TAH = SFCTMP + (SHG+SHC)/(RHOAIR*CPAIR*CAH)
  2952. EAH = EAIR + (EVC+TR+EVG)/(RHOAIR*CAW*CPAIR/GAMMA )
  2953. QFX = (QSFC-QAIR)*RHOAIR*CAW !*CPAIR/GAMMA
  2954. ! 2m temperature over vegetation ( corrected for low CQ2V values )
  2955. IF (OPT_SFC == 1 .OR. OPT_SFC == 2) THEN
  2956. CAH2 = FV*1./VKC*LOG((2.+Z0H)/Z0H)
  2957. CQ2V = CAH2
  2958. IF (CAH2 .LT. 1.E-5 ) THEN
  2959. T2MV = TAH
  2960. Q2V = (EAH*0.622/(SFCPRS - 0.378*EAH))
  2961. ELSE
  2962. T2MV = TAH - (SHG+SHC)/(RHOAIR*CPAIR*FV) * 1./VKC * LOG((2.+Z0H)/Z0H)
  2963. Q2V = (EAH*0.622/(SFCPRS - 0.378*EAH))- QFX/(RHOAIR*FV)* 1./VKC * LOG((2.+Z0H)/Z0H)
  2964. ENDIF
  2965. ENDIF
  2966. ! myj/ysu consistent 2m temperature over vegetation (if CQ2V .lt. 1e-5? )
  2967. IF (OPT_SFC == 3 .OR. OPT_SFC == 4 ) THEN
  2968. IF (CAH2 .LT. 1.E-5 ) THEN
  2969. T2MV = TAH
  2970. Q2V = (EAH*0.622/(SFCPRS - 0.378*EAH))
  2971. ELSE
  2972. T2MV = TAH - (SHG+SHC)/(RHOAIR*CPAIR*CAH2)
  2973. Q2V = (EAH*0.622/(SFCPRS - 0.378*EAH)) - QFX/(RHOAIR*CQ2V)
  2974. ENDIF
  2975. ENDIF
  2976. ! update CH for output
  2977. CH = CAH
  2978. END SUBROUTINE VEGE_FLUX
  2979. ! ==================================================================================================
  2980. SUBROUTINE BARE_FLUX (NSNOW ,NSOIL ,ISNOW ,DT ,SAG , & !in
  2981. LWDN ,UR ,UU ,VV ,SFCTMP , & !in
  2982. THAIR ,QAIR ,EAIR ,RHOAIR ,SNOWH , & !in
  2983. DZSNSO ,ZLVL ,ZPD ,Z0M , & !in
  2984. EMG ,STC ,DF ,RSURF ,LATHEA , & !in
  2985. GAMMA ,RHSUR ,ILOC ,JLOC ,Q2 , & !in
  2986. TGB ,CM ,CH , & !inout
  2987. TAUXB ,TAUYB ,IRB ,SHB ,EVB , & !out
  2988. GHB ,T2MB ,DX ,DZ8W ,IVGTYP , & !out
  2989. QC ,PBLH ,QSFC ,PSFC ,ISURBAN , & !in
  2990. IZ0TLND ,SFCPRS ,Q2B ,EHB2) !in
  2991. ! --------------------------------------------------------------------------------------------------
  2992. ! use newton-raphson iteration to solve ground (tg) temperature
  2993. ! that balances the surface energy budgets for bare soil fraction.
  2994. ! bare soil:
  2995. ! -SAB + IRB[TG] + SHB[TG] + EVB[TG] + GHB[TG] = 0
  2996. ! ----------------------------------------------------------------------
  2997. USE NOAHMP_VEG_PARAMETERS
  2998. USE MODULE_MODEL_CONSTANTS
  2999. ! ----------------------------------------------------------------------
  3000. IMPLICIT NONE
  3001. ! ----------------------------------------------------------------------
  3002. ! input
  3003. integer , INTENT(IN) :: ILOC !grid index
  3004. integer , INTENT(IN) :: JLOC !grid index
  3005. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  3006. INTEGER, INTENT(IN) :: NSOIL !number of soil layers
  3007. INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers
  3008. REAL, INTENT(IN) :: DT !time step (s)
  3009. REAL, INTENT(IN) :: SAG !solar radiation absorbed by ground (w/m2)
  3010. REAL, INTENT(IN) :: LWDN !atmospheric longwave radiation (w/m2)
  3011. REAL, INTENT(IN) :: UR !wind speed at height zlvl (m/s)
  3012. REAL, INTENT(IN) :: UU !wind speed in eastward dir (m/s)
  3013. REAL, INTENT(IN) :: VV !wind speed in northward dir (m/s)
  3014. REAL, INTENT(IN) :: SFCTMP !air temperature at reference height (k)
  3015. REAL, INTENT(IN) :: THAIR !potential temperature at height zlvl (k)
  3016. REAL, INTENT(IN) :: QAIR !specific humidity at height zlvl (kg/kg)
  3017. REAL, INTENT(IN) :: EAIR !vapor pressure air at height (pa)
  3018. REAL, INTENT(IN) :: RHOAIR !density air (kg/m3)
  3019. REAL, INTENT(IN) :: SNOWH !actual snow depth [m]
  3020. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thickness of snow/soil layers (m)
  3021. REAL, INTENT(IN) :: ZLVL !reference height (m)
  3022. REAL, INTENT(IN) :: ZPD !zero plane displacement (m)
  3023. REAL, INTENT(IN) :: Z0M !roughness length, momentum, ground (m)
  3024. REAL, INTENT(IN) :: EMG !ground emissivity
  3025. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !soil/snow temperature (k)
  3026. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity of snow/soil (w/m/k)
  3027. REAL, INTENT(IN) :: RSURF !ground surface resistance (s/m)
  3028. REAL, INTENT(IN) :: LATHEA !latent heat of vaporization/subli (j/kg)
  3029. REAL, INTENT(IN) :: GAMMA !psychrometric constant (pa/k)
  3030. REAL, INTENT(IN) :: RHSUR !raltive humidity in surface soil/snow air space (-)
  3031. !jref:start; in
  3032. INTEGER , INTENT(IN) :: ISURBAN
  3033. INTEGER , INTENT(IN) :: IVGTYP
  3034. INTEGER , INTENT(IN) :: IZ0TLND
  3035. REAL , INTENT(IN) :: QC !cloud water mixing ratio
  3036. REAL , INTENT(IN) :: PBLH !planetary boundary layer height
  3037. REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer
  3038. REAL , INTENT(IN) :: PSFC !pressure at lowest model layer
  3039. REAL , INTENT(IN) :: SFCPRS !pressure at lowest model layer
  3040. REAL , INTENT(IN) :: DX !horisontal grid spacing
  3041. REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg)
  3042. REAL , INTENT(IN) :: DZ8W !thickness of lowest layer
  3043. !jref:end
  3044. ! input/output
  3045. REAL, INTENT(INOUT) :: TGB !ground temperature (k)
  3046. REAL, INTENT(INOUT) :: CM !momentum drag coefficient
  3047. REAL, INTENT(INOUT) :: CH !sensible heat exchange coefficient
  3048. ! output
  3049. ! -SAB + IRB[TG] + SHB[TG] + EVB[TG] + GHB[TG] = 0
  3050. REAL, INTENT(OUT) :: TAUXB !wind stress: e-w (n/m2)
  3051. REAL, INTENT(OUT) :: TAUYB !wind stress: n-s (n/m2)
  3052. REAL, INTENT(OUT) :: IRB !net longwave rad (w/m2) [+ to atm]
  3053. REAL, INTENT(OUT) :: SHB !sensible heat flux (w/m2) [+ to atm]
  3054. REAL, INTENT(OUT) :: EVB !latent heat flux (w/m2) [+ to atm]
  3055. REAL, INTENT(OUT) :: GHB !ground heat flux (w/m2) [+ to soil]
  3056. REAL, INTENT(OUT) :: T2MB !2 m height air temperature (k)
  3057. !jref:start
  3058. REAL, INTENT(OUT) :: Q2B !bare ground heat conductance
  3059. REAL :: EHB !bare ground heat conductance
  3060. REAL :: U10B !10 m wind speed in eastward dir (m/s)
  3061. REAL :: V10B !10 m wind speed in eastward dir (m/s)
  3062. REAL :: WSPD
  3063. !jref:end
  3064. ! local variables
  3065. REAL :: TAUX !wind stress: e-w (n/m2)
  3066. REAL :: TAUY !wind stress: n-s (n/m2)
  3067. REAL :: FIRA !total net longwave rad (w/m2) [+ to atm]
  3068. REAL :: FSH !total sensible heat flux (w/m2) [+ to atm]
  3069. REAL :: FGEV !ground evaporation heat flux (w/m2)[+ to atm]
  3070. REAL :: SSOIL !soil heat flux (w/m2) [+ to soil]
  3071. REAL :: FIRE !emitted ir (w/m2)
  3072. REAL :: TRAD !radiative temperature (k)
  3073. REAL :: TAH !"surface" temperature at height z0h+zpd (k)
  3074. REAL :: CW !water vapor exchange coefficient
  3075. REAL :: FV !friction velocity (m/s)
  3076. REAL :: WSTAR !friction velocity n vertical direction (m/s) (only for SFCDIF2)
  3077. REAL :: Z0H !roughness length, sensible heat, ground (m)
  3078. REAL :: RB !bulk leaf boundary layer resistance (s/m)
  3079. REAL :: RAMB !aerodynamic resistance for momentum (s/m)
  3080. REAL :: RAHB !aerodynamic resistance for sensible heat (s/m)
  3081. REAL :: RAWB !aerodynamic resistance for water vapor (s/m)
  3082. REAL :: MOL !Monin-Obukhov length (m)
  3083. REAL :: DTG !change in tg, last iteration (k)
  3084. REAL :: CIR !coefficients for ir as function of ts**4
  3085. REAL :: CSH !coefficients for sh as function of ts
  3086. REAL :: CEV !coefficients for ev as function of esat[ts]
  3087. REAL :: CGH !coefficients for st as function of ts
  3088. !jref:start
  3089. REAL :: RAHB2 !aerodynamic resistance for sensible heat 2m (s/m)
  3090. REAL :: RAWB2 !aerodynamic resistance for water vapor 2m (s/m)
  3091. REAL,INTENT(OUT) :: EHB2 !sensible heat conductance for diagnostics
  3092. REAL :: CH2B !exchange coefficient for 2m temp.
  3093. REAL :: CQ2B !exchange coefficient for 2m temp.
  3094. REAL :: THVAIR !virtual potential air temp
  3095. REAL :: THGH !potential ground temp
  3096. REAL :: EMB !momentum conductance
  3097. REAL :: QFX !moisture flux
  3098. REAL :: ESTG2 !saturation vapor pressure at 2m (pa)
  3099. INTEGER :: VEGTYP !vegetation type set to isbarren
  3100. REAL :: E1
  3101. !jref:end
  3102. REAL :: ESTG !saturation vapor pressure at tg (pa)
  3103. REAL :: DESTG !d(es)/dt at tg (pa/K)
  3104. REAL :: ESATW !es for water
  3105. REAL :: ESATI !es for ice
  3106. REAL :: DSATW !d(es)/dt at tg (pa/K) for water
  3107. REAL :: DSATI !d(es)/dt at tg (pa/K) for ice
  3108. REAL :: A !temporary calculation
  3109. REAL :: B !temporary calculation
  3110. REAL :: H !temporary sensible heat flux (w/m2)
  3111. REAL :: MOZ !Monin-Obukhov stability parameter
  3112. REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration
  3113. REAL :: FM !momentum stability correction, weighted by prior iters
  3114. REAL :: FH !sen heat stability correction, weighted by prior iters
  3115. INTEGER :: MOZSGN !number of times MOZ changes sign
  3116. INTEGER :: ITER !iteration index
  3117. INTEGER :: NITERB !number of iterations for surface temperature
  3118. REAL :: MPE !prevents overflow error if division by zero
  3119. !jref:start
  3120. ! DATA NITERB /3/
  3121. DATA NITERB /5/
  3122. SAVE NITERB
  3123. REAL :: T, TDC !Kelvin to degree Celsius with limit -50 to +50
  3124. TDC(T) = MIN( 50., MAX(-50.,(T-TFRZ)) )
  3125. ! -----------------------------------------------------------------
  3126. ! initialization variables that do not depend on stability iteration
  3127. ! -----------------------------------------------------------------
  3128. MPE = 1E-6
  3129. DTG = 0.
  3130. MOZSGN = 0
  3131. MOZOLD = 0.
  3132. H = 0.
  3133. QFX = 0.
  3134. FV = 0.1
  3135. CIR = EMG*SB
  3136. CGH = 2.*DF(ISNOW+1)/DZSNSO(ISNOW+1)
  3137. ! -----------------------------------------------------------------
  3138. loop3: DO ITER = 1, NITERB ! begin stability iteration
  3139. IF(ITER == 1) THEN
  3140. Z0H = Z0M
  3141. ELSE
  3142. Z0H = Z0M !* EXP(-CZIL*0.4*258.2*SQRT(FV*Z0M))
  3143. END IF
  3144. IF(OPT_SFC == 1) THEN
  3145. CALL SFCDIF1(ITER ,SFCTMP ,RHOAIR ,H ,QAIR , & !in
  3146. ZLVL ,ZPD ,Z0M ,Z0H ,UR , & !in
  3147. MPE ,ILOC ,JLOC , & !in
  3148. MOZ ,MOZSGN ,FM ,FH , & !inout
  3149. CM ,CH ,FV ) !out
  3150. ENDIF
  3151. IF(OPT_SFC == 2) THEN
  3152. CALL SFCDIF2(ITER ,Z0M ,TGB ,THAIR ,UR , & !in
  3153. CZIL ,ZLVL ,ILOC ,JLOC , & !in
  3154. CM ,CH ,MOZ ,WSTAR , & !in
  3155. FV ) !out
  3156. ! Undo the multiplication by windspeed that SFCDIF2
  3157. ! applies to exchange coefficients CH and CM:
  3158. CH = CH / UR
  3159. CM = CM / UR
  3160. IF(SNOWH > 0.) THEN
  3161. CM = MIN(0.01,CM) ! CM & CH are too large, causing
  3162. CH = MIN(0.01,CH) ! computational instability
  3163. END IF
  3164. ENDIF
  3165. IF(OPT_SFC == 3) THEN
  3166. VEGTYP = ISBARREN
  3167. CALL SFCDIF3(ILOC ,JLOC ,TGB ,QSFC ,PSFC ,& !in
  3168. PBLH ,Z0M ,Z0M ,VEGTYP ,ISURBAN,& !in
  3169. IZ0TLND,UR ,ITER ,NITERB ,SFCTMP ,& !in
  3170. THAIR ,QAIR ,QC ,ZLVL , & !in
  3171. SFCPRS ,FV ,CM ,CH ,CH2B ,& !inout
  3172. CQ2B ,MOZ) !out
  3173. ! Undo the multiplication by windspeed that SFCDIF3
  3174. ! applies to exchange coefficients CH and CM:
  3175. CH = CH / UR
  3176. CM = CM / UR
  3177. CH2B = CH2B / UR
  3178. IF(SNOWH > 0.) THEN ! jref: does this still count??
  3179. CM = MIN(0.01,CM) ! CM & CH are too large, causing
  3180. CH = MIN(0.01,CH) ! computational instability
  3181. CH2B = MIN(0.01,CH2B)
  3182. CQ2B = MIN(0.01,CQ2B)
  3183. END IF
  3184. ENDIF
  3185. IF(OPT_SFC == 4) THEN
  3186. CALL SFCDIF4(ILOC ,JLOC ,UU ,VV ,SFCTMP ,& !in
  3187. SFCPRS ,PSFC ,PBLH ,DX ,Z0M ,&
  3188. TGB ,QAIR ,ZLVL ,IZ0TLND,QSFC ,&
  3189. H ,QFX ,CM ,CH ,CH2B ,&
  3190. CQ2B ,MOZ ,FV ,U10B ,V10B)
  3191. ! Undo the multiplication by windspeed that SFCDIF4
  3192. ! applies to exchange coefficients CH and CM:
  3193. CH = CH / UR
  3194. CM = CM / UR
  3195. CH2B = CH2B / UR
  3196. IF(SNOWH > 0.) THEN ! jref: does this still count??
  3197. CM = MIN(0.01,CM) ! CM & CH are too large, causing
  3198. CH = MIN(0.01,CH) ! computational instability
  3199. CH2B = MIN(0.01,CH2B)
  3200. CQ2B = MIN(0.01,CQ2B)
  3201. END IF
  3202. ENDIF
  3203. RAMB = MAX(1.,1./(CM*UR))
  3204. RAHB = MAX(1.,1./(CH*UR))
  3205. RAWB = RAHB
  3206. !jref - variables for diagnostics
  3207. EMB = 1./RAMB
  3208. EHB = 1./RAHB
  3209. IF (OPT_SFC == 3 .OR. OPT_SFC == 4) THEN
  3210. RAHB2 = MAX(1.,1./(CH2B*UR))
  3211. EHB2 = 1./RAHB2
  3212. CQ2B = EHB2
  3213. END IF
  3214. ! es and d(es)/dt evaluated at tg
  3215. T = TDC(TGB)
  3216. CALL ESAT(T, ESATW, ESATI, DSATW, DSATI)
  3217. IF (T .GT. 0.) THEN
  3218. ESTG = ESATW
  3219. DESTG = DSATW
  3220. ELSE
  3221. ESTG = ESATI
  3222. DESTG = DSATI
  3223. END IF
  3224. CSH = RHOAIR*CPAIR/RAHB
  3225. CEV = RHOAIR*CPAIR/GAMMA/(RSURF+RAWB)
  3226. ! surface fluxes and dtg
  3227. IRB = CIR * TGB**4 - EMG*LWDN
  3228. SHB = CSH * (TGB - SFCTMP )
  3229. EVB = CEV * (ESTG*RHSUR - EAIR )
  3230. GHB = CGH * (TGB - STC(ISNOW+1))
  3231. B = SAG-IRB-SHB-EVB-GHB
  3232. A = 4.*CIR*TGB**3 + CSH + CEV*DESTG + CGH
  3233. DTG = B/A
  3234. IRB = IRB + 4.*CIR*TGB**3*DTG
  3235. SHB = SHB + CSH*DTG
  3236. EVB = EVB + CEV*DESTG*DTG
  3237. GHB = GHB + CGH*DTG
  3238. ! update ground surface temperature
  3239. TGB = TGB + DTG
  3240. ! for M-O length
  3241. H = CSH * (TGB - SFCTMP)
  3242. T = TDC(TGB)
  3243. CALL ESAT(T, ESATW, ESATI, DSATW, DSATI)
  3244. IF (T .GT. 0.) THEN
  3245. ESTG = ESATW
  3246. ELSE
  3247. ESTG = ESATI
  3248. END IF
  3249. QSFC = 0.622*(ESTG*RHSUR)/(PSFC-0.378*(ESTG*RHSUR))
  3250. QFX = (QSFC-QAIR)*CEV*GAMMA/CPAIR
  3251. END DO loop3 ! end stability iteration
  3252. ! -----------------------------------------------------------------
  3253. ! if snow on ground and TG > TFRZ: reset TG = TFRZ. reevaluate ground fluxes.
  3254. IF(OPT_STC == 1) THEN
  3255. IF (SNOWH > 0.05 .AND. TGB > TFRZ) THEN
  3256. TGB = TFRZ
  3257. IRB = CIR * TGB**4 - EMG*LWDN
  3258. SHB = CSH * (TGB - SFCTMP)
  3259. EVB = CEV * (ESTG*RHSUR - EAIR ) !ESTG reevaluate ?
  3260. GHB = SAG - (IRB+SHB+EVB)
  3261. END IF
  3262. END IF
  3263. ! wind stresses
  3264. TAUXB = -RHOAIR*CM*UR*UU
  3265. TAUYB = -RHOAIR*CM*UR*VV
  3266. !jref:start; errors in original equation corrected.
  3267. ! 2m air temperature
  3268. IF(OPT_SFC == 1 .OR. OPT_SFC ==2) THEN
  3269. EHB2 = FV*VKC/LOG((2.+Z0H)/Z0H)
  3270. CQ2B = EHB2
  3271. IF (EHB2.lt.1.E-5 ) THEN
  3272. T2MB = TGB
  3273. Q2B = QSFC
  3274. ELSE
  3275. T2MB = TGB - SHB/(RHOAIR*CPAIR*FV) * 1./VKC * LOG((2.+Z0H)/Z0H)
  3276. Q2B = QSFC - EVB/(LATHEA*RHOAIR)*(1./CQ2B + RSURF)
  3277. ENDIF
  3278. IF (IVGTYP == ISURBAN) Q2B = QSFC
  3279. END IF
  3280. ! myj consistent 2m temperature over bare soil
  3281. IF(OPT_SFC ==3 .OR. OPT_SFC == 4) THEN
  3282. IF (EHB2.lt.1.E-5 ) THEN
  3283. T2MB = TGB
  3284. Q2B = QSFC
  3285. ELSE
  3286. T2MB = TGB - SHB/(RHOAIR*CPAIR*EHB2)
  3287. Q2B = QSFC - QFX/(RHOAIR*CQ2B)
  3288. END IF
  3289. ! IF (IVGTYP == ISURBAN) THEN
  3290. ! Q2B = QSFC
  3291. ! END IF
  3292. END IF
  3293. ! update CH
  3294. CH = EHB
  3295. END SUBROUTINE BARE_FLUX
  3296. ! ==================================================================================================
  3297. SUBROUTINE RAGRB(ITER ,VAI ,RHOAIR ,HG ,TAH , & !in
  3298. ZPD ,Z0MG ,Z0HG ,HCAN ,UC , & !in
  3299. Z0H ,FV ,CWP ,VEGTYP ,MPE , & !in
  3300. TV ,MOZG ,FHG ,ILOC ,JLOC , & !inout
  3301. RAMG ,RAHG ,RAWG ,RB ) !out
  3302. ! --------------------------------------------------------------------------------------------------
  3303. ! compute under-canopy aerodynamic resistance RAG and leaf boundary layer
  3304. ! resistance RB
  3305. ! --------------------------------------------------------------------------------------------------
  3306. USE NOAHMP_VEG_PARAMETERS
  3307. ! --------------------------------------------------------------------------------------------------
  3308. IMPLICIT NONE
  3309. ! --------------------------------------------------------------------------------------------------
  3310. ! inputs
  3311. INTEGER, INTENT(IN) :: ILOC !grid index
  3312. INTEGER, INTENT(IN) :: JLOC !grid index
  3313. INTEGER, INTENT(IN) :: ITER !iteration index
  3314. INTEGER, INTENT(IN) :: VEGTYP !vegetation physiology type
  3315. REAL, INTENT(IN) :: VAI !total LAI + stem area index, one sided
  3316. REAL, INTENT(IN) :: RHOAIR !density air (kg/m3)
  3317. REAL, INTENT(IN) :: HG !ground sensible heat flux (w/m2)
  3318. REAL, INTENT(IN) :: TV !vegetation temperature (k)
  3319. REAL, INTENT(IN) :: TAH !air temperature at height z0h+zpd (k)
  3320. REAL, INTENT(IN) :: ZPD !zero plane displacement (m)
  3321. REAL, INTENT(IN) :: Z0MG !roughness length, momentum, ground (m)
  3322. REAL, INTENT(IN) :: HCAN !canopy height (m) [note: hcan >= z0mg]
  3323. REAL, INTENT(IN) :: UC !wind speed at top of canopy (m/s)
  3324. REAL, INTENT(IN) :: Z0H !roughness length, sensible heat (m)
  3325. REAL, INTENT(IN) :: Z0HG !roughness length, sensible heat, ground (m)
  3326. REAL, INTENT(IN) :: FV !friction velocity (m/s)
  3327. REAL, INTENT(IN) :: CWP !canopy wind parameter
  3328. REAL, INTENT(IN) :: MPE !prevents overflow error if division by zero
  3329. ! in & out
  3330. REAL, INTENT(INOUT) :: MOZG !Monin-Obukhov stability parameter
  3331. REAL, INTENT(INOUT) :: FHG !stability correction
  3332. ! outputs
  3333. REAL :: RAMG !aerodynamic resistance for momentum (s/m)
  3334. REAL :: RAHG !aerodynamic resistance for sensible heat (s/m)
  3335. REAL :: RAWG !aerodynamic resistance for water vapor (s/m)
  3336. REAL :: RB !bulk leaf boundary layer resistance (s/m)
  3337. REAL :: KH !turbulent transfer coefficient, sensible heat, (m2/s)
  3338. REAL :: TMP1 !temporary calculation
  3339. REAL :: TMP2 !temporary calculation
  3340. REAL :: TMPRAH2 !temporary calculation for aerodynamic resistances
  3341. REAL :: TMPRB !temporary calculation for rb
  3342. real :: MOLG,FHGNEW,CWPC
  3343. ! --------------------------------------------------------------------------------------------------
  3344. ! stability correction to below canopy resistance
  3345. MOZG = 0.
  3346. MOLG = 0.
  3347. IF(ITER > 1) THEN
  3348. TMP1 = VKC * (GRAV/TAH) * HG/(RHOAIR*CPAIR)
  3349. IF (ABS(TMP1) .LE. MPE) TMP1 = MPE
  3350. MOLG = -1. * FV**3 / TMP1
  3351. MOZG = MIN( (ZPD-Z0MG)/MOLG, 1.)
  3352. END IF
  3353. IF (MOZG < 0.) THEN
  3354. FHGNEW = (1. - 15.*MOZG)**(-0.25)
  3355. ELSE
  3356. FHGNEW = 1.+ 4.7*MOZG
  3357. ENDIF
  3358. IF (ITER == 1) THEN
  3359. FHG = FHGNEW
  3360. ELSE
  3361. FHG = 0.5 * (FHG+FHGNEW)
  3362. ENDIF
  3363. CWPC = (CWP * VAI * HCAN * FHG)**0.5
  3364. ! CWPC = (CWP*FHG)**0.5
  3365. TMP1 = EXP( -CWPC*Z0HG/HCAN )
  3366. TMP2 = EXP( -CWPC*(Z0H+ZPD)/HCAN )
  3367. TMPRAH2 = HCAN*EXP(CWPC) / CWPC * (TMP1-TMP2)
  3368. ! aerodynamic resistances raw and rah between heights zpd+z0h and z0hg.
  3369. KH = MAX ( VKC*FV*(HCAN-ZPD), MPE )
  3370. RAMG = 0.
  3371. RAHG = TMPRAH2 / KH
  3372. RAWG = RAHG
  3373. ! leaf boundary layer resistance
  3374. TMPRB = CWPC*50. / (1. - EXP(-CWPC/2.))
  3375. RB = TMPRB * SQRT(DLEAF(VEGTYP)/UC)
  3376. END SUBROUTINE RAGRB
  3377. ! ==================================================================================================
  3378. SUBROUTINE SFCDIF1(ITER ,SFCTMP ,RHOAIR ,H ,QAIR , & !in
  3379. & ZLVL ,ZPD ,Z0M ,Z0H ,UR , & !in
  3380. & MPE ,ILOC ,JLOC , & !in
  3381. & MOZ ,MOZSGN ,FM ,FH , & !inout
  3382. & CM ,CH ,FV ) !out
  3383. ! -------------------------------------------------------------------------------------------------
  3384. ! computing surface drag coefficient CM for momentum and CH for heat
  3385. ! -------------------------------------------------------------------------------------------------
  3386. IMPLICIT NONE
  3387. ! -------------------------------------------------------------------------------------------------
  3388. ! inputs
  3389. INTEGER, INTENT(IN) :: ILOC !grid index
  3390. INTEGER, INTENT(IN) :: JLOC !grid index
  3391. INTEGER, INTENT(IN) :: ITER !iteration index
  3392. REAL, INTENT(IN) :: SFCTMP !temperature at reference height (k)
  3393. REAL, INTENT(IN) :: RHOAIR !density air (kg/m**3)
  3394. REAL, INTENT(IN) :: H !sensible heat flux (w/m2) [+ to atm]
  3395. REAL, INTENT(IN) :: QAIR !specific humidity at reference height (kg/kg)
  3396. REAL, INTENT(IN) :: ZLVL !reference height (m)
  3397. REAL, INTENT(IN) :: ZPD !zero plane displacement (m)
  3398. REAL, INTENT(IN) :: Z0H !roughness length, sensible heat, ground (m)
  3399. REAL, INTENT(IN) :: Z0M !roughness length, momentum, ground (m)
  3400. REAL, INTENT(IN) :: UR !wind speed (m/s)
  3401. REAL, INTENT(IN) :: MPE !prevents overflow error if division by zero
  3402. ! in & out
  3403. INTEGER, INTENT(INOUT) :: MOZSGN !number of times moz changes sign
  3404. REAL, INTENT(INOUT) :: MOZ !Monin-Obukhov stability (z/L)
  3405. REAL, INTENT(INOUT) :: FM !momentum stability correction, weighted by prior iters
  3406. REAL, INTENT(INOUT) :: FH !sen heat stability correction, weighted by prior iters
  3407. ! outputs
  3408. REAL, INTENT(OUT) :: CM !drag coefficient for momentum
  3409. REAL, INTENT(OUT) :: CH !drag coefficient for heat
  3410. REAL, INTENT(OUT) :: FV !friction velocity (m/s)
  3411. ! locals
  3412. REAL :: MOL !Monin-Obukhov length (m)
  3413. REAL :: TMPCM !temporary calculation for CM
  3414. REAL :: TMPCH !temporary calculation for CH
  3415. REAL :: FMNEW !stability correction factor, momentum, for current moz
  3416. REAL :: FHNEW !stability correction factor, sen heat, for current moz
  3417. REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration
  3418. REAL :: TMP1,TMP2,TMP3,TMP4,TMP5 !temporary calculation
  3419. REAL :: TVIR !temporary virtual temperature (k)
  3420. REAL :: CMFM, CHFH
  3421. ! -------------------------------------------------------------------------------------------------
  3422. ! Monin-Obukhov stability parameter moz for next iteration
  3423. MOZOLD = MOZ
  3424. IF(ZLVL <= ZPD) THEN
  3425. write(*,*) 'critical problem: ZLVL <= ZPD; model stops'
  3426. call wrf_error_fatal("STOP in Noah-MP")
  3427. ENDIF
  3428. TMPCM = LOG((ZLVL-ZPD) / Z0M)
  3429. TMPCH = LOG((ZLVL-ZPD) / Z0H)
  3430. IF(ITER == 1) THEN
  3431. FV = 0.0
  3432. MOZ = 0.0
  3433. MOL = 0.0
  3434. ELSE
  3435. TVIR = (1. + 0.61*QAIR) * SFCTMP
  3436. TMP1 = VKC * (GRAV/TVIR) * H/(RHOAIR*CPAIR)
  3437. IF (ABS(TMP1) .LE. MPE) TMP1 = MPE
  3438. MOL = -1. * FV**3 / TMP1
  3439. MOZ = MIN( (ZLVL-ZPD)/MOL, 1.)
  3440. ENDIF
  3441. ! accumulate number of times moz changes sign.
  3442. IF (MOZOLD*MOZ .LT. 0.) MOZSGN = MOZSGN+1
  3443. IF (MOZSGN .GE. 2) THEN
  3444. MOZ = 0.
  3445. FM = 0.
  3446. FH = 0.
  3447. ENDIF
  3448. ! evaluate stability-dependent variables using moz from prior iteration
  3449. IF (MOZ .LT. 0.) THEN
  3450. TMP1 = (1. - 16.*MOZ)**0.25
  3451. TMP2 = LOG((1.+TMP1*TMP1)/2.)
  3452. TMP3 = LOG((1.+TMP1)/2.)
  3453. FMNEW = 2.*TMP3 + TMP2 - 2.*ATAN(TMP1) + 1.5707963
  3454. FHNEW = 2*TMP2
  3455. ELSE
  3456. FMNEW = -5.*MOZ
  3457. FHNEW = FMNEW
  3458. ENDIF
  3459. ! except for first iteration, weight stability factors for previous
  3460. ! iteration to help avoid flip-flops from one iteration to the next
  3461. IF (ITER == 1) THEN
  3462. FM = FMNEW
  3463. FH = FHNEW
  3464. ELSE
  3465. FM = 0.5 * (FM+FMNEW)
  3466. FH = 0.5 * (FH+FHNEW)
  3467. ENDIF
  3468. ! exchange coefficients
  3469. CMFM = TMPCM-FM
  3470. CHFH = TMPCH-FH
  3471. IF(ABS(CMFM) <= MPE) CMFM = MPE
  3472. IF(ABS(CHFH) <= MPE) CHFH = MPE
  3473. CM = VKC*VKC/(CMFM*CMFM)
  3474. CH = VKC*VKC/(CMFM*CHFH)
  3475. ! friction velocity
  3476. FV = UR * SQRT(CM)
  3477. END SUBROUTINE SFCDIF1
  3478. ! ==================================================================================================
  3479. SUBROUTINE SFCDIF2(ITER ,Z0 ,THZ0 ,THLM ,SFCSPD , & !in
  3480. CZIL ,ZLM ,ILOC ,JLOC , & !in
  3481. AKMS ,AKHS ,RLMO ,WSTAR2 , & !in
  3482. USTAR ) !out
  3483. ! -------------------------------------------------------------------------------------------------
  3484. ! SUBROUTINE SFCDIF (renamed SFCDIF_off to avoid clash with Eta PBL)
  3485. ! -------------------------------------------------------------------------------------------------
  3486. ! CALCULATE SURFACE LAYER EXCHANGE COEFFICIENTS VIA ITERATIVE PROCESS.
  3487. ! SEE CHEN ET AL (1997, BLM)
  3488. ! -------------------------------------------------------------------------------------------------
  3489. IMPLICIT NONE
  3490. INTEGER, INTENT(IN) :: ILOC
  3491. INTEGER, INTENT(IN) :: JLOC
  3492. INTEGER, INTENT(IN) :: ITER
  3493. REAL, INTENT(IN) :: ZLM, Z0, THZ0, THLM, SFCSPD, CZIL
  3494. REAL, intent(INOUT) :: AKMS
  3495. REAL, intent(INOUT) :: AKHS
  3496. REAL, intent(INOUT) :: RLMO
  3497. REAL, intent(INOUT) :: WSTAR2
  3498. REAL, intent(OUT) :: USTAR
  3499. REAL ZZ, PSLMU, PSLMS, PSLHU, PSLHS
  3500. REAL XX, PSPMU, YY, PSPMS, PSPHU, PSPHS
  3501. REAL ZILFC, ZU, ZT, RDZ, CXCH
  3502. REAL DTHV, DU2, BTGH, ZSLU, ZSLT, RLOGU, RLOGT
  3503. REAL ZETALT, ZETALU, ZETAU, ZETAT, XLU4, XLT4, XU4, XT4
  3504. REAL XLU, XLT, XU, XT, PSMZ, SIMM, PSHZ, SIMH, USTARK, RLMN, &
  3505. & RLMA
  3506. INTEGER ILECH, ITR
  3507. INTEGER, PARAMETER :: ITRMX = 5
  3508. REAL, PARAMETER :: WWST = 1.2
  3509. REAL, PARAMETER :: WWST2 = WWST * WWST
  3510. REAL, PARAMETER :: VKRM = 0.40
  3511. REAL, PARAMETER :: EXCM = 0.001
  3512. REAL, PARAMETER :: BETA = 1.0 / 270.0
  3513. REAL, PARAMETER :: BTG = BETA * GRAV
  3514. REAL, PARAMETER :: ELFC = VKRM * BTG
  3515. REAL, PARAMETER :: WOLD = 0.15
  3516. REAL, PARAMETER :: WNEW = 1.0 - WOLD
  3517. REAL, PARAMETER :: PIHF = 3.14159265 / 2.
  3518. REAL, PARAMETER :: EPSU2 = 1.E-4
  3519. REAL, PARAMETER :: EPSUST = 0.07
  3520. REAL, PARAMETER :: EPSIT = 1.E-4
  3521. REAL, PARAMETER :: EPSA = 1.E-8
  3522. REAL, PARAMETER :: ZTMIN = -5.0
  3523. REAL, PARAMETER :: ZTMAX = 1.0
  3524. REAL, PARAMETER :: HPBL = 1000.0
  3525. REAL, PARAMETER :: SQVISC = 258.2
  3526. REAL, PARAMETER :: RIC = 0.183
  3527. REAL, PARAMETER :: RRIC = 1.0 / RIC
  3528. REAL, PARAMETER :: FHNEU = 0.8
  3529. REAL, PARAMETER :: RFC = 0.191
  3530. REAL, PARAMETER :: RFAC = RIC / ( FHNEU * RFC * RFC )
  3531. ! ----------------------------------------------------------------------
  3532. ! NOTE: THE TWO CODE BLOCKS BELOW DEFINE FUNCTIONS
  3533. ! ----------------------------------------------------------------------
  3534. ! LECH'S SURFACE FUNCTIONS
  3535. PSLMU (ZZ)= -0.96* log (1.0-4.5* ZZ)
  3536. PSLMS (ZZ)= ZZ * RRIC -2.076* (1. -1./ (ZZ +1.))
  3537. PSLHU (ZZ)= -0.96* log (1.0-4.5* ZZ)
  3538. PSLHS (ZZ)= ZZ * RFAC -2.076* (1. -1./ (ZZ +1.))
  3539. ! PAULSON'S SURFACE FUNCTIONS
  3540. PSPMU (XX)= -2.* log ( (XX +1.)*0.5) - log ( (XX * XX +1.)*0.5) &
  3541. & +2.* ATAN (XX) &
  3542. &- PIHF
  3543. PSPMS (YY)= 5.* YY
  3544. PSPHU (XX)= -2.* log ( (XX * XX +1.)*0.5)
  3545. PSPHS (YY)= 5.* YY
  3546. ! THIS ROUTINE SFCDIF CAN HANDLE BOTH OVER OPEN WATER (SEA, OCEAN) AND
  3547. ! OVER SOLID SURFACE (LAND, SEA-ICE).
  3548. ! ----------------------------------------------------------------------
  3549. ! ZTFC: RATIO OF ZOH/ZOM LESS OR EQUAL THAN 1
  3550. ! C......ZTFC=0.1
  3551. ! CZIL: CONSTANT C IN Zilitinkevich, S. S.1995,:NOTE ABOUT ZT
  3552. ! ----------------------------------------------------------------------
  3553. ILECH = 0
  3554. ! ----------------------------------------------------------------------
  3555. ZILFC = - CZIL * VKRM * SQVISC
  3556. ZU = Z0
  3557. RDZ = 1./ ZLM
  3558. CXCH = EXCM * RDZ
  3559. DTHV = THLM - THZ0
  3560. ! BELJARS CORRECTION OF USTAR
  3561. DU2 = MAX (SFCSPD * SFCSPD,EPSU2)
  3562. BTGH = BTG * HPBL
  3563. IF(ITER == 1) THEN
  3564. IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
  3565. WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
  3566. ELSE
  3567. WSTAR2 = 0.0
  3568. END IF
  3569. USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
  3570. RLMO = ELFC * AKHS * DTHV / USTAR **3
  3571. END IF
  3572. ! ZILITINKEVITCH APPROACH FOR ZT
  3573. ZT = MAX(1.E-6,EXP (ZILFC * SQRT (USTAR * Z0))* Z0)
  3574. ZSLU = ZLM + ZU
  3575. ZSLT = ZLM + ZT
  3576. RLOGU = log (ZSLU / ZU)
  3577. RLOGT = log (ZSLT / ZT)
  3578. ! ----------------------------------------------------------------------
  3579. ! 1./MONIN-OBUKKHOV LENGTH-SCALE
  3580. ! ----------------------------------------------------------------------
  3581. ZETALT = MAX (ZSLT * RLMO,ZTMIN)
  3582. RLMO = ZETALT / ZSLT
  3583. ZETALU = ZSLU * RLMO
  3584. ZETAU = ZU * RLMO
  3585. ZETAT = ZT * RLMO
  3586. IF (ILECH .eq. 0) THEN
  3587. IF (RLMO .lt. 0.)THEN
  3588. XLU4 = 1. -16.* ZETALU
  3589. XLT4 = 1. -16.* ZETALT
  3590. XU4 = 1. -16.* ZETAU
  3591. XT4 = 1. -16.* ZETAT
  3592. XLU = SQRT (SQRT (XLU4))
  3593. XLT = SQRT (SQRT (XLT4))
  3594. XU = SQRT (SQRT (XU4))
  3595. XT = SQRT (SQRT (XT4))
  3596. PSMZ = PSPMU (XU)
  3597. SIMM = PSPMU (XLU) - PSMZ + RLOGU
  3598. PSHZ = PSPHU (XT)
  3599. SIMH = PSPHU (XLT) - PSHZ + RLOGT
  3600. ELSE
  3601. ZETALU = MIN (ZETALU,ZTMAX)
  3602. ZETALT = MIN (ZETALT,ZTMAX)
  3603. PSMZ = PSPMS (ZETAU)
  3604. SIMM = PSPMS (ZETALU) - PSMZ + RLOGU
  3605. PSHZ = PSPHS (ZETAT)
  3606. SIMH = PSPHS (ZETALT) - PSHZ + RLOGT
  3607. END IF
  3608. ! ----------------------------------------------------------------------
  3609. ! LECH'S FUNCTIONS
  3610. ! ----------------------------------------------------------------------
  3611. ELSE
  3612. IF (RLMO .lt. 0.)THEN
  3613. PSMZ = PSLMU (ZETAU)
  3614. SIMM = PSLMU (ZETALU) - PSMZ + RLOGU
  3615. PSHZ = PSLHU (ZETAT)
  3616. SIMH = PSLHU (ZETALT) - PSHZ + RLOGT
  3617. ELSE
  3618. ZETALU = MIN (ZETALU,ZTMAX)
  3619. ZETALT = MIN (ZETALT,ZTMAX)
  3620. PSMZ = PSLMS (ZETAU)
  3621. SIMM = PSLMS (ZETALU) - PSMZ + RLOGU
  3622. PSHZ = PSLHS (ZETAT)
  3623. SIMH = PSLHS (ZETALT) - PSHZ + RLOGT
  3624. END IF
  3625. ! ----------------------------------------------------------------------
  3626. END IF
  3627. ! ----------------------------------------------------------------------
  3628. ! BELJAARS CORRECTION FOR USTAR
  3629. ! ----------------------------------------------------------------------
  3630. USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
  3631. ! ZILITINKEVITCH FIX FOR ZT
  3632. ZT = MAX(1.E-6,EXP (ZILFC * SQRT (USTAR * Z0))* Z0)
  3633. ZSLT = ZLM + ZT
  3634. !-----------------------------------------------------------------------
  3635. RLOGT = log (ZSLT / ZT)
  3636. USTARK = USTAR * VKRM
  3637. AKMS = MAX (USTARK / SIMM,CXCH)
  3638. !-----------------------------------------------------------------------
  3639. ! IF STATEMENTS TO AVOID TANGENT LINEAR PROBLEMS NEAR ZERO
  3640. !-----------------------------------------------------------------------
  3641. AKHS = MAX (USTARK / SIMH,CXCH)
  3642. IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
  3643. WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
  3644. ELSE
  3645. WSTAR2 = 0.0
  3646. END IF
  3647. !-----------------------------------------------------------------------
  3648. RLMN = ELFC * AKHS * DTHV / USTAR **3
  3649. !-----------------------------------------------------------------------
  3650. ! IF(ABS((RLMN-RLMO)/RLMA).LT.EPSIT) GO TO 110
  3651. !-----------------------------------------------------------------------
  3652. RLMA = RLMO * WOLD+ RLMN * WNEW
  3653. !-----------------------------------------------------------------------
  3654. RLMO = RLMA
  3655. ! write(*,'(a20,10f15.6)')'SFCDIF: RLMO=',RLMO,RLMN,ELFC , AKHS , DTHV , USTAR
  3656. ! END DO
  3657. ! ----------------------------------------------------------------------
  3658. END SUBROUTINE SFCDIF2
  3659. !jref:start
  3660. ! ==================================================================================================
  3661. SUBROUTINE SFCDIF3(ILOC ,JLOC ,TSK ,QS ,PSFC ,& !in
  3662. PBLH ,Z0 ,Z0BASE ,VEGTYP ,ISURBAN,& !in
  3663. IZ0TLND,SFCSPD ,ITER ,ITRMX ,TLOW ,& !in
  3664. THLOW ,QLOW ,CWMLOW ,ZSL , & !in
  3665. PLOW ,USTAR ,AKMS ,AKHS ,CHS2 ,& !inout
  3666. CQS2 ,RLMO ) !out
  3667. USE MODULE_SF_MYJSFC, ONLY : &
  3668. & EPSU2 , &
  3669. & EPSUST , &
  3670. & EPSZT , &
  3671. & BETA , &
  3672. & EXCML , &
  3673. & RIC , &
  3674. & SQVISC , &
  3675. & ZTFC , &
  3676. & BTG , &
  3677. & CZIV , &
  3678. & PI , &
  3679. & PIHF , &
  3680. & KZTM , &
  3681. & KZTM2 , &
  3682. & DZETA1 , &
  3683. & DZETA2 , &
  3684. & FH01 , &
  3685. & FH02 , &
  3686. & WWST2 , &
  3687. & WWST , &
  3688. & ZTMAX1 , &
  3689. & ZTMAX2 , &
  3690. & ZTMIN1 , &
  3691. & ZTMIN2 , &
  3692. & PSIH1 , &
  3693. & PSIH2 , &
  3694. & PSIM1 , &
  3695. & PSIM2
  3696. USE MODULE_MODEL_CONSTANTS
  3697. !----------------------------------------------------------------------
  3698. ! computing surface drag coefficient CM for momentum and CH for heat
  3699. ! Joakim Refslund, 2011, MYJ SFCLAY
  3700. !----------------------------------------------------------------------
  3701. IMPLICIT NONE
  3702. !----------------------------------------------------------------------
  3703. ! input
  3704. INTEGER,INTENT(IN) :: ILOC
  3705. INTEGER,INTENT(IN) :: JLOC
  3706. REAL ,INTENT(IN) :: TSK
  3707. REAL ,INTENT(IN) :: PSFC
  3708. REAL ,INTENT(IN) :: PBLH
  3709. INTEGER,INTENT(IN) :: VEGTYP !in routine
  3710. INTEGER,INTENT(IN) :: ISURBAN !in veg_parm
  3711. INTEGER,INTENT(IN) :: IZ0TLND
  3712. REAL ,INTENT(IN) :: QLOW
  3713. REAL ,INTENT(IN) :: THLOW
  3714. REAL ,INTENT(IN) :: TLOW
  3715. REAL ,INTENT(IN) :: CWMLOW
  3716. REAL ,INTENT(IN) :: SFCSPD
  3717. REAL ,INTENT(IN) :: PLOW
  3718. REAL ,INTENT(IN) :: ZSL
  3719. REAL ,INTENT(IN) :: Z0BASE
  3720. INTEGER,INTENT(IN) :: ITER
  3721. INTEGER,INTENT(IN) :: ITRMX
  3722. ! output
  3723. REAL ,INTENT(OUT) :: CHS2
  3724. REAL ,INTENT(OUT) :: CQS2
  3725. REAL ,INTENT(OUT) :: RLMO
  3726. ! input/output
  3727. REAL ,INTENT(INOUT) :: AKHS
  3728. REAL ,INTENT(INOUT) :: AKMS
  3729. REAL :: QZ0
  3730. REAL ,INTENT(INOUT) :: USTAR
  3731. REAL ,INTENT(IN) :: Z0
  3732. REAL ,INTENT(INOUT):: QS
  3733. REAL :: RIB
  3734. ! local
  3735. INTEGER :: ITR,K
  3736. REAL :: THZ0
  3737. REAL :: THVLOW
  3738. REAL :: CT
  3739. REAL :: BTGH
  3740. REAL :: BTGX
  3741. REAL :: CXCHL
  3742. REAL :: DTHV
  3743. REAL :: DU2
  3744. REAL :: ELFC
  3745. REAL :: PSH02
  3746. REAL :: PSH10
  3747. REAL :: PSHZ
  3748. REAL :: PSHZL
  3749. REAL :: PSM10
  3750. REAL :: PSMZ
  3751. REAL :: PSMZL
  3752. REAL :: RDZ
  3753. REAL :: RDZT
  3754. REAL :: RLMA !???
  3755. REAL :: RLMN !???
  3756. REAL :: RLOGT
  3757. REAL :: RLOGU
  3758. REAL :: RZ
  3759. REAL :: SIMH
  3760. REAL :: SIMM
  3761. REAL :: USTARK
  3762. REAL :: WSTAR2
  3763. REAL :: WSTAR
  3764. REAL :: CHS
  3765. REAL :: RZSU
  3766. REAL :: RZST
  3767. REAL :: X,XLT,XLT4,XLU,XLU4,XT,XT4,XU,XU4,ZETALT,ZETALU , &
  3768. ZETAT,ZETAU,ZQ,ZSLT,ZSLU,ZT,ZU,TOPOTERM,ZZIL
  3769. REAL :: AKHS02,AKHS10,AKMS02,AKMS10
  3770. REAL :: ZU10
  3771. REAL :: ZT02
  3772. REAL :: ZT10
  3773. REAL :: RLNU10
  3774. REAL :: RLNT02
  3775. REAL :: RLNT10
  3776. REAL :: ZTAU10
  3777. REAL :: ZTAT02
  3778. REAL :: ZTAT10
  3779. REAL :: SIMM10
  3780. REAL :: SIMH02
  3781. REAL :: SIMH10
  3782. REAL :: ZUUZ
  3783. REAL :: EKMS10
  3784. REAL :: test
  3785. REAL :: E1
  3786. REAL, PARAMETER :: VKRM = 0.40
  3787. REAL, PARAMETER :: CZETMAX = 10.
  3788. ! diagnostic terms
  3789. REAL :: CZIL
  3790. REAL :: ZILFC
  3791. ! KTMZ,KTMZ2,DZETA1,DZETA2,FH01,FH02,ZTMAX1,ZTMAX2,ZTMIN1,ZTMIN2,
  3792. ! PSIH1,PSIH2,PSIM1,PSIM2 ARE DEFINED IN MODULE_SF_MYJSFC
  3793. !----------------------------------------------------------------------
  3794. ! IF (ILOC.eq.39 .and. JLOC.eq.63 .and. ITER == 1 ) then
  3795. ! write(*,*) "THZ0=",THZ0
  3796. ! write(*,*) "QS =",QS
  3797. ! write(*,*) "PSFC=",PSFC
  3798. ! write(*,*) "PBLH=",PBLH
  3799. ! write(*,*) "Z0=",Z0
  3800. ! write(*,*) "Z0BASE=",Z0BASE
  3801. ! write(*,*) "VEGTYP=",VEGTYP
  3802. ! write(*,*) "ISURBAN=",ISURBAN
  3803. ! write(*,*) "IZ0TLND=",IZ0TLND
  3804. ! write(*,*) "SFCSPD=",SFCSPD
  3805. ! write(*,*) "TLOW=",TLOW
  3806. ! write(*,*) "THLOW=",THLOW
  3807. ! write(*,*) "THVLOW=",THVLOW
  3808. ! write(*,*) "QLOW=",QLOW
  3809. ! write(*,*) "CWMLOW=",CWMLOW
  3810. ! write(*,*) "ZSL=",ZSL
  3811. ! write(*,*) "PLOW=",PLOW
  3812. ! write(*,*) "USTAR=",USTAR
  3813. ! write(*,*) "AKMS=",AKMS
  3814. ! write(*,*) "AKHS=",AKHS
  3815. ! write(*,*) "CHS2=",CHS2
  3816. ! write(*,*) "CQS2=",CQS2
  3817. ! write(*,*) "RLMO=",RLMO
  3818. ! write(*,*) "ITER=",ITER
  3819. ! call wrf_error_fatal("STOP in SFCDIF3")
  3820. ! ENDIF
  3821. ! calculate potential and virtual potential temperatures
  3822. THVLOW = THLOW*(1.+EP_1*QLOW)
  3823. THZ0 = TSK*(P1000mb/PSFC)**RCP
  3824. ! calculate initial values
  3825. ZU = Z0
  3826. ZT = ZU*ZTFC !ZTFC = ZOH/ZOM =<1 set to 1 at beginning
  3827. ZQ = ZT
  3828. QZ0 = QS
  3829. RDZ = 1./ZSL
  3830. CXCHL = EXCML*RDZ
  3831. DTHV = THVLOW-THZ0*(0.608*QZ0+1.) !delta pot. virtual temperature
  3832. BTGX=GRAV/THLOW
  3833. ELFC=VKRM*BTGX
  3834. ! Minimum PBLH is >= 1000.
  3835. IF(PBLH > 1000.)THEN
  3836. BTGH = BTGX*PBLH
  3837. ELSE
  3838. BTGH = BTGX*1000.
  3839. ENDIF
  3840. DU2 = MAX(SFCSPD*SFCSPD,EPSU2) !Wind speed - EPSU2 parm = 1*10^-6
  3841. RIB = BTGX*DTHV*ZSL/DU2 !Bulk richardson stability
  3842. ZSLU = ZSL+ZU
  3843. RZSU = ZSLU/ZU
  3844. RLOGU = LOG(RZSU) !log(z/z0)
  3845. ZSLT = ZSL + ZU
  3846. IF ( (IZ0TLND==0) .or. (VEGTYP == ISURBAN) ) THEN ! ARE IZ0TLND DEFINED HERE?
  3847. ! Just use the original CZIL value.
  3848. CZIL = 0.1
  3849. ELSE
  3850. ! Modify CZIL according to Chen & Zhang, 2009
  3851. ! CZIL = 10 ** -0.40 H, ( where H = 10*Zo )
  3852. CZIL = 10.0 ** ( -0.40 * ( Z0 / 0.07 ) )
  3853. ENDIF
  3854. ZILFC=-CZIL*VKRM*SQVISC !SQVISC parm
  3855. ! stable
  3856. IF(DTHV>0.)THEN
  3857. IF (RIB<RIC) THEN
  3858. ZZIL=ZILFC*(1.0+(RIB/RIC)*(RIB/RIC)*CZETMAX)
  3859. ELSE
  3860. ZZIL=ZILFC*(1.0+CZETMAX)
  3861. ENDIF
  3862. ! unstable
  3863. ELSE
  3864. ZZIL=ZILFC
  3865. ENDIF
  3866. !--- ZILITINKEVITCH FIX FOR ZT
  3867. ! oldform ZT=MAX(EXP(ZZIL*SQRT(USTAR*ZU))*ZU,EPSZT)
  3868. ZT=MAX(EXP(ZZIL*SQRT(USTAR*Z0BASE))*Z0BASE,EPSZT) !Z0 is backgrund roughness?
  3869. RZST=ZSLT/ZT
  3870. RLOGT=LOG(RZST)
  3871. !----------------------------------------------------------------------
  3872. ! 1./MONIN-OBUKHOV LENGTH-SCALE
  3873. !----------------------------------------------------------------------
  3874. RLMO=ELFC*AKHS*DTHV/USTAR**3
  3875. ZETALU=ZSLU*RLMO
  3876. ZETALT=ZSLT*RLMO
  3877. ZETAU=ZU*RLMO
  3878. ZETAT=ZT*RLMO
  3879. ZETALU=MIN(MAX(ZETALU,ZTMIN2),ZTMAX2)
  3880. ZETALT=MIN(MAX(ZETALT,ZTMIN2),ZTMAX2)
  3881. ZETAU=MIN(MAX(ZETAU,ZTMIN2/RZSU),ZTMAX2/RZSU)
  3882. ZETAT=MIN(MAX(ZETAT,ZTMIN2/RZST),ZTMAX2/RZST)
  3883. !----------------------------------------------------------------------
  3884. !*** LAND FUNCTIONS
  3885. !----------------------------------------------------------------------
  3886. RZ=(ZETAU-ZTMIN2)/DZETA2
  3887. K=INT(RZ)
  3888. RDZT=RZ-REAL(K)
  3889. K=MIN(K,KZTM2)
  3890. K=MAX(K,0)
  3891. PSMZ=(PSIM2(K+2)-PSIM2(K+1))*RDZT+PSIM2(K+1)
  3892. RZ=(ZETALU-ZTMIN2)/DZETA2
  3893. K=INT(RZ)
  3894. RDZT=RZ-REAL(K)
  3895. K=MIN(K,KZTM2)
  3896. K=MAX(K,0)
  3897. PSMZL=(PSIM2(K+2)-PSIM2(K+1))*RDZT+PSIM2(K+1)
  3898. SIMM=PSMZL-PSMZ+RLOGU
  3899. RZ=(ZETAT-ZTMIN2)/DZETA2
  3900. K=INT(RZ)
  3901. RDZT=RZ-REAL(K)
  3902. K=MIN(K,KZTM2)
  3903. K=MAX(K,0)
  3904. PSHZ=(PSIH2(K+2)-PSIH2(K+1))*RDZT+PSIH2(K+1)
  3905. RZ=(ZETALT-ZTMIN2)/DZETA2
  3906. K=INT(RZ)
  3907. RDZT=RZ-REAL(K)
  3908. K=MIN(K,KZTM2)
  3909. K=MAX(K,0)
  3910. PSHZL=(PSIH2(K+2)-PSIH2(K+1))*RDZT+PSIH2(K+1)
  3911. SIMH=(PSHZL-PSHZ+RLOGT)*FH02
  3912. !----------------------------------------------------------------------
  3913. USTARK=USTAR*VKRM
  3914. AKMS=MAX(USTARK/SIMM,CXCHL)
  3915. AKHS=MAX(USTARK/SIMH,CXCHL)
  3916. !----------------------------------------------------------------------
  3917. ! BELJAARS CORRECTION FOR USTAR
  3918. !----------------------------------------------------------------------
  3919. IF(DTHV<=0.)THEN !zj
  3920. WSTAR2=WWST2*ABS(BTGH*AKHS*DTHV)**(2./3.) !zj
  3921. ELSE !zj
  3922. WSTAR2=0. !zj
  3923. ENDIF !zj
  3924. USTAR=MAX(SQRT(AKMS*SQRT(DU2+WSTAR2)),EPSUST)
  3925. CT=0.
  3926. !----------------------------------------------------------------------
  3927. !*** THE FOLLOWING DIAGNOSTIC BLOCK PRODUCES 2-m and 10-m VALUES
  3928. !*** FOR TEMPERATURE, MOISTURE, AND WINDS. IT IS DONE HERE SINCE
  3929. !*** THE VARIOUS QUANTITIES NEEDED FOR THE COMPUTATION ARE LOST
  3930. !*** UPON EXIT FROM THE ROTUINE.
  3931. !----------------------------------------------------------------------
  3932. WSTAR=SQRT(WSTAR2)/WWST
  3933. !jref: calculate in last iteration
  3934. ! IF (ITER == ITRMX) THEN
  3935. ZU10=ZU+10.
  3936. ZT02=ZT+02.
  3937. ZT10=ZT+10.
  3938. RLNU10=LOG(ZU10/ZU)
  3939. RLNT02=LOG(ZT02/ZT)
  3940. RLNT10=LOG(ZT10/ZT)
  3941. ZTAU10=ZU10*RLMO
  3942. ZTAT02=ZT02*RLMO
  3943. ZTAT10=ZT10*RLMO
  3944. ZTAU10=MIN(MAX(ZTAU10,ZTMIN2),ZTMAX2)
  3945. ZTAT02=MIN(MAX(ZTAT02,ZTMIN2),ZTMAX2)
  3946. ZTAT10=MIN(MAX(ZTAT10,ZTMIN2),ZTMAX2)
  3947. !jref: land diagnostic functions
  3948. RZ=(ZTAU10-ZTMIN2)/DZETA2
  3949. K=INT(RZ)
  3950. RDZT=RZ-REAL(K)
  3951. K=MIN(K,KZTM2)
  3952. K=MAX(K,0)
  3953. PSM10=(PSIM2(K+2)-PSIM2(K+1))*RDZT+PSIM2(K+1)
  3954. SIMM10=PSM10-PSMZ+RLNU10
  3955. RZ=(ZTAT02-ZTMIN2)/DZETA2
  3956. K=INT(RZ)
  3957. RDZT=RZ-REAL(K)
  3958. K=MIN(K,KZTM2)
  3959. K=MAX(K,0)
  3960. PSH02=(PSIH2(K+2)-PSIH2(K+1))*RDZT+PSIH2(K+1)
  3961. SIMH02=(PSH02-PSHZ+RLNT02)*FH02
  3962. RZ=(ZTAT10-ZTMIN2)/DZETA2
  3963. K=INT(RZ)
  3964. RDZT=RZ-REAL(K)
  3965. K=MIN(K,KZTM2)
  3966. K=MAX(K,0)
  3967. PSH10=(PSIH2(K+2)-PSIH2(K+1))*RDZT+PSIH2(K+1)
  3968. SIMH10=(PSH10-PSHZ+RLNT10)*FH02
  3969. !jref: diagnostic exchange coefficients
  3970. AKMS10=MAX(USTARK/SIMM10,CXCHL)
  3971. AKHS02=MAX(USTARK/SIMH02,CXCHL)
  3972. AKHS10=MAX(USTARK/SIMH10,CXCHL)
  3973. !jref: calculation of diagnostics for wind, humidity
  3974. ! WSTAR=SQRT(WSTAR2)/WWST
  3975. !
  3976. ! UMFLX=AKMS*(ULOW -UZ0 )
  3977. ! VMFLX=AKMS*(VLOW -VZ0 )
  3978. ! HSFLX=AKHS*(THLOW-THZ0)
  3979. ! HLFLX=AKHS*(QLOW -QZ0 )
  3980. !uncommented for now...
  3981. ! U10 =UMFLX/AKMS10+UZ0
  3982. ! V10 =VMFLX/AKMS10+VZ0
  3983. ! TH02=HSFLX/AKHS02+THZ0
  3984. !
  3985. !*** BE CERTAIN THAT THE 2-M THETA AND 10-M THETA ARE BRACKETED BY
  3986. !*** THE VALUES OF THZ0 AND THLOW.
  3987. !
  3988. ! IF(THLOW>THZ0.AND.(TH02<THZ0.OR.TH02>THLOW).OR. &
  3989. ! THLOW<THZ0.AND.(TH02>THZ0.OR.TH02<THLOW))THEN
  3990. ! TH02=THZ0+2.*RDZ*(THLOW-THZ0)
  3991. ! ENDIF
  3992. !
  3993. !uncommented for now
  3994. ! TH10=HSFLX/AKHS10+THZ0
  3995. !
  3996. ! IF(THLOW>THZ0.AND.(TH10<THZ0.OR.TH10>THLOW).OR. &
  3997. ! THLOW<THZ0.AND.(TH10>THZ0.OR.TH10<THLOW))THEN
  3998. ! TH10=THZ0+10.*RDZ*(THLOW-THZ0)
  3999. ! ENDIF
  4000. !
  4001. ! Q02 =HLFLX/AKHS02+QZ0
  4002. ! Q10 =HLFLX/AKHS10+QZ0
  4003. !jref commented out
  4004. ! TERM1=-0.068283/TLOW
  4005. ! PSHLTR=PSFC*EXP(TERM1)
  4006. !
  4007. !----------------------------------------------------------------------
  4008. !*** COMPUTE "EQUIVALENT" Z0 TO APPROXIMATE LOCAL SHELTER READINGS.
  4009. !----------------------------------------------------------------------
  4010. !
  4011. ! U10E=U10
  4012. ! V10E=V10
  4013. !
  4014. ! IF(SEAMASK<0.5)THEN
  4015. !LAND :
  4016. !1st ZUUZ=MIN(0.5*ZU,0.1)
  4017. !1st ZU=MAX(0.1*ZU,ZUUZ)
  4018. !tst ZUUZ=amin1(ZU*0.50,0.3)
  4019. !tst ZU=amax1(ZU*0.3,ZUUZ)
  4020. ZUUZ=AMIN1(ZU*0.50,0.18)
  4021. ZU=AMAX1(ZU*0.35,ZUUZ)
  4022. !
  4023. ZU10=ZU+10.
  4024. RZSU=ZU10/ZU
  4025. RLNU10=LOG(RZSU)
  4026. ZETAU=ZU*RLMO
  4027. ZTAU10=ZU10*RLMO
  4028. ZTAU10=MIN(MAX(ZTAU10,ZTMIN2),ZTMAX2)
  4029. ZETAU=MIN(MAX(ZETAU,ZTMIN2/RZSU),ZTMAX2/RZSU)
  4030. RZ=(ZTAU10-ZTMIN2)/DZETA2
  4031. K=INT(RZ)
  4032. RDZT=RZ-REAL(K)
  4033. K=MIN(K,KZTM2)
  4034. K=MAX(K,0)
  4035. PSM10=(PSIM2(K+2)-PSIM2(K+1))*RDZT+PSIM2(K+1)
  4036. SIMM10=PSM10-PSMZ+RLNU10
  4037. EKMS10=MAX(USTARK/SIMM10,CXCHL)
  4038. ! U10E=UMFLX/EKMS10+UZ0
  4039. ! V10E=VMFLX/EKMS10+VZ0
  4040. ! ENDIF
  4041. !
  4042. ! U10=U10E
  4043. ! V10=V10E
  4044. !
  4045. !----------------------------------------------------------------------
  4046. !*** SET OTHER WRF DRIVER ARRAYS
  4047. !----------------------------------------------------------------------
  4048. !
  4049. !jref commented out
  4050. ! RLOW=PLOW/(R_D*TLOW)
  4051. CHS=AKHS
  4052. CHS2=AKHS02
  4053. CQS2=AKHS02
  4054. ! END IF
  4055. END SUBROUTINE SFCDIF3
  4056. !jref:end
  4057. ! ==================================================================================================
  4058. !jref:start
  4059. !-------------------------------------------------------------------
  4060. SUBROUTINE SFCDIF4(ILOC ,JLOC ,UX ,VX ,T1D , &
  4061. P1D ,PSFCPA,PBLH ,DX ,ZNT , &
  4062. TSK ,QX ,ZLVL ,IZ0TLND,QSFC , &
  4063. HFX ,QFX ,CM ,CHS ,CHS2 , &
  4064. CQS2 ,RMOL ,UST ,U10 ,V10)
  4065. USE MODULE_SF_SFCLAY
  4066. USE MODULE_MODEL_CONSTANTS
  4067. !-------------------------------------------------------------------
  4068. ! Compute surface drag coefficients CM for momentum and CH for heat
  4069. ! Joakim Refslund, 2011. Modified from YSU SFCLAY.
  4070. !-------------------------------------------------------------------
  4071. IMPLICIT NONE
  4072. !-------------------------------------------------------------------
  4073. ! parameters
  4074. REAL, PARAMETER :: XKA=2.4E-5
  4075. REAL, PARAMETER :: PRT=1. !prandtl number
  4076. ! input
  4077. INTEGER,INTENT(IN ) :: ILOC
  4078. INTEGER,INTENT(IN ) :: JLOC
  4079. REAL, INTENT(IN ) :: PBLH ! planetary boundary layer height
  4080. REAL, INTENT(IN ) :: TSK ! skin temperature
  4081. REAL, INTENT(IN ) :: PSFCPA ! pressure in pascal
  4082. REAL, INTENT(IN ) :: P1D !lowest model layer pressure (Pa)
  4083. REAL, INTENT(IN ) :: T1D !lowest model layer temperature
  4084. ! REAL, INTENT(IN ) :: QX !water vapor mixing ratio (kg/kg)
  4085. REAL, INTENT(IN ) :: QX !water vapor specific humidity (kg/kg)
  4086. REAL, INTENT(IN ) :: ZLVL ! thickness of lowest full level layer
  4087. REAL, INTENT(IN ) :: HFX ! sensible heat flux
  4088. REAL, INTENT(IN ) :: QFX ! moisture flux
  4089. REAL, INTENT(IN ) :: DX ! horisontal grid spacing
  4090. REAL, INTENT(IN ) :: UX
  4091. REAL, INTENT(IN ) :: VX
  4092. REAL, INTENT(IN ) :: ZNT
  4093. REAL, INTENT(INOUT ) :: QSFC
  4094. REAL, INTENT(INOUT) :: RMOL
  4095. REAL, INTENT(INOUT) :: UST
  4096. REAL, INTENT(INOUT) :: CHS2
  4097. REAL, INTENT(INOUT) :: CQS2
  4098. REAL, INTENT(INOUT) :: CHS
  4099. REAL, INTENT(INOUT) :: CM
  4100. ! diagnostics out
  4101. REAL, INTENT(OUT) :: U10
  4102. REAL, INTENT(OUT) :: V10
  4103. ! REAL, INTENT(OUT) :: TH2
  4104. ! REAL, INTENT(OUT) :: T2
  4105. ! REAL, INTENT(OUT) :: Q2
  4106. ! REAL, INTENT(OUT) :: QSFC
  4107. ! optional vars
  4108. INTEGER,OPTIONAL,INTENT(IN ) :: IZ0TLND
  4109. ! local
  4110. INTEGER :: REGIME ! Stability regime
  4111. REAL :: ZA ! Height of full-sigma level
  4112. REAL :: THVX ! Virtual potential temperature
  4113. REAL :: ZQKL ! Height of upper half level
  4114. REAL :: ZQKLP1 ! Height of lower half level (surface)
  4115. REAL :: THX ! Potential temperature
  4116. REAL :: PSIH ! similarity function for heat
  4117. REAL :: PSIH2 ! Similarity function for heat 2m
  4118. REAL :: PSIH10 ! Similarity function for heat 10m
  4119. REAL :: PSIM ! similarity function for momentum
  4120. REAL :: PSIM2 ! Similarity function for momentum 2m
  4121. REAL :: PSIM10 ! Similarity function for momentum 10m
  4122. REAL :: DENOMQ ! Denominator used for flux calc.
  4123. REAL :: DENOMQ2 ! Denominator used for flux calc.
  4124. REAL :: DENOMT2 ! Denominator used for flux calc.
  4125. REAL :: WSPDI ! Initial wind speed
  4126. REAL :: GZ1OZ0 ! log(za/z0)
  4127. REAL :: GZ2OZ0 ! log(z2/z0)
  4128. REAL :: GZ10OZ0 ! log(z10/z0)
  4129. REAL :: RHOX ! density
  4130. REAL :: GOVRTH ! g/theta for stability L
  4131. REAL :: TGDSA ! tsk
  4132. ! REAL :: SCR3 ! temporal variable -> input variable T1D
  4133. REAL :: TVIR ! temporal variable SRC4 -> TVIR
  4134. REAL :: THGB ! Potential temperature ground
  4135. REAL :: PSFC ! Surface pressure
  4136. REAL :: BR ! bulk richardson number
  4137. REAL :: CPM
  4138. REAL :: MOL
  4139. REAL :: ZOL
  4140. REAL :: QGH
  4141. REAL :: WSPD
  4142. INTEGER :: N,I,K,KK,L,NZOL,NK,NZOL2,NZOL10
  4143. REAL :: PL,THCON,TVCON,E1
  4144. REAL :: ZL,TSKV,DTHVDZ,DTHVM,VCONV,RZOL,RZOL2,RZOL10,ZOL2,ZOL10
  4145. REAL :: DTG,PSIX,DTTHX,PSIX10,PSIT,PSIT2,PSIQ,PSIQ2,PSIQ10
  4146. REAL :: FLUXC,VSGD,Z0Q,VISC,RESTAR,CZIL,RESTAR2
  4147. !-------------------------------------------------------------------
  4148. MOL = 1./RMOL
  4149. ZL=0.01
  4150. PSFC=PSFCPA/1000.
  4151. ! convert (tah or tgb = tsk) temperature to potential temperature.
  4152. TGDSA = TSK
  4153. THGB = TSK*(P1000mb/PSFCPA)**RCP
  4154. ! store virtual, virtual potential and potential temperature
  4155. PL = P1D/1000.
  4156. THX = T1D*(P1000mb*0.001/PL)**RCP
  4157. THVX = THX*(1.+EP_1*QX)
  4158. TVIR = T1D*(1.+EP_1*QX)
  4159. ! for land points QSFC can come from previous time step
  4160. !QSFC=EP_2*E1/(PSFC-E1)
  4161. IF (QSFC.LE.0.0) THEN
  4162. !testing this
  4163. E1=SVP1*EXP(SVP2*(TGDSA-SVPT0)/(TGDSA-SVP3))
  4164. QSFC=EP_2*E1/(PSFC-E1)
  4165. write(*,*) "JREF: IN SFCDIF4, QSFC WAS NEG. NOW = ",QSFC
  4166. ENDIF
  4167. ! qgh changed to use lowest-level air temp consistent with myjsfc change
  4168. ! q2sat = qgh in lsm
  4169. !jref: canres and esat is calculated in the loop so should that be changed??
  4170. ! QGH=EP_2*E1/(PL-E1)
  4171. CPM=CP*(1.+0.8*QX)
  4172. ! compute the height of half-sigma levels above ground level
  4173. !ZA=0.5*DZ8W
  4174. ZA = ZLVL
  4175. ! compute density and part of monin-obukhov length L
  4176. RHOX=PSFC*1000./(R_D*TVIR)
  4177. GOVRTH=G/THX
  4178. ! calculate bulk richardson no. of surface layer,
  4179. ! according to akb(1976), eq(12).
  4180. GZ1OZ0=ALOG(ZA/ZNT)
  4181. GZ2OZ0=ALOG(2./ZNT)
  4182. GZ10OZ0=ALOG(10./ZNT)
  4183. WSPD=SQRT(UX*UX+VX*VX)
  4184. ! virtual pot. temperature difference between input layer and lowest model layer
  4185. TSKV=THGB*(1.+EP_1*QSFC)
  4186. DTHVDZ=(THVX-TSKV)
  4187. ! convective velocity scale Vc and subgrid-scale velocity Vsg
  4188. ! following Beljaars (1995, QJRMS) and Mahrt and Sun (1995, MWR)
  4189. ! ... HONG Aug. 2001
  4190. !
  4191. ! VCONV = 0.25*sqrt(g/tskv*pblh(i)*dthvm)
  4192. ! use Beljaars over land, old MM5 (Wyngaard) formula over water
  4193. !jref:start commented out to see if stability is affected.
  4194. FLUXC = MAX(HFX/RHOX/CP + EP_1*TSKV*QFX/RHOX,0.)
  4195. VCONV = VCONVC*(G/TGDSA*PBLH*FLUXC)**.33
  4196. ! VCONV = 0
  4197. !jref:end
  4198. ! Mahrt and Sun low-res correction
  4199. VSGD = 0.32 * (max(dx/5000.-1.,0.))**.33
  4200. WSPD=SQRT(WSPD*WSPD+VCONV*VCONV+VSGD*VSGD)
  4201. WSPD=AMAX1(WSPD,0.1)
  4202. BR=GOVRTH*ZA*DTHVDZ/(WSPD*WSPD)
  4203. ! if previously unstable, do not let into regimes 1 and 2
  4204. IF(MOL.LT.0.) BR=AMIN1(BR,0.0)
  4205. RMOL=-GOVRTH*DTHVDZ*ZA*KARMAN
  4206. !-----------------------------------------------------------------------
  4207. ! diagnose basic parameters for the appropriated stability class:
  4208. !
  4209. ! the stability classes are determined by br (bulk richardson no.)
  4210. ! and hol (height of pbl/monin-obukhov length).
  4211. !
  4212. ! criteria for the classes are as follows:
  4213. !
  4214. ! 1. br .ge. 0.2;
  4215. ! represents nighttime stable conditions (regime=1),
  4216. !
  4217. ! 2. br .lt. 0.2 .and. br .gt. 0.0;
  4218. ! represents damped mechanical turbulent conditions
  4219. ! (regime=2),
  4220. !
  4221. ! 3. br .eq. 0.0
  4222. ! represents forced convection conditions (regime=3),
  4223. !
  4224. ! 4. br .lt. 0.0
  4225. ! represents free convection conditions (regime=4).
  4226. !
  4227. !-----------------------------------------------------------------------
  4228. IF (BR.GE.0.2) REGIME=1
  4229. IF (BR.LT.0.2 .AND. BR.GT.0.0) REGIME=2
  4230. IF (BR.EQ.0.0) REGIME=3
  4231. IF (BR.LT.0.0) REGIME=4
  4232. SELECT CASE(REGIME)
  4233. CASE(1) ! class 1; stable (nighttime) conditions:
  4234. PSIM=-10.*GZ1OZ0
  4235. ! lower limit on psi in stable conditions
  4236. PSIM=AMAX1(PSIM,-10.)
  4237. PSIH=PSIM
  4238. PSIM10=10./ZA*PSIM
  4239. PSIM10=AMAX1(PSIM10,-10.)
  4240. PSIH10=PSIM10
  4241. PSIM2=2./ZA*PSIM
  4242. PSIM2=AMAX1(PSIM2,-10.)
  4243. PSIH2=PSIM2
  4244. ! 1.0 over Monin-Obukhov length
  4245. IF(UST.LT.0.01)THEN
  4246. RMOL=BR*GZ1OZ0 !ZA/L
  4247. ELSE
  4248. RMOL=KARMAN*GOVRTH*ZA*MOL/(UST*UST) !ZA/L
  4249. ENDIF
  4250. RMOL=AMIN1(RMOL,9.999) ! ZA/L
  4251. RMOL = RMOL/ZA !1.0/L
  4252. CASE(2) ! class 2; damped mechanical turbulence:
  4253. PSIM=-5.0*BR*GZ1OZ0/(1.1-5.0*BR)
  4254. ! lower limit on psi in stable conditions
  4255. PSIM=AMAX1(PSIM,-10.)
  4256. ! AKB(1976), EQ(16).
  4257. PSIH=PSIM
  4258. PSIM10=10./ZA*PSIM
  4259. PSIM10=AMAX1(PSIM10,-10.)
  4260. PSIH10=PSIM10
  4261. PSIM2=2./ZA*PSIM
  4262. PSIM2=AMAX1(PSIM2,-10.)
  4263. PSIH2=PSIM2
  4264. ! Linear form: PSIM = -0.5*ZA/L; e.g, see eqn 16 of
  4265. ! Blackadar, Modeling the nocturnal boundary layer, Preprints,
  4266. ! Third Symposium on Atmospheric Turbulence Diffusion and Air Quality,
  4267. ! Raleigh, NC, 1976
  4268. ZOL = BR*GZ1OZ0/(1.00001-5.0*BR)
  4269. IF ( ZOL .GT. 0.5 ) THEN ! linear form ok
  4270. ! Holtslag and de Bruin, J. App. Meteor 27, 689-704, 1988;
  4271. ! see also, Launiainen, Boundary-Layer Meteor 76,165-179, 1995
  4272. ! Eqn (8) of Launiainen, 1995
  4273. ZOL = ( 1.89*GZ1OZ0 + 44.2 ) * BR*BR &
  4274. + ( 1.18*GZ1OZ0 - 1.37 ) * BR
  4275. ZOL=AMIN1(ZOL,9.999)
  4276. END IF
  4277. ! 1.0 over Monin-Obukhov length
  4278. RMOL= ZOL/ZA
  4279. CASE(3) ! class 3; forced convection:
  4280. PSIM=0.0
  4281. PSIH=PSIM
  4282. PSIM10=0.
  4283. PSIH10=PSIM10
  4284. PSIM2=0.
  4285. PSIH2=PSIM2
  4286. IF(UST.LT.0.01)THEN
  4287. ZOL=BR*GZ1OZ0
  4288. ELSE
  4289. ZOL=KARMAN*GOVRTH*ZA*MOL/(UST*UST)
  4290. ENDIF
  4291. RMOL = ZOL/ZA
  4292. CASE(4) ! class 4; free convection:
  4293. IF(UST.LT.0.01)THEN
  4294. ZOL=BR*GZ1OZ0
  4295. ELSE
  4296. ZOL=KARMAN*GOVRTH*ZA*MOL/(UST*UST)
  4297. ENDIF
  4298. ZOL10=10./ZA*ZOL
  4299. ZOL2=2./ZA*ZOL
  4300. ZOL=AMIN1(ZOL,0.)
  4301. ZOL=AMAX1(ZOL,-9.9999)
  4302. ZOL10=AMIN1(ZOL10,0.)
  4303. ZOL10=AMAX1(ZOL10,-9.9999)
  4304. ZOL2=AMIN1(ZOL2,0.)
  4305. ZOL2=AMAX1(ZOL2,-9.9999)
  4306. NZOL=INT(-ZOL*100.)
  4307. RZOL=-ZOL*100.-NZOL
  4308. NZOL10=INT(-ZOL10*100.)
  4309. RZOL10=-ZOL10*100.-NZOL10
  4310. NZOL2=INT(-ZOL2*100.)
  4311. RZOL2=-ZOL2*100.-NZOL2
  4312. PSIM=PSIMTB(NZOL)+RZOL*(PSIMTB(NZOL+1)-PSIMTB(NZOL))
  4313. PSIH=PSIHTB(NZOL)+RZOL*(PSIHTB(NZOL+1)-PSIHTB(NZOL))
  4314. PSIM10=PSIMTB(NZOL10)+RZOL10*(PSIMTB(NZOL10+1)-PSIMTB(NZOL10))
  4315. PSIH10=PSIHTB(NZOL10)+RZOL10*(PSIHTB(NZOL10+1)-PSIHTB(NZOL10))
  4316. PSIM2=PSIMTB(NZOL2)+RZOL2*(PSIMTB(NZOL2+1)-PSIMTB(NZOL2))
  4317. PSIH2=PSIHTB(NZOL2)+RZOL2*(PSIHTB(NZOL2+1)-PSIHTB(NZOL2))
  4318. ! limit psih and psim in the case of thin layers and high roughness
  4319. ! this prevents denominator in fluxes from getting too small
  4320. ! PSIH=AMIN1(PSIH,0.9*GZ1OZ0)
  4321. ! PSIM=AMIN1(PSIM,0.9*GZ1OZ0)
  4322. PSIH=AMIN1(PSIH,0.9*GZ1OZ0)
  4323. PSIM=AMIN1(PSIM,0.9*GZ1OZ0)
  4324. PSIH2=AMIN1(PSIH2,0.9*GZ2OZ0)
  4325. PSIM10=AMIN1(PSIM10,0.9*GZ10OZ0)
  4326. ! AHW: mods to compute ck, cd
  4327. PSIH10=AMIN1(PSIH10,0.9*GZ10OZ0)
  4328. RMOL = ZOL/ZA
  4329. END SELECT ! stability regime done
  4330. ! compute the frictional velocity: ZA(1982) EQS(2.60),(2.61).
  4331. DTG=THX-THGB
  4332. PSIX=GZ1OZ0-PSIM
  4333. PSIX10=GZ10OZ0-PSIM10
  4334. ! lower limit added to prevent large flhc in soil model
  4335. ! activates in unstable conditions with thin layers or high z0
  4336. PSIT=AMAX1(GZ1OZ0-PSIH,2.) !does this still apply???? jref
  4337. PSIQ=ALOG(KARMAN*UST*ZA/XKA+ZA/ZL)-PSIH
  4338. PSIT2=GZ2OZ0-PSIH2
  4339. PSIQ2=ALOG(KARMAN*UST*2./XKA+2./ZL)-PSIH2
  4340. ! AHW: mods to compute ck, cd
  4341. PSIQ10=ALOG(KARMAN*UST*10./XKA+10./ZL)-PSIH10
  4342. !jref:start - commented out since these values can be produced by sfclay routine
  4343. ! IF(PRESENT(ck) .and. PRESENT(cd) .and. PRESENT(cka) .and. PRESENT(cda)) THEN
  4344. ! Ck=(karman/psix10)*(karman/psiq10)
  4345. ! Cd=(karman/psix10)*(karman/psix10)
  4346. ! Cka=(karman/psix)*(karman/psiq)
  4347. ! Cda=(karman/psix)*(karman/psix)
  4348. ! ENDIF
  4349. ! WRITE(*,*) "KARMAN=",KARMAN
  4350. ! WRITE(*,*) "UST=",UST
  4351. ! WRITE(*,*) "XKA=",XKA
  4352. ! WRITE(*,*) "ZA =",ZA
  4353. ! WRITE(*,*) "ZL =",ZL
  4354. ! WRITE(*,*) "PSIH=",PSIH
  4355. ! WRITE(*,*) "PSIQ=",PSIQ,"PSIT=",PSIT
  4356. IF ( PRESENT(IZ0TLND) ) THEN
  4357. IF ( IZ0TLND.EQ.1 ) THEN
  4358. ZL=ZNT
  4359. ! czil related changes for land
  4360. VISC=(1.32+0.009*(T1D-273.15))*1.E-5
  4361. RESTAR=UST*ZL/VISC
  4362. ! modify CZIL according to Chen & Zhang, 2009
  4363. CZIL = 10.0 ** ( -0.40 * ( ZL / 0.07 ) )
  4364. PSIT=GZ1OZ0-PSIH+CZIL*KARMAN*SQRT(RESTAR)
  4365. PSIQ=GZ1OZ0-PSIH+CZIL*KARMAN*SQRT(RESTAR)
  4366. PSIT2=GZ2OZ0-PSIH2+CZIL*KARMAN*SQRT(RESTAR)
  4367. PSIQ2=GZ2OZ0-PSIH2+CZIL*KARMAN*SQRT(RESTAR)
  4368. ENDIF
  4369. ENDIF
  4370. ! to prevent oscillations average with old value
  4371. UST=0.5*UST+0.5*KARMAN*WSPD/PSIX
  4372. UST=AMAX1(UST,0.1)
  4373. !jref: should this be converted to RMOL???
  4374. MOL=KARMAN*DTG/PSIT/PRT
  4375. DENOMQ=PSIQ
  4376. DENOMQ2=PSIQ2
  4377. DENOMT2=PSIT2
  4378. ! WRITE(*,*) "ILOC,JLOC=",ILOC,JLOC,"DENOMQ=",DENOMQ
  4379. ! WRITE(*,*) "UST=",UST,"PSIT=",PSIT
  4380. ! call wrf_error_fatal("stop in sfcdif4")
  4381. ! calculate exchange coefficients
  4382. !jref: start exchange coefficient for momentum
  4383. CM =KARMAN*KARMAN/(PSIX*PSIX)
  4384. !jref:end
  4385. CHS=UST*KARMAN/DENOMQ
  4386. ! GZ2OZ0=ALOG(2./ZNT)
  4387. ! PSIM2=-10.*GZ2OZ0
  4388. ! PSIM2=AMAX1(PSIM2,-10.)
  4389. ! PSIH2=PSIM2
  4390. CQS2=UST*KARMAN/DENOMQ2
  4391. CHS2=UST*KARMAN/DENOMT2
  4392. ! jref: in last iteration calculate diagnostics
  4393. U10=UX*PSIX10/PSIX
  4394. V10=VX*PSIX10/PSIX
  4395. ! jref: check the following for correct calculation
  4396. ! TH2=THGB+DTG*PSIT2/PSIT
  4397. ! Q2=QSFC+(QX-QSFC)*PSIQ2/PSIQ
  4398. ! T2 = TH2*(PSFCPA/P1000mb)**RCP
  4399. END SUBROUTINE SFCDIF4
  4400. !jref:end
  4401. ! ==================================================================================================
  4402. SUBROUTINE ESAT(T, ESW, ESI, DESW, DESI)
  4403. !---------------------------------------------------------------------------------------------------
  4404. ! use polynomials to calculate saturation vapor pressure and derivative with
  4405. ! respect to temperature: over water when t > 0 c and over ice when t <= 0 c
  4406. IMPLICIT NONE
  4407. !---------------------------------------------------------------------------------------------------
  4408. ! in
  4409. REAL, intent(in) :: T !temperature
  4410. !out
  4411. REAL, intent(out) :: ESW !saturation vapor pressure over water (pa)
  4412. REAL, intent(out) :: ESI !saturation vapor pressure over ice (pa)
  4413. REAL, intent(out) :: DESW !d(esat)/dt over water (pa/K)
  4414. REAL, intent(out) :: DESI !d(esat)/dt over ice (pa/K)
  4415. ! local
  4416. REAL :: A0,A1,A2,A3,A4,A5,A6 !coefficients for esat over water
  4417. REAL :: B0,B1,B2,B3,B4,B5,B6 !coefficients for esat over ice
  4418. REAL :: C0,C1,C2,C3,C4,C5,C6 !coefficients for dsat over water
  4419. REAL :: D0,D1,D2,D3,D4,D5,D6 !coefficients for dsat over ice
  4420. PARAMETER (A0=6.107799961 , A1=4.436518521E-01, &
  4421. A2=1.428945805E-02, A3=2.650648471E-04, &
  4422. A4=3.031240396E-06, A5=2.034080948E-08, &
  4423. A6=6.136820929E-11)
  4424. PARAMETER (B0=6.109177956 , B1=5.034698970E-01, &
  4425. B2=1.886013408E-02, B3=4.176223716E-04, &
  4426. B4=5.824720280E-06, B5=4.838803174E-08, &
  4427. B6=1.838826904E-10)
  4428. PARAMETER (C0= 4.438099984E-01, C1=2.857002636E-02, &
  4429. C2= 7.938054040E-04, C3=1.215215065E-05, &
  4430. C4= 1.036561403E-07, C5=3.532421810e-10, &
  4431. C6=-7.090244804E-13)
  4432. PARAMETER (D0=5.030305237E-01, D1=3.773255020E-02, &
  4433. D2=1.267995369E-03, D3=2.477563108E-05, &
  4434. D4=3.005693132E-07, D5=2.158542548E-09, &
  4435. D6=7.131097725E-12)
  4436. ESW = 100.*(A0+T*(A1+T*(A2+T*(A3+T*(A4+T*(A5+T*A6))))))
  4437. ESI = 100.*(B0+T*(B1+T*(B2+T*(B3+T*(B4+T*(B5+T*B6))))))
  4438. DESW = 100.*(C0+T*(C1+T*(C2+T*(C3+T*(C4+T*(C5+T*C6))))))
  4439. DESI = 100.*(D0+T*(D1+T*(D2+T*(D3+T*(D4+T*(D5+T*D6))))))
  4440. END SUBROUTINE ESAT
  4441. ! ==================================================================================================
  4442. ! ----------------------------------------------------------------------
  4443. SUBROUTINE STOMATA (VEGTYP ,MPE ,APAR ,FOLN ,ILOC , JLOC, & !in
  4444. TV ,EI ,EA ,SFCTMP ,SFCPRS , & !in
  4445. O2 ,CO2 ,IGS ,BTRAN ,RB , & !in
  4446. RS ,PSN ) !out
  4447. ! --------------------------------------------------------------------------------------------------
  4448. USE NOAHMP_VEG_PARAMETERS
  4449. ! --------------------------------------------------------------------------------------------------
  4450. IMPLICIT NONE
  4451. ! --------------------------------------------------------------------------------------------------
  4452. ! input
  4453. INTEGER,INTENT(IN) :: ILOC !grid index
  4454. INTEGER,INTENT(IN) :: JLOC !grid index
  4455. INTEGER,INTENT(IN) :: VEGTYP !vegetation physiology type
  4456. REAL, INTENT(IN) :: IGS !growing season index (0=off, 1=on)
  4457. REAL, INTENT(IN) :: MPE !prevents division by zero errors
  4458. REAL, INTENT(IN) :: TV !foliage temperature (k)
  4459. REAL, INTENT(IN) :: EI !vapor pressure inside leaf (sat vapor press at tv) (pa)
  4460. REAL, INTENT(IN) :: EA !vapor pressure of canopy air (pa)
  4461. REAL, INTENT(IN) :: APAR !par absorbed per unit lai (w/m2)
  4462. REAL, INTENT(IN) :: O2 !atmospheric o2 concentration (pa)
  4463. REAL, INTENT(IN) :: CO2 !atmospheric co2 concentration (pa)
  4464. REAL, INTENT(IN) :: SFCPRS !air pressure at reference height (pa)
  4465. REAL, INTENT(IN) :: SFCTMP !air temperature at reference height (k)
  4466. REAL, INTENT(IN) :: BTRAN !soil water transpiration factor (0 to 1)
  4467. REAL, INTENT(IN) :: FOLN !foliage nitrogen concentration (%)
  4468. REAL, INTENT(IN) :: RB !boundary layer resistance (s/m)
  4469. ! output
  4470. REAL, INTENT(OUT) :: RS !leaf stomatal resistance (s/m)
  4471. REAL, INTENT(OUT) :: PSN !foliage photosynthesis (umol co2 /m2/ s) [always +]
  4472. ! in&out
  4473. REAL :: RLB !boundary layer resistance (s m2 / umol)
  4474. ! ---------------------------------------------------------------------------------------------
  4475. ! ------------------------ local variables ----------------------------------------------------
  4476. INTEGER :: ITER !iteration index
  4477. INTEGER :: NITER !number of iterations
  4478. DATA NITER /3/
  4479. SAVE NITER
  4480. REAL :: AB !used in statement functions
  4481. REAL :: BC !used in statement functions
  4482. REAL :: F1 !generic temperature response (statement function)
  4483. REAL :: F2 !generic temperature inhibition (statement function)
  4484. REAL :: TC !foliage temperature (degree Celsius)
  4485. REAL :: CS !co2 concentration at leaf surface (pa)
  4486. REAL :: KC !co2 Michaelis-Menten constant (pa)
  4487. REAL :: KO !o2 Michaelis-Menten constant (pa)
  4488. REAL :: A,B,C,Q !intermediate calculations for RS
  4489. REAL :: R1,R2 !roots for RS
  4490. REAL :: FNF !foliage nitrogen adjustment factor (0 to 1)
  4491. REAL :: PPF !absorb photosynthetic photon flux (umol photons/m2/s)
  4492. REAL :: WC !Rubisco limited photosynthesis (umol co2/m2/s)
  4493. REAL :: WJ !light limited photosynthesis (umol co2/m2/s)
  4494. REAL :: WE !export limited photosynthesis (umol co2/m2/s)
  4495. REAL :: CP !co2 compensation point (pa)
  4496. REAL :: CI !internal co2 (pa)
  4497. REAL :: AWC !intermediate calculation for wc
  4498. REAL :: VCMX !maximum rate of carbonylation (umol co2/m2/s)
  4499. REAL :: J !electron transport (umol co2/m2/s)
  4500. REAL :: CEA !constrain ea or else model blows up
  4501. REAL :: CF !s m2/umol -> s/m
  4502. F1(AB,BC) = AB**((BC-25.)/10.)
  4503. F2(AB) = 1. + EXP((-2.2E05+710.*(AB+273.16))/(8.314*(AB+273.16)))
  4504. REAL :: T
  4505. ! ---------------------------------------------------------------------------------------------
  4506. ! initialize RS=RSMAX and PSN=0 because will only do calculations
  4507. ! for APAR > 0, in which case RS <= RSMAX and PSN >= 0
  4508. CF = SFCPRS/(8.314*SFCTMP)*1.e06
  4509. RS = 1./BP(VEGTYP) * CF
  4510. PSN = 0.
  4511. IF (APAR .LE. 0.) RETURN
  4512. FNF = MIN( FOLN/MAX(MPE,FOLNMX(VEGTYP)), 1.0 )
  4513. TC = TV-TFRZ
  4514. PPF = 4.6*APAR
  4515. J = PPF*QE25(VEGTYP)
  4516. KC = KC25(VEGTYP) * F1(AKC(VEGTYP),TC)
  4517. KO = KO25(VEGTYP) * F1(AKO(VEGTYP),TC)
  4518. AWC = KC * (1.+O2/KO)
  4519. CP = 0.5*KC/KO*O2*0.21
  4520. VCMX = VCMX25(VEGTYP) / F2(TC) * FNF * BTRAN * F1(AVCMX(VEGTYP),TC)
  4521. ! first guess ci
  4522. CI = 0.7*CO2*C3PSN(VEGTYP) + 0.4*CO2*(1.-C3PSN(VEGTYP))
  4523. ! rb: s/m -> s m**2 / umol
  4524. RLB = RB/CF
  4525. ! constrain ea
  4526. CEA = MAX(0.25*EI*C3PSN(VEGTYP)+0.40*EI*(1.-C3PSN(VEGTYP)), MIN(EA,EI) )
  4527. ! ci iteration
  4528. !jref: C3PSN is equal to 1 for all veg types.
  4529. DO ITER = 1, NITER
  4530. WJ = MAX(CI-CP,0.)*J/(CI+2.*CP)*C3PSN(VEGTYP) + J*(1.-C3PSN(VEGTYP))
  4531. WC = MAX(CI-CP,0.)*VCMX/(CI+AWC)*C3PSN(VEGTYP) + VCMX*(1.-C3PSN(VEGTYP))
  4532. WE = 0.5*VCMX*C3PSN(VEGTYP) + 4000.*VCMX*CI/SFCPRS*(1.-C3PSN(VEGTYP))
  4533. PSN = MIN(WJ,WC,WE) * IGS
  4534. CS = MAX( CO2-1.37*RLB*SFCPRS*PSN, MPE )
  4535. A = MP(VEGTYP)*PSN*SFCPRS*CEA / (CS*EI) + BP(VEGTYP)
  4536. B = ( MP(VEGTYP)*PSN*SFCPRS/CS + BP(VEGTYP) ) * RLB - 1.
  4537. C = -RLB
  4538. IF (B .GE. 0.) THEN
  4539. Q = -0.5*( B + SQRT(B*B-4.*A*C) )
  4540. ELSE
  4541. Q = -0.5*( B - SQRT(B*B-4.*A*C) )
  4542. END IF
  4543. R1 = Q/A
  4544. R2 = C/Q
  4545. RS = MAX(R1,R2)
  4546. CI = MAX( CS-PSN*SFCPRS*1.65*RS, 0. )
  4547. END DO
  4548. ! rs, rb: s m**2 / umol -> s/m
  4549. RS = RS*CF
  4550. END SUBROUTINE STOMATA
  4551. ! ==================================================================================================
  4552. SUBROUTINE CANRES (PAR ,SFCTMP,RCSOIL ,EAH ,SFCPRS , & !in
  4553. RC ,PSN ,ILOC ,JLOC ) !out
  4554. ! --------------------------------------------------------------------------------------------------
  4555. ! calculate canopy resistance which depends on incoming solar radiation,
  4556. ! air temperature, atmospheric water vapor pressure deficit at the
  4557. ! lowest model level, and soil moisture (preferably unfrozen soil
  4558. ! moisture rather than total)
  4559. ! --------------------------------------------------------------------------------------------------
  4560. ! source: Jarvis (1976), Noilhan and Planton (1989, MWR), Jacquemin and
  4561. ! Noilhan (1990, BLM). Chen et al (1996, JGR, Vol 101(D3), 7251-7268),
  4562. ! eqns 12-14 and table 2 of sec. 3.1.2
  4563. ! --------------------------------------------------------------------------------------------------
  4564. !niu USE module_Noahlsm_utility
  4565. ! --------------------------------------------------------------------------------------------------
  4566. IMPLICIT NONE
  4567. ! --------------------------------------------------------------------------------------------------
  4568. ! inputs
  4569. INTEGER, INTENT(IN) :: ILOC !grid index
  4570. INTEGER, INTENT(IN) :: JLOC !grid index
  4571. REAL, INTENT(IN) :: PAR !par absorbed per unit sunlit lai (w/m2)
  4572. REAL, INTENT(IN) :: SFCTMP !canopy air temperature
  4573. REAL, INTENT(IN) :: SFCPRS !surface pressure (pa)
  4574. REAL, INTENT(IN) :: EAH !water vapor pressure (pa)
  4575. REAL, INTENT(IN) :: RCSOIL !soil moisture stress factor
  4576. !outputs
  4577. REAL, INTENT(OUT) :: RC !canopy resistance per unit LAI
  4578. REAL, INTENT(OUT) :: PSN !foliage photosynthesis (umolco2/m2/s)
  4579. !local
  4580. REAL :: RCQ
  4581. REAL :: RCS
  4582. REAL :: RCT
  4583. REAL :: FF
  4584. REAL :: Q2 !water vapor mixing ratio (kg/kg)
  4585. REAL :: Q2SAT !saturation Q2
  4586. REAL :: DQSDT2 !d(Q2SAT)/d(T)
  4587. ! RSMIN, RSMAX, TOPT, RGL, HS are canopy stress parameters set in REDPRM
  4588. ! ----------------------------------------------------------------------
  4589. ! initialize canopy resistance multiplier terms.
  4590. ! ----------------------------------------------------------------------
  4591. RC = 0.0
  4592. RCS = 0.0
  4593. RCT = 0.0
  4594. RCQ = 0.0
  4595. ! compute Q2 and Q2SAT
  4596. Q2 = 0.622 * EAH / (SFCPRS - 0.378 * EAH) !specific humidity [kg/kg]
  4597. Q2 = Q2 / (1.0 + Q2) !mixing ratio [kg/kg]
  4598. CALL CALHUM(SFCTMP, SFCPRS, Q2SAT, DQSDT2)
  4599. ! contribution due to incoming solar radiation
  4600. FF = 2.0 * PAR / RGL
  4601. RCS = (FF + RSMIN / RSMAX) / (1.0+ FF)
  4602. RCS = MAX (RCS,0.0001)
  4603. ! contribution due to air temperature
  4604. RCT = 1.0- 0.0016* ( (TOPT - SFCTMP)**2.0)
  4605. RCT = MAX (RCT,0.0001)
  4606. ! contribution due to vapor pressure deficit
  4607. RCQ = 1.0/ (1.0+ HS * MAX(0.,Q2SAT-Q2))
  4608. RCQ = MAX (RCQ,0.01)
  4609. ! determine canopy resistance due to all factors
  4610. RC = RSMIN / (RCS * RCT * RCQ * RCSOIL)
  4611. PSN = -999.99 ! PSN not applied for dynamic carbon
  4612. END SUBROUTINE CANRES
  4613. ! ==================================================================================================
  4614. SUBROUTINE CALHUM(SFCTMP, SFCPRS, Q2SAT, DQSDT2)
  4615. IMPLICIT NONE
  4616. REAL, INTENT(IN) :: SFCTMP, SFCPRS
  4617. REAL, INTENT(OUT) :: Q2SAT, DQSDT2
  4618. REAL, PARAMETER :: A2=17.67,A3=273.15,A4=29.65, ELWV=2.501E6, &
  4619. A23M4=A2*(A3-A4), E0=0.611, RV=461.0, &
  4620. EPSILON=0.622
  4621. REAL :: ES, SFCPRSX
  4622. ! Q2SAT: saturated mixing ratio
  4623. ES = E0 * EXP ( ELWV/RV*(1./A3 - 1./SFCTMP) )
  4624. ! convert SFCPRS from Pa to KPa
  4625. SFCPRSX = SFCPRS*1.E-3
  4626. Q2SAT = EPSILON * ES / (SFCPRSX-ES)
  4627. ! convert from g/g to g/kg
  4628. Q2SAT = Q2SAT * 1.E3
  4629. ! Q2SAT is currently a 'mixing ratio'
  4630. ! DQSDT2 is calculated assuming Q2SAT is a specific humidity
  4631. DQSDT2=(Q2SAT/(1+Q2SAT))*A23M4/(SFCTMP-A4)**2
  4632. ! DG Q2SAT needs to be in g/g when returned for SFLX
  4633. Q2SAT = Q2SAT / 1.E3
  4634. END SUBROUTINE CALHUM
  4635. ! ==================================================================================================
  4636. SUBROUTINE TSNOSOI (ICE ,NSOIL ,NSNOW ,ISNOW ,IST , & !in
  4637. TBOT ,ZSNSO ,SSOIL ,DF ,HCPCT , & !in
  4638. ZBOT ,SAG ,DT ,SNOWH ,DZSNSO , & !in
  4639. TG ,ILOC ,JLOC , & !in
  4640. STC ) !inout
  4641. ! --------------------------------------------------------------------------------------------------
  4642. ! Compute snow (up to 3L) and soil (4L) temperature. Note that snow temperatures
  4643. ! during melting season may exceed melting point (TFRZ) but later in PHASECHANGE
  4644. ! subroutine the snow temperatures are reset to TFRZ for melting snow.
  4645. ! --------------------------------------------------------------------------------------------------
  4646. IMPLICIT NONE
  4647. ! --------------------------------------------------------------------------------------------------
  4648. !input
  4649. INTEGER, INTENT(IN) :: ILOC
  4650. INTEGER, INTENT(IN) :: JLOC
  4651. INTEGER, INTENT(IN) :: ICE !
  4652. INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4)
  4653. INTEGER, INTENT(IN) :: NSNOW !maximum no of snow layers (3)
  4654. INTEGER, INTENT(IN) :: ISNOW !actual no of snow layers
  4655. INTEGER, INTENT(IN) :: IST !surface type
  4656. REAL, INTENT(IN) :: DT !time step (s)
  4657. REAL, INTENT(IN) :: TBOT !
  4658. REAL, INTENT(IN) :: SSOIL !ground heat flux (w/m2)
  4659. REAL, INTENT(IN) :: SAG !solar rad. absorbed by ground (w/m2)
  4660. REAL, INTENT(IN) :: SNOWH !snow depth (m)
  4661. REAL, INTENT(IN) :: ZBOT !from soil surface (m)
  4662. REAL, INTENT(IN) :: TG !ground temperature (k)
  4663. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !layer-bot. depth from snow surf.(m)
  4664. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness (m)
  4665. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity
  4666. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity (J/m3/k)
  4667. !input and output
  4668. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC
  4669. !local
  4670. INTEGER :: IZ
  4671. REAL :: ZBOTSNO !ZBOT from snow surface
  4672. REAL, DIMENSION(-NSNOW+1:NSOIL) :: AI, BI, CI, RHSTS
  4673. REAL :: EFLXB !energy influx from soil bottom (w/m2)
  4674. REAL, DIMENSION(-NSNOW+1:NSOIL) :: PHI !light through water (w/m2)
  4675. REAL, DIMENSION(-NSNOW+1:NSOIL) :: TBEG
  4676. REAL :: ERR_EST !heat storage error (w/m2)
  4677. REAL :: SSOIL2 !ground heat flux (w/m2) (for energy check)
  4678. REAL :: EFLXB2 !heat flux from the bottom (w/m2) (for energy check)
  4679. character(len=256) :: message
  4680. ! ----------------------------------------------------------------------
  4681. ! compute solar penetration through water, needs more work
  4682. PHI(ISNOW+1:NSOIL) = 0.
  4683. ! adjust ZBOT from soil surface to ZBOTSNO from snow surface
  4684. ZBOTSNO = ZBOT - SNOWH !from snow surface
  4685. ! snow/soil heat storage for energy balance check
  4686. DO IZ = ISNOW+1, NSOIL
  4687. TBEG(IZ) = STC(IZ)
  4688. ENDDO
  4689. ! compute soil temperatures
  4690. CALL HRT (NSNOW ,NSOIL ,ISNOW ,ZSNSO , &
  4691. STC ,TBOT ,ZBOTSNO ,DT , &
  4692. DF ,HCPCT ,SSOIL ,PHI , &
  4693. AI ,BI ,CI ,RHSTS , &
  4694. EFLXB )
  4695. CALL HSTEP (NSNOW ,NSOIL ,ISNOW ,DT , &
  4696. AI ,BI ,CI ,RHSTS , &
  4697. STC )
  4698. ! update ground heat flux just for energy check, but not for final output
  4699. ! otherwise, it would break the surface energy balance
  4700. IF(OPT_TBOT == 1) THEN
  4701. EFLXB2 = 0.
  4702. ELSE IF(OPT_TBOT == 2) THEN
  4703. EFLXB2 = DF(NSOIL)*(TBOT-STC(NSOIL)) / &
  4704. (0.5*(ZSNSO(NSOIL-1)+ZSNSO(NSOIL)) - ZBOTSNO)
  4705. END IF
  4706. ! Skip the energy balance check for now, until we can make it work
  4707. ! right for small time steps.
  4708. return
  4709. ! energy balance check
  4710. ERR_EST = 0.0
  4711. DO IZ = ISNOW+1, NSOIL
  4712. ERR_EST = ERR_EST + (STC(IZ)-TBEG(IZ)) * DZSNSO(IZ) * HCPCT(IZ) / DT
  4713. ENDDO
  4714. if (OPT_STC == 1) THEN ! semi-implicit
  4715. ERR_EST = ERR_EST - (SSOIL +EFLXB)
  4716. ELSE ! full-implicit
  4717. SSOIL2 = DF(ISNOW+1)*(TG-STC(ISNOW+1))/(0.5*DZSNSO(ISNOW+1)) !M. Barlage
  4718. ERR_EST = ERR_EST - (SSOIL2+EFLXB2)
  4719. ENDIF
  4720. IF (ABS(ERR_EST) > 1.) THEN ! W/m2
  4721. WRITE(message,*) 'TSNOSOI is losing(-)/gaining(+) false energy',ERR_EST,' W/m2'
  4722. call wrf_message(trim(message))
  4723. WRITE(message,'(i6,1x,i6,1x,i3,F18.13,5F20.12)') &
  4724. ILOC, JLOC, IST,ERR_EST,SSOIL,SNOWH,TG,STC(ISNOW+1),EFLXB
  4725. call wrf_message(trim(message))
  4726. !niu STOP
  4727. END IF
  4728. END SUBROUTINE TSNOSOI
  4729. ! ==================================================================================================
  4730. ! ----------------------------------------------------------------------
  4731. SUBROUTINE HRT (NSNOW ,NSOIL ,ISNOW ,ZSNSO , &
  4732. STC ,TBOT ,ZBOT ,DT , &
  4733. DF ,HCPCT ,SSOIL ,PHI , &
  4734. AI ,BI ,CI ,RHSTS , &
  4735. BOTFLX )
  4736. ! ----------------------------------------------------------------------
  4737. ! ----------------------------------------------------------------------
  4738. ! calculate the right hand side of the time tendency term of the soil
  4739. ! thermal diffusion equation. also to compute ( prepare ) the matrix
  4740. ! coefficients for the tri-diagonal matrix of the implicit time scheme.
  4741. ! ----------------------------------------------------------------------
  4742. IMPLICIT NONE
  4743. ! ----------------------------------------------------------------------
  4744. ! input
  4745. INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4)
  4746. INTEGER, INTENT(IN) :: NSNOW !maximum no of snow layers (3)
  4747. INTEGER, INTENT(IN) :: ISNOW !actual no of snow layers
  4748. REAL, INTENT(IN) :: TBOT !bottom soil temp. at ZBOT (k)
  4749. REAL, INTENT(IN) :: ZBOT !depth of lower boundary condition (m)
  4750. !from soil surface not snow surface
  4751. REAL, INTENT(IN) :: DT !time step (s)
  4752. REAL, INTENT(IN) :: SSOIL !ground heat flux (w/m2)
  4753. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !depth of layer-bottom of snow/soil (m)
  4754. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature (k)
  4755. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity [w/m/k]
  4756. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity [j/m3/k]
  4757. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: PHI !light through water (w/m2)
  4758. ! output
  4759. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: RHSTS !right-hand side of the matrix
  4760. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: AI !left-hand side coefficient
  4761. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: BI !left-hand side coefficient
  4762. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: CI !left-hand side coefficient
  4763. REAL, INTENT(OUT) :: BOTFLX !energy influx from soil bottom (w/m2)
  4764. ! local
  4765. INTEGER :: K
  4766. REAL, DIMENSION(-NSNOW+1:NSOIL) :: DDZ
  4767. REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZ
  4768. REAL, DIMENSION(-NSNOW+1:NSOIL) :: DENOM
  4769. REAL, DIMENSION(-NSNOW+1:NSOIL) :: DTSDZ
  4770. REAL, DIMENSION(-NSNOW+1:NSOIL) :: EFLUX
  4771. REAL :: TEMP1
  4772. ! ----------------------------------------------------------------------
  4773. DO K = ISNOW+1, NSOIL
  4774. IF (K == ISNOW+1) THEN
  4775. DENOM(K) = - ZSNSO(K) * HCPCT(K)
  4776. TEMP1 = - ZSNSO(K+1)
  4777. DDZ(K) = 2.0 / TEMP1
  4778. DTSDZ(K) = 2.0 * (STC(K) - STC(K+1)) / TEMP1
  4779. EFLUX(K) = DF(K) * DTSDZ(K) - SSOIL - PHI(K)
  4780. ELSE IF (K < NSOIL) THEN
  4781. DENOM(K) = (ZSNSO(K-1) - ZSNSO(K)) * HCPCT(K)
  4782. TEMP1 = ZSNSO(K-1) - ZSNSO(K+1)
  4783. DDZ(K) = 2.0 / TEMP1
  4784. DTSDZ(K) = 2.0 * (STC(K) - STC(K+1)) / TEMP1
  4785. EFLUX(K) = (DF(K)*DTSDZ(K) - DF(K-1)*DTSDZ(K-1)) - PHI(K)
  4786. ELSE IF (K == NSOIL) THEN
  4787. DENOM(K) = (ZSNSO(K-1) - ZSNSO(K)) * HCPCT(K)
  4788. TEMP1 = ZSNSO(K-1) - ZSNSO(K)
  4789. IF(OPT_TBOT == 1) THEN
  4790. BOTFLX = 0.
  4791. END IF
  4792. IF(OPT_TBOT == 2) THEN
  4793. DTSDZ(K) = (STC(K) - TBOT) / ( 0.5*(ZSNSO(K-1)+ZSNSO(K)) - ZBOT)
  4794. BOTFLX = -DF(K) * DTSDZ(K)
  4795. END IF
  4796. EFLUX(K) = (-BOTFLX - DF(K-1)*DTSDZ(K-1) ) - PHI(K)
  4797. END IF
  4798. END DO
  4799. DO K = ISNOW+1, NSOIL
  4800. IF (K == ISNOW+1) THEN
  4801. AI(K) = 0.0
  4802. CI(K) = - DF(K) * DDZ(K) / DENOM(K)
  4803. IF (OPT_STC == 1) THEN
  4804. BI(K) = - CI(K)
  4805. END IF
  4806. IF (OPT_STC == 2) THEN
  4807. BI(K) = - CI(K) + DF(K)/(0.5*ZSNSO(K)*ZSNSO(K)*HCPCT(K))
  4808. END IF
  4809. ELSE IF (K < NSOIL) THEN
  4810. AI(K) = - DF(K-1) * DDZ(K-1) / DENOM(K)
  4811. CI(K) = - DF(K ) * DDZ(K ) / DENOM(K)
  4812. BI(K) = - (AI(K) + CI (K))
  4813. ELSE IF (K == NSOIL) THEN
  4814. AI(K) = - DF(K-1) * DDZ(K-1) / DENOM(K)
  4815. CI(K) = 0.0
  4816. BI(K) = - (AI(K) + CI(K))
  4817. END IF
  4818. RHSTS(K) = EFLUX(K)/ (-DENOM(K))
  4819. END DO
  4820. END SUBROUTINE HRT
  4821. ! ==================================================================================================
  4822. ! ----------------------------------------------------------------------
  4823. SUBROUTINE HSTEP (NSNOW ,NSOIL ,ISNOW ,DT , &
  4824. AI ,BI ,CI ,RHSTS , &
  4825. STC )
  4826. ! ----------------------------------------------------------------------
  4827. ! CALCULATE/UPDATE THE SOIL TEMPERATURE FIELD.
  4828. ! ----------------------------------------------------------------------
  4829. implicit none
  4830. ! ----------------------------------------------------------------------
  4831. ! input
  4832. INTEGER, INTENT(IN) :: NSOIL
  4833. INTEGER, INTENT(IN) :: NSNOW
  4834. INTEGER, INTENT(IN) :: ISNOW
  4835. REAL, INTENT(IN) :: DT
  4836. ! output & input
  4837. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: RHSTS
  4838. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: AI
  4839. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: BI
  4840. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: CI
  4841. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC
  4842. ! local
  4843. INTEGER :: K
  4844. REAL, DIMENSION(-NSNOW+1:NSOIL) :: RHSTSIN
  4845. REAL, DIMENSION(-NSNOW+1:NSOIL) :: CIIN
  4846. ! ----------------------------------------------------------------------
  4847. DO K = ISNOW+1,NSOIL
  4848. RHSTS(K) = RHSTS(K) * DT
  4849. AI(K) = AI(K) * DT
  4850. BI(K) = 1. + BI(K) * DT
  4851. CI(K) = CI(K) * DT
  4852. END DO
  4853. ! copy values for input variables before call to rosr12
  4854. DO K = ISNOW+1,NSOIL
  4855. RHSTSIN(K) = RHSTS(K)
  4856. CIIN(K) = CI(K)
  4857. END DO
  4858. ! solve the tri-diagonal matrix equation
  4859. CALL ROSR12 (CI,AI,BI,CIIN,RHSTSIN,RHSTS,ISNOW+1,NSOIL,NSNOW)
  4860. ! update snow & soil temperature
  4861. DO K = ISNOW+1,NSOIL
  4862. STC (K) = STC (K) + CI (K)
  4863. END DO
  4864. END SUBROUTINE HSTEP
  4865. ! ==================================================================================================
  4866. SUBROUTINE ROSR12 (P,A,B,C,D,DELTA,NTOP,NSOIL,NSNOW)
  4867. ! ----------------------------------------------------------------------
  4868. ! SUBROUTINE ROSR12
  4869. ! ----------------------------------------------------------------------
  4870. ! INVERT (SOLVE) THE TRI-DIAGONAL MATRIX PROBLEM SHOWN BELOW:
  4871. ! ### ### ### ### ### ###
  4872. ! #B(1), C(1), 0 , 0 , 0 , . . . , 0 # # # # #
  4873. ! #A(2), B(2), C(2), 0 , 0 , . . . , 0 # # # # #
  4874. ! # 0 , A(3), B(3), C(3), 0 , . . . , 0 # # # # D(3) #
  4875. ! # 0 , 0 , A(4), B(4), C(4), . . . , 0 # # P(4) # # D(4) #
  4876. ! # 0 , 0 , 0 , A(5), B(5), . . . , 0 # # P(5) # # D(5) #
  4877. ! # . . # # . # = # . #
  4878. ! # . . # # . # # . #
  4879. ! # . . # # . # # . #
  4880. ! # 0 , . . . , 0 , A(M-2), B(M-2), C(M-2), 0 # #P(M-2)# #D(M-2)#
  4881. ! # 0 , . . . , 0 , 0 , A(M-1), B(M-1), C(M-1)# #P(M-1)# #D(M-1)#
  4882. ! # 0 , . . . , 0 , 0 , 0 , A(M) , B(M) # # P(M) # # D(M) #
  4883. ! ### ### ### ### ### ###
  4884. ! ----------------------------------------------------------------------
  4885. IMPLICIT NONE
  4886. INTEGER, INTENT(IN) :: NTOP
  4887. INTEGER, INTENT(IN) :: NSOIL,NSNOW
  4888. INTEGER :: K, KK
  4889. REAL, DIMENSION(-NSNOW+1:NSOIL),INTENT(IN):: A, B, D
  4890. REAL, DIMENSION(-NSNOW+1:NSOIL),INTENT(INOUT):: C,P,DELTA
  4891. ! ----------------------------------------------------------------------
  4892. ! INITIALIZE EQN COEF C FOR THE LOWEST SOIL LAYER
  4893. ! ----------------------------------------------------------------------
  4894. C (NSOIL) = 0.0
  4895. P (NTOP) = - C (NTOP) / B (NTOP)
  4896. ! ----------------------------------------------------------------------
  4897. ! SOLVE THE COEFS FOR THE 1ST SOIL LAYER
  4898. ! ----------------------------------------------------------------------
  4899. DELTA (NTOP) = D (NTOP) / B (NTOP)
  4900. ! ----------------------------------------------------------------------
  4901. ! SOLVE THE COEFS FOR SOIL LAYERS 2 THRU NSOIL
  4902. ! ----------------------------------------------------------------------
  4903. DO K = NTOP+1,NSOIL
  4904. P (K) = - C (K) * ( 1.0 / (B (K) + A (K) * P (K -1)) )
  4905. DELTA (K) = (D (K) - A (K)* DELTA (K -1))* (1.0/ (B (K) + A (K)&
  4906. * P (K -1)))
  4907. END DO
  4908. ! ----------------------------------------------------------------------
  4909. ! SET P TO DELTA FOR LOWEST SOIL LAYER
  4910. ! ----------------------------------------------------------------------
  4911. P (NSOIL) = DELTA (NSOIL)
  4912. ! ----------------------------------------------------------------------
  4913. ! ADJUST P FOR SOIL LAYERS 2 THRU NSOIL
  4914. ! ----------------------------------------------------------------------
  4915. DO K = NTOP+1,NSOIL
  4916. KK = NSOIL - K + (NTOP-1) + 1
  4917. P (KK) = P (KK) * P (KK +1) + DELTA (KK)
  4918. END DO
  4919. ! ----------------------------------------------------------------------
  4920. END SUBROUTINE ROSR12
  4921. ! ----------------------------------------------------------------------
  4922. ! ==================================================================================================
  4923. SUBROUTINE PHASECHANGE (NSNOW ,NSOIL ,ISNOW ,DT ,FACT , & !in
  4924. DZSNSO ,HCPCT ,IST ,ILOC ,JLOC , & !in
  4925. STC ,SNICE ,SNLIQ ,SNEQV ,SNOWH , & !inout
  4926. SMC ,SH2O , & !inout
  4927. QMELT ,IMELT ,PONDING ) !out
  4928. ! ----------------------------------------------------------------------
  4929. ! melting/freezing of snow water and soil water
  4930. ! ----------------------------------------------------------------------
  4931. IMPLICIT NONE
  4932. ! ----------------------------------------------------------------------
  4933. ! inputs
  4934. INTEGER, INTENT(IN) :: ILOC !grid index
  4935. INTEGER, INTENT(IN) :: JLOC !grid index
  4936. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [=3]
  4937. INTEGER, INTENT(IN) :: NSOIL !No. of soil layers [=4]
  4938. INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers [<=3]
  4939. INTEGER, INTENT(IN) :: IST !surface type: 1->soil; 2->lake
  4940. REAL, INTENT(IN) :: DT !land model time step (sec)
  4941. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: FACT !temporary
  4942. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m]
  4943. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity (J/m3/k)
  4944. ! outputs
  4945. INTEGER, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: IMELT !phase change index
  4946. REAL, INTENT(OUT) :: QMELT !snowmelt rate [mm/s]
  4947. REAL, INTENT(OUT) :: PONDING!snowmelt when snow has no layer [mm]
  4948. ! inputs and outputs
  4949. REAL, INTENT(INOUT) :: SNEQV
  4950. REAL, INTENT(INOUT) :: SNOWH
  4951. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil layer temperature [k]
  4952. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water [m3/m3]
  4953. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !total soil water [m3/m3]
  4954. REAL, DIMENSION(-NSNOW+1:0) , INTENT(INOUT) :: SNICE !snow layer ice [mm]
  4955. REAL, DIMENSION(-NSNOW+1:0) , INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  4956. ! local
  4957. INTEGER :: J !do loop index
  4958. REAL, DIMENSION(-NSNOW+1:NSOIL) :: HM !energy residual [w/m2]
  4959. REAL, DIMENSION(-NSNOW+1:NSOIL) :: XM !melting or freezing water [kg/m2]
  4960. REAL, DIMENSION(-NSNOW+1:NSOIL) :: WMASS0
  4961. REAL, DIMENSION(-NSNOW+1:NSOIL) :: WICE0
  4962. REAL, DIMENSION(-NSNOW+1:NSOIL) :: WLIQ0
  4963. REAL, DIMENSION(-NSNOW+1:NSOIL) :: MICE !soil/snow ice mass [mm]
  4964. REAL, DIMENSION(-NSNOW+1:NSOIL) :: MLIQ !soil/snow liquid water mass [mm]
  4965. REAL, DIMENSION(-NSNOW+1:NSOIL) :: SUPERCOOL !supercooled water in soil (kg/m2)
  4966. REAL :: HEATR !energy residual or loss after melting/freezing
  4967. REAL :: TEMP1 !temporary variables [kg/m2]
  4968. REAL :: PROPOR
  4969. REAL :: SMP !frozen water potential (mm)
  4970. REAL :: XMF !total latent heat of phase change
  4971. ! ----------------------------------------------------------------------
  4972. ! Initialization
  4973. QMELT = 0.
  4974. PONDING = 0.
  4975. XMF = 0.
  4976. DO J = -NSNOW+1, NSOIL
  4977. SUPERCOOL(J) = 0.0
  4978. END DO
  4979. DO J = ISNOW+1,0 ! all layers
  4980. MICE(J) = SNICE(J)
  4981. MLIQ(J) = SNLIQ(J)
  4982. END DO
  4983. DO J = 1, NSOIL ! soil
  4984. MLIQ(J) = SH2O(J) * DZSNSO(J) * 1000.
  4985. MICE(J) = (SMC(J) - SH2O(J)) * DZSNSO(J) * 1000.
  4986. END DO
  4987. DO J = ISNOW+1,NSOIL ! all layers
  4988. IMELT(J) = 0
  4989. HM(J) = 0.
  4990. XM(J) = 0.
  4991. WICE0(J) = MICE(J)
  4992. WLIQ0(J) = MLIQ(J)
  4993. WMASS0(J) = MICE(J) + MLIQ(J)
  4994. ENDDO
  4995. if(ist == 1) then
  4996. DO J = 1,NSOIL
  4997. IF (OPT_FRZ == 1) THEN
  4998. IF(STC(J) < TFRZ) THEN
  4999. SMP = HFUS*(TFRZ-STC(J))/(GRAV*STC(J)) !(m)
  5000. SUPERCOOL(J) = SMCMAX*(SMP/PSISAT)**(-1./BEXP)
  5001. SUPERCOOL(J) = SUPERCOOL(J)*DZSNSO(J)*1000. !(mm)
  5002. END IF
  5003. END IF
  5004. IF (OPT_FRZ == 2) THEN
  5005. CALL FRH2O (SUPERCOOL(J),STC(J),SMC(J),SH2O(J))
  5006. SUPERCOOL(J) = SUPERCOOL(J)*DZSNSO(J)*1000. !(mm)
  5007. END IF
  5008. ENDDO
  5009. end if
  5010. DO J = ISNOW+1,NSOIL
  5011. IF (MICE(J) > 0. .AND. STC(J) >= TFRZ) THEN !melting
  5012. IMELT(J) = 1
  5013. ENDIF
  5014. IF (MLIQ(J) > SUPERCOOL(J) .AND. STC(J) < TFRZ) THEN
  5015. IMELT(J) = 2
  5016. ENDIF
  5017. ! If snow exists, but its thickness is not enough to create a layer
  5018. IF (ISNOW == 0 .AND. SNEQV > 0. .AND. J == 1) THEN
  5019. IF (STC(J) >= TFRZ) THEN
  5020. IMELT(J) = 1
  5021. ENDIF
  5022. ENDIF
  5023. ENDDO
  5024. ! Calculate the energy surplus and loss for melting and freezing
  5025. DO J = ISNOW+1,NSOIL
  5026. IF (IMELT(J) > 0) THEN
  5027. HM(J) = (STC(J)-TFRZ)/FACT(J)
  5028. STC(J) = TFRZ
  5029. ENDIF
  5030. IF (IMELT(J) == 1 .AND. HM(J) < 0.) THEN
  5031. HM(J) = 0.
  5032. IMELT(J) = 0
  5033. ENDIF
  5034. IF (IMELT(J) == 2 .AND. HM(J) > 0.) THEN
  5035. HM(J) = 0.
  5036. IMELT(J) = 0
  5037. ENDIF
  5038. XM(J) = HM(J)*DT/HFUS
  5039. ENDDO
  5040. ! The rate of melting and freezing for snow without a layer, needs more work.
  5041. IF (ISNOW == 0 .AND. SNEQV > 0. .AND. XM(1) > 0.) THEN
  5042. TEMP1 = SNEQV
  5043. SNEQV = MAX(0.,TEMP1-XM(1))
  5044. PROPOR = SNEQV/TEMP1
  5045. SNOWH = MAX(0.,PROPOR * SNOWH)
  5046. HEATR = HM(1) - HFUS*(TEMP1-SNEQV)/DT
  5047. IF (HEATR > 0.) THEN
  5048. XM(1) = HEATR*DT/HFUS
  5049. HM(1) = HEATR
  5050. ELSE
  5051. XM(1) = 0.
  5052. HM(1) = 0.
  5053. ENDIF
  5054. QMELT = MAX(0.,(TEMP1-SNEQV))/DT
  5055. XMF = HFUS*QMELT
  5056. PONDING = TEMP1-SNEQV
  5057. ENDIF
  5058. ! The rate of melting and freezing for snow and soil
  5059. DO J = ISNOW+1,NSOIL
  5060. IF (IMELT(J) > 0 .AND. ABS(HM(J)) > 0.) THEN
  5061. HEATR = 0.
  5062. IF (XM(J) > 0.) THEN
  5063. MICE(J) = MAX(0., WICE0(J)-XM(J))
  5064. HEATR = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT
  5065. ELSE IF (XM(J) < 0.) THEN
  5066. IF (J <= 0) THEN ! snow
  5067. MICE(J) = MIN(WMASS0(J), WICE0(J)-XM(J))
  5068. ELSE ! soil
  5069. IF (WMASS0(J) < SUPERCOOL(J)) THEN
  5070. MICE(J) = 0.
  5071. ELSE
  5072. MICE(J) = MIN(WMASS0(J) - SUPERCOOL(J),WICE0(J)-XM(J))
  5073. MICE(J) = MAX(MICE(J),0.0)
  5074. ENDIF
  5075. ENDIF
  5076. HEATR = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT
  5077. ENDIF
  5078. MLIQ(J) = MAX(0.,WMASS0(J)-MICE(J))
  5079. IF (ABS(HEATR) > 0.) THEN
  5080. STC(J) = STC(J) + FACT(J)*HEATR
  5081. IF (J <= 0) THEN ! snow
  5082. IF (MLIQ(J)*MICE(J)>0.) STC(J) = TFRZ
  5083. END IF
  5084. ENDIF
  5085. XMF = XMF + HFUS * (WICE0(J)-MICE(J))/DT
  5086. IF (J < 1) THEN
  5087. QMELT = QMELT + MAX(0.,(WICE0(J)-MICE(J)))/DT
  5088. ENDIF
  5089. ENDIF
  5090. ENDDO
  5091. DO J = ISNOW+1,0 ! snow
  5092. SNLIQ(J) = MLIQ(J)
  5093. SNICE(J) = MICE(J)
  5094. END DO
  5095. DO J = 1, NSOIL ! soil
  5096. SH2O(J) = MLIQ(J) / (1000. * DZSNSO(J))
  5097. SMC(J) = (MLIQ(J) + MICE(J)) / (1000. * DZSNSO(J))
  5098. END DO
  5099. END SUBROUTINE PHASECHANGE
  5100. ! ==================================================================================================
  5101. SUBROUTINE FRH2O (FREE,TKELV,SMC,SH2O)
  5102. ! ----------------------------------------------------------------------
  5103. ! SUBROUTINE FRH2O
  5104. ! ----------------------------------------------------------------------
  5105. ! CALCULATE AMOUNT OF SUPERCOOLED LIQUID SOIL WATER CONTENT IF
  5106. ! TEMPERATURE IS BELOW 273.15K (TFRZ). REQUIRES NEWTON-TYPE ITERATION
  5107. ! TO SOLVE THE NONLINEAR IMPLICIT EQUATION GIVEN IN EQN 17 OF KOREN ET AL
  5108. ! (1999, JGR, VOL 104(D16), 19569-19585).
  5109. ! ----------------------------------------------------------------------
  5110. ! NEW VERSION (JUNE 2001): MUCH FASTER AND MORE ACCURATE NEWTON
  5111. ! ITERATION ACHIEVED BY FIRST TAKING LOG OF EQN CITED ABOVE -- LESS THAN
  5112. ! 4 (TYPICALLY 1 OR 2) ITERATIONS ACHIEVES CONVERGENCE. ALSO, EXPLICIT
  5113. ! 1-STEP SOLUTION OPTION FOR SPECIAL CASE OF PARAMETER CK=0, WHICH
  5114. ! REDUCES THE ORIGINAL IMPLICIT EQUATION TO A SIMPLER EXPLICIT FORM,
  5115. ! KNOWN AS THE "FLERCHINGER EQN". IMPROVED HANDLING OF SOLUTION IN THE
  5116. ! LIMIT OF FREEZING POINT TEMPERATURE TFRZ.
  5117. ! ----------------------------------------------------------------------
  5118. ! INPUT:
  5119. ! TKELV.........TEMPERATURE (Kelvin)
  5120. ! SMC...........TOTAL SOIL MOISTURE CONTENT (VOLUMETRIC)
  5121. ! SH2O..........LIQUID SOIL MOISTURE CONTENT (VOLUMETRIC)
  5122. ! B.............SOIL TYPE "B" PARAMETER (FROM REDPRM)
  5123. ! PSISAT........SATURATED SOIL MATRIC POTENTIAL (FROM REDPRM)
  5124. ! OUTPUT:
  5125. ! FREE..........SUPERCOOLED LIQUID WATER CONTENT [m3/m3]
  5126. ! ----------------------------------------------------------------------
  5127. IMPLICIT NONE
  5128. REAL, INTENT(IN) :: SH2O,SMC,TKELV
  5129. REAL, INTENT(OUT) :: FREE
  5130. REAL :: BX,DENOM,DF,DSWL,FK,SWL,SWLK
  5131. INTEGER :: NLOG,KCOUNT
  5132. ! PARAMETER(CK = 0.0)
  5133. REAL, PARAMETER :: CK = 8.0, BLIM = 5.5, ERROR = 0.005, &
  5134. DICE = 920.0
  5135. CHARACTER(LEN=80) :: message
  5136. ! ----------------------------------------------------------------------
  5137. ! LIMITS ON PARAMETER B: B < 5.5 (use parameter BLIM)
  5138. ! SIMULATIONS SHOWED IF B > 5.5 UNFROZEN WATER CONTENT IS
  5139. ! NON-REALISTICALLY HIGH AT VERY LOW TEMPERATURES.
  5140. ! ----------------------------------------------------------------------
  5141. BX = BEXP
  5142. ! ----------------------------------------------------------------------
  5143. ! INITIALIZING ITERATIONS COUNTER AND ITERATIVE SOLUTION FLAG.
  5144. ! ----------------------------------------------------------------------
  5145. IF (BEXP > BLIM) BX = BLIM
  5146. NLOG = 0
  5147. ! ----------------------------------------------------------------------
  5148. ! IF TEMPERATURE NOT SIGNIFICANTLY BELOW FREEZING (TFRZ), SH2O = SMC
  5149. ! ----------------------------------------------------------------------
  5150. KCOUNT = 0
  5151. IF (TKELV > (TFRZ- 1.E-3)) THEN
  5152. FREE = SMC
  5153. ELSE
  5154. ! ----------------------------------------------------------------------
  5155. ! OPTION 1: ITERATED SOLUTION IN KOREN ET AL, JGR, 1999, EQN 17
  5156. ! ----------------------------------------------------------------------
  5157. ! INITIAL GUESS FOR SWL (frozen content)
  5158. ! ----------------------------------------------------------------------
  5159. IF (CK /= 0.0) THEN
  5160. SWL = SMC - SH2O
  5161. ! ----------------------------------------------------------------------
  5162. ! KEEP WITHIN BOUNDS.
  5163. ! ----------------------------------------------------------------------
  5164. IF (SWL > (SMC -0.02)) SWL = SMC -0.02
  5165. ! ----------------------------------------------------------------------
  5166. ! START OF ITERATIONS
  5167. ! ----------------------------------------------------------------------
  5168. IF (SWL < 0.) SWL = 0.
  5169. 1001 Continue
  5170. IF (.NOT.( (NLOG < 10) .AND. (KCOUNT == 0))) goto 1002
  5171. NLOG = NLOG +1
  5172. DF = ALOG ( ( PSISAT * GRAV / hfus ) * ( ( 1. + CK * SWL )**2.) * &
  5173. ( SMCMAX / (SMC - SWL) )** BX) - ALOG ( - ( &
  5174. TKELV - TFRZ)/ TKELV)
  5175. DENOM = 2. * CK / ( 1. + CK * SWL ) + BX / ( SMC - SWL )
  5176. SWLK = SWL - DF / DENOM
  5177. ! ----------------------------------------------------------------------
  5178. ! BOUNDS USEFUL FOR MATHEMATICAL SOLUTION.
  5179. ! ----------------------------------------------------------------------
  5180. IF (SWLK > (SMC -0.02)) SWLK = SMC - 0.02
  5181. IF (SWLK < 0.) SWLK = 0.
  5182. ! ----------------------------------------------------------------------
  5183. ! MATHEMATICAL SOLUTION BOUNDS APPLIED.
  5184. ! ----------------------------------------------------------------------
  5185. DSWL = ABS (SWLK - SWL)
  5186. ! IF MORE THAN 10 ITERATIONS, USE EXPLICIT METHOD (CK=0 APPROX.)
  5187. ! WHEN DSWL LESS OR EQ. ERROR, NO MORE ITERATIONS REQUIRED.
  5188. ! ----------------------------------------------------------------------
  5189. SWL = SWLK
  5190. IF ( DSWL <= ERROR ) THEN
  5191. KCOUNT = KCOUNT +1
  5192. END IF
  5193. ! ----------------------------------------------------------------------
  5194. ! END OF ITERATIONS
  5195. ! ----------------------------------------------------------------------
  5196. ! BOUNDS APPLIED WITHIN DO-BLOCK ARE VALID FOR PHYSICAL SOLUTION.
  5197. ! ----------------------------------------------------------------------
  5198. goto 1001
  5199. 1002 continue
  5200. FREE = SMC - SWL
  5201. END IF
  5202. ! ----------------------------------------------------------------------
  5203. ! END OPTION 1
  5204. ! ----------------------------------------------------------------------
  5205. ! ----------------------------------------------------------------------
  5206. ! OPTION 2: EXPLICIT SOLUTION FOR FLERCHINGER EQ. i.e. CK=0
  5207. ! IN KOREN ET AL., JGR, 1999, EQN 17
  5208. ! APPLY PHYSICAL BOUNDS TO FLERCHINGER SOLUTION
  5209. ! ----------------------------------------------------------------------
  5210. IF (KCOUNT == 0) THEN
  5211. write(message, '("Flerchinger used in NEW version. Iterations=", I6)') NLOG
  5212. call wrf_message(trim(message))
  5213. FK = ( ( (hfus / (GRAV * ( - PSISAT)))* &
  5214. ( (TKELV - TFRZ)/ TKELV))** ( -1/ BX))* SMCMAX
  5215. IF (FK < 0.02) FK = 0.02
  5216. FREE = MIN (FK, SMC)
  5217. ! ----------------------------------------------------------------------
  5218. ! END OPTION 2
  5219. ! ----------------------------------------------------------------------
  5220. END IF
  5221. END IF
  5222. ! ----------------------------------------------------------------------
  5223. END SUBROUTINE FRH2O
  5224. ! ----------------------------------------------------------------------
  5225. ! ==================================================================================================
  5226. ! **********************End of energy subroutines***********************
  5227. ! ==================================================================================================
  5228. SUBROUTINE WATER (VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & !in
  5229. VV ,FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in
  5230. ESAI ,SFCTMP ,QVAP ,QDEW ,ZSOIL ,BTRANI , & !in
  5231. FICEOLD,PONDING,TG ,IST ,FVEG ,ILOC ,JLOC , & !in
  5232. ISNOW ,CANLIQ ,CANICE ,TV ,SNOWH ,SNEQV , & !inout
  5233. SNICE ,SNLIQ ,STC ,ZSNSO ,SH2O ,SMC , & !inout
  5234. SICE ,ZWT ,WA ,WT ,DZSNSO ,WSLAKE , & !inout
  5235. CMC ,ECAN ,ETRAN ,FWET ,RUNSRF ,RUNSUB , & !out
  5236. QIN ,QDIS ,QSNOW ,PONDING1 ,PONDING2,&
  5237. ISURBAN) !out
  5238. ! ----------------------------------------------------------------------
  5239. ! Code history:
  5240. ! Initial code: Guo-Yue Niu, Oct. 2007
  5241. ! ----------------------------------------------------------------------
  5242. implicit none
  5243. ! ----------------------------------------------------------------------
  5244. ! input
  5245. INTEGER, INTENT(IN) :: ILOC !grid index
  5246. INTEGER, INTENT(IN) :: JLOC !grid index
  5247. INTEGER, INTENT(IN) :: VEGTYP !vegetation type
  5248. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  5249. INTEGER , INTENT(IN) :: IST !surface type 1-soil; 2-lake
  5250. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  5251. INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [1-melt; 2-freeze]
  5252. REAL, INTENT(IN) :: DT !main time step (s)
  5253. REAL, INTENT(IN) :: UU !u-direction wind speed [m/s]
  5254. REAL, INTENT(IN) :: VV !v-direction wind speed [m/s]
  5255. REAL, INTENT(IN) :: FCEV !canopy evaporation (w/m2) [+ to atm ]
  5256. REAL, INTENT(IN) :: FCTR !transpiration (w/m2) [+ to atm]
  5257. REAL, INTENT(IN) :: QPRECC !convective precipitation (mm/s)
  5258. REAL, INTENT(IN) :: QPRECL !large-scale precipitation (mm/s)
  5259. REAL, INTENT(IN) :: ELAI !leaf area index, after burying by snow
  5260. REAL, INTENT(IN) :: ESAI !stem area index, after burying by snow
  5261. REAL, INTENT(IN) :: SFCTMP !surface air temperature [k]
  5262. REAL, INTENT(IN) :: QVAP !soil surface evaporation rate[mm/s]
  5263. REAL, INTENT(IN) :: QDEW !soil surface dew rate[mm/s]
  5264. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil surface
  5265. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: BTRANI !soil water stress factor (0 to 1)
  5266. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD !ice fraction at last timestep
  5267. ! REAL , INTENT(IN) :: PONDING ![mm]
  5268. REAL , INTENT(IN) :: TG !ground temperature (k)
  5269. REAL , INTENT(IN) :: FVEG !greeness vegetation fraction (-)
  5270. ! input/output
  5271. INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers
  5272. REAL, INTENT(INOUT) :: CANLIQ !intercepted liquid water (mm)
  5273. REAL, INTENT(INOUT) :: CANICE !intercepted ice mass (mm)
  5274. REAL, INTENT(INOUT) :: TV !vegetation temperature (k)
  5275. REAL, INTENT(INOUT) :: SNOWH !snow height [m]
  5276. REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm]
  5277. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm]
  5278. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  5279. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil layer temperature [k]
  5280. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !depth of snow/soil layer-bottom
  5281. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !snow/soil layer thickness [m]
  5282. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water content [m3/m3]
  5283. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice content [m3/m3]
  5284. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !total soil water content [m3/m3]
  5285. REAL, INTENT(INOUT) :: ZWT !the depth to water table [m]
  5286. REAL, INTENT(INOUT) :: WA !water storage in aquifer [mm]
  5287. REAL, INTENT(INOUT) :: WT !water storage in aquifer
  5288. !+ stuarated soil [mm]
  5289. REAL, INTENT(INOUT) :: WSLAKE !water storage in lake (can be -) (mm)
  5290. REAL , INTENT(INOUT) :: PONDING ![mm]
  5291. ! output
  5292. REAL, INTENT(OUT) :: CMC !intercepted water per ground area (mm)
  5293. REAL, INTENT(OUT) :: ECAN !evap of intercepted water (mm/s) [+]
  5294. REAL, INTENT(OUT) :: ETRAN !transpiration rate (mm/s) [+]
  5295. REAL, INTENT(OUT) :: FWET !wetted/snowed fraction of canopy (-)
  5296. REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm/s]
  5297. REAL, INTENT(OUT) :: RUNSUB !baseflow (sturation excess) [mm/s]
  5298. REAL, INTENT(OUT) :: QIN !groundwater recharge [mm/s]
  5299. REAL, INTENT(OUT) :: QDIS !groundwater discharge [mm/s]
  5300. REAL, INTENT(OUT) :: QSNOW !snow at ground srf (mm/s) [+]
  5301. REAL, INTENT(OUT) :: PONDING1
  5302. REAL, INTENT(OUT) :: PONDING2
  5303. INTEGER, INTENT(IN) :: ISURBAN
  5304. ! local
  5305. INTEGER :: IZ
  5306. REAL :: QINSUR !water input on soil surface [m/s]
  5307. REAL :: QRAIN !rain at ground srf (mm) [+]
  5308. REAL :: QSNBOT !melting water out of snow bottom [mm/s]
  5309. REAL :: QSEVA !soil surface evap rate [mm/s]
  5310. REAL :: QSDEW !soil surface dew rate [mm/s]
  5311. REAL :: QSNFRO !snow surface frost rate[mm/s]
  5312. REAL :: QSNSUB !snow surface sublimation rate [mm/s]
  5313. REAL :: SNOWHIN !snow depth increasing rate (m/s)
  5314. REAL, DIMENSION( 1:NSOIL) :: ETRANI !transpiration rate (mm/s) [+]
  5315. REAL, DIMENSION( 1:NSOIL) :: WCND !hydraulic conductivity (m/s)
  5316. REAL :: QDRAIN !soil-bottom free drainage [mm/s]
  5317. REAL :: SNOFLOW !glacier flow [mm/s]
  5318. REAL :: FCRMAX !maximum of FCR (-)
  5319. REAL, PARAMETER :: WSLMAX = 5000. !maximum lake water storage (mm)
  5320. ! ----------------------------------------------------------------------
  5321. ! initialize
  5322. ETRANI(1:NSOIL) = 0.
  5323. SNOFLOW = 0.
  5324. RUNSUB = 0.
  5325. QINSUR = 0.
  5326. ! canopy-intercepted snowfall/rainfall, drips, and throughfall
  5327. CALL CANWATER (VEGTYP ,DT ,SFCTMP ,UU ,VV , & !in
  5328. FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in
  5329. ESAI ,IST ,TG ,FVEG ,ILOC , JLOC, & !in
  5330. CANLIQ ,CANICE ,TV , & !inout
  5331. CMC ,ECAN ,ETRAN ,QRAIN ,QSNOW , & !out
  5332. SNOWHIN,FWET ) !out
  5333. ! sublimation, frost, evaporation, and dew
  5334. QSNSUB = 0.
  5335. IF (SNEQV > 0.) THEN
  5336. QSNSUB = MIN(QVAP, SNEQV/DT)
  5337. ENDIF
  5338. QSEVA = QVAP-QSNSUB
  5339. QSNFRO = 0.
  5340. IF (SNEQV > 0.) THEN
  5341. QSNFRO = QDEW
  5342. ENDIF
  5343. QSDEW = QDEW - QSNFRO
  5344. CALL SNOWWATER (NSNOW ,NSOIL ,IMELT ,DT ,ZSOIL , & !in
  5345. & SFCTMP ,SNOWHIN,QSNOW ,QSNFRO ,QSNSUB , & !in
  5346. & QRAIN ,FICEOLD,ILOC ,JLOC , & !in
  5347. & ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ , & !inout
  5348. & SH2O ,SICE ,STC ,ZSNSO ,DZSNSO , & !inout
  5349. & QSNBOT ,SNOFLOW,PONDING1 ,PONDING2) !out
  5350. ! convert units (mm/s -> m/s)
  5351. !PONDING: melting water from snow when there is no layer
  5352. QINSUR = (PONDING+PONDING1+PONDING2)/DT * 0.001
  5353. ! QINSUR = PONDING/DT * 0.001
  5354. IF(ISNOW == 0) THEN
  5355. QINSUR = QINSUR+(QSNBOT + QSDEW + QRAIN) * 0.001
  5356. ELSE
  5357. QINSUR = QINSUR+(QSNBOT + QSDEW) * 0.001
  5358. ENDIF
  5359. QSEVA = QSEVA * 0.001
  5360. DO IZ = 1, NROOT
  5361. ETRANI(IZ) = ETRAN * BTRANI(IZ) * 0.001
  5362. ENDDO
  5363. ! lake/soil water balances
  5364. IF (IST == 2) THEN ! lake
  5365. RUNSRF = 0.
  5366. IF(WSLAKE >= WSLMAX) RUNSRF = QINSUR*1000. !mm/s
  5367. WSLAKE = WSLAKE + (QINSUR-QSEVA)*1000.*DT -RUNSRF*DT !mm
  5368. ELSE ! soil
  5369. CALL SOILWATER (NSOIL ,NSNOW ,DT ,ZSOIL ,DZSNSO , & !in
  5370. QINSUR ,QSEVA ,ETRANI ,SICE ,ILOC , JLOC , & !in
  5371. SH2O ,SMC ,ZWT ,VEGTYP ,ISURBAN, & !inout
  5372. RUNSRF ,QDRAIN ,RUNSUB ,WCND ,FCRMAX ) !out
  5373. IF(OPT_RUN == 1) THEN
  5374. CALL GROUNDWATER (NSNOW ,NSOIL ,DT ,SICE ,ZSOIL , & !in
  5375. STC ,WCND ,FCRMAX ,ILOC ,JLOC , & !in
  5376. SH2O ,ZWT ,WA ,WT , & !inout
  5377. QIN ,QDIS ) !out
  5378. RUNSUB = QDIS !mm/s
  5379. END IF
  5380. IF(OPT_RUN == 3 .or. OPT_RUN == 4) THEN
  5381. RUNSUB = RUNSUB + QDRAIN !mm/s
  5382. END IF
  5383. DO IZ = 1,NSOIL
  5384. SMC(IZ) = SH2O(IZ) + SICE(IZ)
  5385. ENDDO
  5386. ENDIF
  5387. RUNSUB = RUNSUB + SNOFLOW !mm/s
  5388. END SUBROUTINE WATER
  5389. ! ==================================================================================================
  5390. SUBROUTINE CANWATER (VEGTYP ,DT ,SFCTMP ,UU ,VV , & !in
  5391. FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in
  5392. ESAI ,IST ,TG ,FVEG ,ILOC , JLOC , & !in
  5393. CANLIQ ,CANICE ,TV , & !inout
  5394. CMC ,ECAN ,ETRAN ,QRAIN ,QSNOW , & !out
  5395. SNOWHIN,FWET ) !out
  5396. ! ------------------------ code history ------------------------------
  5397. ! canopy hydrology
  5398. ! --------------------------------------------------------------------
  5399. USE NOAHMP_VEG_PARAMETERS
  5400. ! --------------------------------------------------------------------
  5401. IMPLICIT NONE
  5402. ! ------------------------ input/output variables --------------------
  5403. ! input
  5404. INTEGER,INTENT(IN) :: ILOC !grid index
  5405. INTEGER,INTENT(IN) :: JLOC !grid index
  5406. INTEGER,INTENT(IN) :: VEGTYP !vegetation type
  5407. REAL, INTENT(IN) :: DT !main time step (s)
  5408. REAL, INTENT(IN) :: SFCTMP !air temperature (k)
  5409. REAL, INTENT(IN) :: UU !u-direction wind speed [m/s]
  5410. REAL, INTENT(IN) :: VV !v-direction wind speed [m/s]
  5411. REAL, INTENT(IN) :: FCEV !canopy evaporation (w/m2) [+ = to atm]
  5412. REAL, INTENT(IN) :: FCTR !transpiration (w/m2) [+ = to atm]
  5413. REAL, INTENT(IN) :: QPRECC !convective precipitation (mm/s)
  5414. REAL, INTENT(IN) :: QPRECL !large-scale precipitation (mm/s)
  5415. REAL, INTENT(IN) :: ELAI !leaf area index, after burying by snow
  5416. REAL, INTENT(IN) :: ESAI !stem area index, after burying by snow
  5417. INTEGER,INTENT(IN) :: IST !surface type 1-soil; 2-lake
  5418. REAL, INTENT(IN) :: TG !ground temperature (k)
  5419. REAL, INTENT(IN) :: FVEG !greeness vegetation fraction (-)
  5420. ! input & output
  5421. REAL, INTENT(INOUT) :: CANLIQ !intercepted liquid water (mm)
  5422. REAL, INTENT(INOUT) :: CANICE !intercepted ice mass (mm)
  5423. REAL, INTENT(INOUT) :: TV !vegetation temperature (k)
  5424. ! output
  5425. REAL, INTENT(OUT) :: CMC !intercepted water (mm)
  5426. REAL, INTENT(OUT) :: ECAN !evaporation of intercepted water (mm/s) [+]
  5427. REAL, INTENT(OUT) :: ETRAN !transpiration rate (mm/s) [+]
  5428. REAL, INTENT(OUT) :: QRAIN !rain at ground srf (mm/s) [+]
  5429. REAL, INTENT(OUT) :: QSNOW !snow at ground srf (mm/s) [+]
  5430. REAL, INTENT(OUT) :: SNOWHIN !snow depth increasing rate (m/s)
  5431. REAL, INTENT(OUT) :: FWET !wetted or snowed fraction of the canopy (-)
  5432. ! --------------------------------------------------------------------
  5433. ! ------------------------ local variables ---------------------------
  5434. REAL :: MAXSNO !canopy capacity for snow interception (mm)
  5435. REAL :: MAXLIQ !canopy capacity for rain interception (mm)
  5436. REAL :: FP !fraction of the gridcell that receives precipitation
  5437. REAL :: FPICE !snow fraction in precipitation
  5438. REAL :: BDFALL !bulk density of snowfall (kg/m3)
  5439. REAL :: QINTR !interception rate for rain (mm/s)
  5440. REAL :: QDRIPR !drip rate for rain (mm/s)
  5441. REAL :: QTHROR !throughfall for rain (mm/s)
  5442. REAL :: QINTS !interception (loading) rate for snowfall (mm/s)
  5443. REAL :: QDRIPS !drip (unloading) rate for intercepted snow (mm/s)
  5444. REAL :: QTHROS !throughfall of snowfall (mm/s)
  5445. REAL :: QEVAC !evaporation rate (mm/s)
  5446. REAL :: QDEWC !dew rate (mm/s)
  5447. REAL :: QFROC !frost rate (mm/s)
  5448. REAL :: QSUBC !sublimation rate (mm/s)
  5449. REAL :: FT !temperature factor for unloading rate
  5450. REAL :: FV !wind factor for unloading rate
  5451. REAL :: QMELTC !melting rate of canopy snow (mm/s)
  5452. REAL :: QFRZC !refreezing rate of canopy liquid water (mm/s)
  5453. REAL :: RAIN !rainfall (mm/s)
  5454. REAL :: SNOW !snowfall (mm/s)
  5455. REAL :: CANMAS !total canopy mass (kg/m2)
  5456. ! --------------------------------------------------------------------
  5457. ! initialization
  5458. FP = 0.0
  5459. RAIN = 0.0
  5460. SNOW = 0.0
  5461. QINTR = 0.
  5462. QDRIPR = 0.
  5463. QTHROR = 0.
  5464. QINTR = 0.
  5465. QINTS = 0.
  5466. QDRIPS = 0.0
  5467. QTHROS = 0.
  5468. QRAIN = 0.0
  5469. QSNOW = 0.0
  5470. SNOWHIN = 0.0
  5471. ECAN = 0.0
  5472. ! --------------------------------------------------------------------
  5473. ! partition precipitation into rain and snow.
  5474. ! Jordan (1991)
  5475. IF(OPT_SNF == 1) THEN
  5476. IF(SFCTMP > TFRZ+2.5)THEN
  5477. FPICE = 0.
  5478. ELSE
  5479. IF(SFCTMP <= TFRZ+0.5)THEN
  5480. FPICE = 1.0
  5481. ELSE IF(SFCTMP <= TFRZ+2.)THEN
  5482. FPICE = 1.-(-54.632 + 0.2*SFCTMP)
  5483. ELSE
  5484. FPICE = 0.6
  5485. ENDIF
  5486. ENDIF
  5487. ENDIF
  5488. IF(OPT_SNF == 2) THEN
  5489. IF(SFCTMP >= TFRZ+2.2) THEN
  5490. FPICE = 0.
  5491. ELSE
  5492. FPICE = 1.0
  5493. ENDIF
  5494. ENDIF
  5495. IF(OPT_SNF == 3) THEN
  5496. IF(SFCTMP >= TFRZ) THEN
  5497. FPICE = 0.
  5498. ELSE
  5499. FPICE = 1.0
  5500. ENDIF
  5501. ENDIF
  5502. ! Hedstrom NR and JW Pomeroy (1998), Hydrol. Processes, 12, 1611-1625
  5503. ! fresh snow density
  5504. BDFALL = MAX(120.,67.92+51.25*EXP((SFCTMP-TFRZ)/2.59))
  5505. RAIN = (QPRECC + QPRECL) * (1.-FPICE)
  5506. SNOW = (QPRECC + QPRECL) * FPICE
  5507. ! fractional area that receives precipitation (see, Niu et al. 2005)
  5508. IF(QPRECC + QPRECL > 0.) &
  5509. FP = (QPRECC + QPRECL) / (10.*QPRECC + QPRECL)
  5510. ! --------------------------- liquid water ------------------------------
  5511. ! maximum canopy water
  5512. MAXLIQ = CH2OP(VEGTYP) * (ELAI+ ESAI)
  5513. ! average interception and throughfall
  5514. IF((ELAI+ ESAI).GT.0.) THEN
  5515. QINTR = FVEG * RAIN * FP ! interception capability
  5516. QINTR = MIN(QINTR, (MAXLIQ - CANLIQ)/DT * (1.-EXP(-RAIN*DT/MAXLIQ)) )
  5517. QINTR = MAX(QINTR, 0.)
  5518. QDRIPR = FVEG * RAIN - QINTR
  5519. QTHROR = (1.-FVEG) * RAIN
  5520. ELSE
  5521. QINTR = 0.
  5522. QDRIPR = 0.
  5523. QTHROR = RAIN
  5524. END IF
  5525. ! evaporation, transpiration, and dew
  5526. IF (TV .GT. TFRZ) THEN
  5527. ETRAN = MAX( FCTR/HVAP, 0. )
  5528. QEVAC = MAX( FCEV/HVAP, 0. )
  5529. QDEWC = ABS( MIN( FCEV/HVAP, 0. ) )
  5530. QSUBC = 0.
  5531. QFROC = 0.
  5532. ELSE
  5533. ETRAN = MAX( FCTR/HSUB, 0. )
  5534. QEVAC = 0.
  5535. QDEWC = 0.
  5536. QSUBC = MAX( FCEV/HSUB, 0. )
  5537. QFROC = ABS( MIN( FCEV/HSUB, 0. ) )
  5538. ENDIF
  5539. ! canopy water balance. for convenience allow dew to bring CANLIQ above
  5540. ! maxh2o or else would have to re-adjust drip
  5541. QEVAC = MIN(CANLIQ/DT,QEVAC)
  5542. CANLIQ=MAX(0.,CANLIQ+(QINTR+QDEWC-QEVAC)*DT)
  5543. IF(CANLIQ <= 1.E-06) CANLIQ = 0.0
  5544. ! --------------------------- canopy ice ------------------------------
  5545. ! for canopy ice
  5546. MAXSNO = 6.6*(0.27+46./BDFALL) * (ELAI+ ESAI)
  5547. IF((ELAI+ ESAI).GT.0.) THEN
  5548. QINTS = FVEG * SNOW * FP
  5549. QINTS = MIN(QINTS, (MAXSNO - CANICE)/DT * (1.-EXP(-SNOW*DT/MAXSNO)) )
  5550. QINTS = MAX(QINTS, 0.)
  5551. FT = MAX(0.0,(TV - 270.15) / 1.87E5)
  5552. FV = SQRT(UU*UU + VV*VV) / 1.56E5
  5553. QDRIPS = MAX(0.,CANICE/DT) * (FV+FT)
  5554. QTHROS = (1.0-FVEG) * SNOW + (FVEG * SNOW - QINTS)
  5555. ELSE
  5556. QINTS = 0.
  5557. QDRIPS = 0.
  5558. QTHROS = SNOW
  5559. ENDIF
  5560. QSUBC = MIN(CANICE/DT,QSUBC)
  5561. CANICE= MAX(0.,CANICE+(QINTS-QDRIPS)*DT + (QFROC-QSUBC)*DT)
  5562. IF(CANICE.LE.1.E-6) CANICE = 0.
  5563. ! wetted fraction of canopy
  5564. IF(CANICE.GT.0.) THEN
  5565. FWET = MAX(0.,CANICE) / MAX(MAXSNO,1.E-06)
  5566. ELSE
  5567. FWET = MAX(0.,CANLIQ) / MAX(MAXLIQ,1.E-06)
  5568. ENDIF
  5569. FWET = MIN(FWET, 1.) ** 0.667
  5570. ! phase change
  5571. QMELTC = 0.
  5572. QFRZC = 0.
  5573. IF(CANICE.GT.1.E-6.AND.TV.GT.TFRZ) THEN
  5574. QMELTC = MIN(CANICE/DT,(TV-TFRZ)*CICE*CANICE/DENICE/(DT*HFUS))
  5575. CANICE = MAX(0.,CANICE - QMELTC*DT)
  5576. CANLIQ = MAX(0.,CANLIQ + QMELTC*DT)
  5577. TV = FWET*TFRZ + (1.-FWET)*TV
  5578. ENDIF
  5579. IF(CANLIQ.GT.1.E-6.AND.TV.LT.TFRZ) THEN
  5580. QFRZC = MIN(CANLIQ/DT,(TFRZ-TV)*CWAT*CANLIQ/DENH2O/(DT*HFUS))
  5581. CANLIQ = MAX(0.,CANLIQ - QFRZC*DT)
  5582. CANICE = MAX(0.,CANICE + QFRZC*DT)
  5583. TV = FWET*TFRZ + (1.-FWET)*TV
  5584. ENDIF
  5585. ! total canopy water
  5586. CMC = CANLIQ + CANICE
  5587. ! total canopy evaporation
  5588. ECAN = QEVAC + QSUBC - QDEWC - QFROC
  5589. ! rain or snow on the ground
  5590. QRAIN = QDRIPR + QTHROR
  5591. QSNOW = QDRIPS + QTHROS
  5592. SNOWHIN = QSNOW/BDFALL
  5593. IF (IST == 2 .AND. TG > TFRZ) THEN
  5594. QSNOW = 0.
  5595. SNOWHIN = 0.
  5596. END IF
  5597. END SUBROUTINE CANWATER
  5598. ! ==================================================================================================
  5599. ! ----------------------------------------------------------------------
  5600. SUBROUTINE SNOWWATER (NSNOW ,NSOIL ,IMELT ,DT ,ZSOIL , & !in
  5601. SFCTMP ,SNOWHIN,QSNOW ,QSNFRO ,QSNSUB , & !in
  5602. QRAIN ,FICEOLD,ILOC ,JLOC , & !in
  5603. ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ , & !inout
  5604. SH2O ,SICE ,STC ,ZSNSO ,DZSNSO , & !inout
  5605. QSNBOT ,SNOFLOW,PONDING1 ,PONDING2) !out
  5606. ! ----------------------------------------------------------------------
  5607. IMPLICIT NONE
  5608. ! ----------------------------------------------------------------------
  5609. ! input
  5610. INTEGER, INTENT(IN) :: ILOC !grid index
  5611. INTEGER, INTENT(IN) :: JLOC !grid index
  5612. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  5613. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  5614. INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [0-no melt;1-melt]
  5615. REAL, INTENT(IN) :: DT !time step (s)
  5616. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil surface
  5617. REAL, INTENT(IN) :: SFCTMP !surface air temperature [k]
  5618. REAL, INTENT(IN) :: SNOWHIN!snow depth increasing rate (m/s)
  5619. REAL, INTENT(IN) :: QSNOW !snow at ground srf (mm/s) [+]
  5620. REAL, INTENT(IN) :: QSNFRO !snow surface frost rate[mm/s]
  5621. REAL, INTENT(IN) :: QSNSUB !snow surface sublimation rate[mm/s]
  5622. REAL, INTENT(IN) :: QRAIN !snow surface rain rate[mm/s]
  5623. REAL, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: FICEOLD!ice fraction at last timestep
  5624. ! input & output
  5625. INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers
  5626. REAL, INTENT(INOUT) :: SNOWH !snow height [m]
  5627. REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm]
  5628. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm]
  5629. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  5630. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3)
  5631. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3)
  5632. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k]
  5633. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !depth of snow/soil layer-bottom
  5634. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !snow/soil layer thickness [m]
  5635. ! output
  5636. REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s]
  5637. REAL, INTENT(OUT) :: SNOFLOW!glacier flow [mm]
  5638. REAL, INTENT(OUT) :: PONDING1
  5639. REAL, INTENT(OUT) :: PONDING2
  5640. ! local
  5641. INTEGER :: IZ,i
  5642. REAL :: BDSNOW !bulk density of snow (kg/m3)
  5643. ! ----------------------------------------------------------------------
  5644. SNOFLOW = 0.0
  5645. PONDING1 = 0.0
  5646. PONDING2 = 0.0
  5647. CALL SNOWFALL (NSOIL ,NSNOW ,DT ,QSNOW ,SNOWHIN, & !in
  5648. SFCTMP ,ILOC ,JLOC , & !in
  5649. ISNOW ,SNOWH ,DZSNSO ,STC ,SNICE , & !inout
  5650. SNLIQ ,SNEQV ) !inout
  5651. if(isnow < 0) then !when more than one layer
  5652. CALL COMPACT (NSNOW ,NSOIL ,DT ,STC ,SNICE , & !in
  5653. SNLIQ ,ZSOIL ,IMELT ,FICEOLD,ILOC , JLOC ,& !in
  5654. ISNOW ,DZSNSO ,ZSNSO ) !inout
  5655. CALL COMBINE (NSNOW ,NSOIL ,ILOC ,JLOC , & !in
  5656. ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout
  5657. DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout
  5658. PONDING1 ,PONDING2) !out
  5659. CALL DIVIDE (NSNOW ,NSOIL , & !in
  5660. ISNOW ,STC ,SNICE ,SNLIQ ,DZSNSO ) !inout
  5661. end if
  5662. !set empty snow layers to zero
  5663. do iz = -nsnow+1, isnow
  5664. snice(iz) = 0.
  5665. snliq(iz) = 0.
  5666. stc(iz) = 0.
  5667. dzsnso(iz)= 0.
  5668. zsnso(iz) = 0.
  5669. enddo
  5670. CALL SNOWH2O (NSNOW ,NSOIL ,DT ,QSNFRO ,QSNSUB , & !in
  5671. QRAIN ,ILOC ,JLOC , & !in
  5672. ISNOW ,DZSNSO ,SNOWH ,SNEQV ,SNICE , & !inout
  5673. SNLIQ ,SH2O ,SICE ,STC , & !inout
  5674. QSNBOT ,PONDING1 ,PONDING2) !out
  5675. !to obtain equilibrium state of snow in glacier region
  5676. IF(SNEQV > 2000.) THEN ! 2000 mm -> maximum water depth
  5677. BDSNOW = SNICE(0) / DZSNSO(0)
  5678. SNOFLOW = (SNEQV - 2000.)
  5679. SNICE(0) = SNICE(0) - SNOFLOW
  5680. DZSNSO(0) = DZSNSO(0) - SNOFLOW/BDSNOW
  5681. SNOFLOW = SNOFLOW / DT
  5682. END IF
  5683. ! sum up snow mass for layered snow
  5684. IF(ISNOW /= 0) THEN
  5685. SNEQV = 0.
  5686. DO IZ = ISNOW+1,0
  5687. SNEQV = SNEQV + SNICE(IZ) + SNLIQ(IZ)
  5688. ENDDO
  5689. END IF
  5690. ! Reset ZSNSO and layer thinkness DZSNSO
  5691. DO IZ = ISNOW+1, 0
  5692. DZSNSO(IZ) = -DZSNSO(IZ)
  5693. END DO
  5694. DZSNSO(1) = ZSOIL(1)
  5695. DO IZ = 2,NSOIL
  5696. DZSNSO(IZ) = (ZSOIL(IZ) - ZSOIL(IZ-1))
  5697. END DO
  5698. ZSNSO(ISNOW+1) = DZSNSO(ISNOW+1)
  5699. DO IZ = ISNOW+2 ,NSOIL
  5700. ZSNSO(IZ) = ZSNSO(IZ-1) + DZSNSO(IZ)
  5701. ENDDO
  5702. DO IZ = ISNOW+1 ,NSOIL
  5703. DZSNSO(IZ) = -DZSNSO(IZ)
  5704. END DO
  5705. END SUBROUTINE SNOWWATER
  5706. ! ==================================================================================================
  5707. SUBROUTINE SNOWFALL (NSOIL ,NSNOW ,DT ,QSNOW ,SNOWHIN , & !in
  5708. SFCTMP ,ILOC ,JLOC , & !in
  5709. ISNOW ,SNOWH ,DZSNSO ,STC ,SNICE , & !inout
  5710. SNLIQ ,SNEQV ) !inout
  5711. ! ----------------------------------------------------------------------
  5712. ! snow depth and density to account for the new snowfall.
  5713. ! new values of snow depth & density returned.
  5714. ! ----------------------------------------------------------------------
  5715. IMPLICIT NONE
  5716. ! ----------------------------------------------------------------------
  5717. ! input
  5718. INTEGER, INTENT(IN) :: ILOC !grid index
  5719. INTEGER, INTENT(IN) :: JLOC !grid index
  5720. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  5721. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  5722. REAL, INTENT(IN) :: DT !main time step (s)
  5723. REAL, INTENT(IN) :: QSNOW !snow at ground srf (mm/s) [+]
  5724. REAL, INTENT(IN) :: SNOWHIN!snow depth increasing rate (m/s)
  5725. REAL, INTENT(IN) :: SFCTMP !surface air temperature [k]
  5726. ! input and output
  5727. INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers
  5728. REAL, INTENT(INOUT) :: SNOWH !snow depth [m]
  5729. REAL, INTENT(INOUT) :: SNEQV !swow water equivalent [m]
  5730. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !thickness of snow/soil layers (m)
  5731. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k]
  5732. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm]
  5733. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  5734. ! local
  5735. INTEGER :: NEWNODE ! 0-no new layers, 1-creating new layers
  5736. ! ----------------------------------------------------------------------
  5737. NEWNODE = 0
  5738. ! shallow snow / no layer
  5739. IF(ISNOW == 0 .and. QSNOW > 0.) THEN
  5740. SNOWH = SNOWH + SNOWHIN * DT
  5741. SNEQV = SNEQV + QSNOW * DT
  5742. END IF
  5743. ! creating a new layer
  5744. IF(ISNOW == 0 .AND. QSNOW>0. .AND. SNOWH >= 0.05) THEN
  5745. ISNOW = -1
  5746. NEWNODE = 1
  5747. DZSNSO(0)= SNOWH
  5748. SNOWH = 0.
  5749. STC(0) = MIN(273.16, SFCTMP) ! temporary setup
  5750. SNICE(0) = SNEQV
  5751. SNLIQ(0) = 0.
  5752. END IF
  5753. ! snow with layers
  5754. IF(ISNOW < 0 .AND. NEWNODE == 0 .AND. QSNOW > 0.) then
  5755. SNICE(ISNOW+1) = SNICE(ISNOW+1) + QSNOW * DT
  5756. DZSNSO(ISNOW+1) = DZSNSO(ISNOW+1) + SNOWHIN * DT
  5757. ENDIF
  5758. ! ----------------------------------------------------------------------
  5759. END SUBROUTINE SNOWFALL
  5760. ! ==================================================================================================
  5761. SUBROUTINE COMBINE (NSNOW ,NSOIL ,ILOC ,JLOC , & !in
  5762. ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout
  5763. DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout
  5764. PONDING1 ,PONDING2) !out
  5765. ! ----------------------------------------------------------------------
  5766. IMPLICIT NONE
  5767. ! ----------------------------------------------------------------------
  5768. ! input
  5769. INTEGER, INTENT(IN) :: ILOC
  5770. INTEGER, INTENT(IN) :: JLOC
  5771. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  5772. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  5773. ! input and output
  5774. INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers
  5775. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3)
  5776. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3)
  5777. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k]
  5778. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm]
  5779. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  5780. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO!snow layer depth [m]
  5781. REAL, INTENT(INOUT) :: sneqv !snow water equivalent [m]
  5782. REAL, INTENT(INOUT) :: snowh !snow depth [m]
  5783. REAL, INTENT(OUT) :: PONDING1
  5784. REAL, INTENT(OUT) :: PONDING2
  5785. ! local variables:
  5786. INTEGER :: I,J,K,L ! node indices
  5787. INTEGER :: ISNOW_OLD ! number of top snow layer
  5788. INTEGER :: MSSI ! node index
  5789. INTEGER :: NEIBOR ! adjacent node selected for combination
  5790. REAL :: ZWICE ! total ice mass in snow
  5791. REAL :: ZWLIQ ! total liquid water in snow
  5792. REAL :: DZMIN(3) ! minimum of top snow layer
  5793. DATA DZMIN /0.045, 0.05, 0.2/
  5794. !-----------------------------------------------------------------------
  5795. ISNOW_OLD = ISNOW
  5796. DO J = ISNOW_OLD+1,0
  5797. IF (SNICE(J) <= .1) THEN
  5798. IF(J /= 0) THEN
  5799. SNLIQ(J+1) = SNLIQ(J+1) + SNLIQ(J)
  5800. SNICE(J+1) = SNICE(J+1) + SNICE(J)
  5801. ELSE
  5802. IF (ISNOW_OLD < -1) THEN
  5803. SNLIQ(J-1) = SNLIQ(J-1) + SNLIQ(J)
  5804. SNICE(J-1) = SNICE(J-1) + SNICE(J)
  5805. ELSE
  5806. PONDING1 = SNLIQ(J) ! ISNOW WILL GET SET TO ZERO BELOW
  5807. SNEQV = SNICE(J) ! PONDING WILL GET ADDED TO PONDING FROM
  5808. SNOWH = DZSNSO(J) ! PHASECHANGE WHICH SHOULD BE ZERO HERE
  5809. SNLIQ(J) = 0.0 ! BECAUSE THERE IT WAS ONLY CALCULATED
  5810. SNICE(J) = 0.0 ! FOR THIN SNOW
  5811. DZSNSO(J) = 0.0
  5812. ENDIF
  5813. ! SH2O(1) = SH2O(1)+SNLIQ(J)/(DZSNSO(1)*1000.)
  5814. ! SICE(1) = SICE(1)+SNICE(J)/(DZSNSO(1)*1000.)
  5815. ENDIF
  5816. ! shift all elements above this down by one.
  5817. IF (J > ISNOW+1 .AND. ISNOW < -1) THEN
  5818. DO I = J, ISNOW+2, -1
  5819. STC(I) = STC(I-1)
  5820. SNLIQ(I) = SNLIQ(I-1)
  5821. SNICE(I) = SNICE(I-1)
  5822. DZSNSO(I)= DZSNSO(I-1)
  5823. END DO
  5824. END IF
  5825. ISNOW = ISNOW + 1
  5826. END IF
  5827. END DO
  5828. ! to conserve water in case of too large surface sublimation
  5829. IF(SICE(1) < 0.) THEN
  5830. SH2O(1) = SH2O(1) + SICE(1)
  5831. SICE(1) = 0.
  5832. END IF
  5833. SNEQV = 0.
  5834. SNOWH = 0.
  5835. ZWICE = 0.
  5836. ZWLIQ = 0.
  5837. DO J = ISNOW+1,0
  5838. SNEQV = SNEQV + SNICE(J) + SNLIQ(J)
  5839. SNOWH = SNOWH + DZSNSO(J)
  5840. ZWICE = ZWICE + SNICE(J)
  5841. ZWLIQ = ZWLIQ + SNLIQ(J)
  5842. END DO
  5843. ! check the snow depth - all snow gone
  5844. ! the liquid water assumes ponding on soil surface.
  5845. IF (SNOWH < 0.05 .AND. ISNOW < 0 ) THEN
  5846. ISNOW = 0
  5847. SNEQV = ZWICE
  5848. PONDING2 = ZWLIQ ! LIMIT OF ISNOW < 0 MEANS INPUT PONDING
  5849. IF(SNEQV <= 0.) SNOWH = 0. ! SHOULD BE ZERO; SEE ABOVE
  5850. END IF
  5851. ! IF (SNOWH < 0.05 ) THEN
  5852. ! ISNOW = 0
  5853. ! SNEQV = ZWICE
  5854. ! SH2O(1) = SH2O(1) + ZWLIQ / (DZSNSO(1) * 1000.)
  5855. ! IF(SNEQV <= 0.) SNOWH = 0.
  5856. ! END IF
  5857. ! check the snow depth - snow layers combined
  5858. IF (ISNOW < -1) THEN
  5859. ISNOW_OLD = ISNOW
  5860. MSSI = 1
  5861. DO I = ISNOW_OLD+1,0
  5862. IF (DZSNSO(I) < DZMIN(MSSI)) THEN
  5863. IF (I == ISNOW+1) THEN
  5864. NEIBOR = I + 1
  5865. ELSE IF (I == 0) THEN
  5866. NEIBOR = I - 1
  5867. ELSE
  5868. NEIBOR = I + 1
  5869. IF ((DZSNSO(I-1)+DZSNSO(I)) < (DZSNSO(I+1)+DZSNSO(I))) NEIBOR = I-1
  5870. END IF
  5871. ! Node l and j are combined and stored as node j.
  5872. IF (NEIBOR > I) THEN
  5873. J = NEIBOR
  5874. L = I
  5875. ELSE
  5876. J = I
  5877. L = NEIBOR
  5878. END IF
  5879. CALL COMBO (DZSNSO(J), SNLIQ(J), SNICE(J), &
  5880. STC(J), DZSNSO(L), SNLIQ(L), SNICE(L), STC(L) )
  5881. ! Now shift all elements above this down one.
  5882. IF (J-1 > ISNOW+1) THEN
  5883. DO K = J-1, ISNOW+2, -1
  5884. STC(K) = STC(K-1)
  5885. SNICE(K) = SNICE(K-1)
  5886. SNLIQ(K) = SNLIQ(K-1)
  5887. DZSNSO(K) = DZSNSO(K-1)
  5888. END DO
  5889. END IF
  5890. ! Decrease the number of snow layers
  5891. ISNOW = ISNOW + 1
  5892. IF (ISNOW >= -1) EXIT
  5893. ELSE
  5894. ! The layer thickness is greater than the prescribed minimum value
  5895. MSSI = MSSI + 1
  5896. END IF
  5897. END DO
  5898. END IF
  5899. END SUBROUTINE COMBINE
  5900. ! ==================================================================================================
  5901. SUBROUTINE DIVIDE (NSNOW ,NSOIL , & !in
  5902. ISNOW ,STC ,SNICE ,SNLIQ ,DZSNSO ) !inout
  5903. ! ----------------------------------------------------------------------
  5904. IMPLICIT NONE
  5905. ! ----------------------------------------------------------------------
  5906. ! input
  5907. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [ =3]
  5908. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers [ =4]
  5909. ! input and output
  5910. INTEGER , INTENT(INOUT) :: ISNOW !actual no. of snow layers
  5911. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k]
  5912. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm]
  5913. REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  5914. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO!snow layer depth [m]
  5915. ! local variables:
  5916. INTEGER :: J !indices
  5917. INTEGER :: MSNO !number of layer (top) to MSNO (bot)
  5918. REAL :: DRR !thickness of the combined [m]
  5919. REAL, DIMENSION( 1:NSNOW) :: DZ !snow layer thickness [m]
  5920. REAL, DIMENSION( 1:NSNOW) :: SWICE !partial volume of ice [m3/m3]
  5921. REAL, DIMENSION( 1:NSNOW) :: SWLIQ !partial volume of liquid water [m3/m3]
  5922. REAL, DIMENSION( 1:NSNOW) :: TSNO !node temperature [k]
  5923. REAL :: ZWICE !temporary
  5924. REAL :: ZWLIQ !temporary
  5925. REAL :: PROPOR!temporary
  5926. REAL :: DTDZ !temporary
  5927. ! ----------------------------------------------------------------------
  5928. DO J = 1,NSNOW
  5929. IF (J <= ABS(ISNOW)) THEN
  5930. DZ(J) = DZSNSO(J+ISNOW)
  5931. SWICE(J) = SNICE(J+ISNOW)
  5932. SWLIQ(J) = SNLIQ(J+ISNOW)
  5933. TSNO(J) = STC(J+ISNOW)
  5934. END IF
  5935. END DO
  5936. MSNO = ABS(ISNOW)
  5937. IF (MSNO == 1) THEN
  5938. ! Specify a new snow layer
  5939. IF (DZ(1) > 0.05) THEN
  5940. MSNO = 2
  5941. DZ(1) = DZ(1)/2.
  5942. SWICE(1) = SWICE(1)/2.
  5943. SWLIQ(1) = SWLIQ(1)/2.
  5944. DZ(2) = DZ(1)
  5945. SWICE(2) = SWICE(1)
  5946. SWLIQ(2) = SWLIQ(1)
  5947. TSNO(2) = TSNO(1)
  5948. END IF
  5949. END IF
  5950. IF (MSNO > 1) THEN
  5951. IF (DZ(1) > 0.05) THEN
  5952. DRR = DZ(1) - 0.05
  5953. PROPOR = DRR/DZ(1)
  5954. ZWICE = PROPOR*SWICE(1)
  5955. ZWLIQ = PROPOR*SWLIQ(1)
  5956. PROPOR = 0.05/DZ(1)
  5957. SWICE(1) = PROPOR*SWICE(1)
  5958. SWLIQ(1) = PROPOR*SWLIQ(1)
  5959. DZ(1) = 0.05
  5960. CALL COMBO (DZ(2), SWLIQ(2), SWICE(2), TSNO(2), DRR, &
  5961. ZWLIQ, ZWICE, TSNO(1))
  5962. ! subdivide a new layer
  5963. IF (MSNO <= 2 .AND. DZ(2) > 0.10) THEN
  5964. MSNO = 3
  5965. DTDZ = (TSNO(1) - TSNO(2))/((DZ(1)+DZ(2))/2.)
  5966. DZ(2) = DZ(2)/2.
  5967. SWICE(2) = SWICE(2)/2.
  5968. SWLIQ(2) = SWLIQ(2)/2.
  5969. DZ(3) = DZ(2)
  5970. SWICE(3) = SWICE(2)
  5971. SWLIQ(3) = SWLIQ(2)
  5972. TSNO(3) = TSNO(2) - DTDZ*DZ(2)/2.
  5973. IF (TSNO(3) >= TFRZ) THEN
  5974. TSNO(3) = TSNO(2)
  5975. ELSE
  5976. TSNO(2) = TSNO(2) + DTDZ*DZ(2)/2.
  5977. ENDIF
  5978. END IF
  5979. END IF
  5980. END IF
  5981. IF (MSNO > 2) THEN
  5982. IF (DZ(2) > 0.2) THEN
  5983. DRR = DZ(2) - 0.2
  5984. PROPOR = DRR/DZ(2)
  5985. ZWICE = PROPOR*SWICE(2)
  5986. ZWLIQ = PROPOR*SWLIQ(2)
  5987. PROPOR = 0.2/DZ(2)
  5988. SWICE(2) = PROPOR*SWICE(2)
  5989. SWLIQ(2) = PROPOR*SWLIQ(2)
  5990. DZ(2) = 0.2
  5991. CALL COMBO (DZ(3), SWLIQ(3), SWICE(3), TSNO(3), DRR, &
  5992. ZWLIQ, ZWICE, TSNO(2))
  5993. END IF
  5994. END IF
  5995. ISNOW = -MSNO
  5996. DO J = ISNOW+1,0
  5997. DZSNSO(J) = DZ(J-ISNOW)
  5998. SNICE(J) = SWICE(J-ISNOW)
  5999. SNLIQ(J) = SWLIQ(J-ISNOW)
  6000. STC(J) = TSNO(J-ISNOW)
  6001. END DO
  6002. ! DO J = ISNOW+1,NSOIL
  6003. ! WRITE(*,'(I5,7F10.3)') J, DZSNSO(J), SNICE(J), SNLIQ(J),STC(J)
  6004. ! END DO
  6005. END SUBROUTINE DIVIDE
  6006. ! ==================================================================================================
  6007. ! ----------------------------------------------------------------------
  6008. SUBROUTINE COMBO(DZ, WLIQ, WICE, T, DZ2, WLIQ2, WICE2, T2)
  6009. ! ----------------------------------------------------------------------
  6010. IMPLICIT NONE
  6011. ! ----------------------------------------------------------------------
  6012. ! ----------------------------------------------------------------------s
  6013. ! input
  6014. REAL, INTENT(IN) :: DZ2 !nodal thickness of 2 elements being combined [m]
  6015. REAL, INTENT(IN) :: WLIQ2 !liquid water of element 2 [kg/m2]
  6016. REAL, INTENT(IN) :: WICE2 !ice of element 2 [kg/m2]
  6017. REAL, INTENT(IN) :: T2 !nodal temperature of element 2 [k]
  6018. REAL, INTENT(INOUT) :: DZ !nodal thickness of 1 elements being combined [m]
  6019. REAL, INTENT(INOUT) :: WLIQ !liquid water of element 1
  6020. REAL, INTENT(INOUT) :: WICE !ice of element 1 [kg/m2]
  6021. REAL, INTENT(INOUT) :: T !node temperature of element 1 [k]
  6022. ! local
  6023. REAL :: DZC !total thickness of nodes 1 and 2 (DZC=DZ+DZ2).
  6024. REAL :: WLIQC !combined liquid water [kg/m2]
  6025. REAL :: WICEC !combined ice [kg/m2]
  6026. REAL :: TC !combined node temperature [k]
  6027. REAL :: H !enthalpy of element 1 [J/m2]
  6028. REAL :: H2 !enthalpy of element 2 [J/m2]
  6029. REAL :: HC !temporary
  6030. !-----------------------------------------------------------------------
  6031. DZC = DZ+DZ2
  6032. WICEC = (WICE+WICE2)
  6033. WLIQC = (WLIQ+WLIQ2)
  6034. H = (CICE*WICE+CWAT*WLIQ) * (T-TFRZ)+HFUS*WLIQ
  6035. H2= (CICE*WICE2+CWAT*WLIQ2) * (T2-TFRZ)+HFUS*WLIQ2
  6036. HC = H + H2
  6037. IF(HC < 0.)THEN
  6038. TC = TFRZ + HC/(CICE*WICEC + CWAT*WLIQC)
  6039. ELSE IF (HC.LE.HFUS*WLIQC) THEN
  6040. TC = TFRZ
  6041. ELSE
  6042. TC = TFRZ + (HC - HFUS*WLIQC) / (CICE*WICEC + CWAT*WLIQC)
  6043. END IF
  6044. DZ = DZC
  6045. WICE = WICEC
  6046. WLIQ = WLIQC
  6047. T = TC
  6048. END SUBROUTINE COMBO
  6049. ! ==================================================================================================
  6050. ! ----------------------------------------------------------------------
  6051. SUBROUTINE COMPACT (NSNOW ,NSOIL ,DT ,STC ,SNICE , & !in
  6052. SNLIQ ,ZSOIL ,IMELT ,FICEOLD,ILOC , JLOC , & !in
  6053. ISNOW ,DZSNSO ,ZSNSO ) !inout
  6054. ! ----------------------------------------------------------------------
  6055. ! ----------------------------------------------------------------------
  6056. IMPLICIT NONE
  6057. ! ----------------------------------------------------------------------
  6058. ! input
  6059. INTEGER, INTENT(IN) :: ILOC !grid index
  6060. INTEGER, INTENT(IN) :: JLOC !grid index
  6061. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers [ =4]
  6062. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [ =3]
  6063. INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [0-no melt;1-melt]
  6064. REAL, INTENT(IN) :: DT !time step (sec)
  6065. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow layer temperature [k]
  6066. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow layer ice [mm]
  6067. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow layer liquid water [mm]
  6068. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil srf
  6069. REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD!ice fraction at last timestep
  6070. ! input and output
  6071. INTEGER, INTENT(INOUT) :: ISNOW ! actual no. of snow layers
  6072. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO ! snow layer thickness [m]
  6073. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO ! depth of snow/soil layer-bottom
  6074. ! local
  6075. REAL, PARAMETER :: C2 = 21.e-3 ![m3/kg] ! default 21.e-3
  6076. REAL, PARAMETER :: C3 = 2.5e-6 ![1/s]
  6077. REAL, PARAMETER :: C4 = 0.04 ![1/k]
  6078. REAL, PARAMETER :: C5 = 2.0 !
  6079. REAL, PARAMETER :: DM = 100.0 !upper Limit on destructive metamorphism compaction [kg/m3]
  6080. REAL, PARAMETER :: ETA0 = 0.8e+6 !viscosity coefficient [kg-s/m2]
  6081. !according to Anderson, it is between 0.52e6~1.38e6
  6082. REAL :: BURDEN !pressure of overlying snow [kg/m2]
  6083. REAL :: DDZ1 !rate of settling of snow pack due to destructive metamorphism.
  6084. REAL :: DDZ2 !rate of compaction of snow pack due to overburden.
  6085. REAL :: DDZ3 !rate of compaction of snow pack due to melt [1/s]
  6086. REAL :: DEXPF !EXPF=exp(-c4*(273.15-STC)).
  6087. REAL :: TD !STC - TFRZ [K]
  6088. REAL :: PDZDTC !nodal rate of change in fractional-thickness due to compaction [fraction/s]
  6089. REAL :: VOID !void (1 - SNICE - SNLIQ)
  6090. REAL :: WX !water mass (ice + liquid) [kg/m2]
  6091. REAL :: BI !partial density of ice [kg/m3]
  6092. REAL, DIMENSION(-NSNOW+1:0) :: FICE !fraction of ice at current time step
  6093. INTEGER :: J
  6094. ! ----------------------------------------------------------------------
  6095. BURDEN = 0.0
  6096. DO J = ISNOW+1, 0
  6097. WX = SNICE(J) + SNLIQ(J)
  6098. FICE(J) = SNICE(J) / WX
  6099. VOID = 1. - (SNICE(J)/DENICE + SNLIQ(J)/DENH2O) / DZSNSO(J)
  6100. ! Allow compaction only for non-saturated node and higher ice lens node.
  6101. IF (VOID > 0.001 .AND. SNICE(J) > 0.1) THEN
  6102. BI = SNICE(J) / DZSNSO(J)
  6103. TD = MAX(0.,TFRZ-STC(J))
  6104. DEXPF = EXP(-C4*TD)
  6105. ! Settling as a result of destructive metamorphism
  6106. DDZ1 = -C3*DEXPF
  6107. IF (BI > DM) DDZ1 = DDZ1*EXP(-46.0E-3*(BI-DM))
  6108. ! Liquid water term
  6109. IF (SNLIQ(J) > 0.01*DZSNSO(J)) DDZ1=DDZ1*C5
  6110. ! Compaction due to overburden
  6111. DDZ2 = -(BURDEN+0.5*WX)*EXP(-0.08*TD-C2*BI)/ETA0 ! 0.5*WX -> self-burden
  6112. ! Compaction occurring during melt
  6113. IF (IMELT(J) == 1) THEN
  6114. DDZ3 = MAX(0.,(FICEOLD(J) - FICE(J))/MAX(1.E-6,FICEOLD(J)))
  6115. DDZ3 = - DDZ3/DT ! sometimes too large
  6116. ELSE
  6117. DDZ3 = 0.
  6118. END IF
  6119. ! Time rate of fractional change in DZ (units of s-1)
  6120. PDZDTC = (DDZ1 + DDZ2 + DDZ3)*DT
  6121. PDZDTC = MAX(-0.5,PDZDTC)
  6122. ! The change in DZ due to compaction
  6123. DZSNSO(J) = DZSNSO(J)*(1.+PDZDTC)
  6124. END IF
  6125. ! Pressure of overlying snow
  6126. BURDEN = BURDEN + WX
  6127. END DO
  6128. END SUBROUTINE COMPACT
  6129. ! ==================================================================================================
  6130. SUBROUTINE SNOWH2O (NSNOW ,NSOIL ,DT ,QSNFRO ,QSNSUB , & !in
  6131. QRAIN ,ILOC ,JLOC , & !in
  6132. ISNOW ,DZSNSO ,SNOWH ,SNEQV ,SNICE , & !inout
  6133. SNLIQ ,SH2O ,SICE ,STC , & !inout
  6134. QSNBOT ,PONDING1 ,PONDING2) !out
  6135. ! ----------------------------------------------------------------------
  6136. ! Renew the mass of ice lens (SNICE) and liquid (SNLIQ) of the
  6137. ! surface snow layer resulting from sublimation (frost) / evaporation (dew)
  6138. ! ----------------------------------------------------------------------
  6139. IMPLICIT NONE
  6140. ! ----------------------------------------------------------------------
  6141. ! input
  6142. INTEGER, INTENT(IN) :: ILOC !grid index
  6143. INTEGER, INTENT(IN) :: JLOC !grid index
  6144. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers[=3]
  6145. INTEGER, INTENT(IN) :: NSOIL !No. of soil layers[=4]
  6146. REAL, INTENT(IN) :: DT !time step
  6147. REAL, INTENT(IN) :: QSNFRO !snow surface frost rate[mm/s]
  6148. REAL, INTENT(IN) :: QSNSUB !snow surface sublimation rate[mm/s]
  6149. REAL, INTENT(IN) :: QRAIN !snow surface rain rate[mm/s]
  6150. ! output
  6151. REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s]
  6152. ! input and output
  6153. INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers
  6154. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO ! snow layer depth [m]
  6155. REAL, INTENT(INOUT) :: SNOWH !snow height [m]
  6156. REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm]
  6157. REAL, DIMENSION(-NSNOW+1:0), INTENT(INOUT) :: SNICE !snow layer ice [mm]
  6158. REAL, DIMENSION(-NSNOW+1:0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm]
  6159. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3)
  6160. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3)
  6161. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k]
  6162. ! local variables:
  6163. INTEGER :: J !do loop/array indices
  6164. REAL :: QIN !water flow into the element (mm/s)
  6165. REAL :: QOUT !water flow out of the element (mm/s)
  6166. REAL :: WGDIF !ice mass after minus sublimation
  6167. REAL, DIMENSION(-NSNOW+1:0) :: VOL_LIQ !partial volume of liquid water in layer
  6168. REAL, DIMENSION(-NSNOW+1:0) :: VOL_ICE !partial volume of ice lens in layer
  6169. REAL, DIMENSION(-NSNOW+1:0) :: EPORE !effective porosity = porosity - VOL_ICE
  6170. REAL :: PROPOR, TEMP
  6171. REAL :: PONDING1, PONDING2
  6172. ! ----------------------------------------------------------------------
  6173. !for the case when SNEQV becomes '0' after 'COMBINE'
  6174. IF(SNEQV == 0.) THEN
  6175. SH2O(1) = SH2O(1) + (QSNFRO-QSNSUB)*DT/(DZSNSO(1)*1000.)
  6176. END IF
  6177. ! for shallow snow without a layer
  6178. ! snow surface sublimation may be larger than existing snow mass. To conserve water,
  6179. ! excessive sublimation is used to reduce soil water. Smaller time steps would tend
  6180. ! to aviod this problem.
  6181. IF(ISNOW == 0 .and. SNEQV > 0.) THEN
  6182. TEMP = SNEQV
  6183. SNEQV = SNEQV - QSNSUB*DT + QSNFRO*DT
  6184. PROPOR = SNEQV/TEMP
  6185. SNOWH = MAX(0.,PROPOR * SNOWH)
  6186. IF(SNEQV < 0.) THEN
  6187. SICE(1) = SICE(1) + SNEQV/(DZSNSO(1)*1000.)
  6188. SNEQV = 0.
  6189. END IF
  6190. IF(SICE(1) < 0.) THEN
  6191. SH2O(1) = SH2O(1) + SICE(1)
  6192. SICE(1) = 0.
  6193. END IF
  6194. END IF
  6195. IF(SNOWH <= 1.E-8) SNOWH = 0.0
  6196. IF(SNEQV <= 1.E-6) SNEQV = 0.0
  6197. ! for deep snow
  6198. IF ( ISNOW < 0 ) THEN !KWM added this IF statement to prevent out-of-bounds array references
  6199. WGDIF = SNICE(ISNOW+1) - QSNSUB*DT + QSNFRO*DT
  6200. SNICE(ISNOW+1) = WGDIF
  6201. IF (WGDIF < 1.e-6 .and. ISNOW <0) THEN
  6202. CALL COMBINE (NSNOW ,NSOIL ,ILOC, JLOC , & !in
  6203. ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout
  6204. DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout
  6205. PONDING1, PONDING2 ) !out
  6206. ENDIF
  6207. !KWM: Subroutine COMBINE can change ISNOW to make it 0 again?
  6208. IF ( ISNOW < 0 ) THEN !KWM added this IF statement to prevent out-of-bounds array references
  6209. SNLIQ(ISNOW+1) = SNLIQ(ISNOW+1) + QRAIN * DT
  6210. SNLIQ(ISNOW+1) = MAX(0., SNLIQ(ISNOW+1))
  6211. ENDIF
  6212. ENDIF !KWM -- Can the ENDIF be moved toward the end of the subroutine (Just set QSNBOT=0)?
  6213. ! Porosity and partial volume
  6214. !KWM Looks to me like loop index / IF test can be simplified.
  6215. DO J = -NSNOW+1, 0
  6216. IF (J >= ISNOW+1) THEN
  6217. VOL_ICE(J) = MIN(1., SNICE(J)/(DZSNSO(J)*DENICE))
  6218. EPORE(J) = 1. - VOL_ICE(J)
  6219. VOL_LIQ(J) = MIN(EPORE(J),SNLIQ(J)/(DZSNSO(J)*DENH2O))
  6220. END IF
  6221. END DO
  6222. QIN = 0.
  6223. QOUT = 0.
  6224. !KWM Looks to me like loop index / IF test can be simplified.
  6225. DO J = -NSNOW+1, 0
  6226. IF (J >= ISNOW+1) THEN
  6227. SNLIQ(J) = SNLIQ(J) + QIN
  6228. IF (J <= -1) THEN
  6229. IF (EPORE(J) < 0.05 .OR. EPORE(J+1) < 0.05) THEN
  6230. QOUT = 0.
  6231. ELSE
  6232. QOUT = MAX(0.,(VOL_LIQ(J)-SSI*EPORE(J))*DZSNSO(J))
  6233. QOUT = MIN(QOUT,(1.-VOL_ICE(J+1)-VOL_LIQ(J+1))*DZSNSO(J+1))
  6234. END IF
  6235. ELSE
  6236. QOUT = MAX(0.,(VOL_LIQ(J) - SSI*EPORE(J))*DZSNSO(J))
  6237. END IF
  6238. QOUT = QOUT*1000.
  6239. SNLIQ(J) = SNLIQ(J) - QOUT
  6240. QIN = QOUT
  6241. END IF
  6242. END DO
  6243. ! Liquid water from snow bottom to soil
  6244. QSNBOT = QOUT / DT ! mm/s
  6245. END SUBROUTINE SNOWH2O
  6246. ! ==================================================================================================
  6247. SUBROUTINE SOILWATER (NSOIL ,NSNOW ,DT ,ZSOIL ,DZSNSO , & !in
  6248. QINSUR ,QSEVA ,ETRANI ,SICE ,ILOC , JLOC, & !in
  6249. SH2O ,SMC ,ZWT ,ISURBAN,VEGTYP ,& !inout
  6250. RUNSRF ,QDRAIN ,RUNSUB ,WCND ,FCRMAX ) !out
  6251. ! ----------------------------------------------------------------------
  6252. ! calculate surface runoff and soil moisture.
  6253. ! ----------------------------------------------------------------------
  6254. ! ----------------------------------------------------------------------
  6255. IMPLICIT NONE
  6256. ! ----------------------------------------------------------------------
  6257. ! input
  6258. INTEGER, INTENT(IN) :: ILOC !grid index
  6259. INTEGER, INTENT(IN) :: JLOC !grid index
  6260. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  6261. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  6262. REAL, INTENT(IN) :: DT !time step (sec)
  6263. REAL, INTENT(IN) :: QINSUR !water input on soil surface [mm/s]
  6264. REAL, INTENT(IN) :: QSEVA !evap from soil surface [mm/s]
  6265. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m]
  6266. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ETRANI !evapotranspiration from soil layers [mm/s]
  6267. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer depth [m]
  6268. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3]
  6269. INTEGER, INTENT(IN) :: VEGTYP
  6270. INTEGER, INTENT(IN) :: ISURBAN
  6271. ! input & output
  6272. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water content [m3/m3]
  6273. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC !total soil water content [m3/m3]
  6274. REAL, INTENT(INOUT) :: ZWT !water table depth [m]
  6275. ! output
  6276. REAL, INTENT(OUT) :: QDRAIN !soil-bottom free drainage [mm/s]
  6277. REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm/s]
  6278. REAL, INTENT(OUT) :: RUNSUB !subsurface runoff [mm/s]
  6279. REAL, INTENT(OUT) :: FCRMAX !maximum of FCR (-)
  6280. REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: WCND !hydraulic conductivity (m/s)
  6281. ! local
  6282. INTEGER :: K,IZ !do-loop index
  6283. INTEGER :: ITER !iteration index
  6284. REAl :: DTFINE !fine time step (s)
  6285. REAL, DIMENSION(1:NSOIL) :: RHSTT !right-hand side term of the matrix
  6286. REAL, DIMENSION(1:NSOIL) :: AI !left-hand side term
  6287. REAL, DIMENSION(1:NSOIL) :: BI !left-hand side term
  6288. REAL, DIMENSION(1:NSOIL) :: CI !left-hand side term
  6289. REAL :: FFF !runoff decay factor (m-1)
  6290. REAL :: RSBMX !baseflow coefficient [mm/s]
  6291. REAL :: PDDUM !infiltration rate at surface (m/s)
  6292. REAL :: FICE !ice fraction in frozen soil
  6293. REAL :: WPLUS !saturation excess of the total soil [m]
  6294. REAL :: RSAT !accumulation of WPLUS (saturation excess) [m]
  6295. REAL :: SICEMAX!maximum soil ice content (m3/m3)
  6296. REAL :: SH2OMIN!minimum soil liquid water content (m3/m3)
  6297. REAL :: WTSUB !sum of WCND(K)*DZSNSO(K)
  6298. REAL :: MH2O !water mass removal (mm)
  6299. REAL :: FSAT !fractional saturated area (-)
  6300. REAL, DIMENSION(1:NSOIL) :: MLIQ !
  6301. REAL :: XS !
  6302. REAL :: WATMIN !
  6303. REAL :: EPORE !effective porosity [m3/m3]
  6304. REAL, DIMENSION(1:NSOIL) :: FCR !impermeable fraction due to frozen soil
  6305. INTEGER :: NITER !iteration times soil moisture (-)
  6306. REAL :: SMCTOT !2-m averaged soil moisture (m3/m3)
  6307. REAL :: DZTOT !2-m soil depth (m)
  6308. REAL, PARAMETER :: A = 4.0
  6309. ! ----------------------------------------------------------------------
  6310. RUNSRF = 0.0
  6311. PDDUM = 0.0
  6312. RSAT = 0.0
  6313. ! for the case when snowmelt water is too large
  6314. DO K = 1,NSOIL
  6315. EPORE = MAX ( 1.E-4 , ( SMCMAX - SICE(K) ) )
  6316. RSAT = RSAT + MAX(0.,SH2O(K)-EPORE)*DZSNSO(K)
  6317. SH2O(K) = MIN(EPORE,SH2O(K))
  6318. END DO
  6319. !impermeable fraction due to frozen soil
  6320. DO K = 1,NSOIL
  6321. FICE = MIN(1.0,SICE(K)/SMCMAX)
  6322. FCR(K) = MAX(0.0,EXP(-A*(1.-FICE))- EXP(-A)) / &
  6323. (1.0 - EXP(-A))
  6324. END DO
  6325. ! maximum soil ice content and minimum liquid water of all layers
  6326. SICEMAX = 0.0
  6327. FCRMAX = 0.0
  6328. SH2OMIN = SMCMAX
  6329. DO K = 1,NSOIL
  6330. IF (SICE(K) > SICEMAX) SICEMAX = SICE(K)
  6331. IF (FCR(K) > FCRMAX) FCRMAX = FCR(K)
  6332. IF (SH2O(K) < SH2OMIN) SH2OMIN = SH2O(K)
  6333. END DO
  6334. !subsurface runoff for runoff scheme option 2
  6335. IF(OPT_RUN == 2) THEN
  6336. FFF = 2.0
  6337. RSBMX = 4.0
  6338. CALL ZWTEQ (NSOIL ,NSNOW ,ZSOIL ,DZSNSO ,SH2O ,ZWT)
  6339. RUNSUB = (1.0-FCRMAX) * RSBMX * EXP(-TIMEAN) * EXP(-FFF*ZWT) ! mm/s
  6340. END IF
  6341. !surface runoff and infiltration rate using different schemes
  6342. !jref impermable surface at urban
  6343. IF ( VEGTYP == ISURBAN ) FCR(1)= 0.95
  6344. IF(OPT_RUN == 1) THEN
  6345. FFF = 6.0
  6346. FSAT = FSATMX*EXP(-0.5*FFF*(ZWT-2.0))
  6347. IF(QINSUR > 0.) THEN
  6348. RUNSRF = QINSUR * ( (1.0-FCR(1))*FSAT + FCR(1) )
  6349. PDDUM = QINSUR - RUNSRF ! m/s
  6350. END IF
  6351. END IF
  6352. IF(OPT_RUN == 2) THEN
  6353. FFF = 2.0
  6354. FSAT = FSATMX*EXP(-0.5*FFF*ZWT)
  6355. IF(QINSUR > 0.) THEN
  6356. RUNSRF = QINSUR * ( (1.0-FCR(1))*FSAT + FCR(1) )
  6357. PDDUM = QINSUR - RUNSRF ! m/s
  6358. END IF
  6359. END IF
  6360. IF(OPT_RUN == 3) THEN
  6361. CALL INFIL (NSOIL ,DT ,ZSOIL ,SH2O ,SICE , & !in
  6362. SICEMAX,QINSUR , & !in
  6363. PDDUM ,RUNSRF ) !out
  6364. END IF
  6365. IF(OPT_RUN == 4) THEN
  6366. SMCTOT = 0.
  6367. DZTOT = 0.
  6368. DO K = 1,NSOIL
  6369. DZTOT = DZTOT + DZSNSO(K)
  6370. SMCTOT = SMCTOT + SMC(K)*DZSNSO(K)
  6371. IF(DZTOT >= 2.0) EXIT
  6372. END DO
  6373. SMCTOT = SMCTOT/DZTOT
  6374. FSAT = MAX(0.01,SMCTOT/SMCMAX) ** 4. !BATS
  6375. IF(QINSUR > 0.) THEN
  6376. RUNSRF = QINSUR * ((1.0-FCR(1))*FSAT+FCR(1))
  6377. PDDUM = QINSUR - RUNSRF ! m/s
  6378. END IF
  6379. END IF
  6380. ! determine iteration times and finer time step
  6381. NITER = 1
  6382. IF(OPT_INF == 1) THEN !OPT_INF =2 may cause water imbalance
  6383. NITER = 3
  6384. IF (PDDUM*DT>DZSNSO(1)*SMCMAX ) THEN
  6385. NITER = NITER*2
  6386. END IF
  6387. END IF
  6388. DTFINE = DT / NITER
  6389. ! solve soil moisture
  6390. DO ITER = 1, NITER
  6391. CALL SRT (NSOIL ,ZSOIL ,DTFINE ,PDDUM ,ETRANI , & !in
  6392. QSEVA ,SH2O ,SMC ,ZWT ,FCR , & !in
  6393. SICEMAX,FCRMAX ,ILOC ,JLOC , & !in
  6394. RHSTT ,AI ,BI ,CI ,QDRAIN , & !out
  6395. WCND ) !out
  6396. CALL SSTEP (NSOIL ,NSNOW ,DTFINE ,ZSOIL ,DZSNSO , & !in
  6397. SICE ,ILOC ,JLOC , & !in
  6398. SH2O ,SMC ,AI ,BI ,CI , & !inout
  6399. RHSTT , & !inout
  6400. WPLUS) !out
  6401. RSAT = RSAT + WPLUS
  6402. END DO
  6403. RUNSRF = RUNSRF * 1000. + RSAT * 1000./DT ! m/s -> mm/s
  6404. QDRAIN = QDRAIN * 1000.
  6405. ! removal of soil water due to groundwater flow (option 2)
  6406. IF(OPT_RUN == 2) THEN
  6407. WTSUB = 0.
  6408. DO K = 1, NSOIL
  6409. WTSUB = WTSUB + WCND(K)*DZSNSO(K)
  6410. END DO
  6411. DO K = 1, NSOIL
  6412. MH2O = RUNSUB*DT*(WCND(K)*DZSNSO(K))/WTSUB ! mm
  6413. SH2O(K) = SH2O(K) - MH2O/(DZSNSO(K)*1000.)
  6414. END DO
  6415. END IF
  6416. ! Limit MLIQ to be greater than or equal to watmin.
  6417. ! Get water needed to bring MLIQ equal WATMIN from lower layer.
  6418. IF(OPT_RUN /= 1) THEN
  6419. DO IZ = 1, NSOIL
  6420. MLIQ(IZ) = SH2O(IZ)*DZSNSO(IZ)*1000.
  6421. END DO
  6422. WATMIN = 0.01 ! mm
  6423. DO IZ = 1, NSOIL-1
  6424. IF (MLIQ(IZ) .LT. 0.) THEN
  6425. XS = WATMIN-MLIQ(IZ)
  6426. ELSE
  6427. XS = 0.
  6428. END IF
  6429. MLIQ(IZ ) = MLIQ(IZ ) + XS
  6430. MLIQ(IZ+1) = MLIQ(IZ+1) - XS
  6431. END DO
  6432. IZ = NSOIL
  6433. IF (MLIQ(IZ) .LT. WATMIN) THEN
  6434. XS = WATMIN-MLIQ(IZ)
  6435. ELSE
  6436. XS = 0.
  6437. END IF
  6438. MLIQ(IZ) = MLIQ(IZ) + XS
  6439. RUNSUB = RUNSUB - XS/DT
  6440. DO IZ = 1, NSOIL
  6441. SH2O(IZ) = MLIQ(IZ) / (DZSNSO(IZ)*1000.)
  6442. END DO
  6443. END IF
  6444. END SUBROUTINE SOILWATER
  6445. ! ==================================================================================================
  6446. SUBROUTINE ZWTEQ (NSOIL ,NSNOW ,ZSOIL ,DZSNSO ,SH2O ,ZWT)
  6447. ! ----------------------------------------------------------------------
  6448. ! calculate equilibrium water table depth (Niu et al., 2005)
  6449. ! ----------------------------------------------------------------------
  6450. IMPLICIT NONE
  6451. ! ----------------------------------------------------------------------
  6452. ! input
  6453. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  6454. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  6455. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m]
  6456. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer depth [m]
  6457. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil liquid water content [m3/m3]
  6458. ! output
  6459. REAL, INTENT(OUT) :: ZWT !water table depth [m]
  6460. ! locals
  6461. INTEGER :: K !do-loop index
  6462. INTEGER, PARAMETER :: NFINE = 100 !no. of fine soil layers of 6m soil
  6463. REAL :: WD1 !water deficit from coarse (4-L) soil moisture profile
  6464. REAL :: WD2 !water deficit from fine (100-L) soil moisture profile
  6465. REAL :: DZFINE !layer thickness of the 100-L soil layers to 6.0 m
  6466. REAL :: TEMP !temporary variable
  6467. REAL, DIMENSION(1:NFINE) :: ZFINE !layer-bottom depth of the 100-L soil layers to 6.0 m
  6468. ! ----------------------------------------------------------------------
  6469. WD1 = 0.
  6470. DO K = 1,NSOIL
  6471. WD1 = WD1 + (SMCMAX-SH2O(K)) * DZSNSO(K) ! [m]
  6472. ENDDO
  6473. DZFINE = 3.0 * (-ZSOIL(NSOIL)) / NFINE
  6474. do K =1,NFINE
  6475. ZFINE(K) = FLOAT(K) * DZFINE
  6476. ENDDO
  6477. ZWT = -3.*ZSOIL(NSOIL) - 0.001 ! initial value [m]
  6478. WD2 = 0.
  6479. DO K = 1,NFINE
  6480. TEMP = 1. + (ZWT-ZFINE(K))/PSISAT
  6481. WD2 = WD2 + SMCMAX*(1.-TEMP**(-1./BEXP))*DZFINE
  6482. IF(ABS(WD2-WD1).LE.0.01) THEN
  6483. ZWT = ZFINE(K)
  6484. EXIT
  6485. ENDIF
  6486. ENDDO
  6487. END SUBROUTINE ZWTEQ
  6488. ! ----------------------------------------------------------------------
  6489. ! ==================================================================================================
  6490. SUBROUTINE INFIL (NSOIL ,DT ,ZSOIL ,SH2O ,SICE , & !in
  6491. SICEMAX,QINSUR , & !in
  6492. PDDUM ,RUNSRF ) !out
  6493. ! --------------------------------------------------------------------------------
  6494. ! compute inflitration rate at soil surface and surface runoff
  6495. ! --------------------------------------------------------------------------------
  6496. IMPLICIT NONE
  6497. ! --------------------------------------------------------------------------------
  6498. ! inputs
  6499. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  6500. REAL, INTENT(IN) :: DT !time step (sec)
  6501. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m]
  6502. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil liquid water content [m3/m3]
  6503. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3]
  6504. REAL, INTENT(IN) :: QINSUR !water input on soil surface [mm/s]
  6505. REAL, INTENT(IN) :: SICEMAX!maximum soil ice content (m3/m3)
  6506. ! outputs
  6507. REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm/s]
  6508. REAL, INTENT(OUT) :: PDDUM !infiltration rate at surface
  6509. ! locals
  6510. INTEGER :: IALP1, J, JJ, K
  6511. REAL :: VAL
  6512. REAL :: DDT
  6513. REAL :: PX
  6514. REAL :: DT1, DD, DICE
  6515. REAL :: FCR
  6516. REAL :: SUM
  6517. REAL :: ACRT
  6518. REAL :: WDF
  6519. REAL :: WCND
  6520. REAL :: SMCAV
  6521. REAL :: INFMAX
  6522. REAL, DIMENSION(1:NSOIL) :: DMAX
  6523. INTEGER, PARAMETER :: CVFRZ = 3
  6524. ! --------------------------------------------------------------------------------
  6525. IF (QINSUR > 0.0) THEN
  6526. DT1 = DT /86400.
  6527. SMCAV = SMCMAX - SMCWLT
  6528. ! maximum infiltration rate
  6529. DMAX(1)= -ZSOIL(1) * SMCAV
  6530. DICE = -ZSOIL(1) * SICE(1)
  6531. DMAX(1)= DMAX(1)* (1.0-(SH2O(1) + SICE(1) - SMCWLT)/SMCAV)
  6532. DD = DMAX(1)
  6533. DO K = 2,NSOIL
  6534. DICE = DICE + (ZSOIL(K-1) - ZSOIL(K) ) * SICE(K)
  6535. DMAX(K) = (ZSOIL(K-1) - ZSOIL(K)) * SMCAV
  6536. DMAX(K) = DMAX(K) * (1.0-(SH2O(K) + SICE(K) - SMCWLT)/SMCAV)
  6537. DD = DD + DMAX(K)
  6538. END DO
  6539. VAL = (1. - EXP ( - KDT * DT1))
  6540. DDT = DD * VAL
  6541. PX = MAX(0.,QINSUR * DT)
  6542. INFMAX = (PX * (DDT / (PX + DDT)))/ DT
  6543. ! impermeable fraction due to frozen soil
  6544. FCR = 1.
  6545. IF (DICE > 1.E-2) THEN
  6546. ACRT = CVFRZ * FRZX / DICE
  6547. SUM = 1.
  6548. IALP1 = CVFRZ - 1
  6549. DO J = 1,IALP1
  6550. K = 1
  6551. DO JJ = J +1,IALP1
  6552. K = K * JJ
  6553. END DO
  6554. SUM = SUM + (ACRT ** (CVFRZ - J)) / FLOAT(K)
  6555. END DO
  6556. FCR = 1. - EXP (-ACRT) * SUM
  6557. END IF
  6558. ! correction of infiltration limitation
  6559. INFMAX = INFMAX * FCR
  6560. ! jref for urban areas
  6561. ! IF (VEGTYP == ISURBAN ) INFMAX == INFMAX * 0.05
  6562. CALL WDFCND2 (WDF,WCND,SH2O(1),SICEMAX)
  6563. INFMAX = MAX (INFMAX,WCND)
  6564. INFMAX = MIN (INFMAX,PX)
  6565. RUNSRF= MAX(0., QINSUR - INFMAX)
  6566. PDDUM = QINSUR - RUNSRF
  6567. END IF
  6568. END SUBROUTINE INFIL
  6569. ! ==================================================================================================
  6570. SUBROUTINE SRT (NSOIL ,ZSOIL ,DT ,PDDUM ,ETRANI , & !in
  6571. QSEVA ,SH2O ,SMC ,ZWT ,FCR , & !in
  6572. SICEMAX,FCRMAX ,ILOC ,JLOC , & !in
  6573. RHSTT ,AI ,BI ,CI ,QDRAIN , & !out
  6574. WCND ) !out
  6575. ! ----------------------------------------------------------------------
  6576. ! calculate the right hand side of the time tendency term of the soil
  6577. ! water diffusion equation. also to compute ( prepare ) the matrix
  6578. ! coefficients for the tri-diagonal matrix of the implicit time scheme.
  6579. ! ----------------------------------------------------------------------
  6580. IMPLICIT NONE
  6581. ! ----------------------------------------------------------------------
  6582. !input
  6583. INTEGER, INTENT(IN) :: ILOC !grid index
  6584. INTEGER, INTENT(IN) :: JLOC !grid index
  6585. INTEGER, INTENT(IN) :: NSOIL
  6586. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL
  6587. REAL, INTENT(IN) :: DT
  6588. REAL, INTENT(IN) :: PDDUM
  6589. REAL, INTENT(IN) :: QSEVA
  6590. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ETRANI
  6591. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O
  6592. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC
  6593. REAL, INTENT(IN) :: ZWT ! water table depth [m]
  6594. REAL, DIMENSION(1:NSOIL), INTENT(IN) :: FCR
  6595. REAL, INTENT(IN) :: FCRMAX !maximum of FCR (-)
  6596. REAL, INTENT(IN) :: SICEMAX!maximum soil ice content (m3/m3)
  6597. ! output
  6598. REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: RHSTT
  6599. REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: AI
  6600. REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: BI
  6601. REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: CI
  6602. REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: WCND !hydraulic conductivity (m/s)
  6603. REAL, INTENT(OUT) :: QDRAIN !bottom drainage (m/s)
  6604. ! local
  6605. INTEGER :: K
  6606. REAL, DIMENSION(1:NSOIL) :: DDZ
  6607. REAL, DIMENSION(1:NSOIL) :: DENOM
  6608. REAL, DIMENSION(1:NSOIL) :: DSMDZ
  6609. REAL, DIMENSION(1:NSOIL) :: WFLUX
  6610. REAL, DIMENSION(1:NSOIL) :: WDF
  6611. REAL, DIMENSION(1:NSOIL) :: SMX
  6612. REAL :: TEMP1
  6613. ! Niu and Yang (2006), J. of Hydrometeorology
  6614. ! ----------------------------------------------------------------------
  6615. IF(OPT_INF == 1) THEN
  6616. DO K = 1, NSOIL
  6617. CALL WDFCND1 (WDF(K),WCND(K),SMC(K),FCR(K))
  6618. SMX(K) = SMC(K)
  6619. END DO
  6620. END IF
  6621. IF(OPT_INF == 2) THEN
  6622. DO K = 1, NSOIL
  6623. CALL WDFCND2 (WDF(K),WCND(K),SH2O(K),SICEMAX)
  6624. SMX(K) = SH2O(K)
  6625. END DO
  6626. END IF
  6627. DO K = 1, NSOIL
  6628. IF(K == 1) THEN
  6629. DENOM(K) = - ZSOIL (K)
  6630. TEMP1 = - ZSOIL (K+1)
  6631. DDZ(K) = 2.0 / TEMP1
  6632. DSMDZ(K) = 2.0 * (SMX(K) - SMX(K+1)) / TEMP1
  6633. WFLUX(K) = WDF(K) * DSMDZ(K) + WCND(K) - PDDUM + ETRANI(K) + QSEVA
  6634. ELSE IF (K < NSOIL) THEN
  6635. DENOM(k) = (ZSOIL(K-1) - ZSOIL(K))
  6636. TEMP1 = (ZSOIL(K-1) - ZSOIL(K+1))
  6637. DDZ(K) = 2.0 / TEMP1
  6638. DSMDZ(K) = 2.0 * (SMX(K) - SMX(K+1)) / TEMP1
  6639. WFLUX(K) = WDF(K ) * DSMDZ(K ) + WCND(K ) &
  6640. - WDF(K-1) * DSMDZ(K-1) - WCND(K-1) + ETRANI(K)
  6641. ELSE
  6642. DENOM(K) = (ZSOIL(K-1) - ZSOIL(K))
  6643. IF(OPT_RUN == 1 .or. OPT_RUN == 2) THEN
  6644. QDRAIN = 0.
  6645. END IF
  6646. IF(OPT_RUN == 3) THEN
  6647. QDRAIN = SLOPE*WCND(K)
  6648. END IF
  6649. IF(OPT_RUN == 4) THEN
  6650. QDRAIN = (1.0-FCRMAX)*WCND(K)
  6651. END IF
  6652. WFLUX(K) = -(WDF(K-1)*DSMDZ(K-1))-WCND(K-1)+ETRANI(K) + QDRAIN
  6653. END IF
  6654. END DO
  6655. DO K = 1, NSOIL
  6656. IF(K == 1) THEN
  6657. AI(K) = 0.0
  6658. BI(K) = WDF(K ) * DDZ(K ) / DENOM(K)
  6659. CI(K) = - BI (K)
  6660. ELSE IF (K < NSOIL) THEN
  6661. AI(K) = - WDF(K-1) * DDZ(K-1) / DENOM(K)
  6662. CI(K) = - WDF(K ) * DDZ(K ) / DENOM(K)
  6663. BI(K) = - ( AI (K) + CI (K) )
  6664. ELSE
  6665. AI(K) = - WDF(K-1) * DDZ(K-1) / DENOM(K)
  6666. CI(K) = 0.0
  6667. BI(K) = - ( AI (K) + CI (K) )
  6668. END IF
  6669. RHSTT(K) = WFLUX(K) / (-DENOM(K))
  6670. END DO
  6671. ! ----------------------------------------------------------------------
  6672. END SUBROUTINE SRT
  6673. ! ----------------------------------------------------------------------
  6674. ! ==================================================================================================
  6675. SUBROUTINE SSTEP (NSOIL ,NSNOW ,DT ,ZSOIL ,DZSNSO , & !in
  6676. SICE ,ILOC ,JLOC , & !in
  6677. SH2O ,SMC ,AI ,BI ,CI , & !inout
  6678. RHSTT , & !inout
  6679. WPLUS ) !out
  6680. ! ----------------------------------------------------------------------
  6681. ! calculate/update soil moisture content values
  6682. ! ----------------------------------------------------------------------
  6683. IMPLICIT NONE
  6684. ! ----------------------------------------------------------------------
  6685. !input
  6686. INTEGER, INTENT(IN) :: ILOC !grid index
  6687. INTEGER, INTENT(IN) :: JLOC !grid index
  6688. INTEGER, INTENT(IN) :: NSOIL !
  6689. INTEGER, INTENT(IN) :: NSNOW !
  6690. REAL, INTENT(IN) :: DT
  6691. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL
  6692. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SICE
  6693. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO ! snow/soil layer thickness [m]
  6694. !input and output
  6695. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O
  6696. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC
  6697. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: AI
  6698. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: BI
  6699. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: CI
  6700. REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: RHSTT
  6701. !output
  6702. REAL, INTENT(OUT) :: WPLUS !saturation excess water (m)
  6703. !local
  6704. INTEGER :: K
  6705. REAL, DIMENSION(1:NSOIL) :: RHSTTIN
  6706. REAL, DIMENSION(1:NSOIL) :: CIIN
  6707. REAL :: STOT
  6708. REAL :: EPORE
  6709. ! ----------------------------------------------------------------------
  6710. WPLUS = 0.0
  6711. DO K = 1,NSOIL
  6712. RHSTT (K) = RHSTT(K) * DT
  6713. AI (K) = AI(K) * DT
  6714. BI (K) = 1. + BI(K) * DT
  6715. CI (K) = CI(K) * DT
  6716. END DO
  6717. ! copy values for input variables before calling rosr12
  6718. DO K = 1,NSOIL
  6719. RHSTTIN(k) = RHSTT(K)
  6720. CIIN(k) = CI(K)
  6721. END DO
  6722. ! call ROSR12 to solve the tri-diagonal matrix
  6723. CALL ROSR12 (CI,AI,BI,CIIN,RHSTTIN,RHSTT,1,NSOIL,0)
  6724. DO K = 1,NSOIL
  6725. SH2O(K) = SH2O(K) + CI(K)
  6726. ENDDO
  6727. ! excessive water above saturation in a layer is moved to
  6728. ! its unsaturated layer like in a bucket
  6729. DO K = NSOIL,2,-1
  6730. EPORE = MAX ( 1.E-4 , ( SMCMAX - SICE(K) ) )
  6731. WPLUS = MAX((SH2O(K)-EPORE), 0.0) * DZSNSO(K)
  6732. SH2O(K) = MIN(EPORE,SH2O(K))
  6733. SH2O(K-1) = SH2O(K-1) + WPLUS/DZSNSO(K-1)
  6734. END DO
  6735. EPORE = MAX ( 1.E-4 , ( SMCMAX - SICE(1) ) )
  6736. WPLUS = MAX((SH2O(1)-EPORE), 0.0) * DZSNSO(1)
  6737. SH2O(1) = MIN(EPORE,SH2O(1))
  6738. END SUBROUTINE SSTEP
  6739. ! ==================================================================================================
  6740. SUBROUTINE WDFCND1 (WDF,WCND,SMC,FCR)
  6741. ! ----------------------------------------------------------------------
  6742. ! calculate soil water diffusivity and soil hydraulic conductivity.
  6743. ! ----------------------------------------------------------------------
  6744. IMPLICIT NONE
  6745. ! ----------------------------------------------------------------------
  6746. ! input
  6747. REAL,INTENT(IN) :: SMC
  6748. REAL,INTENT(IN) :: FCR
  6749. ! output
  6750. REAL,INTENT(OUT) :: WCND
  6751. REAL,INTENT(OUT) :: WDF
  6752. ! local
  6753. REAL :: EXPON
  6754. REAL :: FACTR
  6755. REAL :: VKWGT
  6756. ! ----------------------------------------------------------------------
  6757. ! soil water diffusivity
  6758. FACTR = MAX(0.01, SMC/SMCMAX)
  6759. EXPON = BEXP + 2.0
  6760. WDF = DWSAT * FACTR ** EXPON
  6761. WDF = WDF * (1.0 - FCR)
  6762. ! hydraulic conductivity
  6763. EXPON = 2.0*BEXP + 3.0
  6764. WCND = DKSAT * FACTR ** EXPON
  6765. WCND = WCND * (1.0 - FCR)
  6766. END SUBROUTINE WDFCND1
  6767. ! ==================================================================================================
  6768. SUBROUTINE WDFCND2 (WDF,WCND,SMC,SICE)
  6769. ! ----------------------------------------------------------------------
  6770. ! calculate soil water diffusivity and soil hydraulic conductivity.
  6771. ! ----------------------------------------------------------------------
  6772. IMPLICIT NONE
  6773. ! ----------------------------------------------------------------------
  6774. ! input
  6775. REAL,INTENT(IN) :: SMC
  6776. REAL,INTENT(IN) :: SICE
  6777. ! output
  6778. REAL,INTENT(OUT) :: WCND
  6779. REAL,INTENT(OUT) :: WDF
  6780. ! local
  6781. REAL :: EXPON
  6782. REAL :: FACTR
  6783. REAL :: VKWGT
  6784. ! ----------------------------------------------------------------------
  6785. ! soil water diffusivity
  6786. FACTR = MAX(0.01, SMC/SMCMAX)
  6787. EXPON = BEXP + 2.0
  6788. WDF = DWSAT * FACTR ** EXPON
  6789. IF (SICE > 0.0) THEN
  6790. VKWGT = 1./ (1. + (500.* SICE)**3.)
  6791. WDF = VKWGT * WDF + (1.-VKWGT)*DWSAT*(0.2/SMCMAX)**EXPON
  6792. END IF
  6793. ! hydraulic conductivity
  6794. EXPON = 2.0*BEXP + 3.0
  6795. WCND = DKSAT * FACTR ** EXPON
  6796. END SUBROUTINE WDFCND2
  6797. ! ==================================================================================================
  6798. ! ----------------------------------------------------------------------
  6799. SUBROUTINE GROUNDWATER(NSNOW ,NSOIL ,DT ,SICE ,ZSOIL , & !in
  6800. STC ,WCND ,FCRMAX ,ILOC ,JLOC , & !in
  6801. SH2O ,ZWT ,WA ,WT , & !inout
  6802. QIN ,QDIS ) !out
  6803. ! ----------------------------------------------------------------------
  6804. IMPLICIT NONE
  6805. ! ----------------------------------------------------------------------
  6806. ! input
  6807. INTEGER, INTENT(IN) :: ILOC !grid index
  6808. INTEGER, INTENT(IN) :: JLOC !grid index
  6809. INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers
  6810. INTEGER, INTENT(IN) :: NSOIL !no. of soil layers
  6811. REAL, INTENT(IN) :: DT !timestep [sec]
  6812. REAL, INTENT(IN) :: FCRMAX!maximum FCR (-)
  6813. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3]
  6814. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m]
  6815. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: WCND !hydraulic conductivity (m/s)
  6816. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature (k)
  6817. ! input and output
  6818. REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil water [m3/m3]
  6819. REAL, INTENT(INOUT) :: ZWT !the depth to water table [m]
  6820. REAL, INTENT(INOUT) :: WA !water storage in aquifer [mm]
  6821. REAL, INTENT(INOUT) :: WT !water storage in aquifer
  6822. !+ saturated soil [mm]
  6823. ! output
  6824. REAL, INTENT(OUT) :: QIN !groundwater recharge [mm/s]
  6825. REAL, INTENT(OUT) :: QDIS !groundwater discharge [mm/s]
  6826. ! local
  6827. REAL :: FFF !runoff decay factor (m-1)
  6828. REAL :: RSBMX !baseflow coefficient [mm/s]
  6829. INTEGER :: IZ !do-loop index
  6830. INTEGER :: IWT !layer index above water table layer
  6831. REAL, DIMENSION( 1:NSOIL) :: DZMM !layer thickness [mm]
  6832. REAL, DIMENSION( 1:NSOIL) :: ZNODE !node depth [m]
  6833. REAL, DIMENSION( 1:NSOIL) :: MLIQ !liquid water mass [kg/m2 or mm]
  6834. REAL, DIMENSION( 1:NSOIL) :: EPORE !effective porosity [-]
  6835. REAL, DIMENSION( 1:NSOIL) :: HK !hydraulic conductivity [mm/s]
  6836. REAL, DIMENSION( 1:NSOIL) :: SMC !total soil water content [m3/m3]
  6837. REAL(KIND=8) :: S_NODE!degree of saturation of IWT layer
  6838. REAL :: DZSUM !cumulative depth above water table [m]
  6839. REAL :: SMPFZ !matric potential (frozen effects) [mm]
  6840. REAL :: KA !aquifer hydraulic conductivity [mm/s]
  6841. REAL :: WH_ZWT!water head at water table [mm]
  6842. REAL :: WH !water head at layer above ZWT [mm]
  6843. REAL :: WS !water used to fill air pore [mm]
  6844. REAL :: WTSUB !sum of HK*DZMM
  6845. REAL :: WATMIN!minimum soil vol soil moisture [m3/m3]
  6846. REAL :: XS !excessive water above saturation [mm]
  6847. REAL, PARAMETER :: ROUS = 0.2 !specific yield [-]
  6848. REAL, PARAMETER :: CMIC = 0.20 !microprore content (0.0-1.0)
  6849. !0.0-close to free drainage
  6850. ! -------------------------------------------------------------
  6851. QDIS = 0.0
  6852. QIN = 0.0
  6853. ! Derive layer-bottom depth in [mm]
  6854. !KWM: Derive layer thickness in mm
  6855. DZMM(1) = -ZSOIL(1)*1.E3
  6856. DO IZ = 2, NSOIL
  6857. DZMM(IZ) = 1.E3 * (ZSOIL(IZ - 1) - ZSOIL(IZ))
  6858. ENDDO
  6859. ! Derive node (middle) depth in [m]
  6860. !KWM: Positive number, depth below ground surface in m
  6861. ZNODE(1) = -ZSOIL(1) / 2.
  6862. DO IZ = 2, NSOIL
  6863. ZNODE(IZ) = -ZSOIL(IZ-1) + 0.5 * (ZSOIL(IZ-1) - ZSOIL(IZ))
  6864. ENDDO
  6865. ! Convert volumetric soil moisture "sh2o" to mass
  6866. DO IZ = 1, NSOIL
  6867. SMC(IZ) = SH2O(IZ) + SICE(IZ)
  6868. MLIQ(IZ) = SH2O(IZ) * DZMM(IZ)
  6869. EPORE(IZ) = MAX(0.01,SMCMAX - SICE(IZ))
  6870. HK(IZ) = 1.E3*WCND(IZ)
  6871. ENDDO
  6872. ! The layer index of the first unsaturated layer,
  6873. ! i.e., the layer right above the water table
  6874. IWT = NSOIL
  6875. DO IZ = 2,NSOIL
  6876. IF(ZWT .LE. -ZSOIL(IZ) ) THEN
  6877. IWT = IZ-1
  6878. EXIT
  6879. END IF
  6880. ENDDO
  6881. ! Groundwater discharge [mm/s]
  6882. FFF = 6.0
  6883. RSBMX = 5.0
  6884. QDIS = (1.0-FCRMAX)*RSBMX*EXP(-TIMEAN)*EXP(-FFF*(ZWT-2.0))
  6885. ! Matric potential at the layer above the water table
  6886. S_NODE = MIN(1.0,SMC(IWT)/SMCMAX )
  6887. S_NODE = MAX(S_NODE,REAL(0.01,KIND=8))
  6888. SMPFZ = -PSISAT*1000.*S_NODE**(-BEXP) ! m --> mm
  6889. SMPFZ = MAX(-120000.0,CMIC*SMPFZ)
  6890. ! Recharge rate qin to groundwater
  6891. KA = HK(IWT)
  6892. WH_ZWT = - ZWT * 1.E3 !(mm)
  6893. WH = SMPFZ - ZNODE(IWT)*1.E3 !(mm)
  6894. QIN = - KA * (WH_ZWT-WH) /((ZWT-ZNODE(IWT))*1.E3)
  6895. QIN = MAX(-10.0/DT,MIN(10./DT,QIN))
  6896. ! Water storage in the aquifer + saturated soil
  6897. WT = WT + (QIN - QDIS) * DT !(mm)
  6898. IF(IWT.EQ.NSOIL) THEN
  6899. WA = WA + (QIN - QDIS) * DT !(mm)
  6900. WT = WA
  6901. ZWT = (-ZSOIL(NSOIL) + 25.) - WA/1000./ROUS !(m)
  6902. MLIQ(NSOIL) = MLIQ(NSOIL) - QIN * DT ! [mm]
  6903. MLIQ(NSOIL) = MLIQ(NSOIL) + MAX(0.,(WA - 5000.))
  6904. WA = MIN(WA, 5000.)
  6905. ELSE
  6906. IF (IWT.EQ.NSOIL-1) THEN
  6907. ZWT = -ZSOIL(NSOIL) &
  6908. - (WT-ROUS*1000*25.) / (EPORE(NSOIL))/1000.
  6909. ELSE
  6910. WS = 0. ! water used to fill soil air pores
  6911. DO IZ = IWT+2,NSOIL
  6912. WS = WS + EPORE(IZ) * DZMM(IZ)
  6913. ENDDO
  6914. ZWT = -ZSOIL(IWT+1) &
  6915. - (WT-ROUS*1000.*25.-WS) /(EPORE(IWT+1))/1000.
  6916. ENDIF
  6917. WTSUB = 0.
  6918. DO IZ = 1, NSOIL
  6919. WTSUB = WTSUB + HK(IZ)*DZMM(IZ)
  6920. END DO
  6921. DO IZ = 1, NSOIL ! Removing subsurface runoff
  6922. MLIQ(IZ) = MLIQ(IZ) - QDIS*DT*HK(IZ)*DZMM(IZ)/WTSUB
  6923. END DO
  6924. END IF
  6925. ZWT = MAX(1.5,ZWT)
  6926. !
  6927. ! Limit MLIQ to be greater than or equal to watmin.
  6928. ! Get water needed to bring MLIQ equal WATMIN from lower layer.
  6929. !
  6930. WATMIN = 0.01
  6931. DO IZ = 1, NSOIL-1
  6932. IF (MLIQ(IZ) .LT. 0.) THEN
  6933. XS = WATMIN-MLIQ(IZ)
  6934. ELSE
  6935. XS = 0.
  6936. END IF
  6937. MLIQ(IZ ) = MLIQ(IZ ) + XS
  6938. MLIQ(IZ+1) = MLIQ(IZ+1) - XS
  6939. END DO
  6940. IZ = NSOIL
  6941. IF (MLIQ(IZ) .LT. WATMIN) THEN
  6942. XS = WATMIN-MLIQ(IZ)
  6943. ELSE
  6944. XS = 0.
  6945. END IF
  6946. MLIQ(IZ) = MLIQ(IZ) + XS
  6947. WA = WA - XS
  6948. WT = WT - XS
  6949. DO IZ = 1, NSOIL
  6950. SH2O(IZ) = MLIQ(IZ) / DZMM(IZ)
  6951. END DO
  6952. END SUBROUTINE GROUNDWATER
  6953. ! ==================================================================================================
  6954. ! ********************* end of water subroutines ******************************************
  6955. ! ==================================================================================================
  6956. SUBROUTINE CARBON (NSNOW ,NSOIL ,VEGTYP ,NROOT ,DT ,ZSOIL , & !in
  6957. DZSNSO ,STC ,SMC ,TV ,TG ,PSN , & !in
  6958. FOLN ,SMCMAX ,BTRAN ,APAR ,FVEG ,IGS , & !in
  6959. TROOT ,IST ,LAT ,ILOC ,JLOC , & !in
  6960. LFMASS ,RTMASS ,STMASS ,WOOD ,STBLCP ,FASTCP , & !inout
  6961. GPP ,NPP ,NEE ,AUTORS ,HETERS ,TOTSC , & !out
  6962. TOTLB ,XLAI ,XSAI ) !out
  6963. ! ------------------------------------------------------------------------------------------
  6964. USE NOAHMP_VEG_PARAMETERS
  6965. ! ------------------------------------------------------------------------------------------
  6966. IMPLICIT NONE
  6967. ! ------------------------------------------------------------------------------------------
  6968. ! inputs (carbon)
  6969. INTEGER , INTENT(IN) :: ILOC !grid index
  6970. INTEGER , INTENT(IN) :: JLOC !grid index
  6971. INTEGER , INTENT(IN) :: VEGTYP !vegetation type
  6972. INTEGER , INTENT(IN) :: NSNOW !number of snow layers
  6973. INTEGER , INTENT(IN) :: NSOIL !number of soil layers
  6974. INTEGER , INTENT(IN) :: NROOT !no. of root layers
  6975. REAL , INTENT(IN) :: LAT !latitude (radians)
  6976. REAL , INTENT(IN) :: DT !time step (s)
  6977. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil surface
  6978. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m]
  6979. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature [k]
  6980. REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture (ice + liq.) [m3/m3]
  6981. REAL , INTENT(IN) :: TV !vegetation temperature (k)
  6982. REAL , INTENT(IN) :: TG !ground temperature (k)
  6983. REAL , INTENT(IN) :: FOLN !foliage nitrogen (%)
  6984. REAL , INTENT(IN) :: SMCMAX !soil porosity (m3/m3)
  6985. REAL , INTENT(IN) :: BTRAN !soil water transpiration factor (0 to 1)
  6986. REAL , INTENT(IN) :: PSN !total leaf photosyn (umolco2/m2/s) [+]
  6987. REAL , INTENT(IN) :: APAR !PAR by canopy (w/m2)
  6988. REAL , INTENT(IN) :: IGS !growing season index (0=off, 1=on)
  6989. REAL , INTENT(IN) :: FVEG !vegetation greenness fraction
  6990. REAL , INTENT(IN) :: TROOT !root-zone averaged temperature (k)
  6991. INTEGER , INTENT(IN) :: IST !surface type 1->soil; 2->lake
  6992. ! input & output (carbon)
  6993. REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2]
  6994. REAL , INTENT(INOUT) :: RTMASS !mass of fine roots [g/m2]
  6995. REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2]
  6996. REAL , INTENT(INOUT) :: WOOD !mass of wood (incl. woody roots) [g/m2]
  6997. REAL , INTENT(INOUT) :: STBLCP !stable carbon in deep soil [g/m2]
  6998. REAL , INTENT(INOUT) :: FASTCP !short-lived carbon in shallow soil [g/m2]
  6999. ! outputs: (carbon)
  7000. REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s C]
  7001. REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2/s C]
  7002. REAL , INTENT(OUT) :: NEE !net ecosystem exchange [g/m2/s CO2]
  7003. REAL , INTENT(OUT) :: AUTORS !net ecosystem respiration [g/m2/s C]
  7004. REAL , INTENT(OUT) :: HETERS !organic respiration [g/m2/s C]
  7005. REAL , INTENT(OUT) :: TOTSC !total soil carbon [g/m2 C]
  7006. REAL , INTENT(OUT) :: TOTLB !total living carbon ([g/m2 C]
  7007. REAL , INTENT(OUT) :: XLAI !leaf area index [-]
  7008. REAL , INTENT(OUT) :: XSAI !stem area index [-]
  7009. ! REAL , INTENT(OUT) :: VOCFLX(5) ! voc fluxes [ug C m-2 h-1]
  7010. ! local variables
  7011. INTEGER :: J !do-loop index
  7012. REAL :: WROOT !root zone soil water [-]
  7013. REAL :: WSTRES !water stress coeficient [-] (1. for wilting )
  7014. REAL :: LAPM !leaf area per unit mass [m2/g]
  7015. ! ------------------------------------------------------------------------------------------
  7016. IF ( ( VEGTYP == ISWATER ) .OR. ( VEGTYP == ISBARREN ) .OR. ( VEGTYP == ISSNOW ) ) THEN
  7017. XLAI = 0.
  7018. XSAI = 0.
  7019. GPP = 0.
  7020. NPP = 0.
  7021. NEE = 0.
  7022. AUTORS = 0.
  7023. HETERS = 0.
  7024. TOTSC = 0.
  7025. TOTLB = 0.
  7026. LFMASS = 0.
  7027. RTMASS = 0.
  7028. STMASS = 0.
  7029. WOOD = 0.
  7030. STBLCP = 0.
  7031. FASTCP = 0.
  7032. RETURN
  7033. END IF
  7034. LAPM = SLA(VEGTYP) / 1000. ! m2/kg -> m2/g
  7035. ! water stress
  7036. WSTRES = 1.- BTRAN
  7037. WROOT = 0.
  7038. DO J=1,NROOT
  7039. WROOT = WROOT + SMC(J)/SMCMAX * DZSNSO(J) / (-ZSOIL(NROOT))
  7040. ENDDO
  7041. CALL CO2FLUX (NSNOW ,NSOIL ,VEGTYP ,IGS ,DT , & !in
  7042. DZSNSO ,STC ,PSN ,TROOT ,TV , & !in
  7043. WROOT ,WSTRES ,FOLN ,LAPM , & !in
  7044. LAT ,ILOC ,JLOC ,FVEG , & !in
  7045. XLAI ,XSAI ,LFMASS ,RTMASS ,STMASS , & !inout
  7046. FASTCP ,STBLCP ,WOOD , & !inout
  7047. GPP ,NPP ,NEE ,AUTORS ,HETERS , & !out
  7048. TOTSC ,TOTLB ) !out
  7049. ! CALL BVOC (VOCFLX, VEGTYP, VEGFAC, APAR, TV)
  7050. ! CALL CH4
  7051. END SUBROUTINE CARBON
  7052. ! ==================================================================================================
  7053. SUBROUTINE CO2FLUX (NSNOW ,NSOIL ,VEGTYP ,IGS ,DT , & !in
  7054. DZSNSO ,STC ,PSN ,TROOT ,TV , & !in
  7055. WROOT ,WSTRES ,FOLN ,LAPM , & !in
  7056. LAT ,ILOC ,JLOC ,FVEG , & !in
  7057. XLAI ,XSAI ,LFMASS ,RTMASS ,STMASS , & !inout
  7058. FASTCP ,STBLCP ,WOOD , & !inout
  7059. GPP ,NPP ,NEE ,AUTORS ,HETERS , & !out
  7060. TOTSC ,TOTLB ) !out
  7061. ! -----------------------------------------------------------------------------------------
  7062. ! The original code is from RE Dickinson et al.(1998), modifed by Guo-Yue Niu, 2004
  7063. ! -----------------------------------------------------------------------------------------
  7064. USE NOAHMP_VEG_PARAMETERS
  7065. ! -----------------------------------------------------------------------------------------
  7066. IMPLICIT NONE
  7067. ! -----------------------------------------------------------------------------------------
  7068. ! input
  7069. INTEGER , INTENT(IN) :: ILOC !grid index
  7070. INTEGER , INTENT(IN) :: JLOC !grid index
  7071. INTEGER , INTENT(IN) :: VEGTYP !vegetation physiology type
  7072. INTEGER , INTENT(IN) :: NSNOW !number of snow layers
  7073. INTEGER , INTENT(IN) :: NSOIL !number of soil layers
  7074. REAL , INTENT(IN) :: DT !time step (s)
  7075. REAL , INTENT(IN) :: LAT !latitude (radians)
  7076. REAL , INTENT(IN) :: IGS !growing season index (0=off, 1=on)
  7077. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m]
  7078. REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature [k]
  7079. REAL , INTENT(IN) :: PSN !total leaf photosynthesis (umolco2/m2/s)
  7080. REAL , INTENT(IN) :: TROOT !root-zone averaged temperature (k)
  7081. REAL , INTENT(IN) :: TV !leaf temperature (k)
  7082. REAL , INTENT(IN) :: WROOT !root zone soil water
  7083. REAL , INTENT(IN) :: WSTRES !soil water stress
  7084. REAL , INTENT(IN) :: FOLN !foliage nitrogen (%)
  7085. REAL , INTENT(IN) :: LAPM !leaf area per unit mass [m2/g]
  7086. REAL , INTENT(IN) :: FVEG !vegetation greenness fraction
  7087. ! input and output
  7088. REAL , INTENT(INOUT) :: XLAI !leaf area index from leaf carbon [-]
  7089. REAL , INTENT(INOUT) :: XSAI !stem area index from leaf carbon [-]
  7090. REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2]
  7091. REAL , INTENT(INOUT) :: RTMASS !mass of fine roots [g/m2]
  7092. REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2]
  7093. REAL , INTENT(INOUT) :: FASTCP !short lived carbon [g/m2]
  7094. REAL , INTENT(INOUT) :: STBLCP !stable carbon pool [g/m2]
  7095. REAL , INTENT(INOUT) :: WOOD !mass of wood (incl. woody roots) [g/m2]
  7096. ! output
  7097. REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s]
  7098. REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2]
  7099. REAL , INTENT(OUT) :: NEE !net ecosystem exchange (autors+heters-gpp)
  7100. REAL , INTENT(OUT) :: AUTORS !net ecosystem resp. (maintance and growth)
  7101. REAL , INTENT(OUT) :: HETERS !organic respiration
  7102. REAL , INTENT(OUT) :: TOTSC !total soil carbon (g/m2)
  7103. REAL , INTENT(OUT) :: TOTLB !total living carbon (g/m2)
  7104. ! local
  7105. REAL :: CFLUX !carbon flux to atmosphere [g/m2/s]
  7106. REAL :: LFMSMN !minimum leaf mass [g/m2]
  7107. REAL :: RSWOOD !wood respiration [g/m2]
  7108. REAL :: RSLEAF !leaf maintenance respiration per timestep [g/m2]
  7109. REAL :: RSROOT !fine root respiration per time step [g/m2]
  7110. REAL :: NPPL !leaf net primary productivity [g/m2/s]
  7111. REAL :: NPPR !root net primary productivity [g/m2/s]
  7112. REAL :: NPPW !wood net primary productivity [g/m2/s]
  7113. REAL :: NPPS !wood net primary productivity [g/m2/s]
  7114. REAL :: DIELF !death of leaf mass per time step [g/m2]
  7115. REAL :: ADDNPPLF !leaf assimil after resp. losses removed [g/m2]
  7116. REAL :: ADDNPPST !stem assimil after resp. losses removed [g/m2]
  7117. REAL :: CARBFX !carbon assimilated per model step [g/m2]
  7118. REAL :: GRLEAF !growth respiration rate for leaf [g/m2/s]
  7119. REAL :: GRROOT !growth respiration rate for root [g/m2/s]
  7120. REAL :: GRWOOD !growth respiration rate for wood [g/m2/s]
  7121. REAL :: GRSTEM !growth respiration rate for stem [g/m2/s]
  7122. REAL :: LEAFPT !fraction of carbon allocated to leaves [-]
  7123. REAL :: LFDEL !maximum leaf mass available to change [g/m2/s]
  7124. REAL :: LFTOVR !stem turnover per time step [g/m2]
  7125. REAL :: STTOVR !stem turnover per time step [g/m2]
  7126. REAL :: WDTOVR !wood turnover per time step [g/m2]
  7127. REAL :: RSSOIL !soil respiration per time step [g/m2]
  7128. REAL :: RTTOVR !root carbon loss per time step by turnover [g/m2]
  7129. REAL :: STABLC !decay rate of fast carbon to slow carbon [g/m2/s]
  7130. REAL :: WOODF !calculated wood to root ratio [-]
  7131. REAL :: NONLEF !fraction of carbon to root and wood [-]
  7132. REAL :: ROOTPT !fraction of carbon flux to roots [-]
  7133. REAL :: WOODPT !fraction of carbon flux to wood [-]
  7134. REAL :: STEMPT !fraction of carbon flux to stem [-]
  7135. REAL :: RESP !leaf respiration [umol/m2/s]
  7136. REAL :: RSSTEM !stem respiration [g/m2/s]
  7137. REAL :: FSW !soil water factor for microbial respiration
  7138. REAL :: FST !soil temperature factor for microbial respiration
  7139. REAL :: FNF !foliage nitrogen adjustemt to respiration (<= 1)
  7140. REAL :: TF !temperature factor
  7141. REAL :: RF !respiration reduction factor (<= 1)
  7142. REAL :: STDEL
  7143. REAL :: STMSMN
  7144. REAL :: SAPM !stem area per unit mass (m2/g)
  7145. REAL :: DIEST
  7146. ! -------------------------- constants -------------------------------
  7147. REAL :: BF !parameter for present wood allocation [-]
  7148. REAL :: RSWOODC !wood respiration coeficient [1/s]
  7149. REAL :: STOVRC !stem turnover coefficient [1/s]
  7150. REAL :: RSDRYC !degree of drying that reduces soil respiration [-]
  7151. REAL :: RTOVRC !root turnover coefficient [1/s]
  7152. REAL :: WSTRC !water stress coeficient [-]
  7153. REAL :: LAIMIN !minimum leaf area index [m2/m2]
  7154. REAL :: XSAMIN !minimum leaf area index [m2/m2]
  7155. REAL :: SC
  7156. REAL :: SD
  7157. REAL :: VEGFRAC
  7158. ! Respiration as a function of temperature
  7159. real :: r,x
  7160. r(x) = exp(0.08*(x-298.16))
  7161. ! ---------------------------------------------------------------------------------
  7162. ! constants
  7163. RTOVRC = 2.0E-8 !original was 2.0e-8
  7164. RSDRYC = 40.0 !original was 40.0
  7165. RSWOODC = 3.0E-10 !
  7166. BF = 0.90 !original was 0.90 ! carbon to roots
  7167. WSTRC = 100.0
  7168. LAIMIN = 0.05
  7169. XSAMIN = 0.01
  7170. SAPM = 3.*0.001 ! m2/kg -->m2/g
  7171. LFMSMN = laimin/lapm
  7172. STMSMN = xsamin/sapm
  7173. ! ---------------------------------------------------------------------------------
  7174. ! respiration
  7175. IF(IGS .EQ. 0.) THEN
  7176. RF = 0.5
  7177. ELSE
  7178. RF = 1.0
  7179. ENDIF
  7180. FNF = MIN( FOLN/MAX(1.E-06,FOLNMX(VEGTYP)), 1.0 )
  7181. TF = ARM(VEGTYP)**( (TV-298.16)/10. )
  7182. RESP = RMF25(VEGTYP) * TF * FNF * XLAI * RF * (1.-WSTRES) ! umol/m2/s
  7183. RSLEAF = MIN(LFMASS/DT,RESP*12.e-6) ! g/m2/s
  7184. RSROOT = RMR25(VEGTYP)*(RTMASS*1E-3)*TF *RF* 12.e-6 ! g/m2/s
  7185. RSSTEM = RMS25(VEGTYP)*(STMASS*1E-3)*TF *RF* 12.e-6 ! g/m2/s
  7186. RSWOOD = RSWOODC * R(TV) * WOOD*WDPOOL(VEGTYP)
  7187. ! carbon assimilation
  7188. ! 1 mole -> 12 g carbon or 44 g CO2; 1 umol -> 12.e-6 g carbon;
  7189. CARBFX = PSN * 12.e-6 ! umol co2 /m2/ s -> g/m2/s carbon
  7190. ! fraction of carbon into leaf versus nonleaf
  7191. LEAFPT = EXP(0.01*(1.-EXP(0.75*XLAI))*XLAI)
  7192. IF(VEGTYP ==EBLFOREST) LEAFPT = EXP(0.01*(1.-EXP(0.50*XLAI))*XLAI)
  7193. NONLEF = 1.0 - LEAFPT
  7194. STEMPT = XLAI/10.0
  7195. LEAFPT = LEAFPT - STEMPT
  7196. ! fraction of carbon into wood versus root
  7197. IF(WOOD.GT.0) THEN
  7198. WOODF = (1.-EXP(-BF*(WRRAT(VEGTYP)*RTMASS/WOOD))/BF)*WDPOOL(VEGTYP)
  7199. ELSE
  7200. WOODF = 0.
  7201. ENDIF
  7202. ROOTPT = NONLEF*(1.-WOODF)
  7203. WOODPT = NONLEF*WOODF
  7204. ! leaf and root turnover per time step
  7205. LFTOVR = LTOVRC(VEGTYP)*1.E-6*LFMASS
  7206. STTOVR = LTOVRC(VEGTYP)*1.E-6*STMASS
  7207. RTTOVR = RTOVRC*RTMASS
  7208. WDTOVR = 9.5E-10*WOOD
  7209. ! seasonal leaf die rate dependent on temp and water stress
  7210. ! water stress is set to 1 at permanent wilting point
  7211. SC = EXP(-0.3*MAX(0.,TV-TDLEF(VEGTYP))) * (LFMASS/120.)
  7212. SD = EXP((WSTRES-1.)*WSTRC)
  7213. DIELF = LFMASS*1.E-6*(DILEFW(VEGTYP) * SD + DILEFC(VEGTYP)*SC)
  7214. DIEST = STMASS*1.E-6*(DILEFW(VEGTYP) * SD + DILEFC(VEGTYP)*SC)
  7215. ! calculate growth respiration for leaf, rtmass and wood
  7216. GRLEAF = MAX(0.0,FRAGR(VEGTYP)*(LEAFPT*CARBFX - RSLEAF))
  7217. GRSTEM = MAX(0.0,FRAGR(VEGTYP)*(STEMPT*CARBFX - RSSTEM))
  7218. GRROOT = MAX(0.0,FRAGR(VEGTYP)*(ROOTPT*CARBFX - RSROOT))
  7219. GRWOOD = MAX(0.0,FRAGR(VEGTYP)*(WOODPT*CARBFX - RSWOOD))
  7220. ! Impose lower T limit for photosynthesis
  7221. ADDNPPLF = MAX(0.,LEAFPT*CARBFX - GRLEAF-RSLEAF)
  7222. ADDNPPST = MAX(0.,STEMPT*CARBFX - GRSTEM-RSSTEM)
  7223. IF(TV.LT.TMIN(VEGTYP)) ADDNPPLF =0.
  7224. IF(TV.LT.TMIN(VEGTYP)) ADDNPPST =0.
  7225. ! update leaf, root, and wood carbon
  7226. ! avoid reducing leaf mass below its minimum value but conserve mass
  7227. LFDEL = (LFMASS - LFMSMN)/DT
  7228. STDEL = (STMASS - STMSMN)/DT
  7229. DIELF = MIN(DIELF,LFDEL+ADDNPPLF-LFTOVR)
  7230. DIEST = MIN(DIEST,STDEL+ADDNPPST-STTOVR)
  7231. ! net primary productivities
  7232. NPPL = MAX(ADDNPPLF,-LFDEL)
  7233. NPPS = MAX(ADDNPPST,-STDEL)
  7234. NPPR = ROOTPT*CARBFX - RSROOT - GRROOT
  7235. NPPW = WOODPT*CARBFX - RSWOOD - GRWOOD
  7236. ! masses of plant components
  7237. LFMASS = LFMASS + (NPPL-LFTOVR-DIELF)*DT
  7238. STMASS = STMASS + (NPPS-STTOVR-DIEST)*DT ! g/m2
  7239. RTMASS = RTMASS + (NPPR-RTTOVR) *DT
  7240. IF(RTMASS.LT.0.0) THEN
  7241. RTTOVR = NPPR
  7242. RTMASS = 0.0
  7243. ENDIF
  7244. WOOD = (WOOD+(NPPW-WDTOVR)*DT)*WDPOOL(VEGTYP)
  7245. ! soil carbon budgets
  7246. FASTCP = FASTCP + (RTTOVR+LFTOVR+STTOVR+WDTOVR+DIELF)*DT
  7247. FST = 2.0**( (STC(1)-283.16)/10. )
  7248. FSW = WROOT / (0.20+WROOT) * 0.23 / (0.23+WROOT)
  7249. RSSOIL = FSW * FST * MRP(VEGTYP)* MAX(0.,FASTCP*1.E-3)*12.E-6
  7250. STABLC = 0.1*RSSOIL
  7251. FASTCP = FASTCP - (RSSOIL + STABLC)*DT
  7252. STBLCP = STBLCP + STABLC*DT
  7253. ! total carbon flux
  7254. CFLUX = - CARBFX + RSLEAF + RSROOT + RSWOOD + RSSTEM &
  7255. + RSSOIL + GRLEAF + GRROOT + GRWOOD ! g/m2/s
  7256. ! for outputs
  7257. GPP = CARBFX !g/m2/s C
  7258. NPP = NPPL + NPPW + NPPR !g/m2/s C
  7259. AUTORS = RSROOT + RSWOOD + RSLEAF + & !g/m2/s C
  7260. GRLEAF + GRROOT + GRWOOD !g/m2/s C
  7261. HETERS = RSSOIL !g/m2/s C
  7262. NEE = (AUTORS + HETERS - GPP)*44./12. !g/m2/s CO2
  7263. TOTSC = FASTCP + STBLCP !g/m2 C
  7264. TOTLB = LFMASS + RTMASS + WOOD !g/m2 C
  7265. ! leaf area index and stem area index
  7266. XLAI = MAX(LFMASS*LAPM,LAIMIN)
  7267. XSAI = MAX(STMASS*SAPM,XSAMIN)
  7268. END SUBROUTINE CO2FLUX
  7269. ! ==================================================================================================
  7270. ! ------------------------------------------------------------------------------------------
  7271. SUBROUTINE BVOCFLUX(VOCFLX, VEGTYP, VEGFRAC, APAR, TV )
  7272. use NOAHMP_VEG_PARAMETERS , ONLY : SLAREA, EPS
  7273. ! ------------------------------------------------------------------------------------------
  7274. ! ------------------------------------------------------------------------------------------
  7275. implicit none
  7276. ! ------------------------------------------------------------------------------------------
  7277. ! ------------------------ code history ---------------------------
  7278. ! source file: BVOC
  7279. ! purpose: BVOC emissions
  7280. ! DESCRIPTION:
  7281. ! Volatile organic compound emission
  7282. ! This code simulates volatile organic compound emissions
  7283. ! following the algorithm presented in Guenther, A., 1999: Modeling
  7284. ! Biogenic Volatile Organic Compound Emissions to the Atmosphere. In
  7285. ! Reactive Hydrocarbons in the Atmosphere, Ch. 3
  7286. ! This model relies on the assumption that 90% of isoprene and monoterpene
  7287. ! emissions originate from canopy foliage:
  7288. ! E = epsilon * gamma * density * delta
  7289. ! The factor delta (longterm activity factor) applies to isoprene emission
  7290. ! from deciduous plants only. We neglect this factor at the present time.
  7291. ! This factor is discussed in Guenther (1997).
  7292. ! Subroutine written to operate at the patch level.
  7293. ! IN FINAL IMPLEMENTATION, REMEMBER:
  7294. ! 1. may wish to call this routine only as freq. as rad. calculations
  7295. ! 2. may wish to place epsilon values directly in pft-physiology file
  7296. ! ------------------------ input/output variables -----------------
  7297. ! input
  7298. integer ,INTENT(IN) :: vegtyp !vegetation type
  7299. real ,INTENT(IN) :: vegfrac !green vegetation fraction [0.0-1.0]
  7300. real ,INTENT(IN) :: apar !photosynthesis active energy by canopy (w/m2)
  7301. real ,INTENT(IN) :: tv !vegetation canopy temperature (k)
  7302. ! output
  7303. real ,INTENT(OUT) :: vocflx(5) ! voc fluxes [ug C m-2 h-1]
  7304. ! Local Variables
  7305. real, parameter :: R = 8.314 ! univ. gas constant [J K-1 mol-1]
  7306. real, parameter :: alpha = 0.0027 ! empirical coefficient
  7307. real, parameter :: cl1 = 1.066 ! empirical coefficient
  7308. real, parameter :: ct1 = 95000.0 ! empirical coefficient [J mol-1]
  7309. real, parameter :: ct2 = 230000.0 ! empirical coefficient [J mol-1]
  7310. real, parameter :: ct3 = 0.961 ! empirical coefficient
  7311. real, parameter :: tm = 314.0 ! empirical coefficient [K]
  7312. real, parameter :: tstd = 303.0 ! std temperature [K]
  7313. real, parameter :: bet = 0.09 ! beta empirical coefficient [K-1]
  7314. integer ivoc ! do-loop index
  7315. integer ityp ! do-loop index
  7316. real epsilon(5)
  7317. real gamma(5)
  7318. real density
  7319. real elai
  7320. real par,cl,reciprod,ct
  7321. ! epsilon :
  7322. do ivoc = 1, 5
  7323. epsilon(ivoc) = eps(VEGTYP,ivoc)
  7324. end do
  7325. ! gamma : Activity factor. Units [dimensionless]
  7326. reciprod = 1. / (R * tv * tstd)
  7327. ct = exp(ct1 * (tv - tstd) * reciprod) / &
  7328. (ct3 + exp(ct2 * (tv - tm) * reciprod))
  7329. par = apar * 4.6 ! (multiply w/m2 by 4.6 to get umol/m2/s)
  7330. cl = alpha * cl1 * par * (1. + alpha * alpha * par * par)**(-0.5)
  7331. gamma(1) = cl * ct ! for isoprenes
  7332. do ivoc = 2, 5
  7333. gamma(ivoc) = exp(bet * (tv - tstd))
  7334. end do
  7335. ! Foliage density
  7336. ! transform vegfrac to lai
  7337. elai = max(0.0,-6.5/2.5*alog((1.-vegfrac)))
  7338. density = elai / (slarea(VEGTYP) * 0.5)
  7339. ! calculate the voc flux
  7340. do ivoc = 1, 5
  7341. vocflx(ivoc) = epsilon(ivoc) * gamma(ivoc) * density
  7342. end do
  7343. end subroutine bvocflux
  7344. ! ==================================================================================================
  7345. ! ********************************* end of carbon subroutines *****************************
  7346. ! ==================================================================================================
  7347. SUBROUTINE REDPRM (VEGTYP,SOILTYP,SLOPETYP,SLDPTH,ZSOIL,NSOIL,ISURBAN)
  7348. !niu use module_sf_noahlsm_param_init
  7349. IMPLICIT NONE
  7350. ! ----------------------------------------------------------------------
  7351. ! Internally set (default valuess)
  7352. ! all soil and vegetation parameters required for the execusion oF
  7353. ! the Noah lsm are defined in VEGPARM.TBL, SOILPARM.TB, and GENPARM.TBL.
  7354. ! ----------------------------------------------------------------------
  7355. ! Vegetation parameters:
  7356. ! CMXTBL: MAX CNPY Capacity
  7357. ! NROOT: Rooting depth
  7358. !
  7359. ! ----------------------------------------------------------------------
  7360. ! Soil parameters:
  7361. ! SSATPSI: SAT (saturation) soil potential
  7362. ! SSATDW: SAT soil diffusivity
  7363. ! F1: Soil thermal diffusivity/conductivity coef.
  7364. ! QUARTZ: Soil quartz content
  7365. ! Modified by F. Chen (12/22/97) to use the STATSGO soil map
  7366. ! Modified By F. Chen (01/22/00) to include PLaya, Lava, and White San
  7367. ! Modified By F. Chen (08/05/02) to include additional parameters for the Noah
  7368. ! NOTE: SATDW = BB*SATDK*(SATPSI/MAXSMC)
  7369. ! F11 = ALOG10(SATPSI) + BB*ALOG10(MAXSMC) + 2.0
  7370. ! REFSMC1=MAXSMC*(5.79E-9/SATDK)**(1/(2*BB+3)) 5.79E-9 m/s= 0.5 mm
  7371. ! REFSMC=REFSMC1+1./3.(MAXSMC-REFSMC1)
  7372. ! WLTSMC1=MAXSMC*(200./SATPSI)**(-1./BB) (Wetzel and Chang, 198
  7373. ! WLTSMC=WLTSMC1-0.5*WLTSMC1
  7374. ! Note: the values for playa is set for it to have a thermal conductivit
  7375. ! as sand and to have a hydrulic conductivity as clay
  7376. !
  7377. ! ----------------------------------------------------------------------
  7378. ! BLANK OCEAN/SEA
  7379. ! CSOIL_DATA: soil heat capacity [J M-3 K-1]
  7380. ! ZBOT_DATA: depth[M] of lower boundary soil temperature
  7381. ! CZIL_DATA: calculate roughness length of heat
  7382. ! SMLOW_DATA and MHIGH_DATA: two soil moisture wilt, soil moisture referen
  7383. ! parameters
  7384. ! Set maximum number of soil- and veg- in data statement.
  7385. ! ----------------------------------------------------------------------
  7386. INTEGER, PARAMETER :: MAX_SOILTYP=30,MAX_VEGTYP=30
  7387. ! Veg parameters
  7388. INTEGER, INTENT(IN) :: VEGTYP
  7389. INTEGER, INTENT(IN) :: ISURBAN
  7390. ! Soil parameters
  7391. INTEGER, INTENT(IN) :: SOILTYP
  7392. ! General parameters
  7393. INTEGER, INTENT(IN) :: SLOPETYP
  7394. ! General parameters
  7395. INTEGER, INTENT(IN) :: NSOIL
  7396. ! Layer parameters
  7397. REAL,DIMENSION(NSOIL),INTENT(IN) :: SLDPTH
  7398. REAL,DIMENSION(NSOIL),INTENT(IN) :: ZSOIL
  7399. ! Locals
  7400. REAL :: REFDK
  7401. REAL :: REFKDT
  7402. REAL :: FRZK
  7403. REAL :: FRZFACT
  7404. INTEGER :: I
  7405. CHARACTER(len=256) :: message
  7406. ! ----------------------------------------------------------------------
  7407. !
  7408. IF (SOILTYP .gt. SLCATS) THEN
  7409. call wrf_message('SOILTYP must be less than SLCATS:')
  7410. write(message, '("SOILTYP = ", I6, "; SLCATS = ", I6)') SOILTYP, SLCATS
  7411. call wrf_message(trim(message))
  7412. call wrf_error_fatal ('REDPRM: Error: too many input soil types')
  7413. END IF
  7414. IF (VEGTYP .gt. LUCATS) THEN
  7415. call wrf_message('VEGTYP must be less than LUCATS:')
  7416. write(message, '("VEGTYP = ", I6, "; LUCATS = ", I6)') VEGTYP, LUCATS
  7417. call wrf_message(trim(message))
  7418. call wrf_error_fatal ('Error: too many input landuse types')
  7419. END IF
  7420. ! ----------------------------------------------------------------------
  7421. ! SET-UP SOIL PARAMETERS
  7422. ! ----------------------------------------------------------------------
  7423. CSOIL = CSOIL_DATA
  7424. BEXP = BB (SOILTYP)
  7425. DKSAT = SATDK (SOILTYP)
  7426. DWSAT = SATDW (SOILTYP)
  7427. F1 = F11 (SOILTYP)
  7428. PSISAT = SATPSI (SOILTYP)
  7429. QUARTZ = QTZ (SOILTYP)
  7430. SMCDRY = DRYSMC (SOILTYP)
  7431. SMCMAX = MAXSMC (SOILTYP)
  7432. SMCREF = REFSMC (SOILTYP)
  7433. SMCWLT = WLTSMC (SOILTYP)
  7434. IF(VEGTYP==ISURBAN)THEN
  7435. SMCMAX = 0.45
  7436. SMCREF = 0.42
  7437. SMCWLT = 0.40
  7438. SMCDRY = 0.40
  7439. CSOIL = 3.E6
  7440. ENDIF
  7441. ! ----------------------------------------------------------------------
  7442. ! Set-up universal parameters (not dependent on SOILTYP, VEGTYP)
  7443. ! ----------------------------------------------------------------------
  7444. ZBOT = ZBOT_DATA
  7445. CZIL = CZIL_DATA
  7446. FRZK = FRZK_DATA
  7447. REFDK = REFDK_DATA
  7448. REFKDT = REFKDT_DATA
  7449. KDT = REFKDT * DKSAT / REFDK
  7450. SLOPE = SLOPE_DATA (SLOPETYP)
  7451. ! adjust FRZK parameter to actual soil type: FRZK * FRZFACT
  7452. if(SOILTYP /= 14) then
  7453. FRZFACT = (SMCMAX / SMCREF) * (0.412 / 0.468)
  7454. FRZX = FRZK * FRZFACT
  7455. end if
  7456. ! write(*,*) FRZK, FRZX, KDT, SLOPE, SLOPETYP
  7457. ! ----------------------------------------------------------------------
  7458. ! SET-UP VEGETATION PARAMETERS
  7459. ! ----------------------------------------------------------------------
  7460. ! Six redprm_canres variables:
  7461. TOPT = TOPT_DATA
  7462. RGL = RGLTBL (VEGTYP)
  7463. RSMAX = RSMAX_DATA
  7464. RSMIN = RSTBL (VEGTYP)
  7465. HS = HSTBL (VEGTYP)
  7466. NROOT = NROTBL (VEGTYP)
  7467. IF(VEGTYP==ISURBAN)THEN
  7468. RSMIN=400.0
  7469. ENDIF
  7470. ! SHDFAC = SHDTBL(VEGTYP)
  7471. ! IF (VEGTYP .eq. BARE) SHDFAC = 0.0
  7472. IF (NROOT .gt. NSOIL) THEN
  7473. WRITE (*,*) 'Warning: too many root layers'
  7474. write (*,*) 'NROOT = ', nroot
  7475. write (*,*) 'NSOIL = ', nsoil
  7476. call wrf_error_fatal("STOP in Noah-MP")
  7477. END IF
  7478. ! ----------------------------------------------------------------------
  7479. END SUBROUTINE REDPRM
  7480. !jref:start; calculate effective parameters for PBL and diagnostics
  7481. ! ==================================================================
  7482. SUBROUTINE EPARM(ILOC ,JLOC ,TAH ,TGB ,FVEG , &
  7483. CHV ,CHB ,VEG ,CHSTAR ,TSTAR) !inout
  7484. ! ------------------------------------------------------------------
  7485. ! calculate effective parameters for diagnostic terms.
  7486. ! Joakim Refslund, 2011
  7487. ! ------------------------------------------------------------------
  7488. IMPLICIT NONE
  7489. ! ------------------------------------------------------------------
  7490. ! input
  7491. INTEGER, INTENT(IN) :: ILOC
  7492. INTEGER, INTENT(IN) :: JLOC
  7493. REAL , INTENT(IN) :: TAH !canopy air temperature (k)
  7494. REAL , INTENT(IN) :: TGB !ground surface temp. [k]
  7495. REAL , INTENT(IN) :: FVEG !greeness vegetation fraction (-)
  7496. REAL , INTENT(IN) :: CHV !coefficient sens. heat canopy air to atm
  7497. REAL , INTENT(IN) :: CHB !coefficient sens. heat ground to atm
  7498. LOGICAL, INTENT(IN) :: VEG !Veg.Fraction based on LAI/SAI - NOT min. value
  7499. ! output
  7500. REAL, INTENT(OUT) :: CHSTAR !effective sensible heat exchange coefficient
  7501. REAL, INTENT(OUT) :: TSTAR !effective skin temperature
  7502. ! local
  7503. REAL :: W !weight
  7504. ! INTEGER, INTENT(IN) :: VEGTYP
  7505. ! ------------------------------------------------------------------
  7506. ! effective exchange coefficient for PBL.
  7507. IF (VEG) THEN
  7508. CHSTAR = FVEG*CHV +(1.-FVEG)*CHB
  7509. W = FVEG*CHV*TAH+(1.-FVEG)*CHB*TGB
  7510. TSTAR = W/CHSTAR
  7511. ELSE
  7512. CHSTAR = CHB
  7513. TSTAR = TGB
  7514. ENDIF
  7515. END SUBROUTINE EPARM
  7516. !jref:end
  7517. ! ==================================================================================================
  7518. subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz , &
  7519. iopt_inf ,iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc )
  7520. implicit none
  7521. INTEGER, INTENT(IN) :: idveg !dynamic vegetation (1 -> off ; 2 -> on) with opt_crs = 1
  7522. INTEGER, INTENT(IN) :: iopt_crs !canopy stomatal resistance (1-> Ball-Berry; 2->Jarvis)
  7523. INTEGER, INTENT(IN) :: iopt_btr !soil moisture factor for stomatal resistance (1-> Noah; 2-> CLM; 3-> SSiB)
  7524. INTEGER, INTENT(IN) :: iopt_run !runoff and groundwater (1->SIMGM; 2->SIMTOP; 3->Schaake96; 4->BATS)
  7525. INTEGER, INTENT(IN) :: iopt_sfc !surface layer drag coeff (CH & CM) (1->M-O; 2->Chen97)
  7526. INTEGER, INTENT(IN) :: iopt_frz !supercooled liquid water (1-> NY06; 2->Koren99)
  7527. INTEGER, INTENT(IN) :: iopt_inf !frozen soil permeability (1-> NY06; 2->Koren99)
  7528. INTEGER, INTENT(IN) :: iopt_rad !radiation transfer (1->gap=F(3D,cosz); 2->gap=0; 3->gap=1-Fveg)
  7529. INTEGER, INTENT(IN) :: iopt_alb !snow surface albedo (1->BATS; 2->CLASS)
  7530. INTEGER, INTENT(IN) :: iopt_snf !rainfall & snowfall (1-Jordan91; 2->BATS; 3->Noah)
  7531. INTEGER, INTENT(IN) :: iopt_tbot !lower boundary of soil temperature (1->zero-flux; 2->Noah)
  7532. INTEGER, INTENT(IN) :: iopt_stc !snow/soil temperature time scheme (only layer 1)
  7533. ! 1 -> semi-implicit; 2 -> full implicit (original Noah)
  7534. ! -------------------------------------------------------------------------------------------------
  7535. dveg = idveg
  7536. opt_crs = iopt_crs
  7537. opt_btr = iopt_btr
  7538. opt_run = iopt_run
  7539. opt_sfc = iopt_sfc
  7540. opt_frz = iopt_frz
  7541. opt_inf = iopt_inf
  7542. opt_rad = iopt_rad
  7543. opt_alb = iopt_alb
  7544. opt_snf = iopt_snf
  7545. opt_tbot = iopt_tbot
  7546. opt_stc = iopt_stc
  7547. end subroutine noahmp_options
  7548. END MODULE NOAHMP_ROUTINES
  7549. ! ==================================================================================================
  7550. MODULE MODULE_SF_NOAHMPLSM
  7551. USE NOAHMP_ROUTINES
  7552. USE NOAHMP_GLOBALS
  7553. USE NOAHMP_VEG_PARAMETERS
  7554. END MODULE MODULE_SF_NOAHMPLSM