PageRenderTime 67ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/wrfv2_fire/phys/module_sf_noahmpdrv.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1545 lines | 1028 code | 164 blank | 353 comment | 19 complexity | 8474cce8cbf9614dca04b90f4579e1e9 MD5 | raw file
Possible License(s): AGPL-1.0
  1. MODULE module_sf_noahmpdrv
  2. !-------------------------------
  3. USE module_sf_noahmplsm
  4. USE module_sf_urban
  5. USE module_model_constants, ONLY : R_D, CP, XLF, XLV, RHOWATER, KARMAN
  6. USE module_sf_noahdrv, ONLY : SOIL_VEG_GEN_PARM
  7. USE module_sf_noah_seaice
  8. USE module_sf_noahlsm_glacial_only
  9. USE MODULE_RA_GFDLETA, ONLY: CAL_MON_DAY
  10. #ifdef WRF_CHEM
  11. USE module_data_gocart_dust
  12. #endif
  13. !-------------------------------
  14. !
  15. CONTAINS
  16. !
  17. SUBROUTINE noahmplsm(DZ8W,QV3D,P8W3D,T3D,TSK, &
  18. HFX,QFX,LH,GRDFLX, QGH,GSW,SWDOWN,GLW,SMSTAV,SMSTOT, &
  19. SFCRUNOFF, UDRUNOFF,IVGTYP,ISLTYP,VEGFRA, &
  20. ALBEDO,ALBBCK,ZNT,Z0,TMN,XLAND,XICE,XICE_THRESHOLD,ISICE,EMISS,EMBCK, &
  21. SNOWC,QSFC,RAINBL, &
  22. num_soil_layers,DT,DZS,ITIMESTEP, &
  23. SMOIS,TSLB,SNOW,CANWAT, &
  24. CHS,CHS2,CQS2,CPM,ROVCP,SR,chklowq,qz0, & !H
  25. myj,RIB,frpcpn, &
  26. SH2O,SNOWH, & !H
  27. U_PHY,V_PHY, & !I
  28. COSZ_URB2D, XLAT_URB2D, & !I
  29. SNOALB, & !I
  30. SNOTIME,ACSNOM,ACSNOW, & !O
  31. idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz ,iopt_inf , &
  32. iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot,iopt_stc , &
  33. isnowxy ,tvxy ,tgxy ,canicexy , &
  34. canliqxy ,eahxy ,tahxy ,cmxy ,chxy , &
  35. fwetxy ,sneqvoxy ,alboldxy ,qsnowxy ,wslakexy ,zwtxy ,waxy , &
  36. wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy , &
  37. stmassxy ,woodxy ,stblcpxy ,fastcpxy ,xlaixy ,xsaixy , &
  38. tradxy ,tsxy ,neexy ,gppxy ,nppxy ,fvegxy ,qinxy , &
  39. runsfxy ,runsbxy ,ecanxy ,edirxy ,etranxy ,fsaxy ,firaxy , &
  40. aparxy ,psnxy ,savxy ,sagxy , &
  41. fsnoxy ,YR ,JULIAN , &
  42. potevp, & !O
  43. !jref:start
  44. qcxy ,pblhxy ,isurban ,iz0tlnd ,dx , & !I
  45. chstarxy ,t2mvxy ,t2mbxy ,rssunxy ,rsshaxy, bgapxy ,wgapxy ,gapxy, & !O
  46. tgvxy ,tgbxy ,q2mvxy ,q2mbxy ,shdmaxxy, chvxy ,chbxy , &
  47. !jref:end
  48. ids,ide, jds,jde, kds,kde, &
  49. ims,ime, jms,jme, kms,kme, &
  50. its,ite, jts,jte, kts,kte )
  51. !----------------------------------------------------------------
  52. IMPLICIT NONE
  53. !----------------------------------------------------------------
  54. !----------------------------------------------------------------
  55. ! --- atmospheric (WRF generic) variables
  56. !-- DT time step (seconds)
  57. !-- DZ8W thickness of layers (m)
  58. !-- T3D temperature (K)
  59. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  60. !-- P3D 3D pressure (Pa)
  61. !-- FLHC exchange coefficient for heat (m/s)
  62. !-- FLQC exchange coefficient for moisture (m/s)
  63. !-- PSFC surface pressure (Pa)
  64. !-- XLAND land mask (1 for land, 2 for water)
  65. !-- QGH saturated mixing ratio at 2 meter
  66. !-- GSW downward short wave flux at ground surface (W/m^2)
  67. !-- GLW downward long wave flux at ground surface (W/m^2)
  68. !-- History variables
  69. !-- CANWAT canopy moisture content (mm)
  70. !-- TSK surface temperature (K)
  71. !-- TSLB soil temp (k)
  72. !-- SMOIS total soil moisture content (volumetric fraction)
  73. !-- SH2O unfrozen soil moisture content (volumetric fraction)
  74. ! note: frozen soil moisture (i.e., soil ice) = SMOIS - SH2O
  75. !-- SNOWH actual snow depth (m)
  76. !-- SNOW liquid water-equivalent snow depth (m)
  77. !-- ALBEDO time-varying surface albedo including snow effect (unitless fraction)
  78. !-- ALBBCK background surface albedo (unitless fraction)
  79. !-- CHS surface exchange coefficient for heat and moisture (m s-1);
  80. !-- CHS2 2m surface exchange coefficient for heat (m s-1);
  81. !-- CQS2 2m surface exchange coefficient for moisture (m s-1);
  82. ! --- soil variables
  83. !-- num_soil_layers the number of soil layers
  84. !-- ZS depths of centers of soil layers (m)
  85. !-- DZS thicknesses of soil layers (m)
  86. !-- SLDPTH thickness of each soil layer (m, same as DZS)
  87. !-- TMN soil temperature at lower boundary (K)
  88. !-- SMCMAX porosity, i.e. saturated value of soil moisture (volumetric)
  89. !-- NROOT number of root layers, a function of veg type, determined
  90. ! in subroutine redprm.
  91. !-- SMSTAV Soil moisture availability for evapotranspiration (
  92. ! fraction between SMCWLT and SMCMXA)
  93. !-- SMSTOT Total soil moisture content frozen+unfrozen) in the soil column (mm)
  94. ! --- snow variables
  95. !-- SNOWC fraction snow coverage (0-1.0)
  96. ! --- vegetation variables
  97. !-- SNOALB upper bound on maximum albedo over deep snow
  98. !-- Z0BRD Background fixed roughness length (M)
  99. !-- Z0 Background vroughness length (M) as function
  100. !-- ZNT Time varying roughness length (M) as function
  101. !-- ALBD(IVGTPK,ISN) background albedo reading from a table
  102. ! --- LSM output
  103. !-- HFX upward heat flux at the surface (W/m^2)
  104. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  105. !-- LH upward moisture flux at the surface (W m-2)
  106. !-- GRDFLX(I,J) ground heat flux (W m-2)
  107. !-- FDOWN radiation forcing at the surface (W m-2) = SOLDN*(1-alb)+LWDN
  108. !----------------------------------------------------------------------------
  109. !-- EC canopy water evaporation ((W m-2)
  110. !-- EDIR direct soil evaporation (W m-2)
  111. !-- ESNOW sublimation from (or deposition to if <0) snowpack (W m-2)
  112. !-- DEW dewfall (or frostfall for t<273.15) (M)
  113. ! ----------------------------------------------------------------------
  114. !-- ETP potential evaporation (W m-2)
  115. ! ----------------------------------------------------------------------
  116. !-- FLX1 precip-snow sfc (W m-2)
  117. !-- FLX2 freezing rain latent heat flux (W m-2)
  118. !-- FLX3 phase-change heat flux from snowmelt (W m-2)
  119. ! ----------------------------------------------------------------------
  120. !-- ACSNOM snow melt (mm) (water equivalent)
  121. !-- ACSNOW accumulated snow fall (mm) (water equivalent)
  122. !-- POTEVP accumulated potential evaporation (W/m^2)
  123. !-- RIB Bulk Richardson number from SFCLAY routine
  124. ! ----------------------------------------------------------------------
  125. !-- RUNOFF1 surface runoff (m s-1), not infiltrating the surface
  126. !-- RUNOFF2 subsurface runoff (m s-1), drainage out bottom of last
  127. ! soil layer (baseflow)
  128. ! ----------------------------------------------------------------------
  129. !-- RC canopy resistance (s m-1)
  130. !-- PC plant coefficient (unitless fraction, 0-1) where PC*ETP = actual transp
  131. !-- EMISS surface emissivity (between 0 and 1)
  132. !-- EMBCK Background surface emissivity (between 0 and 1)
  133. !-- SHDMAX Maximum vegetation fraction
  134. !-- ROVCP R/CP
  135. ! (R_d/R_v) (dimensionless)
  136. !-- ids start index for i in domain
  137. !-- ide end index for i in domain
  138. !-- jds start index for j in domain
  139. !-- jde end index for j in domain
  140. !-- kds start index for k in domain
  141. !-- kde end index for k in domain
  142. !-- ims start index for i in memory
  143. !-- ime end index for i in memory
  144. !-- jms start index for j in memory
  145. !-- jme end index for j in memory
  146. !-- kms start index for k in memory
  147. !-- kme end index for k in memory
  148. !-- its start index for i in tile
  149. !-- ite end index for i in tile
  150. !-- jts start index for j in tile
  151. !-- jte end index for j in tile
  152. !-- kts start index for k in tile
  153. !-- kte end index for k in tile
  154. !
  155. !-- SR fraction of frozen precip (0.0 to 1.0)
  156. !----------------------------------------------------------------
  157. ! IN only
  158. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  159. & ims,ime, jms,jme, kms,kme, &
  160. & its,ite, jts,jte, kts,kte
  161. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: U_PHY
  162. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: V_PHY
  163. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: COSZ_URB2D
  164. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XLAT_URB2D
  165. REAL, DIMENSION( ims:ime, jms:jme ) , &
  166. & INTENT(IN ) :: TMN, &
  167. & XLAND, &
  168. & XICE, &
  169. & VEGFRA, &
  170. & SNOALB, &
  171. & GSW, &
  172. & SWDOWN, &
  173. & GLW, &
  174. & Z0, &
  175. & ALBBCK, &
  176. & RAINBL, &
  177. & EMBCK, &
  178. & SR
  179. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  180. INTENT(IN ) :: QV3D, &
  181. p8w3D, &
  182. DZ8W, &
  183. T3D
  184. !jref:start - changed to inout
  185. REAL, DIMENSION( ims:ime, jms:jme ) , &
  186. INTENT(INOUT ) :: QGH, &
  187. CHS, &
  188. CPM
  189. !jref:end
  190. INTEGER, DIMENSION( ims:ime, jms:jme ) , &
  191. INTENT(IN ) :: IVGTYP, &
  192. ISLTYP
  193. INTEGER, INTENT(IN) :: num_soil_layers,ITIMESTEP
  194. !jref:start - xice_threshold
  195. REAL, INTENT(IN ) :: DT,ROVCP,XICE_THRESHOLD
  196. INTEGER, INTENT(IN ) :: ISICE
  197. !jref:end
  198. REAL, DIMENSION(1:num_soil_layers), INTENT(IN)::DZS
  199. ! IN and OUT
  200. REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), &
  201. & INTENT(INOUT) :: SMOIS, &
  202. & SH2O, &
  203. & TSLB
  204. REAL, DIMENSION( ims:ime, jms:jme ) , &
  205. & INTENT(INOUT) :: TSK, &
  206. & HFX, &
  207. & QFX, &
  208. & LH, &
  209. & GRDFLX, &
  210. & QSFC, &
  211. & CQS2, &
  212. & CHS2, &
  213. & SNOW, &
  214. & SNOWC, &
  215. & SNOWH, &
  216. & CANWAT, &
  217. & SMSTAV, &
  218. & SMSTOT, &
  219. & SFCRUNOFF, &
  220. & UDRUNOFF, &
  221. & ACSNOM, &
  222. & ACSNOW, &
  223. & EMISS, &
  224. & POTEVP, &
  225. & RIB, &
  226. & ALBEDO, &
  227. & ZNT
  228. REAL, DIMENSION( ims:ime, jms:jme ) , &
  229. INTENT(OUT) :: CHKLOWQ
  230. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: QZ0
  231. !niuin:
  232. ! in
  233. INTEGER, INTENT(IN) :: idveg !dynamic vegetation (1 -> off ; 2 -> on) with opt_crs = 1
  234. INTEGER, INTENT(IN) :: iopt_crs !canopy stomatal resistance (1-> Ball-Berry; 2->Jarvis)
  235. INTEGER, INTENT(IN) :: iopt_btr !soil moisture factor for stomatal resistance (1-> Noah; 2-> CLM; 3-> SSiB)
  236. INTEGER, INTENT(IN) :: iopt_run !runoff and groundwater (1->SIMGM; 2->SIMTOP; 3->Schaake96; 4->BATS)
  237. INTEGER, INTENT(IN) :: iopt_sfc !surface layer drag coeff (CH & CM) (1->M-O; 2->Chen97)
  238. INTEGER, INTENT(IN) :: iopt_frz !supercooled liquid water (1-> NY06; 2->Koren99)
  239. INTEGER, INTENT(IN) :: iopt_inf !frozen soil permeability (1-> NY06; 2->Koren99)
  240. INTEGER, INTENT(IN) :: iopt_rad !radiation transfer (1->gap=F(3D,cosz); 2->gap=0; 3->gap=1-Fveg)
  241. INTEGER, INTENT(IN) :: iopt_alb !snow surface albedo (1->BATS; 2->CLASS)
  242. INTEGER, INTENT(IN) :: iopt_snf !rainfall & snowfall (1-Jordan91; 2->BATS; 3->Noah)
  243. INTEGER, INTENT(IN) :: iopt_tbot !lower boundary of soil temperature (1->zero-flux; 2->Noah)
  244. INTEGER, INTENT(IN) :: iopt_stc !snow/soil temperature time scheme
  245. ! in & out
  246. INTEGER, INTENT(IN) :: YR
  247. REAL, INTENT(IN) :: JULIAN
  248. INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: isnowxy !actual no. of snow layers
  249. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tvxy !vegetation canopy temperature
  250. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tgxy !ground surface temperature
  251. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canicexy !canopy-intercepted ice (mm)
  252. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canliqxy !canopy-intercepted liquid water (mm)
  253. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: eahxy !canopy air vapor pressure (pa)
  254. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tahxy !canopy air temperature (k)
  255. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: cmxy !momentum drag coefficient
  256. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chxy !sensible heat exchange coefficient
  257. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fwetxy !wetted or snowed fraction of the canopy (-)
  258. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: sneqvoxy !snow mass at last time step(mm h2o)
  259. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: alboldxy !snow albedo at last time step (-)
  260. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qsnowxy !snowfall on the ground [mm/s]
  261. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wslakexy !lake water storage [mm]
  262. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: zwtxy !water table depth [m]
  263. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: waxy !water in the "aquifer" [mm]
  264. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wtxy !groundwater storage [mm]
  265. REAL, DIMENSION(ims:ime,-2:num_soil_layers,jms:jme), INTENT(INOUT) :: zsnsoxy !snow layer depth [m]
  266. REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: tsnoxy !snow temperature [K]
  267. REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snicexy !snow layer ice [mm]
  268. REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snliqxy !snow layer liquid water [mm]
  269. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: lfmassxy !leaf mass [g/m2]
  270. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: rtmassxy !mass of fine roots [g/m2]
  271. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stmassxy !stem mass [g/m2]
  272. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: woodxy !mass of wood (incl. woody roots) [g/m2]
  273. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stblcpxy !stable carbon in deep soil [g/m2]
  274. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fastcpxy !short-lived carbon, shallow soil [g/m2]
  275. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xlaixy !leaf area index
  276. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xsaixy !stem area index
  277. !jref:start
  278. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: SNOTIME !snow age time
  279. !jref:end
  280. !out
  281. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tradxy !surface radiative temperature (k)
  282. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tsxy !surface temperature (k)
  283. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: neexy !net ecosys exchange (g/m2/s CO2)
  284. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: gppxy !gross primary assimilation [g/m2/s C]
  285. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: nppxy !net primary productivity [g/m2/s C]
  286. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: fvegxy !greenness vegetation fraction [-]
  287. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: qinxy !groundwater recharge [mm/s]
  288. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: runsfxy !surface runoff [mm/s]
  289. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: runsbxy !subsurface runoff [mm/s]
  290. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: ecanxy !evaporation of intercepted water (mm/s)
  291. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: edirxy !soil surface evaporation rate (mm/s]
  292. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: etranxy !transpiration rate (mm/s)
  293. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: fsaxy !total absorbed solar radiation (w/m2)
  294. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: firaxy !total net longwave rad (w/m2) [+ to atm]
  295. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: aparxy !photosyn active energy by canopy (w/m2)
  296. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: psnxy !total photosynthesis (umol co2/m2/s) [+]
  297. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: savxy !solar rad absorbed by veg. (w/m2)
  298. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: sagxy !solar rad absorbed by ground (w/m2)
  299. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: fsnoxy !snow cover fraction (-)
  300. !jref:start
  301. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: chstarxy !effective ch
  302. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: t2mvxy !2m temperature of vegetation part
  303. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: t2mbxy !2m temperature of bare ground part
  304. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: q2mvxy !2m mixing ratio of vegetation part
  305. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: q2mbxy !2m mixing ratio of bare ground part
  306. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: qcxy !cloud water mixing ratio
  307. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: pblhxy !Planetary boundary layer from sfclay
  308. INTEGER , INTENT(IN) :: isurban
  309. INTEGER , INTENT(IN) :: iz0tlnd
  310. REAL , INTENT(IN) :: dx
  311. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: rssunxy !sunlit leaf stomatal resistance (s/m)
  312. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: rsshaxy !shaded leaf stomatal resistance (s/m)
  313. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: bgapxy !between gap fraction
  314. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: wgapxy !within gap fraction
  315. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: gapxy !within gap fraction
  316. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tgvxy
  317. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tgbxy
  318. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: shdmaxxy
  319. REAL, DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: chvxy !sensible heat exchange coefficient vegetated
  320. REAL, DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: chbxy !sensible heat exchange coefficient bare-ground
  321. !jref:end
  322. !niuout
  323. ! Local variables (moved here from driver to make routine thread safe, 20031007 jm)
  324. INTEGER :: YEARLEN
  325. REAL :: ETP, SSOIL,EC, ESNOW, &
  326. FLX1,FLX2,FLX3,DEW,FDOWN,RC,PC,FFROZP
  327. !niuin
  328. !locals (prognostic):
  329. INTEGER :: isnow !actual no. of snow layers
  330. REAL, DIMENSION(-2:num_soil_layers) :: stc !snow/soil tmperatures
  331. REAL, DIMENSION( 1:num_soil_layers) :: smc !vol. soil moisture (m3/m3)
  332. REAL, DIMENSION( 1:num_soil_layers) :: smh2o !vol. soil liquid water (m3/m3)
  333. REAL :: tv !vegetation canopy temperature
  334. REAL :: tg !ground surface temperature
  335. REAL :: canice !canopy-intercepted ice (mm)
  336. REAL :: canliq !canopy-intercepted liquid water (mm)
  337. REAL :: snowd !snow depth (m)
  338. REAL :: swe !snow water equivalent (mm)
  339. REAL :: eah !canopy air vapor pressure (pa)
  340. REAL :: tah !canopy air temperature (k)
  341. REAL :: cm !momentum drag coefficient
  342. REAL :: ch !sensible heat exchange coefficient
  343. REAL :: fwet !wetted or snowed fraction of the canopy (-)
  344. REAL :: sneqvo !snow mass at last time step(mm h2o)
  345. REAL :: albold !snow albedo at last time step (-)
  346. REAL :: qsnow !snowfall on the ground [mm/s]
  347. REAL :: wslake !lake water storage [mm]
  348. REAL :: zwt !water table depth [m]
  349. REAL :: wa !water in the "aquifer" [mm]
  350. REAL :: wt !groundwater storage [mm]
  351. REAL, DIMENSION(-2:num_soil_layers) :: zsnso !snow layer depth [m]
  352. REAL, DIMENSION(-2: 0) :: tsno !snow temperature [K]
  353. REAL, DIMENSION(-2: 0) :: snice !snow layer ice [mm]
  354. REAL, DIMENSION(-2: 0) :: snliq !snow layer liquid water [mm]
  355. REAL :: lfmass !leaf mass [g/m2]
  356. REAL :: rtmass !mass of fine roots [g/m2]
  357. REAL :: stmass !stem mass [g/m2]
  358. REAL :: wood !mass of wood (incl. woody roots) [g/m2]
  359. REAL :: stblcp !stable carbon in deep soil [g/m2]
  360. REAL :: fastcp !short-lived carbon, shallow soil [g/m2]
  361. REAL :: plai !leaf area index
  362. REAL :: psai !stem area index
  363. !jref:start
  364. REAL :: chstar2
  365. REAL :: cqstar2
  366. REAL :: chstar !effective ch
  367. REAL :: tstar
  368. REAL :: t2mv !2m temperature of vegetation part
  369. REAL :: t2mb !2m temperature of bare ground part
  370. REAL :: q2mv !2m mixing ratio of vegetation part
  371. REAL :: q2mb !2m mixing ratio of bare ground part
  372. REAL :: qc !
  373. REAL :: t2m
  374. REAL :: pblh
  375. REAL :: qsfc1d
  376. REAL, DIMENSION(ims:ime,jms:jme) :: tstarxy !effective skin temperature
  377. REAL, DIMENSION(ims:ime,jms:jme) :: chstar2xy !effective 2m exchange coefficients
  378. REAL :: rssun
  379. REAL :: rssha
  380. REAL :: bgap
  381. REAL :: wgap
  382. REAL :: gap
  383. REAL :: tgv
  384. REAL :: tgb
  385. REAL :: snowhk
  386. REAL :: snotime1
  387. REAL :: qv1d !mixing ratio
  388. REAL :: dz8w1d
  389. REAL :: shdmax
  390. REAL :: chv !sensible heat exchange coefficient vegetated
  391. REAL :: chb !sensible heat exchange coefficient bare-ground
  392. !jref:end
  393. !out (outputs)
  394. REAL :: trad !surface radiative temperature (k)
  395. REAL :: ts !surface temperature (k)
  396. REAL :: nee !net ecosys exchange (g/m2/s CO2)
  397. REAL :: gpp !gross primary assimilation [g/m2/s C]
  398. REAL :: npp !net primary productivity [g/m2/s C]
  399. REAL :: fveg !greenness vegetation fraction [-]
  400. REAL :: qin !groundwater recharge [mm/s]
  401. REAL :: runsf !surface runoff [mm/s]
  402. REAL :: runsb !subsurface runoff [mm/s]
  403. REAL :: ecan !evaporation of intercepted water (mm/s)
  404. REAL :: esoil !soil surface evaporation rate (mm/s]
  405. REAL :: etran !transpiration rate (mm/s)
  406. REAL :: fsa !total absorbed solar radiation (w/m2)
  407. REAL :: fira !total net longwave rad (w/m2) [+ to atm]
  408. REAL :: fsh !total sensible heat (w/m2) [+ to atm]
  409. REAL :: flh !total latent heat (w/m2) [+ to atm]
  410. REAL :: apar !photosyn active energy by canopy (w/m2)
  411. REAL :: psn !total photosynthesis (umol co2/m2/s) [+]
  412. REAL :: sav !solar rad absorbed by veg. (w/m2)
  413. REAL :: sag !solar rad absorbed by ground (w/m2)
  414. REAL :: fsno !snow cover fraction (-)
  415. REAL :: salb !surface albedo (-)
  416. REAL :: errwat
  417. REAL :: qmelt
  418. REAL :: ponding
  419. REAL :: ponding1
  420. REAL :: ponding2
  421. !local
  422. real :: fsr !total reflected solar radiation (w/m2)
  423. real :: fcev !canopy evaporation heat (w/m2) [+ to atm]
  424. real :: fgev !ground evaporation heat (w/m2) [+ to atm]
  425. real :: fctr !transpiration heat flux (w/m2) [+ to atm]
  426. real, dimension(-2: 0) :: ficeold !snow layer liquid water [mm]
  427. INTEGER :: ILOC !grid index
  428. INTEGER :: JLOC !grid index
  429. INTEGER :: ISC !soil color index
  430. INTEGER :: IST !surface type 1-soil; 2-lake
  431. !niuout
  432. LOGICAL, INTENT(IN ) :: myj,frpcpn
  433. ! DECLARATIONS - LOGICAL
  434. ! ----------------------------------------------------------------------
  435. LOGICAL, PARAMETER :: LOCAL=.false.
  436. LOGICAL :: FRZGRA, SNOWNG
  437. LOGICAL :: IPRINT
  438. ! ----------------------------------------------------------------------
  439. ! DECLARATIONS - INTEGER
  440. ! ----------------------------------------------------------------------
  441. INTEGER :: I,J, ICE,NSOIL,SLOPETYP,SOILTYP,VEGTYP
  442. INTEGER :: NROOT
  443. INTEGER :: KZ ,K
  444. INTEGER :: NS
  445. ! ----------------------------------------------------------------------
  446. ! DECLARATIONS - REAL
  447. ! ----------------------------------------------------------------------
  448. REAL :: DQSDT2, LWDN, PRCP, PSFC, UU, VV, CO2AIR, O2AIR, &
  449. & Q2SAT,Q2SATI,SFCPRS,SFCTMP,SHDFAC,SNOALB1, &
  450. & SOLDN,TBOT,ZLVL, Q2K,ALBBRD, ETA, ETA_KINEMATIC, &
  451. & EMBRD, FOLN, LAT, &
  452. & Z0K,RUNOFF1,RUNOFF2,SOLNET,E2SAT,SFCTSNO
  453. REAL :: RIBB
  454. REAL :: FDTW
  455. REAL :: EMISSI
  456. REAL :: SNCOVR,SNEQV,CHK,TH2
  457. REAL :: SMCMAX,SNOMLT,SOILM,SOILW,Q1,T1
  458. REAL :: Z0BRD
  459. !
  460. REAL :: COSZ
  461. !
  462. !niu REAL, DIMENSION(1:num_soil_layers):: SLDPTH, STC,SMC,SWC
  463. REAL, DIMENSION(1:num_soil_layers):: SLDPTH,SWC
  464. !jref:start
  465. REAL, DIMENSION(1:num_soil_layers):: STCNEW
  466. !jref:end
  467. !
  468. REAL, DIMENSION(1:num_soil_layers) :: ZSOIL, RTDIS
  469. REAL, PARAMETER :: TRESH=.95E0, A2=17.67,A3=273.15,A4=29.65, &
  470. T0=273.16E0, ELWV=2.50E6, A23M4=A2*(A3-A4)
  471. ! Used for calculating the 2-m Potential Temperature:
  472. REAL, PARAMETER :: CAPA=R_D/CP
  473. REAL :: APELM
  474. REAL :: APES
  475. REAL :: SFCTH2
  476. ! ----------------------------------------------------------------------
  477. ! ----------------------------------------------------------------------
  478. ! MEK JUL2007
  479. FDTW=DT/(XLV*RHOWATER)
  480. ! debug printout
  481. IPRINT=.false.
  482. ! SLOPETYP=2
  483. SLOPETYP=1
  484. ! SHDMIN=0.00
  485. YEARLEN = 365
  486. if (mod(YR,4) == 0) then
  487. YEARLEN = 366
  488. if (mod(YR,100) == 0) then
  489. YEARLEN = 365
  490. if (mod(YR,400) == 0) then
  491. YEARLEN = 366
  492. endif
  493. endif
  494. endif
  495. NSOIL=num_soil_layers
  496. DO NS=1,NSOIL
  497. SLDPTH(NS)=DZS(NS)
  498. ENDDO
  499. call noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz , &
  500. iopt_inf ,iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc )
  501. ISC = 4 ! soil color: assuming a middle color category ?????????
  502. ZSOIL(1) = -SLDPTH(1) ! move out of x-y do loops
  503. DO KZ = 2, NSOIL
  504. ZSOIL(KZ) = -SLDPTH(KZ) + ZSOIL(KZ-1)
  505. END DO
  506. FOLN = 1.0
  507. !niuout
  508. DO J=jts,jte
  509. IF(ITIMESTEP.EQ.1)THEN
  510. DO I=its,ite
  511. !*** SET ZERO-VALUE FOR SOME OUTPUT DIAGNOSTIC ARRAYS
  512. IF((XLAND(I,J)-1.5).GE.0.)THEN
  513. ! check sea-ice point
  514. IF(XICE(I,J).EQ.1..and.IPRINT)PRINT*,' sea-ice at water point, I=',I, &
  515. 'J=',J
  516. !*** Open Water Case
  517. SMSTAV(I,J)=1.0
  518. SMSTOT(I,J)=1.0
  519. DO NS=1,NSOIL
  520. SMOIS(I,NS,J)=1.0
  521. TSLB(I,NS,J)=273.16 !STEMP
  522. ENDDO
  523. ELSE
  524. IF(XICE(I,J).EQ.1.)THEN
  525. !*** SEA-ICE CASE
  526. SMSTAV(I,J)=1.0
  527. SMSTOT(I,J)=1.0
  528. DO NS=1,NSOIL
  529. SMOIS(I,NS,J)=1.0
  530. ENDDO
  531. ENDIF
  532. ENDIF
  533. !
  534. ENDDO
  535. ENDIF ! end of initialization over ocean
  536. !-----------------------------------------------------------------------
  537. DO I=its,ite
  538. ! surface pressure
  539. PSFC=P8w3D(i,1,j)
  540. ! pressure in middle of lowest layer
  541. SFCPRS=(P8W3D(I,KTS+1,j)+P8W3D(i,KTS,j))*0.5
  542. ! convert from mixing ratio to specific humidity
  543. Q2K=QV3D(i,1,j)/(1.0+QV3D(i,1,j))
  544. !
  545. ! Q2SAT=QGH(I,j)
  546. Q2SAT=QGH(I,J)/(1.0+QGH(I,J)) ! Q2SAT is sp humidity
  547. ! add check on myj=.true.
  548. ! IF((Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
  549. IF((myj).AND.(Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
  550. CHKLOWQ(I,J)=0.
  551. ELSE
  552. CHKLOWQ(I,J)=1.
  553. ENDIF
  554. SFCTMP=T3D(i,1,j)
  555. ZLVL=0.5*DZ8W(i,1,j)
  556. ! TH2=SFCTMP+(0.0097545*ZLVL)
  557. ! calculate SFCTH2 via Exner function vs lapse-rate (above)
  558. APES=(1.E5/PSFC)**CAPA
  559. APELM=(1.E5/SFCPRS)**CAPA
  560. SFCTH2=SFCTMP*APELM
  561. TH2=SFCTH2/APES
  562. !
  563. EMISSI = EMISS(I,J)
  564. ! LWDN=GLW(I,J)*EMISSI
  565. LWDN=GLW(I,J)
  566. ! SOLDN is total incoming solar
  567. SOLDN=SWDOWN(I,J)
  568. ! GSW is net downward solar
  569. ! SOLNET=GSW(I,J)
  570. ! use mid-day albedo to determine net downward solar (no solar zenith angle correction)
  571. SOLNET=SOLDN*(1.-ALBEDO(I,J))
  572. PRCP=RAINBL(i,j)/DT
  573. VEGTYP=IVGTYP(I,J)
  574. SOILTYP=ISLTYP(I,J)
  575. SHDFAC=VEGFRA(I,J)/100.
  576. T1=TSK(I,J)
  577. CHK=CHS(I,J)
  578. SNOALB1=SNOALB(I,J) !NEW
  579. ! if "SR" present, set frac of frozen precip ("FFROZP") = snow-ratio ("SR", range:0-1)
  580. ! SR from e.g. Ferrier microphysics
  581. ! otherwise define from 1st atmos level temperature
  582. IF(FRPCPN) THEN
  583. FFROZP=SR(I,J)
  584. ELSE
  585. IF (SFCTMP <= 273.15) THEN
  586. FFROZP = 1.0
  587. ELSE
  588. FFROZP = 0.0
  589. ENDIF
  590. ENDIF
  591. !***
  592. IF((XLAND(I,J)-1.5).GE.0.)THEN ! begining of land/sea if block
  593. ! Open water points
  594. ELSE
  595. ! Land or sea-ice case
  596. IF (XICE(I,J) .GT. 0.5) THEN
  597. ICE=1
  598. ELSE
  599. ICE=0
  600. ENDIF
  601. DQSDT2=Q2SAT*A23M4/(SFCTMP-A4)**2
  602. IF(SNOW(I,J).GT.0.0)THEN
  603. ! snow on surface (use ice saturation properties)
  604. SFCTSNO=SFCTMP
  605. E2SAT=611.2*EXP(6174.*(1./273.15 - 1./SFCTSNO))
  606. Q2SATI=0.622*E2SAT/(SFCPRS-E2SAT)
  607. Q2SATI=Q2SATI/(1.0+Q2SATI) ! spec. hum.
  608. IF(T1 .GT. 273.15)THEN
  609. ! warm ground temps, weight the saturation between ice and water according to SNOWC
  610. Q2SAT=Q2SAT*(1.-SNOWC(I,J)) + Q2SATI*SNOWC(I,J)
  611. DQSDT2=DQSDT2*(1.-SNOWC(I,J)) + Q2SATI*6174./(SFCTSNO**2)*SNOWC(I,J)
  612. ELSE
  613. ! cold ground temps, use ice saturation only
  614. Q2SAT=Q2SATI
  615. DQSDT2=Q2SATI*6174./(SFCTSNO**2)
  616. ENDIF
  617. ! for snow cover fraction at 0 C, ground temp will not change, so DQSDT2 effectively zero
  618. IF(T1 .GT. 273. .AND. SNOWC(I,J) .GT. 0.)DQSDT2=DQSDT2*(1.-SNOWC(I,J))
  619. ENDIF
  620. IF(ICE.EQ.0)THEN
  621. TBOT=TMN(I,J)
  622. ELSE
  623. TBOT=271.16
  624. ENDIF
  625. IF(VEGTYP.EQ.25) SHDFAC=0.0000
  626. IF(VEGTYP.EQ.26) SHDFAC=0.0000
  627. IF(VEGTYP.EQ.27) SHDFAC=0.0000
  628. IF(SOILTYP.EQ.14.AND.XICE(I,J).EQ.0.)THEN
  629. IF(IPRINT)PRINT*,' SOIL TYPE FOUND TO BE WATER AT A LAND-POINT'
  630. IF(IPRINT)PRINT*,i,j,'RESET SOIL in surfce.F'
  631. SOILTYP=7
  632. ENDIF
  633. !-------------------------------------------
  634. ALBBRD=ALBBCK(I,J)
  635. Z0BRD=Z0(I,J)
  636. EMBRD=EMBCK(I,J)
  637. !jref:start - check if this is correct!! Maybe snowd
  638. RIBB=RIB(I,J)
  639. SNOTIME1 = SNOTIME(I,J)
  640. !jref:end
  641. !FEI: temporaray arrays above need to be changed later by using SI
  642. !niu DO 70 NS=1,NSOIL
  643. !niu SMC(NS)=SMOIS(I,NS,J)
  644. !niu STC(NS)=TSLB(I,NS,J) !STEMP
  645. !niu SWC(NS)=SH2O(I,NS,J)
  646. !niu 70 CONTINUE
  647. !
  648. IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
  649. IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
  650. VEGTYP = ISURBAN
  651. ENDIF
  652. IST = 1
  653. IF(VEGTYP == 16) IST = 2 ! lake points
  654. CALL REDPRM (VEGTYP,SOILTYP,SLOPETYP,SLDPTH,ZSOIL,NSOIL,ISURBAN)
  655. UU = U_PHY(I,1,J)
  656. VV = V_PHY(I,1,J)
  657. CO2AIR = 395.E-06 * SFCPRS !partial pressure co2 (pa)
  658. O2AIR = 0.209 * SFCPRS !partial pressure o2 (pa)
  659. COSZ = COSZ_URB2D(I,J)
  660. LAT = XLAT_URB2D(I,J)
  661. isnow = isnowxy (i,j)
  662. stc (isnow+1: 0) = tsnoxy (i,isnow+1: 0,j)
  663. stc ( 1:nsoil) = tslb (i, 1:nsoil,j)
  664. smc ( 1:nsoil) = smois (i, 1:nsoil,j)
  665. smh2o( 1:nsoil) = sh2o (i, 1:nsoil,j)
  666. tv = tvxy (i,j)
  667. tg = tgxy (i,j)
  668. canliq = canliqxy(i,j)
  669. canice = canicexy(i,j)
  670. snowd = snowh (i,j)
  671. swe = snow (i,j)
  672. eah = eahxy (i,j)
  673. tah = tahxy (i,j)
  674. cm = cmxy (i,j)
  675. ch = chxy (i,j)
  676. !jref:start
  677. chstar = chs (i,j)
  678. chstar2 = chs2 (i,j)
  679. cqstar2 = cqs2 (i,j)
  680. tstar = T1
  681. qc = qcxy (i,j)
  682. pblh = pblhxy (i,j)
  683. qsfc1d = qsfc (i,j)
  684. t2mv = t2mvxy (i,j)
  685. t2mb = t2mbxy (i,j)
  686. q2mv = q2mvxy (i,j)
  687. q2mb = q2mbxy (i,j)
  688. qv1d = qv3d (i,1,j) ! seaice/glacial needs mixing ratio (q2k = specific hum).
  689. dz8w1d = dz8w (i,1,j)
  690. shdmax = shdmaxxy (i,j)/100. !fraction
  691. !jref:end
  692. fwet = fwetxy (i,j)
  693. sneqvo = sneqvoxy(i,j)
  694. albold = alboldxy(i,j)
  695. qsnow = qsnowxy (i,j)
  696. wslake = wslakexy(i,j)
  697. zwt = zwtxy (i,j)
  698. wa = waxy (i,j)
  699. wt = wtxy (i,j)
  700. zsnso(isnow+1:nsoil) = zsnsoxy (i,isnow+1:nsoil,j)
  701. snice(isnow+1: 0) = snicexy (i,isnow+1: 0,j)
  702. snliq(isnow+1: 0) = snliqxy (i,isnow+1: 0,j)
  703. lfmass = lfmassxy(i,j)
  704. rtmass = rtmassxy(i,j)
  705. stmass = stmassxy(i,j)
  706. wood = woodxy (i,j)
  707. stblcp = stblcpxy(i,j)
  708. fastcp = fastcpxy(i,j)
  709. plai = xlaixy (i,j)
  710. psai = xsaixy (i,j)
  711. ficeold(isnow+1:0) = snicexy(i,isnow+1:0,j) &
  712. /(snicexy(i,isnow+1:0,j)+snliqxy(i,isnow+1:0,j))
  713. ! glacial, seaice split - jref
  714. IF ( XICE(I,J) >= XICE_THRESHOLD ) THEN
  715. SH2O (i,1:nsoil,j) = 1.0
  716. XLAIXY(i,j) = 0.01
  717. cycle ! Skip any processing at sea-ice points
  718. ELSE IF ( VEGTYP == ISICE ) THEN
  719. SNCOVR = SNOWC(I,J)
  720. swe = swe*0.001 !jref mm -> m
  721. if ( (swe.ne.0..AND.snowd.eq.0.).or.(snowd.le.swe) )THEN
  722. snowd= 5.*swe
  723. endif
  724. CALL SFLX_GLACIAL(I,J,ISICE,FFROZP,DT,ZLVL,NSOIL,SLDPTH, & !C
  725. & LWDN,SOLNET,SFCPRS,PRCP,SFCTMP,Q2K, & !F
  726. & TH2,Q2SAT,DQSDT2, & !I
  727. & ALBBRD, SNOALB1,TBOT, Z0BRD, Z0K, EMISSI, EMBRD, & !S
  728. & tstar,STC(1:NSOIL),snowd,swe,salb,chstar, & !H
  729. & ETA,fsh, ETA_KINEMATIC,FDOWN, & !O
  730. & ESNOW,DEW, & !O
  731. & ETP,SSOIL, & !O
  732. & FLX1,FLX2,FLX3, & !O
  733. & SNOMLT,SNCOVR, & !O
  734. & runsf, & !O
  735. & Q1, & !D
  736. & SNOTIME1, &
  737. & RIBB)
  738. tgb = sfctmp ! Bare ground temperature will be the surface temperature over glacial points.
  739. tgv = 0.0 ! Temperature under vegetation undefined over glacial points.
  740. swe = swe*1000.
  741. plai = 0.01 ! Should make this zero?
  742. smc = 1.00
  743. smh2o = 1.00 ! Something else?
  744. runsb = 0.00
  745. fgev = ETA
  746. fcev = 0.
  747. fctr = 0.
  748. soilm = 1.0 ! Something else?
  749. ! SMAV = 1.00 ! Something else?
  750. SNOWC(I,J) = 1.0
  751. QFX(I,J) = eta_kinematic
  752. POTEVP(I,J)=POTEVP(I,J)+ETP*FDTW
  753. CHS2(I,J) = CQS2(I,J)
  754. IF ( Q1 .GT. QSFC(I,J) ) THEN
  755. CQS2(I,J) = CHS(I,J)
  756. ENDIF
  757. ELSE
  758. !jref:end
  759. nee = -1.E36
  760. npp = -1.E36
  761. #if 0
  762. if ( I == 15 .and. J == 5 ) then
  763. ! Intent (IN) or Intent (INOUT), but not Intent (OUT)
  764. write(*,'("Before call to NOAHMP_SFLX, at point ", I8, I8)') i, j
  765. write(*,'(10x, "ICE = ", I10 )') ICE
  766. write(*,'(10x, "IST = ", I10 )') IST
  767. write(*,'(10x, "VEGTYP = ", I10 )') VEGTYP
  768. write(*,'(10x, "ISC = ", I10 )') ISC
  769. write(*,'(10x, "NSOIL = ", I10 )') NSOIL
  770. write(*,'(10x, "ZSOIL = ", 7F20.10)') ZSOIL
  771. write(*,'(10x, "DT = ", F20.10)') DT
  772. write(*,'(10x, "QV1D = ", F20.10)') QV1D
  773. write(*,'(10x, "SFCTMP = ", F20.10)') SFCTMP
  774. write(*,'(10x, "UU = ", F20.10)') UU
  775. write(*,'(10x, "VV = ", F20.10)') VV
  776. write(*,'(10x, "SOLDN = ", F20.10)') SOLDN
  777. write(*,'(10x, "LWDN = ", F20.10)') LWDN
  778. write(*,'(10x, "PRCP = ", F20.10)') PRCP
  779. write(*,'(10x, "ZLVL = ", F20.10)') ZLVL
  780. write(*,'(10x, "CO2AIR = ", F20.10)') CO2AIR
  781. write(*,'(10x, "O2AIR = ", F20.10)') O2AIR
  782. write(*,'(10x, "COSZ = ", F20.10)') COSZ
  783. write(*,'(10x, "TBOT = ", F20.10)') TBOT
  784. write(*,'(10x, "FOLN = ", F20.10)') FOLN
  785. write(*,'(10x, "SFCPRS = ", F20.10)') SFCPRS
  786. write(*,'(10x, "SHDFAC = ", F20.10)') SHDFAC
  787. write(*,'(10x, "LAT = ", F20.10)') LAT
  788. write(*,'(10x, "DZ8W1D = ", F20.10)') DZ8W1D
  789. write(*,'(10x, "EAH = ", F20.10)') EAH
  790. write(*,'(10x, "TAH = ", F20.10)') TAH
  791. write(*,'(10x, "FWET = ", F20.10)') FWET
  792. write(*,'(10x, "FICEOLD = ", 7F20.10)') FICEOLD
  793. write(*,'(10x, "QSNOW = ", F20.10)') QSNOW
  794. write(*,'(10x, "SNEQVO = ", F20.10)') SNEQVO
  795. write(*,'(10x, "ISNOW = ", F20.10)') ISNOW
  796. write(*,'(10x, "ZSNSO = ", 7F20.10)') ZSNSO
  797. write(*,'(10x, "CANLIQ = ", F20.10)') CANLIQ
  798. write(*,'(10x, "CANICE = ", F20.10)') CANICE
  799. write(*,'(10x, "SNOWD = ", F20.10)') SNOWD
  800. write(*,'(10x, "SWE = ", F20.10)') SWE
  801. write(*,'(10x, "SNICE = ", 7F20.10)') SNICE
  802. write(*,'(10x, "SNLIQ = ", 7F20.10)') SNLIQ
  803. write(*,'(10x, "TV = ", F20.10)') TV
  804. write(*,'(10x, "TG = ", F20.10)') TG
  805. write(*,'(10x, "STC = ", 7F20.10)') STC
  806. write(*,'(10x, "SMH2O = ", 7F20.10)') SMH2O
  807. write(*,'(10x, "SMC = ", 7F20.10)') SMC
  808. write(*,'(10x, "ZWT = ", F20.10)') ZWT
  809. write(*,'(10x, "WA = ", F20.10)') WA
  810. write(*,'(10x, "WT = ", F20.10)') WT
  811. write(*,'(10x, "WSLAKE = ", F20.10)') WSLAKE
  812. write(*,'(10x, "LFMASS = ", F20.10)') LFMASS
  813. write(*,'(10x, "RTMASS = ", F20.10)') RTMASS
  814. write(*,'(10x, "STMASS = ", F20.10)') STMASS
  815. write(*,'(10x, "WOOD = ", F20.10)') WOOD
  816. write(*,'(10x, "STBLCP = ", F20.10)') STBLCP
  817. write(*,'(10x, "FASTCP = ", F20.10)') FASTCP
  818. write(*,'(10x, "PLAI = ", F20.10)') PLAI
  819. write(*,'(10x, "PSAI = ", F20.10)') PSAI
  820. write(*,'(10x, "ALBOLD = ", F20.10)') ALBOLD
  821. write(*,'(10x, "CM = ", F20.10)') CM
  822. write(*,'(10x, "CH = ", F20.10)') CH
  823. write(*,'(10x, "DX = ", F20.10)') DX
  824. write(*,'(10x, "ISURBAN = ", I10 )') ISURBAN
  825. write(*,'(10x, "IZ0TLND = ", I10 )') IZ0TLND
  826. write(*,'(10x, "QC = ", F20.10)') QC
  827. write(*,'(10x, "PBLH = ", F20.10)') PBLH
  828. write(*,'(10x, "QSFC1D = ", F20.10)') QSFC1D
  829. write(*,'(10x, "PSFC = ", F20.10)') PSFC
  830. endif
  831. #endif
  832. CALL NOAHMP_SFLX (&
  833. I , J , LAT , YEARLEN , JULIAN , COSZ , & ! IN : Time/Space-related
  834. DT , DX , DZ8W1D , NSOIL , ZSOIL , 3 , & ! IN : Model configuration
  835. SHDFAC , SHDMAX , VEGTYP , ISURBAN , ICE , IST , & ! IN : Vegetation/Soil characteristics
  836. ISC , & ! IN : Vegetation/Soil characteristics
  837. IZ0TLND , & ! IN : User options
  838. SFCTMP , SFCPRS , PSFC , UU , VV , QV1D , & ! IN : Forcing
  839. QC , SOLDN , LWDN , PRCP , TBOT , CO2AIR , & ! IN : Forcing
  840. O2AIR , FOLN , FICEOLD , PBLH , & ! IN : Forcing
  841. ZLVL , ALBOLD , SNEQVO , & ! IN/OUT :
  842. STC , SMH2O , SMC , TAH , EAH , FWET , & ! IN/OUT :
  843. CANLIQ , CANICE , TV , TG , QSFC1D , QSNOW , & ! IN/OUT :
  844. ISNOW , ZSNSO , SNOWD , SWE , SNICE , SNLIQ , & ! IN/OUT :
  845. ZWT , WA , WT , WSLAKE , LFMASS , RTMASS , & ! IN/OUT :
  846. STMASS , WOOD , STBLCP , FASTCP , PLAI , PSAI , & ! IN/OUT :
  847. CM , CH , CHSTAR , & ! IN/OUT :
  848. FSA , FSR , FIRA , FSH , SSOIL , FCEV , & ! OUT :
  849. FGEV , FCTR , ECAN , ETRAN , ESOIL , TRAD , & ! OUT :
  850. TS , TGB , TGV , T2MV , T2MB , TSTAR , & ! OUT :
  851. Q1 , Q2MV , Q2MB , RUNSF , RUNSB , APAR , & ! OUT :
  852. PSN , SAV , SAG , FSNO , NEE , GPP , & ! OUT :
  853. NPP , FVEG , SALB , QMELT , PONDING , PONDING1, & ! OUT :
  854. PONDING2, RSSUN , RSSHA , BGAP , WGAP , GAP , & ! OUT :
  855. ERRWAT , CHV , CHB , EMISSI) ! OUT :
  856. #if 0
  857. if ( I == 15 .and. J == 5 ) then
  858. ! Intent (OUT) or Intent (INOUT), but not Intent (IN)
  859. write(*,'("After call to NOAHMP_SFLX, at point ", I8, I8)') i, j
  860. write(*,'(10x, "ZLVL = ", 7F20.10)') ZLVL
  861. write(*,'(10x, "EAH = ", F20.10)') EAH
  862. write(*,'(10x, "TAH = ", F20.10)') TAH
  863. write(*,'(10x, "FWET = ", F20.10)') FWET
  864. write(*,'(10x, "QSNOW = ", F20.10)') QSNOW
  865. write(*,'(10x, "SNEQVO = ", F20.10)') SNEQVO
  866. write(*,'(10x, "ISNOW = ", F20.10)') ISNOW
  867. write(*,'(10x, "ZSNSO = ", 7F20.10)') ZSNSO
  868. write(*,'(10x, "CANLIQ = ", F20.10)') CANLIQ
  869. write(*,'(10x, "CANICE = ", F20.10)') CANICE
  870. write(*,'(10x, "SNOWD = ", F20.10)') SNOWD
  871. write(*,'(10x, "SWE = ", F20.10)') SWE
  872. write(*,'(10x, "SNICE = ", 3F20.10)') SNICE
  873. write(*,'(10x, "SNLIQ = ", 3F20.10)') SNLIQ
  874. write(*,'(10x, "TV = ", F20.10)') TV
  875. write(*,'(10x, "TG = ", F20.10)') TG
  876. write(*,'(10x, "STC = ", 7F20.10)') STC
  877. write(*,'(10x, "SMH2O = ", 7F20.10)') SMH2O
  878. write(*,'(10x, "SMC = ", 7F20.10)') SMC
  879. write(*,'(10x, "ZWT = ", F20.10)') ZWT
  880. write(*,'(10x, "WA = ", F20.10)') WA
  881. write(*,'(10x, "WT = ", F20.10)') WT
  882. write(*,'(10x, "WSLAKE = ", F20.10)') WSLAKE
  883. write(*,'(10x, "LFMASS = ", F20.10)') LFMASS
  884. write(*,'(10x, "RTMASS = ", F20.10)') RTMASS
  885. write(*,'(10x, "STMASS = ", F20.10)') STMASS
  886. write(*,'(10x, "WOOD = ", F20.10)') WOOD
  887. write(*,'(10x, "STBLCP = ", F20.10)') STBLCP
  888. write(*,'(10x, "FASTCP = ", F20.10)') FASTCP
  889. write(*,'(10x, "PLAI = ", F20.10)') PLAI
  890. write(*,'(10x, "PSAI = ", F20.10)') PSAI
  891. write(*,'(10x, "ALBOLD = ", F20.10)') ALBOLD
  892. write(*,'(10x, "CM = ", F20.10)') CM
  893. write(*,'(10x, "CH = ", F20.10)') CH
  894. write(*,'(10x, "FSA = ", F20.10)') FSA
  895. write(*,'(10x, "FSR = ", F20.10)') FSR
  896. write(*,'(10x, "FIRA = ", F20.10)') FIRA
  897. write(*,'(10x, "FSH = ", F20.10)') FSH
  898. write(*,'(10x, "SSOIL = ", F20.10)') SSOIL
  899. write(*,'(10x, "FCEV = ", F20.10)') FCEV
  900. write(*,'(10x, "FGEV = ", F20.10)') FGEV
  901. write(*,'(10x, "FCTR = ", F20.10)') FCTR
  902. write(*,'(10x, "TRAD = ", F20.10)') TRAD
  903. write(*,'(10x, "ECAN = ", F20.10)') ECAN
  904. write(*,'(10x, "ETRAN = ", F20.10)') ETRAN
  905. write(*,'(10x, "ESOIL = ", F20.10)') ESOIL
  906. write(*,'(10x, "RUNSF = ", F20.10)') RUNSF
  907. write(*,'(10x, "RUNSB = ", F20.10)') RUNSB
  908. write(*,'(10x, "APAR = ", F20.10)') APAR
  909. write(*,'(10x, "PSN = ", F20.10)') PSN
  910. write(*,'(10x, "SAV = ", F20.10)') SAV
  911. write(*,'(10x, "SAG = ", F20.10)') SAG
  912. write(*,'(10x, "FSNO = ", F20.10)') FSNO
  913. write(*,'(10x, "NEE = ", F20.10)') NEE
  914. write(*,'(10x, "GPP = ", F20.10)') GPP
  915. write(*,'(10x, "NPP = ", F20.10)') NPP
  916. write(*,'(10x, "TS = ", F20.10)') TS
  917. write(*,'(10x, "FVEG = ", F20.10)') FVEG
  918. write(*,'(10x, "SALB = ", F20.10)') SALB
  919. write(*,'(10x, "ERRWAT = ", F20.10)') ERRWAT
  920. write(*,'(10x, "QMELT = ", F20.10)') QMELT
  921. write(*,'(10x, "PONDING = ", F20.10)') PONDING
  922. write(*,'(10x, "PONDING1 = ", F20.10)') PONDING1
  923. write(*,'(10x, "PONDING2 = ", F20.10)') PONDING2
  924. write(*,'(10x, "QSFC1D = ", F20.10)') QSFC1D
  925. write(*,'(10x, "CHSTAR = ", F20.10)') CHSTAR
  926. write(*,'(10x, "TSTAR = ", F20.10)') TSTAR
  927. write(*,'(10x, "T2MV = ", F20.10)') T2MV
  928. write(*,'(10x, "T2MB = ", F20.10)') T2MB
  929. write(*,'(10x, "RSSUN = ", F20.10)') RSSUN
  930. write(*,'(10x, "RSSHA = ", F20.10)') RSSHA
  931. write(*,'(10x, "BGAP = ", F20.10)') BGAP
  932. write(*,'(10x, "WGAP = ", F20.10)') WGAP
  933. write(*,'(10x, "GAP = ", F20.10)') GAP
  934. write(*,'(10x, "TGV = ", F20.10)') TGV
  935. write(*,'(10x, "TGB = ", F20.10)') TGB
  936. write(*,'(10x, "Q1 = ", F20.10)') Q1
  937. endif
  938. #endif
  939. !Q1 = eah * 0.622 / (SFCPRS - 0.378*eah)
  940. chs2 (i,j) = chstar2
  941. cqs2 (i,j) = cqstar2
  942. QFX (I,J) = ecan + esoil + etran
  943. SNOWC (I,J) = fsno
  944. ENDIF ! glacial, seaice split ends
  945. !jref:end
  946. isnowxy (i,j) = isnow
  947. canliqxy (i,j) = canliq
  948. canicexy (i,j) = canice
  949. snowh (i,j) = snowd
  950. snow (i,j) = swe
  951. zsnsoxy (i,isnow+1:nsoil,j) = zsnso (isnow+1:nsoil)
  952. tslb (i, 1:nsoil,j) = stc ( 1:nsoil)
  953. tsnoxy (i,isnow+1: 0,j) = stc (isnow+1: 0)
  954. smois (i, 1:nsoil,j) = smc ( 1:nsoil)
  955. sh2o (i, 1:nsoil,j) = smh2o ( 1:nsoil)
  956. snicexy (i,isnow+1: 0,j) = snice (isnow+1: 0)
  957. snliqxy (i,isnow+1: 0,j) = snliq (isnow+1: 0)
  958. tvxy (i,j) = tv
  959. tgxy (i,j) = tg
  960. zwtxy (i,j) = zwt
  961. waxy (i,j) = wa
  962. wtxy (i,j) = wt
  963. lfmassxy (i,j) = lfmass
  964. rtmassxy (i,j) = rtmass
  965. stmassxy (i,j) = stmass
  966. woodxy (i,j) = wood
  967. stblcpxy (i,j) = stblcp
  968. fastcpxy (i,j) = fastcp
  969. xlaixy (i,j) = plai
  970. xsaixy (i,j) = psai
  971. emiss (i,j) = emissi
  972. eahxy (i,j) = eah
  973. tahxy (i,j) = tah
  974. fwetxy (i,j) = fwet
  975. sneqvoxy (i,j) = sneqvo
  976. alboldxy (i,j) = albold
  977. qsnowxy (i,j) = qsnow
  978. wslakexy (i,j) = wslake
  979. cmxy (i,j) = cm
  980. !jref:start
  981. chxy (i,j) = chstar
  982. rssunxy (i,j) = rssun
  983. rsshaxy (i,j) = rssha
  984. bgapxy (i,j) = bgap
  985. wgapxy (i,j) = wgap
  986. gapxy (i,j) = gap
  987. tgvxy (i,j) = tgv
  988. tgbxy (i,j) = tgb
  989. chvxy (i,j) = chv
  990. chbxy (i,j) = chb
  991. !jref:end
  992. !for output
  993. runsfxy (i,j) = runsf
  994. runsbxy (i,j) = runsb
  995. ecanxy (i,j) = ecan
  996. edirxy (i,j) = esoil
  997. etranxy (i,j) = etran
  998. aparxy (i,j) = apar
  999. psnxy (i,j) = psn
  1000. savxy (i,j) = sav
  1001. sagxy (i,j) = sag
  1002. fsnoxy (i,j) = fsno
  1003. fsaxy (i,j) = fsa
  1004. firaxy (i,j) = fira
  1005. hfx (i,j) = fsh
  1006. lh (i,j) = fcev + fgev + fctr
  1007. grdflx (i,j) = ssoil
  1008. tradxy (i,j) = trad
  1009. tsxy (i,j) = ts
  1010. neexy (i,j) = nee
  1011. gppxy (i,j) = gpp
  1012. nppxy (i,j) = npp
  1013. fvegxy (i,j) = fveg
  1014. !jref:4/21/2011
  1015. t2mvxy (i,j) = t2mv
  1016. t2mbxy (i,j) = t2mb
  1017. q2mvxy (i,j) = q2mv
  1018. q2mbxy (i,j) = q2mb
  1019. chstarxy (i,j) = chstar
  1020. chs (i,j) = chstar
  1021. tstarxy (i,j) = tstar
  1022. !jref:4/21/2011
  1023. CANWAT(I,J) = canliqxy (i,j) + canicexy (i,j)
  1024. IF ( SALB > -999 ) THEN
  1025. ALBEDO(I,J) = salb
  1026. ENDIF
  1027. TSK(I,J) = tradxy (i,j)
  1028. !KWM TSK(I,J) = tstarxy (i,j)
  1029. !niu POTEVP(I,J) = ???
  1030. !jref CHS2(I,J) = chxy (i,j)
  1031. !IF (Q1.GT.QSFC(I,J)) THEN
  1032. ! CQS2(I,J) = CHS(I,J)
  1033. !END IF
  1034. QSFC(I,J) = Q1/(1.0-Q1)
  1035. !jref: specific humidity to mixing ratio
  1036. q2mvxy(i,j) = q2mvxy(i,j)/(1.0-q2mvxy(i,j))
  1037. ! IF (VEGTYP == ISURBAN) write(*,*) "IN SFCDRV: q2mb=",q2mb,"q2mbxy(i,j)=",q2mbxy(i,j)
  1038. q2mbxy(i,j) = q2mbxy(i,j)/(1.0-q2mbxy(i,j))
  1039. !*** DIAGNOSTICS
  1040. !jref:start - THESE SHOULD BE LOOKED AT!!!
  1041. SNOTIME(I,J) = SNOTIME1
  1042. SMSTAV(I,J)=SOILW
  1043. SMSTOT(I,J)=SOILM*1000.
  1044. ! Convert the water unit into mm
  1045. SFCRUNOFF(I,J)=SFCRUNOFF(I,J)+runsfxy(i,j)*DT*1000.0
  1046. UDRUNOFF(I,J)=UDRUNOFF(I,J)+runsbxy(i,j)*DT*1000.0
  1047. !jref SFCRUNOFF(I,J)=SFCRUNOFF(I,J)+RUNOFF1*DT*1000.0
  1048. !jref UDRUNOFF(I,J)=UDRUNOFF(I,J)+(RUNOFF2+RUNOFF3)*DT*1000.0
  1049. !jref:end
  1050. ! snow defined when fraction of frozen precip (FFROZP) > 0.5,
  1051. IF(FFROZP.GT.0.5)THEN
  1052. ACSNOW(I,J)=ACSNOW(I,J)+PRCP*DT
  1053. ENDIF
  1054. IF(SNOW(I,J).GT.0.)THEN
  1055. !KWM ACSNOM(I,J)=ACSNOM(I,J)+SNOMLT*1000.
  1056. ENDIF
  1057. ENDIF ! endif of land-sea test
  1058. !jref:start make sure exchange coeff and TSK include water points
  1059. ! IF((XLAND(I,J)-1.5).GE.0.)THEN ! begining of land/sea if block
  1060. ! chstar2xy(i,j) = CHS2(i,j)
  1061. ! chstarxy(i,j) = CHS(i,j)
  1062. ! tstarxy(i,j) = T1 !TSK(i,j) test with T1
  1063. ! ENDIF
  1064. !jref:end
  1065. ENDDO
  1066. ENDDO ! of J loop
  1067. !------------------------------------------------------
  1068. END SUBROUTINE noahmplsm
  1069. !------------------------------------------------------
  1070. SUBROUTINE NOAHMP_INIT ( MMINLU, SNOW , SNOWH , CANWAT , ISLTYP , &
  1071. TSLB , SMOIS , SH2O , DZS , FNDSOILW , FNDSNOWH , &
  1072. TSK, isnowxy , tvxy ,tgxy ,canicexy , &
  1073. canliqxy ,eahxy ,tahxy ,cmxy ,chxy , &
  1074. fwetxy ,sneqvoxy ,alboldxy ,qsnowxy ,wslakexy ,zwtxy ,waxy , &
  1075. wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy , &
  1076. stmassxy ,woodxy ,stblcpxy ,fastcpxy ,xsaixy , &
  1077. !jref:start
  1078. t2mvxy ,t2mbxy ,chstarxy , &
  1079. !jref:end
  1080. num_soil_layers, restart, &
  1081. allowed_to_read , &
  1082. ids,ide, jds,jde, kds,kde, &
  1083. ims,ime, jms,jme, kms,kme, &
  1084. its,ite, jts,jte, kts,kte )
  1085. ! Initializing Canopy air temperature to 287 K seems dangerous to me [KWM].
  1086. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1087. & ims,ime, jms,jme, kms,kme, &
  1088. & its,ite, jts,jte, kts,kte
  1089. INTEGER, INTENT(IN) :: num_soil_layers
  1090. LOGICAL, INTENT(IN) :: restart, &
  1091. & allowed_to_read
  1092. REAL, DIMENSION( num_soil_layers), INTENT(IN) :: DZS ! Thickness of the soil layers [m]
  1093. REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , &
  1094. & INTENT(INOUT) :: SMOIS, &
  1095. & SH2O, &
  1096. & TSLB
  1097. REAL, DIMENSION( ims:ime, jms:jme ) , &
  1098. & INTENT(INOUT) :: SNOW, &
  1099. & SNOWH, &
  1100. & CANWAT
  1101. INTEGER, DIMENSION( ims:ime, jms:jme ), &
  1102. & INTENT(IN) :: ISLTYP
  1103. LOGICAL, INTENT(IN) :: FNDSOILW, &
  1104. & FNDSNOWH
  1105. REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) :: TSK !skin temperature (k)
  1106. INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: isnowxy !actual no. of snow layers
  1107. REAL, DIMENSION(ims:ime,-2:num_soil_layers,jms:jme), INTENT(INOUT) :: zsnsoxy !snow layer depth [m]
  1108. REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: tsnoxy !snow temperature [K]
  1109. REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snicexy !snow layer ice [mm]
  1110. REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snliqxy !snow layer liquid water [mm]
  1111. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tvxy !vegetation canopy temperature
  1112. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tgxy !ground surface temperature
  1113. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canicexy !canopy-intercepted ice (mm)
  1114. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canliqxy !canopy-intercepted liquid water (mm)
  1115. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: eahxy !canopy air vapor pressure (pa)
  1116. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tahxy !canopy air temperature (k)
  1117. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: cmxy !momentum drag coefficient
  1118. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chxy !sensible heat exchange coefficient
  1119. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fwetxy !wetted or snowed fraction of the canopy (-)
  1120. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: sneqvoxy !snow mass at last time step(mm h2o)
  1121. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: alboldxy !snow albedo at last time step (-)
  1122. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qsnowxy !snowfall on the ground [mm/s]
  1123. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wslakexy !lake water storage [mm]
  1124. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: zwtxy !water table depth [m]
  1125. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: waxy !water in the "aquifer" [mm]
  1126. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wtxy !groundwater storage [mm]
  1127. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: lfmassxy !leaf mass [g/m2]
  1128. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: rtmassxy !mass of fine roots [g/m2]
  1129. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stmassxy !stem mass [g/m2]
  1130. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: woodxy !mass of wood (incl. woody roots) [g/m2]
  1131. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stblcpxy !stable carbon in deep soil [g/m2]
  1132. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fastcpxy !short-lived carbon, shallow soil [g/m2]
  1133. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xsaixy !stem area index
  1134. !jref:start
  1135. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mvxy !2m temperature vegetation part (k)
  1136. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mbxy !2m temperature bare ground part (k)
  1137. REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chstarxy !effective exchange coefficient
  1138. !jref:end
  1139. REAL, DIMENSION(1:num_soil_layers) :: ZSOIL ! Depth of the soil layer bottom (m) from
  1140. ! the surface (negative)
  1141. REAL :: BX, SMCMAX, PSISAT, FREE
  1142. REAL, PARAMETER :: BLIM = 5.5
  1143. REAL, PARAMETER :: HLICE = 3.335E5
  1144. REAL, PARAMETER :: GRAV = 9.81
  1145. REAL, PARAMETER :: T0 = 273.15
  1146. INTEGER :: errflag
  1147. character(len=80) :: err_message
  1148. character(len=4) :: MMINSL
  1149. character(len=*), intent(in) :: MMINLU
  1150. MMINSL='STAS'
  1151. call read_mp_veg_parameters(trim(MMINLU))
  1152. !
  1153. ! initialize three Noah LSM related tables
  1154. !
  1155. IF ( allowed_to_read ) THEN
  1156. CALL wrf_message( 'INITIALIZE THREE Noah LSM RELATED TABLES' )
  1157. CALL SOIL_VEG_GEN_PARM( MMINLU, MMINSL )
  1158. ENDIF
  1159. IF( .NOT. restart ) THEN
  1160. itf=min0(ite,ide-1)
  1161. jtf=min0(jte,jde-1)
  1162. errflag = 0
  1163. DO j = jts,jtf
  1164. DO i = its,itf
  1165. IF ( ISLTYP( i,j ) .LT. 1 ) THEN
  1166. errflag = 1
  1167. WRITE(err_message,*)"module_sf_noahlsm.F: lsminit: out of range ISLTYP ",i,j,ISLTYP( i,j )
  1168. CALL wrf_message(err_message)
  1169. ENDIF
  1170. ENDDO
  1171. ENDDO
  1172. IF ( errflag .EQ. 1 ) THEN
  1173. CALL wrf_error_fatal( "module_sf_noahlsm.F: lsminit: out of range value "// &
  1174. "of ISLTYP. Is this field in the input?" )
  1175. ENDIF
  1176. #ifdef WRF_CHEM
  1177. !
  1178. ! need this parameter for dust parameterization in wrf/chem
  1179. !
  1180. do I=1,NSLTYPE
  1181. porosity(i)=maxsmc(i)
  1182. enddo
  1183. #endif
  1184. ! initialize soil liquid water content SH2O
  1185. ! IF(.NOT.FNDSOILW) THEN
  1186. ! If no SWC, do the following
  1187. ! PRINT *,'SOIL WATER NOT FOUND - VALUE SET IN LSMINIT'
  1188. DO J = jts , jtf
  1189. DO I = its , itf
  1190. BX = BB(ISLTYP(I,J))
  1191. SMCMAX = MAXSMC(ISLTYP(I,J))
  1192. PSISAT = SATPSI(ISLTYP(I,J))
  1193. IF ( ( bx > 0.0 ) .AND. ( smcmax > 0.0 ) .AND. ( psisat > 0.0 ) ) THEN
  1194. DO NS=1, num_soil_layers
  1195. IF ( TSLB(I,NS,J) < 273.149 ) THEN
  1196. ! SH2O <= SMOIS for T < 273.149K (-0.001C)
  1197. ! First guess of SH2O following explicit solution for
  1198. ! Flerchinger Eqn from Koren et al, JGR, 1999, Eqn 17
  1199. ! (KCOUNT=0 in function FRH2O).
  1200. BX = BB(ISLTYP(I,J))
  1201. SMCMAX = MAXSMC(ISLTYP(I,J))
  1202. PSISAT = SATPSI(ISLTYP(I,J))
  1203. IF ( BX > BLIM ) BX = BLIM
  1204. FK=(( (HLICE/(GRAV*(-PSISAT))) * &
  1205. ((TSLB(I,NS,J)-T0)/TSLB(I,NS,J)) )**(-1/BX) )*SMCMAX
  1206. FK = MAX(FK, 0.02)
  1207. SH2O(I,NS,J) = MIN( FK, SMOIS(I,NS,J) )
  1208. ! Use iterative solution for liquid soil water content
  1209. ! using function FRH2O, with the initial guess for SH2O
  1210. ! from the above explicit first guess.
  1211. CALL FRH2O ( FREE , TSLB(I,NS,J) , SMOIS(I,NS,J) , SH2O(I,NS,J) )
  1212. SH2O(I,NS,J) = FREE
  1213. ELSE
  1214. ! SH2O = SMOIS ( for T => 273.149K (-0.001C)
  1215. SH2O(I,NS,J)=SMOIS(I,NS,J)
  1216. ENDIF
  1217. END DO
  1218. ELSE
  1219. DO NS=1, num_soil_layers
  1220. SH2O(I,NS,J)=SMOIS(I,NS,J)
  1221. END DO
  1222. ENDIF
  1223. ENDDO
  1224. ENDDO
  1225. ! ENDIF
  1226. !
  1227. ! initialize physical snow height SNOWH
  1228. !
  1229. IF(.NOT.FNDSNOWH)THEN
  1230. ! If no SNOWH do the following
  1231. CALL wrf_message( 'SNOW HEIGHT NOT FOUND - VALUE DEFINED IN LSMINIT' )
  1232. DO J = jts,jtf
  1233. DO I = its,itf
  1234. SNOWH(I,J)=SNOW(I,J)*0.005 ! SNOW in mm and SNOWH in m
  1235. ENDDO
  1236. ENDDO
  1237. ENDIF
  1238. DO J = jts,jtf
  1239. DO I = its,itf
  1240. tvxy (I,J) = TSK(I,J)
  1241. tgxy (I,J) = TSK(I,J)
  1242. CANWAT (I,J) = 0.0
  1243. canliqxy (I,J) = CANWAT(I,J)
  1244. canicexy (I,J) = 0.
  1245. eahxy (I,J) = 2000.
  1246. tahxy (I,J) = 287.
  1247. !jref:start
  1248. t2mvxy (I,J) = TSK(I,J)
  1249. t2mbxy (I,J) = TSK(I,J)
  1250. chstarxy (I,J) = 0.0
  1251. !jref:end
  1252. cmxy (I,J) = 0.0
  1253. chxy (I,J) = 0.0
  1254. fwetxy (I,J) = 0.0
  1255. sneqvoxy (I,J) = 0.0
  1256. alboldxy (I,J) = 0.65
  1257. qsnowxy (I,J) = 0.0
  1258. wslakexy (I,J) = 0.0
  1259. waxy (I,J) = 4900. !???
  1260. wtxy (I,J) = waxy(i,j) !???
  1261. zwtxy (I,J) = (25. + 2.0) - waxy(i,j)/1000/0.2 !???
  1262. lfmassxy (I,J) = 50. !
  1263. stmassxy (I,J) = 50.0 !
  1264. rtmassxy (I,J) = 500.0 !
  1265. woodxy (I,J) = 500.0 !
  1266. stblcpxy (I,J) = 1000.0 !
  1267. fastcpxy (I,J) = 1000.0 !
  1268. xsaixy (I,J) = 0.1 !
  1269. enddo
  1270. enddo
  1271. ! Given the soil layer thicknesses (in DZS), initialize the soil layer
  1272. ! depths from the surface.
  1273. ZSOIL(1) = -DZS(1) ! negative
  1274. DO NS=2, num_soil_layers
  1275. ZSOIL(NS) = ZSOIL(NS-1) - DZS(NS)
  1276. END DO
  1277. ! Initialize snow/soil layer arrays ZSNSOXY, TSNOXY, SNICEXY, SNLIQXY,
  1278. ! and ISNOWXY
  1279. CALL snow_init ( ims , ime , jms , jme , its , itf , jts , jtf , 3 , &
  1280. & num_soil_layers , zsoil , snow , tgxy , snowh , &
  1281. & zsnsoxy , tsnoxy , snicexy , snliqxy , isnowxy )
  1282. ENDIF
  1283. END SUBROUTINE NOAHMP_INIT
  1284. !------------------------------------------------------------------------------------------
  1285. !------------------------------------------------------------------------------------------
  1286. SUBROUTINE SNOW_INIT ( ims , ime , jms , jme , its , itf , jts , jtf , &
  1287. & NSNOW , NSOIL , ZSOIL , SWE , TGXY , SNODEP , &
  1288. & ZSNSOXY , TSNOXY , SNICEXY ,SNLIQXY , ISNOWXY )
  1289. !------------------------------------------------------------------------------------------
  1290. ! Initialize snow arrays for Noah-MP LSM, based in input SNOWDEP, NSNOW
  1291. ! ISNOWXY is an index array, indicating the index of the top snow layer. Valid indices
  1292. ! for snow layers range from 0 (no snow) and -1 (shallow snow) to (-NSNOW)+1 (deep snow).
  1293. ! TSNOXY holds the temperature of the snow layer. Snow layers are initialized with
  1294. ! temperature = ground temperature [?]. Snow-free levels in the array have value 0.0
  1295. ! SNICEXY is the frozen content of a snow layer. Initial estimate based on SNODEP and SWE
  1296. ! SNLIQXY is the liquid content of a snow layer. Initialized to 0.0
  1297. ! ZNSNOXY is the layer depth from the surface.
  1298. !------------------------------------------------------------------------------------------
  1299. IMPLICIT NONE
  1300. !------------------------------------------------------------------------------------------
  1301. INTEGER, INTENT(IN) :: ims, ime, jms, jme
  1302. INTEGER, INTENT(IN) :: its, itf, jts, jtf
  1303. INTEGER, INTENT(IN) :: NSNOW
  1304. INTEGER, INTENT(IN) :: NSOIL
  1305. REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SWE
  1306. REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SNODEP
  1307. REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: TGXY
  1308. REAL, INTENT(IN), DIMENSION(1:NSOIL) :: ZSOIL
  1309. INTEGER, INTENT(OUT), DIMENSION(ims:ime, jms:jme) :: ISNOWXY ! Top snow layer index
  1310. REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1:NSOIL,jms:jme) :: ZSNSOXY ! Snow/soil layer depth from surface [m]
  1311. REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: TSNOXY ! Snow layer temperature [K]
  1312. REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNICEXY ! Snow layer ice content [mm]
  1313. REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNLIQXY ! snow layer liquid content [mm]
  1314. ! Local variables:
  1315. ! DZSNO holds the thicknesses of the various snow layers.
  1316. ! DZSNOSO holds the thicknesses of the various soil/snow layers.
  1317. INTEGER :: I,J,IZ
  1318. REAL, DIMENSION(-NSNOW+1: 0) :: DZSNO
  1319. REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZSNSO
  1320. !------------------------------------------------------------------------------------------
  1321. DO J = jts , jtf
  1322. DO I = its , itf
  1323. IF ( SNODEP(I,J) < 0.025 ) THEN
  1324. ISNOWXY(I,J) = 0
  1325. DZSNO(-NSNOW+1:0) = 0.
  1326. ELSE
  1327. IF ( ( SNODEP(I,J) >= 0.025 ) .AND. ( SNODEP(I,J) <= 0.05 ) ) THEN
  1328. ISNOWXY(I,J) = -1
  1329. DZSNO(0) = SNODEP(I,J)
  1330. ELSE IF ( ( SNODEP(I,J) > 0.05 ) .AND. ( SNODEP(I,J) <= 0.10 ) ) THEN
  1331. ISNOWXY(I,J) = -2
  1332. DZSNO(-1) = SNODEP(I,J)/2.
  1333. DZSNO( 0) = SNODEP(I,J)/2.
  1334. ELSE IF ( (SNODEP(I,J) > 0.10 ) .AND. ( SNODEP(I,J) <= 0.25 ) ) THEN
  1335. ISNOWXY(I,J) = -2
  1336. DZSNO(-1) = 0.05
  1337. DZSNO( 0) = SNODEP(I,J) - DZSNO(-1)
  1338. ELSE IF ( ( SNODEP(I,J) > 0.25 ) .AND. ( SNODEP(I,J) <= 0.35 ) ) THEN
  1339. ISNOWXY(I,J) = -3
  1340. DZSNO(-2) = 0.05
  1341. DZSNO(-1) = 0.5*(SNODEP(I,J)-DZSNO(-2))
  1342. DZSNO( 0) = 0.5*(SNODEP(I,J)-DZSNO(-2))
  1343. ELSE IF ( SNODEP(I,J) > 0.35 ) THEN
  1344. ISNOWXY(I,J) = -3
  1345. DZSNO(-2) = 0.05
  1346. DZSNO(-1) = 0.10
  1347. DZSNO( 0) = SNODEP(I,J) - DZSNO(-1) - DZSNO(-2)
  1348. ELSE
  1349. CALL wrf_error_fatal("Problem with the logic assigning snow layers.")
  1350. END IF
  1351. END IF
  1352. TSNOXY (I,-NSNOW+1:0,J) = 0.
  1353. SNICEXY(I,-NSNOW+1:0,J) = 0.
  1354. SNLIQXY(I,-NSNOW+1:0,J) = 0.
  1355. DO IZ = ISNOWXY(I,J)+1 , 0
  1356. TSNOXY(I,IZ,J) = TGXY(I,J) ! [k]
  1357. SNLIQXY(I,IZ,J) = 0.00
  1358. SNICEXY(I,IZ,J) = 1.00 * DZSNO(IZ) * (SWE(I,J)/SNODEP(I,J)) ! [kg/m3]
  1359. END DO
  1360. ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for snow layers
  1361. DO IZ = ISNOWXY(I,J)+1 , 0
  1362. DZSNSO(IZ) = -DZSNO(IZ)
  1363. END DO
  1364. ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for soil layers
  1365. DZSNSO(1) = ZSOIL(1)
  1366. DO IZ = 2 , NSOIL
  1367. DZSNSO(IZ) = (ZSOIL(IZ) - ZSOIL(IZ-1))
  1368. END DO
  1369. ! Assign ZSNSOXY, the layer depths, for soil and snow layers
  1370. ZSNSOXY(I,ISNOWXY(I,J)+1,J) = DZSNSO(ISNOWXY(I,J)+1)
  1371. DO IZ = ISNOWXY(I,J)+2 , NSOIL
  1372. ZSNSOXY(I,IZ,J) = ZSNSOXY(I,IZ-1,J) + DZSNSO(IZ)
  1373. ENDDO
  1374. END DO
  1375. END DO
  1376. END SUBROUTINE SNOW_INIT
  1377. !
  1378. !------------------------------------------------------------------------------------------
  1379. !------------------------------------------------------------------------------------------
  1380. !
  1381. END MODULE module_sf_noahmpdrv