PageRenderTime 71ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_sf_urban.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2421 lines | 1481 code | 375 blank | 565 comment | 237 complexity | da74e6c6f59556f308ac988182e383d8 MD5 | raw file
Possible License(s): AGPL-1.0
  1. MODULE module_sf_urban
  2. !===============================================================================
  3. ! Single-Layer Urban Canopy Model for WRF Noah-LSM
  4. ! Original Version: 2002/11/06 by Hiroyuki Kusaka
  5. ! Last Update: 2006/08/24 by Fei Chen and Mukul Tewari (NCAR/RAL)
  6. !===============================================================================
  7. CHARACTER(LEN=4) :: LU_DATA_TYPE
  8. INTEGER :: ICATE
  9. REAL, ALLOCATABLE, DIMENSION(:) :: ZR_TBL
  10. REAL, ALLOCATABLE, DIMENSION(:) :: Z0C_TBL
  11. REAL, ALLOCATABLE, DIMENSION(:) :: Z0HC_TBL
  12. REAL, ALLOCATABLE, DIMENSION(:) :: ZDC_TBL
  13. REAL, ALLOCATABLE, DIMENSION(:) :: SVF_TBL
  14. REAL, ALLOCATABLE, DIMENSION(:) :: R_TBL
  15. REAL, ALLOCATABLE, DIMENSION(:) :: RW_TBL
  16. REAL, ALLOCATABLE, DIMENSION(:) :: HGT_TBL
  17. REAL, ALLOCATABLE, DIMENSION(:) :: AH_TBL
  18. REAL, ALLOCATABLE, DIMENSION(:) :: BETR_TBL
  19. REAL, ALLOCATABLE, DIMENSION(:) :: BETB_TBL
  20. REAL, ALLOCATABLE, DIMENSION(:) :: BETG_TBL
  21. REAL, ALLOCATABLE, DIMENSION(:) :: FRC_URB_TBL
  22. REAL, ALLOCATABLE, DIMENSION(:) :: COP_TBL
  23. REAL, ALLOCATABLE, DIMENSION(:) :: PWIN_TBL
  24. REAL, ALLOCATABLE, DIMENSION(:) :: BETA_TBL
  25. INTEGER, ALLOCATABLE, DIMENSION(:) :: SW_COND_TBL
  26. REAL, ALLOCATABLE, DIMENSION(:) :: TIME_ON_TBL
  27. REAL, ALLOCATABLE, DIMENSION(:) :: TIME_OFF_TBL
  28. REAL, ALLOCATABLE, DIMENSION(:) :: TARGTEMP_TBL
  29. REAL, ALLOCATABLE, DIMENSION(:) :: GAPTEMP_TBL
  30. REAL, ALLOCATABLE, DIMENSION(:) :: TARGHUM_TBL
  31. REAL, ALLOCATABLE, DIMENSION(:) :: GAPHUM_TBL
  32. REAL, ALLOCATABLE, DIMENSION(:) :: PERFLO_TBL
  33. REAL, ALLOCATABLE, DIMENSION(:) :: HSESF_TBL
  34. REAL, ALLOCATABLE, DIMENSION(:) :: CAPR_TBL, CAPB_TBL, CAPG_TBL
  35. REAL, ALLOCATABLE, DIMENSION(:) :: AKSR_TBL, AKSB_TBL, AKSG_TBL
  36. REAL, ALLOCATABLE, DIMENSION(:) :: ALBR_TBL, ALBB_TBL, ALBG_TBL
  37. REAL, ALLOCATABLE, DIMENSION(:) :: EPSR_TBL, EPSB_TBL, EPSG_TBL
  38. REAL, ALLOCATABLE, DIMENSION(:) :: Z0R_TBL, Z0B_TBL, Z0G_TBL
  39. REAL, ALLOCATABLE, DIMENSION(:) :: SIGMA_ZED_TBL
  40. REAL, ALLOCATABLE, DIMENSION(:) :: Z0HB_TBL, Z0HG_TBL
  41. REAL, ALLOCATABLE, DIMENSION(:) :: TRLEND_TBL, TBLEND_TBL, TGLEND_TBL
  42. REAL, ALLOCATABLE, DIMENSION(:) :: AKANDA_URBAN_TBL
  43. !for BEP
  44. ! MAXDIRS :: The maximum number of street directions we're allowed to define
  45. INTEGER, PARAMETER :: MAXDIRS = 3
  46. ! MAXHGTS :: The maximum number of building height bins we're allowed to define
  47. INTEGER, PARAMETER :: MAXHGTS = 50
  48. INTEGER, ALLOCATABLE, DIMENSION(:) :: NUMDIR_TBL
  49. REAL, ALLOCATABLE, DIMENSION(:,:) :: STREET_DIRECTION_TBL
  50. REAL, ALLOCATABLE, DIMENSION(:,:) :: STREET_WIDTH_TBL
  51. REAL, ALLOCATABLE, DIMENSION(:,:) :: BUILDING_WIDTH_TBL
  52. INTEGER, ALLOCATABLE, DIMENSION(:) :: NUMHGT_TBL
  53. REAL, ALLOCATABLE, DIMENSION(:,:) :: HEIGHT_BIN_TBL
  54. REAL, ALLOCATABLE, DIMENSION(:,:) :: HPERCENT_BIN_TBL
  55. !end BEP
  56. INTEGER :: BOUNDR_DATA,BOUNDB_DATA,BOUNDG_DATA
  57. INTEGER :: CH_SCHEME_DATA, TS_SCHEME_DATA
  58. INTEGER :: ahoption ! Miao, 2007/01/17, cal. ah
  59. REAL, DIMENSION(1:24) :: ahdiuprf ! ah diurnal profile, tloc: 1-24
  60. REAL, DIMENSION(1:24) :: hsequip_tbl
  61. INTEGER :: allocate_status
  62. ! INTEGER :: num_roof_layers
  63. ! INTEGER :: num_wall_layers
  64. ! INTEGER :: num_road_layers
  65. CONTAINS
  66. !===============================================================================
  67. !
  68. ! Author:
  69. ! Hiroyuki KUSAKA, PhD
  70. ! University of Tsukuba, JAPAN
  71. ! (CRIEPI, NCAR/MMM visiting scientist, 2002-2004)
  72. ! kusaka@ccs.tsukuba.ac.jp
  73. !
  74. ! Co-Researchers:
  75. ! Fei CHEN, PhD
  76. ! NCAR/RAP feichen@ucar.edu
  77. ! Mukul TEWARI, PhD
  78. ! NCAR/RAP mukul@ucar.edu
  79. !
  80. ! Purpose:
  81. ! Calculate surface temeprature, fluxes, canopy air temperature, and canopy wind
  82. !
  83. ! Subroutines:
  84. ! module_sf_urban
  85. ! |- urban
  86. ! |- read_param
  87. ! |- mos or jurges
  88. ! |- multi_layer or force_restore
  89. ! |- urban_param_init <-- URBPARM.TBL
  90. ! |- urban_var_init
  91. !
  92. ! Input Data from WRF [MKS unit]:
  93. !
  94. ! UTYPE [-] : Urban type. 1=Commercial/Industrial; 2=High-intensity residential;
  95. ! : 3=low-intensity residential
  96. ! TA [K] : Potential temperature at 1st wrf level (absolute temp)
  97. ! QA [kg/kg] : Mixing ratio at 1st atmospheric level
  98. ! UA [m/s] : Wind speed at 1st atmospheric level
  99. ! SSG [W/m/m] : Short wave downward radiation at a flat surface
  100. ! Note this is the total of direct and diffusive solar
  101. ! downward radiation. If without two components, the
  102. ! single solar downward can be used instead.
  103. ! SSG = SSGD + SSGQ
  104. ! LSOLAR [-] : Indicating the input type of solar downward radiation
  105. ! True: both direct and diffusive solar radiation
  106. ! are available
  107. ! False: only total downward ridiation is available.
  108. ! SSGD [W/m/m] : Direct solar radiation at a flat surface
  109. ! if SSGD is not available, one can assume a ratio SRATIO
  110. ! (e.g., 0.7), so that SSGD = SRATIO*SSG
  111. ! SSGQ [W/m/m] : Diffuse solar radiation at a flat surface
  112. ! If SSGQ is not available, SSGQ = SSG - SSGD
  113. ! LLG [W/m/m] : Long wave downward radiation at a flat surface
  114. ! RAIN [mm/h] : Precipitation
  115. ! RHOO [kg/m/m/m] : Air density
  116. ! ZA [m] : First atmospheric level
  117. ! as a lowest boundary condition
  118. ! DECLIN [rad] : solar declination
  119. ! COSZ : = sin(fai)*sin(del)+cos(fai)*cos(del)*cos(omg)
  120. ! OMG [rad] : solar hour angle
  121. ! XLAT [deg] : latitude
  122. ! DELT [sec] : Time step
  123. ! ZNT [m] : Roughnes length
  124. !
  125. ! Output Data to WRF [MKS unit]:
  126. !
  127. ! TS [K] : Surface potential temperature (absolute temp)
  128. ! QS [-] : Surface humidity
  129. !
  130. ! SH [W/m/m/] : Sensible heat flux, = FLXTH*RHOO*CPP
  131. ! LH [W/m/m] : Latent heat flux, = FLXHUM*RHOO*ELL
  132. ! LH_INEMATIC [kg/m/m/sec]: Moisture Kinematic flux, = FLXHUM*RHOO
  133. ! SW [W/m/m] : Upward shortwave radiation flux,
  134. ! = SSG-SNET*697.7*60. (697.7*60.=100.*100.*4.186)
  135. ! ALB [-] : Time-varying albedo
  136. ! LW [W/m/m] : Upward longwave radiation flux,
  137. ! = LNET*697.7*60.-LLG
  138. ! G [W/m/m] : Heat Flux into the Ground
  139. ! RN [W/m/m] : Net radiation
  140. !
  141. ! PSIM [-] : Diagnostic similarity stability function for momentum
  142. ! PSIH [-] : Diagnostic similarity stability function for heat
  143. !
  144. ! TC [K] : Diagnostic canopy air temperature
  145. ! QC [-] : Diagnostic canopy humidity
  146. !
  147. ! TH2 [K] : Diagnostic potential temperature at 2 m
  148. ! Q2 [-] : Diagnostic humidity at 2 m
  149. ! U10 [m/s] : Diagnostic u wind component at 10 m
  150. ! V10 [m/s] : Diagnostic v wind component at 10 m
  151. !
  152. ! CHS, CHS2 [m/s] : CH*U at ZA, CH*U at 2 m (not used)
  153. !
  154. ! Important parameters:
  155. !
  156. ! Morphology of the urban canyon:
  157. ! These parameters assigned in the URBPARM.TBL
  158. !
  159. ! ZR [m] : roof level (building height)
  160. ! SIGMA_ZED [m] : Standard Deviation of roof height
  161. ! ROOF_WIDTH [m] : roof (i.e., building) width
  162. ! ROAD_WIDTH [m] : road width
  163. !
  164. ! Parameters derived from the morphological terms above.
  165. ! These parameters are computed in the code.
  166. !
  167. ! HGT [-] : normalized building height
  168. ! SVF [-] : sky view factor
  169. ! R [-] : Normalized roof width (a.k.a. "building coverage ratio")
  170. ! RW [-] : = 1 - R
  171. ! Z0C [m] : Roughness length above canyon for momentum (1/10 of ZR)
  172. ! Z0HC [m] : Roughness length above canyon for heat (1/10 of Z0C)
  173. ! ZDC [m] : Zero plane displacement height (1/5 of ZR)
  174. !
  175. ! Following parameter are assigned in run/URBPARM.TBL
  176. !
  177. ! AH [ W m{-2} ] : anthropogenic heat ( W m{-2} in the table, converted internally to cal cm{-2} )
  178. ! CAPR[ J m{-3} K{-1} ] : heat capacity of roof ( units converted in code to [ cal cm{-3} deg{-1} ] )
  179. ! CAPB[ J m{-3} K{-1} ] : heat capacity of building wall ( units converted in code to [ cal cm{-3} deg{-1} ] )
  180. ! CAPG[ J m{-3} K{-1} ] : heat capacity of road ( units converted in code to [ cal cm{-3} deg{-1} ] )
  181. ! AKSR [ J m{-1} s{-1} K{-1} ] : thermal conductivity of roof ( units converted in code to [ cal cm{-1} s{-1} deg{-1} ] )
  182. ! AKSB [ J m{-1} s{-1} K{-1} ] : thermal conductivity of building wall ( units converted in code to [ cal cm{-1} s{-1} deg{-1} ] )
  183. ! AKSG [ J m{-1} s{-1} K{-1} ] : thermal conductivity of road ( units converted in code to [ cal cm{-1} s{-1} deg{-1} ] )
  184. ! ALBR [-] : surface albedo of roof
  185. ! ALBB [-] : surface albedo of building wall
  186. ! ALBG [-] : surface albedo of road
  187. ! EPSR [-] : surface emissivity of roof
  188. ! EPSB [-] : surface emissivity of building wall
  189. ! EPSG [-] : surface emissivity of road
  190. ! Z0B [m] : roughness length for momentum of building wall (only for CH_SCHEME = 1)
  191. ! Z0G [m] : roughness length for momentum of road (only for CH_SCHEME = 1)
  192. ! Z0HB [m] : roughness length for heat of building wall (only for CH_SCHEME = 1)
  193. ! Z0HG [m] : roughness length for heat of road
  194. ! num_roof_layers : number of layers within roof
  195. ! num_wall_layers : number of layers within building walls
  196. ! num_road_layers : number of layers within below road surface
  197. ! NOTE: for now, these layers are defined as same as the number of soil layers in namelist.input
  198. ! DZR [cm] : thickness of each roof layer
  199. ! DZB [cm] : thickness of each building wall layer
  200. ! DZG [cm] : thickness of each ground layer
  201. ! BOUNDR [integer 1 or 2] : Boundary Condition for Roof Layer Temp [1: Zero-Flux, 2: T = Constant]
  202. ! BOUNDB [integer 1 or 2] : Boundary Condition for Building Wall Layer Temp [1: Zero-Flux, 2: T = Constant]
  203. ! BOUNDG [integer 1 or 2] : Boundary Condition for Road Layer Temp [1: Zero-Flux, 2: T = Constant]
  204. ! TRLEND [K] : lower boundary condition of roof temperature
  205. ! TBLEND [K] : lower boundary condition of building temperature
  206. ! TGLEND [K] : lower boundary condition of ground temperature
  207. ! CH_SCHEME [integer 1 or 2] : Sfc exchange scheme used for building wall and road
  208. ! [1: M-O Similarity Theory, 2: Empirical Form (recommend)]
  209. ! TS_SCHEME [integer 1 or 2] : Scheme for computing surface temperature (for roof, wall, and road)
  210. ! [1: 4-layer model, 2: Force-Restore method]
  211. !
  212. !for BEP
  213. ! numdir [ - ] : Number of street directions defined for a particular urban category
  214. ! street_direction [ deg ] : Direction of streets for a particular urban category and a particular street direction
  215. ! street_width [ m ] : Width of street for a particular urban category and a particular street direction
  216. ! building_width [ m ] : Width of buildings for a particular urban category and a particular street direction
  217. ! numhgt [ - ] : Number of building height levels defined for a particular urban category
  218. ! height_bin [ m ] : Building height bins defined for a particular urban category.
  219. ! hpercent_bin [ % ] : Percentage of a particular urban category populated by buildings of particular height bins
  220. !end BEP
  221. ! Moved from URBPARM.TBL
  222. !
  223. ! BETR [-] : minimum moisture availability of roof
  224. ! BETB [-] : minimum moisture availability of building wall
  225. ! BETG [-] : minimum moisture availability of road
  226. ! Z0R [m] : roughness length for momentum of roof
  227. ! Z0HB [m] : roughness length for heat of building wall (only for CH_SCHEME = 1)
  228. ! Z0HG [m] : roughness length for heat of road
  229. ! num_roof_layers : number of layers within roof
  230. ! num_wall_layers : number of layers within building walls
  231. ! num_road_layers : number of layers within below road surface
  232. ! NOTE: for now, these layers are defined as same as the number of soil layers in namelist.input
  233. !
  234. ! References:
  235. ! Kusaka and Kimura (2004) J.Appl.Meteor., vol.43, p1899-1910
  236. ! Kusaka and Kimura (2004) J.Meteor.Soc.Japan, vol.82, p45-65
  237. ! Kusaka et al. (2001) Bound.-Layer Meteor., vol.101, p329-358
  238. !
  239. ! History:
  240. ! 2006/06 modified by H. Kusaka (Univ. Tsukuba), M. Tewari
  241. ! 2005/10/26, modified by Fei Chen, Mukul Tewari
  242. ! 2003/07/21 WRF , modified by H. Kusaka of CRIEPI (NCAR/MMM)
  243. ! 2001/08/26 PhD , modified by H. Kusaka of CRIEPI (Univ.Tsukuba)
  244. ! 1999/08/25 LCM , developed by H. Kusaka of CRIEPI (Univ.Tsukuba)
  245. !
  246. !===============================================================================
  247. !
  248. ! subroutine urban:
  249. !
  250. !===============================================================================
  251. SUBROUTINE urban(LSOLAR, & ! L
  252. num_roof_layers,num_wall_layers,num_road_layers, & ! I
  253. DZR,DZB,DZG, & ! I
  254. UTYPE,TA,QA,UA,U1,V1,SSG,SSGD,SSGQ,LLG,RAIN,RHOO, & ! I
  255. ZA,DECLIN,COSZ,OMG,XLAT,DELT,ZNT, & ! I
  256. CHS, CHS2, & ! I
  257. TR, TB, TG, TC, QC, UC, & ! H
  258. TRL,TBL,TGL, & ! H
  259. XXXR, XXXB, XXXG, XXXC, & ! H
  260. TS,QS,SH,LH,LH_KINEMATIC, & ! O
  261. SW,ALB,LW,G,RN,PSIM,PSIH, & ! O
  262. GZ1OZ0, & ! O
  263. CMR_URB,CHR_URB,CMC_URB,CHC_URB, & ! I/O
  264. U10,V10,TH2,Q2,UST & ! O
  265. )
  266. IMPLICIT NONE
  267. REAL, PARAMETER :: CP=0.24 ! heat capacity of dry air [cgs unit]
  268. REAL, PARAMETER :: EL=583. ! latent heat of vaporation [cgs unit]
  269. REAL, PARAMETER :: SIG=8.17E-11 ! stefun bolzman constant [cgs unit]
  270. REAL, PARAMETER :: SIG_SI=5.67E-8 ! [MKS unit]
  271. REAL, PARAMETER :: AK=0.4 ! kalman const. [-]
  272. REAL, PARAMETER :: PI=3.14159 ! pi [-]
  273. REAL, PARAMETER :: TETENA=7.5 ! const. of Tetens Equation [-]
  274. REAL, PARAMETER :: TETENB=237.3 ! const. of Tetens Equation [-]
  275. REAL, PARAMETER :: SRATIO=0.75 ! ratio between direct/total solar [-]
  276. REAL, PARAMETER :: CPP=1004.5 ! heat capacity of dry air [J/K/kg]
  277. REAL, PARAMETER :: ELL=2.442E+06 ! latent heat of vaporization [J/kg]
  278. REAL, PARAMETER :: XKA=2.4E-5
  279. !-------------------------------------------------------------------------------
  280. ! C: configuration variables
  281. !-------------------------------------------------------------------------------
  282. LOGICAL, INTENT(IN) :: LSOLAR ! logical [true=both, false=SSG only]
  283. ! The following variables are also model configuration variables, but are
  284. ! defined in the URBAN.TBL and in the contains statement in the top of
  285. ! the module_urban_init, so we should not declare them here.
  286. INTEGER, INTENT(IN) :: num_roof_layers
  287. INTEGER, INTENT(IN) :: num_wall_layers
  288. INTEGER, INTENT(IN) :: num_road_layers
  289. REAL, INTENT(IN), DIMENSION(1:num_roof_layers) :: DZR ! grid interval of roof layers [cm]
  290. REAL, INTENT(IN), DIMENSION(1:num_wall_layers) :: DZB ! grid interval of wall layers [cm]
  291. REAL, INTENT(IN), DIMENSION(1:num_road_layers) :: DZG ! grid interval of road layers [cm]
  292. !-------------------------------------------------------------------------------
  293. ! I: input variables from LSM to Urban
  294. !-------------------------------------------------------------------------------
  295. INTEGER, INTENT(IN) :: UTYPE ! urban type [1=Commercial/Industrial, 2=High-intensity residential,
  296. ! 3=low-intensity residential]
  297. REAL, INTENT(IN) :: TA ! potential temp at 1st atmospheric level [K]
  298. REAL, INTENT(IN) :: QA ! mixing ratio at 1st atmospheric level [kg/kg]
  299. REAL, INTENT(IN) :: UA ! wind speed at 1st atmospheric level [m/s]
  300. REAL, INTENT(IN) :: U1 ! u at 1st atmospheric level [m/s]
  301. REAL, INTENT(IN) :: V1 ! v at 1st atmospheric level [m/s]
  302. REAL, INTENT(IN) :: SSG ! downward total short wave radiation [W/m/m]
  303. REAL, INTENT(IN) :: LLG ! downward long wave radiation [W/m/m]
  304. REAL, INTENT(IN) :: RAIN ! precipitation [mm/h]
  305. REAL, INTENT(IN) :: RHOO ! air density [kg/m^3]
  306. REAL, INTENT(IN) :: ZA ! first atmospheric level [m]
  307. REAL, INTENT(IN) :: DECLIN ! solar declination [rad]
  308. REAL, INTENT(IN) :: COSZ ! sin(fai)*sin(del)+cos(fai)*cos(del)*cos(omg)
  309. REAL, INTENT(IN) :: OMG ! solar hour angle [rad]
  310. REAL, INTENT(IN) :: XLAT ! latitude [deg]
  311. REAL, INTENT(IN) :: DELT ! time step [s]
  312. REAL, INTENT(IN) :: ZNT ! roughness length [m]
  313. REAL, INTENT(IN) :: CHS,CHS2 ! CH*U at za and 2 m [m/s]
  314. REAL, INTENT(INOUT) :: SSGD ! downward direct short wave radiation [W/m/m]
  315. REAL, INTENT(INOUT) :: SSGQ ! downward diffuse short wave radiation [W/m/m]
  316. REAL, INTENT(INOUT) :: CMR_URB
  317. REAL, INTENT(INOUT) :: CHR_URB
  318. REAL, INTENT(INOUT) :: CMC_URB
  319. REAL, INTENT(INOUT) :: CHC_URB
  320. !-------------------------------------------------------------------------------
  321. ! O: output variables from Urban to LSM
  322. !-------------------------------------------------------------------------------
  323. REAL, INTENT(OUT) :: TS ! surface potential temperature [K]
  324. REAL, INTENT(OUT) :: QS ! surface humidity [K]
  325. REAL, INTENT(OUT) :: SH ! sensible heat flux [W/m/m]
  326. REAL, INTENT(OUT) :: LH ! latent heat flux [W/m/m]
  327. REAL, INTENT(OUT) :: LH_KINEMATIC ! latent heat, kinetic [kg/m/m/s]
  328. REAL, INTENT(OUT) :: SW ! upward short wave radiation flux [W/m/m]
  329. REAL, INTENT(OUT) :: ALB ! time-varying albedo [fraction]
  330. REAL, INTENT(OUT) :: LW ! upward long wave radiation flux [W/m/m]
  331. REAL, INTENT(OUT) :: G ! heat flux into the ground [W/m/m]
  332. REAL, INTENT(OUT) :: RN ! net radition [W/m/m]
  333. REAL, INTENT(OUT) :: PSIM ! similality stability shear function for momentum
  334. REAL, INTENT(OUT) :: PSIH ! similality stability shear function for heat
  335. REAL, INTENT(OUT) :: GZ1OZ0
  336. REAL, INTENT(OUT) :: U10 ! u at 10m [m/s]
  337. REAL, INTENT(OUT) :: V10 ! u at 10m [m/s]
  338. REAL, INTENT(OUT) :: TH2 ! potential temperature at 2 m [K]
  339. REAL, INTENT(OUT) :: Q2 ! humidity at 2 m [-]
  340. !m REAL, INTENT(OUT) :: CHS,CHS2 ! CH*U at za and 2 m [m/s]
  341. REAL, INTENT(OUT) :: UST ! friction velocity [m/s]
  342. !-------------------------------------------------------------------------------
  343. ! H: Historical (state) variables of Urban : LSM <--> Urban
  344. !-------------------------------------------------------------------------------
  345. ! TR: roof temperature [K]; TRP: at previous time step [K]
  346. ! TB: building wall temperature [K]; TBP: at previous time step [K]
  347. ! TG: road temperature [K]; TGP: at previous time step [K]
  348. ! TC: urban-canopy air temperature [K]; TCP: at previous time step [K]
  349. ! (absolute temperature)
  350. ! QC: urban-canopy air mixing ratio [kg/kg]; QCP: at previous time step [kg/kg]
  351. !
  352. ! XXXR: Monin-Obkhov length for roof [dimensionless]
  353. ! XXXB: Monin-Obkhov length for building wall [dimensionless]
  354. ! XXXG: Monin-Obkhov length for road [dimensionless]
  355. ! XXXC: Monin-Obkhov length for urban-canopy [dimensionless]
  356. !
  357. ! TRL, TBL, TGL: layer temperature [K] (absolute temperature)
  358. REAL, INTENT(INOUT):: TR, TB, TG, TC, QC, UC
  359. REAL, INTENT(INOUT):: XXXR, XXXB, XXXG, XXXC
  360. REAL, DIMENSION(1:num_roof_layers), INTENT(INOUT) :: TRL
  361. REAL, DIMENSION(1:num_wall_layers), INTENT(INOUT) :: TBL
  362. REAL, DIMENSION(1:num_road_layers), INTENT(INOUT) :: TGL
  363. !-------------------------------------------------------------------------------
  364. ! L: Local variables from read_param
  365. !-------------------------------------------------------------------------------
  366. REAL :: ZR, Z0C, Z0HC, ZDC, SVF, R, RW, HGT, AH
  367. REAL :: SIGMA_ZED
  368. REAL :: CAPR, CAPB, CAPG, AKSR, AKSB, AKSG, ALBR, ALBB, ALBG
  369. REAL :: EPSR, EPSB, EPSG, Z0R, Z0B, Z0G, Z0HB, Z0HG
  370. REAL :: TRLEND,TBLEND,TGLEND
  371. REAL :: T1VR, T1VC,TH2V
  372. REAL :: RLMO_URB
  373. REAL :: AKANDA_URBAN
  374. REAL :: TH2X !m
  375. INTEGER :: BOUNDR, BOUNDB, BOUNDG
  376. INTEGER :: CH_SCHEME, TS_SCHEME
  377. LOGICAL :: SHADOW ! [true=consider svf and shadow effects, false=consider svf effect only]
  378. !for BEP
  379. INTEGER :: NUMDIR
  380. REAL, DIMENSION ( MAXDIRS ) :: STREET_DIRECTION
  381. REAL, DIMENSION ( MAXDIRS ) :: STREET_WIDTH
  382. REAL, DIMENSION ( MAXDIRS ) :: BUILDING_WIDTH
  383. INTEGER :: NUMHGT
  384. REAL, DIMENSION ( MAXHGTS ) :: HEIGHT_BIN
  385. REAL, DIMENSION ( MAXHGTS ) :: HPERCENT_BIN
  386. !end BEP
  387. !-------------------------------------------------------------------------------
  388. ! L: Local variables
  389. !-------------------------------------------------------------------------------
  390. REAL :: BETR, BETB, BETG
  391. REAL :: SX, SD, SQ, RX
  392. REAL :: UR, ZC, XLB, BB
  393. REAL :: Z, RIBB, RIBG, RIBC, BHR, BHB, BHG, BHC
  394. REAL :: TSC, LNET, SNET, FLXUV, THG, FLXTH, FLXHUM, FLXG
  395. REAL :: W, VFGS, VFGW, VFWG, VFWS, VFWW
  396. REAL :: HOUI1, HOUI2, HOUI3, HOUI4, HOUI5, HOUI6, HOUI7, HOUI8
  397. REAL :: SLX, SLX1, SLX2, SLX3, SLX4, SLX5, SLX6, SLX7, SLX8
  398. REAL :: FLXTHR, FLXTHB, FLXTHG, FLXHUMR, FLXHUMB, FLXHUMG
  399. REAL :: SR, SB, SG, RR, RB, RG
  400. REAL :: SR1, SR2, SB1, SB2, SG1, SG2, RR1, RR2, RB1, RB2, RG1, RG2
  401. REAL :: HR, HB, HG, ELER, ELEB, ELEG, G0R, G0B, G0G
  402. REAL :: ALPHAC, ALPHAR, ALPHAB, ALPHAG
  403. REAL :: CHC, CHR, CHB, CHG, CDC, CDR, CDB, CDG
  404. REAL :: C1R, C1B, C1G, TE, TC1, TC2, QC1, QC2, QS0R, QS0B, QS0G,RHO,ES
  405. REAL :: DESDT
  406. REAL :: F
  407. REAL :: DQS0RDTR
  408. REAL :: DRRDTR, DHRDTR, DELERDTR, DG0RDTR
  409. REAL :: DTR, DFDT
  410. REAL :: FX, FY, GF, GX, GY
  411. REAL :: DTCDTB, DTCDTG
  412. REAL :: DQCDTB, DQCDTG
  413. REAL :: DRBDTB1, DRBDTG1, DRBDTB2, DRBDTG2
  414. REAL :: DRGDTB1, DRGDTG1, DRGDTB2, DRGDTG2
  415. REAL :: DRBDTB, DRBDTG, DRGDTB, DRGDTG
  416. REAL :: DHBDTB, DHBDTG, DHGDTB, DHGDTG
  417. REAL :: DELEBDTB, DELEBDTG, DELEGDTG, DELEGDTB
  418. REAL :: DG0BDTB, DG0BDTG, DG0GDTG, DG0GDTB
  419. REAL :: DQS0BDTB, DQS0GDTG
  420. REAL :: DTB, DTG, DTC
  421. REAL :: THEATAZ ! Solar Zenith Angle [rad]
  422. REAL :: THEATAS ! = PI/2. - THETAZ
  423. REAL :: FAI ! Latitude [rad]
  424. REAL :: CNT,SNT
  425. REAL :: PS ! Surface Pressure [hPa]
  426. REAL :: TAV ! Vertial Temperature [K]
  427. REAL :: XXX, X, Z0, Z0H, CD, CH
  428. REAL :: XXX2, PSIM2, PSIH2, XXX10, PSIM10, PSIH10
  429. REAL :: PSIX, PSIT, PSIX2, PSIT2, PSIX10, PSIT10
  430. REAL :: TRP, TBP, TGP, TCP, QCP, TST, QST
  431. INTEGER :: iteration, K
  432. INTEGER :: tloc
  433. !-------------------------------------------------------------------------------
  434. ! Set parameters
  435. !-------------------------------------------------------------------------------
  436. ! Miao, 2007/01/17, cal. ah
  437. if(ahoption==1) then
  438. tloc=mod(int(OMG/PI*180./15.+12.+0.5 ),24)
  439. if(tloc==0) tloc=24
  440. endif
  441. CALL read_param(UTYPE,ZR,SIGMA_ZED,Z0C,Z0HC,ZDC,SVF,R,RW,HGT, &
  442. AH,CAPR,CAPB,CAPG,AKSR,AKSB,AKSG,ALBR,ALBB, &
  443. ALBG,EPSR,EPSB,EPSG,Z0R,Z0B,Z0G,Z0HB,Z0HG, &
  444. BETR,BETB,BETG,TRLEND,TBLEND,TGLEND, &
  445. !for BEP
  446. NUMDIR, STREET_DIRECTION, STREET_WIDTH, &
  447. BUILDING_WIDTH, NUMHGT, HEIGHT_BIN, &
  448. HPERCENT_BIN, &
  449. !end BEP
  450. BOUNDR,BOUNDB,BOUNDG,CH_SCHEME,TS_SCHEME, &
  451. AKANDA_URBAN)
  452. ! Miao, 2007/01/17, cal. ah
  453. if(ahoption==1) AH=AH*ahdiuprf(tloc)
  454. IF( ZDC+Z0C+2. >= ZA) THEN
  455. CALL wrf_error_fatal ("ZDC + Z0C + 2m is larger than the 1st WRF level "// &
  456. "Stop in subroutine urban - change ZDC and Z0C" )
  457. END IF
  458. IF(.NOT.LSOLAR) THEN
  459. SSGD = SRATIO*SSG
  460. SSGQ = SSG - SSGD
  461. ENDIF
  462. SSGD = SRATIO*SSG ! No radiation scheme has SSGD and SSGQ.
  463. SSGQ = SSG - SSGD
  464. W=2.*1.*HGT
  465. VFGS=SVF
  466. VFGW=1.-SVF
  467. VFWG=(1.-SVF)*(1.-R)/W
  468. VFWS=VFWG
  469. VFWW=1.-2.*VFWG
  470. !-------------------------------------------------------------------------------
  471. ! Convert unit from MKS to cgs
  472. ! Renew surface and layer temperatures
  473. !-------------------------------------------------------------------------------
  474. SX=(SSGD+SSGQ)/697.7/60. ! downward short wave radition [ly/min]
  475. SD=SSGD/697.7/60. ! downward direct short wave radiation
  476. SQ=SSGQ/697.7/60. ! downward diffuse short wave radiation
  477. RX=LLG/697.7/60. ! downward long wave radiation
  478. RHO=RHOO*0.001 ! air density at first atmospheric level
  479. TRP=TR
  480. TBP=TB
  481. TGP=TG
  482. TCP=TC
  483. QCP=QC
  484. TAV=TA*(1.+0.61*QA)
  485. PS=RHOO*287.*TAV/100. ![hPa]
  486. !-------------------------------------------------------------------------------
  487. ! Canopy wind
  488. !-------------------------------------------------------------------------------
  489. IF ( ZR + 2. < ZA ) THEN
  490. UR=UA*LOG((ZR-ZDC)/Z0C)/LOG((ZA-ZDC)/Z0C)
  491. ZC=0.7*ZR
  492. XLB=0.4*(ZR-ZDC)
  493. ! BB formulation from Inoue (1963)
  494. BB = 0.4 * ZR / ( XLB * alog( ( ZR - ZDC ) / Z0C ) )
  495. UC=UR*EXP(-BB*(1.-ZC/ZR))
  496. ELSE
  497. ! PRINT *, 'Warning ZR + 2m is larger than the 1st WRF level'
  498. ZC=ZA/2.
  499. UC=UA/2.
  500. END IF
  501. !-------------------------------------------------------------------------------
  502. ! Net Short Wave Radiation at roof, wall, and road
  503. !-------------------------------------------------------------------------------
  504. SHADOW = .false.
  505. ! SHADOW = .true.
  506. IF (SSG > 0.0) THEN
  507. IF(.NOT.SHADOW) THEN ! no shadow effects model
  508. SR1=SX*(1.-ALBR)
  509. SG1=SX*VFGS*(1.-ALBG)
  510. SB1=SX*VFWS*(1.-ALBB)
  511. SG2=SB1*ALBB/(1.-ALBB)*VFGW*(1.-ALBG)
  512. SB2=SG1*ALBG/(1.-ALBG)*VFWG*(1.-ALBB)
  513. ELSE ! shadow effects model
  514. FAI=XLAT*PI/180.
  515. THEATAS=ABS(ASIN(COSZ))
  516. THEATAZ=ABS(ACOS(COSZ))
  517. SNT=COS(DECLIN)*SIN(OMG)/COS(THEATAS)
  518. CNT=(COSZ*SIN(FAI)-SIN(DECLIN))/COS(THEATAS)/COS(FAI)
  519. HOUI1=(SNT*COS(PI/8.) -CNT*SIN(PI/8.))
  520. HOUI2=(SNT*COS(2.*PI/8.) -CNT*SIN(2.*PI/8.))
  521. HOUI3=(SNT*COS(3.*PI/8.) -CNT*SIN(3.*PI/8.))
  522. HOUI4=(SNT*COS(4.*PI/8.) -CNT*SIN(4.*PI/8.))
  523. HOUI5=(SNT*COS(5.*PI/8.) -CNT*SIN(5.*PI/8.))
  524. HOUI6=(SNT*COS(6.*PI/8.) -CNT*SIN(6.*PI/8.))
  525. HOUI7=(SNT*COS(7.*PI/8.) -CNT*SIN(7.*PI/8.))
  526. HOUI8=(SNT*COS(8.*PI/8.) -CNT*SIN(8.*PI/8.))
  527. SLX1=HGT*ABS(TAN(THEATAZ))*ABS(HOUI1)
  528. SLX2=HGT*ABS(TAN(THEATAZ))*ABS(HOUI2)
  529. SLX3=HGT*ABS(TAN(THEATAZ))*ABS(HOUI3)
  530. SLX4=HGT*ABS(TAN(THEATAZ))*ABS(HOUI4)
  531. SLX5=HGT*ABS(TAN(THEATAZ))*ABS(HOUI5)
  532. SLX6=HGT*ABS(TAN(THEATAZ))*ABS(HOUI6)
  533. SLX7=HGT*ABS(TAN(THEATAZ))*ABS(HOUI7)
  534. SLX8=HGT*ABS(TAN(THEATAZ))*ABS(HOUI8)
  535. IF(SLX1 > RW) SLX1=RW
  536. IF(SLX2 > RW) SLX2=RW
  537. IF(SLX3 > RW) SLX3=RW
  538. IF(SLX4 > RW) SLX4=RW
  539. IF(SLX5 > RW) SLX5=RW
  540. IF(SLX6 > RW) SLX6=RW
  541. IF(SLX7 > RW) SLX7=RW
  542. IF(SLX8 > RW) SLX8=RW
  543. SLX=(SLX1+SLX2+SLX3+SLX4+SLX5+SLX6+SLX7+SLX8)/8.
  544. SR1=SD*(1.-ALBR)+SQ*(1.-ALBR)
  545. SG1=SD*(RW-SLX)/RW*(1.-ALBG)+SQ*VFGS*(1.-ALBG)
  546. SB1=SD*SLX/W*(1.-ALBB)+SQ*VFWS*(1.-ALBB)
  547. SG2=SB1*ALBB/(1.-ALBB)*VFGW*(1.-ALBG)
  548. SB2=SG1*ALBG/(1.-ALBG)*VFWG*(1.-ALBB)
  549. END IF
  550. SR=SR1
  551. SG=SG1+SG2
  552. SB=SB1+SB2
  553. SNET=R*SR+W*SB+RW*SG
  554. ELSE
  555. SR=0.
  556. SG=0.
  557. SB=0.
  558. SNET=0.
  559. END IF
  560. !-------------------------------------------------------------------------------
  561. ! Roof
  562. !-------------------------------------------------------------------------------
  563. !-------------------------------------------------------------------------------
  564. ! CHR, CDR, BETR
  565. !-------------------------------------------------------------------------------
  566. ! Z=ZA-ZDC
  567. ! BHR=LOG(Z0R/Z0HR)/0.4
  568. ! RIBR=(9.8*2./(TA+TRP))*(TA-TRP)*(Z+Z0R)/(UA*UA)
  569. ! CALL mos(XXXR,ALPHAR,CDR,BHR,RIBR,Z,Z0R,UA,TA,TRP,RHO)
  570. ! Alternative option for MOST using SFCDIF routine from Noah
  571. ! Virtual temperatures needed by SFCDIF
  572. T1VR = TRP* (1.0+ 0.61 * QA)
  573. TH2V = (TA + ( 0.0098 * ZA)) * (1.0+ 0.61 * QA)
  574. ! note that CHR_URB contains UA (=CHR_MOS*UA)
  575. RLMO_URB=0.0
  576. CALL SFCDIF_URB (ZA,Z0R,T1VR,TH2V,UA,AKANDA_URBAN,CMR_URB,CHR_URB,RLMO_URB,CDR)
  577. ALPHAR = RHO*CP*CHR_URB
  578. CHR=ALPHAR/RHO/CP/UA
  579. IF(RAIN > 1.) BETR=0.7
  580. IF (TS_SCHEME == 1) THEN
  581. !-------------------------------------------------------------------------------
  582. ! TR Solving Non-Linear Equation by Newton-Rapson
  583. ! TRL Solving Heat Equation by Tri Diagonal Matrix Algorithm
  584. !-------------------------------------------------------------------------------
  585. ! TSC=TRP-273.15
  586. ! ES=EXP(19.482-4303.4/(TSC+243.5)) ! WMO
  587. ! ES=6.11*10.**(TETENA*TSC/(TETENB+TSC)) ! Tetens
  588. ! DESDT=( 6.1078*(2500.-2.4*TSC)/ & ! Tetens
  589. ! (0.46151*(TSC+273.15)**2.) )*10.**(7.5*TSC/(237.3+TSC))
  590. ! ES=6.11*EXP((2.5*10.**6./461.51)*(TRP-273.15)/(273.15*TRP) ) ! Clausius-Clapeyron
  591. ! DESDT=(2.5*10.**6./461.51)*ES/(TRP**2.) ! Clausius-Clapeyron
  592. ! QS0R=0.622*ES/(PS-0.378*ES)
  593. ! DQS0RDTR = DESDT*0.622*PS/((PS-0.378*ES)**2.)
  594. ! DQS0RDTR = 17.269*(273.15-35.86)/((TRP-35.86)**2.)*QS0R
  595. ! TRP=350.
  596. DO ITERATION=1,20
  597. ES=6.11*EXP( (2.5*10.**6./461.51)*(TRP-273.15)/(273.15*TRP) )
  598. DESDT=(2.5*10.**6./461.51)*ES/(TRP**2.)
  599. QS0R=0.622*ES/(PS-0.378*ES)
  600. DQS0RDTR = DESDT*0.622*PS/((PS-0.378*ES)**2.)
  601. RR=EPSR*(RX-SIG*(TRP**4.)/60.)
  602. HR=RHO*CP*CHR*UA*(TRP-TA)*100.
  603. ELER=RHO*EL*CHR*UA*BETR*(QS0R-QA)*100.
  604. G0R=AKSR*(TRP-TRL(1))/(DZR(1)/2.)
  605. F = SR + RR - HR - ELER - G0R
  606. DRRDTR = (-4.*EPSR*SIG*TRP**3.)/60.
  607. DHRDTR = RHO*CP*CHR*UA*100.
  608. DELERDTR = RHO*EL*CHR*UA*BETR*DQS0RDTR*100.
  609. DG0RDTR = 2.*AKSR/DZR(1)
  610. DFDT = DRRDTR - DHRDTR - DELERDTR - DG0RDTR
  611. DTR = F/DFDT
  612. TR = TRP - DTR
  613. TRP = TR
  614. IF( ABS(F) < 0.000001 .AND. ABS(DTR) < 0.000001 ) EXIT
  615. END DO
  616. ! multi-layer heat equation model
  617. CALL multi_layer(num_roof_layers,BOUNDR,G0R,CAPR,AKSR,TRL,DZR,DELT,TRLEND)
  618. ELSE
  619. ES=6.11*EXP( (2.5*10.**6./461.51)*(TRP-273.15)/(273.15*TRP) )
  620. QS0R=0.622*ES/(PS-0.378*ES)
  621. RR=EPSR*(RX-SIG*(TRP**4.)/60.)
  622. HR=RHO*CP*CHR*UA*(TRP-TA)*100.
  623. ELER=RHO*EL*CHR*UA*BETR*(QS0R-QA)*100.
  624. G0R=SR+RR-HR-ELER
  625. CALL force_restore(CAPR,AKSR,DELT,SR,RR,HR,ELER,TRLEND,TRP,TR)
  626. TRP=TR
  627. END IF
  628. FLXTHR=HR/RHO/CP/100.
  629. FLXHUMR=ELER/RHO/EL/100.
  630. !-------------------------------------------------------------------------------
  631. ! Wall and Road
  632. !-------------------------------------------------------------------------------
  633. !-------------------------------------------------------------------------------
  634. ! CHC, CHB, CDB, BETB, CHG, CDG, BETG
  635. !-------------------------------------------------------------------------------
  636. ! Z=ZA-ZDC
  637. ! BHC=LOG(Z0C/Z0HC)/0.4
  638. ! RIBC=(9.8*2./(TA+TCP))*(TA-TCP)*(Z+Z0C)/(UA*UA)
  639. !
  640. ! CALL mos(XXXC,ALPHAC,CDC,BHC,RIBC,Z,Z0C,UA,TA,TCP,RHO)
  641. ! Virtual temperatures needed by SFCDIF routine from Noah
  642. T1VC = TCP* (1.0+ 0.61 * QA)
  643. RLMO_URB=0.0
  644. CALL SFCDIF_URB(ZA,Z0C,T1VC,TH2V,UA,AKANDA_URBAN,CMC_URB,CHC_URB,RLMO_URB,CDC)
  645. ALPHAC = RHO*CP*CHC_URB
  646. IF (CH_SCHEME == 1) THEN
  647. Z=ZDC
  648. BHB=LOG(Z0B/Z0HB)/0.4
  649. BHG=LOG(Z0G/Z0HG)/0.4
  650. RIBB=(9.8*2./(TCP+TBP))*(TCP-TBP)*(Z+Z0B)/(UC*UC)
  651. RIBG=(9.8*2./(TCP+TGP))*(TCP-TGP)*(Z+Z0G)/(UC*UC)
  652. CALL mos(XXXB,ALPHAB,CDB,BHB,RIBB,Z,Z0B,UC,TCP,TBP,RHO)
  653. CALL mos(XXXG,ALPHAG,CDG,BHG,RIBG,Z,Z0G,UC,TCP,TGP,RHO)
  654. ELSE
  655. ALPHAB=RHO*CP*(6.15+4.18*UC)/1200.
  656. IF(UC > 5.) ALPHAB=RHO*CP*(7.51*UC**0.78)/1200.
  657. ALPHAG=RHO*CP*(6.15+4.18*UC)/1200.
  658. IF(UC > 5.) ALPHAG=RHO*CP*(7.51*UC**0.78)/1200.
  659. END IF
  660. CHC=ALPHAC/RHO/CP/UA
  661. CHB=ALPHAB/RHO/CP/UC
  662. CHG=ALPHAG/RHO/CP/UC
  663. BETB=0.0
  664. IF(RAIN > 1.) BETG=0.7
  665. IF (TS_SCHEME == 1) THEN
  666. !-------------------------------------------------------------------------------
  667. ! TB, TG Solving Non-Linear Simultaneous Equation by Newton-Rapson
  668. ! TBL,TGL Solving Heat Equation by Tri Diagonal Matrix Algorithm
  669. !-------------------------------------------------------------------------------
  670. ! TBP=350.
  671. ! TGP=350.
  672. DO ITERATION=1,20
  673. ES=6.11*EXP( (2.5*10.**6./461.51)*(TBP-273.15)/(273.15*TBP) )
  674. DESDT=(2.5*10.**6./461.51)*ES/(TBP**2.)
  675. QS0B=0.622*ES/(PS-0.378*ES)
  676. DQS0BDTB=DESDT*0.622*PS/((PS-0.378*ES)**2.)
  677. ES=6.11*EXP( (2.5*10.**6./461.51)*(TGP-273.15)/(273.15*TGP) )
  678. DESDT=(2.5*10.**6./461.51)*ES/(TGP**2.)
  679. QS0G=0.622*ES/(PS-0.378*ES)
  680. DQS0GDTG=DESDT*0.22*PS/((PS-0.378*ES)**2.)
  681. RG1=EPSG*( RX*VFGS &
  682. +EPSB*VFGW*SIG*TBP**4./60. &
  683. -SIG*TGP**4./60. )
  684. RB1=EPSB*( RX*VFWS &
  685. +EPSG*VFWG*SIG*TGP**4./60. &
  686. +EPSB*VFWW*SIG*TBP**4./60. &
  687. -SIG*TBP**4./60. )
  688. RG2=EPSG*( (1.-EPSB)*(1.-SVF)*VFWS*RX &
  689. +(1.-EPSB)*(1.-SVF)*VFWG*EPSG*SIG*TGP**4./60. &
  690. +EPSB*(1.-EPSB)*(1.-SVF)*(1.-2.*VFWS)*SIG*TBP**4./60. )
  691. RB2=EPSB*( (1.-EPSG)*VFWG*VFGS*RX &
  692. +(1.-EPSG)*EPSB*VFGW*VFWG*SIG*(TBP**4.)/60. &
  693. +(1.-EPSB)*VFWS*(1.-2.*VFWS)*RX &
  694. +(1.-EPSB)*VFWG*(1.-2.*VFWS)*EPSG*SIG*EPSG*TGP**4./60. &
  695. +EPSB*(1.-EPSB)*(1.-2.*VFWS)*(1.-2.*VFWS)*SIG*TBP**4./60. )
  696. RG=RG1+RG2
  697. RB=RB1+RB2
  698. DRBDTB1=EPSB*(4.*EPSB*SIG*TB**3.*VFWW-4.*SIG*TB**3.)/60.
  699. DRBDTG1=EPSB*(4.*EPSG*SIG*TG**3.*VFWG)/60.
  700. DRBDTB2=EPSB*(4.*(1.-EPSG)*EPSB*SIG*TB**3.*VFGW*VFWG &
  701. +4.*EPSB*(1.-EPSB)*SIG*TB**3.*VFWW*VFWW)/60.
  702. DRBDTG2=EPSB*(4.*(1.-EPSB)*EPSG*SIG*TG**3.*VFWG*VFWW)/60.
  703. DRGDTB1=EPSG*(4.*EPSB*SIG*TB**3.*VFGW)/60.
  704. DRGDTG1=EPSG*(-4.*SIG*TG**3.)/60.
  705. DRGDTB2=EPSG*(4.*EPSB*(1.-EPSB)*SIG*TB**3.*VFWW*VFGW)/60.
  706. DRGDTG2=EPSG*(4.*(1.-EPSB)*EPSG*SIG*TG**3.*VFWG*VFGW)/60.
  707. DRBDTB=DRBDTB1+DRBDTB2
  708. DRBDTG=DRBDTG1+DRBDTG2
  709. DRGDTB=DRGDTB1+DRGDTB2
  710. DRGDTG=DRGDTG1+DRGDTG2
  711. HB=RHO*CP*CHB*UC*(TBP-TCP)*100.
  712. HG=RHO*CP*CHG*UC*(TGP-TCP)*100.
  713. DTCDTB=W*ALPHAB/(RW*ALPHAC+RW*ALPHAG+W*ALPHAB)
  714. DTCDTG=RW*ALPHAG/(RW*ALPHAC+RW*ALPHAG+W*ALPHAB)
  715. DHBDTB=RHO*CP*CHB*UC*(1.-DTCDTB)*100.
  716. DHBDTG=RHO*CP*CHB*UC*(0.-DTCDTG)*100.
  717. DHGDTG=RHO*CP*CHG*UC*(1.-DTCDTG)*100.
  718. DHGDTB=RHO*CP*CHG*UC*(0.-DTCDTB)*100.
  719. ELEB=RHO*EL*CHB*UC*BETB*(QS0B-QCP)*100.
  720. ELEG=RHO*EL*CHG*UC*BETG*(QS0G-QCP)*100.
  721. DQCDTB=W*ALPHAB*BETB*DQS0BDTB/(RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB)
  722. DQCDTG=RW*ALPHAG*BETG*DQS0GDTG/(RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB)
  723. DELEBDTB=RHO*EL*CHB*UC*BETB*(DQS0BDTB-DQCDTB)*100.
  724. DELEBDTG=RHO*EL*CHB*UC*BETB*(0.-DQCDTG)*100.
  725. DELEGDTG=RHO*EL*CHG*UC*BETG*(DQS0GDTG-DQCDTG)*100.
  726. DELEGDTB=RHO*EL*CHG*UC*BETG*(0.-DQCDTB)*100.
  727. G0B=AKSB*(TBP-TBL(1))/(DZB(1)/2.)
  728. G0G=AKSG*(TGP-TGL(1))/(DZG(1)/2.)
  729. DG0BDTB=2.*AKSB/DZB(1)
  730. DG0BDTG=0.
  731. DG0GDTG=2.*AKSG/DZG(1)
  732. DG0GDTB=0.
  733. F = SB + RB - HB - ELEB - G0B
  734. FX = DRBDTB - DHBDTB - DELEBDTB - DG0BDTB
  735. FY = DRBDTG - DHBDTG - DELEBDTG - DG0BDTG
  736. GF = SG + RG - HG - ELEG - G0G
  737. GX = DRGDTB - DHGDTB - DELEGDTB - DG0GDTB
  738. GY = DRGDTG - DHGDTG - DELEGDTG - DG0GDTG
  739. DTB = (GF*FY-F*GY)/(FX*GY-GX*FY)
  740. DTG = -(GF+GX*DTB)/GY
  741. TB = TBP + DTB
  742. TG = TGP + DTG
  743. TBP = TB
  744. TGP = TG
  745. TC1=RW*ALPHAC+RW*ALPHAG+W*ALPHAB
  746. TC2=RW*ALPHAC*TA+RW*ALPHAG*TGP+W*ALPHAB*TBP
  747. TC=TC2/TC1
  748. QC1=RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB
  749. QC2=RW*ALPHAC*QA+RW*ALPHAG*BETG*QS0G+W*ALPHAB*BETB*QS0B
  750. QC=QC2/QC1
  751. DTC=TCP - TC
  752. TCP=TC
  753. QCP=QC
  754. IF( ABS(F) < 0.000001 .AND. ABS(DTB) < 0.000001 &
  755. .AND. ABS(GF) < 0.000001 .AND. ABS(DTG) < 0.000001 &
  756. .AND. ABS(DTC) < 0.000001) EXIT
  757. END DO
  758. CALL multi_layer(num_wall_layers,BOUNDB,G0B,CAPB,AKSB,TBL,DZB,DELT,TBLEND)
  759. CALL multi_layer(num_road_layers,BOUNDG,G0G,CAPG,AKSG,TGL,DZG,DELT,TGLEND)
  760. ELSE
  761. !-------------------------------------------------------------------------------
  762. ! TB, TG by Force-Restore Method
  763. !-------------------------------------------------------------------------------
  764. ES=6.11*EXP((2.5*10.**6./461.51)*(TBP-273.15)/(273.15*TBP) )
  765. QS0B=0.622*ES/(PS-0.378*ES)
  766. ES=6.11*EXP((2.5*10.**6./461.51)*(TGP-273.15)/(273.15*TGP) )
  767. QS0G=0.622*ES/(PS-0.378*ES)
  768. RG1=EPSG*( RX*VFGS &
  769. +EPSB*VFGW*SIG*TBP**4./60. &
  770. -SIG*TGP**4./60. )
  771. RB1=EPSB*( RX*VFWS &
  772. +EPSG*VFWG*SIG*TGP**4./60. &
  773. +EPSB*VFWW*SIG*TBP**4./60. &
  774. -SIG*TBP**4./60. )
  775. RG2=EPSG*( (1.-EPSB)*(1.-SVF)*VFWS*RX &
  776. +(1.-EPSB)*(1.-SVF)*VFWG*EPSG*SIG*TGP**4./60. &
  777. +EPSB*(1.-EPSB)*(1.-SVF)*(1.-2.*VFWS)*SIG*TBP**4./60. )
  778. RB2=EPSB*( (1.-EPSG)*VFWG*VFGS*RX &
  779. +(1.-EPSG)*EPSB*VFGW*VFWG*SIG*(TBP**4.)/60. &
  780. +(1.-EPSB)*VFWS*(1.-2.*VFWS)*RX &
  781. +(1.-EPSB)*VFWG*(1.-2.*VFWS)*EPSG*SIG*EPSG*TGP**4./60. &
  782. +EPSB*(1.-EPSB)*(1.-2.*VFWS)*(1.-2.*VFWS)*SIG*TBP**4./60. )
  783. RG=RG1+RG2
  784. RB=RB1+RB2
  785. HB=RHO*CP*CHB*UC*(TBP-TCP)*100.
  786. ELEB=RHO*EL*CHB*UC*BETB*(QS0B-QCP)*100.
  787. G0B=SB+RB-HB-ELEB
  788. HG=RHO*CP*CHG*UC*(TGP-TCP)*100.
  789. ELEG=RHO*EL*CHG*UC*BETG*(QS0G-QCP)*100.
  790. G0G=SG+RG-HG-ELEG
  791. CALL force_restore(CAPB,AKSB,DELT,SB,RB,HB,ELEB,TBLEND,TBP,TB)
  792. CALL force_restore(CAPG,AKSG,DELT,SG,RG,HG,ELEG,TGLEND,TGP,TG)
  793. TBP=TB
  794. TGP=TG
  795. TC1=RW*ALPHAC+RW*ALPHAG+W*ALPHAB
  796. TC2=RW*ALPHAC*TA+RW*ALPHAG*TGP+W*ALPHAB*TBP
  797. TC=TC2/TC1
  798. QC1=RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB
  799. QC2=RW*ALPHAC*QA+RW*ALPHAG*BETG*QS0G+W*ALPHAB*BETB*QS0B
  800. QC=QC2/QC1
  801. TCP=TC
  802. QCP=QC
  803. END IF
  804. FLXTHB=HB/RHO/CP/100.
  805. FLXHUMB=ELEB/RHO/EL/100.
  806. FLXTHG=HG/RHO/CP/100.
  807. FLXHUMG=ELEG/RHO/EL/100.
  808. !-------------------------------------------------------------------------------
  809. ! Total Fluxes from Urban Canopy
  810. !-------------------------------------------------------------------------------
  811. FLXUV = ( R*CDR + RW*CDC )*UA*UA
  812. ! Miao, 2007/01/17, cal. ah
  813. if(ahoption==1) then
  814. FLXTH = ( R*FLXTHR + W*FLXTHB + RW*FLXTHG ) + AH/RHOO/CPP
  815. else
  816. FLXTH = ( R*FLXTHR + W*FLXTHB + RW*FLXTHG )
  817. endif
  818. FLXHUM = ( R*FLXHUMR + W*FLXHUMB + RW*FLXHUMG )
  819. FLXG = ( R*G0R + W*G0B + RW*G0G )
  820. LNET = R*RR + W*RB + RW*RG
  821. !----------------------------------------------------------------------------
  822. ! Convert Unit: FLUXES and u* T* q* --> WRF
  823. !----------------------------------------------------------------------------
  824. SH = FLXTH * RHOO * CPP ! Sensible heat flux [W/m/m]
  825. LH = FLXHUM * RHOO * ELL ! Latent heat flux [W/m/m]
  826. LH_KINEMATIC = FLXHUM * RHOO ! Latent heat, Kinematic [kg/m/m/s]
  827. LW = LLG - (LNET*697.7*60.) ! Upward longwave radiation [W/m/m]
  828. SW = SSG - (SNET*697.7*60.) ! Upward shortwave radiation [W/m/m]
  829. ALB = 0.
  830. IF( ABS(SSG) > 0.0001) ALB = SW/SSG ! Effective albedo [-]
  831. G = -FLXG*697.7*60. ! [W/m/m]
  832. RN = (SNET+LNET)*697.7*60. ! Net radiation [W/m/m]
  833. UST = SQRT(FLXUV) ! u* [m/s]
  834. TST = -FLXTH/UST ! T* [K]
  835. QST = -FLXHUM/UST ! q* [-]
  836. !------------------------------------------------------
  837. ! diagnostic GRID AVERAGED PSIM PSIH TS QS --> WRF
  838. !------------------------------------------------------
  839. Z0 = Z0C
  840. Z0H = Z0HC
  841. Z = ZA - ZDC
  842. XXX = 0.4*9.81*Z*TST/TA/UST/UST
  843. IF ( XXX >= 1. ) XXX = 1.
  844. IF ( XXX <= -5. ) XXX = -5.
  845. IF ( XXX > 0 ) THEN
  846. PSIM = -5. * XXX
  847. PSIH = -5. * XXX
  848. ELSE
  849. X = (1.-16.*XXX)**0.25
  850. PSIM = 2.*ALOG((1.+X)/2.) + ALOG((1.+X*X)/2.) - 2.*ATAN(X) + PI/2.
  851. PSIH = 2.*ALOG((1.+X*X)/2.)
  852. END IF
  853. GZ1OZ0 = ALOG(Z/Z0)
  854. CD = 0.4**2./(ALOG(Z/Z0)-PSIM)**2.
  855. !
  856. !m CH = 0.4**2./(ALOG(Z/Z0)-PSIM)/(ALOG(Z/Z0H)-PSIH)
  857. !m CHS = 0.4*UST/(ALOG(Z/Z0H)-PSIH)
  858. !m TS = TA + FLXTH/CH/UA ! surface potential temp (flux temp)
  859. !m QS = QA + FLXHUM/CH/UA ! surface humidity
  860. !
  861. TS = TA + FLXTH/CHS ! surface potential temp (flux temp)
  862. QS = QA + FLXHUM/CHS ! surface humidity
  863. !-------------------------------------------------------
  864. ! diagnostic GRID AVERAGED U10 V10 TH2 Q2 --> WRF
  865. !-------------------------------------------------------
  866. XXX2 = (2./Z)*XXX
  867. IF ( XXX2 >= 1. ) XXX2 = 1.
  868. IF ( XXX2 <= -5. ) XXX2 = -5.
  869. IF ( XXX2 > 0 ) THEN
  870. PSIM2 = -5. * XXX2
  871. PSIH2 = -5. * XXX2
  872. ELSE
  873. X = (1.-16.*XXX2)**0.25
  874. PSIM2 = 2.*ALOG((1.+X)/2.) + ALOG((1.+X*X)/2.) - 2.*ATAN(X) + 2.*ATAN(1.)
  875. PSIH2 = 2.*ALOG((1.+X*X)/2.)
  876. END IF
  877. !
  878. !m CHS2 = 0.4*UST/(ALOG(2./Z0H)-PSIH2)
  879. !
  880. XXX10 = (10./Z)*XXX
  881. IF ( XXX10 >= 1. ) XXX10 = 1.
  882. IF ( XXX10 <= -5. ) XXX10 = -5.
  883. IF ( XXX10 > 0 ) THEN
  884. PSIM10 = -5. * XXX10
  885. PSIH10 = -5. * XXX10
  886. ELSE
  887. X = (1.-16.*XXX10)**0.25
  888. PSIM10 = 2.*ALOG((1.+X)/2.) + ALOG((1.+X*X)/2.) - 2.*ATAN(X) + 2.*ATAN(1.)
  889. PSIH10 = 2.*ALOG((1.+X*X)/2.)
  890. END IF
  891. PSIX = ALOG(Z/Z0) - PSIM
  892. PSIT = ALOG(Z/Z0H) - PSIH
  893. PSIX2 = ALOG(2./Z0) - PSIM2
  894. PSIT2 = ALOG(2./Z0H) - PSIH2
  895. PSIX10 = ALOG(10./Z0) - PSIM10
  896. PSIT10 = ALOG(10./Z0H) - PSIH10
  897. U10 = U1 * (PSIX10/PSIX) ! u at 10 m [m/s]
  898. V10 = V1 * (PSIX10/PSIX) ! v at 10 m [m/s]
  899. ! TH2 = TS + (TA-TS)*(PSIT2/PSIT) ! potential temp at 2 m [K]
  900. ! TH2 = TS + (TA-TS)*(PSIT2/PSIT) ! Fei: this seems to be temp (not potential) at 2 m [K]
  901. !Fei: consistant with M-O theory
  902. TH2 = TS + (TA-TS) *(CHS/CHS2)
  903. Q2 = QS + (QA-QS)*(PSIT2/PSIT) ! humidity at 2 m [-]
  904. ! TS = (LW/SIG_SI/0.88)**0.25 ! Radiative temperature [K]
  905. END SUBROUTINE urban
  906. !===============================================================================
  907. !
  908. ! mos
  909. !
  910. !===============================================================================
  911. SUBROUTINE mos(XXX,ALPHA,CD,B1,RIB,Z,Z0,UA,TA,TSF,RHO)
  912. ! XXX: z/L (requires iteration by Newton-Rapson method)
  913. ! B1: Stanton number
  914. ! PSIM: = PSIX of LSM
  915. ! PSIH: = PSIT of LSM
  916. IMPLICIT NONE
  917. REAL, PARAMETER :: CP=0.24
  918. REAL, INTENT(IN) :: B1, Z, Z0, UA, TA, TSF, RHO
  919. REAL, INTENT(OUT) :: ALPHA, CD
  920. REAL, INTENT(INOUT) :: XXX, RIB
  921. REAL :: XXX0, X, X0, FAIH, DPSIM, DPSIH
  922. REAL :: F, DF, XXXP, US, TS, AL, XKB, DD, PSIM, PSIH
  923. INTEGER :: NEWT
  924. INTEGER, PARAMETER :: NEWT_END=10
  925. IF(RIB <= -15.) RIB=-15.
  926. IF(RIB < 0.) THEN
  927. DO NEWT=1,NEWT_END
  928. IF(XXX >= 0.) XXX=-1.E-3
  929. XXX0=XXX*Z0/(Z+Z0)
  930. X=(1.-16.*XXX)**0.25
  931. X0=(1.-16.*XXX0)**0.25
  932. PSIM=ALOG((Z+Z0)/Z0) &
  933. -ALOG((X+1.)**2.*(X**2.+1.)) &
  934. +2.*ATAN(X) &
  935. +ALOG((X+1.)**2.*(X0**2.+1.)) &
  936. -2.*ATAN(X0)
  937. FAIH=1./SQRT(1.-16.*XXX)
  938. PSIH=ALOG((Z+Z0)/Z0)+0.4*B1 &
  939. -2.*ALOG(SQRT(1.-16.*XXX)+1.) &
  940. +2.*ALOG(SQRT(1.-16.*XXX0)+1.)
  941. DPSIM=(1.-16.*XXX)**(-0.25)/XXX &
  942. -(1.-16.*XXX0)**(-0.25)/XXX
  943. DPSIH=1./SQRT(1.-16.*XXX)/XXX &
  944. -1./SQRT(1.-16.*XXX0)/XXX
  945. F=RIB*PSIM**2./PSIH-XXX
  946. DF=RIB*(2.*DPSIM*PSIM*PSIH-DPSIH*PSIM**2.) &
  947. /PSIH**2.-1.
  948. XXXP=XXX
  949. XXX=XXXP-F/DF
  950. IF(XXX <= -10.) XXX=-10.
  951. END DO
  952. ELSE IF(RIB >= 0.142857) THEN
  953. XXX=0.714
  954. PSIM=ALOG((Z+Z0)/Z0)+7.*XXX
  955. PSIH=PSIM+0.4*B1
  956. ELSE
  957. AL=ALOG((Z+Z0)/Z0)
  958. XKB=0.4*B1
  959. DD=-4.*RIB*7.*XKB*AL+(AL+XKB)**2.
  960. IF(DD <= 0.) DD=0.
  961. XXX=(AL+XKB-2.*RIB*7.*AL-SQRT(DD))/(2.*(RIB*7.**2-7.))
  962. PSIM=ALOG((Z+Z0)/Z0)+7.*MIN(XXX,0.714)
  963. PSIH=PSIM+0.4*B1
  964. END IF
  965. US=0.4*UA/PSIM ! u*
  966. IF(US <= 0.01) US=0.01
  967. TS=0.4*(TA-TSF)/PSIH ! T*
  968. CD=US*US/UA**2. ! CD
  969. ALPHA=RHO*CP*0.4*US/PSIH ! RHO*CP*CH*U
  970. RETURN
  971. END SUBROUTINE mos
  972. !===============================================================================
  973. !
  974. ! louis79
  975. !
  976. !===============================================================================
  977. SUBROUTINE louis79(ALPHA,CD,RIB,Z,Z0,UA,RHO)
  978. IMPLICIT NONE
  979. REAL, PARAMETER :: CP=0.24
  980. REAL, INTENT(IN) :: Z, Z0, UA, RHO
  981. REAL, INTENT(OUT) :: ALPHA, CD
  982. REAL, INTENT(INOUT) :: RIB
  983. REAL :: A2, XX, CH, CMB, CHB
  984. A2=(0.4/ALOG(Z/Z0))**2.
  985. IF(RIB <= -15.) RIB=-15.
  986. IF(RIB >= 0.0) THEN
  987. IF(RIB >= 0.142857) THEN
  988. XX=0.714
  989. ELSE
  990. XX=RIB*LOG(Z/Z0)/(1.-7.*RIB)
  991. END IF
  992. CH=0.16/0.74/(LOG(Z/Z0)+7.*MIN(XX,0.714))**2.
  993. CD=0.16/(LOG(Z/Z0)+7.*MIN(XX,0.714))**2.
  994. ELSE
  995. CMB=7.4*A2*9.4*SQRT(Z/Z0)
  996. CHB=5.3*A2*9.4*SQRT(Z/Z0)
  997. CH=A2/0.74*(1.-9.4*RIB/(1.+CHB*SQRT(-RIB)))
  998. CD=A2*(1.-9.4*RIB/(1.+CHB*SQRT(-RIB)))
  999. END IF
  1000. ALPHA=RHO*CP*CH*UA
  1001. RETURN
  1002. END SUBROUTINE louis79
  1003. !===============================================================================
  1004. !
  1005. ! louis82
  1006. !
  1007. !===============================================================================
  1008. SUBROUTINE louis82(ALPHA,CD,RIB,Z,Z0,UA,RHO)
  1009. IMPLICIT NONE
  1010. REAL, PARAMETER :: CP=0.24
  1011. REAL, INTENT(IN) :: Z, Z0, UA, RHO
  1012. REAL, INTENT(OUT) :: ALPHA, CD
  1013. REAL, INTENT(INOUT) :: RIB
  1014. REAL :: A2, FM, FH, CH, CHH
  1015. A2=(0.4/ALOG(Z/Z0))**2.
  1016. IF(RIB <= -15.) RIB=-15.
  1017. IF(RIB >= 0.0) THEN
  1018. FM=1./((1.+(2.*5.*RIB)/SQRT(1.+5.*RIB)))
  1019. FH=1./(1.+(3.*5.*RIB)*SQRT(1.+5.*RIB))
  1020. CH=A2*FH
  1021. CD=A2*FM
  1022. ELSE
  1023. CHH=5.*3.*5.*A2*SQRT(Z/Z0)
  1024. FM=1.-(2.*5.*RIB)/(1.+3.*5.*5.*A2*SQRT(Z/Z0+1.)*(-RIB))
  1025. FH=1.-(3.*5.*RIB)/(1.+CHH*SQRT(-RIB))
  1026. CH=A2*FH
  1027. CD=A2*FM
  1028. END IF
  1029. ALPHA=RHO*CP*CH*UA
  1030. RETURN
  1031. END SUBROUTINE louis82
  1032. !===============================================================================
  1033. !
  1034. ! multi_layer
  1035. !
  1036. !===============================================================================
  1037. SUBROUTINE multi_layer(KM,BOUND,G0,CAP,AKS,TSL,DZ,DELT,TSLEND)
  1038. IMPLICIT NONE
  1039. REAL, INTENT(IN) :: G0
  1040. REAL, INTENT(IN) :: CAP
  1041. REAL, INTENT(IN) :: AKS
  1042. REAL, INTENT(IN) :: DELT ! Time step [ s ]
  1043. REAL, INTENT(IN) :: TSLEND
  1044. INTEGER, INTENT(IN) :: KM
  1045. INTEGER, INTENT(IN) :: BOUND
  1046. REAL, DIMENSION(KM), INTENT(IN) :: DZ
  1047. REAL, DIMENSION(KM), INTENT(INOUT) :: TSL
  1048. REAL, DIMENSION(KM) :: A, B, C, D, X, P, Q
  1049. REAL :: DZEND
  1050. INTEGER :: K
  1051. DZEND=DZ(KM)
  1052. A(1) = 0.0
  1053. B(1) = CAP*DZ(1)/DELT &
  1054. +2.*AKS/(DZ(1)+DZ(2))
  1055. C(1) = -2.*AKS/(DZ(1)+DZ(2))
  1056. D(1) = CAP*DZ(1)/DELT*TSL(1) + G0
  1057. DO K=2,KM-1
  1058. A(K) = -2.*AKS/(DZ(K-1)+DZ(K))
  1059. B(K) = CAP*DZ(K)/DELT + 2.*AKS/(DZ(K-1)+DZ(K)) + 2.*AKS/(DZ(K)+DZ(K+1))
  1060. C(K) = -2.*AKS/(DZ(K)+DZ(K+1))
  1061. D(K) = CAP*DZ(K)/DELT*TSL(K)
  1062. END DO
  1063. IF(BOUND == 1) THEN ! Flux=0
  1064. A(KM) = -2.*AKS/(DZ(KM-1)+DZ(KM))
  1065. B(KM) = CAP*DZ(KM)/DELT + 2.*AKS/(DZ(KM-1)+DZ(KM))
  1066. C(KM) = 0.0
  1067. D(KM) = CAP*DZ(KM)/DELT*TSL(KM)
  1068. ELSE ! T=constant
  1069. A(KM) = -2.*AKS/(DZ(KM-1)+DZ(KM))
  1070. B(KM) = CAP*DZ(KM)/DELT + 2.*AKS/(DZ(KM-1)+DZ(KM)) + 2.*AKS/(DZ(KM)+DZEND)
  1071. C(KM) = 0.0
  1072. D(KM) = CAP*DZ(KM)/DELT*TSL(KM) + 2.*AKS*TSLEND/(DZ(KM)+DZEND)
  1073. END IF
  1074. P(1) = -C(1)/B(1)
  1075. Q(1) = D(1)/B(1)
  1076. DO K=2,KM
  1077. P(K) = -C(K)/(A(K)*P(K-1)+B(K))
  1078. Q(K) = (-A(K)*Q(K-1)+D(K))/(A(K)*P(K-1)+B(K))
  1079. END DO
  1080. X(KM) = Q(KM)
  1081. DO K=KM-1,1,-1
  1082. X(K) = P(K)*X(K+1)+Q(K)
  1083. END DO
  1084. DO K=1,KM
  1085. TSL(K) = X(K)
  1086. END DO
  1087. RETURN
  1088. END SUBROUTINE multi_layer
  1089. !===============================================================================
  1090. !
  1091. ! subroutine read_param
  1092. !
  1093. !===============================================================================
  1094. SUBROUTINE read_param(UTYPE, & ! in
  1095. ZR,SIGMA_ZED,Z0C,Z0HC,ZDC,SVF,R,RW,HGT,AH, & ! out
  1096. CAPR,CAPB,CAPG,AKSR,AKSB,AKSG,ALBR,ALBB,ALBG, & ! out
  1097. EPSR,EPSB,EPSG,Z0R,Z0B,Z0G,Z0HB,Z0HG, & ! out
  1098. BETR,BETB,BETG,TRLEND,TBLEND,TGLEND, & ! out
  1099. !for BEP
  1100. NUMDIR, STREET_DIRECTION, STREET_WIDTH, & ! out
  1101. BUILDING_WIDTH, NUMHGT, HEIGHT_BIN, & ! out
  1102. HPERCENT_BIN, & ! out
  1103. !end BEP
  1104. BOUNDR,BOUNDB,BOUNDG,CH_SCHEME,TS_SCHEME, & ! out
  1105. AKANDA_URBAN) ! out
  1106. INTEGER, INTENT(IN) :: UTYPE
  1107. REAL, INTENT(OUT) :: ZR,Z0C,Z0HC,ZDC,SVF,R,RW,HGT,AH, &
  1108. CAPR,CAPB,CAPG,AKSR,AKSB,AKSG,ALBR,ALBB,ALBG, &
  1109. SIGMA_ZED, &
  1110. EPSR,EPSB,EPSG,Z0R,Z0B,Z0G,Z0HB,Z0HG, &
  1111. BETR,BETB,BETG,TRLEND,TBLEND,TGLEND
  1112. REAL, INTENT(OUT) :: AKANDA_URBAN
  1113. !for BEP
  1114. INTEGER, INTENT(OUT) :: NUMDIR
  1115. REAL, DIMENSION(MAXDIRS), INTENT(OUT) :: STREET_DIRECTION
  1116. REAL, DIMENSION(MAXDIRS), INTENT(OUT) :: STREET_WIDTH
  1117. REAL, DIMENSION(MAXDIRS), INTENT(OUT) :: BUILDING_WIDTH
  1118. INTEGER, INTENT(OUT) :: NUMHGT
  1119. REAL, DIMENSION(MAXHGTS), INTENT(OUT) :: HEIGHT_BIN
  1120. REAL, DIMENSION(MAXHGTS), INTENT(OUT) :: HPERCENT_BIN
  1121. !end BEP
  1122. INTEGER, INTENT(OUT) :: BOUNDR,BOUNDB,BOUNDG,CH_SCHEME,TS_SCHEME
  1123. ZR = ZR_TBL(UTYPE)
  1124. SIGMA_ZED = SIGMA_ZED_TBL(UTYPE)
  1125. Z0C= Z0C_TBL(UTYPE)
  1126. Z0HC= Z0HC_TBL(UTYPE)
  1127. ZDC= ZDC_TBL(UTYPE)
  1128. SVF= SVF_TBL(UTYPE)
  1129. R= R_TBL(UTYPE)
  1130. RW= RW_TBL(UTYPE)
  1131. HGT= HGT_TBL(UTYPE)
  1132. AH= AH_TBL(UTYPE)
  1133. BETR= BETR_TBL(UTYPE)
  1134. BETB= BETB_TBL(UTYPE)
  1135. BETG= BETG_TBL(UTYPE)
  1136. !m FRC_URB= FRC_URB_TBL(UTYPE)
  1137. CAPR= CAPR_TBL(UTYPE)
  1138. CAPB= CAPB_TBL(UTYPE)
  1139. CAPG= CAPG_TBL(UTYPE)
  1140. AKSR= AKSR_TBL(UTYPE)
  1141. AKSB= AKSB_TBL(UTYPE)
  1142. AKSG= AKSG_TBL(UTYPE)
  1143. ALBR= ALBR_TBL(UTYPE)
  1144. ALBB= ALBB_TBL(UTYPE)
  1145. ALBG= ALBG_TBL(UTYPE)
  1146. EPSR= EPSR_TBL(UTYPE)
  1147. EPSB= EPSB_TBL(UTYPE)
  1148. EPSG= EPSG_TBL(UTYPE)
  1149. Z0R= Z0R_TBL(UTYPE)
  1150. Z0B= Z0B_TBL(UTYPE)
  1151. Z0G= Z0G_TBL(UTYPE)
  1152. Z0HB= Z0HB_TBL(UTYPE)
  1153. Z0HG= Z0HG_TBL(UTYPE)
  1154. TRLEND= TRLEND_TBL(UTYPE)
  1155. TBLEND= TBLEND_TBL(UTYPE)
  1156. TGLEND= TGLEND_TBL(UTYPE)
  1157. BOUNDR= BOUNDR_DATA
  1158. BOUNDB= BOUNDB_DATA
  1159. BOUNDG= BOUNDG_DATA
  1160. CH_SCHEME = CH_SCHEME_DATA
  1161. TS_SCHEME = TS_SCHEME_DATA
  1162. AKANDA_URBAN = AKANDA_URBAN_TBL(UTYPE)
  1163. !for BEP
  1164. STREET_DIRECTION = -1.E36
  1165. STREET_WIDTH = -1.E36
  1166. BUILDING_WIDTH = -1.E36
  1167. HEIGHT_BIN = -1.E36
  1168. HPERCENT_BIN = -1.E36
  1169. NUMDIR = NUMDIR_TBL ( UTYPE )
  1170. STREET_DIRECTION(1:NUMDIR) = STREET_DIRECTION_TBL( 1:NUMDIR, UTYPE )
  1171. STREET_WIDTH (1:NUMDIR) = STREET_WIDTH_TBL ( 1:NUMDIR, UTYPE )
  1172. BUILDING_WIDTH (1:NUMDIR) = BUILDING_WIDTH_TBL ( 1:NUMDIR, UTYPE )
  1173. NUMHGT = NUMHGT_TBL ( UTYPE )
  1174. HEIGHT_BIN (1:NUMHGT) = HEIGHT_BIN_TBL ( 1:NUMHGT , UTYPE )
  1175. HPERCENT_BIN (1:NUMHGT) = HPERCENT_BIN_TBL ( 1:NUMHGT , UTYPE )
  1176. !end BEP
  1177. END SUBROUTINE read_param
  1178. !===============================================================================
  1179. !
  1180. ! subroutine urban_param_init: Read parameters from URBPARM.TBL
  1181. !
  1182. !===============================================================================
  1183. SUBROUTINE urban_param_init(DZR,DZB,DZG,num_soil_layers, &
  1184. sf_urban_physics)
  1185. ! num_roof_layers,num_wall_layers,num_road_layers)
  1186. IMPLICIT NONE
  1187. INTEGER, INTENT(IN) :: num_soil_layers
  1188. ! REAL, DIMENSION(1:num_roof_layers), INTENT(INOUT) :: DZR
  1189. ! REAL, DIMENSION(1:num_wall_layers), INTENT(INOUT) :: DZB
  1190. ! REAL, DIMENSION(1:num_road_layers), INTENT(INOUT) :: DZG
  1191. REAL, DIMENSION(1:num_soil_layers), INTENT(INOUT) :: DZR
  1192. REAL, DIMENSION(1:num_soil_layers), INTENT(INOUT) :: DZB
  1193. REAL, DIMENSION(1:num_soil_layers), INTENT(INOUT) :: DZG
  1194. INTEGER, INTENT(IN) :: SF_URBAN_PHYSICS
  1195. INTEGER :: LC, K
  1196. INTEGER :: IOSTATUS, ALLOCATE_STATUS
  1197. INTEGER :: num_roof_layers
  1198. INTEGER :: num_wall_layers
  1199. INTEGER :: num_road_layers
  1200. INTEGER :: dummy
  1201. REAL :: DHGT, HGT, VFWS, VFGS
  1202. REAL, allocatable, dimension(:) :: ROOF_WIDTH
  1203. REAL, allocatable, dimension(:) :: ROAD_WIDTH
  1204. character(len=512) :: string
  1205. character(len=128) :: name
  1206. integer :: indx
  1207. real, parameter :: VonK = 0.4
  1208. real :: lambda_p
  1209. real :: lambda_f
  1210. real :: Cd
  1211. real :: alpha_macd
  1212. real :: beta_macd
  1213. real :: lambda_fr
  1214. !for BEP
  1215. real :: dummy_hgt
  1216. real :: dummy_pct
  1217. real :: pctsum
  1218. !end BEP
  1219. num_roof_layers = num_soil_layers
  1220. num_wall_layers = num_soil_layers
  1221. num_road_layers = num_soil_layers
  1222. ICATE=0
  1223. OPEN (UNIT=11, &
  1224. FILE='URBPARM.TBL', &
  1225. ACCESS='SEQUENTIAL', &
  1226. STATUS='OLD', &
  1227. ACTION='READ', &
  1228. POSITION='REWIND', &
  1229. IOSTAT=IOSTATUS)
  1230. IF (IOSTATUS > 0) THEN
  1231. CALL wrf_error_fatal('ERROR OPEN URBPARM.TBL')
  1232. ENDIF
  1233. READLOOP : do
  1234. read(11,'(A512)', iostat=iostatus) string
  1235. if (iostatus /= 0) exit READLOOP
  1236. if (string(1:1) == "#") cycle READLOOP
  1237. if (trim(string) == "") cycle READLOOP
  1238. indx = index(string,":")
  1239. if (indx <= 0) cycle READLOOP
  1240. name = trim(adjustl(string(1:indx-1)))
  1241. ! Here are the variables we expect to be defined in the URBPARM.TBL:
  1242. if (name == "Number of urban categories") then
  1243. read(string(indx+1:),*) icate
  1244. IF (.not. ALLOCATED(ZR_TBL)) then
  1245. ALLOCATE( ZR_TBL(ICATE), stat=allocate_status )
  1246. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ZR_TBL in urban_param_init')
  1247. ALLOCATE( SIGMA_ZED_TBL(ICATE), stat=allocate_status )
  1248. if(allocate_status /= 0)CALL wrf_error_fatal('Error allocating SIGMA_ZED_TBL in urban_param_init')
  1249. ALLOCATE( Z0C_TBL(ICATE), stat=allocate_status )
  1250. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating Z0C_TBL in urban_param_init')
  1251. ALLOCATE( Z0HC_TBL(ICATE), stat=allocate_status )
  1252. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating Z0HC_TBL in urban_param_init')
  1253. ALLOCATE( ZDC_TBL(ICATE), stat=allocate_status )
  1254. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ZDC_TBL in urban_param_init')
  1255. ALLOCATE( SVF_TBL(ICATE), stat=allocate_status )
  1256. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating SVF_TBL in urban_param_init')
  1257. ALLOCATE( R_TBL(ICATE), stat=allocate_status )
  1258. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating R_TBL in urban_param_init')
  1259. ALLOCATE( RW_TBL(ICATE), stat=allocate_status )
  1260. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating RW_TBL in urban_param_init')
  1261. ALLOCATE( HGT_TBL(ICATE), stat=allocate_status )
  1262. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating HGT_TBL in urban_param_init')
  1263. ALLOCATE( AH_TBL(ICATE), stat=allocate_status )
  1264. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating AH_TBL in urban_param_init')
  1265. ALLOCATE( BETR_TBL(ICATE), stat=allocate_status )
  1266. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating BETR_TBL in urban_param_init')
  1267. ALLOCATE( BETB_TBL(ICATE), stat=allocate_status )
  1268. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating BETB_TBL in urban_param_init')
  1269. ALLOCATE( BETG_TBL(ICATE), stat=allocate_status )
  1270. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating BETG_TBL in urban_param_init')
  1271. ALLOCATE( CAPR_TBL(ICATE), stat=allocate_status )
  1272. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating CAPR_TBL in urban_param_init')
  1273. ALLOCATE( CAPB_TBL(ICATE), stat=allocate_status )
  1274. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating CAPB_TBL in urban_param_init')
  1275. ALLOCATE( CAPG_TBL(ICATE), stat=allocate_status )
  1276. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating CAPG_TBL in urban_param_init')
  1277. ALLOCATE( AKSR_TBL(ICATE), stat=allocate_status )
  1278. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating AKSR_TBL in urban_param_init')
  1279. ALLOCATE( AKSB_TBL(ICATE), stat=allocate_status )
  1280. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating AKSB_TBL in urban_param_init')
  1281. ALLOCATE( AKSG_TBL(ICATE), stat=allocate_status )
  1282. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating AKSG_TBL in urban_param_init')
  1283. ALLOCATE( ALBR_TBL(ICATE), stat=allocate_status )
  1284. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ALBR_TBL in urban_param_init')
  1285. ALLOCATE( ALBB_TBL(ICATE), stat=allocate_status )
  1286. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ALBB_TBL in urban_param_init')
  1287. ALLOCATE( ALBG_TBL(ICATE), stat=allocate_status )
  1288. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ALBG_TBL in urban_param_init')
  1289. ALLOCATE( EPSR_TBL(ICATE), stat=allocate_status )
  1290. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating EPSR_TBL in urban_param_init')
  1291. ALLOCATE( EPSB_TBL(ICATE), stat=allocate_status )
  1292. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating EPSB_TBL in urban_param_init')
  1293. ALLOCATE( EPSG_TBL(ICATE), stat=allocate_status )
  1294. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating EPSG_TBL in urban_param_init')
  1295. ALLOCATE( Z0R_TBL(ICATE), stat=allocate_status )
  1296. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating Z0R_TBL in urban_param_init')
  1297. ALLOCATE( Z0B_TBL(ICATE), stat=allocate_status )
  1298. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating Z0B_TBL in urban_param_init')
  1299. ALLOCATE( Z0G_TBL(ICATE), stat=allocate_status )
  1300. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating Z0G_TBL in urban_param_init')
  1301. ALLOCATE( AKANDA_URBAN_TBL(ICATE), stat=allocate_status )
  1302. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating AKANDA_URBAN_TBL in urban_param_init')
  1303. ALLOCATE( Z0HB_TBL(ICATE), stat=allocate_status )
  1304. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating Z0HB_TBL in urban_param_init')
  1305. ALLOCATE( Z0HG_TBL(ICATE), stat=allocate_status )
  1306. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating Z0HG_TBL in urban_param_init')
  1307. ALLOCATE( TRLEND_TBL(ICATE), stat=allocate_status )
  1308. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating TRLEND_TBL in urban_param_init')
  1309. ALLOCATE( TBLEND_TBL(ICATE), stat=allocate_status )
  1310. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating TBLEND_TBL in urban_param_init')
  1311. ALLOCATE( TGLEND_TBL(ICATE), stat=allocate_status )
  1312. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating TGLEND_TBL in urban_param_init')
  1313. ALLOCATE( FRC_URB_TBL(ICATE), stat=allocate_status )
  1314. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating FRC_URB_TBL in urban_param_init')
  1315. ! ALLOCATE( ROOF_WIDTH(ICATE), stat=allocate_status )
  1316. ! if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ROOF_WIDTH in urban_param_init')
  1317. ! ALLOCATE( ROAD_WIDTH(ICATE), stat=allocate_status )
  1318. ! if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ROAD_WIDTH in urban_param_init')
  1319. !for BEP
  1320. ALLOCATE( NUMDIR_TBL(ICATE), stat=allocate_status )
  1321. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating NUMDIR_TBL in urban_param_init')
  1322. ALLOCATE( STREET_DIRECTION_TBL(MAXDIRS , ICATE), stat=allocate_status )
  1323. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating STREET_DIRECTION_TBL in urban_param_init')
  1324. ALLOCATE( STREET_WIDTH_TBL(MAXDIRS , ICATE), stat=allocate_status )
  1325. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating STREET_WIDTH_TBL in urban_param_init')
  1326. ALLOCATE( BUILDING_WIDTH_TBL(MAXDIRS , ICATE), stat=allocate_status )
  1327. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating BUILDING_WIDTH_TBL in urban_param_init')
  1328. ALLOCATE( NUMHGT_TBL(ICATE), stat=allocate_status )
  1329. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating NUMHGT_TBL in urban_param_init')
  1330. ALLOCATE( HEIGHT_BIN_TBL(MAXHGTS , ICATE), stat=allocate_status )
  1331. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating HEIGHT_BIN_TBL in urban_param_init')
  1332. ALLOCATE( HPERCENT_BIN_TBL(MAXHGTS , ICATE), stat=allocate_status )
  1333. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating HPERCENT_BIN_TBL in urban_param_init')
  1334. ALLOCATE( COP_TBL(ICATE), stat=allocate_status )
  1335. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating COP_TBL in urban_param_init')
  1336. ALLOCATE( PWIN_TBL(ICATE), stat=allocate_status )
  1337. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating PWIN_TBL in urban_param_init')
  1338. ALLOCATE( BETA_TBL(ICATE), stat=allocate_status )
  1339. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating BETA_TBL in urban_param_init')
  1340. ALLOCATE( SW_COND_TBL(ICATE), stat=allocate_status )
  1341. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating SW_COND_TBL in urban_param_init')
  1342. ALLOCATE( TIME_ON_TBL(ICATE), stat=allocate_status )
  1343. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating TIME_ON_TBL in urban_param_init')
  1344. ALLOCATE( TIME_OFF_TBL(ICATE), stat=allocate_status )
  1345. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating TIME_OFF_TBL in urban_param_init')
  1346. ALLOCATE( TARGTEMP_TBL(ICATE), stat=allocate_status )
  1347. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating TARGTEMP_TBL in urban_param_init')
  1348. ALLOCATE( GAPTEMP_TBL(ICATE), stat=allocate_status )
  1349. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating GAPTEMP_TBL in urban_param_init')
  1350. ALLOCATE( TARGHUM_TBL(ICATE), stat=allocate_status )
  1351. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating TARGHUM_TBL in urban_param_init')
  1352. ALLOCATE( GAPHUM_TBL(ICATE), stat=allocate_status )
  1353. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating GAPHUM_TBL in urban_param_init')
  1354. ALLOCATE( PERFLO_TBL(ICATE), stat=allocate_status )
  1355. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating PERFLO_TBL in urban_param_init')
  1356. ALLOCATE( HSESF_TBL(ICATE), stat=allocate_status )
  1357. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating HSESF_TBL in urban_param_init')
  1358. endif
  1359. numdir_tbl = 0
  1360. street_direction_tbl = -1.E36
  1361. street_width_tbl = 0
  1362. building_width_tbl = 0
  1363. numhgt_tbl = 0
  1364. height_bin_tbl = -1.E36
  1365. hpercent_bin_tbl = -1.E36
  1366. !end BEP
  1367. else if (name == "ZR") then
  1368. read(string(indx+1:),*) zr_tbl(1:icate)
  1369. else if (name == "SIGMA_ZED") then
  1370. read(string(indx+1:),*) sigma_zed_tbl(1:icate)
  1371. else if (name == "ROOF_WIDTH") then
  1372. ALLOCATE( ROOF_WIDTH(ICATE), stat=allocate_status )
  1373. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ROOF_WIDTH in urban_param_init')
  1374. read(string(indx+1:),*) roof_width(1:icate)
  1375. else if (name == "ROAD_WIDTH") then
  1376. ALLOCATE( ROAD_WIDTH(ICATE), stat=allocate_status )
  1377. if(allocate_status /= 0) CALL wrf_error_fatal('Error allocating ROAD_WIDTH in urban_param_init')
  1378. read(string(indx+1:),*) road_width(1:icate)
  1379. else if (name == "AH") then
  1380. read(string(indx+1:),*) ah_tbl(1:icate)
  1381. else if (name == "FRC_URB") then
  1382. read(string(indx+1:),*) frc_urb_tbl(1:icate)
  1383. else if (name == "CAPR") then
  1384. read(string(indx+1:),*) capr_tbl(1:icate)
  1385. ! Convert CAPR_TBL from J m{-3} K{-1} to cal cm{-3} deg{-1}
  1386. capr_tbl = capr_tbl * ( 1.0 / 4.1868 ) * 1.E-6
  1387. else if (name == "CAPB") then
  1388. read(string(indx+1:),*) capb_tbl(1:icate)
  1389. ! Convert CABR_TBL from J m{-3} K{-1} to cal cm{-3} deg{-1}
  1390. capb_tbl = capb_tbl * ( 1.0 / 4.1868 ) * 1.E-6
  1391. else if (name == "CAPG") then
  1392. read(string(indx+1:),*) capg_tbl(1:icate)
  1393. ! Convert CABG_TBL from J m{-3} K{-1} to cal cm{-3} deg{-1}
  1394. capg_tbl = capg_tbl * ( 1.0 / 4.1868 ) * 1.E-6
  1395. else if (name == "AKSR") then
  1396. read(string(indx+1:),*) aksr_tbl(1:icate)
  1397. ! Convert AKSR_TBL from J m{-1} s{-1} K{-1} to cal cm{-1} s{-1} deg{-1}
  1398. AKSR_TBL = AKSR_TBL * ( 1.0 / 4.1868 ) * 1.E-2
  1399. else if (name == "AKSB") then
  1400. read(string(indx+1:),*) aksb_tbl(1:icate)
  1401. ! Convert AKSB_TBL from J m{-1} s{-1} K{-1} to cal cm{-1} s{-1} deg{-1}
  1402. AKSB_TBL = AKSB_TBL * ( 1.0 / 4.1868 ) * 1.E-2
  1403. else if (name == "AKSG") then
  1404. read(string(indx+1:),*) aksg_tbl(1:icate)
  1405. ! Convert AKSG_TBL from J m{-1} s{-1} K{-1} to cal cm{-1} s{-1} deg{-1}
  1406. AKSG_TBL = AKSG_TBL * ( 1.0 / 4.1868 ) * 1.E-2
  1407. else if (name == "ALBR") then
  1408. read(string(indx+1:),*) albr_tbl(1:icate)
  1409. else if (name == "ALBB") then
  1410. read(string(indx+1:),*) albb_tbl(1:icate)
  1411. else if (name == "ALBG") then
  1412. read(string(indx+1:),*) albg_tbl(1:icate)
  1413. else if (name == "EPSR") then
  1414. read(string(indx+1:),*) epsr_tbl(1:icate)
  1415. else if (name == "EPSB") then
  1416. read(string(indx+1:),*) epsb_tbl(1:icate)
  1417. else if (name == "EPSG") then
  1418. read(string(indx+1:),*) epsg_tbl(1:icate)
  1419. else if (name == "AKANDA_URBAN") then
  1420. read(string(indx+1:),*) akanda_urban_tbl(1:icate)
  1421. else if (name == "Z0B") then
  1422. read(string(indx+1:),*) z0b_tbl(1:icate)
  1423. else if (name == "Z0G") then
  1424. read(string(indx+1:),*) z0g_tbl(1:icate)
  1425. else if (name == "DDZR") then
  1426. read(string(indx+1:),*) dzr(1:num_roof_layers)
  1427. ! Convert thicknesses from m to cm
  1428. dzr = dzr * 100.0
  1429. else if (name == "DDZB") then
  1430. read(string(indx+1:),*) dzb(1:num_wall_layers)
  1431. ! Convert thicknesses from m to cm
  1432. dzb = dzb * 100.0
  1433. else if (name == "DDZG") then
  1434. read(string(indx+1:),*) dzg(1:num_road_layers)
  1435. ! Convert thicknesses from m to cm
  1436. dzg = dzg * 100.0
  1437. else if (name == "BOUNDR") then
  1438. read(string(indx+1:),*) boundr_data
  1439. else if (name == "BOUNDB") then
  1440. read(string(indx+1:),*) boundb_data
  1441. else if (name == "BOUNDG") then
  1442. read(string(indx+1:),*) boundg_data
  1443. else if (name == "TRLEND") then
  1444. read(string(indx+1:),*) trlend_tbl(1:icate)
  1445. else if (name == "TBLEND") then
  1446. read(string(indx+1:),*) tblend_tbl(1:icate)
  1447. else if (name == "TGLEND") then
  1448. read(string(indx+1:),*) tglend_tbl(1:icate)
  1449. else if (name == "CH_SCHEME") then
  1450. read(string(indx+1:),*) ch_scheme_data
  1451. else if (name == "TS_SCHEME") then
  1452. read(string(indx+1:),*) ts_scheme_data
  1453. else if (name == "AHOPTION") then
  1454. read(string(indx+1:),*) ahoption
  1455. else if (name == "AHDIUPRF") then
  1456. read(string(indx+1:),*) ahdiuprf(1:24)
  1457. !for BEP
  1458. else if (name == "STREET PARAMETERS") then
  1459. STREETLOOP : do
  1460. read(11,'(A512)', iostat=iostatus) string
  1461. if (string(1:1) == "#") cycle STREETLOOP
  1462. if (trim(string) == "") cycle STREETLOOP
  1463. if (string == "END STREET PARAMETERS") exit STREETLOOP
  1464. read(string, *) k ! , dirst, ws, bs
  1465. numdir_tbl(k) = numdir_tbl(k) + 1
  1466. read(string, *) k, street_direction_tbl(numdir_tbl(k),k), &
  1467. street_width_tbl(numdir_tbl(k),k), &
  1468. building_width_tbl(numdir_tbl(k),k)
  1469. enddo STREETLOOP
  1470. else if (name == "BUILDING HEIGHTS") then
  1471. read(string(indx+1:),*) k
  1472. HEIGHTLOOP : do
  1473. read(11,'(A512)', iostat=iostatus) string
  1474. if (string(1:1) == "#") cycle HEIGHTLOOP
  1475. if (trim(string) == "") cycle HEIGHTLOOP
  1476. if (string == "END BUILDING HEIGHTS") exit HEIGHTLOOP
  1477. read(string,*) dummy_hgt, dummy_pct
  1478. numhgt_tbl(k) = numhgt_tbl(k) + 1
  1479. height_bin_tbl(numhgt_tbl(k), k) = dummy_hgt
  1480. hpercent_bin_tbl(numhgt_tbl(k),k) = dummy_pct
  1481. enddo HEIGHTLOOP
  1482. pctsum = sum ( hpercent_bin_tbl(:,k) , mask=(hpercent_bin_tbl(:,k)>-1.E25 ) )
  1483. if ( pctsum /= 100.) then
  1484. write (*,'(//,"Building height percentages for category ", I2, " must sum to 100.0")') k
  1485. write (*,'("Currently, they sum to ", F6.2,/)') pctsum
  1486. CALL wrf_error_fatal('pctsum is not equal to 100.')
  1487. endif
  1488. else if ( name == "Z0R") then
  1489. read(string(indx+1:),*) Z0R_tbl(1:icate)
  1490. else if ( name == "COP") then
  1491. read(string(indx+1:),*) cop_tbl(1:icate)
  1492. else if ( name == "PWIN") then
  1493. read(string(indx+1:),*) pwin_tbl(1:icate)
  1494. else if ( name == "BETA") then
  1495. read(string(indx+1:),*) beta_tbl(1:icate)
  1496. else if ( name == "SW_COND") then
  1497. read(string(indx+1:),*) sw_cond_tbl(1:icate)
  1498. else if ( name == "TIME_ON") then
  1499. read(string(indx+1:),*) time_on_tbl(1:icate)
  1500. else if ( name == "TIME_OFF") then
  1501. read(string(indx+1:),*) time_off_tbl(1:icate)
  1502. else if ( name == "TARGTEMP") then
  1503. read(string(indx+1:),*) targtemp_tbl(1:icate)
  1504. else if ( name == "GAPTEMP") then
  1505. read(string(indx+1:),*) gaptemp_tbl(1:icate)
  1506. else if ( name == "TARGHUM") then
  1507. read(string(indx+1:),*) targhum_tbl(1:icate)
  1508. else if ( name == "GAPHUM") then
  1509. read(string(indx+1:),*) gaphum_tbl(1:icate)
  1510. else if ( name == "PERFLO") then
  1511. read(string(indx+1:),*) perflo_tbl(1:icate)
  1512. else if (name == "HSEQUIP") then
  1513. read(string(indx+1:),*) hsequip_tbl(1:24)
  1514. else if (name == "HSEQUIP_SCALE_FACTOR") then
  1515. read(string(indx+1:),*) hsesf_tbl(1:icate)
  1516. !end BEP
  1517. else
  1518. CALL wrf_error_fatal('URBPARM.TBL: Unrecognized NAME = "'//trim(name)//'" in Subr URBAN_PARAM_INIT')
  1519. endif
  1520. enddo READLOOP
  1521. CLOSE(11)
  1522. ! Assign a few table values that do not need to come from URBPARM.TBL
  1523. Z0HB_TBL = 0.1 * Z0B_TBL
  1524. Z0HG_TBL = 0.1 * Z0G_TBL
  1525. DO LC = 1, ICATE
  1526. ! HGT: Normalized height
  1527. HGT_TBL(LC) = ZR_TBL(LC) / ( ROAD_WIDTH(LC) + ROOF_WIDTH(LC) )
  1528. ! R: Normalized Roof Width (a.k.a. "building coverage ratio")
  1529. R_TBL(LC) = ROOF_WIDTH(LC) / ( ROAD_WIDTH(LC) + ROOF_WIDTH(LC) )
  1530. RW_TBL(LC) = 1.0 - R_TBL(LC)
  1531. BETR_TBL(LC) = 0.0
  1532. BETB_TBL(LC) = 0.0
  1533. BETG_TBL(LC) = 0.0
  1534. ! The following urban canyon geometry parameters are following Macdonald's (1998) formulations
  1535. ! Lambda_P :: Plan areal fraction, which corresponds to R for a 2-d canyon.
  1536. ! Lambda_F :: Frontal area index, which corresponds to HGT for a 2-d canyon
  1537. ! Cd :: Drag coefficient ( 1.2 from Grimmond and Oke, 1998 )
  1538. ! Alpha_macd :: Emperical coefficient ( 4.43 from Macdonald et al., 1998 )
  1539. ! Beta_macd :: Correction factor for the drag coefficient ( 1.0 from Macdonald et al., 1998 )
  1540. Lambda_P = R_TBL(LC)
  1541. Lambda_F = HGT_TBL(LC)
  1542. Cd = 1.2
  1543. alpha_macd = 4.43
  1544. beta_macd = 1.0
  1545. ZDC_TBL(LC) = ZR_TBL(LC) * ( 1.0 + ( alpha_macd ** ( -Lambda_P ) ) * ( Lambda_P - 1.0 ) )
  1546. Z0C_TBL(LC) = ZR_TBL(LC) * ( 1.0 - ZDC_TBL(LC)/ZR_TBL(LC) ) * &
  1547. exp (-(0.5 * beta_macd * Cd / (VonK**2) * ( 1.0-ZDC_TBL(LC)/ZR_TBL(LC) ) * Lambda_F )**(-0.5))
  1548. IF (SF_URBAN_PHYSICS == 1) THEN
  1549. ! Include roof height variability in Macdonald
  1550. ! to parameterize Z0R as a function of ZR_SD (Standard Deviation)
  1551. Lambda_FR = SIGMA_ZED_TBL(LC) / ( ROAD_WIDTH(LC) + ROOF_WIDTH(LC) )
  1552. Z0R_TBL(LC) = ZR_TBL(LC) * ( 1.0 - ZDC_TBL(LC)/ZR_TBL(LC) ) &
  1553. * exp ( -(0.5 * beta_macd * Cd / (VonK**2) &
  1554. * ( 1.0-ZDC_TBL(LC)/ZR_TBL(LC) ) * Lambda_FR )**(-0.5))
  1555. ENDIF
  1556. !
  1557. ! Z0HC still one-tenth of Z0C, as before ?
  1558. !
  1559. Z0HC_TBL(LC) = 0.1 * Z0C_TBL(LC)
  1560. !
  1561. ! Calculate Sky View Factor:
  1562. !
  1563. DHGT=HGT_TBL(LC)/100.
  1564. HGT=0.
  1565. VFWS=0.
  1566. HGT=HGT_TBL(LC)-DHGT/2.
  1567. do k=1,99
  1568. HGT=HGT-DHGT
  1569. VFWS=VFWS+0.25*(1.-HGT/SQRT(HGT**2.+RW_TBL(LC)**2.))
  1570. end do
  1571. VFWS=VFWS/99.
  1572. VFWS=VFWS*2.
  1573. VFGS=1.-2.*VFWS*HGT_TBL(LC)/RW_TBL(LC)
  1574. SVF_TBL(LC)=VFGS
  1575. END DO
  1576. deallocate(roof_width)
  1577. deallocate(road_width)
  1578. END SUBROUTINE urban_param_init
  1579. !===========================================================================
  1580. !
  1581. ! subroutine urban_var_init: initialization of urban state variables
  1582. !
  1583. !===========================================================================
  1584. SUBROUTINE urban_var_init(ISURBAN, TSURFACE0_URB,TLAYER0_URB,TDEEP0_URB,IVGTYP, & ! in
  1585. ims,ime,jms,jme,kms,kme,num_soil_layers, & ! in
  1586. ! num_roof_layers,num_wall_layers,num_road_layers, & ! in
  1587. restart,sf_urban_physics, & !in
  1588. XXXR_URB2D,XXXB_URB2D,XXXG_URB2D,XXXC_URB2D, & ! inout
  1589. TR_URB2D,TB_URB2D,TG_URB2D,TC_URB2D,QC_URB2D, & ! inout
  1590. TRL_URB3D,TBL_URB3D,TGL_URB3D, & ! inout
  1591. SH_URB2D,LH_URB2D,G_URB2D,RN_URB2D, & ! inout
  1592. TS_URB2D, & ! inout
  1593. num_urban_layers, & ! in
  1594. TRB_URB4D,TW1_URB4D,TW2_URB4D,TGB_URB4D, & ! inout
  1595. TLEV_URB3D,QLEV_URB3D, & ! inout
  1596. TW1LEV_URB3D,TW2LEV_URB3D, & ! inout
  1597. TGLEV_URB3D,TFLEV_URB3D, & ! inout
  1598. SF_AC_URB3D,LF_AC_URB3D,CM_AC_URB3D, & ! inout
  1599. SFVENT_URB3D,LFVENT_URB3D, & ! inout
  1600. SFWIN1_URB3D,SFWIN2_URB3D, & ! inout
  1601. SFW1_URB3D,SFW2_URB3D,SFR_URB3D,SFG_URB3D, & ! inout
  1602. A_U_BEP,A_V_BEP,A_T_BEP,A_Q_BEP, & ! inout multi-layer urban
  1603. A_E_BEP,B_U_BEP,B_V_BEP, & ! inout multi-layer urban
  1604. B_T_BEP,B_Q_BEP,B_E_BEP,DLG_BEP, & ! inout multi-layer urban
  1605. DL_U_BEP,SF_BEP,VL_BEP, & ! inout multi-layer urban
  1606. FRC_URB2D, UTYPE_URB2D) ! inout
  1607. IMPLICIT NONE
  1608. INTEGER, INTENT(IN) :: ISURBAN, sf_urban_physics
  1609. INTEGER, INTENT(IN) :: ims,ime,jms,jme,kms,kme,num_soil_layers
  1610. INTEGER, INTENT(IN) :: num_urban_layers !multi-layer urban
  1611. ! INTEGER, INTENT(IN) :: num_roof_layers, num_wall_layers, num_road_layers
  1612. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TSURFACE0_URB
  1613. REAL, DIMENSION( ims:ime, 1:num_soil_layers, jms:jme ), INTENT(IN) :: TLAYER0_URB
  1614. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TDEEP0_URB
  1615. INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: IVGTYP
  1616. LOGICAL , INTENT(IN) :: restart
  1617. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TR_URB2D
  1618. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TB_URB2D
  1619. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TG_URB2D
  1620. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TC_URB2D
  1621. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QC_URB2D
  1622. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXR_URB2D
  1623. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXB_URB2D
  1624. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXG_URB2D
  1625. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXC_URB2D
  1626. ! REAL, DIMENSION(ims:ime, 1:num_roof_layers, jms:jme), INTENT(INOUT) :: TRL_URB3D
  1627. ! REAL, DIMENSION(ims:ime, 1:num_wall_layers, jms:jme), INTENT(INOUT) :: TBL_URB3D
  1628. ! REAL, DIMENSION(ims:ime, 1:num_road_layers, jms:jme), INTENT(INOUT) :: TGL_URB3D
  1629. REAL, DIMENSION(ims:ime, 1:num_soil_layers, jms:jme), INTENT(INOUT) :: TRL_URB3D
  1630. REAL, DIMENSION(ims:ime, 1:num_soil_layers, jms:jme), INTENT(INOUT) :: TBL_URB3D
  1631. REAL, DIMENSION(ims:ime, 1:num_soil_layers, jms:jme), INTENT(INOUT) :: TGL_URB3D
  1632. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SH_URB2D
  1633. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH_URB2D
  1634. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: G_URB2D
  1635. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RN_URB2D
  1636. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TS_URB2D
  1637. ! multi-layer UCM variables
  1638. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: TRB_URB4D
  1639. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: TW1_URB4D
  1640. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: TW2_URB4D
  1641. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: TGB_URB4D
  1642. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: TLEV_URB3D
  1643. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: QLEV_URB3D
  1644. REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: TW1LEV_URB3D
  1645. REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: TW2LEV_URB3D
  1646. REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: TGLEV_URB3D
  1647. REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: TFLEV_URB3D
  1648. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LF_AC_URB3D
  1649. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SF_AC_URB3D
  1650. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CM_AC_URB3D
  1651. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SFVENT_URB3D
  1652. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LFVENT_URB3D
  1653. REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: SFWIN1_URB3D
  1654. REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: SFWIN2_URB3D
  1655. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: SFW1_URB3D
  1656. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: SFW2_URB3D
  1657. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: SFR_URB3D
  1658. REAL, DIMENSION(ims:ime, 1:num_urban_layers, jms:jme), INTENT(INOUT) :: SFG_URB3D
  1659. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: A_U_BEP
  1660. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: A_V_BEP
  1661. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: A_T_BEP
  1662. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: A_Q_BEP
  1663. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: A_E_BEP
  1664. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: B_U_BEP
  1665. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: B_V_BEP
  1666. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: B_T_BEP
  1667. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: B_Q_BEP
  1668. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: B_E_BEP
  1669. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: VL_BEP
  1670. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: DLG_BEP
  1671. REAL, DIMENSION(ims:ime, kms:kme,jms:jme),INTENT(INOUT) :: SF_BEP
  1672. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: DL_U_BEP
  1673. !
  1674. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FRC_URB2D
  1675. INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UTYPE_URB2D
  1676. INTEGER :: UTYPE_URB
  1677. INTEGER :: I,J,K
  1678. DO I=ims,ime
  1679. DO J=jms,jme
  1680. ! XXXR_URB2D(I,J)=0.
  1681. ! XXXB_URB2D(I,J)=0.
  1682. ! XXXG_URB2D(I,J)=0.
  1683. ! XXXC_URB2D(I,J)=0.
  1684. SH_URB2D(I,J)=0.
  1685. LH_URB2D(I,J)=0.
  1686. G_URB2D(I,J)=0.
  1687. RN_URB2D(I,J)=0.
  1688. !m
  1689. FRC_URB2D(I,J)=0.
  1690. UTYPE_URB2D(I,J)=0
  1691. IF( IVGTYP(I,J) == ISURBAN) THEN
  1692. UTYPE_URB2D(I,J) = 2 ! for default. high-intensity
  1693. UTYPE_URB = UTYPE_URB2D(I,J) ! for default. high-intensity
  1694. FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB)
  1695. ENDIF
  1696. IF( IVGTYP(I,J) == 31) THEN
  1697. UTYPE_URB2D(I,J) = 3 ! low-intensity residential
  1698. UTYPE_URB = UTYPE_URB2D(I,J) ! low-intensity residential
  1699. FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB)
  1700. ENDIF
  1701. IF( IVGTYP(I,J) == 32) THEN
  1702. UTYPE_URB2D(I,J) = 2 ! high-intensity
  1703. UTYPE_URB = UTYPE_URB2D(I,J) ! high-intensity
  1704. FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB)
  1705. ENDIF
  1706. IF( IVGTYP(I,J) == 33) THEN
  1707. UTYPE_URB2D(I,J) = 1 ! Commercial/Industrial/Transportation
  1708. UTYPE_URB = UTYPE_URB2D(I,J) ! Commercial/Industrial/Transportation
  1709. FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB)
  1710. ENDIF
  1711. QC_URB2D(I,J)=0.01
  1712. IF (.not.restart) THEN
  1713. XXXR_URB2D(I,J)=0.
  1714. XXXB_URB2D(I,J)=0.
  1715. XXXG_URB2D(I,J)=0.
  1716. XXXC_URB2D(I,J)=0.
  1717. TC_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
  1718. TR_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
  1719. TB_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
  1720. TG_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
  1721. !
  1722. TS_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
  1723. ! DO K=1,num_roof_layers
  1724. ! DO K=1,num_soil_layers
  1725. ! TRL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
  1726. ! TRL_URB3D(I,2,J)=TLAYER0_URB(I,2,J)+0.
  1727. ! TRL_URB3D(I,3,J)=TLAYER0_URB(I,3,J)+0.
  1728. ! TRL_URB3D(I,4,J)=TLAYER0_URB(I,4,J)+0.
  1729. TRL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
  1730. TRL_URB3D(I,2,J)=0.5*(TLAYER0_URB(I,1,J)+TLAYER0_URB(I,2,J))
  1731. TRL_URB3D(I,3,J)=TLAYER0_URB(I,2,J)+0.
  1732. TRL_URB3D(I,4,J)=TLAYER0_URB(I,2,J)+(TLAYER0_URB(I,3,J)-TLAYER0_URB(I,2,J))*0.29
  1733. ! END DO
  1734. ! DO K=1,num_wall_layers
  1735. ! DO K=1,num_soil_layers
  1736. !m TBL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
  1737. !m TBL_URB3D(I,2,J)=TLAYER0_URB(I,2,J)+0.
  1738. !m TBL_URB3D(I,3,J)=TLAYER0_URB(I,3,J)+0.
  1739. !m TBL_URB3D(I,4,J)=TLAYER0_URB(I,4,J)+0.
  1740. TBL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
  1741. TBL_URB3D(I,2,J)=0.5*(TLAYER0_URB(I,1,J)+TLAYER0_URB(I,2,J))
  1742. TBL_URB3D(I,3,J)=TLAYER0_URB(I,2,J)+0.
  1743. TBL_URB3D(I,4,J)=TLAYER0_URB(I,2,J)+(TLAYER0_URB(I,3,J)-TLAYER0_URB(I,2,J))*0.29
  1744. ! END DO
  1745. ! DO K=1,num_road_layers
  1746. DO K=1,num_soil_layers
  1747. TGL_URB3D(I,K,J)=TLAYER0_URB(I,K,J)+0.
  1748. END DO
  1749. ! multi-layer urban
  1750. ! IF( sf_urban_physics .EQ. 2)THEN
  1751. IF((SF_URBAN_PHYSICS.eq.2).OR.(SF_URBAN_PHYSICS.eq.3)) THEN
  1752. DO k=1,num_urban_layers
  1753. ! TRB_URB4D(I,k,J)=TSURFACE0_URB(I,J)
  1754. ! TW1_URB4D(I,k,J)=TSURFACE0_URB(I,J)
  1755. ! TW2_URB4D(I,k,J)=TSURFACE0_URB(I,J)
  1756. ! TGB_URB4D(I,k,J)=TSURFACE0_URB(I,J)
  1757. !MT TRB_URB4D(I,K,J)=tlayer0_urb(I,1,J)
  1758. !MT TW1_URB4D(I,K,J)=tlayer0_urb(I,1,J)
  1759. !MT TW2_URB4D(I,K,J)=tlayer0_urb(I,1,J)
  1760. IF (UTYPE_URB2D(I,J) > 0) THEN
  1761. TRB_URB4D(I,K,J)=TBLEND_TBL(UTYPE_URB2D(I,J))
  1762. TW1_URB4D(I,K,J)=TBLEND_TBL(UTYPE_URB2D(I,J))
  1763. TW2_URB4D(I,K,J)=TBLEND_TBL(UTYPE_URB2D(I,J))
  1764. ELSE
  1765. TRB_URB4D(I,K,J)=tlayer0_urb(I,1,J)
  1766. TW1_URB4D(I,K,J)=tlayer0_urb(I,1,J)
  1767. TW2_URB4D(I,K,J)=tlayer0_urb(I,1,J)
  1768. ENDIF
  1769. TGB_URB4D(I,K,J)=tlayer0_urb(I,1,J)
  1770. SFW1_URB3D(I,K,J)=0.
  1771. SFW2_URB3D(I,K,J)=0.
  1772. SFR_URB3D(I,K,J)=0.
  1773. SFG_URB3D(I,K,J)=0.
  1774. ENDDO
  1775. ENDIF
  1776. if (SF_URBAN_PHYSICS.EQ.3) then
  1777. LF_AC_URB3D(I,J)=0.
  1778. SF_AC_URB3D(I,J)=0.
  1779. CM_AC_URB3D(I,J)=0.
  1780. SFVENT_URB3D(I,J)=0.
  1781. LFVENT_URB3D(I,J)=0.
  1782. DO K=1,num_urban_layers
  1783. TLEV_URB3D(I,K,J)=tlayer0_urb(I,1,J)
  1784. TW1LEV_URB3D(I,K,J)=tlayer0_urb(I,1,J)
  1785. TW2LEV_URB3D(I,K,J)=tlayer0_urb(I,1,J)
  1786. TGLEV_URB3D(I,K,J)=tlayer0_urb(I,1,J)
  1787. TFLEV_URB3D(I,K,J)=tlayer0_urb(I,1,J)
  1788. QLEV_URB3D(I,K,J)=0.01
  1789. SFWIN1_URB3D(I,K,J)=0.
  1790. SFWIN2_URB3D(I,K,J)=0.
  1791. !rm LF_AC_URB3D(I,J)=0.
  1792. !rm SF_AC_URB3D(I,J)=0.
  1793. !rm CM_AC_URB3D(I,J)=0.
  1794. !rm SFVENT_URB3D(I,J)=0.
  1795. !rm LFVENT_URB3D(I,J)=0.
  1796. ENDDO
  1797. endif
  1798. ! IF( sf_urban_physics .EQ. 2 )THEN
  1799. IF((SF_URBAN_PHYSICS.eq.2).OR.(SF_URBAN_PHYSICS.eq.3)) THEN
  1800. DO K= KMS,KME
  1801. SF_BEP(I,K,J)=1.
  1802. VL_BEP(I,K,J)=1.
  1803. A_U_BEP(I,K,J)=0.
  1804. A_V_BEP(I,K,J)=0.
  1805. A_T_BEP(I,K,J)=0.
  1806. A_E_BEP(I,K,J)=0.
  1807. A_Q_BEP(I,K,J)=0.
  1808. B_U_BEP(I,K,J)=0.
  1809. B_V_BEP(I,K,J)=0.
  1810. B_T_BEP(I,K,J)=0.
  1811. B_E_BEP(I,K,J)=0.
  1812. B_Q_BEP(I,K,J)=0.
  1813. DLG_BEP(I,K,J)=0.
  1814. DL_U_BEP(I,K,J)=0.
  1815. END DO
  1816. ENDIF !sf_urban_physics=2
  1817. ENDIF !restart
  1818. END DO
  1819. END DO
  1820. RETURN
  1821. END SUBROUTINE urban_var_init
  1822. !===========================================================================
  1823. !
  1824. ! force_restore
  1825. !
  1826. !===========================================================================
  1827. SUBROUTINE force_restore(CAP,AKS,DELT,S,R,H,LE,TSLEND,TSP,TS)
  1828. REAL, INTENT(IN) :: CAP,AKS,DELT,S,R,H,LE,TSLEND,TSP
  1829. REAL, INTENT(OUT) :: TS
  1830. REAL :: C1,C2
  1831. C2=24.*3600./2./3.14159
  1832. C1=SQRT(0.5*C2*CAP*AKS)
  1833. TS = TSP + DELT*( (S+R-H-LE)/C1 -(TSP-TSLEND)/C2 )
  1834. END SUBROUTINE force_restore
  1835. !===========================================================================
  1836. !
  1837. ! bisection (not used)
  1838. !
  1839. !==============================================================================
  1840. SUBROUTINE bisection(TSP,PS,S,EPS,RX,SIG,RHO,CP,CH,UA,QA,TA,EL,BET,AKS,TSL,DZ,TS)
  1841. REAL, INTENT(IN) :: TSP,PS,S,EPS,RX,SIG,RHO,CP,CH,UA,QA,TA,EL,BET,AKS,TSL,DZ
  1842. REAL, INTENT(OUT) :: TS
  1843. REAL :: ES,QS0,R,H,ELE,G0,F1,F
  1844. TS1 = TSP - 5.
  1845. TS2 = TSP + 5.
  1846. DO ITERATION = 1,22
  1847. ES=6.11*EXP( (2.5*10.**6./461.51)*(TS1-273.15)/(273.15*TS1) )
  1848. QS0=0.622*ES/(PS-0.378*ES)
  1849. R=EPS*(RX-SIG*(TS1**4.)/60.)
  1850. H=RHO*CP*CH*UA*(TS1-TA)*100.
  1851. ELE=RHO*EL*CH*UA*BET*(QS0-QA)*100.
  1852. G0=AKS*(TS1-TSL)/(DZ/2.)
  1853. F1= S + R - H - ELE - G0
  1854. TS=0.5*(TS1+TS2)
  1855. ES=6.11*EXP( (2.5*10.**6./461.51)*(TS-273.15)/(273.15*TS) )
  1856. QS0=0.622*ES/(PS-0.378*ES)
  1857. R=EPS*(RX-SIG*(TS**4.)/60.)
  1858. H=RHO*CP*CH*UA*(TS-TA)*100.
  1859. ELE=RHO*EL*CH*UA*BET*(QS0-QA)*100.
  1860. G0=AKS*(TS-TSL)/(DZ/2.)
  1861. F = S + R - H - ELE - G0
  1862. IF (F1*F > 0.0) THEN
  1863. TS1=TS
  1864. ELSE
  1865. TS2=TS
  1866. END IF
  1867. END DO
  1868. RETURN
  1869. END SUBROUTINE bisection
  1870. !===========================================================================
  1871. SUBROUTINE SFCDIF_URB (ZLM,Z0,THZ0,THLM,SFCSPD,AKANDA,AKMS,AKHS,RLMO,CD)
  1872. ! ----------------------------------------------------------------------
  1873. ! SUBROUTINE SFCDIF_URB (Urban version of SFCDIF_off)
  1874. ! ----------------------------------------------------------------------
  1875. ! CALCULATE SURFACE LAYER EXCHANGE COEFFICIENTS VIA ITERATIVE PROCESS.
  1876. ! SEE CHEN ET AL (1997, BLM)
  1877. ! ----------------------------------------------------------------------
  1878. IMPLICIT NONE
  1879. REAL WWST, WWST2, G, VKRM, EXCM, BETA, BTG, ELFC, WOLD, WNEW
  1880. REAL PIHF, EPSU2, EPSUST, EPSIT, EPSA, ZTMIN, ZTMAX, HPBL, &
  1881. & SQVISC
  1882. REAL RIC, RRIC, FHNEU, RFC,RLMO_THR, RFAC, ZZ, PSLMU, PSLMS, PSLHU, &
  1883. & PSLHS
  1884. REAL XX, PSPMU, YY, PSPMS, PSPHU, PSPHS, ZLM, Z0, THZ0, THLM
  1885. REAL SFCSPD, AKANDA, AKMS, AKHS, ZU, ZT, RDZ, CXCH
  1886. REAL DTHV, DU2, BTGH, WSTAR2, USTAR, ZSLU, ZSLT, RLOGU, RLOGT
  1887. REAL RLMO, ZETALT, ZETALU, ZETAU, ZETAT, XLU4, XLT4, XU4, XT4
  1888. !CC ......REAL ZTFC
  1889. REAL XLU, XLT, XU, XT, PSMZ, SIMM, PSHZ, SIMH, USTARK, RLMN, &
  1890. & RLMA
  1891. INTEGER ITRMX, ILECH, ITR
  1892. REAL, INTENT(OUT) :: CD
  1893. PARAMETER &
  1894. & (WWST = 1.2,WWST2 = WWST * WWST,G = 9.8,VKRM = 0.40, &
  1895. & EXCM = 0.001 &
  1896. & ,BETA = 1./270.,BTG = BETA * G,ELFC = VKRM * BTG &
  1897. & ,WOLD =.15,WNEW = 1. - WOLD,ITRMX = 05, &
  1898. & PIHF = 3.14159265/2.)
  1899. PARAMETER &
  1900. & (EPSU2 = 1.E-4,EPSUST = 0.07,EPSIT = 1.E-4,EPSA = 1.E-8 &
  1901. & ,ZTMIN = -5.,ZTMAX = 1.,HPBL = 1000.0 &
  1902. & ,SQVISC = 258.2)
  1903. PARAMETER &
  1904. & (RIC = 0.183,RRIC = 1.0/ RIC,FHNEU = 0.8,RFC = 0.191 &
  1905. & ,RLMO_THR = 0.001,RFAC = RIC / (FHNEU * RFC * RFC))
  1906. ! ----------------------------------------------------------------------
  1907. ! NOTE: THE TWO CODE BLOCKS BELOW DEFINE FUNCTIONS
  1908. ! ----------------------------------------------------------------------
  1909. ! LECH'S SURFACE FUNCTIONS
  1910. ! ----------------------------------------------------------------------
  1911. PSLMU (ZZ)= -0.96* log (1.0-4.5* ZZ)
  1912. PSLMS (ZZ)= ZZ * RRIC -2.076* (1. -1./ (ZZ +1.))
  1913. PSLHU (ZZ)= -0.96* log (1.0-4.5* ZZ)
  1914. ! ----------------------------------------------------------------------
  1915. ! PAULSON'S SURFACE FUNCTIONS
  1916. ! ----------------------------------------------------------------------
  1917. PSLHS (ZZ)= ZZ * RFAC -2.076* (1. -1./ (ZZ +1.))
  1918. PSPMU (XX)= -2.* log ( (XX +1.)*0.5) - log ( (XX * XX +1.)*0.5) &
  1919. & +2.* ATAN (XX) &
  1920. &- PIHF
  1921. PSPMS (YY)= 5.* YY
  1922. PSPHU (XX)= -2.* log ( (XX * XX +1.)*0.5)
  1923. ! ----------------------------------------------------------------------
  1924. ! THIS ROUTINE SFCDIF CAN HANDLE BOTH OVER OPEN WATER (SEA, OCEAN) AND
  1925. ! OVER SOLID SURFACE (LAND, SEA-ICE).
  1926. ! ----------------------------------------------------------------------
  1927. PSPHS (YY)= 5.* YY
  1928. ! ----------------------------------------------------------------------
  1929. ! ZTFC: RATIO OF ZOH/ZOM LESS OR EQUAL THAN 1
  1930. ! C......ZTFC=0.1
  1931. ! CZIL: CONSTANT C IN Zilitinkevich, S. S.1995,:NOTE ABOUT ZT
  1932. ! ----------------------------------------------------------------------
  1933. ILECH = 0
  1934. ! ----------------------------------------------------------------------
  1935. ! ZILFC = - CZIL * VKRM * SQVISC
  1936. ! C.......ZT=Z0*ZTFC
  1937. ZU = Z0
  1938. RDZ = 1./ ZLM
  1939. CXCH = EXCM * RDZ
  1940. DTHV = THLM - THZ0
  1941. ! ----------------------------------------------------------------------
  1942. ! BELJARS CORRECTION OF USTAR
  1943. ! ----------------------------------------------------------------------
  1944. DU2 = MAX (SFCSPD * SFCSPD,EPSU2)
  1945. !cc If statements to avoid TANGENT LINEAR problems near zero
  1946. BTGH = BTG * HPBL
  1947. IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
  1948. WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
  1949. ELSE
  1950. WSTAR2 = 0.0
  1951. END IF
  1952. ! ----------------------------------------------------------------------
  1953. ! ZILITINKEVITCH APPROACH FOR ZT
  1954. ! ----------------------------------------------------------------------
  1955. USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
  1956. ! ----------------------------------------------------------------------
  1957. ! KCL/TL Try Kanda approach instead (Kanda et al. 2007, JAMC)
  1958. ! ZT = EXP (ZILFC * SQRT (USTAR * Z0))* Z0
  1959. ZT = EXP (2.0-AKANDA*(SQVISC**2 * USTAR * Z0)**0.25)* Z0
  1960. ZSLU = ZLM + ZU
  1961. ZSLT = ZLM + ZT
  1962. RLOGU = log (ZSLU / ZU)
  1963. RLOGT = log (ZSLT / ZT)
  1964. RLMO = ELFC * AKHS * DTHV / USTAR **3
  1965. ! ----------------------------------------------------------------------
  1966. ! 1./MONIN-OBUKKHOV LENGTH-SCALE
  1967. ! ----------------------------------------------------------------------
  1968. DO ITR = 1,ITRMX
  1969. ZETALT = MAX (ZSLT * RLMO,ZTMIN)
  1970. RLMO = ZETALT / ZSLT
  1971. ZETALU = ZSLU * RLMO
  1972. ZETAU = ZU * RLMO
  1973. ZETAT = ZT * RLMO
  1974. IF (ILECH .eq. 0) THEN
  1975. IF (RLMO .lt. 0.0)THEN
  1976. XLU4 = 1. -16.* ZETALU
  1977. XLT4 = 1. -16.* ZETALT
  1978. XU4 = 1. -16.* ZETAU
  1979. XT4 = 1. -16.* ZETAT
  1980. XLU = SQRT (SQRT (XLU4))
  1981. XLT = SQRT (SQRT (XLT4))
  1982. XU = SQRT (SQRT (XU4))
  1983. XT = SQRT (SQRT (XT4))
  1984. PSMZ = PSPMU (XU)
  1985. SIMM = PSPMU (XLU) - PSMZ + RLOGU
  1986. PSHZ = PSPHU (XT)
  1987. SIMH = PSPHU (XLT) - PSHZ + RLOGT
  1988. ELSE
  1989. ZETALU = MIN (ZETALU,ZTMAX)
  1990. ZETALT = MIN (ZETALT,ZTMAX)
  1991. PSMZ = PSPMS (ZETAU)
  1992. SIMM = PSPMS (ZETALU) - PSMZ + RLOGU
  1993. PSHZ = PSPHS (ZETAT)
  1994. SIMH = PSPHS (ZETALT) - PSHZ + RLOGT
  1995. END IF
  1996. ! ----------------------------------------------------------------------
  1997. ! LECH'S FUNCTIONS
  1998. ! ----------------------------------------------------------------------
  1999. ELSE
  2000. IF (RLMO .lt. 0.)THEN
  2001. PSMZ = PSLMU (ZETAU)
  2002. SIMM = PSLMU (ZETALU) - PSMZ + RLOGU
  2003. PSHZ = PSLHU (ZETAT)
  2004. SIMH = PSLHU (ZETALT) - PSHZ + RLOGT
  2005. ELSE
  2006. ZETALU = MIN (ZETALU,ZTMAX)
  2007. ZETALT = MIN (ZETALT,ZTMAX)
  2008. PSMZ = PSLMS (ZETAU)
  2009. SIMM = PSLMS (ZETALU) - PSMZ + RLOGU
  2010. PSHZ = PSLHS (ZETAT)
  2011. SIMH = PSLHS (ZETALT) - PSHZ + RLOGT
  2012. END IF
  2013. ! ----------------------------------------------------------------------
  2014. ! BELJAARS CORRECTION FOR USTAR
  2015. ! ----------------------------------------------------------------------
  2016. END IF
  2017. USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
  2018. !KCL/TL
  2019. !ZT = EXP (ZILFC * SQRT (USTAR * Z0))* Z0
  2020. ZT = EXP (2.0-AKANDA*(SQVISC**2 * USTAR * Z0)**0.25)* Z0
  2021. ZSLT = ZLM + ZT
  2022. RLOGT = log (ZSLT / ZT)
  2023. USTARK = USTAR * VKRM
  2024. AKMS = MAX (USTARK / SIMM,CXCH)
  2025. AKHS = MAX (USTARK / SIMH,CXCH)
  2026. !
  2027. IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
  2028. WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
  2029. ELSE
  2030. WSTAR2 = 0.0
  2031. END IF
  2032. !-----------------------------------------------------------------------
  2033. RLMN = ELFC * AKHS * DTHV / USTAR **3
  2034. !-----------------------------------------------------------------------
  2035. ! IF(ABS((RLMN-RLMO)/RLMA).LT.EPSIT) GO TO 110
  2036. !-----------------------------------------------------------------------
  2037. RLMA = RLMO * WOLD+ RLMN * WNEW
  2038. !-----------------------------------------------------------------------
  2039. RLMO = RLMA
  2040. END DO
  2041. CD = USTAR*USTAR/SFCSPD**2
  2042. ! ----------------------------------------------------------------------
  2043. END SUBROUTINE SFCDIF_URB
  2044. ! ----------------------------------------------------------------------
  2045. !===========================================================================
  2046. END MODULE module_sf_urban