source: trunk/WRF.COMMON/WRFV3/phys/module_sf_pxlsm.F @ 3094

Last change on this file since 3094 was 2759, checked in by aslmd, 2 years ago

adding unmodified code from WRFV3.0.1.1, expurged from useless data +1M size

  • Property svn:executable set to *
File size: 75.5 KB
Line 
1MODULE module_sf_pxlsm
2 
3  USE module_model_constants
4  USE module_wrf_error
5
6  INTEGER, PARAMETER   :: NSOLD=20
7  REAL, PARAMETER      :: RD     = 287.04,   CPD   = 1004.67,             &
8                          CPH2O  = 4.218E+3, CPICE = 2.106E+3,            &
9                          LSUBF  = 3.335E+5, SIGMA = 5.67E-8,             & 
10                          ROVCP  = RD / CPD
11                         
12  REAL, PARAMETER      :: CRANKP = 0.5                    ! CRANK-NIC PARAMETER
13  REAL, PARAMETER      :: RIC    = 0.25                   ! critical Richardson number
14  REAL, PARAMETER      :: DENW   = 1000.0                 ! water density in KG/M3                 
15  REAL, PARAMETER      :: TAUINV = 1.0 / 86400.0          ! 1/1DAY(SEC)
16  REAL, PARAMETER      :: T2TFAC = 1.0 / 10.0             ! Bottom soil temp response factor
17  REAL, PARAMETER      :: PI = 3.1415926
18  REAL, PARAMETER      :: PR0 = 0.95
19  REAL, PARAMETER      :: CZO    = 0.032
20  REAL, PARAMETER      :: OZO    = 1.E-4
21
22CONTAINS
23!
24
25!-------------------------------------------------------------------------
26   SUBROUTINE pxlsm(U3D, V3D, DZ8W, QV3D,T3D,TH3D, RHO,         &
27                    PSFC, GSW, GLW, RAINBL, EMISS,              &
28                    ITIMESTEP, NSOIL, DT, ANAL_INTERVAL,        &           
29                    XLAND, ALBBCK, ALBEDO, SNOALB,              &
30                    SMOIS, TSLB, MAVAIL, TA2, QA2,              &
31                    ZS,DZS, PSIH,                               &
32                    LANDUSEF,SOILCTOP,SOILCBOT,VEGFRA,VEGF_PX,  &
33                    ISLTYP,RA,RS,LAI,NLCAT,NSCAT,               &
34                    HFX,QFX,LH,TSK,ZNT,CANWAT,                  &
35                    GRDFLX,SHDMIN,SHDMAX,                       &
36                    SNOWC,PBLH,RMOL,UST,CAPG,DTBL,              &
37                    T2_NDG_OLD, T2_NDG_NEW,                     &     
38                    Q2_NDG_OLD, Q2_NDG_NEW,                     &
39                    SN_NDG_OLD, SN_NDG_NEW, SNOW, SNOWH,SNOWNCV,&
40                    T2OBS, Q2OBS, PXLSM_SMOIS_INIT,             &           
41                    PXLSM_SOIL_NUDGE,                           &
42                    ids,ide, jds,jde, kds,kde,                  &
43                    ims,ime, jms,jme, kms,kme,                  &
44                    its,ite, jts,jte, kts,kte                    )
45
46!*************************************************************************
47!   THIS MODULE CONTAINS THE PLEIM-XIU LAND-SURFACE MODEL (PX-LSM).
48!   IT IS DESIGNED TO SIMULATE CHARACTERISTICS OF THE LAND SURFACE AND
49!   VEGETATION AND EXCHANGE WITH THE PLANETARY BOUNDARY LAYER (PBL). THE
50!   SOIL MOISTURE MODEL IS BASED ON THE ISBA SCHEME DEVELOPED BY NOILHAN
51!   AND PLANTON (1989) AND JACQUEMIN AND NOILHAN (1990) AND INCLUDES
52!   PROGNOSTIC EQUATIONS FOR SOIL MOISTURE AND SOIL TEMPERATURE IN TWO
53!   LAYERS (1 CM AND 1 M) AS WELL AS CANOPY WATER CONTENT.  SURFACE
54!   MOISTURE FLUXES ARE MODELED BY 3 PATHWAYS: SOIL EVAPORATION, CANOPY
55!   EVAPORATION, AND VEGETATIVE EVAPOTRANSPIRRATION.
56!   EVAPOTRANSPIRATION DIRECTLY FROM THE ROOT ZONE SOIL LAYER IS MODELED
57!   VIA A CANOPY RESISTANCE ANALOG ALGORITHM WHERE STOMATAL CONDUCTANCE
58!   IS CONTROLLED BY SOLAR RADIATION, AIR TEMPERATURE, AIR HUMIDITY, AND
59!   ROOT ZONE SOIL MOISTURE. REQUIRED VEGETATION CHARACTERISTICS DERIVED
60!   FROM THE USGS LANDUSE DATA INCLUDE: LEAF AREA INDEX, FRACTIONAL VEGETATION
61!   COVERAGE, ROUGHNESS LENGTH, AND MINIMUM STOMATAL RESISTANCE. AN INDIRECT
62!   NUDGING SCHEME ADJUSTS SOIL MOISTURE ACCORDING TO DIFFERENCES BETWEEN
63!   MODELED TEMPERATURE AND HUMIDITY AND ANALYSED SURFACE FIELDS.
64!
65! References:
66! Pleim and Xiu, 1995: Development and testing of a surface flux and planetary
67!                      boundary layer model for application in mesoscale models.
68!                      J. Appl. Meteoro., Vol. 34, 16-32.
69! Xiu and Pleim, 2001: Development of a land surface model. Part I: Application
70!                      in a mesoscale meteorological model. J. Appl. Meteoro.,
71!                      Vol. 40, 192-209.
72! Pleim and Xiu, 2003: Development of a land surface model. Part II: Data
73!                      assimilation. J. Appl. Meteoro., Vol. 42, 1811-1822.
74!
75! REVISION HISTORY:
76!     AX     4/2005 - developed WRF version based on the MM5 PX LSM
77!************************************************************************
78!   ARGUMENT LIST:
79!
80!... Inputs:
81!-- U3D             3D u-velocity interpolated to theta points (m/s)
82!-- V3D             3D v-velocity interpolated to theta points (m/s)
83!-- DZ8W            dz between full levels (m)
84!-- QV3D            3D mixing ratio
85!-- T3D             Temperature (K)
86!-- TH3D            Theta (K)
87!-- RHO             3D dry air density (kg/m^3)
88
89!-- PSFC                surface pressure (Pa)
90!-- GSW                 downward short wave flux at ground surface (W/m^2)     
91!-- GLW                 downward long wave flux at ground surface (W/m^2)
92!-- RAINBL              Timestep rainfall
93!-- EMISS               surface emissivity (between 0 and 1)
94
95!-- ITIMESTEP           time step number
96!-- NSOIL               number of soil layers
97!-- DT                  time step (second)
98!-- ANAL_INTERVAL       Interval of analyses used for soil moisture and temperature nudging
99
100!-- XLAND               land mask (1 for land, 2 for water)
101!-- ALBBCK              Background Albedo
102!-- ALBEDO              surface albedo with snow cover effects
103!-- SNOALB              Albedo of snow
104
105!-- SMOIS               total soil moisture content (volumetric fraction)
106!-- TSLB                soil temp (k)
107!-- MAVAIL              Moisture availibility of soil
108!-- TA2                 2-m temperature
109!-- QA2                 2-m mixing ratio
110
111!-- SVPT0       constant for saturation vapor pressure (K)
112!-- SVP1        constant for saturation vapor pressure (kPa)
113!-- SVP2        constant for saturation vapor pressure (dimensionless)
114!-- SVP3        constant for saturation vapor pressure (K)
115
116!-- ZS          depths of centers of soil layers
117!-- DZS         thicknesses of soil layers
118!-- PSIH        similarity stability function for heat
119
120!-- LANDUSEF     Landuse fraction               
121!-- SOILCTOP     Top soil fraction             
122!-- SOILCBOT     Bottom soil fraction           
123!-- VEGFRA       Vegetation fraction                   
124!-- VEGF_PX      Veg fraction recomputed and used by PX LSM
125!-- ISLTYP       Soil type
126
127!-- RA           Aerodynamic resistence                 
128!-- RS           Stomatal resistence                   
129!-- LAI          Leaf area index (weighted according to fractional landuse)
130!-- NLCAT        Number of landuse categories           
131!-- NSCAT        Number of soil categories             
132
133!-- HFX           net upward heat flux at the surface (W/m^2)
134!-- QFX           net upward moisture flux at the surface (kg/m^2/s)
135!-- LH            net upward latent heat flux at surface (W/m^2)
136!-- TSK           surface skin temperature (K)
137!-- ZNT           rougness length
138!-- CANWAT        Canopy water (mm)
139
140!-- GRDFLX        Ground heat flux
141!-- SFCEVP      Evaportation from surface
142!-- SHDMIN       Minimum annual vegetation fraction for each grid cell
143!-- SHDMAX       Maximum annual vegetation fraction for each grid cell
144
145!-- SNOWC         flag indicating snow coverage (1 for snow cover)
146!-- PBLH          PBL height (m)
147!-- RMOL          1/L Reciprocal of Monin-Obukhov length
148!-- UST           u* in similarity theory (m/s)
149!-- CAPG          heat capacity for soil (J/K/m^3)
150!-- DTBL          time step of boundary layer calls
151
152!-- T2_NDG_OLD    Analysis temperature prior to current time
153!-- T2_NDG_NEW    Analysis temperature ahead of current time
154!-- Q2_NDG_OLD    Analysis mixing ratio prior to current time
155!-- Q2_NDG_NEW    Analysis mixing ratio ahead of current time
156
157!-- SN_NDG_OLD    Analysis snow water prior to current time
158!-- SN_NDG_NEW    Analysis snow water ahead of current time
159!-- SNOW          Snow water equivalent
160!-- SNOWH         Physical snow depth
161!-- SNOWNCV       Time step accumulated snow
162
163!-- T2OBS         Analysis temperature interpolated from prior and next in time analysese
164!-- Q2OBS         Analysis moisture interpolated from prior and next in time analysese
165!-- PXLSM_SMOIS_INIT  Flag to intialize deep soil moisture to a value derived from moisture availiability.
166!-- PXLSM_SOIL_NUDGE  Flag to use soil moisture and temperature nudging in the PX LSM
167!                     This is typically done for the first simulation.
168
169!-- ids             start index for i in domain
170!-- ide             end index for i in domain
171!-- jds             start index for j in domain
172!-- jde             end index for j in domain
173!-- kds             start index for k in domain
174!-- kde             end index for k in domain
175!-- ims             start index for i in memory
176!-- ime             end index for i in memory
177!-- jms             start index for j in memory
178!-- jme             end index for j in memory
179!-- kms             start index for k in memory
180!-- kme             end index for k in memory
181!-- jts             start index for j in tile
182!-- jte             end index for j in tile
183!-- kts             start index for k in tile
184!-- kte             end index for k in tile
185!... Outputs:
186
187     IMPLICIT NONE
188
189!.......Arguments
190! DECLARATIONS - INTEGER
191    INTEGER,  INTENT(IN)   ::      ids,ide, jds,jde, kds,kde, &
192                                   ims,ime, jms,jme, kms,kme, &
193                                   its,ite, jts,jte, kts,kte
194
195   INTEGER,   INTENT(IN)  ::      NSOIL, ITIMESTEP, NLCAT, NSCAT,             &
196                                  ANAL_INTERVAL, PXLSM_SMOIS_INIT, PXLSM_SOIL_NUDGE
197
198   REAL,     INTENT(IN )  ::      DT,DTBL
199
200   INTEGER,   DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) ::   ISLTYP
201
202! DECLARATIONS - REAL
203    REAL,    DIMENSION( ims:ime, kms:kme, jms:jme ),  INTENT(IN) :: U3D, V3D, RHO, &
204                                                                    T3D, TH3D, DZ8W, QV3D           
205
206   REAL,     DIMENSION(1:NSOIL), INTENT(IN)::ZS,DZS
207   REAL,     DIMENSION( ims:ime , 1:NSOIL, jms:jme ),  INTENT(INOUT)   ::  SMOIS, TSLB     
208
209   REAL,     DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: RA, RS, LAI, ZNT
210   REAL,     DIMENSION( ims:ime , jms:jme ), INTENT(OUT):: GRDFLX, TSK, TA2, QA2
211
212   REAL,     DIMENSION( ims:ime , 1:NLCAT, jms:jme ), INTENT(IN):: LANDUSEF       
213   REAL,     DIMENSION( ims:ime , 1:NSCAT, jms:jme ), INTENT(IN):: SOILCTOP, SOILCBOT
214
215
216   REAL,    DIMENSION( ims:ime, jms:jme ),                                     &
217            INTENT(IN) ::                            PSFC, GSW, GLW, RAINBL,   &               
218                                                     EMISS, XLAND, SNOALB,     &
219                                                     ALBBCK, SHDMIN, SHDMAX,   &
220                                                     PBLH, RMOL, SNOWNCV,      &
221                                                     UST, MAVAIL
222   REAL,    DIMENSION( ims:ime, jms:jme ),                                     &
223            INTENT(IN) ::                            T2_NDG_OLD, T2_NDG_NEW,   &               
224                                                     Q2_NDG_OLD, Q2_NDG_NEW,   &
225                                                     SN_NDG_OLD, SN_NDG_NEW   
226
227   REAL,    DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: T2OBS, Q2OBS               
228                                                     
229   REAL,    DIMENSION( ims:ime, jms:jme ),                                     &
230            INTENT(INOUT) ::           CAPG,CANWAT, QFX, HFX, LH,              &
231                                       PSIH,VEGFRA, VEGF_PX, SNOW,             &
232                                       SNOWH, SNOWC, ALBEDO
233
234
235   LOGICAL :: radiation
236
237!    <<<<  Local Variables >>>>
238       REAL:: G1000, ALN10
239       INTEGER:: J, I, NS, NUDGE, ISTI, WEIGHT
240!... Parameters
241      INTEGER, PARAMETER             :: NSTPS = 11     ! max. soil types
242
243!... Integer
244      INTEGER, DIMENSION( 1: NSTPS ) :: JP
245
246!... Real
247
248      REAL,     DIMENSION( ims:ime, jms:jme ) :: XLAI, XLAIMN, RSTMIN, XVEG, XVEGMN, XSNUP
249                                                 
250      REAL,     DIMENSION( ims:ime, jms:jme ) :: RADNET, EG, ER, ETR, QST
251
252      REAL:: SFCPRS,TA1,DENS1,QV1,ZLVL,SOLDN,LWDN,    &
253            EMISSI,PRECIP,THETA1,VAPPRS,QSBT,         &
254            WG,W2,WR,TG,T2,USTAR,MOLX,Z0,             &
255            RAIR,CPAIR,IFLAND,ISNOW,                  &
256            ES,QSS,BETAP,                             &
257            RH2_OLD, RH2_NEW, T2_OLD, T2_NEW,         &
258            CORE, CORB, TIME_BETWEEN_ANALYSIS
259      REAL:: FWSAT,FWFC,FWWLT,FB,FCGSAT,FJP,FAS,FC2R,FC1SAT
260      REAL:: RH2OBS, HU, SNOBS
261      REAL:: FSEAS, T2I, HC_SNOW, SNOW_FRA, SNOWALB
262      REAL:: QST12,ZFUNC,ZF1,ZA2,QV2, DT_FDDA, CURTIME
263
264      REAL, PARAMETER :: DTPBLX = 40.0  !   Max PX timestep = 40 sec
265      REAL:: DTPBL
266      INTEGER:: NTSPS, IT
267
268!
269!-------------------------------Executable starts here--------------------
270!
271      ALN10  = ALOG(10.0)
272      G1000  = g*1.0E-3            ! G/1000
273      WEIGHT = 0
274      DT_FDDA = ANAL_INTERVAL * 1.0    ! Convert DT of Analysis to real
275      !IF (ITIMESTEP .EQ. 1) THEN
276      ! Calculate several soil and vegetation parameters, e.g., LAI,
277         CALL VEGELAND(LANDUSEF, VEGFRA, SHDMIN, SHDMAX,                &
278                       SOILCTOP, SOILCBOT, NLCAT, NSCAT,                &
279                       ZNT,XLAI,XLAIMN,RSTMIN,XVEG,XVEGMN,XSNUP,        &
280                       ids,ide, jds,jde, kds,kde,                       &
281                       ims,ime, jms,jme, kms,kme,                       &
282                       its,ite, jts,jte, kts,kte)
283      !ENDIF
284      !-----------------------------------------------------------------------------------
285      !--- Compute time relatve to old and new analysis time for timestep interpolation
286      CURTIME = (ITIMESTEP-1) * DT
287      TIME_BETWEEN_ANALYSIS = AMOD(CURTIME,DT_FDDA)
288      IF (TIME_BETWEEN_ANALYSIS .EQ. 0.0) THEN   
289          CORB = 1.0       
290          CORE = 0.0   
291      ELSE   
292          CORE = TIME_BETWEEN_ANALYSIS  / DT_FDDA     
293          CORB = 1.0 - CORE 
294      ENDIF
295      !-----------------------------------------------------------------------------------
296
297
298      DO J = jts,jte    !-- MAIN J LOOP
299
300       DO I = its,ite  !-- MAIN I LOOP
301         
302          IFLAND = XLAND(I,J)
303
304          ! Compute soil properties via weighting of fractional components
305          IF (IFLAND .LT. 1.5 ) THEN
306            CALL SOILPROP (SOILCBOT(I,:,J), WEIGHT,               &
307                         ITIMESTEP, MAVAIL(I,J),                  &
308                         PXLSM_SMOIS_INIT,                        &
309                         FWSAT,FWFC,FWWLT,FB,FCGSAT,              & 
310                         FJP,FAS,FC2R,FC1SAT,ISTI,SMOIS(I,2,J)    )
311            ISLTYP(I,J) = ISTI                     
312          ENDIF
313
314          !--  Variables Sub. SURFPX needs
315          SFCPRS = PSFC(i,j) / 1000.0                 ! surface pressure in cb
316          TA1    = T3D(i,1,j)                         ! air temperature at first layer
317          DENS1  = RHO(I,1,J)                         ! air density at first layer
318          QV1    = QV3D(i,1,j)                        ! water vapor mixing ratio at first layer
319          QV2    = QV3D(i,2,j)
320          ZLVL   = 0.5 * DZ8W(i,1,j)                  ! thickness of lowest half level
321          ZF1    = DZ8W(i,1,j)
322          ZA2    = ZF1 + 0.5 * DZ8W(i,2,j)
323
324          LWDN   = GLW(I,J)                           ! longwave radiation
325          EMISSI = EMISS(I,J)                         ! emissivity
326          PRECIP = MAX ( 1.0E-3*RAINBL(i,j)/DTBL,0.0) ! accumulated precip. rate during DT (=dtpbl)
327                                                      ! convert RAINBL from mm to m for PXLSM
328          WR     = 1.0E-3*CANWAT(I,J)                 ! convert CANWAT from mm to m for PXLSM
329          THETA1 = TH3D(i,1,j)                        ! potential temp at first layer
330                   
331          IF(PXLSM_SOIL_NUDGE .EQ. 1) THEN                   
332            !-- 2 m Temp and RH for Nudging
333            T2_OLD = T2_NDG_OLD(I,J)
334            T2_NEW     = T2_NDG_NEW(I,J)
335            VAPPRS     = SVP1 * EXP(SVP2 * (T2_OLD - SVPT0) / ( T2_OLD - SVP3))
336            QSBT       = EP_2 * VAPPRS / (SFCPRS - VAPPRS)         
337            RH2_OLD    = Q2_NDG_OLD(I,J) / QSBT
338            VAPPRS     = SVP1 * EXP(SVP2 * (T2_NEW - SVPT0) / (T2_NEW - SVP3))
339            QSBT       = EP_2 * VAPPRS / (SFCPRS - VAPPRS)         
340            RH2_NEW    = Q2_NDG_NEW(I,J) / QSBT
341            RH2OBS     = CORB * RH2_OLD +  CORE * RH2_NEW 
342            T2OBS(I,J) = CORB * T2_OLD +  CORE * T2_NEW
343            Q2OBS(I,J) = CORB * Q2_NDG_OLD(I,J) +  CORE * Q2_NDG_NEW(I,J)
344            SNOBS = CORB * SN_NDG_OLD(I,J) +  CORE * SN_NDG_NEW(I,J) 
345          ENDIF
346          IF (IFLAND .GT. 1.5) THEN ! if over water                           
347            ZNT(I,J) = CZO * UST(I,J) * UST(I,J) / G + OZO
348          ENDIF                                                             
349          USTAR  = MAX(UST(I,J),0.01)
350          Z0     = ZNT(I,J)
351          CPAIR  = CPD * (1.0 + 0.84 * QV1)            ! J/(K KG)
352
353          !-- Note that when IFGROW = 0 is selected in Vegeland then max and min           
354          !-- LAI and Veg are the same                                                     
355          T2I = TSLB(I,2,J)                                           
356!         FSEAS = AMAX1(1.0 - 0.0016 * (298.0 - T2I) ** 2,0.0)  ! BATS           
357          FSEAS = AMAX1(1.0 - 0.015625 * (290.0 - T2I) ** 2,0.0) ! JP97           
358          IF (T2I .GE. 290.0) FSEAS = 1.0                                         
359         
360          LAI(I,J)       = XLAIMN(I,J) + FSEAS*(XLAI(I,J) - XLAIMN(I,J))                 
361          VEGF_PX(I,J)   = XVEGMN(I,J) + FSEAS*(XVEG(I,J) - XVEGMN(I,J))             
362         
363          !!--- Set LAI and VEGFRC according to deep soil temp   
364
365          IF (IFLAND .GT. 1.5) THEN ! if over water                           
366             VEGF_PX(I,J) = 0. !MAKE Sure veg algorithms not used for water         
367          ENDIF                                                                   
368         
369          ! Compute fractional snow area and snow albedo
370          CALL PXSNOW (ITIMESTEP, SNOBS, SNOWNCV(I,J), SNOW(I,J),  &
371                       SNOWH(I,J), XSNUP(I,J),  ALBBCK(i,j),       &
372                       SNOALB(I,J),VEGF_PX(I,J), SHDMIN(I,J),      &
373                       HC_SNOW, SNOW_FRA, SNOWC(I,J),  ALBEDO(I,J) )
374
375          SOLDN  = GSW(I,J) / (1.0 - ALBEDO(I,J))     ! downward shortwave radiaton
376          ISNOW = SNOWC(I,J)
377
378          NUDGE=PXLSM_SOIL_NUDGE
379          IF ( J .LE. 2 .OR. J .GE. (jme-1) ) NUDGE=0
380         
381          IF ( RMOL(I,J) .GT. 0.0 )  THEN
382              MOLX = AMIN1(1/RMOL(I,J),1000.0)
383          ELSE IF ( RMOL(I,J) .LT. 0.0 ) THEN
384              MOLX = AMAX1(1/RMOL(I,J),-1000.0)
385          ELSE
386              MOLX = 1000
387          ENDIF   
388 
389          ZFUNC      = ZF1 * (1.0 - ZF1 / MAX(100.,PBLH(I,J))) ** 2
390          QST12 = KARMAN * ZFUNC*(QV2-QV1)               &
391               / (ZA2-ZLVL)
392
393!--- LSM sub-time loop too prevent dt > 40 sec       
394        NTSPS = INT(DT / (DTPBLX + 0.000001) + 1.0)                               
395        DTPBL = DT / NTSPS                                                       
396
397        DO IT=1,NTSPS                                                     
398          !... SATURATION VAPOR PRESSURE (MB) OVER WATER OR LAND
399          IF ( TSLB(I,1,J) .LE. SVPT0 ) THEN        ! with snow
400            ES = SVP1 * EXP(22.514 - 6.15E3 / TSLB(I,1,J))      ! cb
401          ELSE
402            ES = SVP1 * EXP(SVP2 * (TSLB(I,1,J) - SVPT0) /  (TSLB(I,1,J) - SVP3))
403          ENDIF
404          QSS  = ES * 0.622 / (SFCPRS - ES)
405         
406          !... beta method, Lee & Pielke (JAM,May1992)
407          BETAP = 1.0
408          IF (IFLAND .LT. 1.5 .AND. ISNOW .LT. 0.5 .AND. SMOIS(I,1,J) .LE. FWFC) THEN       
409            BETAP = 0.25 * (1.0 - COS(SMOIS(I,1,J) / FWFC * PI)) ** 2
410          ENDIF
411         
412         
413          CALL SURFPX (DTPBL, IFLAND, SNOWC(I,J),  NUDGE,                       & !in
414                      SOLDN,  GSW(I,J), LWDN,   EMISSI, ZLVL,                   & !in
415                      MOLX,    Z0,    USTAR,                                    & !in
416                      SFCPRS, DENS1,  QV1,    QSS,   TA1,                       & !in
417                      THETA1,   PRECIP,                                         & !in
418                      CPAIR, PSIH(I,J),                                         & !in
419                      RH2OBS,T2OBS(I,J),                                        & !in
420                      VEGF_PX(I,J), ISTI,   LAI(I,J),   BETAP,                  & !in
421                      RSTMIN(I,J), HC_SNOW, SNOW_FRA,                           & !in         
422                      FWWLT, FWFC, FCGSAT,  FWSAT, FB,                          & !in
423                      FC1SAT,FC2R,FAS,FJP,DZS(1),DZS(2),QST12,                  & !in
424                      RADNET(I,J), GRDFLX(I,J), HFX(I,J), QFX(I,J), LH(I,J),    & !out
425                      EG(I,J), ER(I,J), ETR(I,J),                               & !out
426                      QST(I,J), CAPG(I,J), RS(I,J), RA(I,J),                    & !out
427                      TSLB(I,1,J), TSLB(I,2,J),                                 & !out
428                      SMOIS(I,1,J), SMOIS(I,2,J), WR, TA2(I,J), QA2(I,J) )
429         
430        END DO                    ! Time internal PX time loop   
431
432
433          TSK(I,J)= TSLB(I,1,J)     ! Skin temp set to 1 cm soil temperature in PX for now
434          CANWAT(I,J) = WR * 1000.  ! convert WR back to mm for CANWAT
435                 
436       ENDDO !  END MIAN I LOOP
437      ENDDO  !  END MAIN J LOOP
438
439!------------------------------------------------------
440   END SUBROUTINE pxlsm
441!------------------------------------------------------
442!***************************************************************************
443!***************************************************************************
444      SUBROUTINE VEGELAND( landusef, vegfra,                            &  ! in
445                            shdmin, shdmax,                             &                         
446                            soilctop, soilcbot, nlcat, nscat,           &
447                            znt,  xlai, xlaimn, rstmin, xveg, xvegmn,   &
448                            xsnup,                                      &
449                            ids,ide, jds,jde, kds,kde,                  &
450                            ims,ime, jms,jme, kms,kme,                  &
451                            its,ite, jts,jte, kts,kte                   )
452!***************************************************************************
453!           
454!   CALLED FROM Sub. bl_init in module_physics.init.F
455!           
456!   THIS PROGRAM PROCESSES THE USGS LANDUSE DATA
457!   WHICH HAS BEEN GRIDDED BY THE WPS SYSTEM
458!   AND PRODUCES 2-D FIELDS OF LU RELATED PARAMETERS
459!   FOR USE IN THE PX SURFACE MODEL
460!
461!
462! REVISION HISTORY:
463!  AX      Oct 2004 - developed WRF version based on VEGELAND in the MM5 PX LSM
464!  RG      Dec 2006 - revised for WRFV2.1.2
465!  JP      Dec 2007 - revised for WRFV3 - removed IFGROW options
466!******************************************************************************
467                             
468
469      IMPLICIT NONE
470!...
471      INTEGER,  INTENT(IN)        ::  ids,ide, jds,jde, kds,kde,  &
472                                      ims,ime, jms,jme, kms,kme,  &
473                                      its,ite, jts,jte, kts,kte
474                                                                           
475      INTEGER , INTENT(IN)        ::  NSCAT, NLCAT
476
477      REAL,    DIMENSION( ims:ime , 1:NLCAT, jms:jme ),  INTENT(IN) :: LANDUSEF                       
478      REAL,    DIMENSION( ims:ime , 1:NSCAT, jms:jme ),  INTENT(IN) :: SOILCTOP, SOILCBOT
479                                                                   
480      REAL,    DIMENSION( ims:ime, jms:jme ),            INTENT(IN) ::  VEGFRA, SHDMIN, SHDMAX
481
482      REAL,     DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ZNT
483
484      REAL,     DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: XLAI, XLAIMN, RSTMIN, &
485                                                              XVEG, XVEGMN, XSNUP
486                                     
487!... local variables
488
489      INTEGER :: itf, jtf, k, j, i
490      REAL    :: SUMLAI, SUMLMN, SUMRSI, SUMLZ0, SUMVEG, SUMVMN, ALAI, VEGF, SUMSNUP
491      REAL    :: VFMX, VFMN, VSEAS, FAREA, FWAT, ZNOTC
492      REAL,   DIMENSION( NLCAT )  :: LAIMX, LAIMN, Z0, VEG, VEGMN, SNUP
493      REAL, PARAMETER      :: ZNOTCMN = 5.0  ! CM, MIN Zo FOR CROPS
494      REAL, PARAMETER      :: ZNOTCMX = 15.0 ! CM, MAX Zo FOR CROPS
495
496!*****************************************************************************
497!  USGS LU characterization
498!---------------------------
499!     Name  Rstmin  Zo  Mxfr MnFr  MxLA MnLA
500! 1   Urban  150.   50.  40.  20.  2.0  0.5  Urban or Built-up Land
501! 2   DrCrp   70.   10.  95.  15.  3.0  0.5  Dryland Cropland and Pasture
502! 3   IrCrp   60.   10.  95.  10.  3.0  0.5  Irrigated Cropland and Pasture
503! 4   MixCp   70.   10.  95.  15.  3.0  0.5  Mixed Dry/Irr Crop and Past
504! 5   CrGrM   80.   10.  95.  35.  2.5  1.0  Grassland/Cropland Mosaic
505! 6   CrWdM  180.   40.  95.  40.  4.0  1.5  Woodland/Cropland Mosaic
506! 7   GrsLd  100.    7.  95.  70.  2.5  1.0  Grassland
507! 8   ShrLd  200.   20.  70.  50.  3.0  1.0  Shrubland
508! 9   ShrGr  150.   20.  85.  60.  3.0  1.0  Mixed Shrubland/Grassland
509! 10  Savan  120.   20.  80.  60.  2.0  1.0  Savanna
510! 11  DBFst  200.   50.  95.  50.  5.0  1.0  Broadleaf Deciduous Forest
511! 12  DNFst  175.   50.  95.  50.  5.0  1.0  Deciduous Coniferous Forest
512! 13  EBFst  120.   40.  95.  85.  5.0  4.0  Evergreen Broadleaf Forest (Palm?)
513! 14  ENFst  175.   50.  90.  80.  4.0  3.0  Evergreen Coniferous Forest
514! 15  MxFst  200.   50.  95.  60.  5.0  2.0  Mixed forest
515! 16  Water 9999.   0.1  00.  00.  0.0  0.0  Water
516! 17  HWtld  164.   15.  60.  40.  2.0  1.0  Herbaceous Wetland (none in east)
517! 18  WWtld  200.   45.  90.  80.  5.0  3.0  Forested Wetlands (e.g. Everglades)
518! 19  BarSp  100.    5.  10.  05.  0.5  0.2  Barren or Sparsely Vegetated
519! 20  HrTun  150.   10.  20.  10.  1.0  0.5  Herbaceous Tundra
520! 21  WdTun  200.   10.  30.  10.  1.0  0.5  Shrub and Brush Tundra
521! 22  MxTun  150.    5.  20.  05.  1.0  0.5  Mixed Tundra
522! 23  BGTun  100.    5.   5.  02.  0.1  0.1  Bare Ground Tundra
523! 24  SnwIc  300.    5.   5.  02.  0.1  0.1  Perennial Snowfields or Glaciers
524!-----------------------------------------------------------------------------
525
526      REAL, DIMENSION(24)  :: RSMIN, Z00, VEG0, VEGMN0, LAI0, LAIMN0, SNUP0
527
528      DATA RSMIN /150.0,  70.0,  60.0,  70.0,  80.0, 180.0, 100.0, 200.0,   &
529                  150.0, 120.0, 200.0, 175.0, 120.0, 175.0, 200.0,9999.0,   &
530                  164.0, 200.0, 100.0, 150.0, 200.0, 150.0, 100.0, 300.0/
531      DATA Z00   / 50.0,  10.0,  10.0,  10.0,  10.0,  40.0,   7.0,  20.0,   &
532                   20.0,  20.0,  50.0,  50.0,  40.0,  50.0,  50.0,   0.1,   &
533                   15.0,  45.0,   5.0,  10.0,  10.0,   5.0,   5.0,   5.0/
534      DATA VEG0  / 40.0,  95.0,  95.0,  95.0,  95.0,  95.0,  95.0,  70.0,   &
535                   85.0,  80.0,  95.0,  95.0,  95.0,  90.0,  95.0,  0.00,   &
536                   60.0,  90.0,  10.0,  20.0,  30.0,  20.0,   5.0,   5.0/
537      DATA VEGMN0/ 20.0,  15.0,  10.0,  15.0,  35.0,  40.0,  70.0,  50.0,   &
538                   60.0,  60.0,  50.0,  50.0,  85.0,  80.0,  60.0,   0.0,   &
539                   40.0,  80.0,   5.0,  10.0,  10.0,   5.0,   2.0,   2.0/
540      DATA LAI0  /  2.0,   3.0,   3.0,   3.0,   2.5,   4.0,   2.5,   3.0,   &
541                    3.0,   2.0,   5.0,   5.0,   5.0,   4.0,   5.0,   0.0,   &
542                    2.0,   5.0,  0.50,   1.0,   1.0,   1.0,   0.1,   0.1/
543      DATA LAIMN0/ 0.50,  0.50,  0.50,  0.50,   1.0,   1.5,   1.0,   1.0,   &
544                    1.0,   1.0,   1.0,   1.0,   4.0,   3.0,   2.0,   0.0,   &
545                    1.0,   3.0,  0.20,  0.50,  0.50,  0.50,  0.10,  0.10/
546      DATA SNUP0/   0.04,  0.04,  0.04,  0.04,   0.04,  0.04,  0.04,  0.03,   &
547                   0.035,   0.04, 0.08,  0.08,   0.08,  0.08,  0.08, 0.01,   &
548                   0.01,  0.01,  0.02, 0.02, 0.025, 0.025, 0.025,  0.02/
549
550      !---- INITIALIZE PARAMETERS
551
552      INTEGER :: KWAT
553      DATA KWAT / 16/
554     
555! This routine expects 24 landuse categories. Stop if NLCAT is different.
556      IF(NLCAT .NE. 24)CALL wrf_error_fatal('in PXLSM - num_land_cat must be 24 for this option ')
557
558      !--------------------------------------------------------------------
559      !-- Initialize 2 and 3-D veg parameters to be cacluated
560
561      DO K=1,NLCAT                                                               
562        LAIMX(K) = LAI0(K)                                                       
563        LAIMN(K) = LAIMN0(K)                                                   
564        Z0(K) = Z00(K)                                                   
565        VEG(K) = VEG0(K)                                             
566        VEGMN(K) = VEGMN0(K)
567        SNUP(K)  =  SNUP0(K)                                           
568      ENDDO                                             
569
570      DO J = jts,jte
571      DO I = its,ite
572        XLAI(I,J)   = 0.0                                                       
573        XLAIMN(I,J) = 0.0                                                     
574        RSTMIN(I,J) = 9999.0                                                   
575        XVEG(I,J)   = 0.0                                                       
576        XVEGMN(I,J) = 0.0
577        XSNUP(I,J)  = 0.0                                                           
578      ENDDO             ! END LOOP THROUGH GRID CELLS
579      ENDDO             ! END LOOP THROUGH GRID CELLS
580      !--------------------------------------------------------------------
581
582      DO J = jts,jte
583      DO I = its,ite
584     
585        !--  INITIALIZE SUMS
586        SUMLAI = 0.0
587        SUMLMN = 0.0
588        SUMRSI = 0.0
589        SUMLZ0 = 0.0
590        SUMVEG = 0.0
591        SUMVMN = 0.0
592        ALAI   = 0.0
593        SUMSNUP= 0.0
594
595       !--   ESTIMATE CROP EMERGANCE DATE FROM VEGFRAC
596        VFMX   = SHDMAX(I,J) + 0.001
597        VFMN   = SHDMIN(I,J)
598        VEGF   = VEGFRA(I,J)
599        !-- Computations for VEGETATION CELLS ONLY
600        IF(VFMX.GT.0.0.AND.LANDUSEF(I,KWAT,J).LT.1.00) THEN
601           !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
602          IF(VEGF.LE.VFMN) THEN
603            VSEAS = 0.0
604          ELSE
605            VSEAS = ((VEGF-VFMN)/(VFMX-VFMN))
606          ENDIF
607          ! print *,I,J,VSEAS,VEGF-VFMN,VFMX-VFMN
608          IF(VSEAS.GT.1.0.OR.VSEAS.LT.0.0) THEN
609             print *,' VSEAS NOT BETWEEN 0 AND 1, STOP',  &
610                     ' VSEAS=',VSEAS,VEGF,VFMX,VFMN
611            STOP
612          ENDIF
613          ZNOTC = ZNOTCMN * (1-VSEAS) + ZNOTCMX * VSEAS  ! Zo FOR CROPS
614          DO K = 1, NLCAT
615            LAIMX(K) = LAIMN0(K) * (1-VSEAS) + LAI0(K) * VSEAS
616            LAIMN(K) = LAIMX(K)
617            VEG(K)   = VEGMN0(K) * (1-VSEAS) + VEG0(K) * VSEAS
618            VEGMN(K) = VEG(K)
619        !-- SEASONALLY VARY Zo FOR DryCrop (k=2) OR Irigated Crop (k=3) OR  Mix Crop (k=4)
620            IF (K .GE. 2 .AND. K .LE. 4) THEN
621                Z0(K)  = ZNOTC
622              !-- CrGrM (k=5) or CrWdM (k=6) USE AVG WITH GRASS AND FOREST
623            ELSE IF (K .GE.5 .AND. K .LE. 6) THEN
624                Z0(K)  = 0.5 * (ZNOTC + Z00(K))
625            ENDIF
626          ENDDO
627           !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
628
629        ENDIF       !-- IF cell is vegetation
630        !-------------------------------------
631        !-- LOOP THROUGH LANDUSE Fraction and compute totals
632        DO K = 1, NLCAT
633          FAREA  = LANDUSEF(I,K,J)
634          SUMLAI = SUMLAI + LAIMX(K) * FAREA
635          SUMLMN = SUMLMN + LAIMN(K) * FAREA
636          ALAI   = ALAI + FAREA
637          SUMRSI = SUMRSI + FAREA * LAIMX(K) / RSMIN(K)
638          SUMLZ0 = SUMLZ0 + FAREA * ALOG(Z0(K))
639          SUMVEG = SUMVEG + FAREA * VEG(K)
640          SUMVMN = SUMVMN + FAREA * VEGMN(K)
641          SUMSNUP= SUMSNUP+ FAREA * SNUP(K)
642        ENDDO
643
644        !-- CHECK FOR WATER
645        FWAT = LANDUSEF(I,KWAT,J)
646        IF (FWAT .GT. 0.999) THEN
647          XLAI(I,J)   = LAIMX(KWAT)
648          XLAIMN(I,J) = LAIMN(KWAT)
649          RSTMIN(I,J) = RSMIN(KWAT)
650          ZNT(I,J)    = Z0(KWAT)
651          XVEG(I,J)   = VEG(KWAT)
652          XVEGMN(I,J) = VEGMN(KWAT)
653          XSNUP(I,J)  = SNUP(KWAT)
654        ELSE
655          IF (FWAT .GT. 0.10) THEN
656            ALAI   = ALAI - FWAT
657            SUMLZ0 = SUMLZ0 - FWAT * ALOG(Z0(KWAT))
658          ENDIF
659          XLAI(I,J)   = SUMLAI / ALAI
660          XLAIMN(I,J) = SUMLMN / ALAI
661          RSTMIN(I,J) = SUMLAI / SUMRSI
662          ZNT(I,J)    = EXP(SUMLZ0/ALAI)
663          XVEG(I,J)   = SUMVEG / ALAI
664          XVEGMN(I,J) = SUMVMN / ALAI
665          XSNUP(I,J)  = SUMSNUP/ALAI
666        ENDIF
667
668        IF (FWAT .GT. 0.50) THEN
669           ZNT(I,J) = Z0(KWAT)
670        ENDIF
671
672        ZNT(I,J)    = ZNT(I,J) * 0.01           !CONVERT TO M
673        XVEG(I,J)   = XVEG(I,J) * 0.01          !CONVERT TO FRAC
674        XVEGMN(I,J) = XVEGMN(I,J) * 0.01
675
676      ENDDO             ! END LOOP THROUGH GRID CELLS
677      ENDDO             ! END LOOP THROUGH GRID CELLS
678      !--------------------------------------------------------------------
679
680!------------------------------------------------------------------------------
681  END SUBROUTINE vegeland
682!------------------------------------------------------------------------------
683!**********************************************************************
684      SUBROUTINE SURFPX(DTPBL,  IFLAND, ISNOW,  NUDGEX,                      & !in
685                        SOLDN,  GSW, LWDN,   EMISSI, Z1,                     & !in
686                        MOL,    ZNT,    UST,                                 & !in
687                        PSURF,  DENS1,  QV1,    QSS,   TA1,                  & !in
688                        THETA1, PRECIP,                                      & !in
689                        CPAIR, PSIH,                                         & !in
690                        RH2OBS, T2OBS,                                       & !in
691                        VEGFRC, ISTI,   LAI,   BETAP,                        & !in
692                        RSTMIN, HC_SNOW, SNOW_FRA,                           & !in
693                        WWLT, WFC, CGSAT, WSAT, B,                           & !in
694                        C1SAT, C2R, AS, JP, DS1, DS2,QST12,                  & !in
695                        RADNET, GRDFLX, HFX, QFX, LH, EG, ER,  ETR,          & !out
696                        QST,    CAPG,   RS, RA,  TG,     T2,                 & !out
697                        WG,     W2,     WR, TA2, QA2   )                        !out
698
699      IMPLICIT NONE
700!**********************************************************************
701!
702!  FUNCTION:
703!    THIS SUBROUTINE COMPUTES SOIL MOISTURE AND TEMPERATURE TENDENCIES
704!    BY SOLVING THE PROGNOSTIC EQUATIONS IN PX95.
705!
706!  SUBROUTINES CALLED:
707!    SUB. QFLUX   compute the soil and canopy evaporation, and transpiration
708!    SUB. SMASS   compute nudging coefficients for soil moisture and temp nudging
709!
710!  ARGUMENTS:
711!    DTPBL:   TIME STEP OF THE MINOR LOOP FOR THE LAND-SURFACE/PBL MODEL
712!    IFLAND:  INDEX WHICH INDICATES THE TYPE OF SURFACE,=1,LAND;=2,SEA
713!    ISNOW:   SNOW (=1) OR NOT (=0)
714!    NUDGE:   SWITCH FOR SOIL MOISTURE NUDGING
715!    SOLDN:   SHORT-WAVE RADIATION
716!    LWDN:    LONG-WAVE RADIATION
717!    EMISSI:  EMISSIVITY
718!    Z1:      HEIGHT OF THE LOWEST HALF LAYER
719!    MOL:     MONIN-OBUKOV LENGH (M)
720!    ZNT:     ROUGHNESS LENGTH (M)
721!    UST:     FRICTION VELOCITY (M/S)
722!    TST:     Turbulent moisture scale
723!    RA:      AERODYNAMIC RESISTENCE
724!    PSURF:   P AT SURFACE (CB)
725!    DENS1:   AIR DENSITY AT THE FIRST HALF LAYER
726!    QV1:     Air humidity at first half layer
727!    QSS:     Saturation mixing ratio at ground
728!    TA1:     Air temperature at first half layer
729!    THETA1:  Potential temperature at first half layer
730!    PRECIP:  Precipitation rate in m/s
731!    STBOLT:  STEFAN BOLTZMANN'S CONSTANT
732!    KARMAN:  VON KARMAN CONSTANT
733!    CPAIR:   Specific heat of moist air (M^2 S^-2 K^-1)
734!    TAUINV:  1/1DAY(SEC)
735!    VEGFRC:  Vegetation coverage
736!    ISTI:    soil type
737!    LAI:     Leaf area index
738!    BETAP:   Coefficient for bare soil evaporation
739!    THZ1OB:  Observed TEMP FROM ANAL OF OBS TEMPS AT SCREEN HT
740!    RHOBS:   Observed relative humidity at SCREEN HT
741!    RSTMIN   Minimum Stomatol resistence
742!... Outputs from SURFPX
743!    RADNET: Net radiation
744!    HFX:    SENSIBLE HEAT FLUX (W / M^2)
745!    QFX:    TOTAL EVAP FLUX (KG / M^2 S)
746!    GRDFLX: Ground heat flux (W / M^2)
747!    QST:    Turbulent moisture scale
748!    CAPG:   THERMAL CAPACITY OF GROUND SLAB (J/M^2/K)
749!    RS:     Surface resistence
750!    RA:     Surface aerodynamic resistence
751!    EG:     evaporation from ground (bare soil)
752!    ER:     evaporation from canopy
753!    ETR:    transpiration from vegetation
754!    TA2:    diagnostic 2-m temperature from surface layer and lsm
755!
756!... Updated variables in this subroutine
757!    TG:     Soil temperature at first soil layer
758!    T2:     Soil temperature in root zone
759!    WG:     Soil moisture at first soil layer
760!    W2:     Soil moisture at root zone
761!    WR:     Canopy water content in m
762!
763!  REVISION HISTORY:
764!     AX     2/2005 - developed WRF version based on the MM5 PX LSM
765!
766!**********************************************************************
767!
768!----------------------------------------------------------------------
769!
770!.......Arguments
771
772!.. Integer
773      INTEGER , INTENT(IN)  :: ISTI, NUDGEX
774
775!... Real
776      REAL ,    INTENT(IN)  :: DTPBL, DS1, DS2
777      REAL ,    INTENT(IN)  :: IFLAND, ISNOW
778      REAL ,    INTENT(IN)  :: SOLDN, GSW, LWDN, EMISSI, Z1
779      REAL ,    INTENT(IN)  :: ZNT
780      REAL ,    INTENT(IN)  :: PSURF, DENS1, QV1, QSS, TA1,  THETA1, PRECIP
781      REAL ,    INTENT(IN)  :: CPAIR
782      REAL ,    INTENT(IN)  :: VEGFRC, LAI
783      REAL ,    INTENT(IN)  :: RSTMIN, HC_SNOW, SNOW_FRA
784      REAL ,    INTENT(IN)  :: WWLT, WFC, CGSAT, WSAT, B, C1SAT, C2R, AS, JP
785      REAL ,    INTENT(IN)  :: RH2OBS,T2OBS
786      REAL ,    INTENT(IN)  :: QST12
787
788      REAL ,    INTENT(OUT) :: RADNET, EG, ER, ETR
789      REAL ,    INTENT(OUT) :: QST, CAPG, RS, TA2, QA2
790
791      REAL ,    INTENT(INOUT) :: TG, T2, WG, W2, WR, UST, RA, BETAP
792      REAL ,    INTENT(INOUT) :: GRDFLX, QFX, HFX, LH, PSIH, MOL
793
794!... Local Variables
795
796!... Real
797      REAL        :: HF, LV, CQ4
798      REAL        :: RAH, RAW, ET, W2CG, CG, CT, SOILFLX, CPOT, THETAG
799      REAL        :: ZOL, ZOBOL, ZNTOL, Y, Y0, PSIH15, YNT
800      REAL        :: WGNUDG, W2NUDG, ALPH1, ALPH2, BET1, BET2, T1P5
801      REAL        :: CQ1, CQ2, CQ3, COEFFNP1, COEFFN, TSNEW, TSHLF, T2NEW
802      REAL        :: ROFF, WRMAX, PC, DWR, PNET, TENDWR, WRNEW
803      REAL        :: COF1, CFNP1WR, CFNWR, PG, FASS
804      REAL        :: TENDW2, W2NEW, W2HLF, W2REL, C1, C2, WEQ, CFNP1, CFN, WGNEW
805      REAL        :: ALN10, TMP1, TMP2, TMP3, AA, AB, TST, RBH, CTVEG
806      REAL        :: QST1,PHIH,PSIOB
807      REAL        :: T2NUD, T2NUDF
808      REAL        :: VAPPRS, QSBT, RH2MOD
809
810!... Parameters
811      REAL        :: ZOBS, GAMAH, BETAH, SIGF, BH, CT_SNOW
812      REAL, PARAMETER :: CV = 8.0E-6   ! K-M2/J
813      PARAMETER (ZOBS  = 1.5)      ! height for observed screen temp., (m)
814      PARAMETER (BH    = 15.7)
815      PARAMETER (GAMAH = 16. )   !11.6)
816      PARAMETER (BETAH = 5.0 )   !8.21)
817      PARAMETER (SIGF  = 0.5)      ! rain interception see LSM (can be 0-1)
818      !PARAMETER (CT_SNOW  = 5.54E-5)   
819! New value of CT_SNOW calibrated using multilayer soil model where csnow=6.9E5 J/(m3 K)
820! from NCAR CSM                                         
821      PARAMETER (CT_SNOW  = 2.0E-5) 
822      ALN10  = ALOG(10.0)
823        RADNET = SOLDN - (EMISSI *(STBOLT *TG **4 - LWDN))        ! NET RADIATION                             
824     
825        !--------------------------------------------------------------------
826        CPOT= (100.0 / PSURF) ** ROVCP       ! rcp is global constant(module_model_constants)                           
827        THETAG = TG * CPOT
828
829        ZOL   = Z1/MOL                                                       
830        ZOBOL = ZOBS/MOL                                                     
831        ZNTOL = ZNT/MOL                             
832
833        !-----------------------------------------------------------------------------------------
834        IF (MOL .LT. 0.0) THEN
835          Y      = ( 1.0 - GAMAH * ZOL ) ** 0.5
836          Y0     = ( 1.0 - GAMAH * ZOBOL ) ** 0.5
837          YNT    = ( 1.0 - GAMAH * ZNTOL ) ** 0.5
838          PSIH15 =  2.0 * ALOG((Y + 1.0) / (Y0 + 1.0))
839          PSIH   =  2.0 * ALOG((Y + 1.0) / (YNT + 1.0))
840          PSIOB  =  2.0 * ALOG((Y0 + 1.0) / (YNT + 1.0))
841          PHIH = 1.0 / Y
842        ELSE
843          IF((ZOL-ZNTOL).LE.1.0) THEN                                         
844            PSIH = -BETAH*(ZOL-ZNTOL)                                       
845          ELSE                                                               
846            PSIH = 1.-BETAH-(ZOL-ZNTOL)                                     
847          ENDIF             
848          IF ((ZOBOL - ZNTOL) .LE. 1.0) THEN
849            PSIOB = -BETAH * (ZOBOL - ZNTOL)
850          ELSE
851            PSIOB = 1.0 - BETAH - (ZOBOL - ZNTOL)
852          ENDIF
853          PSIH15 =  PSIH - PSIOB
854          IF(ZOL.LE.1.0) THEN
855            PHIH = 1.0 + BETAH * ZOL
856          ELSE
857            PHIH = BETAH + ZOL
858          ENDIF
859        ENDIF
860        !-----------------------------------------------------------------------------------------
861         !-- ADD RA AND RB FOR HEAT AND MOISTURE
862        !... RB FOR HEAT = 5 /UST
863        !... RB FOR WATER VAPOR =  5*(0.599/0.709)^2/3 /UST = 4.503/UST
864        RA=PR0* ( ALOG(Z1/ZNT) - PSIH )/(KARMAN*UST)
865        RAH = RA + 5.0 / UST
866        RAW = RA + 4.503 / UST
867        !--------------------------------------------------------------------
868        !--  COMPUTE MOISTURE FLUX
869        CALL QFLUX( DENS1,  QV1,    TA1,  SOLDN,  RAW, QSS,            &
870                    VEGFRC, ISNOW,  ISTI, IFLAND, LAI, BETAP,          &
871                    WG,     W2,     WR,                                &
872                    RSTMIN, WWLT, WFC,                                 &
873                    EG,     ER,     ETR,  CQ4,    RS,  FASS)
874        !--------------------------------------------------------------------
875
876        !--------------------------------------------------------------------
877        !..........Total evaporation (ET)
878        ET  = EG + ER + ETR
879        QST = -ET / (DENS1 * UST)
880 
881        LV = 2.83E6                         !-- LATENT HEAT OF SUBLIMATION AT 0C FROM STULL(1988)
882        IF (ISNOW .LT. 0.5.AND.TG.GT.273.15)                            &                                                                               
883                    LV = (2.501 - 0.00237 * (TG - 273.15)) * 1.E6  !-- FROM STULL(1988) in J/KG
884       
885        IF (IFLAND .LT. 1.5 )  QFX = ET     !-- Recaculate QFX over land to account for P-X LSM EG, ER and ETR
886        LH = LV * QFX
887        !-----------------------------------------------------------------------------------------
888
889        !-----------------------------------------------------------------------------------------
890        ! Surface sensible heat flux
891        TST = (THETA1 - THETAG ) / (UST*RAH)
892        HF = UST * TST           
893        HFX = AMAX1(-DENS1 * CPAIR * HF, -250.0)  ! using -250. from MM5                                   
894        !-----------------------------------------------------------------------------------------
895
896        !-----------------------------------------------------------------------------------------
897        ! Compute the diagnosed 2m Q and T consistent with PX LSM
898        QST1 = 0.5*(QST+QST12/PHIH)
899        TA2= (THETAG + TST * (PR0 / KARMAN * (ALOG(ZOBS / ZNT) - PSIOB)+5.))/CPOT
900        QA2= QV1 - QST1 * PR0/ KARMAN *  (ALOG(Z1 / ZOBS) - PSIH15)
901        !--  Relative humidity
902        VAPPRS = SVP1 * EXP(SVP2 * (TA2 - SVPT0) / (TA2 - SVP3))
903        QSBT   = EP_2 * VAPPRS / (PSURF - VAPPRS)
904        RH2MOD  = QA2 / QSBT
905        !-----------------------------------------------------------------------------------------
906        IF (IFLAND .LT. 1.5 ) THEN
907          W2CG = AMAX1(W2,WWLT)
908          CG   = CGSAT * 1.0E-6 * (WSAT/ W2CG) **    & 
909                 (0.5 * B / ALN10)
910          CT = 1./((1-VEGFRC)/CG + VEGFRC/CV)
911          CT = 1./(SNOW_FRA/CT_SNOW + (1-SNOW_FRA)/CT)
912          CAPG = 1.0/CT         
913
914          SOILFLX = 2.0 * PI * TAUINV * (TG - T2)
915          GRDFLX  = SOILFLX / CT
916        ENDIF
917        !-----------------------------------------------------------------------------------------
918
919
920        !--------------------------------------------------------------------
921        !-- ASSIMILATION --- COMPUTE SOIL MOISTURE NUDGING FROM TA2 and RH2               
922        !-------COMPUTE ASSIMILATION COEFFICIENTS FOR ALL I                           
923        IF (IFLAND .LT. 1.5 ) THEN
924        IF (NUDGEX .EQ. 0) THEN                                          !-- NO NUDGING CASE               
925          WGNUDG = 0.0                                                       
926          W2NUDG = 0.0   
927          T2NUD  = 0.0                                   
928        ELSE                                                               !-- NUDGING CASE       
929           
930          CALL SMASS (ISTI,  FASS,  SOLDN,   VEGFRC, RA, WWLT, WFC,   &                       
931                      ALPH1, ALPH2, BET1, BET2, T2NUDF)                             
932
933          !--COMPUTE MODEL RH
934          WGNUDG = ALPH1 * (T2OBS - TA2) + ALPH2 * (RH2OBS - RH2MOD) * 100 
935          W2NUDG = BET1  * (T2OBS - TA2) + BET2  * (RH2OBS - RH2MOD) * 100
936          IF (W2 .GE. WFC)  W2NUDG = AMIN1(W2NUDG,0.0)
937          IF (W2 .LE. WWLT) W2NUDG = AMAX1(W2NUDG,0.0)
938          T2NUD = T2NUDF * (T2OBS - TA2)
939          !print *, 'T2NUD =',T2NUD,T2NUDF
940        ENDIF
941        ENDIF
942        !-----------------------------------------------------------------------------------------
943
944        !-----------------------------------------------------------------------------------------
945        !-- Compute new values for TS,T2,WG,W2 and WR. No change over ice or water (XLAND > 1)
946        IF (IFLAND .LT. 1.5 ) THEN
947          !-- SOLVE BY CRANK-NIC --   TENDTS=CT*(RADNET-HFX-QFX)-SOILFLX
948          !-- Calculate the coefficients for implicit calculation of TG
949          CQ1      = (1.0 - 0.622 * LV * CRANKP / (r_d * TG)) * QSS
950          CQ2      = 0.622 * LV * QSS * CRANKP / (r_d * TG * TG)
951          CQ3      = DENS1 * BETAP * (1.0 - VEGFRC) / RAW
952          COEFFNP1 = 1.0 + DTPBL * CRANKP * (4.0 * EMISSI *  STBOLT * TG ** 3    &
953                     * CT + DENS1 * CPAIR / RAH * CPOT * CT + 2.0 * PI           &
954                     * TAUINV ) + DTPBL * (CT * LV * CQ2 * (CQ3 + CQ4))
955          COEFFN   = CT * (GSW + EMISSI * (STBOLT * (4.0 * CRANKP - 1.0)       &
956                     * TG ** 4 + LWDN)                                           & !NET RAD
957                     + DENS1 * CPAIR / RAH * (THETA1 - (1.0 - CRANKP) * THETAG)  &
958                     - LV * (CQ3 * (CQ1 - QV1) + CQ4 * (CQ1 - QV1)))       &       !SFC HEAT FLUX
959                     - 2.0 * PI * TAUINV * ((1.0 - CRANKP) * TG - T2)              !SOIL FLUX
960          TSNEW    = (TG + DTPBL * COEFFN) / COEFFNP1
961          !-- FOR SNOW COVERED SURFACE TEMPERATURE IS NOT MORE THAN ZERO
962!          IF (ISNOW .GT. 0.5) TSNEW = AMIN1(TSNEW,273.15)
963          TSHLF = 0.5 * ( TSNEW + TG)
964          T2NEW = (T2 + DTPBL * TAUINV * T2TFAC * (TSHLF - (1 - CRANKP) * T2) &
965                + DTPBL*T2NUD)  &              ! Added deep temperature nudging
966                  / (1.0 + DTPBL * TAUINV * T2TFAC * CRANKP)
967          !-- REPLACE OLD with NEW Value
968          TG = TSNEW
969          T2 = T2NEW
970        ENDIF
971        !-----------------------------------------------------------------------------------------
972
973        !-----------------------------------------------------------------------------------------
974        ! Compute new subsurface soil and canopy moisture values DENS1. No change required over ocean.
975        IF (IFLAND .LT. 1.5) THEN 
976          !-- Compute WR
977          ROFF  = 0.0
978          WRMAX = 0.2E-3 * VEGFRC * LAI                     ! max. WRMAX IN m
979          !--  PC is precip. intercepted by veg.(M/S)
980          PC    = VEGFRC * SIGF * PRECIP
981          DWR   = (WRMAX - WR) / DTPBL                       !the tendency to reach max.
982          PNET  = PC - ER/ DENW                              ! residual of precip. and evap.
983          IF (PNET .GT. DWR) THEN
984            ROFF = PNET - DWR
985            PC   = PC - ROFF
986          ENDIF
987          IF (QSS .LT. QV1) THEN
988            TENDWR = PC - ER / DENW
989            WRNEW  = WR + DTPBL * TENDWR
990          ELSE
991            COF1    = DENS1 / DENW * VEGFRC * (QSS - QV1) / RAW
992            !-- using delta=wr/wrmax
993            CFNP1WR = 1.0 + DTPBL * COF1 * CRANKP / WRMAX 
994            CFNWR   = PC - COF1 * (1.0 - CRANKP) * WR / WRMAX
995            WRNEW   = (WR + DTPBL * CFNWR) / CFNP1WR
996          ENDIF
997          !-- Compute W2
998          !.......... 
999          PG     = DENW * (PRECIP - PC)               ! PG is precip. reaching soil (PC already including ROFF)
1000          IF(ER.GT.0.5E-3)PRINT *,' PRECIP,PC,DTPBL,PNET='   &
1001          ,PRECIP,PC,DTPBL,PNET
1002          TENDW2 = 1.0 / (DENW * DS2) * (PG - EG - ETR) &
1003                   + (W2NUDG + WGNUDG) / DS2                    ! NUDGING
1004          W2NEW  = W2 + DTPBL * TENDW2
1005          W2NEW  = AMIN1(W2NEW,WSAT)
1006          W2NEW  = AMAX1(W2NEW,0.05)
1007          W2HLF  = 0.5 * (W2 + W2NEW)
1008          !.. new values
1009          W2     = W2NEW
1010          WR     = AMIN1(WRMAX,WRNEW)
1011          if (WR .lt. 1.0E-8) WR = 0.0                         
1012        ENDIF
1013        !-----------------------------------------------------------------------------------------
1014
1015        !-----------------------------------------------------------------------------------------
1016        ! Compute new surface soil moisture values (WR).
1017        IF (IFLAND .LT. 1.5) THEN  ! over ocean no change to wg w2,wr
1018        !--    FOR SNOW COVERED SURFACE, ASSUME SURFACE IS SATURATED AND
1019        !      WG AND W2 ARE NOT CHANGED
1020          IF (ISNOW .GT.0.5) THEN
1021            WG = WSAT
1022          ELSE
1023            W2REL = W2HLF / WSAT
1024            IF (WG .GT. WWLT) THEN
1025              C1 = C1SAT * (WSAT / WG) ** (0.5 * B + 1.0)
1026            ELSE   ! elimilate C1 for wg < wilting point
1027              C1 = C1SAT * (WSAT / WWLT) ** (0.5 * B + 1.0)
1028            ENDIF
1029            C2 = C2R * W2HLF / (WSAT - W2HLF + 1.E-11)
1030            IF (W2HLF .EQ. WSAT) THEN
1031              WEQ = WSAT
1032            ELSE
1033              WEQ = W2HLF - AS * WSAT * W2REL ** JP *         &
1034                   (1.0 - W2REL ** (8.0 * JP))
1035            ENDIF
1036
1037            !.... The beta method, Lee & Pielke (JAM, May 1992)
1038            CFNP1 = 1.0 + DTPBL * C2 * TAUINV * CRANKP
1039            CFN   = C1 / (DENW * DS1) * (PG - EG) - C2 * TAUINV *               &
1040                    ((1.0 - CRANKP) * WG - WEQ) + WGNUDG/ DS1                                   
1041
1042            WGNEW = AMAX1((WG + DTPBL * CFN) / CFNP1,0.001)
1043            !-- NEW VALUES
1044            WG    = AMIN1(WGNEW,WSAT)
1045           
1046          ENDIF                  !endif for ISNOW
1047        ENDIF                    !endif for XLAND
1048        !-----------------------------------------------------------------------------------------
1049           
1050      END SUBROUTINE surfpx
1051!***********************************************************************
1052!***********************************************************************
1053
1054!***********************************************************************
1055!***********************************************************************
1056      SUBROUTINE QFLUX (DENS1,  QV1,   TA1,  RG,     RAW, QSS,           & ! in
1057                        VEGFRC, ISNOW, ISTI, IFLAND, LAI, BETAP,         & ! in
1058                        WG,     W2,    WR,                               & ! in
1059                        RSTMIN, WWLT,  WFC,                              &
1060                        EG,     ER,    ETR,  CQ4,    RS,  FASS)            ! out
1061
1062!***********************************************************************
1063!                                                             
1064!  FUNCTION:                                                         
1065!    THIS SUBROUTINE COMPUTES EVAPORATION FROM BARE SOIL (EG) AND FROM
1066!    THE WET PART OF CANOPY (ER) AND TRANSPIRATION FROM THE DRY PART OF
1067!    CANOPY (ETR).                       
1068!                                       
1069!  REVISION HISTORY:
1070!    A. Xiu       Oct  2004  - adapted from the PX LSM in MM5 for the WRF system                           
1071!    R. Gilliam   Dec  2006  - Completed WRF V2.1.2 implementation                                 
1072!                                                               
1073!***********************************************************************
1074!  QFLUX ARGUMENT LIST:                                                       
1075! ----------------------------------------------------------------------
1076! INPUTS:
1077!-- DENS1        air density at first layer
1078!-- QV1          air humidity at first layer
1079!-- TA1          air temperature at first layer
1080!-- RG           shortwave radition reaching the ground
1081!-- RAW          RA+RB for moisture
1082!-- QSS          saturation mixing ratio at ground
1083!-- VEGFRC       vegetation coverage
1084!-- ISNOW        if snow on the ground
1085!-- ISTI         soil type
1086!-- IFLAND       if land (=1) or water (=2)
1087!-- LAI          leaf area index
1088!-- BETAP       
1089!-- WG           soil moisture at first soil layer
1090!-- W2           soil moisture at root zone
1091!-- WR           Canopy water
1092!
1093!  OUTPUTS FROM QFLUX:
1094!-- EG           evaporation from ground (bare soil)
1095!-- ER           evaporation from canopy
1096!-- ETR          transpiration from vegetation
1097!-- CQ4
1098!-- RS           surface resistence
1099!-- FASS         parameter for soil moisture nudging
1100! ----------------------------------------------------------------------
1101
1102      IMPLICIT NONE
1103
1104! ----------------------------------------------------------------------
1105! DECLARATIONS - INTEGER
1106      INTEGER , INTENT(IN)  :: ISTI
1107
1108! ----------------------------------------------------------------------
1109! DECLARATIONS - REAL
1110      REAL ,    INTENT(IN)  :: ISNOW, IFLAND
1111      REAL ,    INTENT(IN)  :: DENS1, QV1, TA1, RG, RAW, QSS,            &
1112                               VEGFRC, LAI,                              &
1113                               WG, W2, WR, RSTMIN   
1114      REAL ,    INTENT(INOUT)  :: BETAP
1115      REAL,     INTENT(IN)   :: WWLT, WFC
1116
1117      REAL ,    INTENT(OUT) :: EG, ER, ETR, CQ4, RS, FASS
1118
1119!... Local Variables
1120
1121!... Real
1122      REAL    :: WRMAX, DELTA, SIGG, RADL, RADF, W2AVAIL, W2MXAV
1123      REAL    :: FTOT, F1, F2, F3,  F4
1124      REAL    :: FSHELT, GS, GA, FX
1125
1126
1127
1128!... Parameters
1129      REAL, PARAMETER :: RSMAX = 5000.0                ! s/m
1130      REAL, PARAMETER :: FTMIN = 0.0000001             ! m/s
1131      REAL, PARAMETER :: F3MIN = 0.25
1132
1133!
1134!... for water surface, no canopy evaporation and transpiration
1135      ER  = 0.0
1136      ETR = 0.0
1137
1138!... GROUND EVAPORATION (DEPOSITION)
1139      IF (QSS .LT. QV1) BETAP = 1.0
1140      EG = DENS1 * (1.0 - VEGFRC) * BETAP * (QSS - QV1) / RAW
1141
1142!... CANOPY
1143      IF (IFLAND .LT. 1.5 .AND. ISTI .GT. 0)  THEN
1144         WRMAX = 0.2E-3 * VEGFRC * LAI   ! in unit m
1145          IF (WR .LE. 0.0) THEN
1146            DELTA = 0.0
1147          ELSE
1148!            DELTA = (WR / WRMAX) ** 0.66667
1149            DELTA = WR / WRMAX           ! referred to SiB model
1150          ENDIF
1151          IF (QSS .GE. QV1) THEN
1152            SIGG = DELTA
1153          ELSE
1154            SIGG = 1.0
1155          ENDIF
1156
1157          ER = DENS1 * VEGFRC * SIGG * (QSS - QV1) / RAW 
1158!         IF(ER.GT.0.5E-3)PRINT *,' WR,SIGG,DENS1,VEGFRC,QSS,QV1,RAW=', &
1159!                  WR,SIGG,DENS1,VEGFRC,QSS,QV1,RAW,' ER=',ER
1160      ENDIF
1161
1162!-- TRANSPIRATION
1163
1164      IF (IFLAND .LT. 1.5 .AND. ISTI .GT. 0)  THEN
1165!
1166!-RADIATION
1167        IF (RSTMIN .GT. 130.0) THEN
1168          RADL = 30.0                                            ! W/M2
1169        ELSE
1170          RADL = 100.0                                           ! W/M2
1171        ENDIF
1172       RADF = 1.1 * RG / (RADL * LAI)                  ! NP89 - EQN34
1173        F1   = (RSTMIN / RSMAX + RADF) / (1.0 + RADF)
1174
1175!-SOIL MOISTURE
1176        W2AVAIL = W2 - WWLT
1177        W2MXAV  = WFC - WWLT
1178        F2      = 1.0 / (1.0 + EXP(-5.0 * ( W2AVAIL / W2MXAV -               &
1179                  (W2MXAV / 3.0 + WWLT))))    ! according JP, 9/94
1180
1181!-AIR TEMP
1182!... according to Avissar (1985) and AX 7/95
1183        IF (TA1 .LE. 302.15) THEN
1184          F4 = 1.0 / (1.0 + EXP(-0.41 * (TA1 - 282.05)))
1185        ELSE
1186          F4 = 1.0 / (1.0 + EXP(0.5 * (TA1 - 314.0)))
1187        ENDIF
1188!...
1189        FTOT = LAI * F1 * F2 * F4
1190        FTOT = AMAX1(FTOT,FTMIN)
1191      ENDIF
1192
1193      IF (IFLAND .LT. 1.5 .AND. ISTI .GT. 0)  THEN
1194        FSHELT = 1.0   ! go back to NP89
1195        GS     = FTOT / (RSTMIN * FSHELT)
1196        GA     = 1.0 / RAW
1197!-- Compute humidity effect according to RH at leaf surf
1198        F3 = 0.5 * (GS - GA + SQRT(GA * GA + GA * GS *                       &
1199             (4.0 * QV1 / QSS - 2.0) + GS * GS)) / GS
1200        F3 = AMIN1(AMAX1(F3,F3MIN),1.0)
1201        RS = 1.0 / (GS * F3)
1202
1203!--- Compute Assimilation factor for soil moisture nudging - jp 12/94
1204!--     Note that the 30 coef is to result in order 1 factor for max
1205        IF (RG .LT. 0.00001) THEN   ! do not nudge during night
1206          FX = 0.0
1207        ELSE
1208          FX = 30.0 * F1 * F4 * LAI / (RSTMIN * FSHELT)
1209        ENDIF
1210        FASS = FX
1211        ETR = DENS1 * VEGFRC * (1.0 - SIGG) * (QSS - QV1) / (RAW + RS)
1212!..... CQ4 is used for the implicit calculation of TG in SURFACE
1213        CQ4 = DENS1 * VEGFRC * ((1.0 - SIGG) / (RAW + RS) + SIGG / RAW)
1214      ENDIF         ! endif for if IFLAND
1215
1216    END SUBROUTINE qflux
1217!------------------------------------------------------------------------------------------
1218!------------------------------------------------------------------------------------------
1219
1220!------------------------------------------------------------------------------------------
1221      SUBROUTINE SMASS (ISTI,  FASS,  RG,   VEGFRC, RA,              & !in                     
1222                        WWLT, WFC,                                   &
1223                        ALPH1, ALPH2, BET1, BET2, T2NUDF )             !out 
1224!------------------------------------------------------------------------------------------
1225      IMPLICIT NONE
1226!*******************************************************************
1227!     SMASS COMPUTES SOIL MOISTURE NUDGING COEFFICIENTS
1228!*******************************************************************
1229!
1230!.........Arguments
1231      INTEGER, PARAMETER             :: NSCAT    = 16     ! max. soil types
1232     
1233      INTEGER,                   INTENT(IN)   :: ISTI
1234      REAL,                      INTENT(IN)   :: FASS, RG, VEGFRC, RA
1235      REAL,                      INTENT(IN)   :: WWLT, WFC
1236      REAL,                      INTENT(OUT)  :: ALPH1, ALPH2, BET1, BET2, T2NUDF
1237
1238
1239!........Local variables
1240
1241!... Real
1242      REAL    :: FBET, FALPH, FRA, FTEXT
1243      REAL,    DIMENSION( 1: NSCAT ) :: WFCX, WWLTX
1244     
1245!... Parameters
1246      REAL, PARAMETER  :: A1MAX = -10.E-5, A2MAX = 1.E-5  ! m/K, m for 6hr period
1247      REAL, PARAMETER  :: B1MAX = -10.E-3, B2MAX = 1.E-3  ! m/K, m (Bouttier et al 1993)
1248      REAL, PARAMETER  :: TASSI = 4.6296E-5               ! 1/6hr in 1/sec
1249      REAL, PARAMETER  :: RAMIN = 10.0                    ! 0.1 s/cm
1250!
1251!-- WFC is field capacity (M^3/M^3) (JN90)
1252      DATA WFCX   /  0.135, 0.150, 0.195, 0.255, 0.240, 0.255, 0.322,    &
1253                    0.325, 0.310, 0.370, 0.367, 0.367, 0.367, 0.367, 0.367, 0.367 /
1254!
1255!-- WWLT is wilting point (M^3/M^3) (JN90)
1256      DATA WWLTX  /  0.068, 0.075, 0.114, 0.179, 0.155, 0.175, 0.218,    &
1257                    0.250, 0.219, 0.283, 0.286, 0.286, 0.286, 0.286, 0.286, 0.286 /
1258
1259!
1260      FBET  = FASS
1261      FALPH = RG / 1370.0
1262!--TEXTURE FACTOR NORMALIZED BY LOAM (IST=5)
1263      FRA   = RAMIN / RA            ! scale by aerodynamic resistance
1264      FTEXT = TASSI * (WWLT + WFC) / (WWLTX(5) + WFCX(5)) * FRA
1265!        write(6,*) ' ftot, fbet=',ftot, fbet,' ftext=',ftext/tassi
1266!
1267      ALPH1 = A1MAX * FALPH * (1.0 - VEGFRC) * FTEXT
1268      ALPH2 = A2MAX * FALPH * (1.0 - VEGFRC) * FTEXT
1269      BET1  = B1MAX * FBET  *        VEGFRC  * FTEXT
1270      BET2  = B2MAX * FBET  *        VEGFRC  * FTEXT
1271      T2NUDF = 1.0E-5 * MAX((1.0 - 5.0 * FALPH),0.0)   ! T2 Nudging at night
1272
1273    END SUBROUTINE smass
1274!------------------------------------------------------------------------------------------
1275!------------------------------------------------------------------------------------------
1276
1277!------------------------------------------------------------------------------------------
1278!------------------------------------------------------------------------------------------
1279      SUBROUTINE SOILPROP (SOILCBOT,WEIGHT, ITIMESTEP, MAVAIL, &  ! IN
1280                           PXLSM_SMOIS_INIT,                   &  ! IN
1281                           FWSAT,FWFC,FWWLT,FB,FCGSAT,         &  ! OUT
1282                           FJP,FAS,FC2R,FC1SAT,ISTI, W2        )  ! OUT
1283      IMPLICIT NONE
1284      !*******************************************************************
1285      !     SOILPROP COMPUTES SOIL PARAMETERS FOR BOTH BOTTOM AND TOP LAYERS
1286      !              USING FRACTIONAL SOIL TYPE. A HARD CODED OPTION IS AVAILIABLE
1287      !              TO COMPUTE THE SOIL PARAMETERS USING FRACTIONAL INFORMATION, OR
1288      !              TO JUST USE SOIL PARAMETERS OF THE DOMINANT SOIL TYPE
1289      !*******************************************************************
1290     !------------------------------------------------------------------------
1291     !-- SOIL PARAMETERS ARE SPECIFIED BY SOIL TYPE:
1292     !   #  SOIL TYPE  WSAT  WFC  WWLT    B   CGSAT   JP   AS   C2R  C1SAT
1293     !   _  _________  ____  ___  ____  ____  _____   ___  ___  ___  _____
1294     !   1  SAND       .395 .135  .068  4.05  3.222    4  .387  3.9  .082
1295     !   2  LOAMY SAND .410 .150  .075  4.38  3.057    4  .404  3.7  .098
1296     !   3  SANDY LOAM .435 .195  .114  4.90  3.560    4  .219  1.8  .132
1297     !   4  SILT LOAM  .485 .255  .179  5.30  4.418    6  .105  0.8  .153
1298     !   5  LOAM       .451 .240  .155  5.39  4.111    6  .148  0.8  .191
1299     !   6  SND CLY LM .420 .255  .175  7.12  3.670    6  .135  0.8  .213
1300     !   7  SLT CLY LM .477 .322  .218  7.75  3.593    8  .127  0.4  .385
1301     !   8  CLAY LOAM  .476 .325  .250  8.52  3.995   10  .084  0.6  .227
1302     !   9  SANDY CLAY .426 .310  .219 10.40  3.058    8  .139  0.3  .421
1303     !  10  SILTY CLAY .482 .370  .283 10.40  3.729   10  .075  0.3  .375
1304     !  11  CLAY       .482 .367  .286 11.40  3.600   12  .083  0.3  .342
1305     !  12  CLAY       .482 .367  .286 11.40  3.600   12  .083  0.3  .342
1306     !  13  CLAY       .482 .367  .286 11.40  3.600   12  .083  0.3  .342
1307     !  14  CLAY       .482 .367  .286 11.40  3.600   12  .083  0.3  .342
1308     !  15  CLAY       .482 .367  .286 11.40  3.600   12  .083  0.3  .342
1309     !  16  CLAY       .482 .367  .286 11.40  3.600   12  .083  0.3  .342
1310     !------------------------------------------------------------------------
1311     !
1312     !.........Arguments
1313      INTEGER, PARAMETER             :: NSCAT    = 16     ! max. soil types
1314      INTEGER, PARAMETER             :: NSCATMIN = 16     ! min soil types
1315
1316      INTEGER,                      INTENT(IN)   :: WEIGHT, ITIMESTEP, PXLSM_SMOIS_INIT
1317      REAL,                         INTENT(IN)   :: MAVAIL
1318      REAL,     DIMENSION(1:NSCAT), INTENT(IN)   :: SOILCBOT
1319      REAL,                         INTENT(OUT)  :: FWSAT,FWFC,FWWLT,FB,FCGSAT,          &
1320                                                    FJP,FAS,FC2R,FC1SAT
1321      REAL,                         INTENT(INOUT)  :: W2
1322
1323
1324      INTEGER,                      INTENT(OUT)  :: ISTI
1325!........Local variables
1326      CHARACTER*4, AVCLASS
1327      CHARACTER*4, DIMENSION( 1: NSCAT ) ::  TEXID
1328!... Integer
1329      INTEGER:: S
1330!... Real
1331      REAL:: TFRACBOT, CFRAC, SUMSND, SUMCLY, AVS, AVC, AVSLT
1332      REAL,    DIMENSION( 1: NSCAT ) :: WSAT, WFC, WWLT, B, CGSAT, AS,  &
1333                                        JP, C2R, C1SAT
1334
1335      REAL,    DIMENSION( 1: NSCATMIN ) ::  SAND, CLAY
1336!.......... DATA statement for SOIL PARAMETERS for the 11 soil types
1337      DATA SAND /92.5,80.5,61.1,19.6,4.0,40.0,57.1,11.3,26.8,       &
1338                 52.0,6.5,10.2,1.0,1.0,1.0,1.0/                                                 
1339      DATA CLAY/2.1,4.1,10.9,19.1,7.3,18.8,23.3,32.2,36.6,          &                     
1340                43.0,46.2,58.8,1.0,1.0,1.0,1.0/                                                 
1341      DATA TEXID/'Sand','Lsan','Sloa','Sill','Silt','Loam','Sclo',  &             
1342                 'Sicl','Cllo','Sacl','Sicy','Clay','Ormt','Wate',  &           
1343                 'Bedr','Othe'/                                         
1344
1345!
1346!-- WSAT is saturated soil moisture (M^3/M^3) (JN90)
1347      DATA WSAT  /  0.395, 0.410, 0.435, 0.485, 0.451, 0.420, 0.477,    &
1348                    0.476, 0.426, 0.482, 0.482, 0.482, 0.482, 0.482, 0.482, 0.482 /
1349!
1350!-- WFC is field capacity (M^3/M^3) (JN90)
1351      DATA WFC   /  0.135, 0.150, 0.195, 0.255, 0.240, 0.255, 0.322,    &
1352                    0.325, 0.310, 0.370, 0.367, 0.367, 0.367, 0.367, 0.367, 0.367 /
1353!
1354!-- WWLT is wilting point (M^3/M^3) (JN90)
1355      DATA WWLT  /  0.068, 0.075, 0.114, 0.179, 0.155, 0.175, 0.218,    &
1356                    0.250, 0.219, 0.283, 0.286, 0.286, 0.286, 0.286, 0.286, 0.286 /
1357!
1358!-- B is slop of the retention curve (NP89)
1359      DATA B     /  4.05,  4.38,  4.90,  5.30,  5.39,  7.12,  7.75,     &
1360                    8.52, 10.40, 10.40, 11.40, 11.40, 11.40, 11.40, 11.40, 11.40  /
1361!
1362!-- CGSAT is soil thermal coef. at saturation (10^-6 K M^2 J^-1) (NP89)
1363      DATA CGSAT /  3.222, 3.057, 3.560, 4.418, 4.111, 3.670, 3.593,    &
1364                    3.995, 3.058, 3.729, 3.600, 3.600, 3.600, 3.600, 3.600, 3.600 /
1365!
1366!-- JP is coefficient of WGEQ formulation (NP89)
1367      DATA JP    /  4,     4,     4,     6,     6,     6,     8,        &
1368                   10,     8,    10,    12,    12,    12,    12,    12,    12     /
1369!
1370!-- AS is coefficient of WGEQ formulation (NP89)
1371      DATA AS    /  0.387, 0.404, 0.219, 0.105, 0.148, 0.135, 0.127,    &
1372                    0.084, 0.139, 0.075, 0.083, 0.083, 0.083, 0.083, 0.083, 0.083 /
1373!
1374!-- C2R is the value of C2 for W2=0.5WSAT (NP89)
1375      DATA C2R   /  3.9,   3.7,   1.8,   0.8,   0.8,   0.8,   0.4,      &
1376                    0.6,   0.3,   0.3,   0.3,   0.3,   0.3,   0.3,   0.3,   0.3   /
1377!
1378!-- C1SAT is the value of C1 at saturation (NP89)
1379      DATA C1SAT /  0.082, 0.098, 0.132, 0.153, 0.191, 0.213, 0.385,    &
1380                    0.227, 0.421, 0.375, 0.342, 0.342, 0.342, 0.342, 0.342, 0.342 /
1381!   
1382!-------------------------------Exicutable starts here--------------------
1383
1384    IF(WEIGHT.GE.1.0) THEN   !Compute soil characteristics using weighting determined by fractional soil content
1385     FWSAT =0
1386     FWFC  =0
1387     FWWLT =0
1388     FB    =0
1389     FCGSAT=0
1390     FJP   =0
1391     FAS   =0
1392     FC2R  =0
1393     FC1SAT=0
1394     TFRACBOT =0
1395     CFRAC=0
1396     
1397     DO S=1,NSCAT
1398      IF(SOILCBOT(S).GE.CFRAC) THEN
1399        ISTI=S
1400        CFRAC=SOILCBOT(S)
1401      ENDIF
1402     
1403      TFRACBOT=TFRACBOT+SOILCBOT(S)
1404     
1405      FWSAT =FWSAT  +  WSAT(S)  *SOILCBOT(S)
1406      FWFC  =FWFC   +  WFC(S)   *SOILCBOT(S)
1407      FWWLT =FWWLT  +  WWLT(S)  *SOILCBOT(S)
1408      FB    =FB     +  B(S)     *SOILCBOT(S)
1409      FCGSAT=FCGSAT +  CGSAT(S) *SOILCBOT(S)
1410      FJP   =FJP    +  JP(S)    *SOILCBOT(S)
1411      FAS   =FAS    +  AS(S)    *SOILCBOT(S)
1412      FC2R  =FC2R   +  C2R(S)   *SOILCBOT(S)
1413      FC1SAT=FC1SAT +  C1SAT(S) *SOILCBOT(S)
1414     
1415     
1416     ENDDO
1417
1418     TFRACBOT = 1/TFRACBOT
1419     FWSAT =FWSAT   *  TFRACBOT
1420     FWFC  =FWFC    *  TFRACBOT
1421     FWWLT =FWWLT   *  TFRACBOT
1422     FB    =FB      *  TFRACBOT
1423     FCGSAT=FCGSAT  *  TFRACBOT
1424     FJP   =FJP     *  TFRACBOT
1425     FAS   =FAS     *  TFRACBOT
1426     FC2R  =FC2R    *  TFRACBOT
1427     FC1SAT=FC1SAT  *  TFRACBOT
1428   
1429    ELSE                !Compute soil characteristics by sand and clay fraction
1430   
1431      CFRAC      = 0.0                                                               
1432      SUMSND     = 0.0                                                               
1433      SUMCLY     = 0.0                                                               
1434      TFRACBOT   = 0.0                                                             
1435                                                                               
1436      DO S = 1,NSCAT                                                         
1437         TFRACBOT  = TFRACBOT  + SOILCBOT(S)
1438         SUMSND    = SUMSND    + SAND(S) * SOILCBOT(S)
1439         SUMCLY    = SUMCLY    + CLAY(S) * SOILCBOT(S)
1440         
1441         IF(SOILCBOT(S).GE.CFRAC) THEN   ! Find Dominant Category and fraction
1442           ISTI=S
1443           CFRAC=SOILCBOT(S)
1444         ENDIF
1445      ENDDO
1446         
1447      IF(TFRACBOT.GT.0.001) THEN                                                 
1448        AVS = SUMSND / TFRACBOT                                               
1449        AVC = SUMCLY / TFRACBOT                                           
1450        AVSLT = 100 - AVS - AVC                                   
1451       
1452        IF(AVS.GT.85..AND.AVC.LT.100.-AVS) THEN                           
1453          AVCLASS= 'Sand'                                                   
1454          ISTI = 1                                                         
1455        ELSE IF(AVS.GT.70..AND.AVC.LT.100.-AVS) THEN                   
1456          AVCLASS= 'Lsan'                                             
1457          ISTI = 2                                                 
1458        ELSE IF((AVC.LT.20..AND.AVS.GT.52..AND.AVC.GT.7.5) &       
1459                .OR.(AVC.LE.7.5.AND.AVSLT.LT.50.)) THEN               
1460          AVCLASS= 'Sloa'                                             
1461          ISTI = 3                                                     
1462        ELSE IF(AVC.LT.35..AND.AVS.GT.45..AND.AVSLT.LT.28.) THEN     
1463          AVCLASS= 'Sclo'                                                 
1464          ISTI = 6                                                     
1465        ELSE IF(AVC.GE.35..AND.AVS.GT.45.) THEN                           
1466          AVCLASS = 'Sacl'                                                 
1467          ISTI = 9                                                         
1468        ELSE IF(AVC.LT.27.0.AND.AVSLT.LT.50.) THEN                       
1469          AVCLASS= 'Loam'                                               
1470          ISTI = 5                                                       
1471        ELSE IF(AVC.LT.12..AND.AVSLT.GT.80.) THEN               
1472          AVCLASS = 'Silt'                                         
1473          ISTI = 4                                                           
1474        ELSE IF(AVC.LT.27.) THEN                                                 
1475          AVCLASS = 'Sill'                                                       
1476          ISTI = 4                                                             
1477        ELSE IF(AVC.LT.40..AND.AVS.GT.20.) THEN                                 
1478          AVCLASS = 'Cllo'                                                       
1479          ISTI = 8                                                               
1480        ELSE IF(AVC.LT.40.) THEN                                                 
1481          AVCLASS = 'Sicl'                                                       
1482          ISTI = 7                                                               
1483        ELSE IF(AVSLT.GE.40.) THEN                                               
1484          AVCLASS = 'Sicy'                                                       
1485          ISTI = 10                                                             
1486        ELSE                                                                     
1487          AVCLASS = 'Clay'                                                       
1488          ISTI = 11                                                             
1489        ENDIF                                                                   
1490     
1491      ELSE
1492        ISTI=5
1493        AVCLASS = TEXID(ISTI) 
1494      ENDIF
1495 
1496     FWSAT =WSAT(ISTI)   
1497     FWFC  =WFC(ISTI)   
1498     FWWLT =WWLT(ISTI)   
1499     FB    =B(ISTI)     
1500     FCGSAT=CGSAT(ISTI) 
1501     FJP   =JP(ISTI)     
1502     FAS   =AS(ISTI)     
1503     FC2R  =C2R(ISTI)   
1504     FC1SAT=C1SAT(ISTI) 
1505                         
1506   
1507    ENDIF
1508   
1509    ! Compute W2 using soil moisture availiability if pxlsm_smois_init (in namelist) is not zero
1510    IF (ITIMESTEP .EQ. 1 .AND. PXLSM_SMOIS_INIT .GT. 0) THEN
1511       W2 = FWWLT + (0.5*(FWSAT+FWFC) - FWWLT)  * MAVAIL
1512    ENDIF                                                                   
1513   
1514    END SUBROUTINE soilprop
1515!------------------------------------------------------------------------------------------
1516!------------------------------------------------------------------------------------------
1517!------------------------------------------------------------------------------------------
1518      SUBROUTINE PXSNOW (ITIMESTEP, ASNOW, CSNOW, SNOW,       &
1519                         SNOWH, SNUP,                         &
1520                         ALB, SNOALB, SHDFAC, SHDMIN,         &
1521                         HC_SNOW, SNOW_FRA, SNOWC, SNOWALB)                   
1522!------------------------------------------------------------------------------------------
1523      IMPLICIT NONE
1524!*******************************************************************
1525!     Pleim-Xiu LSM Snow model
1526!*******************************************************************
1527!---------------------------------------------------------------------------------------------------
1528!     ITIMESTEP -- Model time step index
1529!     ASNOW --  Analyzed snow water equivalent (mm)
1530!     CSNOW --  Current snow water equivalent (mm)
1531!     SNOW  --  Snow water equivalent in model (mm)
1532!     SNOWH --  Physical snow depth (m)
1533!     SNUP --   Physical snow depth (landuse dependent) where when below, snow cover is fractional
1534!
1535!     HC_SNOW -- Heat capacity of snow as a function of depth
1536!     SNOW_FRA-- Factional snow area
1537!     IFSNOW  -- Snow flag
1538!     SNOWALB -- Snow albedo
1539!---------------------------------------------------------------------------------------------------
1540!---  Arguments
1541      REAL, PARAMETER  :: W2SN_CONV   =   10.0
1542      REAL, PARAMETER  :: CS_SNOWPACK = 2092.0
1543      REAL, PARAMETER  :: SALP        =    2.6
1544!-----------------------------------------------
1545      INTEGER,       INTENT(IN)    :: ITIMESTEP
1546      REAL,          INTENT(IN)    :: ASNOW, CSNOW, SNUP, ALB, SNOALB, SHDFAC, SHDMIN
1547      REAL,          INTENT(INOUT) :: SNOW, SNOWH, SNOWC
1548      REAL,          INTENT(OUT)   :: HC_SNOW, SNOW_FRA, SNOWALB
1549!------------------------------------------------------------------------------------
1550
1551                                                   
1552!-----------------------------------------------
1553!    Local variables
1554     !... Real
1555     REAL:: CONV_WAT2SNOW, CSNOWW, RHO_SNOWPACK,   &
1556            LIQSN_RATIO, SNEQV, RSNOW
1557!-----------------------------------------------
1558             
1559     SNEQV=ASNOW*0.001                    ! Snow water in meters
1560     RHO_SNOWPACK = 450                   ! Snowpack density (kg/m3), this should be computed in the future
1561     LIQSN_RATIO  = DENW/RHO_SNOWPACK     ! Ratio of water density and snowpack density
1562     
1563     CONV_WAT2SNOW = LIQSN_RATIO/1000     ! Conversion factor for snow liquid equiv. (mm) to snowpack (m)
1564     
1565     SNOW = ASNOW                         ! Set snow water to analysis value for now, implement a nudging scheme later
1566     SNOWH= SNOW * CONV_WAT2SNOW          ! Conversion of snow water (mm) to snow depth (m)     
1567     
1568     
1569     ! Is snow cover now present. The limit is 0.45 mm of water eqivalent or about 2 inches snow depth
1570     SNOWC = 0.0
1571     IF (SNOWH .GT. 0.005) SNOWC = 1.0 
1572     
1573     HC_SNOW = RHO_SNOWPACK * CS_SNOWPACK * SNOWH
1574     
1575      IF (SNEQV < SNUP) THEN                                                 
1576         RSNOW = SNEQV / SNUP                                                   
1577         SNOW_FRA = 1. - ( EXP ( - SALP * RSNOW) - RSNOW * EXP ( - SALP))         
1578      ELSE                                                                       
1579         SNOW_FRA = 1.0                                                           
1580      END IF   
1581     
1582      SNOWC  = SNOW_FRA
1583     
1584        ! ----------------------------------------------------------------------         
1585        ! SNOALB IS ARGUMENT REPRESENTING MAXIMUM ALBEDO OVER DEEP SNOW,                 
1586        ! AS PASSED INTO SFLX, AND ADAPTED FROM THE SATELLITE-BASED MAXIMUM             
1587        ! SNOW ALBEDO FIELDS PROVIDED BY D. ROBINSON AND G. KUKLA                       
1588        ! (1985, JCAM, VOL 24, 402-411)                                                 
1589        ! ----------------------------------------------------------------------         
1590        SNOWALB = AMIN1(1.0,ALB + AMAX1(0.0,(1.0- SHDFAC -            &
1591                      (SHDMIN/100)) * SNOW_FRA * (SNOALB - ALB)))
1592
1593    END SUBROUTINE pxsnow
1594
1595END MODULE module_sf_pxlsm
1596
Note: See TracBrowser for help on using the repository browser.