1 MODULE module_sf_noahmpdrv
3 !-------------------------------
4 USE module_sf_noahmplsm
6 USE module_model_constants, ONLY : R_D, CP, XLF, XLV, RHOWATER, KARMAN
7 USE module_sf_noahdrv, ONLY : SOIL_VEG_GEN_PARM
8 USE module_sf_noah_seaice
9 USE module_sf_noahlsm_glacial_only
10 USE MODULE_RA_GFDLETA, ONLY: CAL_MON_DAY
12 USE module_data_gocart_dust
14 !-------------------------------
19 SUBROUTINE noahmplsm(DZ8W,QV3D,P8W3D,T3D,TSK, &
20 HFX,QFX,LH,GRDFLX, QGH,GSW,SWDOWN,GLW,SMSTAV,SMSTOT, &
21 SFCRUNOFF, UDRUNOFF,IVGTYP,ISLTYP,VEGFRA, &
22 ALBEDO,ALBBCK,ZNT,Z0,TMN,XLAND,XICE,XICE_THRESHOLD,ISICE,EMISS,EMBCK, &
24 num_soil_layers,DT,DZS,ITIMESTEP, &
25 SMOIS,TSLB,SNOW,CANWAT, &
26 CHS,CHS2,CQS2,CPM,ROVCP,SR,chklowq,qz0, & !H
30 COSZ_URB2D, XLAT_URB2D, & !I
32 SNOTIME,ACSNOM,ACSNOW, & !O
33 idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz ,iopt_inf , &
34 iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot,iopt_stc , &
35 isnowxy ,tvxy ,tgxy ,canicexy , &
36 canliqxy ,eahxy ,tahxy ,cmxy ,chxy , &
37 fwetxy ,sneqvoxy ,alboldxy ,qsnowxy ,wslakexy ,zwtxy ,waxy , &
38 wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy , &
39 stmassxy ,woodxy ,stblcpxy ,fastcpxy ,xlaixy ,xsaixy , &
40 tradxy ,tsxy ,neexy ,gppxy ,nppxy ,fvegxy ,qinxy , &
41 runsfxy ,runsbxy ,ecanxy ,edirxy ,etranxy ,fsaxy ,firaxy , &
42 aparxy ,psnxy ,savxy ,sagxy , &
43 fsnoxy ,YR ,JULIAN , &
47 qcxy ,pblhxy ,isurban ,iz0tlnd ,dx , & !I
48 chstarxy ,t2mvxy ,t2mbxy ,rssunxy ,rsshaxy, bgapxy ,wgapxy ,gapxy, & !O
49 tgvxy ,tgbxy ,q2mvxy ,q2mbxy ,shdmaxxy, chvxy ,chbxy , &
52 ids,ide, jds,jde, kds,kde, &
53 ims,ime, jms,jme, kms,kme, &
54 its,ite, jts,jte, kts,kte )
55 !----------------------------------------------------------------
57 !----------------------------------------------------------------
58 !----------------------------------------------------------------
59 ! --- atmospheric (WRF generic) variables
60 !-- DT time step (seconds)
61 !-- DZ8W thickness of layers (m)
62 !-- T3D temperature (K)
63 !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
64 !-- P3D 3D pressure (Pa)
65 !-- FLHC exchange coefficient for heat (m/s)
66 !-- FLQC exchange coefficient for moisture (m/s)
67 !-- PSFC surface pressure (Pa)
68 !-- XLAND land mask (1 for land, 2 for water)
69 !-- QGH saturated mixing ratio at 2 meter
70 !-- GSW downward short wave flux at ground surface (W/m^2)
71 !-- GLW downward long wave flux at ground surface (W/m^2)
73 !-- CANWAT canopy moisture content (mm)
74 !-- TSK surface temperature (K)
75 !-- TSLB soil temp (k)
76 !-- SMOIS total soil moisture content (volumetric fraction)
77 !-- SH2O unfrozen soil moisture content (volumetric fraction)
78 ! note: frozen soil moisture (i.e., soil ice) = SMOIS - SH2O
79 !-- SNOWH actual snow depth (m)
80 !-- SNOW liquid water-equivalent snow depth (m)
81 !-- ALBEDO time-varying surface albedo including snow effect (unitless fraction)
82 !-- ALBBCK background surface albedo (unitless fraction)
83 !-- CHS surface exchange coefficient for heat and moisture (m s-1);
84 !-- CHS2 2m surface exchange coefficient for heat (m s-1);
85 !-- CQS2 2m surface exchange coefficient for moisture (m s-1);
87 !-- num_soil_layers the number of soil layers
88 !-- ZS depths of centers of soil layers (m)
89 !-- DZS thicknesses of soil layers (m)
90 !-- SLDPTH thickness of each soil layer (m, same as DZS)
91 !-- TMN soil temperature at lower boundary (K)
92 !-- SMCMAX porosity, i.e. saturated value of soil moisture (volumetric)
93 !-- NROOT number of root layers, a function of veg type, determined
94 ! in subroutine redprm.
95 !-- SMSTAV Soil moisture availability for evapotranspiration (
96 ! fraction between SMCWLT and SMCMXA)
97 !-- SMSTOT Total soil moisture content frozen+unfrozen) in the soil column (mm)
99 !-- SNOWC fraction snow coverage (0-1.0)
100 ! --- vegetation variables
101 !-- SNOALB upper bound on maximum albedo over deep snow
102 !-- Z0BRD Background fixed roughness length (M)
103 !-- Z0 Background vroughness length (M) as function
104 !-- ZNT Time varying roughness length (M) as function
105 !-- ALBD(IVGTPK,ISN) background albedo reading from a table
107 !-- HFX upward heat flux at the surface (W/m^2)
108 !-- QFX upward moisture flux at the surface (kg/m^2/s)
109 !-- LH upward moisture flux at the surface (W m-2)
110 !-- GRDFLX(I,J) ground heat flux (W m-2)
111 !-- FDOWN radiation forcing at the surface (W m-2) = SOLDN*(1-alb)+LWDN
112 !----------------------------------------------------------------------------
113 !-- EC canopy water evaporation ((W m-2)
114 !-- EDIR direct soil evaporation (W m-2)
115 !-- ESNOW sublimation from (or deposition to if <0) snowpack (W m-2)
116 !-- DEW dewfall (or frostfall for t<273.15) (M)
117 ! ----------------------------------------------------------------------
118 !-- ETP potential evaporation (W m-2)
119 ! ----------------------------------------------------------------------
120 !-- FLX1 precip-snow sfc (W m-2)
121 !-- FLX2 freezing rain latent heat flux (W m-2)
122 !-- FLX3 phase-change heat flux from snowmelt (W m-2)
123 ! ----------------------------------------------------------------------
124 !-- ACSNOM snow melt (mm) (water equivalent)
125 !-- ACSNOW accumulated snow fall (mm) (water equivalent)
126 !-- POTEVP accumulated potential evaporation (W/m^2)
127 !-- RIB Bulk Richardson number from SFCLAY routine
128 ! ----------------------------------------------------------------------
129 !-- RUNOFF1 surface runoff (m s-1), not infiltrating the surface
130 !-- RUNOFF2 subsurface runoff (m s-1), drainage out bottom of last
131 ! soil layer (baseflow)
132 ! ----------------------------------------------------------------------
133 !-- RC canopy resistance (s m-1)
134 !-- PC plant coefficient (unitless fraction, 0-1) where PC*ETP = actual transp
135 !-- EMISS surface emissivity (between 0 and 1)
136 !-- EMBCK Background surface emissivity (between 0 and 1)
137 !-- SHDMAX Maximum vegetation fraction
140 ! (R_d/R_v) (dimensionless)
141 !-- ids start index for i in domain
142 !-- ide end index for i in domain
143 !-- jds start index for j in domain
144 !-- jde end index for j in domain
145 !-- kds start index for k in domain
146 !-- kde end index for k in domain
147 !-- ims start index for i in memory
148 !-- ime end index for i in memory
149 !-- jms start index for j in memory
150 !-- jme end index for j in memory
151 !-- kms start index for k in memory
152 !-- kme end index for k in memory
153 !-- its start index for i in tile
154 !-- ite end index for i in tile
155 !-- jts start index for j in tile
156 !-- jte end index for j in tile
157 !-- kts start index for k in tile
158 !-- kte end index for k in tile
160 !-- SR fraction of frozen precip (0.0 to 1.0)
161 !----------------------------------------------------------------
165 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
166 & ims,ime, jms,jme, kms,kme, &
167 & its,ite, jts,jte, kts,kte
169 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: U_PHY
170 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: V_PHY
171 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: COSZ_URB2D
172 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XLAT_URB2D
175 REAL, DIMENSION( ims:ime, jms:jme ) , &
176 & INTENT(IN ) :: TMN, &
191 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
192 INTENT(IN ) :: QV3D, &
196 !jref:start - changed to inout
197 REAL, DIMENSION( ims:ime, jms:jme ) , &
198 INTENT(INOUT ) :: QGH, &
203 INTEGER, DIMENSION( ims:ime, jms:jme ) , &
204 INTENT(IN ) :: IVGTYP, &
207 INTEGER, INTENT(IN) :: num_soil_layers,ITIMESTEP
208 !jref:start - xice_threshold
209 REAL, INTENT(IN ) :: DT,ROVCP,XICE_THRESHOLD
210 INTEGER, INTENT(IN ) :: ISICE
213 REAL, DIMENSION(1:num_soil_layers), INTENT(IN)::DZS
217 REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), &
218 & INTENT(INOUT) :: SMOIS, &
222 REAL, DIMENSION( ims:ime, jms:jme ) , &
223 & INTENT(INOUT) :: TSK, &
247 REAL, DIMENSION( ims:ime, jms:jme ) , &
248 INTENT(OUT) :: CHKLOWQ
249 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: QZ0
253 INTEGER, INTENT(IN) :: idveg !dynamic vegetation (1 -> off ; 2 -> on) with opt_crs = 1
254 INTEGER, INTENT(IN) :: iopt_crs !canopy stomatal resistance (1-> Ball-Berry; 2->Jarvis)
255 INTEGER, INTENT(IN) :: iopt_btr !soil moisture factor for stomatal resistance (1-> Noah; 2-> CLM; 3-> SSiB)
256 INTEGER, INTENT(IN) :: iopt_run !runoff and groundwater (1->SIMGM; 2->SIMTOP; 3->Schaake96; 4->BATS)
257 INTEGER, INTENT(IN) :: iopt_sfc !surface layer drag coeff (CH & CM) (1->M-O; 2->Chen97)
258 INTEGER, INTENT(IN) :: iopt_frz !supercooled liquid water (1-> NY06; 2->Koren99)
259 INTEGER, INTENT(IN) :: iopt_inf !frozen soil permeability (1-> NY06; 2->Koren99)
260 INTEGER, INTENT(IN) :: iopt_rad !radiation transfer (1->gap=F(3D,cosz); 2->gap=0; 3->gap=1-Fveg)
261 INTEGER, INTENT(IN) :: iopt_alb !snow surface albedo (1->BATS; 2->CLASS)
262 INTEGER, INTENT(IN) :: iopt_snf !rainfall & snowfall (1-Jordan91; 2->BATS; 3->Noah)
263 INTEGER, INTENT(IN) :: iopt_tbot !lower boundary of soil temperature (1->zero-flux; 2->Noah)
264 INTEGER, INTENT(IN) :: iopt_stc !snow/soil temperature time scheme
267 INTEGER, INTENT(IN) :: YR
268 REAL, INTENT(IN) :: JULIAN
269 INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: isnowxy !actual no. of snow layers
270 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tvxy !vegetation canopy temperature
271 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tgxy !ground surface temperature
272 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canicexy !canopy-intercepted ice (mm)
273 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canliqxy !canopy-intercepted liquid water (mm)
274 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: eahxy !canopy air vapor pressure (pa)
275 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tahxy !canopy air temperature (k)
276 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: cmxy !momentum drag coefficient
277 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chxy !sensible heat exchange coefficient
278 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fwetxy !wetted or snowed fraction of the canopy (-)
279 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: sneqvoxy !snow mass at last time step(mm h2o)
280 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: alboldxy !snow albedo at last time step (-)
281 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qsnowxy !snowfall on the ground [mm/s]
282 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wslakexy !lake water storage [mm]
284 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: zwtxy !water table depth [m]
285 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: waxy !water in the "aquifer" [mm]
286 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wtxy !groundwater storage [mm]
287 REAL, DIMENSION(ims:ime,-2:num_soil_layers,jms:jme), INTENT(INOUT) :: zsnsoxy !snow layer depth [m]
288 REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: tsnoxy !snow temperature [K]
289 REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snicexy !snow layer ice [mm]
290 REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snliqxy !snow layer liquid water [mm]
291 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: lfmassxy !leaf mass [g/m2]
292 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: rtmassxy !mass of fine roots [g/m2]
293 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stmassxy !stem mass [g/m2]
294 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: woodxy !mass of wood (incl. woody roots) [g/m2]
295 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stblcpxy !stable carbon in deep soil [g/m2]
296 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fastcpxy !short-lived carbon, shallow soil [g/m2]
297 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xlaixy !leaf area index
298 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xsaixy !stem area index
300 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: SNOTIME !snow age time
304 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tradxy !surface radiative temperature (k)
305 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tsxy !surface temperature (k)
306 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: neexy !net ecosys exchange (g/m2/s CO2)
307 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: gppxy !gross primary assimilation [g/m2/s C]
308 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: nppxy !net primary productivity [g/m2/s C]
309 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: fvegxy !greenness vegetation fraction [-]
310 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: qinxy !groundwater recharge [mm/s]
311 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: runsfxy !surface runoff [mm/s]
312 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: runsbxy !subsurface runoff [mm/s]
313 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: ecanxy !evaporation of intercepted water (mm/s)
314 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: edirxy !soil surface evaporation rate (mm/s]
315 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: etranxy !transpiration rate (mm/s)
316 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: fsaxy !total absorbed solar radiation (w/m2)
317 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: firaxy !total net longwave rad (w/m2) [+ to atm]
318 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: aparxy !photosyn active energy by canopy (w/m2)
319 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: psnxy !total photosynthesis (umol co2/m2/s) [+]
320 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: savxy !solar rad absorbed by veg. (w/m2)
321 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: sagxy !solar rad absorbed by ground (w/m2)
322 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: fsnoxy !snow cover fraction (-)
325 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: chstarxy !effective ch
326 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: t2mvxy !2m temperature of vegetation part
327 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: t2mbxy !2m temperature of bare ground part
328 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: q2mvxy !2m mixing ratio of vegetation part
329 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: q2mbxy !2m mixing ratio of bare ground part
331 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: qcxy !cloud water mixing ratio
332 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: pblhxy !Planetary boundary layer from sfclay
333 INTEGER , INTENT(IN) :: isurban
334 INTEGER , INTENT(IN) :: iz0tlnd
335 REAL , INTENT(IN) :: dx
336 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: rssunxy !sunlit leaf stomatal resistance (s/m)
337 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: rsshaxy !shaded leaf stomatal resistance (s/m)
338 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: bgapxy !between gap fraction
339 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: wgapxy !within gap fraction
340 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: gapxy !within gap fraction
341 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tgvxy
342 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: tgbxy
343 REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: shdmaxxy
344 REAL, DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: chvxy !sensible heat exchange coefficient vegetated
345 REAL, DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: chbxy !sensible heat exchange coefficient bare-ground
351 ! Local variables (moved here from driver to make routine thread safe, 20031007 jm)
355 REAL :: ETP, SSOIL,EC, ESNOW, &
356 FLX1,FLX2,FLX3,DEW,FDOWN,RC,PC,FFROZP
359 !locals (prognostic):
361 INTEGER :: isnow !actual no. of snow layers
362 REAL, DIMENSION(-2:num_soil_layers) :: stc !snow/soil tmperatures
363 REAL, DIMENSION( 1:num_soil_layers) :: smc !vol. soil moisture (m3/m3)
364 REAL, DIMENSION( 1:num_soil_layers) :: smh2o !vol. soil liquid water (m3/m3)
365 REAL :: tv !vegetation canopy temperature
366 REAL :: tg !ground surface temperature
367 REAL :: canice !canopy-intercepted ice (mm)
368 REAL :: canliq !canopy-intercepted liquid water (mm)
369 REAL :: snowd !snow depth (m)
370 REAL :: swe !snow water equivalent (mm)
371 REAL :: eah !canopy air vapor pressure (pa)
372 REAL :: tah !canopy air temperature (k)
373 REAL :: cm !momentum drag coefficient
374 REAL :: ch !sensible heat exchange coefficient
375 REAL :: fwet !wetted or snowed fraction of the canopy (-)
376 REAL :: sneqvo !snow mass at last time step(mm h2o)
377 REAL :: albold !snow albedo at last time step (-)
378 REAL :: qsnow !snowfall on the ground [mm/s]
379 REAL :: wslake !lake water storage [mm]
381 REAL :: zwt !water table depth [m]
382 REAL :: wa !water in the "aquifer" [mm]
383 REAL :: wt !groundwater storage [mm]
384 REAL, DIMENSION(-2:num_soil_layers) :: zsnso !snow layer depth [m]
385 REAL, DIMENSION(-2: 0) :: tsno !snow temperature [K]
386 REAL, DIMENSION(-2: 0) :: snice !snow layer ice [mm]
387 REAL, DIMENSION(-2: 0) :: snliq !snow layer liquid water [mm]
388 REAL :: lfmass !leaf mass [g/m2]
389 REAL :: rtmass !mass of fine roots [g/m2]
390 REAL :: stmass !stem mass [g/m2]
391 REAL :: wood !mass of wood (incl. woody roots) [g/m2]
392 REAL :: stblcp !stable carbon in deep soil [g/m2]
393 REAL :: fastcp !short-lived carbon, shallow soil [g/m2]
394 REAL :: plai !leaf area index
395 REAL :: psai !stem area index
400 REAL :: chstar !effective ch
402 REAL :: t2mv !2m temperature of vegetation part
403 REAL :: t2mb !2m temperature of bare ground part
404 REAL :: q2mv !2m mixing ratio of vegetation part
405 REAL :: q2mb !2m mixing ratio of bare ground part
410 REAL, DIMENSION(ims:ime,jms:jme) :: tstarxy !effective skin temperature
411 REAL, DIMENSION(ims:ime,jms:jme) :: chstar2xy !effective 2m exchange coefficients
421 REAL :: qv1d !mixing ratio
424 REAL :: chv !sensible heat exchange coefficient vegetated
425 REAL :: chb !sensible heat exchange coefficient bare-ground
430 REAL :: trad !surface radiative temperature (k)
431 REAL :: ts !surface temperature (k)
432 REAL :: nee !net ecosys exchange (g/m2/s CO2)
433 REAL :: gpp !gross primary assimilation [g/m2/s C]
434 REAL :: npp !net primary productivity [g/m2/s C]
435 REAL :: fveg !greenness vegetation fraction [-]
436 REAL :: qin !groundwater recharge [mm/s]
437 REAL :: runsf !surface runoff [mm/s]
438 REAL :: runsb !subsurface runoff [mm/s]
439 REAL :: ecan !evaporation of intercepted water (mm/s)
440 REAL :: esoil !soil surface evaporation rate (mm/s]
441 REAL :: etran !transpiration rate (mm/s)
442 REAL :: fsa !total absorbed solar radiation (w/m2)
443 REAL :: fira !total net longwave rad (w/m2) [+ to atm]
444 REAL :: fsh !total sensible heat (w/m2) [+ to atm]
445 REAL :: flh !total latent heat (w/m2) [+ to atm]
446 REAL :: apar !photosyn active energy by canopy (w/m2)
447 REAL :: psn !total photosynthesis (umol co2/m2/s) [+]
448 REAL :: sav !solar rad absorbed by veg. (w/m2)
449 REAL :: sag !solar rad absorbed by ground (w/m2)
450 REAL :: fsno !snow cover fraction (-)
451 REAL :: salb !surface albedo (-)
460 real :: fsr !total reflected solar radiation (w/m2)
461 real :: fcev !canopy evaporation heat (w/m2) [+ to atm]
462 real :: fgev !ground evaporation heat (w/m2) [+ to atm]
463 real :: fctr !transpiration heat flux (w/m2) [+ to atm]
464 real, dimension(-2: 0) :: ficeold !snow layer liquid water [mm]
466 INTEGER :: ILOC !grid index
467 INTEGER :: JLOC !grid index
468 INTEGER :: ISC !soil color index
469 INTEGER :: IST !surface type 1-soil; 2-lake
473 LOGICAL, INTENT(IN ) :: myj,frpcpn
475 ! DECLARATIONS - LOGICAL
476 ! ----------------------------------------------------------------------
477 LOGICAL, PARAMETER :: LOCAL=.false.
478 LOGICAL :: FRZGRA, SNOWNG
482 ! ----------------------------------------------------------------------
483 ! DECLARATIONS - INTEGER
484 ! ----------------------------------------------------------------------
485 INTEGER :: I,J, ICE,NSOIL,SLOPETYP,SOILTYP,VEGTYP
489 ! ----------------------------------------------------------------------
490 ! DECLARATIONS - REAL
491 ! ----------------------------------------------------------------------
493 REAL :: DQSDT2, LWDN, PRCP, PSFC, UU, VV, CO2AIR, O2AIR, &
494 & Q2SAT,Q2SATI,SFCPRS,SFCTMP,SHDFAC,SNOALB1, &
495 & SOLDN,TBOT,ZLVL, Q2K,ALBBRD, ETA, ETA_KINEMATIC, &
496 & EMBRD, FOLN, LAT, &
497 & Z0K,RUNOFF1,RUNOFF2,SOLNET,E2SAT,SFCTSNO
504 REAL :: SNCOVR,SNEQV,CHK,TH2
506 REAL :: SMCMAX,SNOMLT,SOILM,SOILW,Q1,T1
512 !niu REAL, DIMENSION(1:num_soil_layers):: SLDPTH, STC,SMC,SWC
513 REAL, DIMENSION(1:num_soil_layers):: SLDPTH,SWC
516 REAL, DIMENSION(1:num_soil_layers):: STCNEW
519 REAL, DIMENSION(1:num_soil_layers) :: ZSOIL, RTDIS
520 REAL, PARAMETER :: TRESH=.95E0, A2=17.67,A3=273.15,A4=29.65, &
521 T0=273.16E0, ELWV=2.50E6, A23M4=A2*(A3-A4)
523 ! Used for calculating the 2-m Potential Temperature:
524 REAL, PARAMETER :: CAPA=R_D/CP
529 ! ----------------------------------------------------------------------
530 ! ----------------------------------------------------------------------
533 FDTW=DT/(XLV*RHOWATER)
542 if (mod(YR,4) == 0) then
544 if (mod(YR,100) == 0) then
546 if (mod(YR,400) == 0) then
552 NSOIL=num_soil_layers
558 call noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz , &
559 iopt_inf ,iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc )
561 ISC = 4 ! soil color: assuming a middle color category ?????????
563 ZSOIL(1) = -SLDPTH(1) ! move out of x-y do loops
565 ZSOIL(KZ) = -SLDPTH(KZ) + ZSOIL(KZ-1)
573 IF(ITIMESTEP.EQ.1)THEN
576 !*** SET ZERO-VALUE FOR SOME OUTPUT DIAGNOSTIC ARRAYS
577 IF((XLAND(I,J)-1.5).GE.0.)THEN
578 ! check sea-ice point
579 IF(XICE(I,J).EQ.1..and.IPRINT)PRINT*,' sea-ice at water point, I=',I, &
586 TSLB(I,NS,J)=273.16 !STEMP
589 IF(XICE(I,J).EQ.1.)THEN
600 ENDIF ! end of initialization over ocean
603 !-----------------------------------------------------------------------
607 ! pressure in middle of lowest layer
608 SFCPRS=(P8W3D(I,KTS+1,j)+P8W3D(i,KTS,j))*0.5
609 ! convert from mixing ratio to specific humidity
610 Q2K=QV3D(i,1,j)/(1.0+QV3D(i,1,j))
613 Q2SAT=QGH(I,J)/(1.0+QGH(I,J)) ! Q2SAT is sp humidity
614 ! add check on myj=.true.
615 ! IF((Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
616 IF((myj).AND.(Q2K.GE.Q2SAT*TRESH).AND.Q2K.LT.QZ0(I,J))THEN
625 ! TH2=SFCTMP+(0.0097545*ZLVL)
626 ! calculate SFCTH2 via Exner function vs lapse-rate (above)
627 APES=(1.E5/PSFC)**CAPA
628 APELM=(1.E5/SFCPRS)**CAPA
633 ! LWDN=GLW(I,J)*EMISSI
635 ! SOLDN is total incoming solar
637 ! GSW is net downward solar
639 ! use mid-day albedo to determine net downward solar (no solar zenith angle correction)
640 SOLNET=SOLDN*(1.-ALBEDO(I,J))
644 SHDFAC=VEGFRA(I,J)/100.
647 SNOALB1=SNOALB(I,J) !NEW
649 ! if "SR" present, set frac of frozen precip ("FFROZP") = snow-ratio ("SR", range:0-1)
650 ! SR from e.g. Ferrier microphysics
651 ! otherwise define from 1st atmos level temperature
655 IF (SFCTMP <= 273.15) THEN
662 IF((XLAND(I,J)-1.5).GE.0.)THEN ! begining of land/sea if block
665 ! Land or sea-ice case
667 IF (XICE(I,J) .GT. 0.5) THEN
672 DQSDT2=Q2SAT*A23M4/(SFCTMP-A4)**2
674 IF(SNOW(I,J).GT.0.0)THEN
675 ! snow on surface (use ice saturation properties)
677 E2SAT=611.2*EXP(6174.*(1./273.15 - 1./SFCTSNO))
678 Q2SATI=0.622*E2SAT/(SFCPRS-E2SAT)
679 Q2SATI=Q2SATI/(1.0+Q2SATI) ! spec. hum.
680 IF(T1 .GT. 273.15)THEN
681 ! warm ground temps, weight the saturation between ice and water according to SNOWC
682 Q2SAT=Q2SAT*(1.-SNOWC(I,J)) + Q2SATI*SNOWC(I,J)
683 DQSDT2=DQSDT2*(1.-SNOWC(I,J)) + Q2SATI*6174./(SFCTSNO**2)*SNOWC(I,J)
685 ! cold ground temps, use ice saturation only
687 DQSDT2=Q2SATI*6174./(SFCTSNO**2)
689 ! for snow cover fraction at 0 C, ground temp will not change, so DQSDT2 effectively zero
690 IF(T1 .GT. 273. .AND. SNOWC(I,J) .GT. 0.)DQSDT2=DQSDT2*(1.-SNOWC(I,J))
698 IF(VEGTYP.EQ.25) SHDFAC=0.0000
699 IF(VEGTYP.EQ.26) SHDFAC=0.0000
700 IF(VEGTYP.EQ.27) SHDFAC=0.0000
701 IF(SOILTYP.EQ.14.AND.XICE(I,J).EQ.0.)THEN
702 IF(IPRINT)PRINT*,' SOIL TYPE FOUND TO BE WATER AT A LAND-POINT'
703 IF(IPRINT)PRINT*,i,j,'RESET SOIL in surfce.F'
707 !-------------------------------------------
711 !jref:start - check if this is correct!! Maybe snowd
713 SNOTIME1 = SNOTIME(I,J)
716 !FEI: temporaray arrays above need to be changed later by using SI
718 !niu DO 70 NS=1,NSOIL
719 !niu SMC(NS)=SMOIS(I,NS,J)
720 !niu STC(NS)=TSLB(I,NS,J) !STEMP
721 !niu SWC(NS)=SH2O(I,NS,J)
725 IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. &
726 IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN
731 IF(VEGTYP == 16) IST = 2 ! lake points
733 CALL REDPRM (VEGTYP,SOILTYP,SLOPETYP,SLDPTH,ZSOIL,NSOIL,ISURBAN)
737 CO2AIR = 395.E-06 * SFCPRS !partial pressure co2 (pa)
738 O2AIR = 0.209 * SFCPRS !partial pressure o2 (pa)
739 COSZ = COSZ_URB2D(I,J)
740 LAT = XLAT_URB2D(I,J)
742 isnow = isnowxy (i,j)
743 stc (isnow+1: 0) = tsnoxy (i,isnow+1: 0,j)
744 stc ( 1:nsoil) = tslb (i, 1:nsoil,j)
745 smc ( 1:nsoil) = smois (i, 1:nsoil,j)
746 smh2o( 1:nsoil) = sh2o (i, 1:nsoil,j)
749 canliq = canliqxy(i,j)
750 canice = canicexy(i,j)
769 qv1d = qv3d (i,1,j) ! seaice/glacial needs mixing ratio (q2k = specific hum).
770 dz8w1d = dz8w (i,1,j)
771 shdmax = shdmaxxy (i,j)/100. !fraction
775 sneqvo = sneqvoxy(i,j)
776 albold = alboldxy(i,j)
777 qsnow = qsnowxy (i,j)
778 wslake = wslakexy(i,j)
783 zsnso(isnow+1:nsoil) = zsnsoxy (i,isnow+1:nsoil,j)
784 snice(isnow+1: 0) = snicexy (i,isnow+1: 0,j)
785 snliq(isnow+1: 0) = snliqxy (i,isnow+1: 0,j)
787 lfmass = lfmassxy(i,j)
788 rtmass = rtmassxy(i,j)
789 stmass = stmassxy(i,j)
791 stblcp = stblcpxy(i,j)
792 fastcp = fastcpxy(i,j)
796 ficeold(isnow+1:0) = snicexy(i,isnow+1:0,j) &
797 /(snicexy(i,isnow+1:0,j)+snliqxy(i,isnow+1:0,j))
799 ! glacial, seaice split - jref
801 IF ( XICE(I,J) >= XICE_THRESHOLD ) THEN
803 SH2O (i,1:nsoil,j) = 1.0
806 cycle ! Skip any processing at sea-ice points
808 ELSE IF ( VEGTYP == ISICE ) THEN
811 swe = swe*0.001 !jref mm -> m
812 if ( (swe.ne.0..AND.snowd.eq.0.).or.(snowd.le.swe) )THEN
816 CALL SFLX_GLACIAL(I,J,ISICE,FFROZP,DT,ZLVL,NSOIL,SLDPTH, & !C
817 & LWDN,SOLNET,SFCPRS,PRCP,SFCTMP,Q2K, & !F
818 & TH2,Q2SAT,DQSDT2, & !I
819 & ALBBRD, SNOALB1,TBOT, Z0BRD, Z0K, EMISSI, EMBRD, & !S
820 & tstar,STC(1:NSOIL),snowd,swe,salb,chstar, & !H
821 & ETA,fsh, ETA_KINEMATIC,FDOWN, & !O
824 & FLX1,FLX2,FLX3, & !O
825 & SNOMLT,SNCOVR, & !O
831 tgb = sfctmp ! Bare ground temperature will be the surface temperature over glacial points.
832 tgv = 0.0 ! Temperature under vegetation undefined over glacial points.
834 plai = 0.01 ! Should make this zero?
836 smh2o = 1.00 ! Something else?
841 soilm = 1.0 ! Something else?
842 ! SMAV = 1.00 ! Something else?
845 QFX(I,J) = eta_kinematic
846 POTEVP(I,J)=POTEVP(I,J)+ETP*FDTW
848 CHS2(I,J) = CQS2(I,J)
849 IF ( Q1 .GT. QSFC(I,J) ) THEN
860 if ( I == 15 .and. J == 5 ) then
861 ! Intent (IN) or Intent (INOUT), but not Intent (OUT)
862 write(*,'("Before call to NOAHMP_SFLX, at point ", I8, I8)') i, j
863 write(*,'(10x, "ICE = ", I10 )') ICE
864 write(*,'(10x, "IST = ", I10 )') IST
865 write(*,'(10x, "VEGTYP = ", I10 )') VEGTYP
866 write(*,'(10x, "ISC = ", I10 )') ISC
867 write(*,'(10x, "NSOIL = ", I10 )') NSOIL
868 write(*,'(10x, "ZSOIL = ", 7F20.10)') ZSOIL
869 write(*,'(10x, "DT = ", F20.10)') DT
870 write(*,'(10x, "QV1D = ", F20.10)') QV1D
871 write(*,'(10x, "SFCTMP = ", F20.10)') SFCTMP
872 write(*,'(10x, "UU = ", F20.10)') UU
873 write(*,'(10x, "VV = ", F20.10)') VV
874 write(*,'(10x, "SOLDN = ", F20.10)') SOLDN
875 write(*,'(10x, "LWDN = ", F20.10)') LWDN
876 write(*,'(10x, "PRCP = ", F20.10)') PRCP
877 write(*,'(10x, "ZLVL = ", F20.10)') ZLVL
878 write(*,'(10x, "CO2AIR = ", F20.10)') CO2AIR
879 write(*,'(10x, "O2AIR = ", F20.10)') O2AIR
880 write(*,'(10x, "COSZ = ", F20.10)') COSZ
881 write(*,'(10x, "TBOT = ", F20.10)') TBOT
882 write(*,'(10x, "FOLN = ", F20.10)') FOLN
883 write(*,'(10x, "SFCPRS = ", F20.10)') SFCPRS
884 write(*,'(10x, "SHDFAC = ", F20.10)') SHDFAC
885 write(*,'(10x, "LAT = ", F20.10)') LAT
886 write(*,'(10x, "DZ8W1D = ", F20.10)') DZ8W1D
887 write(*,'(10x, "EAH = ", F20.10)') EAH
888 write(*,'(10x, "TAH = ", F20.10)') TAH
889 write(*,'(10x, "FWET = ", F20.10)') FWET
890 write(*,'(10x, "FICEOLD = ", 7F20.10)') FICEOLD
891 write(*,'(10x, "QSNOW = ", F20.10)') QSNOW
892 write(*,'(10x, "SNEQVO = ", F20.10)') SNEQVO
893 write(*,'(10x, "ISNOW = ", F20.10)') ISNOW
894 write(*,'(10x, "ZSNSO = ", 7F20.10)') ZSNSO
895 write(*,'(10x, "CANLIQ = ", F20.10)') CANLIQ
896 write(*,'(10x, "CANICE = ", F20.10)') CANICE
897 write(*,'(10x, "SNOWD = ", F20.10)') SNOWD
898 write(*,'(10x, "SWE = ", F20.10)') SWE
899 write(*,'(10x, "SNICE = ", 7F20.10)') SNICE
900 write(*,'(10x, "SNLIQ = ", 7F20.10)') SNLIQ
901 write(*,'(10x, "TV = ", F20.10)') TV
902 write(*,'(10x, "TG = ", F20.10)') TG
903 write(*,'(10x, "STC = ", 7F20.10)') STC
904 write(*,'(10x, "SMH2O = ", 7F20.10)') SMH2O
905 write(*,'(10x, "SMC = ", 7F20.10)') SMC
906 write(*,'(10x, "ZWT = ", F20.10)') ZWT
907 write(*,'(10x, "WA = ", F20.10)') WA
908 write(*,'(10x, "WT = ", F20.10)') WT
909 write(*,'(10x, "WSLAKE = ", F20.10)') WSLAKE
910 write(*,'(10x, "LFMASS = ", F20.10)') LFMASS
911 write(*,'(10x, "RTMASS = ", F20.10)') RTMASS
912 write(*,'(10x, "STMASS = ", F20.10)') STMASS
913 write(*,'(10x, "WOOD = ", F20.10)') WOOD
914 write(*,'(10x, "STBLCP = ", F20.10)') STBLCP
915 write(*,'(10x, "FASTCP = ", F20.10)') FASTCP
916 write(*,'(10x, "PLAI = ", F20.10)') PLAI
917 write(*,'(10x, "PSAI = ", F20.10)') PSAI
918 write(*,'(10x, "ALBOLD = ", F20.10)') ALBOLD
919 write(*,'(10x, "CM = ", F20.10)') CM
920 write(*,'(10x, "CH = ", F20.10)') CH
921 write(*,'(10x, "DX = ", F20.10)') DX
922 write(*,'(10x, "ISURBAN = ", I10 )') ISURBAN
923 write(*,'(10x, "IZ0TLND = ", I10 )') IZ0TLND
924 write(*,'(10x, "QC = ", F20.10)') QC
925 write(*,'(10x, "PBLH = ", F20.10)') PBLH
926 write(*,'(10x, "QSFC1D = ", F20.10)') QSFC1D
927 write(*,'(10x, "PSFC = ", F20.10)') PSFC
932 I , J , LAT , YEARLEN , JULIAN , COSZ , & ! IN : Time/Space-related
933 DT , DX , DZ8W1D , NSOIL , ZSOIL , 3 , & ! IN : Model configuration
934 SHDFAC , SHDMAX , VEGTYP , ISURBAN , ICE , IST , & ! IN : Vegetation/Soil characteristics
935 ISC , & ! IN : Vegetation/Soil characteristics
936 IZ0TLND , & ! IN : User options
937 SFCTMP , SFCPRS , PSFC , UU , VV , QV1D , & ! IN : Forcing
938 QC , SOLDN , LWDN , PRCP , TBOT , CO2AIR , & ! IN : Forcing
939 O2AIR , FOLN , FICEOLD , PBLH , & ! IN : Forcing
940 ZLVL , ALBOLD , SNEQVO , & ! IN/OUT :
941 STC , SMH2O , SMC , TAH , EAH , FWET , & ! IN/OUT :
942 CANLIQ , CANICE , TV , TG , QSFC1D , QSNOW , & ! IN/OUT :
943 ISNOW , ZSNSO , SNOWD , SWE , SNICE , SNLIQ , & ! IN/OUT :
944 ZWT , WA , WT , WSLAKE , LFMASS , RTMASS , & ! IN/OUT :
945 STMASS , WOOD , STBLCP , FASTCP , PLAI , PSAI , & ! IN/OUT :
946 CM , CH , CHSTAR , & ! IN/OUT :
947 FSA , FSR , FIRA , FSH , SSOIL , FCEV , & ! OUT :
948 FGEV , FCTR , ECAN , ETRAN , ESOIL , TRAD , & ! OUT :
949 TS , TGB , TGV , T2MV , T2MB , TSTAR , & ! OUT :
950 Q1 , Q2MV , Q2MB , RUNSF , RUNSB , APAR , & ! OUT :
951 PSN , SAV , SAG , FSNO , NEE , GPP , & ! OUT :
952 NPP , FVEG , SALB , QMELT , PONDING , PONDING1, & ! OUT :
953 PONDING2, RSSUN , RSSHA , BGAP , WGAP , GAP , & ! OUT :
954 ERRWAT , CHV , CHB , EMISSI) ! OUT :
957 if ( I == 15 .and. J == 5 ) then
958 ! Intent (OUT) or Intent (INOUT), but not Intent (IN)
959 write(*,'("After call to NOAHMP_SFLX, at point ", I8, I8)') i, j
960 write(*,'(10x, "ZLVL = ", 7F20.10)') ZLVL
961 write(*,'(10x, "EAH = ", F20.10)') EAH
962 write(*,'(10x, "TAH = ", F20.10)') TAH
963 write(*,'(10x, "FWET = ", F20.10)') FWET
964 write(*,'(10x, "QSNOW = ", F20.10)') QSNOW
965 write(*,'(10x, "SNEQVO = ", F20.10)') SNEQVO
966 write(*,'(10x, "ISNOW = ", F20.10)') ISNOW
967 write(*,'(10x, "ZSNSO = ", 7F20.10)') ZSNSO
968 write(*,'(10x, "CANLIQ = ", F20.10)') CANLIQ
969 write(*,'(10x, "CANICE = ", F20.10)') CANICE
970 write(*,'(10x, "SNOWD = ", F20.10)') SNOWD
971 write(*,'(10x, "SWE = ", F20.10)') SWE
972 write(*,'(10x, "SNICE = ", 3F20.10)') SNICE
973 write(*,'(10x, "SNLIQ = ", 3F20.10)') SNLIQ
974 write(*,'(10x, "TV = ", F20.10)') TV
975 write(*,'(10x, "TG = ", F20.10)') TG
976 write(*,'(10x, "STC = ", 7F20.10)') STC
977 write(*,'(10x, "SMH2O = ", 7F20.10)') SMH2O
978 write(*,'(10x, "SMC = ", 7F20.10)') SMC
979 write(*,'(10x, "ZWT = ", F20.10)') ZWT
980 write(*,'(10x, "WA = ", F20.10)') WA
981 write(*,'(10x, "WT = ", F20.10)') WT
982 write(*,'(10x, "WSLAKE = ", F20.10)') WSLAKE
983 write(*,'(10x, "LFMASS = ", F20.10)') LFMASS
984 write(*,'(10x, "RTMASS = ", F20.10)') RTMASS
985 write(*,'(10x, "STMASS = ", F20.10)') STMASS
986 write(*,'(10x, "WOOD = ", F20.10)') WOOD
987 write(*,'(10x, "STBLCP = ", F20.10)') STBLCP
988 write(*,'(10x, "FASTCP = ", F20.10)') FASTCP
989 write(*,'(10x, "PLAI = ", F20.10)') PLAI
990 write(*,'(10x, "PSAI = ", F20.10)') PSAI
991 write(*,'(10x, "ALBOLD = ", F20.10)') ALBOLD
992 write(*,'(10x, "CM = ", F20.10)') CM
993 write(*,'(10x, "CH = ", F20.10)') CH
994 write(*,'(10x, "FSA = ", F20.10)') FSA
995 write(*,'(10x, "FSR = ", F20.10)') FSR
996 write(*,'(10x, "FIRA = ", F20.10)') FIRA
997 write(*,'(10x, "FSH = ", F20.10)') FSH
998 write(*,'(10x, "SSOIL = ", F20.10)') SSOIL
999 write(*,'(10x, "FCEV = ", F20.10)') FCEV
1000 write(*,'(10x, "FGEV = ", F20.10)') FGEV
1001 write(*,'(10x, "FCTR = ", F20.10)') FCTR
1002 write(*,'(10x, "TRAD = ", F20.10)') TRAD
1003 write(*,'(10x, "ECAN = ", F20.10)') ECAN
1004 write(*,'(10x, "ETRAN = ", F20.10)') ETRAN
1005 write(*,'(10x, "ESOIL = ", F20.10)') ESOIL
1006 write(*,'(10x, "RUNSF = ", F20.10)') RUNSF
1007 write(*,'(10x, "RUNSB = ", F20.10)') RUNSB
1008 write(*,'(10x, "APAR = ", F20.10)') APAR
1009 write(*,'(10x, "PSN = ", F20.10)') PSN
1010 write(*,'(10x, "SAV = ", F20.10)') SAV
1011 write(*,'(10x, "SAG = ", F20.10)') SAG
1012 write(*,'(10x, "FSNO = ", F20.10)') FSNO
1013 write(*,'(10x, "NEE = ", F20.10)') NEE
1014 write(*,'(10x, "GPP = ", F20.10)') GPP
1015 write(*,'(10x, "NPP = ", F20.10)') NPP
1016 write(*,'(10x, "TS = ", F20.10)') TS
1017 write(*,'(10x, "FVEG = ", F20.10)') FVEG
1018 write(*,'(10x, "SALB = ", F20.10)') SALB
1019 write(*,'(10x, "ERRWAT = ", F20.10)') ERRWAT
1020 write(*,'(10x, "QMELT = ", F20.10)') QMELT
1021 write(*,'(10x, "PONDING = ", F20.10)') PONDING
1022 write(*,'(10x, "PONDING1 = ", F20.10)') PONDING1
1023 write(*,'(10x, "PONDING2 = ", F20.10)') PONDING2
1024 write(*,'(10x, "QSFC1D = ", F20.10)') QSFC1D
1025 write(*,'(10x, "CHSTAR = ", F20.10)') CHSTAR
1026 write(*,'(10x, "TSTAR = ", F20.10)') TSTAR
1027 write(*,'(10x, "T2MV = ", F20.10)') T2MV
1028 write(*,'(10x, "T2MB = ", F20.10)') T2MB
1029 write(*,'(10x, "RSSUN = ", F20.10)') RSSUN
1030 write(*,'(10x, "RSSHA = ", F20.10)') RSSHA
1031 write(*,'(10x, "BGAP = ", F20.10)') BGAP
1032 write(*,'(10x, "WGAP = ", F20.10)') WGAP
1033 write(*,'(10x, "GAP = ", F20.10)') GAP
1034 write(*,'(10x, "TGV = ", F20.10)') TGV
1035 write(*,'(10x, "TGB = ", F20.10)') TGB
1036 write(*,'(10x, "Q1 = ", F20.10)') Q1
1040 !Q1 = eah * 0.622 / (SFCPRS - 0.378*eah)
1042 chs2 (i,j) = chstar2
1043 cqs2 (i,j) = cqstar2
1044 QFX (I,J) = ecan + esoil + etran
1047 ENDIF ! glacial, seaice split ends
1050 isnowxy (i,j) = isnow
1051 canliqxy (i,j) = canliq
1052 canicexy (i,j) = canice
1055 zsnsoxy (i,isnow+1:nsoil,j) = zsnso (isnow+1:nsoil)
1056 tslb (i, 1:nsoil,j) = stc ( 1:nsoil)
1057 tsnoxy (i,isnow+1: 0,j) = stc (isnow+1: 0)
1058 smois (i, 1:nsoil,j) = smc ( 1:nsoil)
1059 sh2o (i, 1:nsoil,j) = smh2o ( 1:nsoil)
1060 snicexy (i,isnow+1: 0,j) = snice (isnow+1: 0)
1061 snliqxy (i,isnow+1: 0,j) = snliq (isnow+1: 0)
1067 lfmassxy (i,j) = lfmass
1068 rtmassxy (i,j) = rtmass
1069 stmassxy (i,j) = stmass
1071 stblcpxy (i,j) = stblcp
1072 fastcpxy (i,j) = fastcp
1075 emiss (i,j) = emissi
1079 sneqvoxy (i,j) = sneqvo
1080 alboldxy (i,j) = albold
1081 qsnowxy (i,j) = qsnow
1082 wslakexy (i,j) = wslake
1086 rssunxy (i,j) = rssun
1087 rsshaxy (i,j) = rssha
1099 runsfxy (i,j) = runsf
1100 runsbxy (i,j) = runsb
1102 edirxy (i,j) = esoil
1103 etranxy (i,j) = etran
1112 lh (i,j) = fcev + fgev + fctr
1113 grdflx (i,j) = ssoil
1125 chstarxy (i,j) = chstar
1127 tstarxy (i,j) = tstar
1130 CANWAT(I,J) = canliqxy (i,j) + canicexy (i,j)
1131 IF ( SALB > -999 ) THEN
1134 TSK(I,J) = tradxy (i,j)
1135 !KWM TSK(I,J) = tstarxy (i,j)
1136 !niu POTEVP(I,J) = ???
1137 !jref CHS2(I,J) = chxy (i,j)
1139 !IF (Q1.GT.QSFC(I,J)) THEN
1140 ! CQS2(I,J) = CHS(I,J)
1142 QSFC(I,J) = Q1/(1.0-Q1)
1143 !jref: specific humidity to mixing ratio
1144 q2mvxy(i,j) = q2mvxy(i,j)/(1.0-q2mvxy(i,j))
1145 ! IF (VEGTYP == ISURBAN) write(*,*) "IN SFCDRV: q2mb=",q2mb,"q2mbxy(i,j)=",q2mbxy(i,j)
1146 q2mbxy(i,j) = q2mbxy(i,j)/(1.0-q2mbxy(i,j))
1149 !jref:start - THESE SHOULD BE LOOKED AT!!!
1150 SNOTIME(I,J) = SNOTIME1
1152 SMSTOT(I,J)=SOILM*1000.
1153 ! Convert the water unit into mm
1154 SFCRUNOFF(I,J)=SFCRUNOFF(I,J)+runsfxy(i,j)*DT*1000.0
1155 UDRUNOFF(I,J)=UDRUNOFF(I,J)+runsbxy(i,j)*DT*1000.0
1156 !jref SFCRUNOFF(I,J)=SFCRUNOFF(I,J)+RUNOFF1*DT*1000.0
1157 !jref UDRUNOFF(I,J)=UDRUNOFF(I,J)+(RUNOFF2+RUNOFF3)*DT*1000.0
1159 ! snow defined when fraction of frozen precip (FFROZP) > 0.5,
1160 IF(FFROZP.GT.0.5)THEN
1161 ACSNOW(I,J)=ACSNOW(I,J)+PRCP*DT
1163 IF(SNOW(I,J).GT.0.)THEN
1164 !KWM ACSNOM(I,J)=ACSNOM(I,J)+SNOMLT*1000.
1167 ENDIF ! endif of land-sea test
1168 !jref:start make sure exchange coeff and TSK include water points
1169 ! IF((XLAND(I,J)-1.5).GE.0.)THEN ! begining of land/sea if block
1170 ! chstar2xy(i,j) = CHS2(i,j)
1171 ! chstarxy(i,j) = CHS(i,j)
1172 ! tstarxy(i,j) = T1 !TSK(i,j) test with T1
1180 !------------------------------------------------------
1181 END SUBROUTINE noahmplsm
1182 !------------------------------------------------------
1184 SUBROUTINE NOAHMP_INIT ( MMINLU, SNOW , SNOWH , CANWAT , ISLTYP , &
1185 TSLB , SMOIS , SH2O , DZS , FNDSOILW , FNDSNOWH , &
1186 TSK, isnowxy , tvxy ,tgxy ,canicexy , &
1187 canliqxy ,eahxy ,tahxy ,cmxy ,chxy , &
1188 fwetxy ,sneqvoxy ,alboldxy ,qsnowxy ,wslakexy ,zwtxy ,waxy , &
1189 wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy , &
1190 stmassxy ,woodxy ,stblcpxy ,fastcpxy ,xsaixy , &
1192 t2mvxy ,t2mbxy ,chstarxy , &
1194 num_soil_layers, restart, &
1196 ids,ide, jds,jde, kds,kde, &
1197 ims,ime, jms,jme, kms,kme, &
1198 its,ite, jts,jte, kts,kte )
1200 ! Initializing Canopy air temperature to 287 K seems dangerous to me [KWM].
1202 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
1203 & ims,ime, jms,jme, kms,kme, &
1204 & its,ite, jts,jte, kts,kte
1206 INTEGER, INTENT(IN) :: num_soil_layers
1208 LOGICAL, INTENT(IN) :: restart, &
1211 REAL, DIMENSION( num_soil_layers), INTENT(IN) :: DZS ! Thickness of the soil layers [m]
1213 REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , &
1214 & INTENT(INOUT) :: SMOIS, &
1218 REAL, DIMENSION( ims:ime, jms:jme ) , &
1219 & INTENT(INOUT) :: SNOW, &
1223 INTEGER, DIMENSION( ims:ime, jms:jme ), &
1224 & INTENT(IN) :: ISLTYP
1226 LOGICAL, INTENT(IN) :: FNDSOILW, &
1229 REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) :: TSK !skin temperature (k)
1230 INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: isnowxy !actual no. of snow layers
1231 REAL, DIMENSION(ims:ime,-2:num_soil_layers,jms:jme), INTENT(INOUT) :: zsnsoxy !snow layer depth [m]
1232 REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: tsnoxy !snow temperature [K]
1233 REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snicexy !snow layer ice [mm]
1234 REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snliqxy !snow layer liquid water [mm]
1235 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tvxy !vegetation canopy temperature
1236 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tgxy !ground surface temperature
1237 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canicexy !canopy-intercepted ice (mm)
1238 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canliqxy !canopy-intercepted liquid water (mm)
1239 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: eahxy !canopy air vapor pressure (pa)
1240 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tahxy !canopy air temperature (k)
1241 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: cmxy !momentum drag coefficient
1242 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chxy !sensible heat exchange coefficient
1243 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fwetxy !wetted or snowed fraction of the canopy (-)
1244 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: sneqvoxy !snow mass at last time step(mm h2o)
1245 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: alboldxy !snow albedo at last time step (-)
1246 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qsnowxy !snowfall on the ground [mm/s]
1247 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wslakexy !lake water storage [mm]
1248 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: zwtxy !water table depth [m]
1249 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: waxy !water in the "aquifer" [mm]
1250 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wtxy !groundwater storage [mm]
1251 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: lfmassxy !leaf mass [g/m2]
1252 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: rtmassxy !mass of fine roots [g/m2]
1253 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stmassxy !stem mass [g/m2]
1254 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: woodxy !mass of wood (incl. woody roots) [g/m2]
1255 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stblcpxy !stable carbon in deep soil [g/m2]
1256 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fastcpxy !short-lived carbon, shallow soil [g/m2]
1257 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xsaixy !stem area index
1260 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mvxy !2m temperature vegetation part (k)
1261 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mbxy !2m temperature bare ground part (k)
1262 REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chstarxy !effective exchange coefficient
1266 REAL, DIMENSION(1:num_soil_layers) :: ZSOIL ! Depth of the soil layer bottom (m) from
1267 ! the surface (negative)
1269 REAL :: BX, SMCMAX, PSISAT, FREE
1271 REAL, PARAMETER :: BLIM = 5.5
1272 REAL, PARAMETER :: HLICE = 3.335E5
1273 REAL, PARAMETER :: GRAV = 9.81
1274 REAL, PARAMETER :: T0 = 273.15
1278 character(len=80) :: err_message
1279 character(len=4) :: MMINSL
1280 character(len=*), intent(in) :: MMINLU
1283 call read_mp_veg_parameters(trim(MMINLU))
1286 ! initialize three Noah LSM related tables
1288 IF ( allowed_to_read ) THEN
1289 CALL wrf_message( 'INITIALIZE THREE Noah LSM RELATED TABLES' )
1290 CALL SOIL_VEG_GEN_PARM( MMINLU, MMINSL )
1293 IF( .NOT. restart ) THEN
1301 IF ( ISLTYP( i,j ) .LT. 1 ) THEN
1303 WRITE(err_message,*)"module_sf_noahlsm.F: lsminit: out of range ISLTYP ",i,j,ISLTYP( i,j )
1304 CALL wrf_message(err_message)
1308 IF ( errflag .EQ. 1 ) THEN
1309 CALL wrf_error_fatal( "module_sf_noahlsm.F: lsminit: out of range value "// &
1310 "of ISLTYP. Is this field in the input?" )
1314 ! need this parameter for dust parameterization in wrf/chem
1317 porosity(i)=maxsmc(i)
1321 ! initialize soil liquid water content SH2O
1323 ! IF(.NOT.FNDSOILW) THEN
1325 ! If no SWC, do the following
1326 ! PRINT *,'SOIL WATER NOT FOUND - VALUE SET IN LSMINIT'
1329 BX = BB(ISLTYP(I,J))
1330 SMCMAX = MAXSMC(ISLTYP(I,J))
1331 PSISAT = SATPSI(ISLTYP(I,J))
1332 IF ( ( bx > 0.0 ) .AND. ( smcmax > 0.0 ) .AND. ( psisat > 0.0 ) ) THEN
1333 DO NS=1, num_soil_layers
1335 IF ( TSLB(I,NS,J) < 273.149 ) THEN
1336 ! SH2O <= SMOIS for T < 273.149K (-0.001C)
1338 ! First guess of SH2O following explicit solution for
1339 ! Flerchinger Eqn from Koren et al, JGR, 1999, Eqn 17
1340 ! (KCOUNT=0 in function FRH2O).
1341 BX = BB(ISLTYP(I,J))
1342 SMCMAX = MAXSMC(ISLTYP(I,J))
1343 PSISAT = SATPSI(ISLTYP(I,J))
1344 IF ( BX > BLIM ) BX = BLIM
1345 FK=(( (HLICE/(GRAV*(-PSISAT))) * &
1346 ((TSLB(I,NS,J)-T0)/TSLB(I,NS,J)) )**(-1/BX) )*SMCMAX
1348 SH2O(I,NS,J) = MIN( FK, SMOIS(I,NS,J) )
1350 ! Use iterative solution for liquid soil water content
1351 ! using function FRH2O, with the initial guess for SH2O
1352 ! from the above explicit first guess.
1353 CALL FRH2O ( FREE , TSLB(I,NS,J) , SMOIS(I,NS,J) , SH2O(I,NS,J) )
1356 ! SH2O = SMOIS ( for T => 273.149K (-0.001C)
1357 SH2O(I,NS,J)=SMOIS(I,NS,J)
1361 DO NS=1, num_soil_layers
1362 SH2O(I,NS,J)=SMOIS(I,NS,J)
1371 ! initialize physical snow height SNOWH
1373 IF(.NOT.FNDSNOWH)THEN
1374 ! If no SNOWH do the following
1375 CALL wrf_message( 'SNOW HEIGHT NOT FOUND - VALUE DEFINED IN LSMINIT' )
1378 SNOWH(I,J)=SNOW(I,J)*0.005 ! SNOW in mm and SNOWH in m
1385 tvxy (I,J) = TSK(I,J)
1386 tgxy (I,J) = TSK(I,J)
1388 canliqxy (I,J) = CANWAT(I,J)
1393 t2mvxy (I,J) = TSK(I,J)
1394 t2mbxy (I,J) = TSK(I,J)
1395 chstarxy (I,J) = 0.0
1401 sneqvoxy (I,J) = 0.0
1402 alboldxy (I,J) = 0.65
1404 wslakexy (I,J) = 0.0
1406 waxy (I,J) = 4900. !???
1407 wtxy (I,J) = waxy(i,j) !???
1408 zwtxy (I,J) = (25. + 2.0) - waxy(i,j)/1000/0.2 !???
1410 lfmassxy (I,J) = 50. !
1411 stmassxy (I,J) = 50.0 !
1412 rtmassxy (I,J) = 500.0 !
1413 woodxy (I,J) = 500.0 !
1414 stblcpxy (I,J) = 1000.0 !
1415 fastcpxy (I,J) = 1000.0 !
1416 xsaixy (I,J) = 0.1 !
1421 ! Given the soil layer thicknesses (in DZS), initialize the soil layer
1422 ! depths from the surface.
1423 ZSOIL(1) = -DZS(1) ! negative
1424 DO NS=2, num_soil_layers
1425 ZSOIL(NS) = ZSOIL(NS-1) - DZS(NS)
1428 ! Initialize snow/soil layer arrays ZSNSOXY, TSNOXY, SNICEXY, SNLIQXY,
1430 CALL snow_init ( ims , ime , jms , jme , its , itf , jts , jtf , 3 , &
1431 & num_soil_layers , zsoil , snow , tgxy , snowh , &
1432 & zsnsoxy , tsnoxy , snicexy , snliqxy , isnowxy )
1435 END SUBROUTINE NOAHMP_INIT
1437 !------------------------------------------------------------------------------------------
1438 !------------------------------------------------------------------------------------------
1440 SUBROUTINE SNOW_INIT ( ims , ime , jms , jme , its , itf , jts , jtf , &
1441 & NSNOW , NSOIL , ZSOIL , SWE , TGXY , SNODEP , &
1442 & ZSNSOXY , TSNOXY , SNICEXY ,SNLIQXY , ISNOWXY )
1443 !------------------------------------------------------------------------------------------
1444 ! Initialize snow arrays for Noah-MP LSM, based in input SNOWDEP, NSNOW
1445 ! ISNOWXY is an index array, indicating the index of the top snow layer. Valid indices
1446 ! for snow layers range from 0 (no snow) and -1 (shallow snow) to (-NSNOW)+1 (deep snow).
1447 ! TSNOXY holds the temperature of the snow layer. Snow layers are initialized with
1448 ! temperature = ground temperature [?]. Snow-free levels in the array have value 0.0
1449 ! SNICEXY is the frozen content of a snow layer. Initial estimate based on SNODEP and SWE
1450 ! SNLIQXY is the liquid content of a snow layer. Initialized to 0.0
1451 ! ZNSNOXY is the layer depth from the surface.
1452 !------------------------------------------------------------------------------------------
1454 !------------------------------------------------------------------------------------------
1455 INTEGER, INTENT(IN) :: ims, ime, jms, jme
1456 INTEGER, INTENT(IN) :: its, itf, jts, jtf
1457 INTEGER, INTENT(IN) :: NSNOW
1458 INTEGER, INTENT(IN) :: NSOIL
1459 REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SWE
1460 REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SNODEP
1461 REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: TGXY
1462 REAL, INTENT(IN), DIMENSION(1:NSOIL) :: ZSOIL
1464 INTEGER, INTENT(OUT), DIMENSION(ims:ime, jms:jme) :: ISNOWXY ! Top snow layer index
1465 REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1:NSOIL,jms:jme) :: ZSNSOXY ! Snow/soil layer depth from surface [m]
1466 REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: TSNOXY ! Snow layer temperature [K]
1467 REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNICEXY ! Snow layer ice content [mm]
1468 REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNLIQXY ! snow layer liquid content [mm]
1471 ! DZSNO holds the thicknesses of the various snow layers.
1472 ! DZSNOSO holds the thicknesses of the various soil/snow layers.
1474 REAL, DIMENSION(-NSNOW+1: 0) :: DZSNO
1475 REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZSNSO
1477 !------------------------------------------------------------------------------------------
1481 IF ( SNODEP(I,J) < 0.025 ) THEN
1483 DZSNO(-NSNOW+1:0) = 0.
1485 IF ( ( SNODEP(I,J) >= 0.025 ) .AND. ( SNODEP(I,J) <= 0.05 ) ) THEN
1487 DZSNO(0) = SNODEP(I,J)
1488 ELSE IF ( ( SNODEP(I,J) > 0.05 ) .AND. ( SNODEP(I,J) <= 0.10 ) ) THEN
1490 DZSNO(-1) = SNODEP(I,J)/2.
1491 DZSNO( 0) = SNODEP(I,J)/2.
1492 ELSE IF ( (SNODEP(I,J) > 0.10 ) .AND. ( SNODEP(I,J) <= 0.25 ) ) THEN
1495 DZSNO( 0) = SNODEP(I,J) - DZSNO(-1)
1496 ELSE IF ( ( SNODEP(I,J) > 0.25 ) .AND. ( SNODEP(I,J) <= 0.35 ) ) THEN
1499 DZSNO(-1) = 0.5*(SNODEP(I,J)-DZSNO(-2))
1500 DZSNO( 0) = 0.5*(SNODEP(I,J)-DZSNO(-2))
1501 ELSE IF ( SNODEP(I,J) > 0.35 ) THEN
1505 DZSNO( 0) = SNODEP(I,J) - DZSNO(-1) - DZSNO(-2)
1507 CALL wrf_error_fatal("Problem with the logic assigning snow layers.")
1511 TSNOXY (I,-NSNOW+1:0,J) = 0.
1512 SNICEXY(I,-NSNOW+1:0,J) = 0.
1513 SNLIQXY(I,-NSNOW+1:0,J) = 0.
1514 DO IZ = ISNOWXY(I,J)+1 , 0
1515 TSNOXY(I,IZ,J) = TGXY(I,J) ! [k]
1516 SNLIQXY(I,IZ,J) = 0.00
1517 SNICEXY(I,IZ,J) = 1.00 * DZSNO(IZ) * (SWE(I,J)/SNODEP(I,J)) ! [kg/m3]
1520 ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for snow layers
1521 DO IZ = ISNOWXY(I,J)+1 , 0
1522 DZSNSO(IZ) = -DZSNO(IZ)
1525 ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for soil layers
1526 DZSNSO(1) = ZSOIL(1)
1528 DZSNSO(IZ) = (ZSOIL(IZ) - ZSOIL(IZ-1))
1531 ! Assign ZSNSOXY, the layer depths, for soil and snow layers
1532 ZSNSOXY(I,ISNOWXY(I,J)+1,J) = DZSNSO(ISNOWXY(I,J)+1)
1533 DO IZ = ISNOWXY(I,J)+2 , NSOIL
1534 ZSNSOXY(I,IZ,J) = ZSNSOXY(I,IZ-1,J) + DZSNSO(IZ)
1540 END SUBROUTINE SNOW_INIT
1542 !------------------------------------------------------------------------------------------
1543 !------------------------------------------------------------------------------------------
1545 END MODULE module_sf_noahmpdrv