PageRenderTime 65ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/phys/module_sf_noahdrv.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1834 lines | 1144 code | 180 blank | 510 comment | 22 complexity | afe644bb40ac0e37a1f4953dbdf3283e MD5 | raw file
Possible License(s): AGPL-1.0
  1. MODULE module_sf_noahdrv
  2. !-------------------------------
  3. USE module_sf_noahlsm
  4. USE module_sf_urban
  5. USE module_sf_bep
  6. USE module_sf_bep_bem
  7. #ifdef WRF_CHEM
  8. USE module_data_gocart_dust
  9. #endif
  10. !-------------------------------
  11. !
  12. CONTAINS
  13. !
  14. !----------------------------------------------------------------
  15. ! Urban related variable are added to arguments - urban
  16. !----------------------------------------------------------------
  17. SUBROUTINE lsm(DZ8W,QV3D,P8W3D,T3D,TSK, &
  18. HFX,QFX,LH,GRDFLX, QGH,GSW,SWDOWN,GLW,SMSTAV,SMSTOT, &
  19. SFCRUNOFF, UDRUNOFF,IVGTYP,ISLTYP,ISURBAN,ISICE,VEGFRA, &
  20. ALBEDO,ALBBCK,ZNT,Z0,TMN,XLAND,XICE,EMISS,EMBCK, &
  21. SNOWC,QSFC,RAINBL,MMINLU, &
  22. num_soil_layers,DT,DZS,ITIMESTEP, &
  23. SMOIS,TSLB,SNOW,CANWAT, &
  24. CHS,CHS2,CQS2,CPM,ROVCP,SR,chklowq,lai,qz0, & !H
  25. myj,frpcpn, &
  26. SH2O,SNOWH, & !H
  27. U_PHY,V_PHY, & !I
  28. SNOALB,SHDMIN,SHDMAX, & !I
  29. SNOTIME, & !?
  30. ACSNOM,ACSNOW, & !O
  31. SNOPCX, & !O
  32. POTEVP, & !O
  33. SMCREL, & !O
  34. XICE_THRESHOLD, &
  35. RDLAI2D,USEMONALB, &
  36. RIB, & !?
  37. NOAHRES, &
  38. ids,ide, jds,jde, kds,kde, &
  39. ims,ime, jms,jme, kms,kme, &
  40. its,ite, jts,jte, kts,kte, &
  41. sf_urban_physics, &
  42. CMR_SFCDIF,CHR_SFCDIF,CMC_SFCDIF,CHC_SFCDIF, &
  43. !Optional Urban
  44. TR_URB2D,TB_URB2D,TG_URB2D,TC_URB2D,QC_URB2D, & !H urban
  45. UC_URB2D, & !H urban
  46. XXXR_URB2D,XXXB_URB2D,XXXG_URB2D,XXXC_URB2D, & !H urban
  47. TRL_URB3D,TBL_URB3D,TGL_URB3D, & !H urban
  48. SH_URB2D,LH_URB2D,G_URB2D,RN_URB2D,TS_URB2D, & !H urban
  49. PSIM_URB2D,PSIH_URB2D,U10_URB2D,V10_URB2D, & !O urban
  50. GZ1OZ0_URB2D, AKMS_URB2D, & !O urban
  51. TH2_URB2D,Q2_URB2D, UST_URB2D, & !O urban
  52. DECLIN_URB,COSZ_URB2D,OMG_URB2D, & !I urban
  53. XLAT_URB2D, & !I urban
  54. num_roof_layers, num_wall_layers, & !I urban
  55. num_road_layers, DZR, DZB, DZG, & !I urban
  56. FRC_URB2D,UTYPE_URB2D, & !O
  57. num_urban_layers, & !I multi-layer urban
  58. trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, & !H multi-layer urban
  59. tlev_urb3d,qlev_urb3d, & !H multi-layer urban
  60. tw1lev_urb3d,tw2lev_urb3d, & !H multi-layer urban
  61. tglev_urb3d,tflev_urb3d, & !H multi-layer urban
  62. sf_ac_urb3d,lf_ac_urb3d,cm_ac_urb3d, & !H multi-layer urban
  63. sfvent_urb3d,lfvent_urb3d, & !H multi-layer urban
  64. sfwin1_urb3d,sfwin2_urb3d, & !H multi-layer urban
  65. sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, & !H multi-layer urban
  66. th_phy,rho,p_phy,ust, & !I multi-layer urban
  67. gmt,julday,xlong,xlat, & !I multi-layer urban
  68. a_u_bep,a_v_bep,a_t_bep,a_q_bep, & !O multi-layer urban
  69. a_e_bep,b_u_bep,b_v_bep, & !O multi-layer urban
  70. b_t_bep,b_q_bep,b_e_bep,dlg_bep, & !O multi-layer urban
  71. dl_u_bep,sf_bep,vl_bep ) !O multi-layer urban
  72. !----------------------------------------------------------------
  73. IMPLICIT NONE
  74. !----------------------------------------------------------------
  75. !----------------------------------------------------------------
  76. ! --- atmospheric (WRF generic) variables
  77. !-- DT time step (seconds)
  78. !-- DZ8W thickness of layers (m)
  79. !-- T3D temperature (K)
  80. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  81. !-- P3D 3D pressure (Pa)
  82. !-- FLHC exchange coefficient for heat (m/s)
  83. !-- FLQC exchange coefficient for moisture (m/s)
  84. !-- PSFC surface pressure (Pa)
  85. !-- XLAND land mask (1 for land, 2 for water)
  86. !-- QGH saturated mixing ratio at 2 meter
  87. !-- GSW downward short wave flux at ground surface (W/m^2)
  88. !-- GLW downward long wave flux at ground surface (W/m^2)
  89. !-- History variables
  90. !-- CANWAT canopy moisture content (mm)
  91. !-- TSK surface temperature (K)
  92. !-- TSLB soil temp (k)
  93. !-- SMOIS total soil moisture content (volumetric fraction)
  94. !-- SH2O unfrozen soil moisture content (volumetric fraction)
  95. ! note: frozen soil moisture (i.e., soil ice) = SMOIS - SH2O
  96. !-- SNOWH actual snow depth (m)
  97. !-- SNOW liquid water-equivalent snow depth (m)
  98. !-- ALBEDO time-varying surface albedo including snow effect (unitless fraction)
  99. !-- ALBBCK background surface albedo (unitless fraction)
  100. !-- CHS surface exchange coefficient for heat and moisture (m s-1);
  101. !-- CHS2 2m surface exchange coefficient for heat (m s-1);
  102. !-- CQS2 2m surface exchange coefficient for moisture (m s-1);
  103. ! --- soil variables
  104. !-- num_soil_layers the number of soil layers
  105. !-- ZS depths of centers of soil layers (m)
  106. !-- DZS thicknesses of soil layers (m)
  107. !-- SLDPTH thickness of each soil layer (m, same as DZS)
  108. !-- TMN soil temperature at lower boundary (K)
  109. !-- SMCWLT wilting point (volumetric)
  110. !-- SMCDRY dry soil moisture threshold where direct evap from
  111. ! top soil layer ends (volumetric)
  112. !-- SMCREF soil moisture threshold below which transpiration begins to
  113. ! stress (volumetric)
  114. !-- SMCMAX porosity, i.e. saturated value of soil moisture (volumetric)
  115. !-- NROOT number of root layers, a function of veg type, determined
  116. ! in subroutine redprm.
  117. !-- SMSTAV Soil moisture availability for evapotranspiration (
  118. ! fraction between SMCWLT and SMCMXA)
  119. !-- SMSTOT Total soil moisture content frozen+unfrozen) in the soil column (mm)
  120. ! --- snow variables
  121. !-- SNOWC fraction snow coverage (0-1.0)
  122. ! --- vegetation variables
  123. !-- SNOALB upper bound on maximum albedo over deep snow
  124. !-- SHDMIN minimum areal fractional coverage of annual green vegetation
  125. !-- SHDMAX maximum areal fractional coverage of annual green vegetation
  126. !-- XLAI leaf area index (dimensionless)
  127. !-- Z0BRD Background fixed roughness length (M)
  128. !-- Z0 Background vroughness length (M) as function
  129. !-- ZNT Time varying roughness length (M) as function
  130. !-- ALBD(IVGTPK,ISN) background albedo reading from a table
  131. ! --- LSM output
  132. !-- HFX upward heat flux at the surface (W/m^2)
  133. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  134. !-- LH upward moisture flux at the surface (W m-2)
  135. !-- GRDFLX(I,J) ground heat flux (W m-2)
  136. !-- FDOWN radiation forcing at the surface (W m-2) = SOLDN*(1-alb)+LWDN
  137. !----------------------------------------------------------------------------
  138. !-- EC canopy water evaporation ((W m-2)
  139. !-- EDIR direct soil evaporation (W m-2)
  140. !-- ET plant transpiration from a particular root layer (W m-2)
  141. !-- ETT total plant transpiration (W m-2)
  142. !-- ESNOW sublimation from (or deposition to if <0) snowpack (W m-2)
  143. !-- DRIP through-fall of precip and/or dew in excess of canopy
  144. ! water-holding capacity (m)
  145. !-- DEW dewfall (or frostfall for t<273.15) (M)
  146. !-- SMAV Soil Moisture Availability for each layer, as a fraction
  147. ! between SMCWLT and SMCMAX (dimensionless fraction)
  148. ! ----------------------------------------------------------------------
  149. !-- BETA ratio of actual/potential evap (dimensionless)
  150. !-- ETP potential evaporation (W m-2)
  151. ! ----------------------------------------------------------------------
  152. !-- FLX1 precip-snow sfc (W m-2)
  153. !-- FLX2 freezing rain latent heat flux (W m-2)
  154. !-- FLX3 phase-change heat flux from snowmelt (W m-2)
  155. ! ----------------------------------------------------------------------
  156. !-- ACSNOM snow melt (mm) (water equivalent)
  157. !-- ACSNOW accumulated snow fall (mm) (water equivalent)
  158. !-- SNOPCX snow phase change heat flux (W/m^2)
  159. !-- POTEVP accumulated potential evaporation (W/m^2)
  160. !-- RIB Documentation needed!!!
  161. ! ----------------------------------------------------------------------
  162. !-- RUNOFF1 surface runoff (m s-1), not infiltrating the surface
  163. !-- RUNOFF2 subsurface runoff (m s-1), drainage out bottom of last
  164. ! soil layer (baseflow)
  165. ! important note: here RUNOFF2 is actually the sum of RUNOFF2 and RUNOFF3
  166. !-- RUNOFF3 numerical trunctation in excess of porosity (smcmax)
  167. ! for a given soil layer at the end of a time step (m s-1).
  168. !SFCRUNOFF Surface Runoff (mm)
  169. !UDRUNOFF Total Underground Runoff (mm), which is the sum of RUNOFF2 and RUNOFF3
  170. ! ----------------------------------------------------------------------
  171. !-- RC canopy resistance (s m-1)
  172. !-- PC plant coefficient (unitless fraction, 0-1) where PC*ETP = actual transp
  173. !-- RSMIN minimum canopy resistance (s m-1)
  174. !-- RCS incoming solar rc factor (dimensionless)
  175. !-- RCT air temperature rc factor (dimensionless)
  176. !-- RCQ atmos vapor pressure deficit rc factor (dimensionless)
  177. !-- RCSOIL soil moisture rc factor (dimensionless)
  178. !-- EMISS surface emissivity (between 0 and 1)
  179. !-- EMBCK Background surface emissivity (between 0 and 1)
  180. !-- ROVCP R/CP
  181. ! (R_d/R_v) (dimensionless)
  182. !-- ids start index for i in domain
  183. !-- ide end index for i in domain
  184. !-- jds start index for j in domain
  185. !-- jde end index for j in domain
  186. !-- kds start index for k in domain
  187. !-- kde end index for k in domain
  188. !-- ims start index for i in memory
  189. !-- ime end index for i in memory
  190. !-- jms start index for j in memory
  191. !-- jme end index for j in memory
  192. !-- kms start index for k in memory
  193. !-- kme end index for k in memory
  194. !-- its start index for i in tile
  195. !-- ite end index for i in tile
  196. !-- jts start index for j in tile
  197. !-- jte end index for j in tile
  198. !-- kts start index for k in tile
  199. !-- kte end index for k in tile
  200. !
  201. !-- SR fraction of frozen precip (0.0 to 1.0)
  202. !----------------------------------------------------------------
  203. ! IN only
  204. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  205. ims,ime, jms,jme, kms,kme, &
  206. its,ite, jts,jte, kts,kte
  207. INTEGER, INTENT(IN ) :: sf_urban_physics !urban
  208. INTEGER, INTENT(IN ) :: isurban
  209. INTEGER, INTENT(IN ) :: isice
  210. REAL, DIMENSION( ims:ime, jms:jme ) , &
  211. INTENT(IN ) :: TMN, &
  212. XLAND, &
  213. XICE, &
  214. VEGFRA, &
  215. SHDMIN, &
  216. SHDMAX, &
  217. SNOALB, &
  218. GSW, &
  219. SWDOWN, & !added 10 jan 2007
  220. GLW, &
  221. RAINBL, &
  222. EMBCK, &
  223. SR
  224. REAL, DIMENSION( ims:ime, jms:jme ) , &
  225. INTENT(INOUT) :: ALBBCK, &
  226. Z0
  227. CHARACTER(LEN=*), INTENT(IN ) :: MMINLU
  228. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  229. INTENT(IN ) :: QV3D, &
  230. p8w3D, &
  231. DZ8W, &
  232. T3D
  233. REAL, DIMENSION( ims:ime, jms:jme ) , &
  234. INTENT(IN ) :: QGH, &
  235. CPM
  236. INTEGER, DIMENSION( ims:ime, jms:jme ) , &
  237. INTENT(IN ) :: IVGTYP, &
  238. ISLTYP
  239. INTEGER, INTENT(IN) :: num_soil_layers,ITIMESTEP
  240. REAL, INTENT(IN ) :: DT,ROVCP
  241. REAL, DIMENSION(1:num_soil_layers), INTENT(IN)::DZS
  242. ! IN and OUT
  243. REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), &
  244. INTENT(INOUT) :: SMOIS, & ! total soil moisture
  245. SH2O, & ! new soil liquid
  246. TSLB ! TSLB STEMP
  247. REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), &
  248. INTENT(OUT) :: SMCREL
  249. REAL, DIMENSION( ims:ime, jms:jme ) , &
  250. INTENT(INOUT) :: TSK, & !was TGB (temperature)
  251. HFX, &
  252. QFX, &
  253. LH, &
  254. GRDFLX, &
  255. QSFC,&
  256. CQS2,&
  257. CHS, &
  258. CHS2,&
  259. SNOW, &
  260. SNOWC, &
  261. SNOWH, & !new
  262. CANWAT, &
  263. SMSTAV, &
  264. SMSTOT, &
  265. SFCRUNOFF, &
  266. UDRUNOFF, &
  267. ACSNOM, &
  268. ACSNOW, &
  269. SNOTIME, &
  270. SNOPCX, &
  271. EMISS, &
  272. RIB, &
  273. POTEVP, &
  274. ALBEDO, &
  275. ZNT
  276. REAL, DIMENSION( ims:ime, jms:jme ) , &
  277. INTENT(OUT) :: NOAHRES
  278. REAL, DIMENSION( ims:ime, jms:jme ) , &
  279. INTENT(OUT) :: CHKLOWQ
  280. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LAI
  281. REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: QZ0
  282. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMR_SFCDIF
  283. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHR_SFCDIF
  284. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMC_SFCDIF
  285. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHC_SFCDIF
  286. ! Local variables (moved here from driver to make routine thread safe, 20031007 jm)
  287. REAL, DIMENSION(1:num_soil_layers) :: ET
  288. REAL, DIMENSION(1:num_soil_layers) :: SMAV
  289. REAL :: BETA, ETP, SSOIL,EC, EDIR, ESNOW, ETT, &
  290. FLX1,FLX2,FLX3, DRIP,DEW,FDOWN,RC,PC,RSMIN,XLAI, &
  291. ! RCS,RCT,RCQ,RCSOIL
  292. RCS,RCT,RCQ,RCSOIL,FFROZP
  293. LOGICAL, INTENT(IN ) :: myj,frpcpn
  294. ! DECLARATIONS - LOGICAL
  295. ! ----------------------------------------------------------------------
  296. LOGICAL, PARAMETER :: LOCAL=.false.
  297. LOGICAL :: FRZGRA, SNOWNG
  298. LOGICAL :: IPRINT
  299. ! ----------------------------------------------------------------------
  300. ! DECLARATIONS - INTEGER
  301. ! ----------------------------------------------------------------------
  302. INTEGER :: I,J, ICE,NSOIL,SLOPETYP,SOILTYP,VEGTYP
  303. INTEGER :: NROOT
  304. INTEGER :: KZ ,K
  305. INTEGER :: NS
  306. ! ----------------------------------------------------------------------
  307. ! DECLARATIONS - REAL
  308. ! ----------------------------------------------------------------------
  309. REAL :: SHMIN,SHMAX,DQSDT2,LWDN,PRCP,PRCPRAIN, &
  310. Q2SAT,Q2SATI,SFCPRS,SFCSPD,SFCTMP,SHDFAC,SNOALB1, &
  311. SOLDN,TBOT,ZLVL, Q2K,ALBBRD, ALBEDOK, ETA, ETA_KINEMATIC, &
  312. EMBRD, &
  313. Z0K,RUNOFF1,RUNOFF2,RUNOFF3,SHEAT,SOLNET,E2SAT,SFCTSNO, &
  314. ! mek, WRF testing, expanded diagnostics
  315. SOLUP,LWUP,RNET,RES,Q1SFC,TAIRV,SATFLG
  316. ! MEK MAY 2007
  317. REAL :: FDTLIW
  318. ! MEK JUL2007 for pot. evap.
  319. REAL :: RIBB
  320. REAL :: FDTW
  321. REAL :: EMISSI
  322. REAL :: SNCOVR,SNEQV,SNOWHK,CMC, CHK,TH2
  323. REAL :: SMCDRY,SMCMAX,SMCREF,SMCWLT,SNOMLT,SOILM,SOILW,Q1,T1
  324. REAL :: SNOTIME1 ! LSTSNW1 INITIAL NUMBER OF TIMESTEPS SINCE LAST SNOWFALL
  325. REAL :: DUMMY,Z0BRD
  326. !
  327. REAL :: COSZ, SOLARDIRECT
  328. !
  329. REAL, DIMENSION(1:num_soil_layers):: SLDPTH, STC,SMC,SWC
  330. !
  331. REAL, DIMENSION(1:num_soil_layers) :: ZSOIL, RTDIS
  332. REAL, PARAMETER :: TRESH=.95E0, A2=17.67,A3=273.15,A4=29.65, &
  333. T0=273.16E0, ELWV=2.50E6, A23M4=A2*(A3-A4)
  334. ! MEK MAY 2007
  335. REAL, PARAMETER :: ROW=1.E3,ELIW=XLF,ROWLIW=ROW*ELIW
  336. ! ----------------------------------------------------------------------
  337. ! DECLARATIONS START - urban
  338. ! ----------------------------------------------------------------------
  339. ! input variables surface_driver --> lsm
  340. INTEGER, INTENT(IN) :: num_roof_layers
  341. INTEGER, INTENT(IN) :: num_wall_layers
  342. INTEGER, INTENT(IN) :: num_road_layers
  343. REAL, OPTIONAL, DIMENSION(1:num_roof_layers), INTENT(IN) :: DZR
  344. REAL, OPTIONAL, DIMENSION(1:num_wall_layers), INTENT(IN) :: DZB
  345. REAL, OPTIONAL, DIMENSION(1:num_road_layers), INTENT(IN) :: DZG
  346. REAL, OPTIONAL, INTENT(IN) :: DECLIN_URB
  347. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: COSZ_URB2D
  348. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: OMG_URB2D
  349. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XLAT_URB2D
  350. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: U_PHY
  351. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: V_PHY
  352. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: TH_PHY
  353. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: P_PHY
  354. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: RHO
  355. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UST
  356. LOGICAL, intent(in) :: rdlai2d
  357. LOGICAL, intent(in) :: USEMONALB
  358. ! input variables lsm --> urban
  359. INTEGER :: UTYPE_URB ! urban type [urban=1, suburban=2, rural=3]
  360. REAL :: TA_URB ! potential temp at 1st atmospheric level [K]
  361. REAL :: QA_URB ! mixing ratio at 1st atmospheric level [kg/kg]
  362. REAL :: UA_URB ! wind speed at 1st atmospheric level [m/s]
  363. REAL :: U1_URB ! u at 1st atmospheric level [m/s]
  364. REAL :: V1_URB ! v at 1st atmospheric level [m/s]
  365. REAL :: SSG_URB ! downward total short wave radiation [W/m/m]
  366. REAL :: LLG_URB ! downward long wave radiation [W/m/m]
  367. REAL :: RAIN_URB ! precipitation [mm/h]
  368. REAL :: RHOO_URB ! air density [kg/m^3]
  369. REAL :: ZA_URB ! first atmospheric level [m]
  370. REAL :: DELT_URB ! time step [s]
  371. REAL :: SSGD_URB ! downward direct short wave radiation [W/m/m]
  372. REAL :: SSGQ_URB ! downward diffuse short wave radiation [W/m/m]
  373. REAL :: XLAT_URB ! latitude [deg]
  374. REAL :: COSZ_URB ! cosz
  375. REAL :: OMG_URB ! hour angle
  376. REAL :: ZNT_URB ! roughness length [m]
  377. REAL :: TR_URB
  378. REAL :: TB_URB
  379. REAL :: TG_URB
  380. REAL :: TC_URB
  381. REAL :: QC_URB
  382. REAL :: UC_URB
  383. REAL :: XXXR_URB
  384. REAL :: XXXB_URB
  385. REAL :: XXXG_URB
  386. REAL :: XXXC_URB
  387. REAL, DIMENSION(1:num_roof_layers) :: TRL_URB ! roof layer temp [K]
  388. REAL, DIMENSION(1:num_wall_layers) :: TBL_URB ! wall layer temp [K]
  389. REAL, DIMENSION(1:num_road_layers) :: TGL_URB ! road layer temp [K]
  390. LOGICAL :: LSOLAR_URB
  391. ! state variable surface_driver <--> lsm <--> urban
  392. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TR_URB2D
  393. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TB_URB2D
  394. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TG_URB2D
  395. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TC_URB2D
  396. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QC_URB2D
  397. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UC_URB2D
  398. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXR_URB2D
  399. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXB_URB2D
  400. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXG_URB2D
  401. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXC_URB2D
  402. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SH_URB2D
  403. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH_URB2D
  404. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: G_URB2D
  405. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RN_URB2D
  406. !
  407. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TS_URB2D
  408. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_roof_layers, jms:jme ), INTENT(INOUT) :: TRL_URB3D
  409. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_wall_layers, jms:jme ), INTENT(INOUT) :: TBL_URB3D
  410. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_road_layers, jms:jme ), INTENT(INOUT) :: TGL_URB3D
  411. ! output variable lsm --> surface_driver
  412. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: PSIM_URB2D
  413. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: PSIH_URB2D
  414. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: GZ1OZ0_URB2D
  415. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: U10_URB2D
  416. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: V10_URB2D
  417. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: TH2_URB2D
  418. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: Q2_URB2D
  419. !
  420. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: AKMS_URB2D
  421. !
  422. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: UST_URB2D
  423. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: FRC_URB2D
  424. INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: UTYPE_URB2D
  425. ! output variables urban --> lsm
  426. REAL :: TS_URB ! surface radiative temperature [K]
  427. REAL :: QS_URB ! surface humidity [-]
  428. REAL :: SH_URB ! sensible heat flux [W/m/m]
  429. REAL :: LH_URB ! latent heat flux [W/m/m]
  430. REAL :: LH_KINEMATIC_URB ! latent heat flux, kinetic [kg/m/m/s]
  431. REAL :: SW_URB ! upward short wave radiation flux [W/m/m]
  432. REAL :: ALB_URB ! time-varying albedo [fraction]
  433. REAL :: LW_URB ! upward long wave radiation flux [W/m/m]
  434. REAL :: G_URB ! heat flux into the ground [W/m/m]
  435. REAL :: RN_URB ! net radiation [W/m/m]
  436. REAL :: PSIM_URB ! shear f for momentum [-]
  437. REAL :: PSIH_URB ! shear f for heat [-]
  438. REAL :: GZ1OZ0_URB ! shear f for heat [-]
  439. REAL :: U10_URB ! wind u component at 10 m [m/s]
  440. REAL :: V10_URB ! wind v component at 10 m [m/s]
  441. REAL :: TH2_URB ! potential temperature at 2 m [K]
  442. REAL :: Q2_URB ! humidity at 2 m [-]
  443. REAL :: CHS_URB
  444. REAL :: CHS2_URB
  445. REAL :: UST_URB
  446. ! Variables for multi-layer UCM (Martilli et al. 2002)
  447. REAL, OPTIONAL, INTENT(IN ) :: GMT
  448. INTEGER, OPTIONAL, INTENT(IN ) :: JULDAY
  449. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) ::XLAT, XLONG
  450. INTEGER, INTENT(IN ) :: NUM_URBAN_LAYERS
  451. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: trb_urb4d
  452. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1_urb4d
  453. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2_urb4d
  454. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tgb_urb4d
  455. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tlev_urb3d
  456. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: qlev_urb3d
  457. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1lev_urb3d
  458. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2lev_urb3d
  459. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tglev_urb3d
  460. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tflev_urb3d
  461. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lf_ac_urb3d
  462. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sf_ac_urb3d
  463. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: cm_ac_urb3d
  464. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfvent_urb3d
  465. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lfvent_urb3d
  466. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin1_urb3d
  467. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin2_urb3d
  468. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw1_urb3d
  469. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw2_urb3d
  470. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfr_urb3d
  471. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfg_urb3d
  472. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_u_bep !Implicit momemtum component X-direction
  473. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_v_bep !Implicit momemtum component Y-direction
  474. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_t_bep !Implicit component pot. temperature
  475. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_q_bep !Implicit momemtum component X-direction
  476. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_e_bep !Implicit component TKE
  477. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_u_bep !Explicit momentum component X-direction
  478. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_v_bep !Explicit momentum component Y-direction
  479. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_t_bep !Explicit component pot. temperature
  480. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_q_bep !Implicit momemtum component Y-direction
  481. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_e_bep !Explicit component TKE
  482. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::vl_bep !Fraction air volume in grid cell
  483. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dlg_bep !Height above ground
  484. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::sf_bep !Fraction air at the face of grid cell
  485. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dl_u_bep !Length scale
  486. ! Local variables for multi-layer UCM (Martilli et al. 2002)
  487. REAL, DIMENSION( ims:ime, jms:jme ) :: HFX_RURAL,LH_RURAL,GRDFLX_RURAL,RN_RURAL
  488. REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_RURAL,QSFC_RURAL,UMOM_RURAL,VMOM_RURAL
  489. REAL, DIMENSION( ims:ime, jms:jme ) :: ALB_RURAL,EMISS_RURAL,UST_RURAL,TSK_RURAL
  490. ! REAL, DIMENSION( ims:ime, jms:jme ) :: GRDFLX_URB
  491. ! REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_URB,QSFC_URB,UMOM_URB,VMOM_URB
  492. REAL, DIMENSION( ims:ime, jms:jme ) :: HFX_URB,UMOM_URB,VMOM_URB
  493. REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_URB
  494. ! REAL, DIMENSION( ims:ime, jms:jme ) :: ALBEDO_URB,EMISS_URB,UMOM,VMOM,UST
  495. REAL, DIMENSION(ims:ime,jms:jme) ::EMISS_URB
  496. REAL, DIMENSION(ims:ime,jms:jme) :: RL_UP_URB
  497. REAL, DIMENSION(ims:ime,jms:jme) ::RS_ABS_URB
  498. REAL, DIMENSION(ims:ime,jms:jme) ::GRDFLX_URB
  499. REAL :: SIGMA_SB,RL_UP_RURAL,RL_UP_TOT,RS_ABS_TOT,UMOM,VMOM
  500. REAL :: r1,r2,r3
  501. REAL :: CMR_URB, CHR_URB, CMC_URB, CHC_URB
  502. ! ----------------------------------------------------------------------
  503. ! DECLARATIONS END - urban
  504. ! ----------------------------------------------------------------------
  505. REAL, PARAMETER :: CAPA=R_D/CP
  506. REAL :: APELM,APES,SFCTH2,PSFC
  507. real, intent(in) :: xice_threshold
  508. character(len=80) :: message_text
  509. ! MEK MAY 2007
  510. FDTLIW=DT/ROWLIW
  511. ! MEK JUL2007
  512. FDTW=DT/(XLV*RHOWATER)
  513. ! debug printout
  514. IPRINT=.false.
  515. ! SLOPETYP=2
  516. SLOPETYP=1
  517. ! SHDMIN=0.00
  518. NSOIL=num_soil_layers
  519. DO NS=1,NSOIL
  520. SLDPTH(NS)=DZS(NS)
  521. ENDDO
  522. JLOOP : DO J=jts,jte
  523. IF(ITIMESTEP.EQ.1)THEN
  524. DO 50 I=its,ite
  525. !*** initialize soil conditions for IHOP 31 May case
  526. ! IF((XLAND(I,J)-1.5) < 0.)THEN
  527. ! if (I==108.and.j==85) then
  528. ! DO NS=1,NSOIL
  529. ! SMOIS(I,NS,J)=0.10
  530. ! SH2O(I,NS,J)=0.10
  531. ! enddo
  532. ! endif
  533. ! ENDIF
  534. !*** SET ZERO-VALUE FOR SOME OUTPUT DIAGNOSTIC ARRAYS
  535. IF((XLAND(I,J)-1.5).GE.0.)THEN
  536. ! check sea-ice point
  537. #if 0
  538. IF( XICE(I,J).GE. XICE_THRESHOLD .and. IPRINT ) PRINT*, ' sea-ice at water point, I=',I,'J=',J
  539. #endif
  540. !*** Open Water Case
  541. SMSTAV(I,J)=1.0
  542. SMSTOT(I,J)=1.0
  543. DO NS=1,NSOIL
  544. SMOIS(I,NS,J)=1.0
  545. TSLB(I,NS,J)=273.16 !STEMP
  546. SMCREL(I,NS,J)=1.0
  547. ENDDO
  548. ELSE
  549. IF ( XICE(I,J) .GE. XICE_THRESHOLD ) THEN
  550. !*** SEA-ICE CASE
  551. SMSTAV(I,J)=1.0
  552. SMSTOT(I,J)=1.0
  553. DO NS=1,NSOIL
  554. SMOIS(I,NS,J)=1.0
  555. SMCREL(I,NS,J)=1.0
  556. ENDDO
  557. ENDIF
  558. ENDIF
  559. !
  560. 50 CONTINUE
  561. ENDIF ! end of initialization over ocean
  562. !-----------------------------------------------------------------------
  563. ILOOP : DO I=its,ite
  564. ! surface pressure
  565. PSFC=P8w3D(i,1,j)
  566. ! pressure in middle of lowest layer
  567. SFCPRS=(P8W3D(I,KTS+1,j)+P8W3D(i,KTS,j))*0.5
  568. ! convert from mixing ratio to specific humidity
  569. Q2K=QV3D(i,1,j)/(1.0+QV3D(i,1,j))
  570. !
  571. ! Q2SAT=QGH(I,j)
  572. Q2SAT=QGH(I,J)/(1.0+QGH(I,J)) ! Q2SAT is sp humidity
  573. ! add check on myj=.true.
  574. ! IF((Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
  575. IF((myj).AND.(Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
  576. SATFLG=0.
  577. CHKLOWQ(I,J)=0.
  578. ELSE
  579. SATFLG=1.0
  580. CHKLOWQ(I,J)=1.
  581. ENDIF
  582. SFCTMP=T3D(i,1,j)
  583. ZLVL=0.5*DZ8W(i,1,j)
  584. ! TH2=SFCTMP+(0.0097545*ZLVL)
  585. ! calculate SFCTH2 via Exner function vs lapse-rate (above)
  586. APES=(1.E5/PSFC)**CAPA
  587. APELM=(1.E5/SFCPRS)**CAPA
  588. SFCTH2=SFCTMP*APELM
  589. TH2=SFCTH2/APES
  590. !
  591. EMISSI = EMISS(I,J)
  592. LWDN=GLW(I,J)*EMISSI
  593. ! SOLDN is total incoming solar
  594. SOLDN=SWDOWN(I,J)
  595. ! GSW is net downward solar
  596. ! SOLNET=GSW(I,J)
  597. ! use mid-day albedo to determine net downward solar (no solar zenith angle correction)
  598. SOLNET=SOLDN*(1.-ALBEDO(I,J))
  599. PRCP=RAINBL(i,j)/DT
  600. VEGTYP=IVGTYP(I,J)
  601. SOILTYP=ISLTYP(I,J)
  602. SHDFAC=VEGFRA(I,J)/100.
  603. T1=TSK(I,J)
  604. CHK=CHS(I,J)
  605. SHMIN=SHDMIN(I,J)/100. !NEW
  606. SHMAX=SHDMAX(I,J)/100. !NEW
  607. ! convert snow water equivalent from mm to meter
  608. SNEQV=SNOW(I,J)*0.001
  609. ! snow depth in meters
  610. SNOWHK=SNOWH(I,J)
  611. SNCOVR=SNOWC(I,J)
  612. ! if "SR" present, set frac of frozen precip ("FFROZP") = snow-ratio ("SR", range:0-1)
  613. ! SR from e.g. Ferrier microphysics
  614. ! otherwise define from 1st atmos level temperature
  615. IF(FRPCPN) THEN
  616. FFROZP=SR(I,J)
  617. ELSE
  618. IF (SFCTMP <= 273.15) THEN
  619. FFROZP = 1.0
  620. ELSE
  621. FFROZP = 0.0
  622. ENDIF
  623. ENDIF
  624. !***
  625. IF((XLAND(I,J)-1.5).GE.0.)THEN ! begining of land/sea if block
  626. ! Open water points
  627. TSK_RURAL(I,J)=TSK(I,J)
  628. HFX_RURAL(I,J)=HFX(I,J)
  629. QFX_RURAL(I,J)=QFX(I,J)
  630. LH_RURAL(I,J)=LH(I,J)
  631. EMISS_RURAL(I,J)=EMISS(I,J)
  632. GRDFLX_RURAL(I,J)=GRDFLX(I,J)
  633. ELSE
  634. ! Land or sea-ice case
  635. IF (XICE(I,J) >= XICE_THRESHOLD) THEN
  636. ! Sea-ice point
  637. ICE = 1
  638. ELSE IF ( VEGTYP == ISICE ) THEN
  639. ! Land-ice point
  640. ICE = -1
  641. ELSE
  642. ! Neither sea ice or land ice.
  643. ICE=0
  644. ENDIF
  645. DQSDT2=Q2SAT*A23M4/(SFCTMP-A4)**2
  646. IF(SNOW(I,J).GT.0.0)THEN
  647. ! snow on surface (use ice saturation properties)
  648. SFCTSNO=SFCTMP
  649. E2SAT=611.2*EXP(6174.*(1./273.15 - 1./SFCTSNO))
  650. Q2SATI=0.622*E2SAT/(SFCPRS-E2SAT)
  651. Q2SATI=Q2SATI/(1.0+Q2SATI) ! spec. hum.
  652. IF (T1 .GT. 273.14) THEN
  653. ! warm ground temps, weight the saturation between ice and water according to SNOWC
  654. Q2SAT=Q2SAT*(1.-SNOWC(I,J)) + Q2SATI*SNOWC(I,J)
  655. DQSDT2=DQSDT2*(1.-SNOWC(I,J)) + Q2SATI*6174./(SFCTSNO**2)*SNOWC(I,J)
  656. ELSE
  657. ! cold ground temps, use ice saturation only
  658. Q2SAT=Q2SATI
  659. DQSDT2=Q2SATI*6174./(SFCTSNO**2)
  660. ENDIF
  661. ! for snow cover fraction at 0 C, ground temp will not change, so DQSDT2 effectively zero
  662. IF(T1 .GT. 273. .AND. SNOWC(I,J) .GT. 0.)DQSDT2=DQSDT2*(1.-SNOWC(I,J))
  663. ENDIF
  664. IF(ICE.EQ.1)THEN
  665. ! Sea-ice point has deep-level temperature of -2 C
  666. TBOT=271.16
  667. ELSE
  668. ! Land-ice or land points have the usual deep-soil temperature.
  669. TBOT=TMN(I,J)
  670. ENDIF
  671. IF(VEGTYP.EQ.25) SHDFAC=0.0000
  672. IF(VEGTYP.EQ.26) SHDFAC=0.0000
  673. IF(VEGTYP.EQ.27) SHDFAC=0.0000
  674. IF(SOILTYP.EQ.14.AND.XICE(I,J).EQ.0.)THEN
  675. #if 0
  676. IF(IPRINT)PRINT*,' SOIL TYPE FOUND TO BE WATER AT A LAND-POINT'
  677. IF(IPRINT)PRINT*,i,j,'RESET SOIL in surfce.F'
  678. #endif
  679. SOILTYP=7
  680. ENDIF
  681. SNOALB1 = SNOALB(I,J)
  682. CMC=CANWAT(I,J)
  683. !-------------------------------------------
  684. !*** convert snow depth from mm to meter
  685. !
  686. ! IF(RDMAXALB) THEN
  687. ! SNOALB=ALBMAX(I,J)*0.01
  688. ! ELSE
  689. ! SNOALB=MAXALB(IVGTPK)*0.01
  690. ! ENDIF
  691. ! SNOALB1=0.80
  692. ! SHMIN=0.00
  693. ALBBRD=ALBBCK(I,J)
  694. Z0BRD=Z0(I,J)
  695. EMBRD=EMBCK(I,J)
  696. SNOTIME1 = SNOTIME(I,J)
  697. RIBB=RIB(I,J)
  698. !FEI: temporaray arrays above need to be changed later by using SI
  699. DO NS=1,NSOIL
  700. SMC(NS)=SMOIS(I,NS,J)
  701. STC(NS)=TSLB(I,NS,J) !STEMP
  702. SWC(NS)=SH2O(I,NS,J)
  703. ENDDO
  704. !
  705. if ( (SNEQV.ne.0..AND.SNOWHK.eq.0.).or.(SNOWHK.le.SNEQV) )THEN
  706. SNOWHK= 5.*SNEQV
  707. endif
  708. !
  709. !Fei: urban. for urban surface, if calling UCM, redefine the natural surface in cities as
  710. ! the "NATURAL" category in the VEGPARM.TBL
  711. IF(SF_URBAN_PHYSICS == 1.OR. SF_URBAN_PHYSICS==2.OR.SF_URBAN_PHYSICS==3 ) THEN
  712. IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
  713. IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
  714. VEGTYP = NATURAL
  715. SHDFAC = SHDTBL(NATURAL)
  716. ALBEDOK =0.2 ! 0.2
  717. ALBBRD =0.2 !0.2
  718. EMISSI = 0.98 !for VEGTYP=5
  719. IF ( FRC_URB2D(I,J) < 0.99 ) THEN
  720. if(sf_urban_physics.eq.1)then
  721. T1= ( TSK(I,J) -FRC_URB2D(I,J) * TS_URB2D (I,J) )/ (1-FRC_URB2D(I,J))
  722. elseif((sf_urban_physics.eq.2).OR.(sf_urban_physics.eq.3))then
  723. r1= (tsk(i,j)**4.)
  724. r2= frc_urb2d(i,j)*(ts_urb2d(i,j)**4.)
  725. r3= (1.-frc_urb2d(i,j))
  726. t1= ((r1-r2)/r3)**.25
  727. endif
  728. ELSE
  729. T1 = TSK(I,J)
  730. ENDIF
  731. ENDIF
  732. ELSE
  733. IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
  734. IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
  735. VEGTYP = ISURBAN
  736. ENDIF
  737. ENDIF
  738. #if 0
  739. IF(IPRINT) THEN
  740. !
  741. print*, 'BEFORE SFLX, in Noahlsm_driver'
  742. print*, 'ICE', ICE, 'DT',DT, 'ZLVL',ZLVL, 'NSOIL', NSOIL, &
  743. 'SLDPTH', SLDPTH, 'LOCAL',LOCAL, 'LUTYPE',&
  744. LUTYPE, 'SLTYPE',SLTYPE, 'LWDN',LWDN, 'SOLDN',SOLDN, &
  745. 'SFCPRS',SFCPRS, 'PRCP',PRCP,'SFCTMP',SFCTMP,'Q2K',Q2K, &
  746. 'TH2',TH2,'Q2SAT',Q2SAT,'DQSDT2',DQSDT2,'VEGTYP', VEGTYP,&
  747. 'SOILTYP',SOILTYP, 'SLOPETYP',SLOPETYP, 'SHDFAC',SHDFAC,&
  748. 'SHMIN',SHMIN, 'ALBBRD',ALBBRD,'SNOALB1',SNOALB1,'TBOT',&
  749. TBOT, 'Z0BRD',Z0BRD, 'Z0K',Z0K, 'CMC',CMC, 'T1',T1,'STC',&
  750. STC, 'SMC',SMC, 'SWC',SWC,'SNOWHK',SNOWHK,'SNEQV',SNEQV,&
  751. 'ALBEDOK',ALBEDOK,'CHK',CHK,'ETA',ETA,'SHEAT',SHEAT, &
  752. 'ETA_KINEMATIC',ETA_KINEMATIC, 'FDOWN',FDOWN,'EC',EC, &
  753. 'EDIR',EDIR,'ET',ET,'ETT',ETT,'ESNOW',ESNOW,'DRIP',DRIP,&
  754. 'DEW',DEW,'BETA',BETA,'ETP',ETP,'SSOIL',SSOIL,'FLX1',FLX1,&
  755. 'FLX2',FLX2,'FLX3',FLX3,'SNOMLT',SNOMLT,'SNCOVR',SNCOVR,&
  756. 'RUNOFF1',RUNOFF1,'RUNOFF2',RUNOFF2,'RUNOFF3',RUNOFF3, &
  757. 'RC',RC, 'PC',PC,'RSMIN',RSMIN,'XLAI',XLAI,'RCS',RCS, &
  758. 'RCT',RCT,'RCQ',RCQ,'RCSOIL',RCSOIL,'SOILW',SOILW, &
  759. 'SOILM',SOILM,'Q1',Q1,'SMCWLT',SMCWLT,'SMCDRY',SMCDRY,&
  760. 'SMCREF',SMCREF,'SMCMAX',SMCMAX,'NROOT',NROOT
  761. endif
  762. #endif
  763. IF (rdlai2d) THEN
  764. xlai = lai(i,j)
  765. endif
  766. IF ( XICE(I,J) >= XICE_THRESHOLD ) THEN
  767. ! Sea-ice case
  768. DO NS = 1, NSOIL
  769. SH2O(I,NS,J) = 1.0
  770. ENDDO
  771. LAI(I,J) = 0.01
  772. CYCLE ILOOP
  773. ELSE
  774. ! Land and glacial land.
  775. CALL SFLX (I,J,ICE,FFROZP, ISURBAN, DT,ZLVL,NSOIL,SLDPTH, & !C
  776. LOCAL, & !L
  777. LUTYPE, SLTYPE, & !CL
  778. LWDN,SOLDN,SOLNET,SFCPRS,PRCP,SFCTMP,Q2K,DUMMY, & !F
  779. DUMMY,DUMMY, DUMMY, & !F PRCPRAIN not used
  780. TH2,Q2SAT,DQSDT2, & !I
  781. VEGTYP,SOILTYP,SLOPETYP,SHDFAC,SHMIN,SHMAX, & !I
  782. ALBBRD, SNOALB1,TBOT, Z0BRD, Z0K, EMISSI, EMBRD, & !S
  783. CMC,T1,STC,SMC,SWC,SNOWHK,SNEQV,ALBEDOK,CHK,dummy,& !H
  784. ETA,SHEAT, ETA_KINEMATIC,FDOWN, & !O
  785. EC,EDIR,ET,ETT,ESNOW,DRIP,DEW, & !O
  786. BETA,ETP,SSOIL, & !O
  787. FLX1,FLX2,FLX3, & !O
  788. SNOMLT,SNCOVR, & !O
  789. RUNOFF1,RUNOFF2,RUNOFF3, & !O
  790. RC,PC,RSMIN,XLAI,RCS,RCT,RCQ,RCSOIL, & !O
  791. SOILW,SOILM,Q1,SMAV, & !D
  792. RDLAI2D,USEMONALB, &
  793. SNOTIME1, &
  794. RIBB, &
  795. SMCWLT,SMCDRY,SMCREF,SMCMAX,NROOT)
  796. ENDIF
  797. lai(i,j) = xlai
  798. #if 0
  799. IF(IPRINT) THEN
  800. print*, 'AFTER SFLX, in Noahlsm_driver'
  801. print*, 'ICE', ICE, 'DT',DT, 'ZLVL',ZLVL, 'NSOIL', NSOIL, &
  802. 'SLDPTH', SLDPTH, 'LOCAL',LOCAL, 'LUTYPE',&
  803. LUTYPE, 'SLTYPE',SLTYPE, 'LWDN',LWDN, 'SOLDN',SOLDN, &
  804. 'SFCPRS',SFCPRS, 'PRCP',PRCP,'SFCTMP',SFCTMP,'Q2K',Q2K, &
  805. 'TH2',TH2,'Q2SAT',Q2SAT,'DQSDT2',DQSDT2,'VEGTYP', VEGTYP,&
  806. 'SOILTYP',SOILTYP, 'SLOPETYP',SLOPETYP, 'SHDFAC',SHDFAC,&
  807. 'SHDMIN',SHMIN, 'ALBBRD',ALBBRD,'SNOALB',SNOALB1,'TBOT',&
  808. TBOT, 'Z0BRD',Z0BRD, 'Z0K',Z0K, 'CMC',CMC, 'T1',T1,'STC',&
  809. STC, 'SMC',SMC, 'SWc',SWC,'SNOWHK',SNOWHK,'SNEQV',SNEQV,&
  810. 'ALBEDOK',ALBEDOK,'CHK',CHK,'ETA',ETA,'SHEAT',SHEAT, &
  811. 'ETA_KINEMATIC',ETA_KINEMATIC, 'FDOWN',FDOWN,'EC',EC, &
  812. 'EDIR',EDIR,'ET',ET,'ETT',ETT,'ESNOW',ESNOW,'DRIP',DRIP,&
  813. 'DEW',DEW,'BETA',BETA,'ETP',ETP,'SSOIL',SSOIL,'FLX1',FLX1,&
  814. 'FLX2',FLX2,'FLX3',FLX3,'SNOMLT',SNOMLT,'SNCOVR',SNCOVR,&
  815. 'RUNOFF1',RUNOFF1,'RUNOFF2',RUNOFF2,'RUNOFF3',RUNOFF3, &
  816. 'RC',RC, 'PC',PC,'RSMIN',RSMIN,'XLAI',XLAI,'RCS',RCS, &
  817. 'RCT',RCT,'RCQ',RCQ,'RCSOIL',RCSOIL,'SOILW',SOILW, &
  818. 'SOILM',SOILM,'Q1',Q1,'SMCWLT',SMCWLT,'SMCDRY',SMCDRY,&
  819. 'SMCREF',SMCREF,'SMCMAX',SMCMAX,'NROOT',NROOT
  820. endif
  821. #endif
  822. !*** UPDATE STATE VARIABLES
  823. CANWAT(I,J)=CMC
  824. SNOW(I,J)=SNEQV*1000.
  825. ! SNOWH(I,J)=SNOWHK*1000.
  826. SNOWH(I,J)=SNOWHK ! SNOWHK in meters
  827. ALBEDO(I,J)=ALBEDOK
  828. ALB_RURAL(I,J)=ALBEDOK
  829. ALBBCK(I,J)=ALBBRD
  830. Z0(I,J)=Z0BRD
  831. EMISS(I,J) = EMISSI
  832. EMISS_RURAL(I,J) = EMISSI
  833. ! Noah: activate time-varying roughness length (V3.3 Feb 2011)
  834. ZNT(I,J)=Z0K
  835. TSK(I,J)=T1
  836. TSK_RURAL(I,J)=T1
  837. HFX(I,J)=SHEAT
  838. HFX_RURAL(I,J)=SHEAT
  839. ! MEk Jul07 add potential evap accum
  840. POTEVP(I,J)=POTEVP(I,J)+ETP*FDTW
  841. QFX(I,J)=ETA_KINEMATIC
  842. QFX_RURAL(I,J)=ETA_KINEMATIC
  843. LH(I,J)=ETA
  844. LH_RURAL(I,J)=ETA
  845. GRDFLX(I,J)=SSOIL
  846. GRDFLX_RURAL(I,J)=SSOIL
  847. SNOWC(I,J)=SNCOVR
  848. CHS2(I,J)=CQS2(I,J)
  849. SNOTIME(I,J) = SNOTIME1
  850. ! prevent diagnostic ground q (q1) from being greater than qsat(tsk)
  851. ! as happens over snow cover where the cqs2 value also becomes irrelevant
  852. ! by setting cqs2=chs in this situation the 2m q should become just qv(k=1)
  853. IF (Q1 .GT. QSFC(I,J)) THEN
  854. CQS2(I,J) = CHS(I,J)
  855. ENDIF
  856. ! QSFC(I,J)=Q1
  857. ! Convert QSFC back to mixing ratio
  858. QSFC(I,J)= Q1/(1.0-Q1)
  859. !
  860. QSFC_RURAL(I,J)= Q1/(1.0-Q1)
  861. ! Calculate momentum flux from rural surface for use with multi-layer UCM (Martilli et al. 2002)
  862. DO 80 NS=1,NSOIL
  863. SMOIS(I,NS,J)=SMC(NS)
  864. TSLB(I,NS,J)=STC(NS) ! STEMP
  865. SH2O(I,NS,J)=SWC(NS)
  866. 80 CONTINUE
  867. ! ENDIF
  868. !
  869. ! Residual of surface energy balance equation terms
  870. !
  871. noahres(i,j) = ( solnet + lwdn ) - sheat + ssoil - eta - ( emissi * STBOLT * (t1**4) ) - flx1 - flx2 - flx3
  872. IF (SF_URBAN_PHYSICS == 1 ) THEN ! Beginning of UCM CALL if block
  873. !--------------------------------------
  874. ! URBAN CANOPY MODEL START - urban
  875. !--------------------------------------
  876. ! Input variables lsm --> urban
  877. IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
  878. IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33 ) THEN
  879. ! Call urban
  880. !
  881. UTYPE_URB = UTYPE_URB2D(I,J) !urban type (low, high or industrial)
  882. TA_URB = SFCTMP ! [K]
  883. QA_URB = Q2K ! [kg/kg]
  884. UA_URB = SQRT(U_PHY(I,1,J)**2.+V_PHY(I,1,J)**2.)
  885. U1_URB = U_PHY(I,1,J)
  886. V1_URB = V_PHY(I,1,J)
  887. IF(UA_URB < 1.) UA_URB=1. ! [m/s]
  888. SSG_URB = SOLDN ! [W/m/m]
  889. SSGD_URB = 0.8*SOLDN ! [W/m/m]
  890. SSGQ_URB = SSG_URB-SSGD_URB ! [W/m/m]
  891. LLG_URB = GLW(I,J) ! [W/m/m]
  892. RAIN_URB = RAINBL(I,J) ! [mm]
  893. RHOO_URB = SFCPRS / (287.04 * SFCTMP * (1.0+ 0.61 * Q2K)) ![kg/m/m/m]
  894. ZA_URB = ZLVL ! [m]
  895. DELT_URB = DT ! [sec]
  896. XLAT_URB = XLAT_URB2D(I,J) ! [deg]
  897. COSZ_URB = COSZ_URB2D(I,J) !
  898. OMG_URB = OMG_URB2D(I,J) !
  899. ZNT_URB = ZNT(I,J)
  900. LSOLAR_URB = .FALSE.
  901. TR_URB = TR_URB2D(I,J)
  902. TB_URB = TB_URB2D(I,J)
  903. TG_URB = TG_URB2D(I,J)
  904. TC_URB = TC_URB2D(I,J)
  905. QC_URB = QC_URB2D(I,J)
  906. UC_URB = UC_URB2D(I,J)
  907. DO K = 1,num_roof_layers
  908. TRL_URB(K) = TRL_URB3D(I,K,J)
  909. END DO
  910. DO K = 1,num_wall_layers
  911. TBL_URB(K) = TBL_URB3D(I,K,J)
  912. END DO
  913. DO K = 1,num_road_layers
  914. TGL_URB(K) = TGL_URB3D(I,K,J)
  915. END DO
  916. XXXR_URB = XXXR_URB2D(I,J)
  917. XXXB_URB = XXXB_URB2D(I,J)
  918. XXXG_URB = XXXG_URB2D(I,J)
  919. XXXC_URB = XXXC_URB2D(I,J)
  920. !
  921. !
  922. ! Limits to avoid dividing by small number
  923. if (CHS(I,J) < 1.0E-02) then
  924. CHS(I,J) = 1.0E-02
  925. endif
  926. if (CHS2(I,J) < 1.0E-02) then
  927. CHS2(I,J) = 1.0E-02
  928. endif
  929. if (CQS2(I,J) < 1.0E-02) then
  930. CQS2(I,J) = 1.0E-02
  931. endif
  932. !
  933. CHS_URB = CHS(I,J)
  934. CHS2_URB = CHS2(I,J)
  935. IF (PRESENT(CMR_SFCDIF)) THEN
  936. CMR_URB = CMR_SFCDIF(I,J)
  937. CHR_URB = CHR_SFCDIF(I,J)
  938. CMC_URB = CMC_SFCDIF(I,J)
  939. CHC_URB = CHC_SFCDIF(I,J)
  940. ENDIF
  941. !
  942. ! Call urban
  943. CALL urban(LSOLAR_URB, & ! I
  944. num_roof_layers,num_wall_layers,num_road_layers, & ! C
  945. DZR,DZB,DZG, & ! C
  946. UTYPE_URB,TA_URB,QA_URB,UA_URB,U1_URB,V1_URB,SSG_URB, & ! I
  947. SSGD_URB,SSGQ_URB,LLG_URB,RAIN_URB,RHOO_URB, & ! I
  948. ZA_URB,DECLIN_URB,COSZ_URB,OMG_URB, & ! I
  949. XLAT_URB,DELT_URB,ZNT_URB, & ! I
  950. CHS_URB, CHS2_URB, & ! I
  951. TR_URB, TB_URB, TG_URB, TC_URB, QC_URB,UC_URB, & ! H
  952. TRL_URB,TBL_URB,TGL_URB, & ! H
  953. XXXR_URB, XXXB_URB, XXXG_URB, XXXC_URB, & ! H
  954. TS_URB,QS_URB,SH_URB,LH_URB,LH_KINEMATIC_URB, & ! O
  955. SW_URB,ALB_URB,LW_URB,G_URB,RN_URB,PSIM_URB,PSIH_URB, & ! O
  956. GZ1OZ0_URB, & !O
  957. CMR_URB, CHR_URB, CMC_URB, CHC_URB, &
  958. U10_URB, V10_URB, TH2_URB, Q2_URB, & ! O
  959. UST_URB) !O
  960. #if 0
  961. IF(IPRINT) THEN
  962. print*, 'AFTER CALL URBAN'
  963. print*,'num_roof_layers',num_roof_layers, 'num_wall_layers', &
  964. num_wall_layers, &
  965. 'DZR',DZR,'DZB',DZB,'DZG',DZG,'UTYPE_URB',UTYPE_URB,'TA_URB', &
  966. TA_URB, &
  967. 'QA_URB',QA_URB,'UA_URB',UA_URB,'U1_URB',U1_URB,'V1_URB', &
  968. V1_URB, &
  969. 'SSG_URB',SSG_URB,'SSGD_URB',SSGD_URB,'SSGQ_URB',SSGQ_URB, &
  970. 'LLG_URB',LLG_URB,'RAIN_URB',RAIN_URB,'RHOO_URB',RHOO_URB, &
  971. 'ZA_URB',ZA_URB, 'DECLIN_URB',DECLIN_URB,'COSZ_URB',COSZ_URB,&
  972. 'OMG_URB',OMG_URB,'XLAT_URB',XLAT_URB,'DELT_URB',DELT_URB, &
  973. 'ZNT_URB',ZNT_URB,'TR_URB',TR_URB, 'TB_URB',TB_URB,'TG_URB',&
  974. TG_URB,'TC_URB',TC_URB,'QC_URB',QC_URB,'TRL_URB',TRL_URB, &
  975. 'TBL_URB',TBL_URB,'TGL_URB',TGL_URB,'XXXR_URB',XXXR_URB, &
  976. 'XXXB_URB',XXXB_URB,'XXXG_URB',XXXG_URB,'XXXC_URB',XXXC_URB,&
  977. 'TS_URB',TS_URB,'QS_URB',QS_URB,'SH_URB',SH_URB,'LH_URB', &
  978. LH_URB, 'LH_KINEMATIC_URB',LH_KINEMATIC_URB,'SW_URB',SW_URB,&
  979. 'ALB_URB',ALB_URB,'LW_URB',LW_URB,'G_URB',G_URB,'RN_URB', &
  980. RN_URB, 'PSIM_URB',PSIM_URB,'PSIH_URB',PSIH_URB, &
  981. 'U10_URB',U10_URB,'V10_URB',V10_URB,'TH2_URB',TH2_URB, &
  982. 'Q2_URB',Q2_URB,'CHS_URB',CHS_URB,'CHS2_URB',CHS2_URB
  983. endif
  984. #endif
  985. TS_URB2D(I,J) = TS_URB
  986. ALBEDO(I,J) = FRC_URB2D(I,J)*ALB_URB+(1-FRC_URB2D(I,J))*ALBEDOK ![-]
  987. HFX(I,J) = FRC_URB2D(I,J)*SH_URB+(1-FRC_URB2D(I,J))*SHEAT ![W/m/m]
  988. QFX(I,J) = FRC_URB2D(I,J)*LH_KINEMATIC_URB &
  989. + (1-FRC_URB2D(I,J))*ETA_KINEMATIC ![kg/m/m/s]
  990. LH(I,J) = FRC_URB2D(I,J)*LH_URB+(1-FRC_URB2D(I,J))*ETA ![W/m/m]
  991. GRDFLX(I,J) = FRC_URB2D(I,J)*G_URB+(1-FRC_URB2D(I,J))*SSOIL ![W/m/m]
  992. TSK(I,J) = FRC_URB2D(I,J)*TS_URB+(1-FRC_URB2D(I,J))*T1 ![K]
  993. Q1 = FRC_URB2D(I,J)*QS_URB+(1-FRC_URB2D(I,J))*Q1 ![-]
  994. ! Convert QSFC back to mixing ratio
  995. QSFC(I,J)= Q1/(1.0-Q1)
  996. UST(I,J)= FRC_URB2D(I,J)*UST_URB+(1-FRC_URB2D(I,J))*UST(I,J) ![m/s]
  997. #if 0
  998. IF(IPRINT)THEN
  999. print*, ' FRC_URB2D', FRC_URB2D, &
  1000. 'ALB_URB',ALB_URB, 'ALBEDOK',ALBEDOK, &
  1001. 'ALBEDO(I,J)', ALBEDO(I,J), &
  1002. 'SH_URB',SH_URB,'SHEAT',SHEAT, 'HFX(I,J)',HFX(I,J), &
  1003. 'LH_KINEMATIC_URB',LH_KINEMATIC_URB,'ETA_KINEMATIC', &
  1004. ETA_KINEMATIC, 'QFX(I,J)',QFX(I,J), &
  1005. 'LH_URB',LH_URB, 'ETA',ETA, 'LH(I,J)',LH(I,J), &
  1006. 'G_URB',G_URB,'SSOIL',SSOIL,'GRDFLX(I,J)', GRDFLX(I,J),&
  1007. 'TS_URB',TS_URB,'T1',T1,'TSK(I,J)',TSK(I,J), &
  1008. 'QS_URB',QS_URB,'Q1',Q1,'QSFC(I,J)',QSFC(I,J)
  1009. endif
  1010. #endif
  1011. ! Renew Urban State Varialbes
  1012. TR_URB2D(I,J) = TR_URB
  1013. TB_URB2D(I,J) = TB_URB
  1014. TG_URB2D(I,J) = TG_URB
  1015. TC_URB2D(I,J) = TC_URB
  1016. QC_URB2D(I,J) = QC_URB
  1017. UC_URB2D(I,J) = UC_URB
  1018. DO K = 1,num_roof_layers
  1019. TRL_URB3D(I,K,J) = TRL_URB(K)
  1020. END DO
  1021. DO K = 1,num_wall_layers
  1022. TBL_URB3D(I,K,J) = TBL_URB(K)
  1023. END DO
  1024. DO K = 1,num_road_layers
  1025. TGL_URB3D(I,K,J) = TGL_URB(K)
  1026. END DO
  1027. XXXR_URB2D(I,J) = XXXR_URB
  1028. XXXB_URB2D(I,J) = XXXB_URB
  1029. XXXG_URB2D(I,J) = XXXG_URB
  1030. XXXC_URB2D(I,J) = XXXC_URB
  1031. SH_URB2D(I,J) = SH_URB
  1032. LH_URB2D(I,J) = LH_URB
  1033. G_URB2D(I,J) = G_URB
  1034. RN_URB2D(I,J) = RN_URB
  1035. PSIM_URB2D(I,J) = PSIM_URB
  1036. PSIH_URB2D(I,J) = PSIH_URB
  1037. GZ1OZ0_URB2D(I,J)= GZ1OZ0_URB
  1038. U10_URB2D(I,J) = U10_URB
  1039. V10_URB2D(I,J) = V10_URB
  1040. TH2_URB2D(I,J) = TH2_URB
  1041. Q2_URB2D(I,J) = Q2_URB
  1042. UST_URB2D(I,J) = UST_URB
  1043. AKMS_URB2D(I,J) = KARMAN * UST_URB2D(I,J)/(GZ1OZ0_URB2D(I,J)-PSIM_URB2D(I,J))
  1044. IF (PRESENT(CMR_SFCDIF)) THEN
  1045. CMR_SFCDIF(I,J) = CMR_URB
  1046. CHR_SFCDIF(I,J) = CHR_URB
  1047. CMC_SFCDIF(I,J) = CMC_URB
  1048. CHC_SFCDIF(I,J) = CHC_URB
  1049. ENDIF
  1050. END IF
  1051. ENDIF ! end of UCM CALL if block
  1052. !--------------------------------------
  1053. ! Urban Part End - urban
  1054. !--------------------------------------
  1055. !*** DIAGNOSTICS
  1056. SMSTAV(I,J)=SOILW
  1057. SMSTOT(I,J)=SOILM*1000.
  1058. DO NS=1,NSOIL
  1059. SMCREL(I,NS,J)=SMAV(NS)
  1060. ENDDO
  1061. ! Convert the water unit into mm
  1062. SFCRUNOFF(I,J)=SFCRUNOFF(I,J)+RUNOFF1*DT*1000.0
  1063. UDRUNOFF(I,J)=UDRUNOFF(I,J)+RUNOFF2*DT*1000.0
  1064. ! snow defined when fraction of frozen precip (FFROZP) > 0.5,
  1065. IF(FFROZP.GT.0.5)THEN
  1066. ACSNOW(I,J)=ACSNOW(I,J)+PRCP*DT
  1067. ENDIF
  1068. IF(SNOW(I,J).GT.0.)THEN
  1069. ACSNOM(I,J)=ACSNOM(I,J)+SNOMLT*1000.
  1070. ! accumulated snow-melt energy
  1071. SNOPCX(I,J)=SNOPCX(I,J)-SNOMLT/FDTLIW
  1072. ENDIF
  1073. ENDIF ! endif of land-sea test
  1074. ENDDO ILOOP ! of I loop
  1075. ENDDO JLOOP ! of J loop
  1076. IF (SF_URBAN_PHYSICS == 2) THEN
  1077. do j=jts,jte
  1078. do i=its,ite
  1079. EMISS_URB(i,j)=0.
  1080. RL_UP_URB(i,j)=0.
  1081. RS_ABS_URB(i,j)=0.
  1082. GRDFLX_URB(i,j)=0.
  1083. b_q_bep(i,kts:kte,j)=0.
  1084. end do
  1085. end do
  1086. CALL BEP(frc_urb2d,utype_urb2d,itimestep,dz8w,dt,u_phy,v_phy, &
  1087. th_phy,rho,p_phy,swdown,glw, &
  1088. gmt,julday,xlong,xlat,declin_urb,cosz_urb2d,omg_urb2d, &
  1089. num_urban_layers, &
  1090. trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, &
  1091. sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, &
  1092. a_u_bep,a_v_bep,a_t_bep, &
  1093. a_e_bep,b_u_bep,b_v_bep, &
  1094. b_t_bep,b_e_bep,dlg_bep, &
  1095. dl_u_bep,sf_bep,vl_bep, &
  1096. rl_up_urb,rs_abs_urb,emiss_urb,grdflx_urb, &
  1097. ids,ide, jds,jde, kds,kde, &
  1098. ims,ime, jms,jme, kms,kme, &
  1099. its,ite, jts,jte, kts,kte )
  1100. ENDIF
  1101. IF (SF_URBAN_PHYSICS == 3) THEN
  1102. do j=jts,jte
  1103. do i=its,ite
  1104. EMISS_URB(i,j)=0.
  1105. RL_UP_URB(i,j)=0.
  1106. RS_ABS_URB(i,j)=0.
  1107. GRDFLX_URB(i,j)=0.
  1108. b_q_bep(i,kts:kte,j)=0.
  1109. end do
  1110. end do
  1111. CALL BEP_BEM(frc_urb2d,utype_urb2d,itimestep,dz8w,dt,u_phy,v_phy, &
  1112. th_phy,rho,p_phy,swdown,glw, &
  1113. gmt,julday,xlong,xlat,declin_urb,cosz_urb2d,omg_urb2d, &
  1114. num_urban_layers, &
  1115. trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, &
  1116. tlev_urb3d,qlev_urb3d,tw1lev_urb3d,tw2lev_urb3d, &
  1117. tglev_urb3d,tflev_urb3d,sf_ac_urb3d,lf_ac_urb3d, &
  1118. cm_ac_urb3d,sfvent_urb3d,lfvent_urb3d, &
  1119. sfwin1_urb3d,sfwin2_urb3d, &
  1120. sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, &
  1121. a_u_bep,a_v_bep,a_t_bep, &
  1122. a_e_bep,b_u_bep,b_v_bep, &
  1123. b_t_bep,b_e_bep,b_q_bep,dlg_bep, &
  1124. dl_u_bep,sf_bep,vl_bep, &
  1125. rl_up_urb,rs_abs_urb,emiss_urb,grdflx_urb,qv3d, &
  1126. ids,ide, jds,jde, kds,kde, &
  1127. ims,ime, jms,jme, kms,kme, &
  1128. its,ite, jts,jte, kts,kte )
  1129. ENDIF
  1130. if((sf_urban_physics.eq.2).OR.(sf_urban_physics.eq.3))then !Bep begin
  1131. ! fix the value of the Stefan-Boltzmann constant
  1132. sigma_sb=5.67e-08
  1133. do j=jts,jte
  1134. do i=its,ite
  1135. UMOM_URB(I,J)=0.
  1136. VMOM_URB(I,J)=0.
  1137. HFX_URB(I,J)=0.
  1138. QFX_URB(I,J)=0.
  1139. do k=kts,kte
  1140. a_u_bep(i,k,j)=a_u_bep(i,k,j)*frc_urb2d(i,j)
  1141. a_v_bep(i,k,j)=a_v_bep(i,k,j)*frc_urb2d(i,j)
  1142. a_t_bep(i,k,j)=a_t_bep(i,k,j)*frc_urb2d(i,j)
  1143. a_q_bep(i,k,j)=0.
  1144. a_e_bep(i,k,j)=0.
  1145. b_u_bep(i,k,j)=b_u_bep(i,k,j)*frc_urb2d(i,j)
  1146. b_v_bep(i,k,j)=b_v_bep(i,k,j)*frc_urb2d(i,j)
  1147. b_t_bep(i,k,j)=b_t_bep(i,k,j)*frc_urb2d(i,j)
  1148. b_q_bep(i,k,j)=b_q_bep(i,k,j)*frc_urb2d(i,j)
  1149. b_e_bep(i,k,j)=b_e_bep(i,k,j)*frc_urb2d(i,j)
  1150. HFX_URB(I,J)=HFX_URB(I,J)+B_T_BEP(I,K,J)*RHO(I,K,J)*CP* &
  1151. DZ8W(I,K,J)*VL_BEP(I,K,J)
  1152. QFX_URB(I,J)=QFX_URB(I,J)+B_Q_BEP(I,K,J)* &
  1153. DZ8W(I,K,J)*VL_BEP(I,K,J)
  1154. UMOM_URB(I,J)=UMOM_URB(I,J)+ (A_U_BEP(I,K,J)*U_PHY(I,K,J)+ &
  1155. B_U_BEP(I,K,J))*DZ8W(I,K,J)*VL_BEP(I,K,J)
  1156. VMOM_URB(I,J)=VMOM_URB(I,J)+ (A_V_BEP(I,K,J)*V_PHY(I,K,J)+ &
  1157. B_V_BEP(I,K,J))*DZ8W(I,K,J)*VL_BEP(I,K,J)
  1158. vl_bep(i,k,j)=(1.-frc_urb2d(i,j))+vl_bep(i,k,j)*frc_urb2d(i,j)
  1159. sf_bep(i,k,j)=(1.-frc_urb2d(i,j))+sf_bep(i,k,j)*frc_urb2d(i,j)
  1160. end do
  1161. a_u_bep(i,1,j)=(1.-frc_urb2d(i,j))*(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/ &
  1162. ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+a_u_bep(i,1,j)
  1163. a_v_bep(i,1,j)=(1.-frc_urb2d(i,j))*(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/ &
  1164. ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+a_v_bep(i,1,j)
  1165. b_t_bep(i,1,j)=(1.-frc_urb2d(i,j))*hfx_rural(i,j)/dz8w(i,1,j)/rho(i,1,j)/CP+ &
  1166. b_t_bep(i,1,j)
  1167. b_q_bep(i,1,j)=(1.-frc_urb2d(i,j))*qfx_rural(i,j)/dz8w(i,1,j)/rho(i,1,j)+b_q_bep(i,1,j)
  1168. umom=(1.-frc_urb2d(i,j))*ust(i,j)*ust(i,j)*u_phy(i,1,j)/ &
  1169. ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+umom_urb(i,j)
  1170. vmom=(1.-frc_urb2d(i,j))*ust(i,j)*ust(i,j)*v_phy(i,1,j)/ &
  1171. ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+vmom_urb(i,j)
  1172. sf_bep(i,1,j)=1.
  1173. ! compute upward longwave radiation from the rural part and total
  1174. ! rl_up_rural=-emiss_rural(i,j)*sigma_sb*(tsk_rural(i,j)**4.)-(1.-emiss_rural(i,j))*glw(i,j)
  1175. ! rl_up_tot=(1.-frc_urb2d(i,j))*rl_up_rural+frc_urb2d(i,j)*rl_up_urb(i,j)
  1176. ! emiss(i,j)=(1.-frc_urb2d(i,j))*emiss_rural(i,j)+frc_urb2d(i,j)*emiss_urb(i,j)
  1177. ! using the emissivity and the total longwave upward radiation estimate the averaged skin temperature
  1178. IF (FRC_URB2D(I,J).GT.0.) THEN
  1179. rl_up_rural=-emiss_rural(i,j)*sigma_sb*(tsk_rural(i,j)**4.)-(1.-emiss_rural(i,j))*glw(i,j)
  1180. rl_up_tot=(1.-frc_urb2d(i,j))*rl_up_rural+frc_urb2d(i,j)*rl_up_urb(i,j)
  1181. emiss(i,j)=(1.-frc_urb2d(i,j))*emiss_rural(i,j)+frc_urb2d(i,j)*emiss_urb(i,j)
  1182. ts_urb2d(i,j)=(max(0.,(-rl_up_urb(i,j)-(1.-emiss_urb(i,j))*glw(i,j))/emiss_urb(i,j)/sigma_sb))**0.25
  1183. tsk(i,j)=(max(0., (-1.*rl_up_tot-(1.-emiss(i,j))*glw(i,j) )/emiss(i,j)/sigma_sb))**.25
  1184. rs_abs_tot=(1.-frc_urb2d(i,j))*swdown(i,j)*(1.-albedo(i,j))+frc_urb2d(i,j)*rs_abs_urb(i,j)
  1185. if(swdown(i,j).gt.0.)then
  1186. albedo(i,j)=1.-rs_abs_tot/swdown(i,j)
  1187. else
  1188. albedo(i,j)=alb_rural(i,j)
  1189. endif
  1190. ! rename *_urb to sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d
  1191. grdflx(i,j)= (1.-frc_urb2d(i,j))*grdflx_rural(i,j)+frc_urb2d(i,j)*grdflx_urb(i,j)
  1192. qfx(i,j)=(1.-frc_urb2d(i,j))*qfx_rural(i,j)+qfx_urb(i,j)
  1193. ! lh(i,j)=(1.-frc_urb2d(i,j))*qfx_rural(i,j)*xlv
  1194. lh(i,j)=qfx(i,j)*xlv
  1195. HFX(I,J) = HFX_URB(I,J)+(1-FRC_URB2D(I,J))*HFX_RURAL(I,J) ![W/m/m]
  1196. SH_URB2D(I,J) = HFX_URB(I,J)/FRC_URB2D(I,J)
  1197. LH_URB2D(I,J) = qfx_urb(i,j)*xlv
  1198. G_URB2D(I,J) = grdflx_urb(i,j)
  1199. RN_URB2D(I,J) = rs_abs_urb(i,j)+emiss_urb(i,j)*glw(i,j)-rl_up_urb(i,j)
  1200. ust(i,j)=(umom**2.+vmom**2.)**.25
  1201. ! if(tsk(i,j).gt.350)write(*,*)'tsk too big!',i,j,tsk(i,j)
  1202. ! if(tsk(i,j).lt.260)write(*,*)'tsk too small!',i,j,tsk(i,j),rl_up_tot,rl_up_urb(i,j),rl_up_rural
  1203. ! print*,'ivgtyp,i,j,sigma_sb',ivgtyp(i,j),i,j,sigma_sb
  1204. ! print*,'hfx,lh,qfx,grdflx,ts_urb2d',hfx(i,j),lh(i,j),qfx(i,j),grdflx(i,j),ts_urb2d(i,j)
  1205. ! print*,'tsk,albedo,emiss',tsk(i,j),albedo(i,j),emiss(i,j)
  1206. ! if(i.eq.56.and.j.eq.29)then
  1207. ! print*,'ivgtyp, qfx, hfx',ivgtyp(i,j),hfx_rural(i,j),qfx_rural(i,j)
  1208. ! print*,'emiss_rural,emiss_urb',emiss_rural(i,j),emiss_urb(i,j)
  1209. ! print*,'rl_up_rural,rl_up_urb(i,j)',rl_up_rural,rl_up_urb(i,j)
  1210. ! print*,'tsk_rural,ts_urb2d(i,j),tsk',tsk_rural(i,j),ts_urb2d(i,j),tsk(i,j)
  1211. ! print*,'reconstruction fei',((emiss(i,j)*tsk(i,j)**4.-frc_urb2d(i,j)*emiss_urb(i,j)*ts_urb2d(i,j)**4.)/(emiss_rural(i,j)*(1.-frc_urb2d(i,j))))**.25
  1212. ! print*,'ivgtyp,hfx,hfx_urb,hfx_rural',hfx(i,j),hfx_urb(i,j),hfx_rural(i,j)
  1213. ! print*,'lh,lh_rural',lh(i,j),lh_rural(i,j)
  1214. ! print*,'qfx',qfx(i,j)
  1215. ! print*,'ts_urb2d',ts_urb2d(i,j)
  1216. ! print*,'ust',ust(i,j)
  1217. ! print*,'swdown,glw',swdown(i,j),glw(i,j)
  1218. ! endif
  1219. else
  1220. SH_URB2D(I,J) = 0.
  1221. LH_URB2D(I,J) = 0.
  1222. G_URB2D(I,J) = 0.
  1223. RN_URB2D(I,J) = 0.
  1224. endif
  1225. ! IF( IVGTYP(I,J) == 1 .or. IVGTYP(I,J) == 31 .or. &
  1226. ! IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
  1227. ! print*,'ivgtyp, qfx, hfx',ivgtyp(i,j),hfx_rural(i,j),qfx_rural(i,j)
  1228. ! print*,'ivgtyp,hfx,hfx_urb,hfx_rural',hfx(i,j),hfx_urb(i,j),hfx_rural(i,j)
  1229. ! print*,'lh,lh_rural',lh(i,j),lh_rural(i,j)
  1230. ! print*,'qfx',qfx(i,j)
  1231. ! print*,'ts_urb2d',ts_urb2d(i,j)
  1232. ! print*,'ust',ust(i,j)
  1233. ! endif
  1234. enddo
  1235. enddo
  1236. endif !Bep end
  1237. !------------------------------------------------------
  1238. END SUBROUTINE lsm
  1239. !------------------------------------------------------
  1240. SUBROUTINE LSMINIT(VEGFRA,SNOW,SNOWC,SNOWH,CANWAT,SMSTAV, &
  1241. SMSTOT, SFCRUNOFF,UDRUNOFF,ACSNOW, &
  1242. ACSNOM,IVGTYP,ISLTYP,TSLB,SMOIS,SH2O,ZS,DZS, &
  1243. MMINLU, &
  1244. SNOALB, FNDSOILW, FNDSNOWH, RDMAXALB, &
  1245. num_soil_layers, restart, &
  1246. allowed_to_read , &
  1247. ids,ide, jds,jde, kds,kde, &
  1248. ims,ime, jms,jme, kms,kme, &
  1249. its,ite, jts,jte, kts,kte )
  1250. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  1251. ims,ime, jms,jme, kms,kme, &
  1252. its,ite, jts,jte, kts,kte
  1253. INTEGER, INTENT(IN) :: num_soil_layers
  1254. LOGICAL , INTENT(IN) :: restart , allowed_to_read
  1255. REAL, DIMENSION( num_soil_layers), INTENT(INOUT) :: ZS, DZS
  1256. REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , &
  1257. INTENT(INOUT) :: SMOIS, & !Total soil moisture
  1258. SH2O, & !liquid soil moisture
  1259. TSLB !STEMP
  1260. REAL, DIMENSION( ims:ime, jms:jme ) , &
  1261. INTENT(INOUT) :: SNOW, &
  1262. SNOWH, &
  1263. SNOWC, &
  1264. SNOALB, &
  1265. CANWAT, &
  1266. SMSTAV, &
  1267. SMSTOT, &
  1268. SFCRUNOFF, &
  1269. UDRUNOFF, &
  1270. ACSNOW, &
  1271. VEGFRA, &
  1272. ACSNOM
  1273. INTEGER, DIMENSION( ims:ime, jms:jme ) , &
  1274. INTENT(IN) :: IVGTYP, &
  1275. ISLTYP
  1276. CHARACTER(LEN=*), INTENT(IN) :: MMINLU
  1277. LOGICAL, INTENT(IN) :: FNDSOILW , &
  1278. FNDSNOWH
  1279. LOGICAL, INTENT(IN) :: RDMAXALB
  1280. INTEGER :: L
  1281. REAL :: BX, SMCMAX, PSISAT, FREE
  1282. REAL, PARAMETER :: BLIM = 5.5, HLICE = 3.335E5, &
  1283. GRAV = 9.81, T0 = 273.15
  1284. INTEGER :: errflag
  1285. character*256 :: MMINSL
  1286. MMINSL='STAS'
  1287. !
  1288. ! initialize three Noah LSM related tables
  1289. IF ( allowed_to_read ) THEN
  1290. CALL wrf_message( 'INITIALIZE THREE Noah LSM RELATED TABLES' )
  1291. CALL SOIL_VEG_GEN_PARM( MMINLU, MMINSL )
  1292. ENDIF
  1293. #ifdef WRF_CHEM
  1294. !
  1295. ! need this parameter for dust parameterization in wrf/chem
  1296. !
  1297. do I=1,NSLTYPE
  1298. porosity(i)=maxsmc(i)
  1299. drypoint(i)=drysmc(i)
  1300. enddo
  1301. #endif
  1302. IF(.not.restart)THEN
  1303. itf=min0(ite,ide-1)
  1304. jtf=min0(jte,jde-1)
  1305. errflag = 0
  1306. DO j = jts,jtf
  1307. DO i = its,itf
  1308. IF ( ISLTYP( i,j ) .LT. 1 ) THEN
  1309. errflag = 1
  1310. WRITE(err_message,*)"module_sf_noahlsm.F: lsminit: out of range ISLTYP ",i,j,ISLTYP( i,j )
  1311. CALL wrf_message(err_message)
  1312. ENDIF
  1313. IF(.not.RDMAXALB) THEN
  1314. SNOALB(i,j)=MAXALB(IVGTYP(i,j))*0.01
  1315. ENDIF
  1316. ENDDO
  1317. ENDDO
  1318. IF ( errflag .EQ. 1 ) THEN
  1319. CALL wrf_error_fatal( "module_sf_noahlsm.F: lsminit: out of range value "// &
  1320. "of ISLTYP. Is this field in the input?" )
  1321. ENDIF
  1322. ! initialize soil liquid water content SH2O
  1323. ! IF(.NOT.FNDSOILW) THEN
  1324. ! If no SWC, do the following
  1325. ! PRINT *,'SOIL WATER NOT FOUND - VALUE SET IN LSMINIT'
  1326. DO J = jts,jtf
  1327. DO I = its,itf
  1328. BX = BB(ISLTYP(I,J))
  1329. SMCMAX = MAXSMC(ISLTYP(I,J))
  1330. PSISAT = SATPSI(ISLTYP(I,J))
  1331. if ((bx > 0.0).and.(smcmax > 0.0).and.(psisat > 0.0)) then
  1332. DO NS=1, num_soil_layers
  1333. ! ----------------------------------------------------------------------
  1334. !SH2O <= SMOIS for T < 273.149K (-0.001C)
  1335. IF (TSLB(I,NS,J) < 273.149) THEN
  1336. ! ----------------------------------------------------------------------
  1337. ! first guess following explicit solution for Flerchinger Eqn from Koren
  1338. ! et al, JGR, 1999, Eqn 17 (KCOUNT=0 in FUNCTION FRH2O).
  1339. ! ISLTPK is soil type
  1340. BX = BB(ISLTYP(I,J))
  1341. SMCMAX = MAXSMC(ISLTYP(I,J))
  1342. PSISAT = SATPSI(ISLTYP(I,J))
  1343. IF ( BX > BLIM ) BX = BLIM
  1344. FK=(( (HLICE/(GRAV*(-PSISAT))) * &
  1345. ((TSLB(I,NS,J)-T0)/TSLB(I,NS,J)) )**(-1/BX) )*SMCMAX
  1346. IF (FK < 0.02) FK = 0.02
  1347. SH2O(I,NS,J) = MIN( FK, SMOIS(I,NS,J) )
  1348. ! ----------------------------------------------------------------------
  1349. ! now use iterative solution for liquid soil water content using
  1350. ! FUNCTION FRH2O with the initial guess for SH2O from above explicit
  1351. ! first guess.
  1352. CALL FRH2O (FREE,TSLB(I,NS,J),SMOIS(I,NS,J),SH2O(I,NS,J), &
  1353. SMCMAX,BX,PSISAT)
  1354. SH2O(I,NS,J) = FREE
  1355. ELSE ! of IF (TSLB(I,NS,J)
  1356. ! ----------------------------------------------------------------------
  1357. ! SH2O = SMOIS ( for T => 273.149K (-0.001C)
  1358. SH2O(I,NS,J)=SMOIS(I,NS,J)
  1359. ! ----------------------------------------------------------------------
  1360. ENDIF ! of IF (TSLB(I,NS,J)
  1361. END DO ! of DO NS=1, num_soil_layers
  1362. else ! of if ((bx > 0.0)
  1363. DO NS=1, num_soil_layers
  1364. SH2O(I,NS,J)=SMOIS(I,NS,J)
  1365. END DO
  1366. endif ! of if ((bx > 0.0)
  1367. ENDDO ! DO I = its,itf
  1368. ENDDO ! DO J = jts,jtf
  1369. ! ENDIF ! of IF(.NOT.FNDSOILW)THEN
  1370. ! initialize physical snow height SNOWH
  1371. IF(.NOT.FNDSNOWH)THEN
  1372. ! If no SNOWH do the following
  1373. CALL wrf_message( 'SNOW HEIGHT NOT FOUND - VALUE DEFINED IN LSMINIT' )
  1374. DO J = jts,jtf
  1375. DO I = its,itf
  1376. SNOWH(I,J)=SNOW(I,J)*0.005 ! SNOW in mm and SNOWH in m
  1377. ENDDO
  1378. ENDDO
  1379. ENDIF
  1380. ! initialize canopy water to ZERO
  1381. ! GO TO 110
  1382. ! print*,'Note that canopy water content (CANWAT) is set to ZERO in LSMINIT'
  1383. DO J = jts,jtf
  1384. DO I = its,itf
  1385. CANWAT(I,J)=0.0
  1386. ENDDO
  1387. ENDDO
  1388. 110 CONTINUE
  1389. ENDIF
  1390. !------------------------------------------------------------------------------
  1391. END SUBROUTINE lsminit
  1392. !------------------------------------------------------------------------------
  1393. !-----------------------------------------------------------------
  1394. SUBROUTINE SOIL_VEG_GEN_PARM( MMINLU, MMINSL)
  1395. !-----------------------------------------------------------------
  1396. USE module_wrf_error
  1397. IMPLICIT NONE
  1398. CHARACTER(LEN=*), INTENT(IN) :: MMINLU, MMINSL
  1399. integer :: LUMATCH, IINDEX, LC, NUM_SLOPE
  1400. integer :: ierr
  1401. INTEGER , PARAMETER :: OPEN_OK = 0
  1402. character*128 :: mess , message
  1403. logical, external :: wrf_dm_on_monitor
  1404. !-----SPECIFY VEGETATION RELATED CHARACTERISTICS :
  1405. ! ALBBCK: SFC albedo (in percentage)
  1406. ! Z0: Roughness length (m)
  1407. ! SHDFAC: Green vegetation fraction (in percentage)
  1408. ! Note: The ALBEDO, Z0, and SHDFAC values read from the following table
  1409. ! ALBEDO, amd Z0 are specified in LAND-USE TABLE; and SHDFAC is
  1410. ! the monthly green vegetation data
  1411. ! CMXTBL: MAX CNPY Capacity (m)
  1412. ! NROTBL: Rooting depth (layer)
  1413. ! RSMIN: Mimimum stomatal resistance (s m-1)
  1414. ! RSMAX: Max. stomatal resistance (s m-1)
  1415. ! RGL: Parameters used in radiation stress function
  1416. ! HS: Parameter used in vapor pressure deficit functio
  1417. ! TOPT: Optimum transpiration air temperature. (K)
  1418. ! CMCMAX: Maximum canopy water capacity
  1419. ! CFACTR: Parameter used in the canopy inteception calculati
  1420. ! SNUP: Threshold snow depth (in water equivalent m) that
  1421. ! implies 100% snow cover
  1422. ! LAI: Leaf area index (dimensionless)
  1423. ! MAXALB: Upper bound on maximum albedo over deep snow
  1424. !
  1425. !-----READ IN VEGETAION PROPERTIES FROM VEGPARM.TBL
  1426. !
  1427. IF ( wrf_dm_on_monitor() ) THEN
  1428. OPEN(19, FILE='VEGPARM.TBL',FORM='FORMATTED',STATUS='OLD',IOSTAT=ierr)
  1429. IF(ierr .NE. OPEN_OK ) THEN
  1430. WRITE(message,FMT='(A)') &
  1431. 'module_sf_noahlsm.F: soil_veg_gen_parm: failure opening VEGPARM.TBL'
  1432. CALL wrf_error_fatal ( message )
  1433. END IF
  1434. LUMATCH=0
  1435. FIND_LUTYPE : DO WHILE (LUMATCH == 0)
  1436. READ (19,*,END=2002)
  1437. READ (19,*,END=2002)LUTYPE
  1438. READ (19,*)LUCATS,IINDEX
  1439. IF(LUTYPE.EQ.MMINLU)THEN
  1440. WRITE( mess , * ) 'LANDUSE TYPE = ' // TRIM ( LUTYPE ) // ' FOUND', LUCATS,' CATEGORIES'
  1441. CALL wrf_message( mess )
  1442. LUMATCH=1
  1443. ELSE
  1444. call wrf_message ( "Skipping over LUTYPE = " // TRIM ( LUTYPE ) )
  1445. DO LC = 1, LUCATS+12
  1446. read(19,*)
  1447. ENDDO
  1448. ENDIF
  1449. ENDDO FIND_LUTYPE
  1450. ! prevent possible array overwrite, Bill Bovermann, IBM, May 6, 2008
  1451. IF ( SIZE(SHDTBL) < LUCATS .OR. &
  1452. SIZE(NROTBL) < LUCATS .OR. &
  1453. SIZE(RSTBL) < LUCATS .OR. &
  1454. SIZE(RGLTBL) < LUCATS .OR. &
  1455. SIZE(HSTBL) < LUCATS .OR. &
  1456. SIZE(SNUPTBL) < LUCATS .OR. &
  1457. SIZE(MAXALB) < LUCATS .OR. &
  1458. SIZE(LAIMINTBL) < LUCATS .OR. &
  1459. SIZE(LAIMAXTBL) < LUCATS .OR. &
  1460. SIZE(Z0MINTBL) < LUCATS .OR. &
  1461. SIZE(Z0MAXTBL) < LUCATS .OR. &
  1462. SIZE(ALBEDOMINTBL) < LUCATS .OR. &
  1463. SIZE(ALBEDOMAXTBL) < LUCATS .OR. &
  1464. SIZE(EMISSMINTBL ) < LUCATS .OR. &
  1465. SIZE(EMISSMAXTBL ) < LUCATS ) THEN
  1466. CALL wrf_error_fatal('Table sizes too small for value of LUCATS in module_sf_noahdrv.F')
  1467. ENDIF
  1468. IF(LUTYPE.EQ.MMINLU)THEN
  1469. DO LC=1,LUCATS
  1470. READ (19,*)IINDEX,SHDTBL(LC), &
  1471. NROTBL(LC),RSTBL(LC),RGLTBL(LC),HSTBL(LC), &
  1472. SNUPTBL(LC),MAXALB(LC), LAIMINTBL(LC), &
  1473. LAIMAXTBL(LC),EMISSMINTBL(LC), &
  1474. EMISSMAXTBL(LC), ALBEDOMINTBL(LC), &
  1475. ALBEDOMAXTBL(LC), Z0MINTBL(LC), Z0MAXTBL(LC)
  1476. ENDDO
  1477. !
  1478. READ (19,*)
  1479. READ (19,*)TOPT_DATA
  1480. READ (19,*)
  1481. READ (19,*)CMCMAX_DATA
  1482. READ (19,*)
  1483. READ (19,*)CFACTR_DATA
  1484. READ (19,*)
  1485. READ (19,*)RSMAX_DATA
  1486. READ (19,*)
  1487. READ (19,*)BARE
  1488. READ (19,*)
  1489. READ (19,*)NATURAL
  1490. ENDIF
  1491. !
  1492. 2002 CONTINUE
  1493. CLOSE (19)
  1494. IF (LUMATCH == 0) then
  1495. CALL wrf_error_fatal ("Land Use Dataset '"//MMINLU//"' not found in VEGPARM.TBL.")
  1496. ENDIF
  1497. ENDIF
  1498. CALL wrf_dm_bcast_string ( LUTYPE , 4 )
  1499. CALL wrf_dm_bcast_integer ( LUCATS , 1 )
  1500. CALL wrf_dm_bcast_integer ( IINDEX , 1 )
  1501. CALL wrf_dm_bcast_integer ( LUMATCH , 1 )
  1502. CALL wrf_dm_bcast_real ( SHDTBL , NLUS )
  1503. CALL wrf_dm_bcast_real ( NROTBL , NLUS )
  1504. CALL wrf_dm_bcast_real ( RSTBL , NLUS )
  1505. CALL wrf_dm_bcast_real ( RGLTBL , NLUS )
  1506. CALL wrf_dm_bcast_real ( HSTBL , NLUS )
  1507. CALL wrf_dm_bcast_real ( SNUPTBL , NLUS )
  1508. CALL wrf_dm_bcast_real ( LAIMINTBL , NLUS )
  1509. CALL wrf_dm_bcast_real ( LAIMAXTBL , NLUS )
  1510. CALL wrf_dm_bcast_real ( Z0MINTBL , NLUS )
  1511. CALL wrf_dm_bcast_real ( Z0MAXTBL , NLUS )
  1512. CALL wrf_dm_bcast_real ( EMISSMINTBL , NLUS )
  1513. CALL wrf_dm_bcast_real ( EMISSMAXTBL , NLUS )
  1514. CALL wrf_dm_bcast_real ( ALBEDOMINTBL , NLUS )
  1515. CALL wrf_dm_bcast_real ( ALBEDOMAXTBL , NLUS )
  1516. CALL wrf_dm_bcast_real ( MAXALB , NLUS )
  1517. CALL wrf_dm_bcast_real ( TOPT_DATA , 1 )
  1518. CALL wrf_dm_bcast_real ( CMCMAX_DATA , 1 )
  1519. CALL wrf_dm_bcast_real ( CFACTR_DATA , 1 )
  1520. CALL wrf_dm_bcast_real ( RSMAX_DATA , 1 )
  1521. CALL wrf_dm_bcast_integer ( BARE , 1 )
  1522. CALL wrf_dm_bcast_integer ( NATURAL , 1 )
  1523. !
  1524. !-----READ IN SOIL PROPERTIES FROM SOILPARM.TBL
  1525. !
  1526. IF ( wrf_dm_on_monitor() ) THEN
  1527. OPEN(19, FILE='SOILPARM.TBL',FORM='FORMATTED',STATUS='OLD',IOSTAT=ierr)
  1528. IF(ierr .NE. OPEN_OK ) THEN
  1529. WRITE(message,FMT='(A)') &
  1530. 'module_sf_noahlsm.F: soil_veg_gen_parm: failure opening SOILPARM.TBL'
  1531. CALL wrf_error_fatal ( message )
  1532. END IF
  1533. WRITE(mess,*) 'INPUT SOIL TEXTURE CLASSIFICATION = ', TRIM ( MMINSL )
  1534. CALL wrf_message( mess )
  1535. LUMATCH=0
  1536. READ (19,*)
  1537. READ (19,2000,END=2003)SLTYPE
  1538. 2000 FORMAT (A4)
  1539. READ (19,*)SLCATS,IINDEX
  1540. IF(SLTYPE.EQ.MMINSL)THEN
  1541. WRITE( mess , * ) 'SOIL TEXTURE CLASSIFICATION = ', TRIM ( SLTYPE ) , ' FOUND', &
  1542. SLCATS,' CATEGORIES'
  1543. CALL wrf_message ( mess )
  1544. LUMATCH=1
  1545. ENDIF
  1546. ! prevent possible array overwrite, Bill Bovermann, IBM, May 6, 2008
  1547. IF ( SIZE(BB ) < SLCATS .OR. &
  1548. SIZE(DRYSMC) < SLCATS .OR. &
  1549. SIZE(F11 ) < SLCATS .OR. &
  1550. SIZE(MAXSMC) < SLCATS .OR. &
  1551. SIZE(REFSMC) < SLCATS .OR. &
  1552. SIZE(SATPSI) < SLCATS .OR. &
  1553. SIZE(SATDK ) < SLCATS .OR. &
  1554. SIZE(SATDW ) < SLCATS .OR. &
  1555. SIZE(WLTSMC) < SLCATS .OR. &
  1556. SIZE(QTZ ) < SLCATS ) THEN
  1557. CALL wrf_error_fatal('Table sizes too small for value of SLCATS in module_sf_noahdrv.F')
  1558. ENDIF
  1559. IF(SLTYPE.EQ.MMINSL)THEN
  1560. DO LC=1,SLCATS
  1561. READ (19,*) IINDEX,BB(LC),DRYSMC(LC),F11(LC),MAXSMC(LC),&
  1562. REFSMC(LC),SATPSI(LC),SATDK(LC), SATDW(LC), &
  1563. WLTSMC(LC), QTZ(LC)
  1564. ENDDO
  1565. ENDIF
  1566. 2003 CONTINUE
  1567. CLOSE (19)
  1568. ENDIF
  1569. CALL wrf_dm_bcast_integer ( LUMATCH , 1 )
  1570. CALL wrf_dm_bcast_string ( SLTYPE , 4 )
  1571. CALL wrf_dm_bcast_string ( MMINSL , 4 ) ! since this is reset above, see oct2 ^
  1572. CALL wrf_dm_bcast_integer ( SLCATS , 1 )
  1573. CALL wrf_dm_bcast_integer ( IINDEX , 1 )
  1574. CALL wrf_dm_bcast_real ( BB , NSLTYPE )
  1575. CALL wrf_dm_bcast_real ( DRYSMC , NSLTYPE )
  1576. CALL wrf_dm_bcast_real ( F11 , NSLTYPE )
  1577. CALL wrf_dm_bcast_real ( MAXSMC , NSLTYPE )
  1578. CALL wrf_dm_bcast_real ( REFSMC , NSLTYPE )
  1579. CALL wrf_dm_bcast_real ( SATPSI , NSLTYPE )
  1580. CALL wrf_dm_bcast_real ( SATDK , NSLTYPE )
  1581. CALL wrf_dm_bcast_real ( SATDW , NSLTYPE )
  1582. CALL wrf_dm_bcast_real ( WLTSMC , NSLTYPE )
  1583. CALL wrf_dm_bcast_real ( QTZ , NSLTYPE )
  1584. IF(LUMATCH.EQ.0)THEN
  1585. CALL wrf_message( 'SOIl TEXTURE IN INPUT FILE DOES NOT ' )
  1586. CALL wrf_message( 'MATCH SOILPARM TABLE' )
  1587. CALL wrf_error_fatal ( 'INCONSISTENT OR MISSING SOILPARM FILE' )
  1588. ENDIF
  1589. !
  1590. !-----READ IN GENERAL PARAMETERS FROM GENPARM.TBL
  1591. !
  1592. IF ( wrf_dm_on_monitor() ) THEN
  1593. OPEN(19, FILE='GENPARM.TBL',FORM='FORMATTED',STATUS='OLD',IOSTAT=ierr)
  1594. IF(ierr .NE. OPEN_OK ) THEN
  1595. WRITE(message,FMT='(A)') &
  1596. 'module_sf_noahlsm.F: soil_veg_gen_parm: failure opening GENPARM.TBL'
  1597. CALL wrf_error_fatal ( message )
  1598. END IF
  1599. READ (19,*)
  1600. READ (19,*)
  1601. READ (19,*) NUM_SLOPE
  1602. SLPCATS=NUM_SLOPE
  1603. ! prevent possible array overwrite, Bill Bovermann, IBM, May 6, 2008
  1604. IF ( SIZE(slope_data) < NUM_SLOPE ) THEN
  1605. CALL wrf_error_fatal('NUM_SLOPE too large for slope_data array in module_sf_noahdrv')
  1606. ENDIF
  1607. DO LC=1,SLPCATS
  1608. READ (19,*)SLOPE_DATA(LC)
  1609. ENDDO
  1610. READ (19,*)
  1611. READ (19,*)SBETA_DATA
  1612. READ (19,*)
  1613. READ (19,*)FXEXP_DATA
  1614. READ (19,*)
  1615. READ (19,*)CSOIL_DATA
  1616. READ (19,*)
  1617. READ (19,*)SALP_DATA
  1618. READ (19,*)
  1619. READ (19,*)REFDK_DATA
  1620. READ (19,*)
  1621. READ (19,*)REFKDT_DATA
  1622. READ (19,*)
  1623. READ (19,*)FRZK_DATA
  1624. READ (19,*)
  1625. READ (19,*)ZBOT_DATA
  1626. READ (19,*)
  1627. READ (19,*)CZIL_DATA
  1628. READ (19,*)
  1629. READ (19,*)SMLOW_DATA
  1630. READ (19,*)
  1631. READ (19,*)SMHIGH_DATA
  1632. READ (19,*)
  1633. READ (19,*)LVCOEF_DATA
  1634. CLOSE (19)
  1635. ENDIF
  1636. CALL wrf_dm_bcast_integer ( NUM_SLOPE , 1 )
  1637. CALL wrf_dm_bcast_integer ( SLPCATS , 1 )
  1638. CALL wrf_dm_bcast_real ( SLOPE_DATA , NSLOPE )
  1639. CALL wrf_dm_bcast_real ( SBETA_DATA , 1 )
  1640. CALL wrf_dm_bcast_real ( FXEXP_DATA , 1 )
  1641. CALL wrf_dm_bcast_real ( CSOIL_DATA , 1 )
  1642. CALL wrf_dm_bcast_real ( SALP_DATA , 1 )
  1643. CALL wrf_dm_bcast_real ( REFDK_DATA , 1 )
  1644. CALL wrf_dm_bcast_real ( REFKDT_DATA , 1 )
  1645. CALL wrf_dm_bcast_real ( FRZK_DATA , 1 )
  1646. CALL wrf_dm_bcast_real ( ZBOT_DATA , 1 )
  1647. CALL wrf_dm_bcast_real ( CZIL_DATA , 1 )
  1648. CALL wrf_dm_bcast_real ( SMLOW_DATA , 1 )
  1649. CALL wrf_dm_bcast_real ( SMHIGH_DATA , 1 )
  1650. CALL wrf_dm_bcast_real ( LVCOEF_DATA , 1 )
  1651. !-----------------------------------------------------------------
  1652. END SUBROUTINE SOIL_VEG_GEN_PARM
  1653. !-----------------------------------------------------------------
  1654. END MODULE module_sf_noahdrv