standard WRF version 3.0.1.1
[wrffire.git] / wrfv2_fire / phys / module_sf_urban.F
blob934b4ed461ad247328049dd9e4a65c762594b6fe
1 MODULE module_sf_urban
3 !===============================================================================
4 !     Single-Layer Urban Canopy Model for WRF Noah-LSM
5 !     Original Version: 2002/11/06 by Hiroyuki Kusaka
6 !     Last Update:      2006/08/24 by Fei Chen and Mukul Tewari (NCAR/RAL)  
7 !===============================================================================
9    CHARACTER(LEN=4)                :: LU_DATA_TYPE
11    INTEGER                         :: ICATE
13    REAL, ALLOCATABLE, DIMENSION(:) :: ZR_TBL
14    REAL, ALLOCATABLE, DIMENSION(:) :: Z0C_TBL
15    REAL, ALLOCATABLE, DIMENSION(:) :: Z0HC_TBL
16    REAL, ALLOCATABLE, DIMENSION(:) :: ZDC_TBL
17    REAL, ALLOCATABLE, DIMENSION(:) :: SVF_TBL
18    REAL, ALLOCATABLE, DIMENSION(:) :: R_TBL
19    REAL, ALLOCATABLE, DIMENSION(:) :: RW_TBL
20    REAL, ALLOCATABLE, DIMENSION(:) :: HGT_TBL
21    REAL, ALLOCATABLE, DIMENSION(:) :: CDS_TBL
22    REAL, ALLOCATABLE, DIMENSION(:) :: AS_TBL
23    REAL, ALLOCATABLE, DIMENSION(:) :: AH_TBL
24    REAL, ALLOCATABLE, DIMENSION(:) :: BETR_TBL
25    REAL, ALLOCATABLE, DIMENSION(:) :: BETB_TBL
26    REAL, ALLOCATABLE, DIMENSION(:) :: BETG_TBL
27    REAL, ALLOCATABLE, DIMENSION(:) :: FRC_URB_TBL
29    REAL                            :: CAPR_DATA, CAPB_DATA, CAPG_DATA
30    REAL                            :: AKSR_DATA, AKSB_DATA, AKSG_DATA
31    REAL                            :: ALBR_DATA, ALBB_DATA, ALBG_DATA
32    REAL                            :: EPSR_DATA, EPSB_DATA, EPSG_DATA
33    REAL                            :: Z0R_DATA,  Z0B_DATA,  Z0G_DATA
34    REAL                            :: Z0HR_DATA, Z0HB_DATA, Z0HG_DATA
35    REAL                            :: TRLEND_DATA, TBLEND_DATA, TGLEND_DATA
37    INTEGER                         :: BOUNDR_DATA,BOUNDB_DATA,BOUNDG_DATA
38    INTEGER                         :: CH_SCHEME_DATA, TS_SCHEME_DATA
39    INTEGER                         :: ahoption        ! Miao, 2007/01/17, cal. ah
40    REAL, DIMENSION(1:24)           :: ahdiuprf        ! ah diurnal profile, tloc: 1-24
42    INTEGER                         :: allocate_status 
44 !   INTEGER                         :: num_roof_layers
45 !   INTEGER                         :: num_wall_layers
46 !   INTEGER                         :: num_road_layers
48    CONTAINS
50 !===============================================================================
52 ! Author:
53 !      Hiroyuki KUSAKA, PhD
54 !      University of Tsukuba, JAPAN
55 !      (CRIEPI, NCAR/MMM visiting scientist, 2002-2004)
56 !      kusaka@ccs.tsukuba.ac.jp
58 ! Co-Researchers:
59 !     Fei CHEN, PhD
60 !      NCAR/RAP feichen@ucar.edu
61 !     Mukul TEWARI, PhD
62 !      NCAR/RAP mukul@ucar.edu
64 ! Purpose:
65 !     Calculate surface temeprature, fluxes, canopy air temperature, and canopy wind
67 ! Subroutines:
68 !     module_sf_urban
69 !       |- urban
70 !            |- read_param
71 !            |- mos or jurges
72 !            |- multi_layer or force_restore
73 !       |- urban_param_init <-- urban_param.tbl
74 !       |- urban_var_init
76 ! Input Data from WRF [MKS unit]:
78 !     UTYPE  [-]     : Urban type. 1=urban, 2=suburban, 3=rural 
79 !     TA     [K]     : Potential temperature at 1st wrf level (absolute temp)
80 !     QA     [kg/kg] : Mixing ratio at 1st atmospheric level
81 !     UA     [m/s]   : Wind speed at 1st atmospheric level
82 !     SSG    [W/m/m] : Short wave downward radiation at a flat surface
83 !                      Note this is the total of direct and diffusive solar
84 !                      downward radiation. If without two components, the
85 !                      single solar downward can be used instead.
86 !                      SSG = SSGD + SSGQ
87 !     LSOLAR [-]     : Indicating the input type of solar downward radiation
88 !                      True: both direct and diffusive solar radiation 
89 !                      are available
90 !                      False: only total downward ridiation is available.
91 !     SSGD   [W/m/m] : Direct solar radiation at a flat surface
92 !                      if SSGD is not available, one can assume a ratio SRATIO
93 !                      (e.g., 0.7), so that SSGD = SRATIO*SSG 
94 !     SSGQ   [W/m/m] : Diffuse solar radiation at a flat surface
95 !                      If SSGQ is not available, SSGQ = SSG - SSGD
96 !     LLG    [W/m/m] : Long wave downward radiation at a flat surface 
97 !     RAIN   [mm/h]  : Precipitation
98 !     RHOO   [kg/m/m/m] : Air density
99 !     ZA     [m]     : First atmospheric level
100 !                      as a lowest boundary condition
101 !     DECLIN [rad]   : solar declination
102 !     COSZ           : = sin(fai)*sin(del)+cos(fai)*cos(del)*cos(omg)
103 !     OMG    [rad]   : solar hour angle
104 !     XLAT   [deg]   : latitude
105 !     DELT   [sec]   : Time step
106 !     ZNT    [m]     : Roughnes length
108 ! Output Data to WRF [MKS unit]:
110 !     TS  [K]            : Surface potential temperature (absolute temp)
111 !     QS  [-]            : Surface humidity
113 !     SH  [W/m/m/]       : Sensible heat flux, = FLXTH*RHOO*CPP
114 !     LH  [W/m/m]        : Latent heat flux, = FLXHUM*RHOO*ELL
115 !     LH_INEMATIC [kg/m/m/sec]: Moisture Kinematic flux, = FLXHUM*RHOO
116 !     SW  [W/m/m]        : Upward shortwave radiation flux, 
117 !                          = SSG-SNET*697.7*60. (697.7*60.=100.*100.*4.186)
118 !     ALB [-]            : Time-varying albedo
119 !     LW  [W/m/m]        : Upward longwave radiation flux, 
120 !                          = LNET*697.7*60.-LLG
121 !     G   [W/m/m]        : Heat Flux into the Ground
122 !     RN  [W/m/m]        : Net radiation
124 !     PSIM  [-]          : Diagnostic similarity stability function for momentum
125 !     PSIH  [-]          : Diagnostic similarity stability function for heat
127 !     TC  [K]            : Diagnostic canopy air temperature
128 !     QC  [-]            : Diagnostic canopy humidity
130 !     TH2 [K]            : Diagnostic potential temperature at 2 m
131 !     Q2  [-]            : Diagnostic humidity at 2 m
132 !     U10 [m/s]          : Diagnostic u wind component at 10 m
133 !     V10 [m/s]          : Diagnostic v wind component at 10 m
135 !     CHS, CHS2 [m/s]    : CH*U at ZA, CH*U at 2 m (not used)
137 ! Important parameters:
138 ! Following parameter are assigned in run/urban_param.tbl
140 !  ZR  [m]             : roof level (building height)
141 !  Z0C [m]             : Roughness length above canyon for momentum (1/10 of ZR)
142 !  Z0HC [m]            : Roughness length above canyon for heat (1/10 of Z0C)
143 !  ZDC [m]             : Zero plane displacement height (1/5 of ZR)
144 !  SVF [-]             : sky view factor. Calculated again in urban_param_init
145 !  R   [-]             : building coverage ratio
146 !  RW  [-]             : = 1 - R
147 !  HGT [-]             : normalized building height
148 !  CDS [-]             : drag coefficient by buildings
149 !  AS  [1/m]           : buildings volumetric parameter
150 !  AH  [cal/cm/cm]     : anthropogenic heat
151 !  BETR [-]            : minimum moisture availability of roof
152 !  BETB [-]            : minimum moisture availability of building wall
153 !  BETG [-]            : minimum moisture availability of road
154 !  CAPR[cal/cm/cm/cm/degC]: heat capacity of roof
155 !  CAPB[cal/cm/cm/cm/degC]: heat capacity of building wall
156 !  CAPG[cal/cm/cm/cm/degC]: heat capacity of road
157 !  AKSR [cal/cm/sec/degC] : thermal conductivity of roof
158 !  AKSB [cal/cm/sec/degC] : thermal conductivity of building wall
159 !  AKSG [cal/cm/sec/degC] : thermal conductivity of road
160 !  ALBR [-]               : surface albedo of roof
161 !  ALBB [-]               : surface albedo of building wall
162 !  ALBG [-]               : surface albedo of road
163 !  EPSR [-]               : surface emissivity of roof
164 !  EPSB [-]               : surface emissivity of building wall
165 !  EPSG [-]               : surface emissivity of road
166 !  Z0R [m]                : roughness length for momentum of roof
167 !  Z0B [m]                : roughness length for momentum of building wall (only for CH_SCHEME = 1)
168 !  Z0G [m]                : roughness length for momentum of road (only for CH_SCHEME = 1)
169 !  Z0HR [m]               : roughness length for heat of roof
170 !  Z0HB [m]               : roughness length for heat of building wall (only for CH_SCHEME = 1)
171 !  Z0HG [m]               : roughness length for heat of road
172 !  num_roof_layers        : number of layers within roof
173 !  num_wall_layers        : number of layers within building walls
174 !  num_road_layers        : number of layers within below road surface
175 !   NOTE: for now, these layers are defined as same as the number of soil layers in namelist.input
176 !  DZR [cm]               : thickness of each roof layer
177 !  DZB [cm]               : thickness of each building wall layer
178 !  DZG [cm]               : thickness of each ground layer
179 !  BOUNDR [integer 1 or 2] : Boundary Condition for Roof Layer Temp [1: Zero-Flux, 2: T = Constant]
180 !  BOUNDB [integer 1 or 2] : Boundary Condition for Building Wall Layer Temp [1: Zero-Flux, 2: T = Constant]
181 !  BOUNDG [integer 1 or 2] : Boundary Condition for Road Layer Temp [1: Zero-Flux, 2: T = Constant]
182 !  TRLEND [K]             : lower boundary condition of roof temperature
183 !  TBLEND [K]             : lower boundary condition of building temperature
184 !  TGLEND [K]             : lower boundary condition of ground temperature
185 !  CH_SCHEME [integer 1 or 2] : Sfc exchange scheme used for building wall and road
186 !                         [1: M-O Similarity Theory,  2: Empirical Form (recommend)]
187 !  TS_SCHEME [integer 1 or 2] : Scheme for computing surface temperature (for roof, wall, and road)
188 !                         [1: 4-layer model,  2: Force-Restore method]
191 ! References:
192 !     Kusaka and Kimura (2004) J.Appl.Meteor., vol.43, p1899-1910
193 !     Kusaka and Kimura (2004) J.Meteor.Soc.Japan, vol.82, p45-65
194 !     Kusaka et al. (2001) Bound.-Layer Meteor., vol.101, p329-358
196 ! History:
197 !     2006/06          modified by H. Kusaka (Univ. Tsukuba), M. Tewari 
198 !     2005/10/26,      modified by Fei Chen, Mukul Tewari
199 !     2003/07/21 WRF , modified  by H. Kusaka of CRIEPI (NCAR/MMM)
200 !     2001/08/26 PhD , modified  by H. Kusaka of CRIEPI (Univ.Tsukuba)
201 !     1999/08/25 LCM , developed by H. Kusaka of CRIEPI (Univ.Tsukuba)
203 !===============================================================================
205 !  subroutine urban:
207 !===============================================================================
209    SUBROUTINE urban(LSOLAR,                                           & ! L
210                     num_roof_layers,num_wall_layers,num_road_layers,  & ! I
211                     DZR,DZB,DZG,                                      & ! I
212                     UTYPE,TA,QA,UA,U1,V1,SSG,SSGD,SSGQ,LLG,RAIN,RHOO, & ! I
213                     ZA,DECLIN,COSZ,OMG,XLAT,DELT,ZNT,                 & ! I
214                     CHS, CHS2,                                        & ! I
215                     TR, TB, TG, TC, QC, UC,                           & ! H
216                     TRL,TBL,TGL,                                      & ! H
217                     XXXR, XXXB, XXXG, XXXC,                           & ! H
218                     TS,QS,SH,LH,LH_KINEMATIC,                         & ! O
219                     SW,ALB,LW,G,RN,PSIM,PSIH,                         & ! O
220                     GZ1OZ0,                                           & ! O
221                     U10,V10,TH2,Q2,UST                                & ! O
222                     )
224    IMPLICIT NONE
226    REAL, PARAMETER    :: CP=0.24          ! heat capacity of dry air  [cgs unit]
227    REAL, PARAMETER    :: EL=583.          ! latent heat of vaporation [cgs unit]
228    REAL, PARAMETER    :: SIG=8.17E-11     ! stefun bolzman constant   [cgs unit]
229    REAL, PARAMETER    :: SIG_SI=5.67E-8   !                           [MKS unit]
230    REAL, PARAMETER    :: AK=0.4           ! kalman const.                [-]
231    REAL, PARAMETER    :: PI=3.14159       ! pi                           [-]
232    REAL, PARAMETER    :: TETENA=7.5       ! const. of Tetens Equation    [-]
233    REAL, PARAMETER    :: TETENB=237.3     ! const. of Tetens Equation    [-]
234    REAL, PARAMETER    :: SRATIO=0.75      ! ratio between direct/total solar [-]
236    REAL, PARAMETER    :: CPP=1004.5       ! heat capacity of dry air    [J/K/kg]
237    REAL, PARAMETER    :: ELL=2.442E+06    ! latent heat of vaporization [J/kg]
238    REAL, PARAMETER    :: XKA=2.4E-5
240 !-------------------------------------------------------------------------------
241 ! C: configuration variables
242 !-------------------------------------------------------------------------------
244    LOGICAL, INTENT(IN) :: LSOLAR  ! logical    [true=both, false=SSG only]
246 !  The following variables are also model configuration variables, but are 
247 !  defined in the URBAN.TBL and in the contains statement in the top of 
248 !  the module_urban_init, so we should not declare them here.
250   INTEGER, INTENT(IN) :: num_roof_layers
251   INTEGER, INTENT(IN) :: num_wall_layers
252   INTEGER, INTENT(IN) :: num_road_layers
255   REAL, INTENT(IN), DIMENSION(1:num_roof_layers) :: DZR ! grid interval of roof layers [cm]
256   REAL, INTENT(IN), DIMENSION(1:num_wall_layers) :: DZB ! grid interval of wall layers [cm]
257   REAL, INTENT(IN), DIMENSION(1:num_road_layers) :: DZG ! grid interval of road layers [cm]
259 !-------------------------------------------------------------------------------
260 ! I: input variables from LSM to Urban
261 !-------------------------------------------------------------------------------
263    INTEGER, INTENT(IN) :: UTYPE ! urban type [urban=1, suburban=2, rural=3]
265    REAL, INTENT(IN)    :: TA   ! potential temp at 1st atmospheric level [K]
266    REAL, INTENT(IN)    :: QA   ! mixing ratio at 1st atmospheric level  [kg/kg]
267    REAL, INTENT(IN)    :: UA   ! wind speed at 1st atmospheric level    [m/s]
268    REAL, INTENT(IN)    :: U1   ! u at 1st atmospheric level             [m/s]
269    REAL, INTENT(IN)    :: V1   ! v at 1st atmospheric level             [m/s]
270    REAL, INTENT(IN)    :: SSG  ! downward total short wave radiation    [W/m/m]
271    REAL, INTENT(IN)    :: LLG  ! downward long wave radiation           [W/m/m]
272    REAL, INTENT(IN)    :: RAIN ! precipitation                          [mm/h]
273    REAL, INTENT(IN)    :: RHOO ! air density                            [kg/m^3]
274    REAL, INTENT(IN)    :: ZA   ! first atmospheric level                [m]
275    REAL, INTENT(IN)    :: DECLIN ! solar declination                    [rad]
276    REAL, INTENT(IN)    :: COSZ ! sin(fai)*sin(del)+cos(fai)*cos(del)*cos(omg)
277    REAL, INTENT(IN)    :: OMG  ! solar hour angle                       [rad]
279    REAL, INTENT(IN)    :: XLAT ! latitude                               [deg]
280    REAL, INTENT(IN)    :: DELT ! time step                              [s]
281    REAL, INTENT(IN)    :: ZNT  ! roughness length                       [m]
282    REAL, INTENT(IN)    :: CHS,CHS2 ! CH*U at za and 2 m             [m/s]
284    REAL, INTENT(INOUT) :: SSGD ! downward direct short wave radiation   [W/m/m]
285    REAL, INTENT(INOUT) :: SSGQ ! downward diffuse short wave radiation  [W/m/m]
287 !-------------------------------------------------------------------------------
288 ! O: output variables from Urban to LSM 
289 !-------------------------------------------------------------------------------
291    REAL, INTENT(OUT) :: TS     ! surface potential temperature    [K]
292    REAL, INTENT(OUT) :: QS     ! surface humidity                 [K]
293    REAL, INTENT(OUT) :: SH     ! sensible heat flux               [W/m/m]
294    REAL, INTENT(OUT) :: LH     ! latent heat flux                 [W/m/m]
295    REAL, INTENT(OUT) :: LH_KINEMATIC ! latent heat, kinetic     [kg/m/m/s]
296    REAL, INTENT(OUT) :: SW     ! upward short wave radiation flux [W/m/m]
297    REAL, INTENT(OUT) :: ALB    ! time-varying albedo            [fraction]
298    REAL, INTENT(OUT) :: LW     ! upward long wave radiation flux  [W/m/m]
299    REAL, INTENT(OUT) :: G      ! heat flux into the ground        [W/m/m]
300    REAL, INTENT(OUT) :: RN     ! net radition                     [W/m/m]
301    REAL, INTENT(OUT) :: PSIM   ! similality stability shear function for momentum
302    REAL, INTENT(OUT) :: PSIH   ! similality stability shear function for heat
303    REAL, INTENT(OUT) :: GZ1OZ0   
304    REAL, INTENT(OUT) :: U10    ! u at 10m                         [m/s]
305    REAL, INTENT(OUT) :: V10    ! u at 10m                         [m/s]
306    REAL, INTENT(OUT) :: TH2    ! potential temperature at 2 m     [K]
307    REAL, INTENT(OUT) :: Q2     ! humidity at 2 m                  [-]
308 !m   REAL, INTENT(OUT) :: CHS,CHS2 ! CH*U at za and 2 m             [m/s]
309    REAL, INTENT(OUT) :: UST    ! friction velocity                [m/s]
312 !-------------------------------------------------------------------------------
313 ! H: Historical (state) variables of Urban : LSM <--> Urban
314 !-------------------------------------------------------------------------------
316 ! TR: roof temperature              [K];      TRP: at previous time step [K]
317 ! TB: building wall temperature     [K];      TBP: at previous time step [K]
318 ! TG: road temperature              [K];      TGP: at previous time step [K]
319 ! TC: urban-canopy air temperature  [K];      TCP: at previous time step [K]
320 !                                                  (absolute temperature)
321 ! QC: urban-canopy air mixing ratio [kg/kg];  QCP: at previous time step [kg/kg]
323 ! XXXR: Monin-Obkhov length for roof          [dimensionless]
324 ! XXXB: Monin-Obkhov length for building wall [dimensionless]
325 ! XXXG: Monin-Obkhov length for road          [dimensionless]
326 ! XXXC: Monin-Obkhov length for urban-canopy  [dimensionless]
328 ! TRL, TBL, TGL: layer temperature [K] (absolute temperature)
330    REAL, INTENT(INOUT):: TR, TB, TG, TC, QC, UC
331    REAL, INTENT(INOUT):: XXXR, XXXB, XXXG, XXXC
333    REAL, DIMENSION(1:num_roof_layers), INTENT(INOUT) :: TRL
334    REAL, DIMENSION(1:num_wall_layers), INTENT(INOUT) :: TBL
335    REAL, DIMENSION(1:num_road_layers), INTENT(INOUT) :: TGL
337 !-------------------------------------------------------------------------------
338 ! L:  Local variables from read_param
339 !-------------------------------------------------------------------------------
341    REAL :: ZR, Z0C, Z0HC, ZDC, SVF, R, RW, HGT, CDS, AS, AH
342    REAL :: CAPR, CAPB, CAPG, AKSR, AKSB, AKSG, ALBR, ALBB, ALBG 
343    REAL :: EPSR, EPSB, EPSG, Z0R,  Z0B,  Z0G,  Z0HR, Z0HB, Z0HG
344    REAL :: TRLEND,TBLEND,TGLEND
345    
346    REAL :: TH2X                                                !m
347    
348    INTEGER :: BOUNDR, BOUNDB, BOUNDG
349    INTEGER :: CH_SCHEME, TS_SCHEME
351    LOGICAL :: SHADOW  ! [true=consider svf and shadow effects, false=consider svf effect only]
353 !-------------------------------------------------------------------------------
354 ! L: Local variables
355 !-------------------------------------------------------------------------------
357    REAL :: BETR, BETB, BETG
358    REAL :: SX, SD, SQ, RX
359    REAL :: UR, ZC, XLB, BB
360    REAL :: Z, RIBR, RIBB, RIBG, RIBC, BHR, BHB, BHG, BHC
361    REAL :: TSC, LNET, SNET, FLXUV, THG, FLXTH, FLXHUM, FLXG
362    REAL :: W, VFGS, VFGW, VFWG, VFWS, VFWW
363    REAL :: HOUI1, HOUI2, HOUI3, HOUI4, HOUI5, HOUI6, HOUI7, HOUI8
364    REAL :: SLX, SLX1, SLX2, SLX3, SLX4, SLX5, SLX6, SLX7, SLX8
365    REAL :: FLXTHR, FLXTHB, FLXTHG, FLXHUMR, FLXHUMB, FLXHUMG
366    REAL :: SR, SB, SG, RR, RB, RG
367    REAL :: SR1, SR2, SB1, SB2, SG1, SG2, RR1, RR2, RB1, RB2, RG1, RG2
368    REAL :: HR, HB, HG, ELER, ELEB, ELEG, G0R, G0B, G0G
369    REAL :: ALPHAC, ALPHAR, ALPHAB, ALPHAG
370    REAL :: CHC, CHR, CHB, CHG, CDC, CDR, CDB, CDG
371    REAL :: C1R, C1B, C1G, TE, TC1, TC2, QC1, QC2, QS0R, QS0B, QS0G,RHO,ES
373    REAL :: DESDT
374    REAL :: F
375    REAL :: DQS0RDTR
376    REAL :: DRRDTR, DHRDTR, DELERDTR, DG0RDTR
377    REAL :: DTR, DFDT
378    REAL :: FX, FY, GF, GX, GY
379    REAL :: DTCDTB, DTCDTG
380    REAL :: DQCDTB, DQCDTG
381    REAL :: DRBDTB1,  DRBDTG1,  DRBDTB2,  DRBDTG2
382    REAL :: DRGDTB1,  DRGDTG1,  DRGDTB2,  DRGDTG2
383    REAL :: DRBDTB,   DRBDTG,   DRGDTB,   DRGDTG
384    REAL :: DHBDTB,   DHBDTG,   DHGDTB,   DHGDTG
385    REAL :: DELEBDTB, DELEBDTG, DELEGDTG, DELEGDTB
386    REAL :: DG0BDTB,  DG0BDTG,  DG0GDTG,  DG0GDTB
387    REAL :: DQS0BDTB, DQS0GDTG
388    REAL :: DTB, DTG, DTC
390    REAL :: THEATAZ    ! Solar Zenith Angle [rad]
391    REAL :: THEATAS    ! = PI/2. - THETAZ
392    REAL :: FAI        ! Latitude [rad]
393    REAL :: CNT,SNT
394    REAL :: PS         ! Surface Pressure [hPa]
395    REAL :: TAV        ! Vertial Temperature [K] 
397    REAL :: XXX, X, Z0, Z0H, CD, CH
398    REAL :: XXX2, PSIM2, PSIH2, XXX10, PSIM10, PSIH10
399    REAL :: PSIX, PSIT, PSIX2, PSIT2, PSIX10, PSIT10
401    REAL :: TRP, TBP, TGP, TCP, QCP, TST, QST
403    INTEGER :: iteration, K 
404    INTEGER :: tloc
406 !-------------------------------------------------------------------------------
407 ! Set parameters
408 !-------------------------------------------------------------------------------
410 ! Miao, 2007/01/17, cal. ah
411    if(ahoption==1) then
412      tloc=mod(int(OMG/PI*180./15.+12.+0.5 ),24)
413      if(tloc==0) tloc=24
414    endif
416    CALL read_param(UTYPE,ZR,Z0C,Z0HC,ZDC,SVF,R,RW,HGT,CDS,AS,AH,  &
417                    CAPR,CAPB,CAPG,AKSR,AKSB,AKSG,ALBR,ALBB,ALBG,  &
418                    EPSR,EPSB,EPSG,Z0R,Z0B,Z0G,Z0HR,Z0HB,Z0HG,     &
419                    BETR,BETB,BETG,TRLEND,TBLEND,TGLEND,           &
420                    BOUNDR,BOUNDB,BOUNDG,CH_SCHEME,TS_SCHEME)
422 ! Miao, 2007/01/17, cal. ah
423    if(ahoption==1) AH=AH*ahdiuprf(tloc)
425    IF( ZDC+Z0C+2. >= ZA) THEN
426     PRINT *, 'ZDC + Z0C + 2m is larger than the 1st WRF level' 
427     PRINT *, 'Stop in the subroutine urban - change ZDC and Z0C'
428     STOP
429    END IF
431    IF(.NOT.LSOLAR) THEN
432      SSGD = SRATIO*SSG
433      SSGQ = SSG - SSGD
434    ENDIF
435    SSGD = SRATIO*SSG   ! No radiation scheme has SSGD and SSGQ.
436    SSGQ = SSG - SSGD
438    W=2.*1.*HGT
439    VFGS=SVF
440    VFGW=1.-SVF
441    VFWG=(1.-SVF)*(1.-R)/W
442    VFWS=VFWG
443    VFWW=1.-2.*VFWG
445 !-------------------------------------------------------------------------------
446 ! Convert unit from MKS to cgs
447 ! Renew surface and layer temperatures
448 !-------------------------------------------------------------------------------
450    SX=(SSGD+SSGQ)/697.7/60.  ! downward short wave radition [ly/min]
451    SD=SSGD/697.7/60.         ! downward direct short wave radiation
452    SQ=SSGQ/697.7/60.         ! downward diffiusion short wave radiation
453    RX=LLG/697.7/60.          ! downward long wave radiation
454    RHO=RHOO*0.001            ! air density at first atmospheric level
456    TRP=TR
457    TBP=TB
458    TGP=TG
459    TCP=TC
460    QCP=QC
462    TAV=TA*(1.+0.61*QA)
463    PS=RHOO*287.*TAV/100. ![hPa]
465 !-------------------------------------------------------------------------------
466 ! Canopy wind
467 !-------------------------------------------------------------------------------
469    IF ( ZR + 2. < ZA ) THEN
470      UR=UA*LOG((ZR-ZDC)/Z0C)/LOG((ZA-ZDC)/Z0C)
471      ZC=0.7*ZR
472 !     ZC=0.5*ZR
473      XLB=0.4*(ZR-ZDC)
474      BB=ZR*(CDS*AS/(2.*XLB**2.))**(1./3.)
475      UC=UR*EXP(-BB*(1.-ZC/ZR))
476    ELSE
477      print *,'ZR=',ZR, 'ZA=',ZA
478      PRINT *, 'Warning ZR + 2m  is larger than the 1st WRF level' 
479      ZC=ZA/2.
480      UC=UA/2.
481    END IF
483 !-------------------------------------------------------------------------------
484 ! Net Short Wave Radiation at roof, wall, and road
485 !-------------------------------------------------------------------------------
487    SHADOW = .false.
488 !   SHADOW = .true.
490    IF (SSG > 0.0) THEN
492      IF(.NOT.SHADOW) THEN              ! no shadow effects model
494        SR1=SX*(1.-ALBR)
495        SG1=SX*VFGS*(1.-ALBG)
496        SB1=SX*VFWS*(1.-ALBB)
497        SG2=SB1*ALBB/(1.-ALBB)*VFGW*(1.-ALBG)
498        SB2=SG1*ALBG/(1.-ALBG)*VFWG*(1.-ALBB)
500      ELSE                              ! shadow effects model
502        FAI=XLAT*PI/180.
504        THEATAS=ABS(ASIN(COSZ))
505        THEATAZ=ABS(ACOS(COSZ))
507        SNT=COS(DECLIN)*SIN(OMG)/COS(THEATAS)
508        CNT=(COSZ*SIN(FAI)-SIN(DECLIN))/COS(THEATAS)/COS(FAI)
510        HOUI1=(SNT*COS(PI/8.)    -CNT*SIN(PI/8.))
511        HOUI2=(SNT*COS(2.*PI/8.) -CNT*SIN(2.*PI/8.))
512        HOUI3=(SNT*COS(3.*PI/8.) -CNT*SIN(3.*PI/8.))
513        HOUI4=(SNT*COS(4.*PI/8.) -CNT*SIN(4.*PI/8.))
514        HOUI5=(SNT*COS(5.*PI/8.) -CNT*SIN(5.*PI/8.))
515        HOUI6=(SNT*COS(6.*PI/8.) -CNT*SIN(6.*PI/8.))
516        HOUI7=(SNT*COS(7.*PI/8.) -CNT*SIN(7.*PI/8.))
517        HOUI8=(SNT*COS(8.*PI/8.) -CNT*SIN(8.*PI/8.))
519        SLX1=HGT*ABS(TAN(THEATAZ))*ABS(HOUI1)
520        SLX2=HGT*ABS(TAN(THEATAZ))*ABS(HOUI2)
521        SLX3=HGT*ABS(TAN(THEATAZ))*ABS(HOUI3)
522        SLX4=HGT*ABS(TAN(THEATAZ))*ABS(HOUI4)
523        SLX5=HGT*ABS(TAN(THEATAZ))*ABS(HOUI5)
524        SLX6=HGT*ABS(TAN(THEATAZ))*ABS(HOUI6)
525        SLX7=HGT*ABS(TAN(THEATAZ))*ABS(HOUI7)
526        SLX8=HGT*ABS(TAN(THEATAZ))*ABS(HOUI8)
528        IF(SLX1 > RW) SLX1=RW
529        IF(SLX2 > RW) SLX2=RW
530        IF(SLX3 > RW) SLX3=RW
531        IF(SLX4 > RW) SLX4=RW
532        IF(SLX5 > RW) SLX5=RW
533        IF(SLX6 > RW) SLX6=RW
534        IF(SLX7 > RW) SLX7=RW
535        IF(SLX8 > RW) SLX8=RW
537        SLX=(SLX1+SLX2+SLX3+SLX4+SLX5+SLX6+SLX7+SLX8)/8.
539      END IF
541      SR=SR1
542      SG=SG1+SG2
543      SB=SB1+SB2
545      SNET=R*SR+W*SB+RW*SG
547    ELSE
549      SR=0.
550      SG=0.
551      SB=0.
552      SNET=0.
554    END IF
556 !-------------------------------------------------------------------------------
557 ! Roof
558 !-------------------------------------------------------------------------------
560 !-------------------------------------------------------------------------------
561 ! CHR, CDR, BETR
562 !-------------------------------------------------------------------------------
564    Z=ZA-ZDC
565    BHR=LOG(Z0R/Z0HR)/0.4
566    RIBR=(9.8*2./(TA+TRP))*(TA-TRP)*(Z+Z0R)/(UA*UA)
568    CALL mos(XXXR,ALPHAR,CDR,BHR,RIBR,Z,Z0R,UA,TA,TRP,RHO)
570    CHR=ALPHAR/RHO/CP/UA
572    IF(RAIN > 1.) BETR=0.7  
574    IF (TS_SCHEME == 1) THEN 
576 !-------------------------------------------------------------------------------
577 ! TR  Solving Non-Linear Equation by Newton-Rapson
578 ! TRL Solving Heat Equation by Tri Diagonal Matrix Algorithm  
579 !-------------------------------------------------------------------------------
580 !      TSC=TRP-273.15                          
581 !      ES=EXP(19.482-4303.4/(TSC+243.5))        ! WMO
582 !      ES=6.11*10.**(TETENA*TSC/(TETENB+TSC))   ! Tetens
583 !      DESDT=( 6.1078*(2500.-2.4*TSC)/ &        ! Tetens
584 !            (0.46151*(TSC+273.15)**2.) )*10.**(7.5*TSC/(237.3+TSC)) 
585 !      ES=6.11*EXP((2.5*10.**6./461.51)*(TRP-273.15)/(273.15*TRP) ) ! Clausius-Clapeyron 
586 !      DESDT=(2.5*10.**6./461.51)*ES/(TRP**2.)                      ! Clausius-Clapeyron
587 !      QS0R=0.622*ES/(PS-0.378*ES) 
588 !      DQS0RDTR = DESDT*0.622*PS/((PS-0.378*ES)**2.) 
589 !      DQS0RDTR = 17.269*(273.15-35.86)/((TRP-35.86)**2.)*QS0R
591 !    TRP=350.
593      DO ITERATION=1,20
595        ES=6.11*EXP( (2.5*10.**6./461.51)*(TRP-273.15)/(273.15*TRP) )
596        DESDT=(2.5*10.**6./461.51)*ES/(TRP**2.)
597        QS0R=0.622*ES/(PS-0.378*ES) 
598        DQS0RDTR = DESDT*0.622*PS/((PS-0.378*ES)**2.) 
600        RR=EPSR*(RX-SIG*(TRP**4.)/60.)
601        HR=RHO*CP*CHR*UA*(TRP-TA)*100.
602        ELER=RHO*EL*CHR*UA*BETR*(QS0R-QA)*100.
603        G0R=AKSR*(TRP-TRL(1))/(DZR(1)/2.)
605        F = SR + RR - HR - ELER - G0R
607        DRRDTR = (-4.*EPSR*SIG*TRP**3.)/60.
608        DHRDTR = RHO*CP*CHR*UA*100.
609        DELERDTR = RHO*EL*CHR*UA*BETR*DQS0RDTR*100.
610        DG0RDTR =  2.*AKSR/DZR(1)
612        DFDT = DRRDTR - DHRDTR - DELERDTR - DG0RDTR 
613        DTR = F/DFDT
615        TR = TRP - DTR
616        TRP = TR
618        IF( ABS(F) < 0.000001 .AND. ABS(DTR) < 0.000001 ) EXIT
620      END DO
622 ! multi-layer heat equation model
624      CALL multi_layer(num_roof_layers,BOUNDR,G0R,CAPR,AKSR,TRL,DZR,DELT,TRLEND)
626    ELSE
628      ES=6.11*EXP( (2.5*10.**6./461.51)*(TRP-273.15)/(273.15*TRP) )
629      QS0R=0.622*ES/(PS-0.378*ES)        
631      RR=EPSR*(RX-SIG*(TRP**4.)/60.)
632      HR=RHO*CP*CHR*UA*(TRP-TA)*100.
633      ELER=RHO*EL*CHR*UA*BETR*(QS0R-QA)*100.
634      G0R=SR+RR-HR-ELER
636      CALL force_restore(CAPR,AKSR,DELT,SR,RR,HR,ELER,TRLEND,TRP,TR)
638      TRP=TR
640    END IF
642    FLXTHR=HR/RHO/CP/100.
643    FLXHUMR=ELER/RHO/EL/100.
645 !-------------------------------------------------------------------------------
646 !  Wall and Road 
647 !-------------------------------------------------------------------------------
649 !-------------------------------------------------------------------------------
650 !  CHC, CHB, CDB, BETB, CHG, CDG, BETG
651 !-------------------------------------------------------------------------------
653    Z=ZA-ZDC
654    BHC=LOG(Z0C/Z0HC)/0.4
655    RIBC=(9.8*2./(TA+TCP))*(TA-TCP)*(Z+Z0C)/(UA*UA)
657    CALL mos(XXXC,ALPHAC,CDC,BHC,RIBC,Z,Z0C,UA,TA,TCP,RHO)
659    IF (CH_SCHEME == 1) THEN 
661      Z=ZDC
662      BHB=LOG(Z0B/Z0HB)/0.4
663      BHG=LOG(Z0G/Z0HG)/0.4
664      RIBB=(9.8*2./(TCP+TBP))*(TCP-TBP)*(Z+Z0B)/(UC*UC)
665      RIBG=(9.8*2./(TCP+TGP))*(TCP-TGP)*(Z+Z0G)/(UC*UC)
667      CALL mos(XXXB,ALPHAB,CDB,BHB,RIBB,Z,Z0B,UC,TCP,TBP,RHO)
668      CALL mos(XXXG,ALPHAG,CDG,BHG,RIBG,Z,Z0G,UC,TCP,TGP,RHO)
670    ELSE
672      ALPHAB=RHO*CP*(6.15+4.18*UC)/1200.
673      IF(UC > 5.) ALPHAB=RHO*CP*(7.51*UC**0.78)/1200.
674      ALPHAG=RHO*CP*(6.15+4.18*UC)/1200.
675      IF(UC > 5.) ALPHAG=RHO*CP*(7.51*UC**0.78)/1200.
677    END IF
679    CHC=ALPHAC/RHO/CP/UA
680    CHB=ALPHAB/RHO/CP/UC
681    CHG=ALPHAG/RHO/CP/UC
683    BETB=0.0
684    IF(RAIN > 1.) BETG=0.7
686    IF (TS_SCHEME == 1) THEN
688 !-------------------------------------------------------------------------------
689 !  TB, TG  Solving Non-Linear Simultaneous Equation by Newton-Rapson
690 !  TBL,TGL Solving Heat Equation by Tri Diagonal Matrix Algorithm  
691 !-------------------------------------------------------------------------------
693 !    TBP=350.
694 !    TGP=350.
696      DO ITERATION=1,20
698        ES=6.11*EXP( (2.5*10.**6./461.51)*(TBP-273.15)/(273.15*TBP) ) 
699        DESDT=(2.5*10.**6./461.51)*ES/(TBP**2.)
700        QS0B=0.622*ES/(PS-0.378*ES) 
701        DQS0BDTB=DESDT*0.622*PS/((PS-0.378*ES)**2.)
703        ES=6.11*EXP( (2.5*10.**6./461.51)*(TGP-273.15)/(273.15*TGP) ) 
704        DESDT=(2.5*10.**6./461.51)*ES/(TGP**2.)
705        QS0G=0.622*ES/(PS-0.378*ES)        
706        DQS0GDTG=DESDT*0.22*PS/((PS-0.378*ES)**2.) 
708        RG1=EPSG*( RX*VFGS          &
709        +EPSB*VFGW*SIG*TBP**4./60.  &
710        -SIG*TGP**4./60. )
712        RB1=EPSB*( RX*VFWS         &
713        +EPSG*VFWG*SIG*TGP**4./60. &
714        +EPSB*VFWW*SIG*TBP**4./60. &
715        -SIG*TBP**4./60. )
717        RG2=EPSG*( (1.-EPSB)*(1.-SVF)*VFWS*RX                  &
718        +(1.-EPSB)*(1.-SVF)*VFWG*EPSG*SIG*TGP**4./60.          &
719        +EPSB*(1.-EPSB)*(1.-SVF)*(1.-2.*VFWS)*SIG*TBP**4./60. )
721        RB2=EPSB*( (1.-EPSG)*VFWG*VFGS*RX                          &
722        +(1.-EPSG)*EPSB*VFGW*VFWG*SIG*(TBP**4.)/60.                &
723        +(1.-EPSB)*VFWS*(1.-2.*VFWS)*RX                            &
724        +(1.-EPSB)*VFWG*(1.-2.*VFWS)*EPSG*SIG*EPSG*TGP**4./60.     &
725        +EPSB*(1.-EPSB)*(1.-2.*VFWS)*(1.-2.*VFWS)*SIG*TBP**4./60. )
727        RG=RG1+RG2
728        RB=RB1+RB2
730        DRBDTB1=EPSB*(4.*EPSB*SIG*TB**3.*VFWW-4.*SIG*TB**3.)/60.
731        DRBDTG1=EPSB*(4.*EPSG*SIG*TG**3.*VFWG)/60.
732        DRBDTB2=EPSB*(4.*(1.-EPSG)*EPSB*SIG*TB**3.*VFGW*VFWG &
733                +4.*EPSB*(1.-EPSB)*SIG*TB**3.*VFWW*VFWW)/60.
734        DRBDTG2=EPSB*(4.*(1.-EPSB)*EPSG*SIG*TG**3.*VFWG*VFWW)/60.
736        DRGDTB1=EPSG*(4.*EPSB*SIG*TB**3.*VFGW)/60.
737        DRGDTG1=EPSG*(-4.*SIG*TG**3.)/60.
738        DRGDTB2=EPSG*(4.*EPSB*(1.-EPSB)*SIG*TB**3.*VFWW*VFGW)/60.
739        DRGDTG2=EPSG*(4.*(1.-EPSB)*EPSG*SIG*TG**3.*VFWG*VFGW)/60.
741        DRBDTB=DRBDTB1+DRBDTB2
742        DRBDTG=DRBDTG1+DRBDTG2
743        DRGDTB=DRGDTB1+DRGDTB2
744        DRGDTG=DRGDTG1+DRGDTG2
746        HB=RHO*CP*CHB*UC*(TBP-TCP)*100.
747        HG=RHO*CP*CHG*UC*(TGP-TCP)*100.
749        DTCDTB=W*ALPHAB/(RW*ALPHAC+RW*ALPHAG+W*ALPHAB)
750        DTCDTG=RW*ALPHAG/(RW*ALPHAC+RW*ALPHAG+W*ALPHAB)
752        DHBDTB=RHO*CP*CHB*UC*(1.-DTCDTB)*100.
753        DHBDTG=RHO*CP*CHB*UC*(0.-DTCDTG)*100.
754        DHGDTG=RHO*CP*CHG*UC*(1.-DTCDTG)*100.
755        DHGDTB=RHO*CP*CHG*UC*(0.-DTCDTB)*100.
757        ELEB=RHO*EL*CHB*UC*BETB*(QS0B-QCP)*100.
758        ELEG=RHO*EL*CHG*UC*BETG*(QS0G-QCP)*100.
760        DQCDTB=W*ALPHAB*BETB*DQS0BDTB/(RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB)
761        DQCDTG=RW*ALPHAG*BETG*DQS0GDTG/(RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB)
763        DELEBDTB=RHO*EL*CHB*UC*BETB*(DQS0BDTB-DQCDTB)*100.
764        DELEBDTG=RHO*EL*CHB*UC*BETB*(0.-DQCDTG)*100.
765        DELEGDTG=RHO*EL*CHG*UC*BETG*(DQS0GDTG-DQCDTG)*100.
766        DELEGDTB=RHO*EL*CHG*UC*BETG*(0.-DQCDTB)*100.
768        G0B=AKSB*(TBP-TBL(1))/(DZB(1)/2.)
769        G0G=AKSG*(TGP-TGL(1))/(DZG(1)/2.)
771        DG0BDTB=2.*AKSB/DZB(1)
772        DG0BDTG=0.
773        DG0GDTG=2.*AKSG/DZG(1)
774        DG0GDTB=0.
776        F = SB + RB - HB - ELEB - G0B
777        FX = DRBDTB - DHBDTB - DELEBDTB - DG0BDTB 
778        FY = DRBDTG - DHBDTG - DELEBDTG - DG0BDTG
780        GF = SG + RG - HG - ELEG - G0G
781        GX = DRGDTB - DHGDTB - DELEGDTB - DG0GDTB
782        GY = DRGDTG - DHGDTG - DELEGDTG - DG0GDTG 
784        DTB =  (GF*FY-F*GY)/(FX*GY-GX*FY)
785        DTG = -(GF+GX*DTB)/GY
787        TB = TBP + DTB
788        TG = TGP + DTG
790        TBP = TB
791        TGP = TG
793        TC1=RW*ALPHAC+RW*ALPHAG+W*ALPHAB
794        TC2=RW*ALPHAC*TA+RW*ALPHAG*TGP+W*ALPHAB*TBP
795        TC=TC2/TC1
797        QC1=RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB
798        QC2=RW*ALPHAC*QA+RW*ALPHAG*BETG*QS0G+W*ALPHAB*BETB*QS0B
799        QC=QC2/QC1
801        DTC=TCP - TC
802        TCP=TC
803        QCP=QC
805        IF( ABS(F) < 0.000001 .AND. ABS(DTB) < 0.000001 &
806         .AND. ABS(GF) < 0.000001 .AND. ABS(DTG) < 0.000001 &
807         .AND. ABS(DTC) < 0.000001) EXIT
809      END DO
811      CALL multi_layer(num_wall_layers,BOUNDB,G0B,CAPB,AKSB,TBL,DZB,DELT,TBLEND)
813      CALL multi_layer(num_road_layers,BOUNDG,G0G,CAPG,AKSG,TGL,DZG,DELT,TGLEND)
815    ELSE
817 !-------------------------------------------------------------------------------
818 !  TB, TG  by Force-Restore Method 
819 !-------------------------------------------------------------------------------
821        ES=6.11*EXP((2.5*10.**6./461.51)*(TBP-273.15)/(273.15*TBP) )
822        QS0B=0.622*ES/(PS-0.378*ES)       
824        ES=6.11*EXP((2.5*10.**6./461.51)*(TGP-273.15)/(273.15*TGP) )
825        QS0G=0.622*ES/(PS-0.378*ES)        
827        RG1=EPSG*( RX*VFGS             &
828        +EPSB*VFGW*SIG*TBP**4./60.     &
829        -SIG*TGP**4./60. )
831        RB1=EPSB*( RX*VFWS &
832        +EPSG*VFWG*SIG*TGP**4./60. &
833        +EPSB*VFWW*SIG*TBP**4./60. &
834        -SIG*TBP**4./60. )
836        RG2=EPSG*( (1.-EPSB)*(1.-SVF)*VFWS*RX                   &
837        +(1.-EPSB)*(1.-SVF)*VFWG*EPSG*SIG*TGP**4./60.           &
838        +EPSB*(1.-EPSB)*(1.-SVF)*(1.-2.*VFWS)*SIG*TBP**4./60. )
840        RB2=EPSB*( (1.-EPSG)*VFWG*VFGS*RX                          &
841        +(1.-EPSG)*EPSB*VFGW*VFWG*SIG*(TBP**4.)/60.                &
842        +(1.-EPSB)*VFWS*(1.-2.*VFWS)*RX                            &
843        +(1.-EPSB)*VFWG*(1.-2.*VFWS)*EPSG*SIG*EPSG*TGP**4./60.     &
844        +EPSB*(1.-EPSB)*(1.-2.*VFWS)*(1.-2.*VFWS)*SIG*TBP**4./60. )
846        RG=RG1+RG2
847        RB=RB1+RB2
849        HB=RHO*CP*CHB*UC*(TBP-TCP)*100.
850        ELEB=RHO*EL*CHB*UC*BETB*(QS0B-QCP)*100.
851        G0B=SB+RB-HB-ELEB
853        HG=RHO*CP*CHG*UC*(TGP-TCP)*100.
854        ELEG=RHO*EL*CHG*UC*BETG*(QS0G-QCP)*100.
855        G0G=SG+RG-HG-ELEG
857        CALL force_restore(CAPB,AKSB,DELT,SB,RB,HB,ELEB,TBLEND,TBP,TB)
858        CALL force_restore(CAPG,AKSG,DELT,SG,RG,HG,ELEG,TGLEND,TGP,TG)
860        TBP=TB
861        TGP=TG
863        TC1=RW*ALPHAC+RW*ALPHAG+W*ALPHAB
864        TC2=RW*ALPHAC*TA+RW*ALPHAG*TGP+W*ALPHAB*TBP
865        TC=TC2/TC1
867        QC1=RW*ALPHAC+RW*ALPHAG*BETG+W*ALPHAB*BETB
868        QC2=RW*ALPHAC*QA+RW*ALPHAG*BETG*QS0G+W*ALPHAB*BETB*QS0B
869        QC=QC2/QC1
871        TCP=TC
872        QCP=QC
874    END IF
876    FLXTHB=HB/RHO/CP/100.
877    FLXHUMB=ELEB/RHO/EL/100.
878    FLXTHG=HG/RHO/CP/100.
879    FLXHUMG=ELEG/RHO/EL/100.
881 !-------------------------------------------------------------------------------
882 ! Total Fulxes from Urban Canopy
883 !-------------------------------------------------------------------------------
885    FLXUV  = ( R*CDR + RW*CDC )*UA*UA
886 ! Miao, 2007/01/17, cal. ah
887    if(ahoption==1) then
888      FLXTH  = ( R*FLXTHR  + W*FLXTHB  + RW*FLXTHG ) + AH/RHOO/CPP
889    else
890      FLXTH  = ( R*FLXTHR  + W*FLXTHB  + RW*FLXTHG )
891    endif
892    FLXHUM = ( R*FLXHUMR + W*FLXHUMB + RW*FLXHUMG )
893    FLXG =   ( R*G0R + W*G0B + RW*G0G )
894    LNET =     R*RR + W*RB + RW*RG
896 !----------------------------------------------------------------------------
897 ! Convert Unit: FLUXES and u* T* q*  --> WRF
898 !----------------------------------------------------------------------------
900    SH    = FLXTH  * RHOO * CPP    ! Sensible heat flux          [W/m/m]
901    LH    = FLXHUM * RHOO * ELL    ! Latent heat flux            [W/m/m]
902    LH_KINEMATIC = FLXHUM * RHOO   ! Latent heat, Kinematic      [kg/m/m/s]
903    LW    = LLG - (LNET*697.7*60.) ! Upward longwave radiation   [W/m/m]
904    SW    = SSG - (SNET*697.7*60.) ! Upward shortwave radiation  [W/m/m]
905    ALB   = 0.
906    IF( ABS(SSG) > 0.0001) ALB = SW/SSG ! Effective albedo [-] 
907    G = -FLXG*697.7*60.            ! [W/m/m]
908    RN = (SNET+LNET)*697.7*60.     ! Net radiation [W/m/m]
910    UST = SQRT(FLXUV)              ! u* [m/s]
911    TST = -FLXTH/UST               ! T* [K]
912    QST = -FLXHUM/UST              ! q* [-]
914 !------------------------------------------------------
915 !  diagnostic GRID AVERAGED  PSIM  PSIH  TS QS --> WRF
916 !------------------------------------------------------
918    Z0 = Z0C 
919    Z0H = Z0HC
920    Z = ZA - ZDC
922    XXX = 0.4*9.81*Z*TST/TA/UST/UST
924    IF ( XXX >= 1. ) XXX = 1.
925    IF ( XXX <= -5. ) XXX = -5.
927    IF ( XXX > 0 ) THEN
928      PSIM = -5. * XXX
929      PSIH = -5. * XXX
930    ELSE
931      X = (1.-16.*XXX)**0.25
932      PSIM = 2.*ALOG((1.+X)/2.) + ALOG((1.+X*X)/2.) - 2.*ATAN(X) + PI/2.
933      PSIH = 2.*ALOG((1.+X*X)/2.)
934    END IF
936    GZ1OZ0 = ALOG(Z/Z0)
937    CD = 0.4**2./(ALOG(Z/Z0)-PSIM)**2.
939 !m   CH = 0.4**2./(ALOG(Z/Z0)-PSIM)/(ALOG(Z/Z0H)-PSIH)
940 !m   CHS = 0.4*UST/(ALOG(Z/Z0H)-PSIH)
941 !m   TS = TA + FLXTH/CH/UA    ! surface potential temp (flux temp)
942 !m   QS = QA + FLXHUM/CH/UA   ! surface humidity
944    TS = TA + FLXTH/CHS    ! surface potential temp (flux temp)
945    QS = QA + FLXHUM/CHS   ! surface humidity
947 !-------------------------------------------------------
948 !  diagnostic  GRID AVERAGED  U10  V10  TH2  Q2 --> WRF
949 !-------------------------------------------------------
951    XXX2 = (2./Z)*XXX
952    IF ( XXX2 >= 1. ) XXX2 = 1.
953    IF ( XXX2 <= -5. ) XXX2 = -5.
955    IF ( XXX2 > 0 ) THEN
956       PSIM2 = -5. * XXX2
957       PSIH2 = -5. * XXX2
958    ELSE
959       X = (1.-16.*XXX2)**0.25
960       PSIM2 = 2.*ALOG((1.+X)/2.) + ALOG((1.+X*X)/2.) - 2.*ATAN(X) + 2.*ATAN(1.)
961       PSIH2 = 2.*ALOG((1.+X*X)/2.)
962    END IF
964 !m   CHS2 = 0.4*UST/(ALOG(2./Z0H)-PSIH2)
967    XXX10 = (10./Z)*XXX
968    IF ( XXX10 >= 1. ) XXX10 = 1.
969    IF ( XXX10 <= -5. ) XXX10 = -5.
971    IF ( XXX10 > 0 ) THEN
972       PSIM10 = -5. * XXX10
973       PSIH10 = -5. * XXX10
974    ELSE
975       X = (1.-16.*XXX10)**0.25
976       PSIM10 = 2.*ALOG((1.+X)/2.) + ALOG((1.+X*X)/2.) - 2.*ATAN(X) + 2.*ATAN(1.)
977       PSIH10 = 2.*ALOG((1.+X*X)/2.)
978    END IF
980    PSIX = ALOG(Z/Z0) - PSIM
981    PSIT = ALOG(Z/Z0H) - PSIH
983    PSIX2 = ALOG(2./Z0) - PSIM2
984    PSIT2 = ALOG(2./Z0H) - PSIH2
986    PSIX10 = ALOG(10./Z0) - PSIM10
987    PSIT10 = ALOG(10./Z0H) - PSIH10
989    U10 = U1 * (PSIX10/PSIX)       ! u at 10 m [m/s]
990    V10 = V1 * (PSIX10/PSIX)       ! v at 10 m [m/s]
992 !   TH2 = TS + (TA-TS)*(PSIT2/PSIT)   ! potential temp at 2 m [K]
993 !  TH2 = TS + (TA-TS)*(PSIT2/PSIT)   ! Fei: this seems to be temp (not potential) at 2 m [K]
994 !Fei: consistant with M-O theory
995    TH2 = TS + (TA-TS) *(CHS/CHS2) 
997    Q2 = QS + (QA-QS)*(PSIT2/PSIT)    ! humidity at 2 m       [-]
999 !   TS = (LW/SIG_SI/0.88)**0.25       ! Radiative temperature [K]
1001    RETURN
1003    END SUBROUTINE urban
1004 !===============================================================================
1006 !  mos
1008 !===============================================================================
1009    SUBROUTINE mos(XXX,ALPHA,CD,B1,RIB,Z,Z0,UA,TA,TSF,RHO)
1011 !  XXX:   z/L (requires iteration by Newton-Rapson method)
1012 !  B1:    Stanton number
1013 !  PSIM:  = PSIX of LSM
1014 !  PSIH:  = PSIT of LSM
1016    IMPLICIT NONE
1018    REAL, PARAMETER     :: CP=0.24
1019    REAL, INTENT(IN)    :: B1, Z, Z0, UA, TA, TSF, RHO
1020    REAL, INTENT(OUT)   :: ALPHA, CD
1021    REAL, INTENT(INOUT) :: XXX, RIB
1022    REAL                :: XXX0, X, X0, FAIH, DPSIM, DPSIH
1023    REAL                :: F, DF, XXXP, US, TS, AL, XKB, DD, PSIM, PSIH
1024    INTEGER             :: NEWT
1025    INTEGER, PARAMETER  :: NEWT_END=10
1027    IF(RIB <= -15.) RIB=-15. 
1029    IF(RIB < 0.) THEN
1031       DO NEWT=1,NEWT_END
1033         IF(XXX >= 0.) XXX=-1.E-3
1035         XXX0=XXX*Z0/(Z+Z0)
1037         X=(1.-16.*XXX)**0.25
1038         X0=(1.-16.*XXX0)**0.25
1040         PSIM=ALOG((Z+Z0)/Z0) &
1041             -ALOG((X+1.)**2.*(X**2.+1.)) &
1042             +2.*ATAN(X) &
1043             +ALOG((X+1.)**2.*(X0**2.+1.)) &
1044             -2.*ATAN(X0)
1045         FAIH=1./SQRT(1.-16.*XXX)
1046         PSIH=ALOG((Z+Z0)/Z0)+0.4*B1 &
1047             -2.*ALOG(SQRT(1.-16.*XXX)+1.) &
1048             +2.*ALOG(SQRT(1.-16.*XXX0)+1.)
1050         DPSIM=(1.-16.*XXX)**(-0.25)/XXX &
1051              -(1.-16.*XXX0)**(-0.25)/XXX
1052         DPSIH=1./SQRT(1.-16.*XXX)/XXX &
1053              -1./SQRT(1.-16.*XXX0)/XXX
1055         F=RIB*PSIM**2./PSIH-XXX
1057         DF=RIB*(2.*DPSIM*PSIM*PSIH-DPSIH*PSIM**2.) &
1058           /PSIH**2.-1.
1060         XXXP=XXX
1061         XXX=XXXP-F/DF
1062         IF(XXX <= -10.) XXX=-10.
1064       END DO
1066    ELSE IF(RIB >= 0.142857) THEN
1068       XXX=0.714
1069       PSIM=ALOG((Z+Z0)/Z0)+7.*XXX
1070       PSIH=PSIM+0.4*B1
1072    ELSE
1074       AL=ALOG((Z+Z0)/Z0)
1075       XKB=0.4*B1
1076       DD=-4.*RIB*7.*XKB*AL+(AL+XKB)**2.
1077       IF(DD <= 0.) DD=0.
1078       XXX=(AL+XKB-2.*RIB*7.*AL-SQRT(DD))/(2.*(RIB*7.**2-7.))
1079       PSIM=ALOG((Z+Z0)/Z0)+7.*MIN(XXX,0.714)
1080       PSIH=PSIM+0.4*B1
1082    END IF
1084    US=0.4*UA/PSIM             ! u*
1085    IF(US <= 0.01) US=0.01
1086    TS=0.4*(TA-TSF)/PSIH       ! T*
1088    CD=US*US/UA**2.            ! CD
1089    ALPHA=RHO*CP*0.4*US/PSIH   ! RHO*CP*CH*U
1091    RETURN 
1092    END SUBROUTINE mos
1093 !===============================================================================
1095 !  louis79
1097 !===============================================================================
1098    SUBROUTINE louis79(ALPHA,CD,RIB,Z,Z0,UA,RHO)
1100    IMPLICIT NONE
1102    REAL, PARAMETER     :: CP=0.24
1103    REAL, INTENT(IN)    :: Z, Z0, UA, RHO
1104    REAL, INTENT(OUT)   :: ALPHA, CD
1105    REAL, INTENT(INOUT) :: RIB
1106    REAL                :: A2, XX, CH, CMB, CHB
1108    A2=(0.4/ALOG(Z/Z0))**2.
1110    IF(RIB <= -15.) RIB=-15.
1112    IF(RIB >= 0.0) THEN
1113       IF(RIB >= 0.142857) THEN 
1114          XX=0.714
1115       ELSE 
1116          XX=RIB*LOG(Z/Z0)/(1.-7.*RIB)
1117       END IF 
1118       CH=0.16/0.74/(LOG(Z/Z0)+7.*MIN(XX,0.714))**2.
1119       CD=0.16/(LOG(Z/Z0)+7.*MIN(XX,0.714))**2.
1120    ELSE 
1121       CMB=7.4*A2*9.4*SQRT(Z/Z0)
1122       CHB=5.3*A2*9.4*SQRT(Z/Z0)
1123       CH=A2/0.74*(1.-9.4*RIB/(1.+CHB*SQRT(-RIB)))
1124       CD=A2*(1.-9.4*RIB/(1.+CHB*SQRT(-RIB)))
1125    END IF
1127    ALPHA=RHO*CP*CH*UA
1129    RETURN 
1130    END SUBROUTINE louis79
1131 !===============================================================================
1133 !  louis82
1135 !===============================================================================
1136    SUBROUTINE louis82(ALPHA,CD,RIB,Z,Z0,UA,RHO)
1138    IMPLICIT NONE
1140    REAL, PARAMETER     :: CP=0.24
1141    REAL, INTENT(IN)    :: Z, Z0, UA, RHO
1142    REAL, INTENT(OUT)   :: ALPHA, CD
1143    REAL, INTENT(INOUT) :: RIB 
1144    REAL                :: A2, FM, FH, CH, CHH 
1146    A2=(0.4/ALOG(Z/Z0))**2.
1148    IF(RIB <= -15.) RIB=-15.
1150    IF(RIB >= 0.0) THEN 
1151       FM=1./((1.+(2.*5.*RIB)/SQRT(1.+5.*RIB)))
1152       FH=1./(1.+(3.*5.*RIB)*SQRT(1.+5.*RIB))
1153       CH=A2*FH
1154       CD=A2*FM
1155    ELSE 
1156       CHH=5.*3.*5.*A2*SQRT(Z/Z0)
1157       FM=1.-(2.*5.*RIB)/(1.+3.*5.*5.*A2*SQRT(Z/Z0+1.)*(-RIB))
1158       FH=1.-(3.*5.*RIB)/(1.+CHH*SQRT(-RIB))
1159       CH=A2*FH
1160       CD=A2*FM
1161    END IF
1163    ALPHA=RHO*CP*CH*UA
1165    RETURN
1166    END SUBROUTINE louis82
1167 !===============================================================================
1169 !  multi_layer
1171 !===============================================================================
1172    SUBROUTINE multi_layer(KM,BOUND,G0,CAP,AKS,TSL,DZ,DELT,TSLEND)
1174    IMPLICIT NONE
1176    REAL, INTENT(IN)                   :: G0, CAP, AKS, DELT,TSLEND
1178    INTEGER, INTENT(IN)                :: KM, BOUND
1180    REAL, DIMENSION(KM), INTENT(IN)    :: DZ
1182    REAL, DIMENSION(KM), INTENT(INOUT) :: TSL
1184    REAL, DIMENSION(KM)                :: A, B, C, D, X, P, Q
1186    REAL                               :: DZEND
1188    INTEGER                            :: K
1190    DZEND=DZ(KM)
1192    A(1) = 0.0
1194    B(1) = CAP*DZ(1)/DELT &
1195           +2.*AKS/(DZ(1)+DZ(2))
1196    C(1) = -2.*AKS/(DZ(1)+DZ(2))
1197    D(1) = CAP*DZ(1)/DELT*TSL(1) + G0
1199    DO K=2,KM-1
1200       A(K) = -2.*AKS/(DZ(K-1)+DZ(K))
1201       B(K) = CAP*DZ(K)/DELT + 2.*AKS/(DZ(K-1)+DZ(K)) + 2.*AKS/(DZ(K)+DZ(K+1)) 
1202       C(K) = -2.*AKS/(DZ(K)+DZ(K+1))
1203       D(K) = CAP*DZ(K)/DELT*TSL(K)
1204    END DO 
1206    IF(BOUND == 1) THEN                  ! Flux=0
1207       A(KM) = -2.*AKS/(DZ(KM-1)+DZ(KM))
1208       B(KM) = CAP*DZ(KM)/DELT + 2.*AKS/(DZ(KM-1)+DZ(KM))  
1209       C(KM) = 0.0
1210       D(KM) = CAP*DZ(KM)/DELT*TSL(KM)
1211    ELSE                                 ! T=constant
1212       A(KM) = -2.*AKS/(DZ(KM-1)+DZ(KM))
1213       B(KM) = CAP*DZ(KM)/DELT + 2.*AKS/(DZ(KM-1)+DZ(KM)) + 2.*AKS/(DZ(KM)+DZEND) 
1214       C(KM) = 0.0
1215       D(KM) = CAP*DZ(KM)/DELT*TSL(KM) + 2.*AKS*TSLEND/(DZ(KM)+DZEND)
1216    END IF 
1218    P(1) = -C(1)/B(1)
1219    Q(1) =  D(1)/B(1)
1221    DO K=2,KM
1222       P(K) = -C(K)/(A(K)*P(K-1)+B(K))
1223       Q(K) = (-A(K)*Q(K-1)+D(K))/(A(K)*P(K-1)+B(K))
1224    END DO 
1226    X(KM) = Q(KM)
1228    DO K=KM-1,1,-1
1229       X(K) = P(K)*X(K+1)+Q(K)
1230    END DO 
1232    DO K=1,KM
1233       TSL(K) = X(K)
1234    END DO 
1236    RETURN 
1237    END SUBROUTINE multi_layer
1238 !===============================================================================
1240 !  subroutine read_param
1242 !===============================================================================
1243    SUBROUTINE read_param(UTYPE,                                        & ! in
1244                          ZR,Z0C,Z0HC,ZDC,SVF,R,RW,HGT,CDS,AS,AH,       & ! out
1245                          CAPR,CAPB,CAPG,AKSR,AKSB,AKSG,ALBR,ALBB,ALBG, & ! out
1246                          EPSR,EPSB,EPSG,Z0R,Z0B,Z0G,Z0HR,Z0HB,Z0HG,    & ! out
1247                          BETR,BETB,BETG,TRLEND,TBLEND,TGLEND,          & ! out
1248                          BOUNDR,BOUNDB,BOUNDG,CH_SCHEME,TS_SCHEME)       ! out
1250    INTEGER, INTENT(IN)  :: UTYPE 
1252    REAL, INTENT(OUT)    :: ZR,Z0C,Z0HC,ZDC,SVF,R,RW,HGT,CDS,AS,AH,       &
1253                            CAPR,CAPB,CAPG,AKSR,AKSB,AKSG,ALBR,ALBB,ALBG, &
1254                            EPSR,EPSB,EPSG,Z0R,Z0B,Z0G,Z0HR,Z0HB,Z0HG,    &
1255                            BETR,BETB,BETG,TRLEND,TBLEND,TGLEND
1257    INTEGER, INTENT(OUT) :: BOUNDR,BOUNDB,BOUNDG,CH_SCHEME,TS_SCHEME
1259    ZR =     ZR_TBL(UTYPE)
1260    Z0C=     Z0C_TBL(UTYPE)
1261    Z0HC=    Z0HC_TBL(UTYPE)
1262    ZDC=     ZDC_TBL(UTYPE)
1263    SVF=     SVF_TBL(UTYPE)
1264    R=       R_TBL(UTYPE)
1265    RW=      RW_TBL(UTYPE)
1266    HGT=     HGT_TBL(UTYPE)
1267    CDS=     CDS_TBL(UTYPE)
1268    AS=      AS_TBL(UTYPE)
1269    AH=      AH_TBL(UTYPE)
1270    BETR=    BETR_TBL(UTYPE)
1271    BETB=    BETB_TBL(UTYPE)
1272    BETG=    BETG_TBL(UTYPE)
1274 !m   FRC_URB= FRC_URB_TBL(UTYPE)
1276    CAPR=    CAPR_DATA
1277    CAPB=    CAPB_DATA
1278    CAPG=    CAPG_DATA
1279    AKSR=    AKSR_DATA
1280    AKSB=    AKSB_DATA
1281    AKSG=    AKSG_DATA
1282    ALBR=    ALBR_DATA
1283    ALBB=    ALBB_DATA
1284    ALBG=    ALBG_DATA
1285    EPSR=    EPSR_DATA
1286    EPSB=    EPSB_DATA
1287    EPSG=    EPSG_DATA
1288    Z0R=     Z0R_DATA
1289    Z0B=     Z0B_DATA
1290    Z0G=     Z0G_DATA
1291    Z0HR=    Z0HR_DATA
1292    Z0HB=    Z0HB_DATA
1293    Z0HG=    Z0HG_DATA
1294    TRLEND=  TRLEND_DATA
1295    TBLEND=  TBLEND_DATA
1296    TGLEND=  TGLEND_DATA
1297    BOUNDR=  BOUNDR_DATA
1298    BOUNDB=  BOUNDB_DATA
1299    BOUNDG=  BOUNDG_DATA
1300    CH_SCHEME = CH_SCHEME_DATA
1301    TS_SCHEME = TS_SCHEME_DATA
1303    RETURN
1304    END SUBROUTINE read_param
1305 !===============================================================================
1307 ! subroutine urban_param_init: Read parameters from urban_param.tbl
1309 !===============================================================================
1310    SUBROUTINE urban_param_init(DZR,DZB,DZG,num_soil_layers &
1311                                )
1312 !                              num_roof_layers,num_wall_layers,num_road_layers)
1314    IMPLICIT NONE
1316    INTEGER, INTENT(IN) :: num_soil_layers
1318 !   REAL, DIMENSION(1:num_roof_layers), INTENT(INOUT) :: DZR
1319 !   REAL, DIMENSION(1:num_wall_layers), INTENT(INOUT) :: DZB
1320 !   REAL, DIMENSION(1:num_road_layers), INTENT(INOUT) :: DZG
1321    REAL, DIMENSION(1:num_soil_layers), INTENT(INOUT) :: DZR
1322    REAL, DIMENSION(1:num_soil_layers), INTENT(INOUT) :: DZB
1323    REAL, DIMENSION(1:num_soil_layers), INTENT(INOUT) :: DZG
1325    INTEGER :: INDEX, LC, K
1326    INTEGER :: IOSTATUS, ALLOCATE_STATUS
1327    INTEGER :: num_roof_layers
1328    INTEGER :: num_wall_layers
1329    INTEGER :: num_road_layers
1330    INTEGER :: dummy 
1331    REAL    :: DHGT, HGT, VFWS, VFGS
1333    OPEN (UNIT=11,                &
1334          FILE='urban_param.tbl', &
1335          ACCESS='SEQUENTIAL',    &
1336          STATUS='OLD',           &
1337          ACTION='READ',          &
1338          POSITION='REWIND',      &
1339          IOSTAT=IOSTATUS)
1341    IF (IOSTATUS > 0) STOP 'ERROR OPEN urban_param.tbl'
1343    READ(11,*)
1344    READ(11,'(A4)') LU_DATA_TYPE
1346    READ(11,*) ICATE
1347    ALLOCATE( ZR_TBL(ICATE), stat=allocate_status )
1348    if(allocate_status == 0) THEN
1349    ALLOCATE( Z0C_TBL(ICATE), stat=allocate_status )
1350     if(allocate_status /= 0) stop 'error allocate Z0C_TBL in urban_param_init'
1351    IF( .NOT. ALLOCATED( Z0HC_TBL ) ) &
1352    ALLOCATE( Z0HC_TBL(ICATE), stat=allocate_status ) 
1353     if(allocate_status /= 0) stop 'error allocate Z0HC_TBL in urban_param_init'
1354    IF( .NOT. ALLOCATED( ZDC_TBL ) ) &
1355    ALLOCATE( ZDC_TBL(ICATE), stat=allocate_status )
1356     if(allocate_status /= 0) stop 'error allocate ZDC_TBL in urban_param_init'
1357    IF( .NOT. ALLOCATED( SVF_TBL ) ) &
1358    ALLOCATE( SVF_TBL(ICATE), stat=allocate_status ) 
1359     if(allocate_status /= 0) stop 'error allocate SVF_TBL in urban_param_init'
1360    IF( .NOT. ALLOCATED( R_TBL ) ) &
1361    ALLOCATE( R_TBL(ICATE), stat=allocate_status )
1362     if(allocate_status /= 0) stop 'error allocate R_TBL in urban_param_init'
1363    IF( .NOT. ALLOCATED( RW_TBL ) ) &
1364    ALLOCATE( RW_TBL(ICATE), stat=allocate_status )
1365     if(allocate_status /= 0) stop 'error allocate RW_TBL in urban_param_init'
1366    IF( .NOT. ALLOCATED( HGT_TBL ) ) &
1367    ALLOCATE( HGT_TBL(ICATE), stat=allocate_status )
1368     if(allocate_status /= 0) stop 'error allocate HGT_TBL in urban_param_init'
1369    IF( .NOT. ALLOCATED( CDS_TBL ) ) &
1370    ALLOCATE( CDS_TBL(ICATE), stat=allocate_status )
1371     if(allocate_status /= 0) stop 'error allocate CDS_TBL in urban_param_init'
1372    IF( .NOT. ALLOCATED( AS_TBL ) ) &
1373    ALLOCATE( AS_TBL(ICATE), stat=allocate_status )
1374     if(allocate_status /= 0) stop 'error allocate AS_TBL in urban_param_init'
1375    IF( .NOT. ALLOCATED( AH_TBL ) ) &
1376    ALLOCATE( AH_TBL(ICATE), stat=allocate_status )
1377     if(allocate_status /= 0) stop 'error allocate AH_TBL in urban_param_init'
1378    IF( .NOT. ALLOCATED( BETR_TBL ) ) &
1379    ALLOCATE( BETR_TBL(ICATE), stat=allocate_status )
1380     if(allocate_status /= 0) stop 'error allocate BETR_TBL in urban_param_init'
1381    IF( .NOT. ALLOCATED( BETB_TBL ) ) &
1382    ALLOCATE( BETB_TBL(ICATE), stat=allocate_status )
1383     if(allocate_status /= 0) stop 'error allocate BETB_TBL in urban_param_init'
1384    IF( .NOT. ALLOCATED( BETG_TBL ) ) &
1385    ALLOCATE( BETG_TBL(ICATE), stat=allocate_status )
1386     if(allocate_status /= 0) stop 'error allocate BETG_TBL in urban_param_init'
1387    ALLOCATE( FRC_URB_TBL(ICATE), stat=allocate_status )
1388     if(allocate_status /= 0) stop 'error allocate FRC_URB_TBL in urban_param_init'
1390 ENDIF
1392    DO LC = 1, ICATE
1393       READ(11,*) INDEX,        &
1394                  ZR_TBL(LC),   &
1395                  Z0C_TBL(LC),  &
1396                  Z0HC_TBL(LC), &
1397                  ZDC_TBL(LC),  &
1398                  SVF_TBL(LC),  &
1399                  R_TBL(LC),    &
1400                  RW_TBL(LC),   &
1401                  HGT_TBL(LC),  &
1402                  CDS_TBL(LC),  &
1403                  AS_TBL(LC),   &
1404                  AH_TBL(LC),   &
1405                  BETR_TBL(LC), &
1406                  BETB_TBL(LC), &
1407                  BETG_TBL(LC), &
1408                  FRC_URB_TBL(LC)  
1409    END DO
1411    READ(11,*)
1412    READ(11,*) CAPR_DATA
1413    READ(11,*)
1414    READ(11,*) CAPB_DATA
1415    READ(11,*)
1416    READ(11,*) CAPG_DATA
1417    READ(11,*)
1418    READ(11,*) AKSR_DATA
1419    READ(11,*)
1420    READ(11,*) AKSB_DATA
1421    READ(11,*)
1422    READ(11,*) AKSG_DATA
1423    READ(11,*)
1424    READ(11,*) ALBR_DATA
1425    READ(11,*)
1426    READ(11,*) ALBB_DATA
1427    READ(11,*)
1428    READ(11,*) ALBG_DATA
1429    READ(11,*)
1430    READ(11,*) EPSR_DATA
1431    READ(11,*)
1432    READ(11,*) EPSB_DATA
1433    READ(11,*)
1434    READ(11,*) EPSG_DATA
1435    READ(11,*)
1436    READ(11,*) Z0R_DATA
1437    READ(11,*)
1438    READ(11,*) Z0B_DATA
1439    READ(11,*)
1440    READ(11,*) Z0G_DATA
1441    READ(11,*)
1442    READ(11,*) Z0HR_DATA
1443    READ(11,*)
1444    READ(11,*) Z0HB_DATA
1445    READ(11,*)
1446    READ(11,*) Z0HG_DATA
1447    READ(11,*)
1448 !   READ(11,*) num_roof_layers
1449    READ(11,*) dummy 
1450    READ(11,*)
1451 !   READ(11,*) num_wall_layers
1452    READ(11,*) dummy 
1453    READ(11,*)
1454 !   READ(11,*) num_road_layers
1455    READ(11,*) dummy 
1457    num_roof_layers = num_soil_layers
1458    num_wall_layers = num_soil_layers
1459    num_road_layers = num_soil_layers
1461    DO K=1,num_roof_layers
1462       READ(11,*)
1463       READ(11,*) DZR(K)
1464    END DO
1466    DO K=1,num_wall_layers
1467       READ(11,*)
1468       READ(11,*) DZB(K)
1469    END DO
1471    DO K=1,num_road_layers
1472       READ(11,*)
1473       READ(11,*) DZG(K)
1474    END DO
1476    READ(11,*)
1477    READ(11,*) BOUNDR_DATA
1478    READ(11,*)
1479    READ(11,*) BOUNDB_DATA
1480    READ(11,*)
1481    READ(11,*) BOUNDG_DATA
1482    READ(11,*)
1483    READ(11,*) TRLEND_DATA
1484    READ(11,*)
1485    READ(11,*) TBLEND_DATA
1486    READ(11,*)
1487    READ(11,*) TGLEND_DATA
1488    READ(11,*)
1489    READ(11,*) CH_SCHEME_DATA
1490    READ(11,*)
1491    READ(11,*) TS_SCHEME_DATA
1492 ! Miao, 2007/01/17, cal. ah
1493    READ(11,*)
1494    READ(11,*) ahoption
1495    if(ahoption==1) then
1496      READ(11,*)
1497      READ(11,*) (ahdiuprf(k),k=1,24)
1498    endif
1500    CLOSE(11)
1502 ! Calculate Sky View Factor
1504    DO LC = 1, ICATE
1505       DHGT=HGT_TBL(LC)/100.
1506       HGT=0.
1507       VFWS=0.
1508       HGT=HGT_TBL(LC)-DHGT/2.
1509       do k=1,99
1510          HGT=HGT-DHGT
1511          VFWS=VFWS+0.25*(1.-HGT/SQRT(HGT**2.+RW_TBL(LC)**2.))
1512       end do
1514      VFWS=VFWS/99.
1515      VFWS=VFWS*2.
1517      VFGS=1.-2.*VFWS*HGT_TBL(LC)/RW_TBL(LC)
1518      SVF_TBL(LC)=VFGS
1519    END DO
1521    END SUBROUTINE urban_param_init
1522 !===========================================================================
1524 ! subroutine urban_var_init: initialization of urban state variables
1526 !===========================================================================
1527    SUBROUTINE urban_var_init(TSURFACE0_URB,TLAYER0_URB,TDEEP0_URB,IVGTYP,     & ! in
1528                              ims,ime,jms,jme,num_soil_layers,                 & ! in
1529 !                             num_roof_layers,num_wall_layers,num_road_layers, & ! in
1530                              restart,                                      & !in
1531                              XXXR_URB2D,XXXB_URB2D,XXXG_URB2D,XXXC_URB2D,  & ! inout
1532                              TR_URB2D,TB_URB2D,TG_URB2D,TC_URB2D,QC_URB2D, & ! inout
1533                              TRL_URB3D,TBL_URB3D,TGL_URB3D,                & ! inout
1534                              SH_URB2D,LH_URB2D,G_URB2D,RN_URB2D,           & ! inout
1535                              TS_URB2D, FRC_URB2D, UTYPE_URB2D)               ! inout
1536    IMPLICIT NONE
1538    INTEGER, INTENT(IN) :: ims,ime,jms,jme,num_soil_layers
1539 !   INTEGER, INTENT(IN) :: num_roof_layers, num_wall_layers, num_road_layers
1541    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN)                    :: TSURFACE0_URB
1542    REAL, DIMENSION( ims:ime, 1:num_soil_layers, jms:jme ), INTENT(IN) :: TLAYER0_URB
1543    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN)                    :: TDEEP0_URB
1544    INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN)                 :: IVGTYP
1545    LOGICAL , INTENT(IN) :: restart
1547    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TR_URB2D
1548    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TB_URB2D
1549    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TG_URB2D
1550    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TC_URB2D
1551    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QC_URB2D
1552    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXR_URB2D
1553    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXB_URB2D
1554    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXG_URB2D
1555    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXC_URB2D
1557 !   REAL, DIMENSION(ims:ime, 1:num_roof_layers, jms:jme), INTENT(INOUT) :: TRL_URB3D
1558 !   REAL, DIMENSION(ims:ime, 1:num_wall_layers, jms:jme), INTENT(INOUT) :: TBL_URB3D
1559 !   REAL, DIMENSION(ims:ime, 1:num_road_layers, jms:jme), INTENT(INOUT) :: TGL_URB3D
1560    REAL, DIMENSION(ims:ime, 1:num_soil_layers, jms:jme), INTENT(INOUT) :: TRL_URB3D
1561    REAL, DIMENSION(ims:ime, 1:num_soil_layers, jms:jme), INTENT(INOUT) :: TBL_URB3D
1562    REAL, DIMENSION(ims:ime, 1:num_soil_layers, jms:jme), INTENT(INOUT) :: TGL_URB3D
1564    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SH_URB2D
1565    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH_URB2D
1566    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: G_URB2D
1567    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RN_URB2D
1568    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TS_URB2D
1570    REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FRC_URB2D
1571    INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UTYPE_URB2D
1572    INTEGER                                            :: UTYPE_URB
1574    INTEGER :: I,J,K
1576    DO I=ims,ime
1577     DO J=jms,jme
1579 !      XXXR_URB2D(I,J)=0.
1580 !      XXXB_URB2D(I,J)=0.
1581 !      XXXG_URB2D(I,J)=0.
1582 !      XXXC_URB2D(I,J)=0.
1584       SH_URB2D(I,J)=0.
1585       LH_URB2D(I,J)=0.
1586       G_URB2D(I,J)=0.
1587       RN_URB2D(I,J)=0.
1589       FRC_URB2D(I,J)=0.
1590       UTYPE_URB2D(I,J)=0.
1592             IF( IVGTYP(I,J) == 1)  THEN
1593                UTYPE_URB2D(I,J) = 2  ! for default. high-density
1594                UTYPE_URB = UTYPE_URB2D(I,J)  ! for default. high-density
1595                FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB)
1596             ENDIF
1597             IF( IVGTYP(I,J) == 31) THEN
1598                UTYPE_URB2D(I,J) = 3  ! low-density residential
1599                UTYPE_URB = UTYPE_URB2D(I,J)  ! low-density residential
1600                FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB) 
1601             ENDIF
1602             IF( IVGTYP(I,J) == 32) THEN
1603                UTYPE_URB2D(I,J) = 2  ! high-density
1604                UTYPE_URB = UTYPE_URB2D(I,J)  ! high-density
1605                FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB) 
1606             ENDIF
1607             IF( IVGTYP(I,J) == 33) THEN
1608                UTYPE_URB2D(I,J) = 1  !  Commercial/Industrial/Transportation
1609                UTYPE_URB = UTYPE_URB2D(I,J)  !  Commercial/Industrial/Transportation
1610                FRC_URB2D(I,J) = FRC_URB_TBL(UTYPE_URB) 
1611             ENDIF
1614       QC_URB2D(I,J)=0.01
1616        IF (.not.restart) THEN
1618       XXXR_URB2D(I,J)=0.
1619       XXXB_URB2D(I,J)=0.
1620       XXXG_URB2D(I,J)=0.
1621       XXXC_URB2D(I,J)=0.
1624       TC_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
1625       TR_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
1626       TB_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
1627       TG_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
1629       TS_URB2D(I,J)=TSURFACE0_URB(I,J)+0.
1631 !      DO K=1,num_roof_layers
1632 !     DO K=1,num_soil_layers
1633 !         TRL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
1634 !         TRL_URB3D(I,2,J)=TLAYER0_URB(I,2,J)+0.
1635 !         TRL_URB3D(I,3,J)=TLAYER0_URB(I,3,J)+0.
1636 !         TRL_URB3D(I,4,J)=TLAYER0_URB(I,4,J)+0.
1638           TRL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
1639           TRL_URB3D(I,2,J)=0.5*(TLAYER0_URB(I,1,J)+TLAYER0_URB(I,2,J))
1640           TRL_URB3D(I,3,J)=TLAYER0_URB(I,2,J)+0.
1641           TRL_URB3D(I,4,J)=TLAYER0_URB(I,2,J)+(TLAYER0_URB(I,3,J)-TLAYER0_URB(I,2,J))*0.29
1642 !     END DO
1644 !      DO K=1,num_wall_layers
1645 !      DO K=1,num_soil_layers
1646 !m        TBL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
1647 !m        TBL_URB3D(I,2,J)=TLAYER0_URB(I,2,J)+0.
1648 !m        TBL_URB3D(I,3,J)=TLAYER0_URB(I,3,J)+0.
1649 !m        TBL_URB3D(I,4,J)=TLAYER0_URB(I,4,J)+0.
1651         TBL_URB3D(I,1,J)=TLAYER0_URB(I,1,J)+0.
1652         TBL_URB3D(I,2,J)=0.5*(TLAYER0_URB(I,1,J)+TLAYER0_URB(I,2,J))
1653         TBL_URB3D(I,3,J)=TLAYER0_URB(I,2,J)+0.
1654         TBL_URB3D(I,4,J)=TLAYER0_URB(I,2,J)+(TLAYER0_URB(I,3,J)-TLAYER0_URB(I,2,J))*0.29
1655 !      END DO
1657 !      DO K=1,num_road_layers
1658       DO K=1,num_soil_layers
1659         TGL_URB3D(I,K,J)=TLAYER0_URB(I,K,J)+0.
1660       END DO
1662      ENDIF        !restart
1663     END DO
1664    END DO
1666    RETURN
1667    END SUBROUTINE urban_var_init
1668 !===========================================================================
1670 !  force_restore
1672 !===========================================================================
1673    SUBROUTINE force_restore(CAP,AKS,DELT,S,R,H,LE,TSLEND,TSP,TS)
1675      REAL, INTENT(IN)  :: CAP,AKS,DELT,S,R,H,LE,TSLEND,TSP
1676      REAL, INTENT(OUT) :: TS
1677      REAL              :: C1,C2
1679      C2=24.*3600./2./3.14159
1680      C1=SQRT(0.5*C2*CAP*AKS)
1682      TS = TSP + DELT*( (S+R-H-LE)/C1 -(TSP-TSLEND)/C2 )
1684    END SUBROUTINE force_restore
1685 !===========================================================================
1687 !  bisection (not used)
1689 !============================================================================== 
1690    SUBROUTINE bisection(TSP,PS,S,EPS,RX,SIG,RHO,CP,CH,UA,QA,TA,EL,BET,AKS,TSL,DZ,TS) 
1692      REAL, INTENT(IN) :: TSP,PS,S,EPS,RX,SIG,RHO,CP,CH,UA,QA,TA,EL,BET,AKS,TSL,DZ
1693      REAL, INTENT(OUT) :: TS
1694      REAL :: ES,QS0,R,H,ELE,G0,F1,F
1696      TS1 = TSP - 5.
1697      TS2 = TSP + 5.
1699      DO ITERATION = 1,22
1701        ES=6.11*EXP( (2.5*10.**6./461.51)*(TS1-273.15)/(273.15*TS1) )
1702        QS0=0.622*ES/(PS-0.378*ES)
1703        R=EPS*(RX-SIG*(TS1**4.)/60.)
1704        H=RHO*CP*CH*UA*(TS1-TA)*100.
1705        ELE=RHO*EL*CH*UA*BET*(QS0-QA)*100.
1706        G0=AKS*(TS1-TSL)/(DZ/2.)
1707        F1= S + R - H - ELE - G0
1709        TS=0.5*(TS1+TS2)
1711        ES=6.11*EXP( (2.5*10.**6./461.51)*(TS-273.15)/(273.15*TS) )
1712        QS0=0.622*ES/(PS-0.378*ES) 
1713        R=EPS*(RX-SIG*(TS**4.)/60.)
1714        H=RHO*CP*CH*UA*(TS-TA)*100.
1715        ELE=RHO*EL*CH*UA*BET*(QS0-QA)*100.
1716        G0=AKS*(TS-TSL)/(DZ/2.)
1717        F = S + R - H - ELE - G0
1719        IF (F1*F > 0.0) THEN
1720          TS1=TS
1721         ELSE
1722          TS2=TS
1723        END IF
1725      END DO
1727      RETURN
1728 END SUBROUTINE bisection
1729 !===========================================================================
1730 END MODULE module_sf_urban