1 MODULE module_sf_noahdrv
3 !-------------------------------
9 USE module_data_gocart_dust
11 !-------------------------------
16 !----------------------------------------------------------------
17 ! Urban related variable are added to arguments - urban
18 !----------------------------------------------------------------
19 SUBROUTINE lsm(DZ8W,QV3D,P8W3D,T3D,TSK, &
20 HFX,QFX,LH,GRDFLX, QGH,GSW,SWDOWN,GLW,SMSTAV,SMSTOT, &
21 SFCRUNOFF, UDRUNOFF,IVGTYP,ISLTYP,ISURBAN,ISICE,VEGFRA, &
22 ALBEDO,ALBBCK,ZNT,Z0,TMN,XLAND,XICE,EMISS,EMBCK, &
23 SNOWC,QSFC,RAINBL,MMINLU, &
24 num_soil_layers,DT,DZS,ITIMESTEP, &
25 SMOIS,TSLB,SNOW,CANWAT, &
26 CHS,CHS2,CQS2,CPM,ROVCP,SR,chklowq,lai,qz0, & !H
30 SNOALB,SHDMIN,SHDMAX, & !I
40 ids,ide, jds,jde, kds,kde, &
41 ims,ime, jms,jme, kms,kme, &
42 its,ite, jts,jte, kts,kte, &
44 CMR_SFCDIF,CHR_SFCDIF,CMC_SFCDIF,CHC_SFCDIF, &
46 TR_URB2D,TB_URB2D,TG_URB2D,TC_URB2D,QC_URB2D, & !H urban
48 XXXR_URB2D,XXXB_URB2D,XXXG_URB2D,XXXC_URB2D, & !H urban
49 TRL_URB3D,TBL_URB3D,TGL_URB3D, & !H urban
50 SH_URB2D,LH_URB2D,G_URB2D,RN_URB2D,TS_URB2D, & !H urban
51 PSIM_URB2D,PSIH_URB2D,U10_URB2D,V10_URB2D, & !O urban
52 GZ1OZ0_URB2D, AKMS_URB2D, & !O urban
53 TH2_URB2D,Q2_URB2D, UST_URB2D, & !O urban
54 DECLIN_URB,COSZ_URB2D,OMG_URB2D, & !I urban
55 XLAT_URB2D, & !I urban
56 num_roof_layers, num_wall_layers, & !I urban
57 num_road_layers, DZR, DZB, DZG, & !I urban
58 FRC_URB2D,UTYPE_URB2D, & !O
59 num_urban_layers, & !I multi-layer urban
60 trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, & !H multi-layer urban
61 tlev_urb3d,qlev_urb3d, & !H multi-layer urban
62 tw1lev_urb3d,tw2lev_urb3d, & !H multi-layer urban
63 tglev_urb3d,tflev_urb3d, & !H multi-layer urban
64 sf_ac_urb3d,lf_ac_urb3d,cm_ac_urb3d, & !H multi-layer urban
65 sfvent_urb3d,lfvent_urb3d, & !H multi-layer urban
66 sfwin1_urb3d,sfwin2_urb3d, & !H multi-layer urban
67 sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, & !H multi-layer urban
68 th_phy,rho,p_phy,ust, & !I multi-layer urban
69 gmt,julday,xlong,xlat, & !I multi-layer urban
70 a_u_bep,a_v_bep,a_t_bep,a_q_bep, & !O multi-layer urban
71 a_e_bep,b_u_bep,b_v_bep, & !O multi-layer urban
72 b_t_bep,b_q_bep,b_e_bep,dlg_bep, & !O multi-layer urban
73 dl_u_bep,sf_bep,vl_bep ) !O multi-layer urban
75 !----------------------------------------------------------------
77 !----------------------------------------------------------------
78 !----------------------------------------------------------------
79 ! --- atmospheric (WRF generic) variables
80 !-- DT time step (seconds)
81 !-- DZ8W thickness of layers (m)
82 !-- T3D temperature (K)
83 !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
84 !-- P3D 3D pressure (Pa)
85 !-- FLHC exchange coefficient for heat (m/s)
86 !-- FLQC exchange coefficient for moisture (m/s)
87 !-- PSFC surface pressure (Pa)
88 !-- XLAND land mask (1 for land, 2 for water)
89 !-- QGH saturated mixing ratio at 2 meter
90 !-- GSW downward short wave flux at ground surface (W/m^2)
91 !-- GLW downward long wave flux at ground surface (W/m^2)
93 !-- CANWAT canopy moisture content (mm)
94 !-- TSK surface temperature (K)
95 !-- TSLB soil temp (k)
96 !-- SMOIS total soil moisture content (volumetric fraction)
97 !-- SH2O unfrozen soil moisture content (volumetric fraction)
98 ! note: frozen soil moisture (i.e., soil ice) = SMOIS - SH2O
99 !-- SNOWH actual snow depth (m)
100 !-- SNOW liquid water-equivalent snow depth (m)
101 !-- ALBEDO time-varying surface albedo including snow effect (unitless fraction)
102 !-- ALBBCK background surface albedo (unitless fraction)
103 !-- CHS surface exchange coefficient for heat and moisture (m s-1);
104 !-- CHS2 2m surface exchange coefficient for heat (m s-1);
105 !-- CQS2 2m surface exchange coefficient for moisture (m s-1);
107 !-- num_soil_layers the number of soil layers
108 !-- ZS depths of centers of soil layers (m)
109 !-- DZS thicknesses of soil layers (m)
110 !-- SLDPTH thickness of each soil layer (m, same as DZS)
111 !-- TMN soil temperature at lower boundary (K)
112 !-- SMCWLT wilting point (volumetric)
113 !-- SMCDRY dry soil moisture threshold where direct evap from
114 ! top soil layer ends (volumetric)
115 !-- SMCREF soil moisture threshold below which transpiration begins to
116 ! stress (volumetric)
117 !-- SMCMAX porosity, i.e. saturated value of soil moisture (volumetric)
118 !-- NROOT number of root layers, a function of veg type, determined
119 ! in subroutine redprm.
120 !-- SMSTAV Soil moisture availability for evapotranspiration (
121 ! fraction between SMCWLT and SMCMXA)
122 !-- SMSTOT Total soil moisture content frozen+unfrozen) in the soil column (mm)
124 !-- SNOWC fraction snow coverage (0-1.0)
125 ! --- vegetation variables
126 !-- SNOALB upper bound on maximum albedo over deep snow
127 !-- SHDMIN minimum areal fractional coverage of annual green vegetation
128 !-- SHDMAX maximum areal fractional coverage of annual green vegetation
129 !-- XLAI leaf area index (dimensionless)
130 !-- Z0BRD Background fixed roughness length (M)
131 !-- Z0 Background vroughness length (M) as function
132 !-- ZNT Time varying roughness length (M) as function
133 !-- ALBD(IVGTPK,ISN) background albedo reading from a table
135 !-- HFX upward heat flux at the surface (W/m^2)
136 !-- QFX upward moisture flux at the surface (kg/m^2/s)
137 !-- LH upward moisture flux at the surface (W m-2)
138 !-- GRDFLX(I,J) ground heat flux (W m-2)
139 !-- FDOWN radiation forcing at the surface (W m-2) = SOLDN*(1-alb)+LWDN
140 !----------------------------------------------------------------------------
141 !-- EC canopy water evaporation ((W m-2)
142 !-- EDIR direct soil evaporation (W m-2)
143 !-- ET plant transpiration from a particular root layer (W m-2)
144 !-- ETT total plant transpiration (W m-2)
145 !-- ESNOW sublimation from (or deposition to if <0) snowpack (W m-2)
146 !-- DRIP through-fall of precip and/or dew in excess of canopy
147 ! water-holding capacity (m)
148 !-- DEW dewfall (or frostfall for t<273.15) (M)
149 !-- SMAV Soil Moisture Availability for each layer, as a fraction
150 ! between SMCWLT and SMCMAX (dimensionless fraction)
151 ! ----------------------------------------------------------------------
152 !-- BETA ratio of actual/potential evap (dimensionless)
153 !-- ETP potential evaporation (W m-2)
154 ! ----------------------------------------------------------------------
155 !-- FLX1 precip-snow sfc (W m-2)
156 !-- FLX2 freezing rain latent heat flux (W m-2)
157 !-- FLX3 phase-change heat flux from snowmelt (W m-2)
158 ! ----------------------------------------------------------------------
159 !-- ACSNOM snow melt (mm) (water equivalent)
160 !-- ACSNOW accumulated snow fall (mm) (water equivalent)
161 !-- SNOPCX snow phase change heat flux (W/m^2)
162 !-- POTEVP accumulated potential evaporation (W/m^2)
163 !-- RIB Documentation needed!!!
164 ! ----------------------------------------------------------------------
165 !-- RUNOFF1 surface runoff (m s-1), not infiltrating the surface
166 !-- RUNOFF2 subsurface runoff (m s-1), drainage out bottom of last
167 ! soil layer (baseflow)
168 ! important note: here RUNOFF2 is actually the sum of RUNOFF2 and RUNOFF3
169 !-- RUNOFF3 numerical trunctation in excess of porosity (smcmax)
170 ! for a given soil layer at the end of a time step (m s-1).
171 !SFCRUNOFF Surface Runoff (mm)
172 !UDRUNOFF Total Underground Runoff (mm), which is the sum of RUNOFF2 and RUNOFF3
173 ! ----------------------------------------------------------------------
174 !-- RC canopy resistance (s m-1)
175 !-- PC plant coefficient (unitless fraction, 0-1) where PC*ETP = actual transp
176 !-- RSMIN minimum canopy resistance (s m-1)
177 !-- RCS incoming solar rc factor (dimensionless)
178 !-- RCT air temperature rc factor (dimensionless)
179 !-- RCQ atmos vapor pressure deficit rc factor (dimensionless)
180 !-- RCSOIL soil moisture rc factor (dimensionless)
182 !-- EMISS surface emissivity (between 0 and 1)
183 !-- EMBCK Background surface emissivity (between 0 and 1)
186 ! (R_d/R_v) (dimensionless)
187 !-- ids start index for i in domain
188 !-- ide end index for i in domain
189 !-- jds start index for j in domain
190 !-- jde end index for j in domain
191 !-- kds start index for k in domain
192 !-- kde end index for k in domain
193 !-- ims start index for i in memory
194 !-- ime end index for i in memory
195 !-- jms start index for j in memory
196 !-- jme end index for j in memory
197 !-- kms start index for k in memory
198 !-- kme end index for k in memory
199 !-- its start index for i in tile
200 !-- ite end index for i in tile
201 !-- jts start index for j in tile
202 !-- jte end index for j in tile
203 !-- kts start index for k in tile
204 !-- kte end index for k in tile
206 !-- SR fraction of frozen precip (0.0 to 1.0)
207 !----------------------------------------------------------------
211 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
212 ims,ime, jms,jme, kms,kme, &
213 its,ite, jts,jte, kts,kte
215 INTEGER, INTENT(IN ) :: sf_urban_physics !urban
216 INTEGER, INTENT(IN ) :: isurban
217 INTEGER, INTENT(IN ) :: isice
219 REAL, DIMENSION( ims:ime, jms:jme ) , &
220 INTENT(IN ) :: TMN, &
228 SWDOWN, & !added 10 jan 2007
234 REAL, DIMENSION( ims:ime, jms:jme ) , &
235 INTENT(INOUT) :: ALBBCK, &
237 CHARACTER(LEN=*), INTENT(IN ) :: MMINLU
239 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
240 INTENT(IN ) :: QV3D, &
244 REAL, DIMENSION( ims:ime, jms:jme ) , &
245 INTENT(IN ) :: QGH, &
248 INTEGER, DIMENSION( ims:ime, jms:jme ) , &
249 INTENT(IN ) :: IVGTYP, &
252 INTEGER, INTENT(IN) :: num_soil_layers,ITIMESTEP
254 REAL, INTENT(IN ) :: DT,ROVCP
256 REAL, DIMENSION(1:num_soil_layers), INTENT(IN)::DZS
260 REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), &
261 INTENT(INOUT) :: SMOIS, & ! total soil moisture
262 SH2O, & ! new soil liquid
265 REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), &
266 INTENT(OUT) :: SMCREL
268 REAL, DIMENSION( ims:ime, jms:jme ) , &
269 INTENT(INOUT) :: TSK, & !was TGB (temperature)
295 REAL, DIMENSION( ims:ime, jms:jme ) , &
296 INTENT(OUT) :: NOAHRES
298 REAL, DIMENSION( ims:ime, jms:jme ) , &
299 INTENT(OUT) :: CHKLOWQ
300 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LAI
301 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: QZ0
303 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMR_SFCDIF
304 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHR_SFCDIF
305 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMC_SFCDIF
306 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHC_SFCDIF
307 ! Local variables (moved here from driver to make routine thread safe, 20031007 jm)
309 REAL, DIMENSION(1:num_soil_layers) :: ET
311 REAL, DIMENSION(1:num_soil_layers) :: SMAV
313 REAL :: BETA, ETP, SSOIL,EC, EDIR, ESNOW, ETT, &
314 FLX1,FLX2,FLX3, DRIP,DEW,FDOWN,RC,PC,RSMIN,XLAI, &
316 RCS,RCT,RCQ,RCSOIL,FFROZP
318 LOGICAL, INTENT(IN ) :: myj,frpcpn
320 ! DECLARATIONS - LOGICAL
321 ! ----------------------------------------------------------------------
322 LOGICAL, PARAMETER :: LOCAL=.false.
323 LOGICAL :: FRZGRA, SNOWNG
327 ! ----------------------------------------------------------------------
328 ! DECLARATIONS - INTEGER
329 ! ----------------------------------------------------------------------
330 INTEGER :: I,J, ICE,NSOIL,SLOPETYP,SOILTYP,VEGTYP
334 ! ----------------------------------------------------------------------
335 ! DECLARATIONS - REAL
336 ! ----------------------------------------------------------------------
338 REAL :: SHMIN,SHMAX,DQSDT2,LWDN,PRCP,PRCPRAIN, &
339 Q2SAT,Q2SATI,SFCPRS,SFCSPD,SFCTMP,SHDFAC,SNOALB1, &
340 SOLDN,TBOT,ZLVL, Q2K,ALBBRD, ALBEDOK, ETA, ETA_KINEMATIC, &
342 Z0K,RUNOFF1,RUNOFF2,RUNOFF3,SHEAT,SOLNET,E2SAT,SFCTSNO, &
343 ! mek, WRF testing, expanded diagnostics
344 SOLUP,LWUP,RNET,RES,Q1SFC,TAIRV,SATFLG
347 ! MEK JUL2007 for pot. evap.
353 REAL :: SNCOVR,SNEQV,SNOWHK,CMC, CHK,TH2
355 REAL :: SMCDRY,SMCMAX,SMCREF,SMCWLT,SNOMLT,SOILM,SOILW,Q1,T1
356 REAL :: SNOTIME1 ! LSTSNW1 INITIAL NUMBER OF TIMESTEPS SINCE LAST SNOWFALL
360 REAL :: COSZ, SOLARDIRECT
362 REAL, DIMENSION(1:num_soil_layers):: SLDPTH, STC,SMC,SWC
364 REAL, DIMENSION(1:num_soil_layers) :: ZSOIL, RTDIS
365 REAL, PARAMETER :: TRESH=.95E0, A2=17.67,A3=273.15,A4=29.65, &
366 T0=273.16E0, ELWV=2.50E6, A23M4=A2*(A3-A4)
368 REAL, PARAMETER :: ROW=1.E3,ELIW=XLF,ROWLIW=ROW*ELIW
370 ! ----------------------------------------------------------------------
371 ! DECLARATIONS START - urban
372 ! ----------------------------------------------------------------------
374 ! input variables surface_driver --> lsm
375 INTEGER, INTENT(IN) :: num_roof_layers
376 INTEGER, INTENT(IN) :: num_wall_layers
377 INTEGER, INTENT(IN) :: num_road_layers
378 REAL, OPTIONAL, DIMENSION(1:num_roof_layers), INTENT(IN) :: DZR
379 REAL, OPTIONAL, DIMENSION(1:num_wall_layers), INTENT(IN) :: DZB
380 REAL, OPTIONAL, DIMENSION(1:num_road_layers), INTENT(IN) :: DZG
381 REAL, OPTIONAL, INTENT(IN) :: DECLIN_URB
382 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: COSZ_URB2D
383 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: OMG_URB2D
384 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XLAT_URB2D
385 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: U_PHY
386 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: V_PHY
387 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: TH_PHY
388 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: P_PHY
389 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: RHO
390 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UST
392 LOGICAL, intent(in) :: rdlai2d
393 LOGICAL, intent(in) :: USEMONALB
395 ! input variables lsm --> urban
396 INTEGER :: UTYPE_URB ! urban type [urban=1, suburban=2, rural=3]
397 REAL :: TA_URB ! potential temp at 1st atmospheric level [K]
398 REAL :: QA_URB ! mixing ratio at 1st atmospheric level [kg/kg]
399 REAL :: UA_URB ! wind speed at 1st atmospheric level [m/s]
400 REAL :: U1_URB ! u at 1st atmospheric level [m/s]
401 REAL :: V1_URB ! v at 1st atmospheric level [m/s]
402 REAL :: SSG_URB ! downward total short wave radiation [W/m/m]
403 REAL :: LLG_URB ! downward long wave radiation [W/m/m]
404 REAL :: RAIN_URB ! precipitation [mm/h]
405 REAL :: RHOO_URB ! air density [kg/m^3]
406 REAL :: ZA_URB ! first atmospheric level [m]
407 REAL :: DELT_URB ! time step [s]
408 REAL :: SSGD_URB ! downward direct short wave radiation [W/m/m]
409 REAL :: SSGQ_URB ! downward diffuse short wave radiation [W/m/m]
410 REAL :: XLAT_URB ! latitude [deg]
411 REAL :: COSZ_URB ! cosz
412 REAL :: OMG_URB ! hour angle
413 REAL :: ZNT_URB ! roughness length [m]
424 REAL, DIMENSION(1:num_roof_layers) :: TRL_URB ! roof layer temp [K]
425 REAL, DIMENSION(1:num_wall_layers) :: TBL_URB ! wall layer temp [K]
426 REAL, DIMENSION(1:num_road_layers) :: TGL_URB ! road layer temp [K]
427 LOGICAL :: LSOLAR_URB
428 ! state variable surface_driver <--> lsm <--> urban
429 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TR_URB2D
430 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TB_URB2D
431 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TG_URB2D
432 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TC_URB2D
433 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QC_URB2D
434 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UC_URB2D
435 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXR_URB2D
436 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXB_URB2D
437 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXG_URB2D
438 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXC_URB2D
439 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SH_URB2D
440 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH_URB2D
441 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: G_URB2D
442 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RN_URB2D
444 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TS_URB2D
446 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_roof_layers, jms:jme ), INTENT(INOUT) :: TRL_URB3D
447 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_wall_layers, jms:jme ), INTENT(INOUT) :: TBL_URB3D
448 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_road_layers, jms:jme ), INTENT(INOUT) :: TGL_URB3D
450 ! output variable lsm --> surface_driver
451 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: PSIM_URB2D
452 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: PSIH_URB2D
453 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: GZ1OZ0_URB2D
454 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: U10_URB2D
455 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: V10_URB2D
456 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: TH2_URB2D
457 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: Q2_URB2D
459 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: AKMS_URB2D
461 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: UST_URB2D
462 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: FRC_URB2D
463 INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: UTYPE_URB2D
466 ! output variables urban --> lsm
467 REAL :: TS_URB ! surface radiative temperature [K]
468 REAL :: QS_URB ! surface humidity [-]
469 REAL :: SH_URB ! sensible heat flux [W/m/m]
470 REAL :: LH_URB ! latent heat flux [W/m/m]
471 REAL :: LH_KINEMATIC_URB ! latent heat flux, kinetic [kg/m/m/s]
472 REAL :: SW_URB ! upward short wave radiation flux [W/m/m]
473 REAL :: ALB_URB ! time-varying albedo [fraction]
474 REAL :: LW_URB ! upward long wave radiation flux [W/m/m]
475 REAL :: G_URB ! heat flux into the ground [W/m/m]
476 REAL :: RN_URB ! net radiation [W/m/m]
477 REAL :: PSIM_URB ! shear f for momentum [-]
478 REAL :: PSIH_URB ! shear f for heat [-]
479 REAL :: GZ1OZ0_URB ! shear f for heat [-]
480 REAL :: U10_URB ! wind u component at 10 m [m/s]
481 REAL :: V10_URB ! wind v component at 10 m [m/s]
482 REAL :: TH2_URB ! potential temperature at 2 m [K]
483 REAL :: Q2_URB ! humidity at 2 m [-]
487 ! Variables for multi-layer UCM (Martilli et al. 2002)
488 REAL, OPTIONAL, INTENT(IN ) :: GMT
489 INTEGER, OPTIONAL, INTENT(IN ) :: JULDAY
490 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) ::XLAT, XLONG
491 INTEGER, INTENT(IN ) :: NUM_URBAN_LAYERS
492 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: trb_urb4d
493 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1_urb4d
494 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2_urb4d
495 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tgb_urb4d
496 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tlev_urb3d
497 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: qlev_urb3d
498 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1lev_urb3d
499 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2lev_urb3d
500 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tglev_urb3d
501 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tflev_urb3d
502 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lf_ac_urb3d
503 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sf_ac_urb3d
504 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: cm_ac_urb3d
505 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfvent_urb3d
506 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lfvent_urb3d
507 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin1_urb3d
508 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin2_urb3d
509 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw1_urb3d
510 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw2_urb3d
511 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfr_urb3d
512 REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfg_urb3d
513 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_u_bep !Implicit momemtum component X-direction
514 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_v_bep !Implicit momemtum component Y-direction
515 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_t_bep !Implicit component pot. temperature
516 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_q_bep !Implicit momemtum component X-direction
517 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_e_bep !Implicit component TKE
518 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_u_bep !Explicit momentum component X-direction
519 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_v_bep !Explicit momentum component Y-direction
520 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_t_bep !Explicit component pot. temperature
521 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_q_bep !Implicit momemtum component Y-direction
522 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_e_bep !Explicit component TKE
523 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::vl_bep !Fraction air volume in grid cell
524 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dlg_bep !Height above ground
525 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::sf_bep !Fraction air at the face of grid cell
526 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dl_u_bep !Length scale
528 ! Local variables for multi-layer UCM (Martilli et al. 2002)
529 REAL, DIMENSION( ims:ime, jms:jme ) :: HFX_RURAL,LH_RURAL,GRDFLX_RURAL,RN_RURAL
530 REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_RURAL,QSFC_RURAL,UMOM_RURAL,VMOM_RURAL
531 REAL, DIMENSION( ims:ime, jms:jme ) :: ALB_RURAL,EMISS_RURAL,UST_RURAL,TSK_RURAL
532 ! REAL, DIMENSION( ims:ime, jms:jme ) :: GRDFLX_URB
533 ! REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_URB,QSFC_URB,UMOM_URB,VMOM_URB
534 REAL, DIMENSION( ims:ime, jms:jme ) :: HFX_URB,UMOM_URB,VMOM_URB
535 REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_URB
536 ! REAL, DIMENSION( ims:ime, jms:jme ) :: ALBEDO_URB,EMISS_URB,UMOM,VMOM,UST
537 REAL, DIMENSION(ims:ime,jms:jme) ::EMISS_URB
538 REAL, DIMENSION(ims:ime,jms:jme) :: RL_UP_URB
539 REAL, DIMENSION(ims:ime,jms:jme) ::RS_ABS_URB
540 REAL, DIMENSION(ims:ime,jms:jme) ::GRDFLX_URB
541 REAL :: SIGMA_SB,RL_UP_RURAL,RL_UP_TOT,RS_ABS_TOT,UMOM,VMOM
543 REAL :: CMR_URB, CHR_URB, CMC_URB, CHC_URB
544 ! ----------------------------------------------------------------------
545 ! DECLARATIONS END - urban
546 ! ----------------------------------------------------------------------
548 REAL, PARAMETER :: CAPA=R_D/CP
549 REAL :: APELM,APES,SFCTH2,PSFC
550 real, intent(in) :: xice_threshold
551 character(len=80) :: message_text
556 FDTW=DT/(XLV*RHOWATER)
565 NSOIL=num_soil_layers
573 IF(ITIMESTEP.EQ.1)THEN
575 !*** initialize soil conditions for IHOP 31 May case
576 ! IF((XLAND(I,J)-1.5) < 0.)THEN
577 ! if (I==108.and.j==85) then
585 !*** SET ZERO-VALUE FOR SOME OUTPUT DIAGNOSTIC ARRAYS
586 IF((XLAND(I,J)-1.5).GE.0.)THEN
587 ! check sea-ice point
589 IF( XICE(I,J).GE. XICE_THRESHOLD .and. IPRINT ) PRINT*, ' sea-ice at water point, I=',I,'J=',J
596 TSLB(I,NS,J)=273.16 !STEMP
600 IF ( XICE(I,J) .GE. XICE_THRESHOLD ) THEN
612 ENDIF ! end of initialization over ocean
614 !-----------------------------------------------------------------------
618 ! pressure in middle of lowest layer
619 SFCPRS=(P8W3D(I,KTS+1,j)+P8W3D(i,KTS,j))*0.5
620 ! convert from mixing ratio to specific humidity
621 Q2K=QV3D(i,1,j)/(1.0+QV3D(i,1,j))
624 Q2SAT=QGH(I,J)/(1.0+QGH(I,J)) ! Q2SAT is sp humidity
625 ! add check on myj=.true.
626 ! IF((Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
627 IF((myj).AND.(Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
638 ! TH2=SFCTMP+(0.0097545*ZLVL)
639 ! calculate SFCTH2 via Exner function vs lapse-rate (above)
640 APES=(1.E5/PSFC)**CAPA
641 APELM=(1.E5/SFCPRS)**CAPA
647 ! SOLDN is total incoming solar
649 ! GSW is net downward solar
651 ! use mid-day albedo to determine net downward solar (no solar zenith angle correction)
652 SOLNET=SOLDN*(1.-ALBEDO(I,J))
656 SHDFAC=VEGFRA(I,J)/100.
659 SHMIN=SHDMIN(I,J)/100. !NEW
660 SHMAX=SHDMAX(I,J)/100. !NEW
661 ! convert snow water equivalent from mm to meter
662 SNEQV=SNOW(I,J)*0.001
663 ! snow depth in meters
667 ! if "SR" present, set frac of frozen precip ("FFROZP") = snow-ratio ("SR", range:0-1)
668 ! SR from e.g. Ferrier microphysics
669 ! otherwise define from 1st atmos level temperature
673 IF (SFCTMP <= 273.15) THEN
680 IF((XLAND(I,J)-1.5).GE.0.)THEN ! begining of land/sea if block
682 TSK_RURAL(I,J)=TSK(I,J)
683 HFX_RURAL(I,J)=HFX(I,J)
684 QFX_RURAL(I,J)=QFX(I,J)
685 LH_RURAL(I,J)=LH(I,J)
686 EMISS_RURAL(I,J)=EMISS(I,J)
687 GRDFLX_RURAL(I,J)=GRDFLX(I,J)
689 ! Land or sea-ice case
691 IF (XICE(I,J) >= XICE_THRESHOLD) THEN
694 ELSE IF ( VEGTYP == ISICE ) THEN
698 ! Neither sea ice or land ice.
701 DQSDT2=Q2SAT*A23M4/(SFCTMP-A4)**2
703 IF(SNOW(I,J).GT.0.0)THEN
704 ! snow on surface (use ice saturation properties)
706 E2SAT=611.2*EXP(6174.*(1./273.15 - 1./SFCTSNO))
707 Q2SATI=0.622*E2SAT/(SFCPRS-E2SAT)
708 Q2SATI=Q2SATI/(1.0+Q2SATI) ! spec. hum.
709 IF (T1 .GT. 273.14) THEN
710 ! warm ground temps, weight the saturation between ice and water according to SNOWC
711 Q2SAT=Q2SAT*(1.-SNOWC(I,J)) + Q2SATI*SNOWC(I,J)
712 DQSDT2=DQSDT2*(1.-SNOWC(I,J)) + Q2SATI*6174./(SFCTSNO**2)*SNOWC(I,J)
714 ! cold ground temps, use ice saturation only
716 DQSDT2=Q2SATI*6174./(SFCTSNO**2)
718 ! for snow cover fraction at 0 C, ground temp will not change, so DQSDT2 effectively zero
719 IF(T1 .GT. 273. .AND. SNOWC(I,J) .GT. 0.)DQSDT2=DQSDT2*(1.-SNOWC(I,J))
723 ! Sea-ice point has deep-level temperature of -2 C
726 ! Land-ice or land points have the usual deep-soil temperature.
729 IF(VEGTYP.EQ.25) SHDFAC=0.0000
730 IF(VEGTYP.EQ.26) SHDFAC=0.0000
731 IF(VEGTYP.EQ.27) SHDFAC=0.0000
732 IF(SOILTYP.EQ.14.AND.XICE(I,J).EQ.0.)THEN
734 IF(IPRINT)PRINT*,' SOIL TYPE FOUND TO BE WATER AT A LAND-POINT'
735 IF(IPRINT)PRINT*,i,j,'RESET SOIL in surfce.F'
739 SNOALB1 = SNOALB(I,J)
742 !-------------------------------------------
743 !*** convert snow depth from mm to meter
746 ! SNOALB=ALBMAX(I,J)*0.01
748 ! SNOALB=MAXALB(IVGTPK)*0.01
756 SNOTIME1 = SNOTIME(I,J)
758 !FEI: temporaray arrays above need to be changed later by using SI
761 SMC(NS)=SMOIS(I,NS,J)
762 STC(NS)=TSLB(I,NS,J) !STEMP
766 if ( (SNEQV.ne.0..AND.SNOWHK.eq.0.).or.(SNOWHK.le.SNEQV) )THEN
771 !Fei: urban. for urban surface, if calling UCM, redefine the natural surface in cities as
772 ! the "NATURAL" category in the VEGPARM.TBL
774 IF(SF_URBAN_PHYSICS == 1.OR. SF_URBAN_PHYSICS==2.OR.SF_URBAN_PHYSICS==3 ) THEN
775 IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
776 IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
778 SHDFAC = SHDTBL(NATURAL)
781 EMISSI = 0.98 !for VEGTYP=5
782 IF ( FRC_URB2D(I,J) < 0.99 ) THEN
783 if(sf_urban_physics.eq.1)then
784 T1= ( TSK(I,J) -FRC_URB2D(I,J) * TS_URB2D (I,J) )/ (1-FRC_URB2D(I,J))
785 elseif((sf_urban_physics.eq.2).OR.(sf_urban_physics.eq.3))then
787 r2= frc_urb2d(i,j)*(ts_urb2d(i,j)**4.)
788 r3= (1.-frc_urb2d(i,j))
789 t1= ((r1-r2)/r3)**.25
796 IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
797 IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
805 print*, 'BEFORE SFLX, in Noahlsm_driver'
806 print*, 'ICE', ICE, 'DT',DT, 'ZLVL',ZLVL, 'NSOIL', NSOIL, &
807 'SLDPTH', SLDPTH, 'LOCAL',LOCAL, 'LUTYPE',&
808 LUTYPE, 'SLTYPE',SLTYPE, 'LWDN',LWDN, 'SOLDN',SOLDN, &
809 'SFCPRS',SFCPRS, 'PRCP',PRCP,'SFCTMP',SFCTMP,'Q2K',Q2K, &
810 'TH2',TH2,'Q2SAT',Q2SAT,'DQSDT2',DQSDT2,'VEGTYP', VEGTYP,&
811 'SOILTYP',SOILTYP, 'SLOPETYP',SLOPETYP, 'SHDFAC',SHDFAC,&
812 'SHMIN',SHMIN, 'ALBBRD',ALBBRD,'SNOALB1',SNOALB1,'TBOT',&
813 TBOT, 'Z0BRD',Z0BRD, 'Z0K',Z0K, 'CMC',CMC, 'T1',T1,'STC',&
814 STC, 'SMC',SMC, 'SWC',SWC,'SNOWHK',SNOWHK,'SNEQV',SNEQV,&
815 'ALBEDOK',ALBEDOK,'CHK',CHK,'ETA',ETA,'SHEAT',SHEAT, &
816 'ETA_KINEMATIC',ETA_KINEMATIC, 'FDOWN',FDOWN,'EC',EC, &
817 'EDIR',EDIR,'ET',ET,'ETT',ETT,'ESNOW',ESNOW,'DRIP',DRIP,&
818 'DEW',DEW,'BETA',BETA,'ETP',ETP,'SSOIL',SSOIL,'FLX1',FLX1,&
819 'FLX2',FLX2,'FLX3',FLX3,'SNOMLT',SNOMLT,'SNCOVR',SNCOVR,&
820 'RUNOFF1',RUNOFF1,'RUNOFF2',RUNOFF2,'RUNOFF3',RUNOFF3, &
821 'RC',RC, 'PC',PC,'RSMIN',RSMIN,'XLAI',XLAI,'RCS',RCS, &
822 'RCT',RCT,'RCQ',RCQ,'RCSOIL',RCSOIL,'SOILW',SOILW, &
823 'SOILM',SOILM,'Q1',Q1,'SMCWLT',SMCWLT,'SMCDRY',SMCDRY,&
824 'SMCREF',SMCREF,'SMCMAX',SMCMAX,'NROOT',NROOT
832 IF ( XICE(I,J) >= XICE_THRESHOLD ) THEN
845 ! Land and glacial land.
847 CALL SFLX (I,J,ICE,FFROZP, ISURBAN, DT,ZLVL,NSOIL,SLDPTH, & !C
849 LUTYPE, SLTYPE, & !CL
850 LWDN,SOLDN,SOLNET,SFCPRS,PRCP,SFCTMP,Q2K,DUMMY, & !F
851 DUMMY,DUMMY, DUMMY, & !F PRCPRAIN not used
852 TH2,Q2SAT,DQSDT2, & !I
853 VEGTYP,SOILTYP,SLOPETYP,SHDFAC,SHMIN,SHMAX, & !I
854 ALBBRD, SNOALB1,TBOT, Z0BRD, Z0K, EMISSI, EMBRD, & !S
855 CMC,T1,STC,SMC,SWC,SNOWHK,SNEQV,ALBEDOK,CHK,dummy,& !H
856 ETA,SHEAT, ETA_KINEMATIC,FDOWN, & !O
857 EC,EDIR,ET,ETT,ESNOW,DRIP,DEW, & !O
861 RUNOFF1,RUNOFF2,RUNOFF3, & !O
862 RC,PC,RSMIN,XLAI,RCS,RCT,RCQ,RCSOIL, & !O
863 SOILW,SOILM,Q1,SMAV, & !D
867 SMCWLT,SMCDRY,SMCREF,SMCMAX,NROOT)
875 print*, 'AFTER SFLX, in Noahlsm_driver'
876 print*, 'ICE', ICE, 'DT',DT, 'ZLVL',ZLVL, 'NSOIL', NSOIL, &
877 'SLDPTH', SLDPTH, 'LOCAL',LOCAL, 'LUTYPE',&
878 LUTYPE, 'SLTYPE',SLTYPE, 'LWDN',LWDN, 'SOLDN',SOLDN, &
879 'SFCPRS',SFCPRS, 'PRCP',PRCP,'SFCTMP',SFCTMP,'Q2K',Q2K, &
880 'TH2',TH2,'Q2SAT',Q2SAT,'DQSDT2',DQSDT2,'VEGTYP', VEGTYP,&
881 'SOILTYP',SOILTYP, 'SLOPETYP',SLOPETYP, 'SHDFAC',SHDFAC,&
882 'SHDMIN',SHMIN, 'ALBBRD',ALBBRD,'SNOALB',SNOALB1,'TBOT',&
883 TBOT, 'Z0BRD',Z0BRD, 'Z0K',Z0K, 'CMC',CMC, 'T1',T1,'STC',&
884 STC, 'SMC',SMC, 'SWc',SWC,'SNOWHK',SNOWHK,'SNEQV',SNEQV,&
885 'ALBEDOK',ALBEDOK,'CHK',CHK,'ETA',ETA,'SHEAT',SHEAT, &
886 'ETA_KINEMATIC',ETA_KINEMATIC, 'FDOWN',FDOWN,'EC',EC, &
887 'EDIR',EDIR,'ET',ET,'ETT',ETT,'ESNOW',ESNOW,'DRIP',DRIP,&
888 'DEW',DEW,'BETA',BETA,'ETP',ETP,'SSOIL',SSOIL,'FLX1',FLX1,&
889 'FLX2',FLX2,'FLX3',FLX3,'SNOMLT',SNOMLT,'SNCOVR',SNCOVR,&
890 'RUNOFF1',RUNOFF1,'RUNOFF2',RUNOFF2,'RUNOFF3',RUNOFF3, &
891 'RC',RC, 'PC',PC,'RSMIN',RSMIN,'XLAI',XLAI,'RCS',RCS, &
892 'RCT',RCT,'RCQ',RCQ,'RCSOIL',RCSOIL,'SOILW',SOILW, &
893 'SOILM',SOILM,'Q1',Q1,'SMCWLT',SMCWLT,'SMCDRY',SMCDRY,&
894 'SMCREF',SMCREF,'SMCMAX',SMCMAX,'NROOT',NROOT
898 !*** UPDATE STATE VARIABLES
900 SNOW(I,J)=SNEQV*1000.
901 ! SNOWH(I,J)=SNOWHK*1000.
902 SNOWH(I,J)=SNOWHK ! SNOWHK in meters
904 ALB_RURAL(I,J)=ALBEDOK
908 EMISS_RURAL(I,J) = EMISSI
909 ! Noah: activate time-varying roughness length (V3.3 Feb 2011)
915 ! MEk Jul07 add potential evap accum
916 POTEVP(I,J)=POTEVP(I,J)+ETP*FDTW
917 QFX(I,J)=ETA_KINEMATIC
918 QFX_RURAL(I,J)=ETA_KINEMATIC
922 GRDFLX_RURAL(I,J)=SSOIL
925 SNOTIME(I,J) = SNOTIME1
926 ! prevent diagnostic ground q (q1) from being greater than qsat(tsk)
927 ! as happens over snow cover where the cqs2 value also becomes irrelevant
928 ! by setting cqs2=chs in this situation the 2m q should become just qv(k=1)
929 IF (Q1 .GT. QSFC(I,J)) THEN
933 ! Convert QSFC back to mixing ratio
934 QSFC(I,J)= Q1/(1.0-Q1)
936 QSFC_RURAL(I,J)= Q1/(1.0-Q1)
937 ! Calculate momentum flux from rural surface for use with multi-layer UCM (Martilli et al. 2002)
940 SMOIS(I,NS,J)=SMC(NS)
941 TSLB(I,NS,J)=STC(NS) ! STEMP
947 ! Residual of surface energy balance equation terms
949 noahres(i,j) = ( solnet + lwdn ) - sheat + ssoil - eta - ( emissi * STBOLT * (t1**4) ) - flx1 - flx2 - flx3
952 IF (SF_URBAN_PHYSICS == 1 ) THEN ! Beginning of UCM CALL if block
953 !--------------------------------------
954 ! URBAN CANOPY MODEL START - urban
955 !--------------------------------------
956 ! Input variables lsm --> urban
959 IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
960 IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33 ) THEN
965 UTYPE_URB = UTYPE_URB2D(I,J) !urban type (low, high or industrial)
967 TA_URB = SFCTMP ! [K]
968 QA_URB = Q2K ! [kg/kg]
969 UA_URB = SQRT(U_PHY(I,1,J)**2.+V_PHY(I,1,J)**2.)
970 U1_URB = U_PHY(I,1,J)
971 V1_URB = V_PHY(I,1,J)
972 IF(UA_URB < 1.) UA_URB=1. ! [m/s]
973 SSG_URB = SOLDN ! [W/m/m]
974 SSGD_URB = 0.8*SOLDN ! [W/m/m]
975 SSGQ_URB = SSG_URB-SSGD_URB ! [W/m/m]
976 LLG_URB = GLW(I,J) ! [W/m/m]
977 RAIN_URB = RAINBL(I,J) ! [mm]
978 RHOO_URB = SFCPRS / (287.04 * SFCTMP * (1.0+ 0.61 * Q2K)) ![kg/m/m/m]
980 DELT_URB = DT ! [sec]
981 XLAT_URB = XLAT_URB2D(I,J) ! [deg]
982 COSZ_URB = COSZ_URB2D(I,J) !
983 OMG_URB = OMG_URB2D(I,J) !
988 TR_URB = TR_URB2D(I,J)
989 TB_URB = TB_URB2D(I,J)
990 TG_URB = TG_URB2D(I,J)
991 TC_URB = TC_URB2D(I,J)
992 QC_URB = QC_URB2D(I,J)
993 UC_URB = UC_URB2D(I,J)
995 DO K = 1,num_roof_layers
996 TRL_URB(K) = TRL_URB3D(I,K,J)
998 DO K = 1,num_wall_layers
999 TBL_URB(K) = TBL_URB3D(I,K,J)
1001 DO K = 1,num_road_layers
1002 TGL_URB(K) = TGL_URB3D(I,K,J)
1005 XXXR_URB = XXXR_URB2D(I,J)
1006 XXXB_URB = XXXB_URB2D(I,J)
1007 XXXG_URB = XXXG_URB2D(I,J)
1008 XXXC_URB = XXXC_URB2D(I,J)
1011 ! Limits to avoid dividing by small number
1012 if (CHS(I,J) < 1.0E-02) then
1015 if (CHS2(I,J) < 1.0E-02) then
1018 if (CQS2(I,J) < 1.0E-02) then
1023 CHS2_URB = CHS2(I,J)
1024 IF (PRESENT(CMR_SFCDIF)) THEN
1025 CMR_URB = CMR_SFCDIF(I,J)
1026 CHR_URB = CHR_SFCDIF(I,J)
1027 CMC_URB = CMC_SFCDIF(I,J)
1028 CHC_URB = CHC_SFCDIF(I,J)
1033 CALL urban(LSOLAR_URB, & ! I
1034 num_roof_layers,num_wall_layers,num_road_layers, & ! C
1036 UTYPE_URB,TA_URB,QA_URB,UA_URB,U1_URB,V1_URB,SSG_URB, & ! I
1037 SSGD_URB,SSGQ_URB,LLG_URB,RAIN_URB,RHOO_URB, & ! I
1038 ZA_URB,DECLIN_URB,COSZ_URB,OMG_URB, & ! I
1039 XLAT_URB,DELT_URB,ZNT_URB, & ! I
1040 CHS_URB, CHS2_URB, & ! I
1041 TR_URB, TB_URB, TG_URB, TC_URB, QC_URB,UC_URB, & ! H
1042 TRL_URB,TBL_URB,TGL_URB, & ! H
1043 XXXR_URB, XXXB_URB, XXXG_URB, XXXC_URB, & ! H
1044 TS_URB,QS_URB,SH_URB,LH_URB,LH_KINEMATIC_URB, & ! O
1045 SW_URB,ALB_URB,LW_URB,G_URB,RN_URB,PSIM_URB,PSIH_URB, & ! O
1047 CMR_URB, CHR_URB, CMC_URB, CHC_URB, &
1048 U10_URB, V10_URB, TH2_URB, Q2_URB, & ! O
1054 print*, 'AFTER CALL URBAN'
1055 print*,'num_roof_layers',num_roof_layers, 'num_wall_layers', &
1057 'DZR',DZR,'DZB',DZB,'DZG',DZG,'UTYPE_URB',UTYPE_URB,'TA_URB', &
1059 'QA_URB',QA_URB,'UA_URB',UA_URB,'U1_URB',U1_URB,'V1_URB', &
1061 'SSG_URB',SSG_URB,'SSGD_URB',SSGD_URB,'SSGQ_URB',SSGQ_URB, &
1062 'LLG_URB',LLG_URB,'RAIN_URB',RAIN_URB,'RHOO_URB',RHOO_URB, &
1063 'ZA_URB',ZA_URB, 'DECLIN_URB',DECLIN_URB,'COSZ_URB',COSZ_URB,&
1064 'OMG_URB',OMG_URB,'XLAT_URB',XLAT_URB,'DELT_URB',DELT_URB, &
1065 'ZNT_URB',ZNT_URB,'TR_URB',TR_URB, 'TB_URB',TB_URB,'TG_URB',&
1066 TG_URB,'TC_URB',TC_URB,'QC_URB',QC_URB,'TRL_URB',TRL_URB, &
1067 'TBL_URB',TBL_URB,'TGL_URB',TGL_URB,'XXXR_URB',XXXR_URB, &
1068 'XXXB_URB',XXXB_URB,'XXXG_URB',XXXG_URB,'XXXC_URB',XXXC_URB,&
1069 'TS_URB',TS_URB,'QS_URB',QS_URB,'SH_URB',SH_URB,'LH_URB', &
1070 LH_URB, 'LH_KINEMATIC_URB',LH_KINEMATIC_URB,'SW_URB',SW_URB,&
1071 'ALB_URB',ALB_URB,'LW_URB',LW_URB,'G_URB',G_URB,'RN_URB', &
1072 RN_URB, 'PSIM_URB',PSIM_URB,'PSIH_URB',PSIH_URB, &
1073 'U10_URB',U10_URB,'V10_URB',V10_URB,'TH2_URB',TH2_URB, &
1074 'Q2_URB',Q2_URB,'CHS_URB',CHS_URB,'CHS2_URB',CHS2_URB
1078 TS_URB2D(I,J) = TS_URB
1080 ALBEDO(I,J) = FRC_URB2D(I,J)*ALB_URB+(1-FRC_URB2D(I,J))*ALBEDOK ![-]
1081 HFX(I,J) = FRC_URB2D(I,J)*SH_URB+(1-FRC_URB2D(I,J))*SHEAT ![W/m/m]
1082 QFX(I,J) = FRC_URB2D(I,J)*LH_KINEMATIC_URB &
1083 + (1-FRC_URB2D(I,J))*ETA_KINEMATIC ![kg/m/m/s]
1084 LH(I,J) = FRC_URB2D(I,J)*LH_URB+(1-FRC_URB2D(I,J))*ETA ![W/m/m]
1085 GRDFLX(I,J) = FRC_URB2D(I,J)*G_URB+(1-FRC_URB2D(I,J))*SSOIL ![W/m/m]
1086 TSK(I,J) = FRC_URB2D(I,J)*TS_URB+(1-FRC_URB2D(I,J))*T1 ![K]
1087 Q1 = FRC_URB2D(I,J)*QS_URB+(1-FRC_URB2D(I,J))*Q1 ![-]
1088 ! Convert QSFC back to mixing ratio
1089 QSFC(I,J)= Q1/(1.0-Q1)
1090 UST(I,J)= FRC_URB2D(I,J)*UST_URB+(1-FRC_URB2D(I,J))*UST(I,J) ![m/s]
1095 print*, ' FRC_URB2D', FRC_URB2D, &
1096 'ALB_URB',ALB_URB, 'ALBEDOK',ALBEDOK, &
1097 'ALBEDO(I,J)', ALBEDO(I,J), &
1098 'SH_URB',SH_URB,'SHEAT',SHEAT, 'HFX(I,J)',HFX(I,J), &
1099 'LH_KINEMATIC_URB',LH_KINEMATIC_URB,'ETA_KINEMATIC', &
1100 ETA_KINEMATIC, 'QFX(I,J)',QFX(I,J), &
1101 'LH_URB',LH_URB, 'ETA',ETA, 'LH(I,J)',LH(I,J), &
1102 'G_URB',G_URB,'SSOIL',SSOIL,'GRDFLX(I,J)', GRDFLX(I,J),&
1103 'TS_URB',TS_URB,'T1',T1,'TSK(I,J)',TSK(I,J), &
1104 'QS_URB',QS_URB,'Q1',Q1,'QSFC(I,J)',QSFC(I,J)
1110 ! Renew Urban State Varialbes
1112 TR_URB2D(I,J) = TR_URB
1113 TB_URB2D(I,J) = TB_URB
1114 TG_URB2D(I,J) = TG_URB
1115 TC_URB2D(I,J) = TC_URB
1116 QC_URB2D(I,J) = QC_URB
1117 UC_URB2D(I,J) = UC_URB
1119 DO K = 1,num_roof_layers
1120 TRL_URB3D(I,K,J) = TRL_URB(K)
1122 DO K = 1,num_wall_layers
1123 TBL_URB3D(I,K,J) = TBL_URB(K)
1125 DO K = 1,num_road_layers
1126 TGL_URB3D(I,K,J) = TGL_URB(K)
1128 XXXR_URB2D(I,J) = XXXR_URB
1129 XXXB_URB2D(I,J) = XXXB_URB
1130 XXXG_URB2D(I,J) = XXXG_URB
1131 XXXC_URB2D(I,J) = XXXC_URB
1133 SH_URB2D(I,J) = SH_URB
1134 LH_URB2D(I,J) = LH_URB
1135 G_URB2D(I,J) = G_URB
1136 RN_URB2D(I,J) = RN_URB
1137 PSIM_URB2D(I,J) = PSIM_URB
1138 PSIH_URB2D(I,J) = PSIH_URB
1139 GZ1OZ0_URB2D(I,J)= GZ1OZ0_URB
1140 U10_URB2D(I,J) = U10_URB
1141 V10_URB2D(I,J) = V10_URB
1142 TH2_URB2D(I,J) = TH2_URB
1143 Q2_URB2D(I,J) = Q2_URB
1144 UST_URB2D(I,J) = UST_URB
1145 AKMS_URB2D(I,J) = KARMAN * UST_URB2D(I,J)/(GZ1OZ0_URB2D(I,J)-PSIM_URB2D(I,J))
1146 IF (PRESENT(CMR_SFCDIF)) THEN
1147 CMR_SFCDIF(I,J) = CMR_URB
1148 CHR_SFCDIF(I,J) = CHR_URB
1149 CMC_SFCDIF(I,J) = CMC_URB
1150 CHC_SFCDIF(I,J) = CHC_URB
1154 ENDIF ! end of UCM CALL if block
1155 !--------------------------------------
1156 ! Urban Part End - urban
1157 !--------------------------------------
1161 SMSTOT(I,J)=SOILM*1000.
1163 SMCREL(I,NS,J)=SMAV(NS)
1165 ! Convert the water unit into mm
1166 SFCRUNOFF(I,J)=SFCRUNOFF(I,J)+RUNOFF1*DT*1000.0
1167 UDRUNOFF(I,J)=UDRUNOFF(I,J)+RUNOFF2*DT*1000.0
1168 ! snow defined when fraction of frozen precip (FFROZP) > 0.5,
1169 IF(FFROZP.GT.0.5)THEN
1170 ACSNOW(I,J)=ACSNOW(I,J)+PRCP*DT
1172 IF(SNOW(I,J).GT.0.)THEN
1173 ACSNOM(I,J)=ACSNOM(I,J)+SNOMLT*1000.
1174 ! accumulated snow-melt energy
1175 SNOPCX(I,J)=SNOPCX(I,J)-SNOMLT/FDTLIW
1178 ENDIF ! endif of land-sea test
1180 ENDDO ILOOP ! of I loop
1181 ENDDO JLOOP ! of J loop
1183 IF (SF_URBAN_PHYSICS == 2) THEN
1192 b_q_bep(i,kts:kte,j)=0.
1195 CALL BEP(frc_urb2d,utype_urb2d,itimestep,dz8w,dt,u_phy,v_phy, &
1196 th_phy,rho,p_phy,swdown,glw, &
1197 gmt,julday,xlong,xlat,declin_urb,cosz_urb2d,omg_urb2d, &
1199 trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, &
1200 sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, &
1201 a_u_bep,a_v_bep,a_t_bep, &
1202 a_e_bep,b_u_bep,b_v_bep, &
1203 b_t_bep,b_e_bep,dlg_bep, &
1204 dl_u_bep,sf_bep,vl_bep, &
1205 rl_up_urb,rs_abs_urb,emiss_urb,grdflx_urb, &
1206 ids,ide, jds,jde, kds,kde, &
1207 ims,ime, jms,jme, kms,kme, &
1208 its,ite, jts,jte, kts,kte )
1213 IF (SF_URBAN_PHYSICS == 3) THEN
1222 b_q_bep(i,kts:kte,j)=0.
1226 CALL BEP_BEM(frc_urb2d,utype_urb2d,itimestep,dz8w,dt,u_phy,v_phy, &
1227 th_phy,rho,p_phy,swdown,glw, &
1228 gmt,julday,xlong,xlat,declin_urb,cosz_urb2d,omg_urb2d, &
1230 trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, &
1231 tlev_urb3d,qlev_urb3d,tw1lev_urb3d,tw2lev_urb3d, &
1232 tglev_urb3d,tflev_urb3d,sf_ac_urb3d,lf_ac_urb3d, &
1233 cm_ac_urb3d,sfvent_urb3d,lfvent_urb3d, &
1234 sfwin1_urb3d,sfwin2_urb3d, &
1235 sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, &
1236 a_u_bep,a_v_bep,a_t_bep, &
1237 a_e_bep,b_u_bep,b_v_bep, &
1238 b_t_bep,b_e_bep,b_q_bep,dlg_bep, &
1239 dl_u_bep,sf_bep,vl_bep, &
1240 rl_up_urb,rs_abs_urb,emiss_urb,grdflx_urb,qv3d, &
1241 ids,ide, jds,jde, kds,kde, &
1242 ims,ime, jms,jme, kms,kme, &
1243 its,ite, jts,jte, kts,kte )
1247 if((sf_urban_physics.eq.2).OR.(sf_urban_physics.eq.3))then !Bep begin
1248 ! fix the value of the Stefan-Boltzmann constant
1257 a_u_bep(i,k,j)=a_u_bep(i,k,j)*frc_urb2d(i,j)
1258 a_v_bep(i,k,j)=a_v_bep(i,k,j)*frc_urb2d(i,j)
1259 a_t_bep(i,k,j)=a_t_bep(i,k,j)*frc_urb2d(i,j)
1262 b_u_bep(i,k,j)=b_u_bep(i,k,j)*frc_urb2d(i,j)
1263 b_v_bep(i,k,j)=b_v_bep(i,k,j)*frc_urb2d(i,j)
1264 b_t_bep(i,k,j)=b_t_bep(i,k,j)*frc_urb2d(i,j)
1265 b_q_bep(i,k,j)=b_q_bep(i,k,j)*frc_urb2d(i,j)
1266 b_e_bep(i,k,j)=b_e_bep(i,k,j)*frc_urb2d(i,j)
1267 HFX_URB(I,J)=HFX_URB(I,J)+B_T_BEP(I,K,J)*RHO(I,K,J)*CP* &
1268 DZ8W(I,K,J)*VL_BEP(I,K,J)
1269 QFX_URB(I,J)=QFX_URB(I,J)+B_Q_BEP(I,K,J)* &
1270 DZ8W(I,K,J)*VL_BEP(I,K,J)
1271 UMOM_URB(I,J)=UMOM_URB(I,J)+ (A_U_BEP(I,K,J)*U_PHY(I,K,J)+ &
1272 B_U_BEP(I,K,J))*DZ8W(I,K,J)*VL_BEP(I,K,J)
1273 VMOM_URB(I,J)=VMOM_URB(I,J)+ (A_V_BEP(I,K,J)*V_PHY(I,K,J)+ &
1274 B_V_BEP(I,K,J))*DZ8W(I,K,J)*VL_BEP(I,K,J)
1275 vl_bep(i,k,j)=(1.-frc_urb2d(i,j))+vl_bep(i,k,j)*frc_urb2d(i,j)
1276 sf_bep(i,k,j)=(1.-frc_urb2d(i,j))+sf_bep(i,k,j)*frc_urb2d(i,j)
1278 a_u_bep(i,1,j)=(1.-frc_urb2d(i,j))*(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/ &
1279 ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+a_u_bep(i,1,j)
1280 a_v_bep(i,1,j)=(1.-frc_urb2d(i,j))*(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/ &
1281 ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+a_v_bep(i,1,j)
1282 b_t_bep(i,1,j)=(1.-frc_urb2d(i,j))*hfx_rural(i,j)/dz8w(i,1,j)/rho(i,1,j)/CP+ &
1284 b_q_bep(i,1,j)=(1.-frc_urb2d(i,j))*qfx_rural(i,j)/dz8w(i,1,j)/rho(i,1,j)+b_q_bep(i,1,j)
1285 umom=(1.-frc_urb2d(i,j))*ust(i,j)*ust(i,j)*u_phy(i,1,j)/ &
1286 ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+umom_urb(i,j)
1287 vmom=(1.-frc_urb2d(i,j))*ust(i,j)*ust(i,j)*v_phy(i,1,j)/ &
1288 ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+vmom_urb(i,j)
1291 ! compute upward longwave radiation from the rural part and total
1292 ! rl_up_rural=-emiss_rural(i,j)*sigma_sb*(tsk_rural(i,j)**4.)-(1.-emiss_rural(i,j))*glw(i,j)
1293 ! rl_up_tot=(1.-frc_urb2d(i,j))*rl_up_rural+frc_urb2d(i,j)*rl_up_urb(i,j)
1294 ! emiss(i,j)=(1.-frc_urb2d(i,j))*emiss_rural(i,j)+frc_urb2d(i,j)*emiss_urb(i,j)
1295 ! using the emissivity and the total longwave upward radiation estimate the averaged skin temperature
1296 IF (FRC_URB2D(I,J).GT.0.) THEN
1297 rl_up_rural=-emiss_rural(i,j)*sigma_sb*(tsk_rural(i,j)**4.)-(1.-emiss_rural(i,j))*glw(i,j)
1298 rl_up_tot=(1.-frc_urb2d(i,j))*rl_up_rural+frc_urb2d(i,j)*rl_up_urb(i,j)
1299 emiss(i,j)=(1.-frc_urb2d(i,j))*emiss_rural(i,j)+frc_urb2d(i,j)*emiss_urb(i,j)
1300 ts_urb2d(i,j)=(max(0.,(-rl_up_urb(i,j)-(1.-emiss_urb(i,j))*glw(i,j))/emiss_urb(i,j)/sigma_sb))**0.25
1301 tsk(i,j)=(max(0., (-1.*rl_up_tot-(1.-emiss(i,j))*glw(i,j) )/emiss(i,j)/sigma_sb))**.25
1302 rs_abs_tot=(1.-frc_urb2d(i,j))*swdown(i,j)*(1.-albedo(i,j))+frc_urb2d(i,j)*rs_abs_urb(i,j)
1303 if(swdown(i,j).gt.0.)then
1304 albedo(i,j)=1.-rs_abs_tot/swdown(i,j)
1306 albedo(i,j)=alb_rural(i,j)
1308 ! rename *_urb to sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d
1309 grdflx(i,j)= (1.-frc_urb2d(i,j))*grdflx_rural(i,j)+frc_urb2d(i,j)*grdflx_urb(i,j)
1310 qfx(i,j)=(1.-frc_urb2d(i,j))*qfx_rural(i,j)+qfx_urb(i,j)
1311 ! lh(i,j)=(1.-frc_urb2d(i,j))*qfx_rural(i,j)*xlv
1312 lh(i,j)=qfx(i,j)*xlv
1313 HFX(I,J) = HFX_URB(I,J)+(1-FRC_URB2D(I,J))*HFX_RURAL(I,J) ![W/m/m]
1314 SH_URB2D(I,J) = HFX_URB(I,J)/FRC_URB2D(I,J)
1315 LH_URB2D(I,J) = qfx_urb(i,j)*xlv
1316 G_URB2D(I,J) = grdflx_urb(i,j)
1317 RN_URB2D(I,J) = rs_abs_urb(i,j)+emiss_urb(i,j)*glw(i,j)-rl_up_urb(i,j)
1318 ust(i,j)=(umom**2.+vmom**2.)**.25
1319 ! if(tsk(i,j).gt.350)write(*,*)'tsk too big!',i,j,tsk(i,j)
1320 ! if(tsk(i,j).lt.260)write(*,*)'tsk too small!',i,j,tsk(i,j),rl_up_tot,rl_up_urb(i,j),rl_up_rural
1321 ! print*,'ivgtyp,i,j,sigma_sb',ivgtyp(i,j),i,j,sigma_sb
1322 ! print*,'hfx,lh,qfx,grdflx,ts_urb2d',hfx(i,j),lh(i,j),qfx(i,j),grdflx(i,j),ts_urb2d(i,j)
1323 ! print*,'tsk,albedo,emiss',tsk(i,j),albedo(i,j),emiss(i,j)
1324 ! if(i.eq.56.and.j.eq.29)then
1325 ! print*,'ivgtyp, qfx, hfx',ivgtyp(i,j),hfx_rural(i,j),qfx_rural(i,j)
1326 ! print*,'emiss_rural,emiss_urb',emiss_rural(i,j),emiss_urb(i,j)
1327 ! print*,'rl_up_rural,rl_up_urb(i,j)',rl_up_rural,rl_up_urb(i,j)
1328 ! print*,'tsk_rural,ts_urb2d(i,j),tsk',tsk_rural(i,j),ts_urb2d(i,j),tsk(i,j)
1329 ! print*,'reconstruction fei',((emiss(i,j)*tsk(i,j)**4.-frc_urb2d(i,j)*emiss_urb(i,j)*ts_urb2d(i,j)**4.)/(emiss_rural(i,j)*(1.-frc_urb2d(i,j))))**.25
1330 ! print*,'ivgtyp,hfx,hfx_urb,hfx_rural',hfx(i,j),hfx_urb(i,j),hfx_rural(i,j)
1331 ! print*,'lh,lh_rural',lh(i,j),lh_rural(i,j)
1332 ! print*,'qfx',qfx(i,j)
1333 ! print*,'ts_urb2d',ts_urb2d(i,j)
1334 ! print*,'ust',ust(i,j)
1335 ! print*,'swdown,glw',swdown(i,j),glw(i,j)
1343 ! IF( IVGTYP(I,J) == 1 .or. IVGTYP(I,J) == 31 .or. &
1344 ! IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
1345 ! print*,'ivgtyp, qfx, hfx',ivgtyp(i,j),hfx_rural(i,j),qfx_rural(i,j)
1346 ! print*,'ivgtyp,hfx,hfx_urb,hfx_rural',hfx(i,j),hfx_urb(i,j),hfx_rural(i,j)
1347 ! print*,'lh,lh_rural',lh(i,j),lh_rural(i,j)
1348 ! print*,'qfx',qfx(i,j)
1349 ! print*,'ts_urb2d',ts_urb2d(i,j)
1350 ! print*,'ust',ust(i,j)
1358 !------------------------------------------------------
1360 !------------------------------------------------------
1362 SUBROUTINE LSMINIT(VEGFRA,SNOW,SNOWC,SNOWH,CANWAT,SMSTAV, &
1363 SMSTOT, SFCRUNOFF,UDRUNOFF,ACSNOW, &
1364 ACSNOM,IVGTYP,ISLTYP,TSLB,SMOIS,SH2O,ZS,DZS, &
1366 SNOALB, FNDSOILW, FNDSNOWH, RDMAXALB, &
1367 num_soil_layers, restart, &
1369 ids,ide, jds,jde, kds,kde, &
1370 ims,ime, jms,jme, kms,kme, &
1371 its,ite, jts,jte, kts,kte )
1373 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
1374 ims,ime, jms,jme, kms,kme, &
1375 its,ite, jts,jte, kts,kte
1377 INTEGER, INTENT(IN) :: num_soil_layers
1379 LOGICAL , INTENT(IN) :: restart , allowed_to_read
1381 REAL, DIMENSION( num_soil_layers), INTENT(INOUT) :: ZS, DZS
1383 REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , &
1384 INTENT(INOUT) :: SMOIS, & !Total soil moisture
1385 SH2O, & !liquid soil moisture
1388 REAL, DIMENSION( ims:ime, jms:jme ) , &
1389 INTENT(INOUT) :: SNOW, &
1402 INTEGER, DIMENSION( ims:ime, jms:jme ) , &
1403 INTENT(IN) :: IVGTYP, &
1405 CHARACTER(LEN=*), INTENT(IN) :: MMINLU
1407 LOGICAL, INTENT(IN) :: FNDSOILW , &
1409 LOGICAL, INTENT(IN) :: RDMAXALB
1413 REAL :: BX, SMCMAX, PSISAT, FREE
1414 REAL, PARAMETER :: BLIM = 5.5, HLICE = 3.335E5, &
1415 GRAV = 9.81, T0 = 273.15
1418 character*256 :: MMINSL
1422 ! initialize three Noah LSM related tables
1423 IF ( allowed_to_read ) THEN
1424 CALL wrf_message( 'INITIALIZE THREE Noah LSM RELATED TABLES' )
1425 CALL SOIL_VEG_GEN_PARM( MMINLU, MMINSL )
1430 ! need this parameter for dust parameterization in wrf/chem
1433 porosity(i)=maxsmc(i)
1434 drypoint(i)=drysmc(i)
1438 IF(.not.restart)THEN
1446 IF ( ISLTYP( i,j ) .LT. 1 ) THEN
1448 WRITE(err_message,*)"module_sf_noahlsm.F: lsminit: out of range ISLTYP ",i,j,ISLTYP( i,j )
1449 CALL wrf_message(err_message)
1451 IF(.not.RDMAXALB) THEN
1452 SNOALB(i,j)=MAXALB(IVGTYP(i,j))*0.01
1456 IF ( errflag .EQ. 1 ) THEN
1457 CALL wrf_error_fatal( "module_sf_noahlsm.F: lsminit: out of range value "// &
1458 "of ISLTYP. Is this field in the input?" )
1461 ! initialize soil liquid water content SH2O
1463 ! IF(.NOT.FNDSOILW) THEN
1465 ! If no SWC, do the following
1466 ! PRINT *,'SOIL WATER NOT FOUND - VALUE SET IN LSMINIT'
1469 BX = BB(ISLTYP(I,J))
1470 SMCMAX = MAXSMC(ISLTYP(I,J))
1471 PSISAT = SATPSI(ISLTYP(I,J))
1472 if ((bx > 0.0).and.(smcmax > 0.0).and.(psisat > 0.0)) then
1473 DO NS=1, num_soil_layers
1474 ! ----------------------------------------------------------------------
1475 !SH2O <= SMOIS for T < 273.149K (-0.001C)
1476 IF (TSLB(I,NS,J) < 273.149) THEN
1477 ! ----------------------------------------------------------------------
1478 ! first guess following explicit solution for Flerchinger Eqn from Koren
1479 ! et al, JGR, 1999, Eqn 17 (KCOUNT=0 in FUNCTION FRH2O).
1480 ! ISLTPK is soil type
1481 BX = BB(ISLTYP(I,J))
1482 SMCMAX = MAXSMC(ISLTYP(I,J))
1483 PSISAT = SATPSI(ISLTYP(I,J))
1484 IF ( BX > BLIM ) BX = BLIM
1485 FK=(( (HLICE/(GRAV*(-PSISAT))) * &
1486 ((TSLB(I,NS,J)-T0)/TSLB(I,NS,J)) )**(-1/BX) )*SMCMAX
1487 IF (FK < 0.02) FK = 0.02
1488 SH2O(I,NS,J) = MIN( FK, SMOIS(I,NS,J) )
1489 ! ----------------------------------------------------------------------
1490 ! now use iterative solution for liquid soil water content using
1491 ! FUNCTION FRH2O with the initial guess for SH2O from above explicit
1493 CALL FRH2O (FREE,TSLB(I,NS,J),SMOIS(I,NS,J),SH2O(I,NS,J), &
1496 ELSE ! of IF (TSLB(I,NS,J)
1497 ! ----------------------------------------------------------------------
1498 ! SH2O = SMOIS ( for T => 273.149K (-0.001C)
1499 SH2O(I,NS,J)=SMOIS(I,NS,J)
1500 ! ----------------------------------------------------------------------
1501 ENDIF ! of IF (TSLB(I,NS,J)
1502 END DO ! of DO NS=1, num_soil_layers
1503 else ! of if ((bx > 0.0)
1504 DO NS=1, num_soil_layers
1505 SH2O(I,NS,J)=SMOIS(I,NS,J)
1507 endif ! of if ((bx > 0.0)
1508 ENDDO ! DO I = its,itf
1509 ENDDO ! DO J = jts,jtf
1510 ! ENDIF ! of IF(.NOT.FNDSOILW)THEN
1512 ! initialize physical snow height SNOWH
1514 IF(.NOT.FNDSNOWH)THEN
1515 ! If no SNOWH do the following
1516 CALL wrf_message( 'SNOW HEIGHT NOT FOUND - VALUE DEFINED IN LSMINIT' )
1519 SNOWH(I,J)=SNOW(I,J)*0.005 ! SNOW in mm and SNOWH in m
1524 ! initialize canopy water to ZERO
1527 ! print*,'Note that canopy water content (CANWAT) is set to ZERO in LSMINIT'
1536 !------------------------------------------------------------------------------
1537 END SUBROUTINE lsminit
1538 !------------------------------------------------------------------------------
1542 !-----------------------------------------------------------------
1543 SUBROUTINE SOIL_VEG_GEN_PARM( MMINLU, MMINSL)
1544 !-----------------------------------------------------------------
1546 USE module_wrf_error
1549 CHARACTER(LEN=*), INTENT(IN) :: MMINLU, MMINSL
1550 integer :: LUMATCH, IINDEX, LC, NUM_SLOPE
1552 INTEGER , PARAMETER :: OPEN_OK = 0
1554 character*128 :: mess , message
1555 logical, external :: wrf_dm_on_monitor
1558 !-----SPECIFY VEGETATION RELATED CHARACTERISTICS :
1559 ! ALBBCK: SFC albedo (in percentage)
1560 ! Z0: Roughness length (m)
1561 ! SHDFAC: Green vegetation fraction (in percentage)
1562 ! Note: The ALBEDO, Z0, and SHDFAC values read from the following table
1563 ! ALBEDO, amd Z0 are specified in LAND-USE TABLE; and SHDFAC is
1564 ! the monthly green vegetation data
1565 ! CMXTBL: MAX CNPY Capacity (m)
1566 ! NROTBL: Rooting depth (layer)
1567 ! RSMIN: Mimimum stomatal resistance (s m-1)
1568 ! RSMAX: Max. stomatal resistance (s m-1)
1569 ! RGL: Parameters used in radiation stress function
1570 ! HS: Parameter used in vapor pressure deficit functio
1571 ! TOPT: Optimum transpiration air temperature. (K)
1572 ! CMCMAX: Maximum canopy water capacity
1573 ! CFACTR: Parameter used in the canopy inteception calculati
1574 ! SNUP: Threshold snow depth (in water equivalent m) that
1575 ! implies 100% snow cover
1576 ! LAI: Leaf area index (dimensionless)
1577 ! MAXALB: Upper bound on maximum albedo over deep snow
1579 !-----READ IN VEGETAION PROPERTIES FROM VEGPARM.TBL
1582 IF ( wrf_dm_on_monitor() ) THEN
1584 OPEN(19, FILE='VEGPARM.TBL',FORM='FORMATTED',STATUS='OLD',IOSTAT=ierr)
1585 IF(ierr .NE. OPEN_OK ) THEN
1586 WRITE(message,FMT='(A)') &
1587 'module_sf_noahlsm.F: soil_veg_gen_parm: failure opening VEGPARM.TBL'
1588 CALL wrf_error_fatal ( message )
1594 FIND_LUTYPE : DO WHILE (LUMATCH == 0)
1595 READ (19,*,END=2002)
1596 READ (19,*,END=2002)LUTYPE
1597 READ (19,*)LUCATS,IINDEX
1599 IF(LUTYPE.EQ.MMINLU)THEN
1600 WRITE( mess , * ) 'LANDUSE TYPE = ' // TRIM ( LUTYPE ) // ' FOUND', LUCATS,' CATEGORIES'
1601 CALL wrf_message( mess )
1604 call wrf_message ( "Skipping over LUTYPE = " // TRIM ( LUTYPE ) )
1605 DO LC = 1, LUCATS+12
1610 ! prevent possible array overwrite, Bill Bovermann, IBM, May 6, 2008
1611 IF ( SIZE(SHDTBL) < LUCATS .OR. &
1612 SIZE(NROTBL) < LUCATS .OR. &
1613 SIZE(RSTBL) < LUCATS .OR. &
1614 SIZE(RGLTBL) < LUCATS .OR. &
1615 SIZE(HSTBL) < LUCATS .OR. &
1616 SIZE(SNUPTBL) < LUCATS .OR. &
1617 SIZE(MAXALB) < LUCATS .OR. &
1618 SIZE(LAIMINTBL) < LUCATS .OR. &
1619 SIZE(LAIMAXTBL) < LUCATS .OR. &
1620 SIZE(Z0MINTBL) < LUCATS .OR. &
1621 SIZE(Z0MAXTBL) < LUCATS .OR. &
1622 SIZE(ALBEDOMINTBL) < LUCATS .OR. &
1623 SIZE(ALBEDOMAXTBL) < LUCATS .OR. &
1624 SIZE(EMISSMINTBL ) < LUCATS .OR. &
1625 SIZE(EMISSMAXTBL ) < LUCATS ) THEN
1626 CALL wrf_error_fatal('Table sizes too small for value of LUCATS in module_sf_noahdrv.F')
1629 IF(LUTYPE.EQ.MMINLU)THEN
1631 READ (19,*)IINDEX,SHDTBL(LC), &
1632 NROTBL(LC),RSTBL(LC),RGLTBL(LC),HSTBL(LC), &
1633 SNUPTBL(LC),MAXALB(LC), LAIMINTBL(LC), &
1634 LAIMAXTBL(LC),EMISSMINTBL(LC), &
1635 EMISSMAXTBL(LC), ALBEDOMINTBL(LC), &
1636 ALBEDOMAXTBL(LC), Z0MINTBL(LC), Z0MAXTBL(LC)
1640 READ (19,*)TOPT_DATA
1642 READ (19,*)CMCMAX_DATA
1644 READ (19,*)CFACTR_DATA
1646 READ (19,*)RSMAX_DATA
1656 IF (LUMATCH == 0) then
1657 CALL wrf_error_fatal ("Land Use Dataset '"//MMINLU//"' not found in VEGPARM.TBL.")
1661 CALL wrf_dm_bcast_string ( LUTYPE , 4 )
1662 CALL wrf_dm_bcast_integer ( LUCATS , 1 )
1663 CALL wrf_dm_bcast_integer ( IINDEX , 1 )
1664 CALL wrf_dm_bcast_integer ( LUMATCH , 1 )
1665 CALL wrf_dm_bcast_real ( SHDTBL , NLUS )
1666 CALL wrf_dm_bcast_real ( NROTBL , NLUS )
1667 CALL wrf_dm_bcast_real ( RSTBL , NLUS )
1668 CALL wrf_dm_bcast_real ( RGLTBL , NLUS )
1669 CALL wrf_dm_bcast_real ( HSTBL , NLUS )
1670 CALL wrf_dm_bcast_real ( SNUPTBL , NLUS )
1671 CALL wrf_dm_bcast_real ( LAIMINTBL , NLUS )
1672 CALL wrf_dm_bcast_real ( LAIMAXTBL , NLUS )
1673 CALL wrf_dm_bcast_real ( Z0MINTBL , NLUS )
1674 CALL wrf_dm_bcast_real ( Z0MAXTBL , NLUS )
1675 CALL wrf_dm_bcast_real ( EMISSMINTBL , NLUS )
1676 CALL wrf_dm_bcast_real ( EMISSMAXTBL , NLUS )
1677 CALL wrf_dm_bcast_real ( ALBEDOMINTBL , NLUS )
1678 CALL wrf_dm_bcast_real ( ALBEDOMAXTBL , NLUS )
1679 CALL wrf_dm_bcast_real ( MAXALB , NLUS )
1680 CALL wrf_dm_bcast_real ( TOPT_DATA , 1 )
1681 CALL wrf_dm_bcast_real ( CMCMAX_DATA , 1 )
1682 CALL wrf_dm_bcast_real ( CFACTR_DATA , 1 )
1683 CALL wrf_dm_bcast_real ( RSMAX_DATA , 1 )
1684 CALL wrf_dm_bcast_integer ( BARE , 1 )
1685 CALL wrf_dm_bcast_integer ( NATURAL , 1 )
1688 !-----READ IN SOIL PROPERTIES FROM SOILPARM.TBL
1690 IF ( wrf_dm_on_monitor() ) THEN
1691 OPEN(19, FILE='SOILPARM.TBL',FORM='FORMATTED',STATUS='OLD',IOSTAT=ierr)
1692 IF(ierr .NE. OPEN_OK ) THEN
1693 WRITE(message,FMT='(A)') &
1694 'module_sf_noahlsm.F: soil_veg_gen_parm: failure opening SOILPARM.TBL'
1695 CALL wrf_error_fatal ( message )
1698 WRITE(mess,*) 'INPUT SOIL TEXTURE CLASSIFICATION = ', TRIM ( MMINSL )
1699 CALL wrf_message( mess )
1704 READ (19,2000,END=2003)SLTYPE
1706 READ (19,*)SLCATS,IINDEX
1707 IF(SLTYPE.EQ.MMINSL)THEN
1708 WRITE( mess , * ) 'SOIL TEXTURE CLASSIFICATION = ', TRIM ( SLTYPE ) , ' FOUND', &
1709 SLCATS,' CATEGORIES'
1710 CALL wrf_message ( mess )
1713 ! prevent possible array overwrite, Bill Bovermann, IBM, May 6, 2008
1714 IF ( SIZE(BB ) < SLCATS .OR. &
1715 SIZE(DRYSMC) < SLCATS .OR. &
1716 SIZE(F11 ) < SLCATS .OR. &
1717 SIZE(MAXSMC) < SLCATS .OR. &
1718 SIZE(REFSMC) < SLCATS .OR. &
1719 SIZE(SATPSI) < SLCATS .OR. &
1720 SIZE(SATDK ) < SLCATS .OR. &
1721 SIZE(SATDW ) < SLCATS .OR. &
1722 SIZE(WLTSMC) < SLCATS .OR. &
1723 SIZE(QTZ ) < SLCATS ) THEN
1724 CALL wrf_error_fatal('Table sizes too small for value of SLCATS in module_sf_noahdrv.F')
1726 IF(SLTYPE.EQ.MMINSL)THEN
1728 READ (19,*) IINDEX,BB(LC),DRYSMC(LC),F11(LC),MAXSMC(LC),&
1729 REFSMC(LC),SATPSI(LC),SATDK(LC), SATDW(LC), &
1739 CALL wrf_dm_bcast_integer ( LUMATCH , 1 )
1740 CALL wrf_dm_bcast_string ( SLTYPE , 4 )
1741 CALL wrf_dm_bcast_string ( MMINSL , 4 ) ! since this is reset above, see oct2 ^
1742 CALL wrf_dm_bcast_integer ( SLCATS , 1 )
1743 CALL wrf_dm_bcast_integer ( IINDEX , 1 )
1744 CALL wrf_dm_bcast_real ( BB , NSLTYPE )
1745 CALL wrf_dm_bcast_real ( DRYSMC , NSLTYPE )
1746 CALL wrf_dm_bcast_real ( F11 , NSLTYPE )
1747 CALL wrf_dm_bcast_real ( MAXSMC , NSLTYPE )
1748 CALL wrf_dm_bcast_real ( REFSMC , NSLTYPE )
1749 CALL wrf_dm_bcast_real ( SATPSI , NSLTYPE )
1750 CALL wrf_dm_bcast_real ( SATDK , NSLTYPE )
1751 CALL wrf_dm_bcast_real ( SATDW , NSLTYPE )
1752 CALL wrf_dm_bcast_real ( WLTSMC , NSLTYPE )
1753 CALL wrf_dm_bcast_real ( QTZ , NSLTYPE )
1755 IF(LUMATCH.EQ.0)THEN
1756 CALL wrf_message( 'SOIl TEXTURE IN INPUT FILE DOES NOT ' )
1757 CALL wrf_message( 'MATCH SOILPARM TABLE' )
1758 CALL wrf_error_fatal ( 'INCONSISTENT OR MISSING SOILPARM FILE' )
1762 !-----READ IN GENERAL PARAMETERS FROM GENPARM.TBL
1764 IF ( wrf_dm_on_monitor() ) THEN
1765 OPEN(19, FILE='GENPARM.TBL',FORM='FORMATTED',STATUS='OLD',IOSTAT=ierr)
1766 IF(ierr .NE. OPEN_OK ) THEN
1767 WRITE(message,FMT='(A)') &
1768 'module_sf_noahlsm.F: soil_veg_gen_parm: failure opening GENPARM.TBL'
1769 CALL wrf_error_fatal ( message )
1774 READ (19,*) NUM_SLOPE
1777 ! prevent possible array overwrite, Bill Bovermann, IBM, May 6, 2008
1778 IF ( SIZE(slope_data) < NUM_SLOPE ) THEN
1779 CALL wrf_error_fatal('NUM_SLOPE too large for slope_data array in module_sf_noahdrv')
1783 READ (19,*)SLOPE_DATA(LC)
1787 READ (19,*)SBETA_DATA
1789 READ (19,*)FXEXP_DATA
1791 READ (19,*)CSOIL_DATA
1793 READ (19,*)SALP_DATA
1795 READ (19,*)REFDK_DATA
1797 READ (19,*)REFKDT_DATA
1799 READ (19,*)FRZK_DATA
1801 READ (19,*)ZBOT_DATA
1803 READ (19,*)CZIL_DATA
1805 READ (19,*)SMLOW_DATA
1807 READ (19,*)SMHIGH_DATA
1809 READ (19,*)LVCOEF_DATA
1813 CALL wrf_dm_bcast_integer ( NUM_SLOPE , 1 )
1814 CALL wrf_dm_bcast_integer ( SLPCATS , 1 )
1815 CALL wrf_dm_bcast_real ( SLOPE_DATA , NSLOPE )
1816 CALL wrf_dm_bcast_real ( SBETA_DATA , 1 )
1817 CALL wrf_dm_bcast_real ( FXEXP_DATA , 1 )
1818 CALL wrf_dm_bcast_real ( CSOIL_DATA , 1 )
1819 CALL wrf_dm_bcast_real ( SALP_DATA , 1 )
1820 CALL wrf_dm_bcast_real ( REFDK_DATA , 1 )
1821 CALL wrf_dm_bcast_real ( REFKDT_DATA , 1 )
1822 CALL wrf_dm_bcast_real ( FRZK_DATA , 1 )
1823 CALL wrf_dm_bcast_real ( ZBOT_DATA , 1 )
1824 CALL wrf_dm_bcast_real ( CZIL_DATA , 1 )
1825 CALL wrf_dm_bcast_real ( SMLOW_DATA , 1 )
1826 CALL wrf_dm_bcast_real ( SMHIGH_DATA , 1 )
1827 CALL wrf_dm_bcast_real ( LVCOEF_DATA , 1 )
1830 !-----------------------------------------------------------------
1831 END SUBROUTINE SOIL_VEG_GEN_PARM
1832 !-----------------------------------------------------------------
1834 END MODULE module_sf_noahdrv