source: lmdz_wrf/WRFV3/phys/module_sf_noahlsm.F @ 1

Last change on this file since 1 was 1, checked in by lfita, 10 years ago
  • -- --- Opening of the WRF+LMDZ coupling repository --- -- -

WRF: version v3.3
LMDZ: version v1818

More details in:

File size: 193.6 KB
Line 
1MODULE module_sf_noahlsm
2  USE module_model_constants
3
4!   REAL, PARAMETER    :: CP = 1004.5
5  REAL, PARAMETER      :: RD = 287.04, SIGMA = 5.67E-8,                 &
6                          CPH2O = 4.218E+3,CPICE = 2.106E+3,            &
7                          LSUBF = 3.335E+5,                             &
8                          EMISSI_S = 0.95
9
10! VEGETATION PARAMETERS
11        INTEGER :: LUCATS , BARE
12        INTEGER :: NATURAL
13        integer, PARAMETER :: NLUS=50
14        CHARACTER(LEN=256) LUTYPE
15        INTEGER, DIMENSION(1:NLUS) :: NROTBL
16        real, dimension(1:NLUS) ::  SNUPTBL, RSTBL, RGLTBL, HSTBL,                &
17                                    SHDTBL, MAXALB,                               &
18                                    EMISSMINTBL, EMISSMAXTBL,                     &
19                                    LAIMINTBL, LAIMAXTBL,                         &
20                                    Z0MINTBL, Z0MAXTBL,                           &
21                                    ALBEDOMINTBL, ALBEDOMAXTBL
22        REAL ::   TOPT_DATA,CMCMAX_DATA,CFACTR_DATA,RSMAX_DATA
23
24! SOIL PARAMETERS
25        INTEGER :: SLCATS
26        INTEGER, PARAMETER :: NSLTYPE=30
27        CHARACTER(LEN=256) SLTYPE
28        REAL, DIMENSION (1:NSLTYPE) :: BB,DRYSMC,F11,                           &
29        MAXSMC, REFSMC,SATPSI,SATDK,SATDW, WLTSMC,QTZ
30
31! LSM GENERAL PARAMETERS
32        INTEGER :: SLPCATS
33        INTEGER, PARAMETER :: NSLOPE=30
34        REAL, DIMENSION (1:NSLOPE) :: SLOPE_DATA
35        REAL ::  SBETA_DATA,FXEXP_DATA,CSOIL_DATA,SALP_DATA,REFDK_DATA,           &
36                 REFKDT_DATA,FRZK_DATA,ZBOT_DATA,  SMLOW_DATA,SMHIGH_DATA,        &
37                        CZIL_DATA
38        REAL ::  LVCOEF_DATA
39
40        CHARACTER*256  :: err_message
41
42!
43CONTAINS
44!
45
46      SUBROUTINE SFLX (FFROZP,ICE,ISURBAN,DT,ZLVL,NSOIL,SLDPTH,         &    !C
47                       LOCAL,                                           &    !L
48                       LLANDUSE, LSOIL,                                 &    !CL
49                       LWDN,SOLDN,SOLNET,SFCPRS,PRCP,SFCTMP,Q2,SFCSPD,  &    !F
50                       COSZ,PRCPRAIN, SOLARDIRECT,                      &    !F
51                       TH2,Q2SAT,DQSDT2,                                &    !I
52                       VEGTYP,SOILTYP,SLOPETYP,SHDFAC,SHDMIN,SHDMAX,    &    !I
53                       ALB, SNOALB,TBOT, Z0BRD, Z0, EMISSI, EMBRD,      &    !S
54                       CMC,T1,STC,SMC,SH2O,SNOWH,SNEQV,ALBEDO,CH,CM,    &    !H
55! ----------------------------------------------------------------------
56! OUTPUTS, DIAGNOSTICS, PARAMETERS BELOW GENERALLY NOT NECESSARY WHEN
57! COUPLED WITH E.G. A NWP MODEL (SUCH AS THE NOAA/NWS/NCEP MESOSCALE ETA
58! MODEL).  OTHER APPLICATIONS MAY REQUIRE DIFFERENT OUTPUT VARIABLES.
59! ----------------------------------------------------------------------
60                       ETA,SHEAT, ETA_KINEMATIC,FDOWN,                  &    !O
61                       EC,EDIR,ET,ETT,ESNOW,DRIP,DEW,                   &    !O
62                       BETA,ETP,SSOIL,                                  &    !O
63                       FLX1,FLX2,FLX3,                                  &    !O
64                       SNOMLT,SNCOVR,                                   &    !O
65                       RUNOFF1,RUNOFF2,RUNOFF3,                         &    !O
66                       RC,PC,RSMIN,XLAI,RCS,RCT,RCQ,RCSOIL,             &    !O
67                       SOILW,SOILM,Q1,SMAV,                             &    !D
68                       RDLAI2D,USEMONALB,                               &
69                       SNOTIME1,                                        &
70                       RIBB,                                            &
71                       SMCWLT,SMCDRY,SMCREF,SMCMAX,NROOT)                    !P
72! ----------------------------------------------------------------------
73! SUBROUTINE SFLX - UNIFIED NOAHLSM VERSION 1.0 JULY 2007
74! ----------------------------------------------------------------------
75! SUB-DRIVER FOR "Noah LSM" FAMILY OF PHYSICS SUBROUTINES FOR A
76! SOIL/VEG/SNOWPACK LAND-SURFACE MODEL TO UPDATE SOIL MOISTURE, SOIL
77! ICE, SOIL TEMPERATURE, SKIN TEMPERATURE, SNOWPACK WATER CONTENT,
78! SNOWDEPTH, AND ALL TERMS OF THE SURFACE ENERGY BALANCE AND SURFACE
79! WATER BALANCE (EXCLUDING INPUT ATMOSPHERIC FORCINGS OF DOWNWARD
80! RADIATION AND PRECIP)
81! ----------------------------------------------------------------------
82! SFLX ARGUMENT LIST KEY:
83! ----------------------------------------------------------------------
84!  C  CONFIGURATION INFORMATION
85!  L  LOGICAL
86! CL  4-string character bearing logical meaning
87!  F  FORCING DATA
88!  I  OTHER (INPUT) FORCING DATA
89!  S  SURFACE CHARACTERISTICS
90!  H  HISTORY (STATE) VARIABLES
91!  O  OUTPUT VARIABLES
92!  D  DIAGNOSTIC OUTPUT
93!  P  Parameters
94!  Msic Miscellaneous terms passed from gridded driver
95! ----------------------------------------------------------------------
96! 1. CONFIGURATION INFORMATION (C):
97! ----------------------------------------------------------------------
98!   ICE        SEA-ICE FLAG  (=1: SEA-ICE, =0: LAND (NO ICE), --1 LAND-ICE).
99!   DT         TIMESTEP (SEC) (DT SHOULD NOT EXCEED 3600 SECS, RECOMMEND
100!                1800 SECS OR LESS)
101!   ZLVL       HEIGHT (M) ABOVE GROUND OF ATMOSPHERIC FORCING VARIABLES
102!   NSOIL      NUMBER OF SOIL LAYERS (AT LEAST 2, AND NOT GREATER THAN
103!                PARAMETER NSOLD SET BELOW)
104!   SLDPTH     THE THICKNESS OF EACH SOIL LAYER (M)
105! ----------------------------------------------------------------------
106! 2. LOGICAL:
107! ----------------------------------------------------------------------
108!   LCH       Exchange coefficient (Ch) calculation flag (false: using
109!                ch-routine SFCDIF; true: Ch is brought in)
110!   LOCAL      Flag for local-site simulation (where there is no
111!              maps for albedo, veg fraction, and roughness
112!             true:  all LSM parameters (inluding albedo, veg fraction and
113!                    roughness length) will be defined by three tables
114!   LLANDUSE  (=USGS, using USGS landuse classification)
115!   LSOIL     (=STAS, using FAO/STATSGO soil texture classification)
116! ----------------------------------------------------------------------
117! 3. FORCING DATA (F):
118! ----------------------------------------------------------------------
119!   LWDN       LW DOWNWARD RADIATION (W M-2; POSITIVE, NOT NET LONGWAVE)
120!   SOLDN      SOLAR DOWNWARD RADIATION (W M-2; POSITIVE, NOT NET SOLAR)
121!   SOLNET     NET DOWNWARD SOLAR RADIATION ((W M-2; POSITIVE)
122!   SFCPRS     PRESSURE AT HEIGHT ZLVL ABOVE GROUND (PASCALS)
123!   PRCP       PRECIP RATE (KG M-2 S-1) (NOTE, THIS IS A RATE)
124!   SFCTMP     AIR TEMPERATURE (K) AT HEIGHT ZLVL ABOVE GROUND
125!   TH2        AIR POTENTIAL TEMPERATURE (K) AT HEIGHT ZLVL ABOVE GROUND
126!   Q2         MIXING RATIO AT HEIGHT ZLVL ABOVE GROUND (KG KG-1)
127!   COSZ       Solar zenith angle (not used for now)
128!   PRCPRAIN   Liquid-precipitation rate (KG M-2 S-1) (not used)
129! SOLARDIRECT  Direct component of downward solar radiation (W M-2) (not used)
130!   FFROZP     FRACTION OF FROZEN PRECIPITATION
131! ----------------------------------------------------------------------
132! 4. OTHER FORCING (INPUT) DATA (I):
133! ----------------------------------------------------------------------
134!   SFCSPD     WIND SPEED (M S-1) AT HEIGHT ZLVL ABOVE GROUND
135!   Q2SAT      SAT SPECIFIC HUMIDITY AT HEIGHT ZLVL ABOVE GROUND (KG KG-1)
136!   DQSDT2     SLOPE OF SAT SPECIFIC HUMIDITY CURVE AT T=SFCTMP
137!                (KG KG-1 K-1)
138! ----------------------------------------------------------------------
139! 5. CANOPY/SOIL CHARACTERISTICS (S):
140! ----------------------------------------------------------------------
141!   VEGTYP     VEGETATION TYPE (INTEGER INDEX)
142!   SOILTYP    SOIL TYPE (INTEGER INDEX)
143!   SLOPETYP   CLASS OF SFC SLOPE (INTEGER INDEX)
144!   SHDFAC     AREAL FRACTIONAL COVERAGE OF GREEN VEGETATION
145!                (FRACTION= 0.0-1.0)
146!   SHDMIN     MINIMUM AREAL FRACTIONAL COVERAGE OF GREEN VEGETATION
147!                (FRACTION= 0.0-1.0) <= SHDFAC
148!   PTU        PHOTO THERMAL UNIT (PLANT PHENOLOGY FOR ANNUALS/CROPS)
149!                (NOT YET USED, BUT PASSED TO REDPRM FOR FUTURE USE IN
150!                VEG PARMS)
151!   ALB        BACKROUND SNOW-FREE SURFACE ALBEDO (FRACTION), FOR JULIAN
152!                DAY OF YEAR (USUALLY FROM TEMPORAL INTERPOLATION OF
153!                MONTHLY MEAN VALUES' CALLING PROG MAY OR MAY NOT
154!                INCLUDE DIURNAL SUN ANGLE EFFECT)
155!   SNOALB     UPPER BOUND ON MAXIMUM ALBEDO OVER DEEP SNOW (E.G. FROM
156!                ROBINSON AND KUKLA, 1985, J. CLIM. & APPL. METEOR.)
157!   TBOT       BOTTOM SOIL TEMPERATURE (LOCAL YEARLY-MEAN SFC AIR
158!                TEMPERATURE)
159!   Z0BRD      Background fixed roughness length (M)
160!   Z0         Time varying roughness length (M) as function of snow depth
161!
162!   EMBRD      Background surface emissivity (between 0 and 1)
163!   EMISSI     Surface emissivity (between 0 and 1)
164! ----------------------------------------------------------------------
165! 6. HISTORY (STATE) VARIABLES (H):
166! ----------------------------------------------------------------------
167!  CMC         CANOPY MOISTURE CONTENT (M)
168!  T1          GROUND/CANOPY/SNOWPACK) EFFECTIVE SKIN TEMPERATURE (K)
169!  STC(NSOIL)  SOIL TEMP (K)
170!  SMC(NSOIL)  TOTAL SOIL MOISTURE CONTENT (VOLUMETRIC FRACTION)
171!  SH2O(NSOIL) UNFROZEN SOIL MOISTURE CONTENT (VOLUMETRIC FRACTION)
172!                NOTE: FROZEN SOIL MOISTURE = SMC - SH2O
173!  SNOWH       ACTUAL SNOW DEPTH (M)
174!  SNEQV       LIQUID WATER-EQUIVALENT SNOW DEPTH (M)
175!                NOTE: SNOW DENSITY = SNEQV/SNOWH
176!  ALBEDO      SURFACE ALBEDO INCLUDING SNOW EFFECT (UNITLESS FRACTION)
177!                =SNOW-FREE ALBEDO (ALB) WHEN SNEQV=0, OR
178!                =FCT(MSNOALB,ALB,VEGTYP,SHDFAC,SHDMIN) WHEN SNEQV>0
179!  CH          SURFACE EXCHANGE COEFFICIENT FOR HEAT AND MOISTURE
180!                (M S-1); NOTE: CH IS TECHNICALLY A CONDUCTANCE SINCE
181!                IT HAS BEEN MULTIPLIED BY WIND SPEED.
182!  CM          SURFACE EXCHANGE COEFFICIENT FOR MOMENTUM (M S-1); NOTE:
183!                CM IS TECHNICALLY A CONDUCTANCE SINCE IT HAS BEEN
184!                MULTIPLIED BY WIND SPEED.
185! ----------------------------------------------------------------------
186! 7. OUTPUT (O):
187! ----------------------------------------------------------------------
188! OUTPUT VARIABLES NECESSARY FOR A COUPLED NUMERICAL WEATHER PREDICTION
189! MODEL, E.G. NOAA/NWS/NCEP MESOSCALE ETA MODEL.  FOR THIS APPLICATION,
190! THE REMAINING OUTPUT/DIAGNOSTIC/PARAMETER BLOCKS BELOW ARE NOT
191! NECESSARY.  OTHER APPLICATIONS MAY REQUIRE DIFFERENT OUTPUT VARIABLES.
192!   ETA        ACTUAL LATENT HEAT FLUX (W m-2: NEGATIVE, IF UP FROM
193!              SURFACE)
194!  ETA_KINEMATIC atctual latent heat flux in Kg m-2 s-1
195!   SHEAT      SENSIBLE HEAT FLUX (W M-2: NEGATIVE, IF UPWARD FROM
196!              SURFACE)
197!   FDOWN      Radiation forcing at the surface (W m-2) = SOLDN*(1-alb)+LWDN
198! ----------------------------------------------------------------------
199!   EC         CANOPY WATER EVAPORATION (W m-2)
200!   EDIR       DIRECT SOIL EVAPORATION (W m-2)
201!   ET(NSOIL)  PLANT TRANSPIRATION FROM A PARTICULAR ROOT (SOIL) LAYER
202!                 (W m-2)
203!   ETT        TOTAL PLANT TRANSPIRATION (W m-2)
204!   ESNOW      SUBLIMATION FROM (OR DEPOSITION TO IF <0) SNOWPACK
205!                (W m-2)
206!   DRIP       THROUGH-FALL OF PRECIP AND/OR DEW IN EXCESS OF CANOPY
207!                WATER-HOLDING CAPACITY (M)
208!   DEW        DEWFALL (OR FROSTFALL FOR T<273.15) (M)
209! ----------------------------------------------------------------------
210!   BETA       RATIO OF ACTUAL/POTENTIAL EVAP (DIMENSIONLESS)
211!   ETP        POTENTIAL EVAPORATION (W m-2)
212!   SSOIL      SOIL HEAT FLUX (W M-2: NEGATIVE IF DOWNWARD FROM SURFACE)
213! ----------------------------------------------------------------------
214!   FLX1       PRECIP-SNOW SFC (W M-2)
215!   FLX2       FREEZING RAIN LATENT HEAT FLUX (W M-2)
216!   FLX3       PHASE-CHANGE HEAT FLUX FROM SNOWMELT (W M-2)
217! ----------------------------------------------------------------------
218!   SNOMLT     SNOW MELT (M) (WATER EQUIVALENT)
219!   SNCOVR     FRACTIONAL SNOW COVER (UNITLESS FRACTION, 0-1)
220! ----------------------------------------------------------------------
221!   RUNOFF1    SURFACE RUNOFF (M S-1), NOT INFILTRATING THE SURFACE
222!   RUNOFF2    SUBSURFACE RUNOFF (M S-1), DRAINAGE OUT BOTTOM OF LAST
223!                SOIL LAYER (BASEFLOW)
224!   RUNOFF3    NUMERICAL TRUNCTATION IN EXCESS OF POROSITY (SMCMAX)
225!                FOR A GIVEN SOIL LAYER AT THE END OF A TIME STEP (M S-1).
226! Note: the above RUNOFF2 is actually the sum of RUNOFF2 and RUNOFF3
227! ----------------------------------------------------------------------
228!   RC         CANOPY RESISTANCE (S M-1)
229!   PC         PLANT COEFFICIENT (UNITLESS FRACTION, 0-1) WHERE PC*ETP
230!                = ACTUAL TRANSP
231!   XLAI       LEAF AREA INDEX (DIMENSIONLESS)
232!   RSMIN      MINIMUM CANOPY RESISTANCE (S M-1)
233!   RCS        INCOMING SOLAR RC FACTOR (DIMENSIONLESS)
234!   RCT        AIR TEMPERATURE RC FACTOR (DIMENSIONLESS)
235!   RCQ        ATMOS VAPOR PRESSURE DEFICIT RC FACTOR (DIMENSIONLESS)
236!   RCSOIL     SOIL MOISTURE RC FACTOR (DIMENSIONLESS)
237! ----------------------------------------------------------------------
238! 8. DIAGNOSTIC OUTPUT (D):
239! ----------------------------------------------------------------------
240!   SOILW      AVAILABLE SOIL MOISTURE IN ROOT ZONE (UNITLESS FRACTION
241!              BETWEEN SMCWLT AND SMCMAX)
242!   SOILM      TOTAL SOIL COLUMN MOISTURE CONTENT (FROZEN+UNFROZEN) (M)
243!   Q1         Effective mixing ratio at surface (kg kg-1), used for
244!              diagnosing the mixing ratio at 2 meter for coupled model
245!   SMAV       Soil Moisture Availability for each layer, as a fraction
246!              between SMCWLT and SMCMAX.
247!  Documentation for SNOTIME1 and SNOABL2 ?????
248!  What categories of arguments do these variables fall into ????
249!  Documentation for RIBB ?????
250!  What category of argument does RIBB fall into ?????
251! ----------------------------------------------------------------------
252! 9. PARAMETERS (P):
253! ----------------------------------------------------------------------
254!   SMCWLT     WILTING POINT (VOLUMETRIC)
255!   SMCDRY     DRY SOIL MOISTURE THRESHOLD WHERE DIRECT EVAP FRM TOP
256!                LAYER ENDS (VOLUMETRIC)
257!   SMCREF     SOIL MOISTURE THRESHOLD WHERE TRANSPIRATION BEGINS TO
258!                STRESS (VOLUMETRIC)
259!   SMCMAX     POROSITY, I.E. SATURATED VALUE OF SOIL MOISTURE
260!                (VOLUMETRIC)
261!   NROOT      NUMBER OF ROOT LAYERS, A FUNCTION OF VEG TYPE, DETERMINED
262!              IN SUBROUTINE REDPRM.
263! ----------------------------------------------------------------------
264
265
266      IMPLICIT NONE
267! ----------------------------------------------------------------------
268
269! DECLARATIONS - LOGICAL AND CHARACTERS
270! ----------------------------------------------------------------------
271      LOGICAL, INTENT(IN)::  LOCAL
272      LOGICAL            ::  FRZGRA, SNOWNG
273      CHARACTER (LEN=256), INTENT(IN)::  LLANDUSE, LSOIL
274
275! ----------------------------------------------------------------------
276! 1. CONFIGURATION INFORMATION (C):
277! ----------------------------------------------------------------------
278      INTEGER,INTENT(IN) ::  ICE,NSOIL,SLOPETYP,SOILTYP,VEGTYP
279      INTEGER, INTENT(IN) :: ISURBAN
280      INTEGER,INTENT(OUT)::  NROOT
281      INTEGER  KZ, K, iout
282
283! ----------------------------------------------------------------------
284! 2. LOGICAL:
285! ----------------------------------------------------------------------
286      LOGICAL, INTENT(IN) :: RDLAI2D
287      LOGICAL, INTENT(IN) :: USEMONALB
288
289      REAL, INTENT(IN)   :: SHDMIN,SHDMAX,DT,DQSDT2,LWDN,PRCP,PRCPRAIN,     &
290                            Q2,Q2SAT,SFCPRS,SFCSPD,SFCTMP, SNOALB,          &
291                            SOLDN,SOLNET,TBOT,TH2,ZLVL,                            &
292                            FFROZP
293      REAL, INTENT(OUT)  :: EMBRD
294      REAL, INTENT(OUT)  :: ALBEDO
295      REAL, INTENT(INOUT):: COSZ, SOLARDIRECT,CH,CM,                        &
296                            CMC,SNEQV,SNCOVR,SNOWH,T1,XLAI,SHDFAC,Z0BRD,    &
297                            EMISSI, ALB
298      REAL, INTENT(INOUT):: SNOTIME1
299      REAL, INTENT(INOUT):: RIBB
300      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SLDPTH
301      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: ET
302      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: SMAV
303      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) ::  SH2O, SMC, STC
304      REAL,DIMENSION(1:NSOIL)::   RTDIS, ZSOIL
305
306      REAL,INTENT(OUT)   :: ETA_KINEMATIC,BETA,DEW,DRIP,EC,EDIR,ESNOW,ETA,  &
307                            ETP,FLX1,FLX2,FLX3,SHEAT,PC,RUNOFF1,RUNOFF2,    &
308                            RUNOFF3,RC,RSMIN,RCQ,RCS,RCSOIL,RCT,SSOIL,      &
309                            SMCDRY,SMCMAX,SMCREF,SMCWLT,SNOMLT, SOILM,      &
310                            SOILW,FDOWN,Q1
311      REAL :: BEXP,CFACTR,CMCMAX,CSOIL,CZIL,DF1,DF1H,DF1A,DKSAT,DWSAT,      &
312              DSOIL,DTOT,ETT,FRCSNO,FRCSOI,EPSCA,F1,FXEXP,FRZX,HS,          &
313              KDT,LVH2O,PRCP1,PSISAT,QUARTZ,R,RCH,REFKDT,RR,RGL,            &
314              RSMAX,                                                        &
315              RSNOW,SNDENS,SNCOND,SBETA,SN_NEW,SLOPE,SNUP,SALP,SOILWM,      &
316              SOILWW,T1V,T24,T2V,TH2V,TOPT,TFREEZ,TSNOW,ZBOT,Z0,PRCPF,      &
317              ETNS,PTU,LSUBS
318        REAL ::  LVCOEF
319      REAL :: INTERP_FRACTION
320      REAL :: LAIMIN,    LAIMAX
321      REAL :: ALBEDOMIN, ALBEDOMAX
322      REAL :: EMISSMIN,  EMISSMAX
323      REAL :: Z0MIN,     Z0MAX
324
325! ----------------------------------------------------------------------
326! DECLARATIONS - PARAMETERS
327! ----------------------------------------------------------------------
328      PARAMETER (TFREEZ = 273.15)
329      PARAMETER (LVH2O = 2.501E+6)
330      PARAMETER (LSUBS = 2.83E+6)
331      PARAMETER (R = 287.04)
332! ----------------------------------------------------------------------
333!   INITIALIZATION
334! ----------------------------------------------------------------------
335         RUNOFF1 = 0.0
336         RUNOFF2 = 0.0
337         RUNOFF3 = 0.0
338         SNOMLT = 0.0
339
340! ----------------------------------------------------------------------
341!  THE VARIABLE "ICE" IS A FLAG DENOTING SEA-ICE / LAND-ICE / ICE-FREE LAND
342!     SEA-ICE CASE,          ICE =  1
343!     NON-GLACIAL LAND,      ICE =  0
344!     GLACIAL-ICE LAND,      ICE = -1
345      IF (ICE /= 0) SHDFAC = 0.0
346! ----------------------------------------------------------------------
347! SEA-ICE LAYERS ARE EQUAL THICKNESS AND SUM TO 3 METERS
348! ----------------------------------------------------------------------
349         IF (ICE == 1) THEN
350            DO KZ = 1,NSOIL
351               ZSOIL (KZ) = -3.* FLOAT (KZ)/ FLOAT (NSOIL)
352            END DO
353
354! ----------------------------------------------------------------------
355! CALCULATE DEPTH (NEGATIVE) BELOW GROUND FROM TOP SKIN SFC TO BOTTOM OF
356!   EACH SOIL LAYER.  NOTE:  SIGN OF ZSOIL IS NEGATIVE (DENOTING BELOW
357!   GROUND)
358! ----------------------------------------------------------------------
359         ELSE
360            ZSOIL (1) = - SLDPTH (1)
361            DO KZ = 2,NSOIL
362               ZSOIL (KZ) = - SLDPTH (KZ) + ZSOIL (KZ -1)
363            END DO
364         END IF
365! ----------------------------------------------------------------------
366! NEXT IS CRUCIAL CALL TO SET THE LAND-SURFACE PARAMETERS, INCLUDING
367! SOIL-TYPE AND VEG-TYPE DEPENDENT PARAMETERS.
368! ----------------------------------------------------------------------
369         CALL REDPRM (VEGTYP,SOILTYP,SLOPETYP,CFACTR,CMCMAX,RSMAX,TOPT,   &
370                       REFKDT,KDT,SBETA, SHDFAC,RSMIN,RGL,HS,ZBOT,FRZX,    &
371                         PSISAT,SLOPE,SNUP,SALP,BEXP,DKSAT,DWSAT,          &
372                         SMCMAX,SMCWLT,SMCREF,SMCDRY,F1,QUARTZ,FXEXP,      &
373                         RTDIS,SLDPTH,ZSOIL,NROOT,NSOIL,CZIL,              &
374                         LAIMIN, LAIMAX, EMISSMIN, EMISSMAX, ALBEDOMIN,    &
375                         ALBEDOMAX, Z0MIN, Z0MAX, CSOIL, PTU, LLANDUSE,    &
376                         LSOIL,LOCAL,LVCOEF)
377
378!urban
379         IF(VEGTYP==ISURBAN)THEN
380              SHDFAC=0.05
381              RSMIN=400.0
382              SMCMAX = 0.45
383              SMCREF = 0.42
384              SMCWLT = 0.40
385              SMCDRY = 0.40
386         ENDIF
387
388         IF ( SHDFAC >= SHDMAX ) THEN
389            EMBRD = EMISSMAX
390            IF (.NOT. RDLAI2D) THEN
391               XLAI  = LAIMAX
392            ENDIF
393            IF (.NOT. USEMONALB) THEN
394               ALB   = ALBEDOMIN
395            ENDIF
396            Z0BRD = Z0MAX
397         ELSE IF ( SHDFAC <= SHDMIN ) THEN
398            EMBRD = EMISSMIN
399            IF(.NOT. RDLAI2D) THEN
400               XLAI  = LAIMIN
401            ENDIF
402            IF(.NOT. USEMONALB) then
403               ALB   = ALBEDOMAX
404            ENDIF
405            Z0BRD = Z0MIN
406         ELSE
407
408            IF ( SHDMAX > SHDMIN ) THEN
409
410               INTERP_FRACTION = ( SHDFAC - SHDMIN ) / ( SHDMAX - SHDMIN )
411               ! Bound INTERP_FRACTION between 0 and 1
412               INTERP_FRACTION = MIN ( INTERP_FRACTION, 1.0 )
413               INTERP_FRACTION = MAX ( INTERP_FRACTION, 0.0 )
414               ! Scale Emissivity and LAI between EMISSMIN and EMISSMAX by INTERP_FRACTION
415               EMBRD = ( ( 1.0 - INTERP_FRACTION ) * EMISSMIN  ) + ( INTERP_FRACTION * EMISSMAX  )
416               IF (.NOT. RDLAI2D) THEN
417                  XLAI  = ( ( 1.0 - INTERP_FRACTION ) * LAIMIN    ) + ( INTERP_FRACTION * LAIMAX    )
418               ENDIF
419               if (.not. USEMONALB) then
420                  ALB   = ( ( 1.0 - INTERP_FRACTION ) * ALBEDOMAX ) + ( INTERP_FRACTION * ALBEDOMIN )
421               endif
422               Z0BRD = ( ( 1.0 - INTERP_FRACTION ) * Z0MIN     ) + ( INTERP_FRACTION * Z0MAX     )
423
424            ELSE
425
426               EMBRD = 0.5 * EMISSMIN  + 0.5 * EMISSMAX
427               IF (.NOT. RDLAI2D) THEN
428                  XLAI  = 0.5 * LAIMIN    + 0.5 * LAIMAX
429               ENDIF
430               if (.not. USEMONALB) then
431                  ALB   = 0.5 * ALBEDOMIN + 0.5 * ALBEDOMAX
432               endif
433               Z0BRD = 0.5 * Z0MIN     + 0.5 * Z0MAX
434
435            ENDIF
436
437         ENDIF
438! ----------------------------------------------------------------------
439!  INITIALIZE PRECIPITATION LOGICALS.
440! ----------------------------------------------------------------------
441         SNOWNG = .FALSE.
442         FRZGRA = .FALSE.
443
444! ----------------------------------------------------------------------
445! OVER SEA-ICE OR GLACIAL-ICE, IF S.W.E. (SNEQV) BELOW THRESHOLD LOWER
446! BOUND (0.01 M FOR SEA-ICE, 0.10 M FOR GLACIAL-ICE), THEN SET AT LOWER
447! BOUND
448! ----------------------------------------------------------------------
449! IF SEA-ICE CASE, ASSIGN DEFAULT WATER-EQUIV SNOW ON TOP
450! ----------------------------------------------------------------------
451         IF (ICE == 1) THEN
452            ! Sea-ice case
453            IF ( SNEQV < 0.01 ) THEN
454               SNEQV = 0.01
455               SNOWH = 0.05
456            ENDIF
457         ELSE IF ( ICE == -1 ) THEN
458            ! Land-ice case
459            IF ( SNEQV < 0.10 ) THEN
460               SNEQV = 0.10
461               SNOWH = 0.50
462            ENDIF
463         END IF
464! ----------------------------------------------------------------------
465! FOR SEA-ICE AND GLACIAL-ICE CASES, SET SMC AND SH20 VALUES = 1.0
466! ----------------------------------------------------------------------
467         IF ( ICE /= 0 ) THEN
468            DO KZ = 1,NSOIL
469               SMC(KZ) = 1.0
470               SH2O(KZ) = 1.0
471            END DO
472         ENDIF
473! ----------------------------------------------------------------------
474! IF INPUT SNOWPACK IS NONZERO, THEN COMPUTE SNOW DENSITY "SNDENS" AND
475!   SNOW THERMAL CONDUCTIVITY "SNCOND" (NOTE THAT CSNOW IS A FUNCTION
476!   SUBROUTINE)
477! ----------------------------------------------------------------------
478         IF ( SNEQV <= 1.E-7 ) THEN ! safer IF  kmh (2008/03/25)
479            SNEQV = 0.0
480            SNDENS = 0.0
481            SNOWH = 0.0
482            SNCOND = 1.0
483         ELSE
484            SNDENS = SNEQV / SNOWH
485            IF(SNDENS > 1.0) THEN
486             CALL wrf_error_fatal ( 'Physical snow depth is less than snow water equiv.' )
487            ENDIF
488            CALL CSNOW (SNCOND,SNDENS)
489         END IF
490! ----------------------------------------------------------------------
491! DETERMINE IF IT'S PRECIPITATING AND WHAT KIND OF PRECIP IT IS.
492! IF IT'S PRCPING AND THE AIR TEMP IS COLDER THAN 0 C, IT'S SNOWING!
493! IF IT'S PRCPING AND THE AIR TEMP IS WARMER THAN 0 C, BUT THE GRND
494! TEMP IS COLDER THAN 0 C, FREEZING RAIN IS PRESUMED TO BE FALLING.
495! ----------------------------------------------------------------------
496         IF (PRCP > 0.0) THEN
497! snow defined when fraction of frozen precip (FFROZP) > 0.5,
498! passed in from model microphysics.
499            IF (FFROZP .GT. 0.5) THEN
500               SNOWNG = .TRUE.
501            ELSE
502               IF (T1 <= TFREEZ) FRZGRA = .TRUE.
503            END IF
504         END IF
505! ----------------------------------------------------------------------
506! IF EITHER PRCP FLAG IS SET, DETERMINE NEW SNOWFALL (CONVERTING PRCP
507! RATE FROM KG M-2 S-1 TO A LIQUID EQUIV SNOW DEPTH IN METERS) AND ADD
508! IT TO THE EXISTING SNOWPACK.
509! NOTE THAT SINCE ALL PRECIP IS ADDED TO SNOWPACK, NO PRECIP INFILTRATES
510! INTO THE SOIL SO THAT PRCP1 IS SET TO ZERO.
511! ----------------------------------------------------------------------
512         IF ( (SNOWNG) .OR. (FRZGRA) ) THEN
513            SN_NEW = PRCP * DT * 0.001
514            SNEQV = SNEQV + SN_NEW
515            PRCPF = 0.0
516
517! ----------------------------------------------------------------------
518! UPDATE SNOW DENSITY BASED ON NEW SNOWFALL, USING OLD AND NEW SNOW.
519! UPDATE SNOW THERMAL CONDUCTIVITY
520! ----------------------------------------------------------------------
521            CALL SNOW_NEW (SFCTMP,SN_NEW,SNOWH,SNDENS)
522!
523! kmh 09/04/2006 set Snow Density at 0.2 g/cm**3
524! for "cold permanent ice" or new "dry" snow
525!
526           IF ( (ICE /= 0) .and. SNCOVR .GT. 0.99 ) THEN
527!  if soil temperature less than 268.15 K, treat as typical Antarctic/Greenland snow firn
528              IF ( STC(1) .LT. (TFREEZ - 5.) ) SNDENS = 0.2
529              IF ( SNOWNG .AND. (T1.LT.273.) .AND. (SFCTMP.LT.273.) ) SNDENS=0.2
530           ENDIF
531!
532            CALL CSNOW (SNCOND,SNDENS)
533
534! ----------------------------------------------------------------------
535! PRECIP IS LIQUID (RAIN), HENCE SAVE IN THE PRECIP VARIABLE THAT
536! LATER CAN WHOLELY OR PARTIALLY INFILTRATE THE SOIL (ALONG WITH
537! ANY CANOPY "DRIP" ADDED TO THIS LATER)
538! ----------------------------------------------------------------------
539         ELSE
540            PRCPF = PRCP
541         END IF
542! ----------------------------------------------------------------------
543! DETERMINE SNOWCOVER AND ALBEDO OVER LAND.
544! ----------------------------------------------------------------------
545! ----------------------------------------------------------------------
546! IF SNOW DEPTH=0, SET SNOW FRACTION=0, ALBEDO=SNOW FREE ALBEDO.
547! ----------------------------------------------------------------------
548         IF (ICE == 0 .OR. ICE == -1) THEN
549            IF (SNEQV  == 0.0) THEN
550               SNCOVR = 0.0
551               ALBEDO = ALB
552               EMISSI = EMBRD
553            ELSE
554! ----------------------------------------------------------------------
555! DETERMINE SNOW FRACTIONAL COVERAGE.
556! DETERMINE SURFACE ALBEDO MODIFICATION DUE TO SNOWDEPTH STATE.
557! ----------------------------------------------------------------------
558              CALL SNFRAC (SNEQV,SNUP,SALP,SNOWH,SNCOVR)
559!   Don't limit snow cover fraction over permanent ice kmh 2008/03/25
560            if ( ICE == 0 ) then
561              SNCOVR = MIN(SNCOVR,0.98)
562            endif
563              CALL ALCALC (ALB,SNOALB,EMBRD,SHDFAC,SHDMIN,SNCOVR,T1,ALBEDO,EMISSI,   &
564                         DT,SNOWNG,SNOTIME1,LVCOEF)
565            END IF
566! ----------------------------------------------------------------------
567! SNOW COVER, ALBEDO OVER SEA-ICE, GLACIAL ICE
568! ----------------------------------------------------------------------
569         ELSE
570            SNCOVR = 1.0
571!
572! Albedo of sea ice
573!
574! This value should vary seasonally. 0.65 may be good for Arctic Ocean summer bare ice
575!   value could be as low as 0.4 for Arctic bare ice and melt pond combo (Perovich data)
576!   0.82 may be good for Arctic spring/fall sea ice (Perovich data)
577!   0.81 may be good for Antarctic sea ice (Wendler et al. December cruise data)
578!
579            ALBEDO = 0.80
580!
581            EMISSI = 0.98
582         END IF
583! ----------------------------------------------------------------------
584! THERMAL CONDUCTIVITY FOR SEA-ICE CASE, GLACIAL-ICE CASE
585! ----------------------------------------------------------------------
586         IF ( (ICE == 1) .or. (ICE == -1) ) THEN
587            DF1 = 2.2
588!
589! kmh 09/03/2006
590! kmh 03/25/2008  change SNCOVR threshold to 0.97
591!
592! only apply (small) DF1 conductivity for permanent land ice
593            IF ( (ICE == -1) ) THEN
594               IF (  SNCOVR .GT. 0.97 ) THEN
595                  DF1 = SNCOND
596               ENDIF
597            ENDIF
598!
599         ELSE
600! ----------------------------------------------------------------------
601! NEXT CALCULATE THE SUBSURFACE HEAT FLUX, WHICH FIRST REQUIRES
602! CALCULATION OF THE THERMAL DIFFUSIVITY.  TREATMENT OF THE
603! LATTER FOLLOWS THAT ON PAGES 148-149 FROM "HEAT TRANSFER IN
604! COLD CLIMATES", BY V. J. LUNARDINI (PUBLISHED IN 1981
605! BY VAN NOSTRAND REINHOLD CO.) I.E. TREATMENT OF TWO CONTIGUOUS
606! "PLANE PARALLEL" MEDIUMS (NAMELY HERE THE FIRST SOIL LAYER
607! AND THE SNOWPACK LAYER, IF ANY). THIS DIFFUSIVITY TREATMENT
608! BEHAVES WELL FOR BOTH ZERO AND NONZERO SNOWPACK, INCLUDING THE
609! LIMIT OF VERY THIN SNOWPACK.  THIS TREATMENT ALSO ELIMINATES
610! THE NEED TO IMPOSE AN ARBITRARY UPPER BOUND ON SUBSURFACE
611! HEAT FLUX WHEN THE SNOWPACK BECOMES EXTREMELY THIN.
612! ----------------------------------------------------------------------
613! FIRST CALCULATE THERMAL DIFFUSIVITY OF TOP SOIL LAYER, USING
614! BOTH THE FROZEN AND LIQUID SOIL MOISTURE, FOLLOWING THE
615! SOIL THERMAL DIFFUSIVITY FUNCTION OF PETERS-LIDARD ET AL.
616! (1998,JAS, VOL 55, 1209-1224), WHICH REQUIRES THE SPECIFYING
617! THE QUARTZ CONTENT OF THE GIVEN SOIL CLASS (SEE ROUTINE REDPRM)
618! ----------------------------------------------------------------------
619! ----------------------------------------------------------------------
620! NEXT ADD SUBSURFACE HEAT FLUX REDUCTION EFFECT FROM THE
621! OVERLYING GREEN CANOPY, ADAPTED FROM SECTION 2.1.2 OF
622! PETERS-LIDARD ET AL. (1997, JGR, VOL 102(D4))
623! ----------------------------------------------------------------------
624            CALL TDFCND (DF1,SMC (1),QUARTZ,SMCMAX,SH2O (1))
625
626!urban
627            IF ( VEGTYP == ISURBAN ) DF1=3.24
628
629            DF1 = DF1 * EXP (SBETA * SHDFAC)
630!
631! kmh 09/03/2006
632! kmh 03/25/2008  change SNCOVR threshold to 0.97
633!
634            IF (  SNCOVR .GT. 0.97 ) THEN
635               DF1 = SNCOND
636            ENDIF
637!
638! ----------------------------------------------------------------------
639! FINALLY "PLANE PARALLEL" SNOWPACK EFFECT FOLLOWING
640! V.J. LINARDINI REFERENCE CITED ABOVE. NOTE THAT DTOT IS
641! COMBINED DEPTH OF SNOWDEPTH AND THICKNESS OF FIRST SOIL LAYER
642! ----------------------------------------------------------------------
643         END IF
644
645         DSOIL = - (0.5 * ZSOIL (1))
646         IF (SNEQV == 0.) THEN
647            SSOIL = DF1 * (T1- STC (1) ) / DSOIL
648         ELSE
649            DTOT = SNOWH + DSOIL
650            FRCSNO = SNOWH / DTOT
651
652! 1. HARMONIC MEAN (SERIES FLOW)
653!        DF1 = (SNCOND*DF1)/(FRCSOI*SNCOND+FRCSNO*DF1)
654            FRCSOI = DSOIL / DTOT
655! 2. ARITHMETIC MEAN (PARALLEL FLOW)
656!        DF1 = FRCSNO*SNCOND + FRCSOI*DF1
657            DF1H = (SNCOND * DF1)/ (FRCSOI * SNCOND+ FRCSNO * DF1)
658
659! 3. GEOMETRIC MEAN (INTERMEDIATE BETWEEN HARMONIC AND ARITHMETIC MEAN)
660!        DF1 = (SNCOND**FRCSNO)*(DF1**FRCSOI)
661! weigh DF by snow fraction
662!        DF1 = DF1H*SNCOVR + DF1A*(1.0-SNCOVR)
663!        DF1 = DF1H*SNCOVR + DF1*(1.0-SNCOVR)
664            DF1A = FRCSNO * SNCOND+ FRCSOI * DF1
665
666! ----------------------------------------------------------------------
667! CALCULATE SUBSURFACE HEAT FLUX, SSOIL, FROM FINAL THERMAL DIFFUSIVITY
668! OF SURFACE MEDIUMS, DF1 ABOVE, AND SKIN TEMPERATURE AND TOP
669! MID-LAYER SOIL TEMPERATURE
670! ----------------------------------------------------------------------
671            DF1 = DF1A * SNCOVR + DF1* (1.0- SNCOVR)
672            IF ( ICE /= 0 ) then
673               !  kmh  12/15/2005  correct for too deep snow layer
674               !  kmh  09/03/2006  adjust DTOT
675               IF ( DTOT .GT. 2.*DSOIL ) then
676                  DTOT = 2.*DSOIL
677               ENDIF
678            ENDIF
679            SSOIL = DF1 * (T1- STC (1) ) / DTOT
680         END IF
681! ----------------------------------------------------------------------
682! DETERMINE SURFACE ROUGHNESS OVER SNOWPACK USING SNOW CONDITION FROM
683! THE PREVIOUS TIMESTEP.
684! ----------------------------------------------------------------------
685         IF (SNCOVR  > 0. ) THEN
686            CALL SNOWZ0 (SNCOVR,Z0,Z0BRD,SNOWH)
687         ELSE
688            Z0=Z0BRD
689         END IF
690! ----------------------------------------------------------------------
691! NEXT CALL ROUTINE SFCDIF TO CALCULATE THE SFC EXCHANGE COEF (CH) FOR
692! HEAT AND MOISTURE.
693
694! NOTE !!!
695! DO NOT CALL SFCDIF UNTIL AFTER ABOVE CALL TO REDPRM, IN CASE
696! ALTERNATIVE VALUES OF ROUGHNESS LENGTH (Z0) AND ZILINTINKEVICH COEF
697! (CZIL) ARE SET THERE VIA NAMELIST I/O.
698
699! NOTE !!!
700! ROUTINE SFCDIF RETURNS A CH THAT REPRESENTS THE WIND SPD TIMES THE
701! "ORIGINAL" NONDIMENSIONAL "Ch" TYPICAL IN LITERATURE.  HENCE THE CH
702! RETURNED FROM SFCDIF HAS UNITS OF M/S.  THE IMPORTANT COMPANION
703! COEFFICIENT OF CH, CARRIED HERE AS "RCH", IS THE CH FROM SFCDIF TIMES
704! AIR DENSITY AND PARAMETER "CP".  "RCH" IS COMPUTED IN "CALL PENMAN".
705! RCH RATHER THAN CH IS THE COEFF USUALLY INVOKED LATER IN EQNS.
706
707! NOTE !!!
708! ----------------------------------------------------------------------
709! SFCDIF ALSO RETURNS THE SURFACE EXCHANGE COEFFICIENT FOR MOMENTUM, CM,
710! ALSO KNOWN AS THE SURFACE DRAGE COEFFICIENT. Needed as a state variable
711! for iterative/implicit solution of CH in SFCDIF
712! ----------------------------------------------------------------------
713!        IF(.NOT.LCH) THEN
714!          T1V = T1 * (1.0+ 0.61 * Q2)
715!          TH2V = TH2 * (1.0+ 0.61 * Q2)
716!          CALL SFCDIF_off (ZLVL,Z0,T1V,TH2V,SFCSPD,CZIL,CM,CH)
717!        ENDIF
718
719! ----------------------------------------------------------------------
720! CALL PENMAN SUBROUTINE TO CALCULATE POTENTIAL EVAPORATION (ETP), AND
721! OTHER PARTIAL PRODUCTS AND SUMS SAVE IN COMMON/RITE FOR LATER
722! CALCULATIONS.
723! ----------------------------------------------------------------------
724! ----------------------------------------------------------------------
725! CALCULATE TOTAL DOWNWARD RADIATION (SOLAR PLUS LONGWAVE) NEEDED IN
726! PENMAN EP SUBROUTINE THAT FOLLOWS
727! ----------------------------------------------------------------------
728!         FDOWN = SOLDN * (1.0- ALBEDO) + LWDN
729         FDOWN =  SOLNET + LWDN
730! ----------------------------------------------------------------------
731! CALC VIRTUAL TEMPS AND VIRTUAL POTENTIAL TEMPS NEEDED BY SUBROUTINES
732! PENMAN.
733         T2V = SFCTMP * (1.0+ 0.61 * Q2 )
734
735         iout=0
736         if(iout.eq.1) then
737         print*,'before penman'
738         print*,' SFCTMP',SFCTMP,'SFCPRS',SFCPRS,'CH',CH,'T2V',T2V,      &
739       'TH2',TH2,'PRCP',PRCP,'FDOWN',FDOWN,'T24',T24,'SSOIL',SSOIL,      &
740        'Q2',Q2,'Q2SAT',Q2SAT,'ETP',ETP,'RCH',RCH,                       &
741        'EPSCA',EPSCA,'RR',RR  ,'SNOWNG',SNOWNG,'FRZGRA',FRZGRA,           &
742        'DQSDT2',DQSDT2,'FLX2',FLX2,'SNOWH',SNOWH,'SNEQV',SNEQV,         &
743        ' DSOIL',DSOIL,' FRCSNO',FRCSNO,' SNCOVR',SNCOVR,' DTOT',DTOT,   &
744       ' ZSOIL (1)',ZSOIL(1),' DF1',DF1,'T1',T1,' STC1',STC(1),          &
745        'ALBEDO',ALBEDO,'SMC',SMC,'STC',STC,'SH2O',SH2O
746         endif
747
748         CALL PENMAN (SFCTMP,SFCPRS,CH,T2V,TH2,PRCP,FDOWN,T24,SSOIL,     &
749                       Q2,Q2SAT,ETP,RCH,EPSCA,RR,SNOWNG,FRZGRA,          &
750!
751! kmh 01/09/2007 add T1,ICE,SNCOVR to call
752!
753                         DQSDT2,FLX2,EMISSI,SNEQV,T1,ICE,SNCOVR)
754!
755! ----------------------------------------------------------------------
756! CALL CANRES TO CALCULATE THE CANOPY RESISTANCE AND CONVERT IT INTO PC
757! IF NONZERO GREENNESS FRACTION
758! ----------------------------------------------------------------------
759
760! ----------------------------------------------------------------------
761!  FROZEN GROUND EXTENSION: TOTAL SOIL WATER "SMC" WAS REPLACED
762!  BY UNFROZEN SOIL WATER "SH2O" IN CALL TO CANRES BELOW
763! ----------------------------------------------------------------------
764         IF (SHDFAC > 0.) THEN
765            CALL CANRES (SOLDN,CH,SFCTMP,Q2,SFCPRS,SH2O,ZSOIL,NSOIL,     &
766                          SMCWLT,SMCREF,RSMIN,RC,PC,NROOT,Q2SAT,DQSDT2,  &
767                          TOPT,RSMAX,RGL,HS,XLAI,                        &
768                          RCS,RCT,RCQ,RCSOIL,EMISSI)
769         ELSE
770            RC = 0.0
771         END IF
772! ----------------------------------------------------------------------
773! NOW DECIDE MAJOR PATHWAY BRANCH TO TAKE DEPENDING ON WHETHER SNOWPACK
774! EXISTS OR NOT:
775! ----------------------------------------------------------------------
776         ESNOW = 0.0
777         IF (SNEQV  == 0.0) THEN
778            CALL NOPAC (ETP,ETA,PRCP,SMC,SMCMAX,SMCWLT,                  &
779                            SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT,           &
780                            SHDFAC,                                      &
781                            SBETA,Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,EMISSI,  &
782                            SSOIL,                                       &
783                            STC,EPSCA,BEXP,PC,RCH,RR,CFACTR,             &
784                            SH2O,SLOPE,KDT,FRZX,PSISAT,ZSOIL,            &
785                            DKSAT,DWSAT,TBOT,ZBOT,RUNOFF1,RUNOFF2,       &
786                            RUNOFF3,EDIR,EC,ET,ETT,NROOT,ICE,RTDIS,      &
787                            QUARTZ,FXEXP,CSOIL,                          &
788                            BETA,DRIP,DEW,FLX1,FLX3,VEGTYP,ISURBAN)
789            ETA_KINEMATIC = ETA
790         ELSE
791            CALL SNOPAC (ETP,ETA,PRCP,PRCPF,SNOWNG,SMC,SMCMAX,SMCWLT,    &
792                         SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT,              &
793                         SBETA,DF1,                                      &
794                         Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,SSOIL,STC,EPSCA,  &
795                         SFCPRS,BEXP,PC,RCH,RR,CFACTR,SNCOVR,SNEQV,SNDENS,&
796                         SNOWH,SH2O,SLOPE,KDT,FRZX,PSISAT,               &
797                         ZSOIL,DWSAT,DKSAT,TBOT,ZBOT,SHDFAC,RUNOFF1,     &
798                         RUNOFF2,RUNOFF3,EDIR,EC,ET,ETT,NROOT,SNOMLT,    &
799                         ICE,RTDIS,QUARTZ,FXEXP,CSOIL,                   &
800                         BETA,DRIP,DEW,FLX1,FLX2,FLX3,ESNOW,ETNS,EMISSI, &
801                         RIBB,SOLDN,                                     &
802                         ISURBAN,                                        &
803                         VEGTYP)
804            ETA_KINEMATIC =  ESNOW + ETNS
805         END IF
806
807!     Calculate effective mixing ratio at grnd level (skin)
808!
809!     Q1=Q2+ETA*CP/RCH
810     Q1=Q2+ETA_KINEMATIC*CP/RCH
811!
812! ----------------------------------------------------------------------
813! DETERMINE SENSIBLE HEAT (H) IN ENERGY UNITS (W M-2)
814! ----------------------------------------------------------------------
815         SHEAT = - (CH * CP * SFCPRS)/ (R * T2V) * ( TH2- T1 )
816
817! ----------------------------------------------------------------------
818! CONVERT EVAP TERMS FROM KINEMATIC (KG M-2 S-1) TO ENERGY UNITS (W M-2)
819! ----------------------------------------------------------------------
820      EDIR = EDIR * LVH2O
821      EC = EC * LVH2O
822      DO K=1,4
823      ET(K) = ET(K) * LVH2O
824      ENDDO
825      ETT = ETT * LVH2O
826      ESNOW = ESNOW * LSUBS
827      ETP = ETP*((1.-SNCOVR)*LVH2O + SNCOVR*LSUBS)
828      IF (ETP .GT. 0.) THEN
829         ETA = EDIR + EC + ETT + ESNOW
830      ELSE
831        ETA = ETP
832      ENDIF
833! ----------------------------------------------------------------------
834! DETERMINE BETA (RATIO OF ACTUAL TO POTENTIAL EVAP)
835! ----------------------------------------------------------------------
836      IF (ETP == 0.0) THEN
837        BETA = 0.0
838      ELSE
839        BETA = ETA/ETP
840      ENDIF
841
842! ----------------------------------------------------------------------
843! CONVERT THE SIGN OF SOIL HEAT FLUX SO THAT:
844!   SSOIL>0: WARM THE SURFACE  (NIGHT TIME)
845!   SSOIL<0: COOL THE SURFACE  (DAY TIME)
846! ----------------------------------------------------------------------
847         SSOIL = -1.0* SSOIL
848
849! ----------------------------------------------------------------------
850!  FOR THE CASE OF LAND (BUT NOT GLACIAL-ICE):
851!  CONVERT RUNOFF3 (INTERNAL LAYER RUNOFF FROM SUPERSAT) FROM M TO M S-1
852!  AND ADD TO SUBSURFACE RUNOFF/DRAINAGE/BASEFLOW.  RUNOFF2 IS ALREADY
853!  A RATE AT THIS POINT
854! ----------------------------------------------------------------------
855         IF (ICE == 0) THEN
856            RUNOFF3 = RUNOFF3/ DT
857            RUNOFF2 = RUNOFF2+ RUNOFF3
858            SOILM = -1.0* SMC (1)* ZSOIL (1)
859            DO K = 2,NSOIL
860              SOILM = SOILM + SMC (K)* (ZSOIL (K -1) - ZSOIL (K))
861            END DO
862            SOILWM = -1.0* (SMCMAX - SMCWLT)* ZSOIL (1)
863            SOILWW = -1.0* (SMC (1) - SMCWLT)* ZSOIL (1)
864!
865            DO K = 1,NSOIL
866               SMAV(K)=(SMC(K) - SMCWLT)/(SMCMAX - SMCWLT)
867            END DO
868
869            IF (NROOT >= 2) THEN
870              DO K = 2,NROOT
871               SOILWM = SOILWM + (SMCMAX - SMCWLT)* (ZSOIL (K -1) - ZSOIL (K))
872               SOILWW = SOILWW + (SMC(K) - SMCWLT)* (ZSOIL (K -1) - ZSOIL (K))
873              END DO
874            END IF
875            IF (SOILWM .LT. 1.E-6) THEN
876              SOILWM = 0.0
877              SOILW  = 0.0
878              SOILM  = 0.0
879            ELSE
880              SOILW = SOILWW / SOILWM
881            END IF
882         ELSE
883! ----------------------------------------------------------------------
884! FOR THE CASE OF SEA-ICE (ICE=1) OR GLACIAL-ICE (ICE=-1), ADD ANY
885! SNOWMELT DIRECTLY TO SURFACE RUNOFF (RUNOFF1) SINCE THERE IS NO
886! SOIL MEDIUM, AND THUS NO CALL TO SUBROUTINE SMFLX (FOR SOIL MOISTURE
887! TENDENCY).
888! ----------------------------------------------------------------------
889            RUNOFF1 = SNOMLT/DT
890           SOILWM = 0.0
891           SOILW  = 0.0
892           SOILM  = 0.0
893           DO K = 1,NSOIL
894             SMAV(K)= 1.0
895           END DO
896         END IF
897
898! ----------------------------------------------------------------------
899  END SUBROUTINE SFLX
900! ----------------------------------------------------------------------
901
902      SUBROUTINE ALCALC (ALB,SNOALB,EMBRD,SHDFAC,SHDMIN,SNCOVR,TSNOW,ALBEDO,EMISSI,   &
903                         DT,SNOWNG,SNOTIME1,LVCOEF)
904
905! ----------------------------------------------------------------------
906! CALCULATE ALBEDO INCLUDING SNOW EFFECT (0 -> 1)
907!   ALB     SNOWFREE ALBEDO
908!   SNOALB  MAXIMUM (DEEP) SNOW ALBEDO
909!   SHDFAC    AREAL FRACTIONAL COVERAGE OF GREEN VEGETATION
910!   SHDMIN    MINIMUM AREAL FRACTIONAL COVERAGE OF GREEN VEGETATION
911!   SNCOVR  FRACTIONAL SNOW COVER
912!   ALBEDO  SURFACE ALBEDO INCLUDING SNOW EFFECT
913!   TSNOW   SNOW SURFACE TEMPERATURE (K)
914! ----------------------------------------------------------------------
915      IMPLICIT NONE
916
917! ----------------------------------------------------------------------
918! SNOALB IS ARGUMENT REPRESENTING MAXIMUM ALBEDO OVER DEEP SNOW,
919! AS PASSED INTO SFLX, AND ADAPTED FROM THE SATELLITE-BASED MAXIMUM
920! SNOW ALBEDO FIELDS PROVIDED BY D. ROBINSON AND G. KUKLA
921! (1985, JCAM, VOL 24, 402-411)
922! ----------------------------------------------------------------------
923      REAL, INTENT(IN)  ::  ALB, SNOALB, EMBRD, SHDFAC, SHDMIN, SNCOVR, TSNOW
924      REAL, INTENT(IN)  :: DT
925      LOGICAL, INTENT(IN) :: SNOWNG
926      REAL, INTENT(INOUT):: SNOTIME1
927      REAL, INTENT(OUT) ::  ALBEDO, EMISSI
928      REAL              :: SNOALB2
929      REAL              :: TM,SNOALB1
930      REAL, INTENT(IN)  :: LVCOEF
931      REAL, PARAMETER   :: SNACCA=0.94,SNACCB=0.58,SNTHWA=0.82,SNTHWB=0.46
932! turn of vegetation effect
933!      ALBEDO = ALB + (1.0- (SHDFAC - SHDMIN))* SNCOVR * (SNOALB - ALB)
934!      ALBEDO = (1.0-SNCOVR)*ALB + SNCOVR*SNOALB !this is equivalent to below
935      ALBEDO = ALB + SNCOVR*(SNOALB-ALB)
936      EMISSI = EMBRD + SNCOVR*(EMISSI_S - EMBRD)
937
938!     BASE FORMULATION (DICKINSON ET AL., 1986, COGLEY ET AL., 1990)
939!          IF (TSNOW.LE.263.16) THEN
940!            ALBEDO=SNOALB
941!          ELSE
942!            IF (TSNOW.LT.273.16) THEN
943!              TM=0.1*(TSNOW-263.16)
944!              SNOALB1=0.5*((0.9-0.2*(TM**3))+(0.8-0.16*(TM**3)))
945!            ELSE
946!              SNOALB1=0.67
947!             IF(SNCOVR.GT.0.95) SNOALB1= 0.6
948!             SNOALB1 = ALB + SNCOVR*(SNOALB-ALB)
949!            ENDIF
950!          ENDIF
951!            ALBEDO = ALB + SNCOVR*(SNOALB1-ALB)
952
953!     ISBA FORMULATION (VERSEGHY, 1991; BAKER ET AL., 1990)
954!          SNOALB1 = SNOALB+COEF*(0.85-SNOALB)
955!          SNOALB2=SNOALB1
956!!m          LSTSNW=LSTSNW+1
957!          SNOTIME1 = SNOTIME1 + DT
958!          IF (SNOWNG) THEN
959!             SNOALB2=SNOALB
960!!m             LSTSNW=0
961!             SNOTIME1 = 0.0
962!          ELSE
963!            IF (TSNOW.LT.273.16) THEN
964!!              SNOALB2=SNOALB-0.008*LSTSNW*DT/86400
965!!m              SNOALB2=SNOALB-0.008*SNOTIME1/86400
966!              SNOALB2=(SNOALB2-0.65)*EXP(-0.05*DT/3600)+0.65
967!!              SNOALB2=(ALBEDO-0.65)*EXP(-0.01*DT/3600)+0.65
968!            ELSE
969!              SNOALB2=(SNOALB2-0.5)*EXP(-0.0005*DT/3600)+0.5
970!!              SNOALB2=(SNOALB-0.5)*EXP(-0.24*LSTSNW*DT/86400)+0.5
971!!m              SNOALB2=(SNOALB-0.5)*EXP(-0.24*SNOTIME1/86400)+0.5
972!            ENDIF
973!          ENDIF
974!
975!!               print*,'SNOALB2',SNOALB2,'ALBEDO',ALBEDO,'DT',DT
976!          ALBEDO = ALB + SNCOVR*(SNOALB2-ALB)
977!          IF (ALBEDO .GT. SNOALB2) ALBEDO=SNOALB2
978!!m          LSTSNW1=LSTSNW
979!!          SNOTIME = SNOTIME1
980
981! formulation by Livneh
982! ----------------------------------------------------------------------
983! SNOALB IS CONSIDERED AS THE MAXIMUM SNOW ALBEDO FOR NEW SNOW, AT
984! A VALUE OF 85%. SNOW ALBEDO CURVE DEFAULTS ARE FROM BRAS P.263. SHOULD
985! NOT BE CHANGED EXCEPT FOR SERIOUS PROBLEMS WITH SNOW MELT.
986! TO IMPLEMENT ACCUMULATIN PARAMETERS, SNACCA AND SNACCB, ASSERT THAT IT
987! IS INDEED ACCUMULATION SEASON. I.E. THAT SNOW SURFACE TEMP IS BELOW
988! ZERO AND THE DATE FALLS BETWEEN OCTOBER AND FEBRUARY
989! ----------------------------------------------------------------------
990         SNOALB1 = SNOALB+LVCOEF*(0.85-SNOALB)
991         SNOALB2=SNOALB1
992! ---------------- Initial LSTSNW --------------------------------------
993          IF (SNOWNG) THEN
994             SNOTIME1 = 0.
995          ELSE
996           SNOTIME1=SNOTIME1+DT
997!               IF (TSNOW.LT.273.16) THEN
998                   SNOALB2=SNOALB1*(SNACCA**((SNOTIME1/86400.0)**SNACCB))
999!               ELSE
1000!                  SNOALB2 =SNOALB1*(SNTHWA**((SNOTIME1/86400.0)**SNTHWB))
1001!               ENDIF
1002          ENDIF
1003!
1004           SNOALB2 = MAX ( SNOALB2, ALB )
1005           ALBEDO = ALB + SNCOVR*(SNOALB2-ALB)
1006           IF (ALBEDO .GT. SNOALB2) ALBEDO=SNOALB2
1007
1008!          IF (TSNOW.LT.273.16) THEN
1009!            ALBEDO=SNOALB-0.008*DT/86400
1010!          ELSE
1011!            ALBEDO=(SNOALB-0.5)*EXP(-0.24*DT/86400)+0.5
1012!          ENDIF
1013
1014!      IF (ALBEDO > SNOALB) ALBEDO = SNOALB
1015
1016! ----------------------------------------------------------------------
1017  END SUBROUTINE ALCALC
1018! ----------------------------------------------------------------------
1019
1020      SUBROUTINE CANRES (SOLAR,CH,SFCTMP,Q2,SFCPRS,SMC,ZSOIL,NSOIL,       &
1021                         SMCWLT,SMCREF,RSMIN,RC,PC,NROOT,Q2SAT,DQSDT2,    &
1022                         TOPT,RSMAX,RGL,HS,XLAI,                          &
1023                         RCS,RCT,RCQ,RCSOIL,EMISSI)
1024
1025! ----------------------------------------------------------------------
1026! SUBROUTINE CANRES
1027! ----------------------------------------------------------------------
1028! CALCULATE CANOPY RESISTANCE WHICH DEPENDS ON INCOMING SOLAR RADIATION,
1029! AIR TEMPERATURE, ATMOSPHERIC WATER VAPOR PRESSURE DEFICIT AT THE
1030! LOWEST MODEL LEVEL, AND SOIL MOISTURE (PREFERABLY UNFROZEN SOIL
1031! MOISTURE RATHER THAN TOTAL)
1032! ----------------------------------------------------------------------
1033! SOURCE:  JARVIS (1976), NOILHAN AND PLANTON (1989, MWR), JACQUEMIN AND
1034! NOILHAN (1990, BLM)
1035! SEE ALSO:  CHEN ET AL (1996, JGR, VOL 101(D3), 7251-7268), EQNS 12-14
1036! AND TABLE 2 OF SEC. 3.1.2
1037! ----------------------------------------------------------------------
1038! INPUT:
1039!   SOLAR   INCOMING SOLAR RADIATION
1040!   CH      SURFACE EXCHANGE COEFFICIENT FOR HEAT AND MOISTURE
1041!   SFCTMP  AIR TEMPERATURE AT 1ST LEVEL ABOVE GROUND
1042!   Q2      AIR HUMIDITY AT 1ST LEVEL ABOVE GROUND
1043!   Q2SAT   SATURATION AIR HUMIDITY AT 1ST LEVEL ABOVE GROUND
1044!   DQSDT2  SLOPE OF SATURATION HUMIDITY FUNCTION WRT TEMP
1045!   SFCPRS  SURFACE PRESSURE
1046!   SMC     VOLUMETRIC SOIL MOISTURE
1047!   ZSOIL   SOIL DEPTH (NEGATIVE SIGN, AS IT IS BELOW GROUND)
1048!   NSOIL   NO. OF SOIL LAYERS
1049!   NROOT   NO. OF SOIL LAYERS IN ROOT ZONE (1.LE.NROOT.LE.NSOIL)
1050!   XLAI    LEAF AREA INDEX
1051!   SMCWLT  WILTING POINT
1052!   SMCREF  REFERENCE SOIL MOISTURE (WHERE SOIL WATER DEFICIT STRESS
1053!             SETS IN)
1054! RSMIN, RSMAX, TOPT, RGL, HS ARE CANOPY STRESS PARAMETERS SET IN
1055!   SURBOUTINE REDPRM
1056! OUTPUT:
1057!   PC  PLANT COEFFICIENT
1058!   RC  CANOPY RESISTANCE
1059! ----------------------------------------------------------------------
1060
1061      IMPLICIT NONE
1062      INTEGER, INTENT(IN) :: NROOT,NSOIL
1063      INTEGER  K
1064      REAL,    INTENT(IN) :: CH,DQSDT2,HS,Q2,Q2SAT,RSMIN,RGL,RSMAX,        &
1065                             SFCPRS,SFCTMP,SMCREF,SMCWLT, SOLAR,TOPT,XLAI, &
1066                             EMISSI
1067      REAL,DIMENSION(1:NSOIL), INTENT(IN) :: SMC,ZSOIL
1068      REAL,    INTENT(OUT):: PC,RC,RCQ,RCS,RCSOIL,RCT
1069      REAL                :: DELTA,FF,GX,P,RR
1070      REAL, DIMENSION(1:NSOIL) ::  PART
1071      REAL, PARAMETER     :: SLV = 2.501000E6
1072
1073
1074! ----------------------------------------------------------------------
1075! INITIALIZE CANOPY RESISTANCE MULTIPLIER TERMS.
1076! ----------------------------------------------------------------------
1077      RCS = 0.0
1078      RCT = 0.0
1079      RCQ = 0.0
1080      RCSOIL = 0.0
1081
1082! ----------------------------------------------------------------------
1083! CONTRIBUTION DUE TO INCOMING SOLAR RADIATION
1084! ----------------------------------------------------------------------
1085      RC = 0.0
1086      FF = 0.55*2.0* SOLAR / (RGL * XLAI)
1087      RCS = (FF + RSMIN / RSMAX) / (1.0+ FF)
1088
1089! ----------------------------------------------------------------------
1090! CONTRIBUTION DUE TO AIR TEMPERATURE AT FIRST MODEL LEVEL ABOVE GROUND
1091! RCT EXPRESSION FROM NOILHAN AND PLANTON (1989, MWR).
1092! ----------------------------------------------------------------------
1093      RCS = MAX (RCS,0.0001)
1094      RCT = 1.0- 0.0016* ( (TOPT - SFCTMP)**2.0)
1095
1096! ----------------------------------------------------------------------
1097! CONTRIBUTION DUE TO VAPOR PRESSURE DEFICIT AT FIRST MODEL LEVEL.
1098! RCQ EXPRESSION FROM SSIB
1099! ----------------------------------------------------------------------
1100      RCT = MAX (RCT,0.0001)
1101      RCQ = 1.0/ (1.0+ HS * (Q2SAT - Q2))
1102
1103! ----------------------------------------------------------------------
1104! CONTRIBUTION DUE TO SOIL MOISTURE AVAILABILITY.
1105! DETERMINE CONTRIBUTION FROM EACH SOIL LAYER, THEN ADD THEM UP.
1106! ----------------------------------------------------------------------
1107      RCQ = MAX (RCQ,0.01)
1108      GX = (SMC (1) - SMCWLT) / (SMCREF - SMCWLT)
1109      IF (GX  >  1.) GX = 1.
1110      IF (GX  <  0.) GX = 0.
1111
1112! ----------------------------------------------------------------------
1113! USE SOIL DEPTH AS WEIGHTING FACTOR
1114! ----------------------------------------------------------------------
1115! ----------------------------------------------------------------------
1116! USE ROOT DISTRIBUTION AS WEIGHTING FACTOR
1117!      PART(1) = RTDIS(1) * GX
1118! ----------------------------------------------------------------------
1119      PART (1) = (ZSOIL (1)/ ZSOIL (NROOT)) * GX
1120      DO K = 2,NROOT
1121         GX = (SMC (K) - SMCWLT) / (SMCREF - SMCWLT)
1122         IF (GX >  1.) GX = 1.
1123         IF (GX <  0.) GX = 0.
1124! ----------------------------------------------------------------------
1125! USE SOIL DEPTH AS WEIGHTING FACTOR
1126! ----------------------------------------------------------------------
1127! ----------------------------------------------------------------------
1128! USE ROOT DISTRIBUTION AS WEIGHTING FACTOR
1129!        PART(K) = RTDIS(K) * GX
1130! ----------------------------------------------------------------------
1131         PART (K) = ( (ZSOIL (K) - ZSOIL (K -1))/ ZSOIL (NROOT)) * GX
1132      END DO
1133      DO K = 1,NROOT
1134         RCSOIL = RCSOIL + PART (K)
1135      END DO
1136
1137! ----------------------------------------------------------------------
1138! DETERMINE CANOPY RESISTANCE DUE TO ALL FACTORS.  CONVERT CANOPY
1139! RESISTANCE (RC) TO PLANT COEFFICIENT (PC) TO BE USED WITH POTENTIAL
1140! EVAP IN DETERMINING ACTUAL EVAP.  PC IS DETERMINED BY:
1141!   PC * LINERIZED PENMAN POTENTIAL EVAP =
1142!   PENMAN-MONTEITH ACTUAL EVAPORATION (CONTAINING RC TERM).
1143! ----------------------------------------------------------------------
1144      RCSOIL = MAX (RCSOIL,0.0001)
1145
1146      RC = RSMIN / (XLAI * RCS * RCT * RCQ * RCSOIL)
1147!      RR = (4.* SIGMA * RD / CP)* (SFCTMP **4.)/ (SFCPRS * CH) + 1.0
1148      RR = (4.* EMISSI *SIGMA * RD / CP)* (SFCTMP **4.)/ (SFCPRS * CH) &
1149             + 1.0
1150
1151      DELTA = (SLV / CP)* DQSDT2
1152
1153      PC = (RR + DELTA)/ (RR * (1. + RC * CH) + DELTA)
1154
1155! ----------------------------------------------------------------------
1156  END SUBROUTINE CANRES
1157! ----------------------------------------------------------------------
1158
1159      SUBROUTINE CSNOW (SNCOND,DSNOW)
1160
1161! ----------------------------------------------------------------------
1162! SUBROUTINE CSNOW
1163! FUNCTION CSNOW
1164! ----------------------------------------------------------------------
1165! CALCULATE SNOW TERMAL CONDUCTIVITY
1166! ----------------------------------------------------------------------
1167      IMPLICIT NONE
1168      REAL, INTENT(IN) :: DSNOW
1169      REAL, INTENT(OUT):: SNCOND
1170      REAL             :: C
1171      REAL, PARAMETER  :: UNIT = 0.11631
1172
1173! ----------------------------------------------------------------------
1174! SNCOND IN UNITS OF CAL/(CM*HR*C), RETURNED IN W/(M*C)
1175! CSNOW IN UNITS OF CAL/(CM*HR*C), RETURNED IN W/(M*C)
1176! BASIC VERSION IS DYACHKOVA EQUATION (1960), FOR RANGE 0.1-0.4
1177! ----------------------------------------------------------------------
1178      C = 0.328*10** (2.25* DSNOW)
1179!      CSNOW=UNIT*C
1180
1181! ----------------------------------------------------------------------
1182! DE VAUX EQUATION (1933), IN RANGE 0.1-0.6
1183! ----------------------------------------------------------------------
1184!      SNCOND=0.0293*(1.+100.*DSNOW**2)
1185!      CSNOW=0.0293*(1.+100.*DSNOW**2)
1186
1187! ----------------------------------------------------------------------
1188! E. ANDERSEN FROM FLERCHINGER
1189! ----------------------------------------------------------------------
1190!      SNCOND=0.021+2.51*DSNOW**2
1191!      CSNOW=0.021+2.51*DSNOW**2
1192
1193!      SNCOND = UNIT * C
1194! double snow thermal conductivity
1195      SNCOND = 2.0 * UNIT * C
1196
1197! ----------------------------------------------------------------------
1198  END SUBROUTINE CSNOW
1199! ----------------------------------------------------------------------
1200
1201      SUBROUTINE DEVAP (EDIR,ETP1,SMC,ZSOIL,SHDFAC,SMCMAX,BEXP,         &
1202                        DKSAT,DWSAT,SMCDRY,SMCREF,SMCWLT,FXEXP)
1203
1204! ----------------------------------------------------------------------
1205! SUBROUTINE DEVAP
1206! FUNCTION DEVAP
1207! ----------------------------------------------------------------------
1208! CALCULATE DIRECT SOIL EVAPORATION
1209! ----------------------------------------------------------------------
1210      IMPLICIT NONE
1211      REAL, INTENT(IN) :: ETP1,SMC,BEXP,DKSAT,DWSAT,FXEXP,              &
1212                          SHDFAC,SMCDRY,SMCMAX,ZSOIL,SMCREF,SMCWLT
1213      REAL, INTENT(OUT):: EDIR
1214      REAL             :: FX, SRATIO
1215
1216
1217! ----------------------------------------------------------------------
1218! DIRECT EVAP A FUNCTION OF RELATIVE SOIL MOISTURE AVAILABILITY, LINEAR
1219! WHEN FXEXP=1.
1220! ----------------------------------------------------------------------
1221! ----------------------------------------------------------------------
1222! FX > 1 REPRESENTS DEMAND CONTROL
1223! FX < 1 REPRESENTS FLUX CONTROL
1224! ----------------------------------------------------------------------
1225
1226      SRATIO = (SMC - SMCDRY) / (SMCMAX - SMCDRY)
1227      IF (SRATIO > 0.) THEN
1228        FX = SRATIO**FXEXP
1229        FX = MAX ( MIN ( FX, 1. ) ,0. )
1230      ELSE
1231        FX = 0.
1232      ENDIF
1233
1234! ----------------------------------------------------------------------
1235! ALLOW FOR THE DIRECT-EVAP-REDUCING EFFECT OF SHADE
1236! ----------------------------------------------------------------------
1237      EDIR = FX * ( 1.0- SHDFAC ) * ETP1
1238
1239! ----------------------------------------------------------------------
1240  END SUBROUTINE DEVAP
1241! ----------------------------------------------------------------------
1242
1243      SUBROUTINE EVAPO (ETA1,SMC,NSOIL,CMC,ETP1,DT,ZSOIL,               &
1244                         SH2O,                                          &
1245                         SMCMAX,BEXP,PC,SMCWLT,DKSAT,DWSAT,             &
1246                         SMCREF,SHDFAC,CMCMAX,                          &
1247                         SMCDRY,CFACTR,                                 &
1248                         EDIR,EC,ET,ETT,SFCTMP,Q2,NROOT,RTDIS,FXEXP)
1249
1250! ----------------------------------------------------------------------
1251! SUBROUTINE EVAPO
1252! ----------------------------------------------------------------------
1253! CALCULATE SOIL MOISTURE FLUX.  THE SOIL MOISTURE CONTENT (SMC - A PER
1254! UNIT VOLUME MEASUREMENT) IS A DEPENDENT VARIABLE THAT IS UPDATED WITH
1255! PROGNOSTIC EQNS. THE CANOPY MOISTURE CONTENT (CMC) IS ALSO UPDATED.
1256! FROZEN GROUND VERSION:  NEW STATES ADDED: SH2O, AND FROZEN GROUND
1257! CORRECTION FACTOR, FRZFACT AND PARAMETER SLOPE.
1258! ----------------------------------------------------------------------
1259      IMPLICIT NONE
1260      INTEGER, INTENT(IN)   :: NSOIL, NROOT
1261      INTEGER               :: I,K
1262      REAL,    INTENT(IN)   :: BEXP, CFACTR,CMC,CMCMAX,DKSAT,           &
1263                                 DT,DWSAT,ETP1,FXEXP,PC,Q2,SFCTMP,      &
1264                                 SHDFAC,SMCDRY,SMCMAX,SMCREF,SMCWLT
1265      REAL,    INTENT(OUT)  :: EC,EDIR,ETA1,ETT
1266      REAL                  :: CMC2MS
1267      REAL,DIMENSION(1:NSOIL), INTENT(IN) :: RTDIS, SMC, SH2O, ZSOIL
1268      REAL,DIMENSION(1:NSOIL), INTENT(OUT) :: ET
1269
1270! ----------------------------------------------------------------------
1271! EXECUTABLE CODE BEGINS HERE IF THE POTENTIAL EVAPOTRANSPIRATION IS
1272! GREATER THAN ZERO.
1273! ----------------------------------------------------------------------
1274      EDIR = 0.
1275      EC = 0.
1276      ETT = 0.
1277      DO K = 1,NSOIL
1278         ET (K) = 0.
1279      END DO
1280
1281! ----------------------------------------------------------------------
1282! RETRIEVE DIRECT EVAPORATION FROM SOIL SURFACE.  CALL THIS FUNCTION
1283! ONLY IF VEG COVER NOT COMPLETE.
1284! FROZEN GROUND VERSION:  SH2O STATES REPLACE SMC STATES.
1285! ----------------------------------------------------------------------
1286      IF (ETP1 > 0.0) THEN
1287         IF (SHDFAC <  1.) THEN
1288             CALL DEVAP (EDIR,ETP1,SMC (1),ZSOIL (1),SHDFAC,SMCMAX,      &
1289                         BEXP,DKSAT,DWSAT,SMCDRY,SMCREF,SMCWLT,FXEXP)
1290         END IF
1291! ----------------------------------------------------------------------
1292! INITIALIZE PLANT TOTAL TRANSPIRATION, RETRIEVE PLANT TRANSPIRATION,
1293! AND ACCUMULATE IT FOR ALL SOIL LAYERS.
1294! ----------------------------------------------------------------------
1295
1296         IF (SHDFAC > 0.0) THEN
1297            CALL TRANSP (ET,NSOIL,ETP1,SH2O,CMC,ZSOIL,SHDFAC,SMCWLT,     &
1298                          CMCMAX,PC,CFACTR,SMCREF,SFCTMP,Q2,NROOT,RTDIS)
1299            DO K = 1,NSOIL
1300               ETT = ETT + ET ( K )
1301            END DO
1302! ----------------------------------------------------------------------
1303! CALCULATE CANOPY EVAPORATION.
1304! IF STATEMENTS TO AVOID TANGENT LINEAR PROBLEMS NEAR CMC=0.0.
1305! ----------------------------------------------------------------------
1306            IF (CMC > 0.0) THEN
1307               EC = SHDFAC * ( ( CMC / CMCMAX ) ** CFACTR ) * ETP1
1308            ELSE
1309               EC = 0.0
1310            END IF
1311! ----------------------------------------------------------------------
1312! EC SHOULD BE LIMITED BY THE TOTAL AMOUNT OF AVAILABLE WATER ON THE
1313! CANOPY.  -F.CHEN, 18-OCT-1994
1314! ----------------------------------------------------------------------
1315            CMC2MS = CMC / DT
1316            EC = MIN ( CMC2MS, EC )
1317         END IF
1318      END IF
1319! ----------------------------------------------------------------------
1320! TOTAL UP EVAP AND TRANSP TYPES TO OBTAIN ACTUAL EVAPOTRANSP
1321! ----------------------------------------------------------------------
1322      ETA1 = EDIR + ETT + EC
1323
1324! ----------------------------------------------------------------------
1325  END SUBROUTINE EVAPO
1326! ----------------------------------------------------------------------
1327
1328  SUBROUTINE FAC2MIT(SMCMAX,FLIMIT)
1329    IMPLICIT NONE               
1330    REAL, INTENT(IN)  :: SMCMAX
1331    REAL, INTENT(OUT) :: FLIMIT
1332
1333    FLIMIT = 0.90
1334
1335    IF ( SMCMAX == 0.395 ) THEN
1336       FLIMIT = 0.59
1337    ELSE IF ( ( SMCMAX == 0.434 ) .OR. ( SMCMAX == 0.404 ) ) THEN
1338       FLIMIT = 0.85
1339    ELSE IF ( ( SMCMAX == 0.465 ) .OR. ( SMCMAX == 0.406 ) ) THEN
1340       FLIMIT = 0.86
1341    ELSE IF ( ( SMCMAX == 0.476 ) .OR. ( SMCMAX == 0.439 ) ) THEN
1342       FLIMIT = 0.74
1343    ELSE IF ( ( SMCMAX == 0.200 ) .OR. ( SMCMAX == 0.464 ) ) THEN
1344       FLIMIT = 0.80
1345    ENDIF
1346
1347! ----------------------------------------------------------------------
1348  END SUBROUTINE FAC2MIT
1349! ----------------------------------------------------------------------
1350
1351      SUBROUTINE FRH2O (FREE,TKELV,SMC,SH2O,SMCMAX,BEXP,PSIS)
1352
1353! ----------------------------------------------------------------------
1354! SUBROUTINE FRH2O
1355! ----------------------------------------------------------------------
1356! CALCULATE AMOUNT OF SUPERCOOLED LIQUID SOIL WATER CONTENT IF
1357! TEMPERATURE IS BELOW 273.15K (T0).  REQUIRES NEWTON-TYPE ITERATION TO
1358! SOLVE THE NONLINEAR IMPLICIT EQUATION GIVEN IN EQN 17 OF KOREN ET AL
1359! (1999, JGR, VOL 104(D16), 19569-19585).
1360! ----------------------------------------------------------------------
1361! NEW VERSION (JUNE 2001): MUCH FASTER AND MORE ACCURATE NEWTON
1362! ITERATION ACHIEVED BY FIRST TAKING LOG OF EQN CITED ABOVE -- LESS THAN
1363! 4 (TYPICALLY 1 OR 2) ITERATIONS ACHIEVES CONVERGENCE.  ALSO, EXPLICIT
1364! 1-STEP SOLUTION OPTION FOR SPECIAL CASE OF PARAMETER CK=0, WHICH
1365! REDUCES THE ORIGINAL IMPLICIT EQUATION TO A SIMPLER EXPLICIT FORM,
1366! KNOWN AS THE "FLERCHINGER EQN". IMPROVED HANDLING OF SOLUTION IN THE
1367! LIMIT OF FREEZING POINT TEMPERATURE T0.
1368! ----------------------------------------------------------------------
1369! INPUT:
1370
1371!   TKELV.........TEMPERATURE (Kelvin)
1372!   SMC...........TOTAL SOIL MOISTURE CONTENT (VOLUMETRIC)
1373!   SH2O..........LIQUID SOIL MOISTURE CONTENT (VOLUMETRIC)
1374!   SMCMAX........SATURATION SOIL MOISTURE CONTENT (FROM REDPRM)
1375!   B.............SOIL TYPE "B" PARAMETER (FROM REDPRM)
1376!   PSIS..........SATURATED SOIL MATRIC POTENTIAL (FROM REDPRM)
1377
1378! OUTPUT:
1379!   FRH2O.........SUPERCOOLED LIQUID WATER CONTENT
1380!   FREE..........SUPERCOOLED LIQUID WATER CONTENT
1381! ----------------------------------------------------------------------
1382      IMPLICIT NONE
1383      REAL, INTENT(IN)     :: BEXP,PSIS,SH2O,SMC,SMCMAX,TKELV
1384      REAL, INTENT(OUT)    :: FREE
1385      REAL                 :: BX,DENOM,DF,DSWL,FK,SWL,SWLK
1386      INTEGER              :: NLOG,KCOUNT
1387!      PARAMETER(CK = 0.0)
1388      REAL, PARAMETER      :: CK = 8.0, BLIM = 5.5, ERROR = 0.005,       &
1389                              HLICE = 3.335E5, GS = 9.81,DICE = 920.0,   &
1390                              DH2O = 1000.0, T0 = 273.15
1391
1392! ----------------------------------------------------------------------
1393! LIMITS ON PARAMETER B: B < 5.5  (use parameter BLIM)
1394! SIMULATIONS SHOWED IF B > 5.5 UNFROZEN WATER CONTENT IS
1395! NON-REALISTICALLY HIGH AT VERY LOW TEMPERATURES.
1396! ----------------------------------------------------------------------
1397      BX = BEXP
1398
1399! ----------------------------------------------------------------------
1400! INITIALIZING ITERATIONS COUNTER AND ITERATIVE SOLUTION FLAG.
1401! ----------------------------------------------------------------------
1402      IF (BEXP >  BLIM) BX = BLIM
1403      NLOG = 0
1404
1405! ----------------------------------------------------------------------
1406!  IF TEMPERATURE NOT SIGNIFICANTLY BELOW FREEZING (T0), SH2O = SMC
1407! ----------------------------------------------------------------------
1408      KCOUNT = 0
1409!      FRH2O = SMC
1410      IF (TKELV > (T0- 1.E-3)) THEN
1411          FREE = SMC
1412      ELSE
1413
1414! ----------------------------------------------------------------------
1415! OPTION 1: ITERATED SOLUTION FOR NONZERO CK
1416! IN KOREN ET AL, JGR, 1999, EQN 17
1417! ----------------------------------------------------------------------
1418! INITIAL GUESS FOR SWL (frozen content)
1419! ----------------------------------------------------------------------
1420         IF (CK /= 0.0) THEN
1421            SWL = SMC - SH2O
1422! ----------------------------------------------------------------------
1423! KEEP WITHIN BOUNDS.
1424! ----------------------------------------------------------------------
1425            IF (SWL > (SMC -0.02)) SWL = SMC -0.02
1426
1427! ----------------------------------------------------------------------
1428!  START OF ITERATIONS
1429! ----------------------------------------------------------------------
1430            IF (SWL < 0.) SWL = 0.
1431 1001       Continue
1432              IF (.NOT.( (NLOG < 10) .AND. (KCOUNT == 0)))   goto 1002
1433              NLOG = NLOG +1
1434              DF = ALOG ( ( PSIS * GS / HLICE ) * ( ( 1. + CK * SWL )**2.) * &
1435                   ( SMCMAX / (SMC - SWL) )** BX) - ALOG ( - (               &
1436                   TKELV - T0)/ TKELV)
1437              DENOM = 2. * CK / ( 1. + CK * SWL ) + BX / ( SMC - SWL )
1438              SWLK = SWL - DF / DENOM
1439! ----------------------------------------------------------------------
1440! BOUNDS USEFUL FOR MATHEMATICAL SOLUTION.
1441! ----------------------------------------------------------------------
1442              IF (SWLK > (SMC -0.02)) SWLK = SMC - 0.02
1443              IF (SWLK < 0.) SWLK = 0.
1444
1445! ----------------------------------------------------------------------
1446! MATHEMATICAL SOLUTION BOUNDS APPLIED.
1447! ----------------------------------------------------------------------
1448              DSWL = ABS (SWLK - SWL)
1449
1450! ----------------------------------------------------------------------
1451! IF MORE THAN 10 ITERATIONS, USE EXPLICIT METHOD (CK=0 APPROX.)
1452! WHEN DSWL LESS OR EQ. ERROR, NO MORE ITERATIONS REQUIRED.
1453! ----------------------------------------------------------------------
1454              SWL = SWLK
1455              IF ( DSWL <= ERROR ) THEN
1456                    KCOUNT = KCOUNT +1
1457              END IF
1458! ----------------------------------------------------------------------
1459!  END OF ITERATIONS
1460! ----------------------------------------------------------------------
1461! BOUNDS APPLIED WITHIN DO-BLOCK ARE VALID FOR PHYSICAL SOLUTION.
1462! ----------------------------------------------------------------------
1463!          FRH2O = SMC - SWL
1464           goto 1001
1465 1002   continue
1466           FREE = SMC - SWL
1467         END IF
1468! ----------------------------------------------------------------------
1469! END OPTION 1
1470! ----------------------------------------------------------------------
1471! ----------------------------------------------------------------------
1472! OPTION 2: EXPLICIT SOLUTION FOR FLERCHINGER EQ. i.e. CK=0
1473! IN KOREN ET AL., JGR, 1999, EQN 17
1474! APPLY PHYSICAL BOUNDS TO FLERCHINGER SOLUTION
1475! ----------------------------------------------------------------------
1476         IF (KCOUNT == 0) THEN
1477             PRINT *,'Flerchinger USEd in NEW version. Iterations=',NLOG
1478                  FK = ( ( (HLICE / (GS * ( - PSIS)))*                    &
1479                       ( (TKELV - T0)/ TKELV))** ( -1/ BX))* SMCMAX
1480!            FRH2O = MIN (FK, SMC)
1481             IF (FK < 0.02) FK = 0.02
1482             FREE = MIN (FK, SMC)
1483! ----------------------------------------------------------------------
1484! END OPTION 2
1485! ----------------------------------------------------------------------
1486         END IF
1487      END IF
1488! ----------------------------------------------------------------------
1489  END SUBROUTINE FRH2O
1490! ----------------------------------------------------------------------
1491
1492      SUBROUTINE HRT (RHSTS,STC,SMC,SMCMAX,NSOIL,ZSOIL,YY,ZZ1,          &
1493                       TBOT,ZBOT,PSISAT,SH2O,DT,BEXP,                   &
1494                       F1,DF1,QUARTZ,CSOIL,AI,BI,CI,VEGTYP,ISURBAN)
1495
1496! ----------------------------------------------------------------------
1497! SUBROUTINE HRT
1498! ----------------------------------------------------------------------
1499! CALCULATE THE RIGHT HAND SIDE OF THE TIME TENDENCY TERM OF THE SOIL
1500! THERMAL DIFFUSION EQUATION.  ALSO TO COMPUTE ( PREPARE ) THE MATRIX
1501! COEFFICIENTS FOR THE TRI-DIAGONAL MATRIX OF THE IMPLICIT TIME SCHEME.
1502! ----------------------------------------------------------------------
1503      IMPLICIT NONE
1504      LOGICAL              :: ITAVG
1505      INTEGER, INTENT(IN)  :: NSOIL, VEGTYP
1506      INTEGER, INTENT(IN)  :: ISURBAN
1507      INTEGER              :: I, K
1508
1509      REAL, INTENT(IN)     :: BEXP, CSOIL, DF1, DT,F1,PSISAT,QUARTZ,     &
1510                              SMCMAX ,TBOT,YY,ZZ1, ZBOT
1511      REAL, DIMENSION(1:NSOIL), INTENT(IN)   :: SMC,STC,ZSOIL
1512      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: SH2O
1513      REAL, DIMENSION(1:NSOIL), INTENT(OUT)  :: RHSTS
1514      REAL, DIMENSION(1:NSOIL), INTENT(OUT)  :: AI, BI,CI
1515      REAL                 :: DDZ, DDZ2, DENOM, DF1N, DF1K, DTSDZ,       &
1516                              DTSDZ2,HCPCT,QTOT,SSOIL,SICE,TAVG,TBK,     &
1517                              TBK1,TSNSR,TSURF,CSOIL_LOC
1518      REAL, PARAMETER      :: T0 = 273.15, CAIR = 1004.0, CICE = 2.106E6,&
1519                              CH2O = 4.2E6
1520
1521
1522!urban
1523        IF( VEGTYP == ISURBAN ) then
1524            CSOIL_LOC=3.0E6
1525        ELSE
1526            CSOIL_LOC=CSOIL
1527        ENDIF
1528
1529! ----------------------------------------------------------------------
1530! INITIALIZE LOGICAL FOR SOIL LAYER TEMPERATURE AVERAGING.
1531! ----------------------------------------------------------------------
1532       ITAVG = .TRUE.
1533! ----------------------------------------------------------------------
1534! BEGIN SECTION FOR TOP SOIL LAYER
1535! ----------------------------------------------------------------------
1536! CALC THE HEAT CAPACITY OF THE TOP SOIL LAYER
1537! ----------------------------------------------------------------------
1538      HCPCT = SH2O (1)* CH2O + (1.0- SMCMAX)* CSOIL_LOC + (SMCMAX - SMC (1))&
1539       * CAIR                                                           &
1540              + ( SMC (1) - SH2O (1) )* CICE
1541
1542! ----------------------------------------------------------------------
1543! CALC THE MATRIX COEFFICIENTS AI, BI, AND CI FOR THE TOP LAYER
1544! ----------------------------------------------------------------------
1545      DDZ = 1.0 / ( -0.5 * ZSOIL (2) )
1546      AI (1) = 0.0
1547      CI (1) = (DF1 * DDZ) / (ZSOIL (1) * HCPCT)
1548
1549! ----------------------------------------------------------------------
1550! CALCULATE THE VERTICAL SOIL TEMP GRADIENT BTWN THE 1ST AND 2ND SOIL
1551! LAYERS.  THEN CALCULATE THE SUBSURFACE HEAT FLUX. USE THE TEMP
1552! GRADIENT AND SUBSFC HEAT FLUX TO CALC "RIGHT-HAND SIDE TENDENCY
1553! TERMS", OR "RHSTS", FOR TOP SOIL LAYER.
1554! ----------------------------------------------------------------------
1555      BI (1) = - CI (1) + DF1 / (0.5 * ZSOIL (1) * ZSOIL (1)* HCPCT *    &
1556       ZZ1)
1557      DTSDZ = (STC (1) - STC (2)) / ( -0.5 * ZSOIL (2))
1558      SSOIL = DF1 * (STC (1) - YY) / (0.5 * ZSOIL (1) * ZZ1)
1559!      RHSTS(1) = (DF1 * DTSDZ - SSOIL) / (ZSOIL(1) * HCPCT)
1560      DENOM = (ZSOIL (1) * HCPCT)
1561
1562! ----------------------------------------------------------------------
1563! NEXT CAPTURE THE VERTICAL DIFFERENCE OF THE HEAT FLUX AT TOP AND
1564! BOTTOM OF FIRST SOIL LAYER FOR USE IN HEAT FLUX CONSTRAINT APPLIED TO
1565! POTENTIAL SOIL FREEZING/THAWING IN ROUTINE SNKSRC.
1566! ----------------------------------------------------------------------
1567!      QTOT = SSOIL - DF1*DTSDZ
1568      RHSTS (1) = (DF1 * DTSDZ - SSOIL) / DENOM
1569
1570! ----------------------------------------------------------------------
1571! CALCULATE FROZEN WATER CONTENT IN 1ST SOIL LAYER.
1572! ----------------------------------------------------------------------
1573      QTOT = -1.0* RHSTS (1)* DENOM
1574
1575! ----------------------------------------------------------------------
1576! IF TEMPERATURE AVERAGING INVOKED (ITAVG=TRUE; ELSE SKIP):
1577! SET TEMP "TSURF" AT TOP OF SOIL COLUMN (FOR USE IN FREEZING SOIL
1578! PHYSICS LATER IN FUNCTION SUBROUTINE SNKSRC).  IF SNOWPACK CONTENT IS
1579! ZERO, THEN TSURF EXPRESSION BELOW GIVES TSURF = SKIN TEMP.  IF
1580! SNOWPACK IS NONZERO (HENCE ARGUMENT ZZ1=1), THEN TSURF EXPRESSION
1581! BELOW YIELDS SOIL COLUMN TOP TEMPERATURE UNDER SNOWPACK.  THEN
1582! CALCULATE TEMPERATURE AT BOTTOM INTERFACE OF 1ST SOIL LAYER FOR USE
1583! LATER IN FUNCTION SUBROUTINE SNKSRC
1584! ----------------------------------------------------------------------
1585      SICE = SMC (1) - SH2O (1)
1586      IF (ITAVG) THEN
1587         TSURF = (YY + (ZZ1-1) * STC (1)) / ZZ1
1588! ----------------------------------------------------------------------
1589! IF FROZEN WATER PRESENT OR ANY OF LAYER-1 MID-POINT OR BOUNDING
1590! INTERFACE TEMPERATURES BELOW FREEZING, THEN CALL SNKSRC TO
1591! COMPUTE HEAT SOURCE/SINK (AND CHANGE IN FROZEN WATER CONTENT)
1592! DUE TO POSSIBLE SOIL WATER PHASE CHANGE
1593! ----------------------------------------------------------------------
1594         CALL TBND (STC (1),STC (2),ZSOIL,ZBOT,1,NSOIL,TBK)
1595         IF ( (SICE > 0.) .OR. (STC (1) < T0) .OR.                         &
1596            (TSURF < T0) .OR. (TBK < T0) ) THEN
1597!          TSNSR = SNKSRC (TAVG,SMC(1),SH2O(1),
1598            CALL TMPAVG (TAVG,TSURF,STC (1),TBK,ZSOIL,NSOIL,1)
1599            CALL SNKSRC (TSNSR,TAVG,SMC (1),SH2O (1),                      &
1600                          ZSOIL,NSOIL,SMCMAX,PSISAT,BEXP,DT,1,QTOT)
1601!          RHSTS(1) = RHSTS(1) - TSNSR / ( ZSOIL(1) * HCPCT )
1602            RHSTS (1) = RHSTS (1) - TSNSR / DENOM
1603         END IF
1604      ELSE
1605!          TSNSR = SNKSRC (STC(1),SMC(1),SH2O(1),
1606         IF ( (SICE > 0.) .OR. (STC (1) < T0) ) THEN
1607            CALL SNKSRC (TSNSR,STC (1),SMC (1),SH2O (1),                   &
1608                          ZSOIL,NSOIL,SMCMAX,PSISAT,BEXP,DT,1,QTOT)
1609!          RHSTS(1) = RHSTS(1) - TSNSR / ( ZSOIL(1) * HCPCT )
1610            RHSTS (1) = RHSTS (1) - TSNSR / DENOM
1611         END IF
1612! ----------------------------------------------------------------------
1613! THIS ENDS SECTION FOR TOP SOIL LAYER.
1614! ----------------------------------------------------------------------
1615      END IF
1616
1617! INITIALIZE DDZ2
1618! ----------------------------------------------------------------------
1619
1620      DDZ2 = 0.0
1621      DF1K = DF1
1622
1623! ----------------------------------------------------------------------
1624! LOOP THRU THE REMAINING SOIL LAYERS, REPEATING THE ABOVE PROCESS
1625! (EXCEPT SUBSFC OR "GROUND" HEAT FLUX NOT REPEATED IN LOWER LAYERS)
1626! ----------------------------------------------------------------------
1627! CALCULATE HEAT CAPACITY FOR THIS SOIL LAYER.
1628! ----------------------------------------------------------------------
1629      DO K = 2,NSOIL
1630         HCPCT = SH2O (K)* CH2O + (1.0- SMCMAX)* CSOIL_LOC + (SMCMAX - SMC (  &
1631                K))* CAIR + ( SMC (K) - SH2O (K) )* CICE
1632! ----------------------------------------------------------------------
1633! THIS SECTION FOR LAYER 2 OR GREATER, BUT NOT LAST LAYER.
1634! ----------------------------------------------------------------------
1635! CALCULATE THERMAL DIFFUSIVITY FOR THIS LAYER.
1636! ----------------------------------------------------------------------
1637         IF (K /= NSOIL) THEN
1638
1639! ----------------------------------------------------------------------
1640! CALC THE VERTICAL SOIL TEMP GRADIENT THRU THIS LAYER
1641! ----------------------------------------------------------------------
1642            CALL TDFCND (DF1N,SMC (K),QUARTZ,SMCMAX,SH2O (K))
1643
1644!urban
1645       IF ( VEGTYP == ISURBAN ) DF1N = 3.24
1646
1647            DENOM = 0.5 * ( ZSOIL (K -1) - ZSOIL (K +1) )
1648
1649! ----------------------------------------------------------------------
1650! CALC THE MATRIX COEF, CI, AFTER CALC'NG ITS PARTIAL PRODUCT
1651! ----------------------------------------------------------------------
1652            DTSDZ2 = ( STC (K) - STC (K +1) ) / DENOM
1653            DDZ2 = 2. / (ZSOIL (K -1) - ZSOIL (K +1))
1654
1655! ----------------------------------------------------------------------
1656! IF TEMPERATURE AVERAGING INVOKED (ITAVG=TRUE; ELSE SKIP):  CALCULATE
1657! TEMP AT BOTTOM OF LAYER.
1658! ----------------------------------------------------------------------
1659            CI (K) = - DF1N * DDZ2 / ( (ZSOIL (K -1) - ZSOIL (K)) *      &
1660       HCPCT)
1661            IF (ITAVG) THEN
1662               CALL TBND (STC (K),STC (K +1),ZSOIL,ZBOT,K,NSOIL,TBK1)
1663            END IF
1664
1665         ELSE
1666! ----------------------------------------------------------------------
1667! SPECIAL CASE OF BOTTOM SOIL LAYER:  CALCULATE THERMAL DIFFUSIVITY FOR
1668! BOTTOM LAYER.
1669! ----------------------------------------------------------------------
1670
1671! ----------------------------------------------------------------------
1672! CALC THE VERTICAL SOIL TEMP GRADIENT THRU BOTTOM LAYER.
1673! ----------------------------------------------------------------------
1674            CALL TDFCND (DF1N,SMC (K),QUARTZ,SMCMAX,SH2O (K))
1675
1676
1677!urban
1678       IF ( VEGTYP == ISURBAN ) DF1N = 3.24
1679
1680            DENOM = .5 * (ZSOIL (K -1) + ZSOIL (K)) - ZBOT
1681
1682! ----------------------------------------------------------------------
1683! SET MATRIX COEF, CI TO ZERO IF BOTTOM LAYER.
1684! ----------------------------------------------------------------------
1685            DTSDZ2 = (STC (K) - TBOT) / DENOM
1686
1687! ----------------------------------------------------------------------
1688! IF TEMPERATURE AVERAGING INVOKED (ITAVG=TRUE; ELSE SKIP):  CALCULATE
1689! TEMP AT BOTTOM OF LAST LAYER.
1690! ----------------------------------------------------------------------
1691            CI (K) = 0.
1692            IF (ITAVG) THEN
1693               CALL TBND (STC (K),TBOT,ZSOIL,ZBOT,K,NSOIL,TBK1)
1694            END IF
1695! ----------------------------------------------------------------------
1696! THIS ENDS SPECIAL LOOP FOR BOTTOM LAYER.
1697         END IF
1698! ----------------------------------------------------------------------
1699! CALCULATE RHSTS FOR THIS LAYER AFTER CALC'NG A PARTIAL PRODUCT.
1700! ----------------------------------------------------------------------
1701         DENOM = ( ZSOIL (K) - ZSOIL (K -1) ) * HCPCT
1702         RHSTS (K) = ( DF1N * DTSDZ2- DF1K * DTSDZ ) / DENOM
1703         QTOT = -1.0* DENOM * RHSTS (K)
1704
1705         SICE = SMC (K) - SH2O (K)
1706         IF (ITAVG) THEN
1707            CALL TMPAVG (TAVG,TBK,STC (K),TBK1,ZSOIL,NSOIL,K)
1708!            TSNSR = SNKSRC(TAVG,SMC(K),SH2O(K),ZSOIL,NSOIL,
1709            IF ( (SICE > 0.) .OR. (STC (K) < T0) .OR.                   &
1710               (TBK .lt. T0) .OR. (TBK1 .lt. T0) ) THEN
1711               CALL SNKSRC (TSNSR,TAVG,SMC (K),SH2O (K),ZSOIL,NSOIL,    &
1712                             SMCMAX,PSISAT,BEXP,DT,K,QTOT)
1713               RHSTS (K) = RHSTS (K) - TSNSR / DENOM
1714            END IF
1715         ELSE
1716!            TSNSR = SNKSRC(STC(K),SMC(K),SH2O(K),ZSOIL,NSOIL,
1717            IF ( (SICE > 0.) .OR. (STC (K) < T0) ) THEN
1718               CALL SNKSRC (TSNSR,STC (K),SMC (K),SH2O (K),ZSOIL,NSOIL, &
1719                             SMCMAX,PSISAT,BEXP,DT,K,QTOT)
1720               RHSTS (K) = RHSTS (K) - TSNSR / DENOM
1721            END IF
1722         END IF
1723
1724! ----------------------------------------------------------------------
1725! CALC MATRIX COEFS, AI, AND BI FOR THIS LAYER.
1726! ----------------------------------------------------------------------
1727         AI (K) = - DF1K * DDZ / ( (ZSOIL (K -1) - ZSOIL (K)) * HCPCT)
1728
1729! ----------------------------------------------------------------------
1730! RESET VALUES OF DF1, DTSDZ, DDZ, AND TBK FOR LOOP TO NEXT SOIL LAYER.
1731! ----------------------------------------------------------------------
1732         BI (K) = - (AI (K) + CI (K))
1733         TBK = TBK1
1734         DF1K = DF1N
1735         DTSDZ = DTSDZ2
1736         DDZ = DDZ2
1737      END DO
1738! ----------------------------------------------------------------------
1739  END SUBROUTINE HRT
1740! ----------------------------------------------------------------------
1741
1742      SUBROUTINE HRTICE (RHSTS,STC,TBOT,ICE,NSOIL,ZSOIL,YY,ZZ1,DF1,AI,BI,CI)
1743
1744! ----------------------------------------------------------------------
1745! SUBROUTINE HRTICE
1746! ----------------------------------------------------------------------
1747! CALCULATE THE RIGHT HAND SIDE OF THE TIME TENDENCY TERM OF THE SOIL
1748! THERMAL DIFFUSION EQUATION IN THE CASE OF SEA-ICE (ICE=1) OR GLACIAL
1749! ICE (ICE=-1). COMPUTE (PREPARE) THE MATRIX COEFFICIENTS FOR THE
1750! TRI-DIAGONAL MATRIX OF THE IMPLICIT TIME SCHEME.
1751!
1752! (NOTE:  THIS SUBROUTINE ONLY CALLED FOR SEA-ICE OR GLACIAL ICE, BUT
1753! NOT FOR NON-GLACIAL LAND (ICE = 0).
1754! ----------------------------------------------------------------------
1755      IMPLICIT NONE
1756
1757
1758      INTEGER, INTENT(IN)    :: NSOIL
1759      INTEGER                :: K
1760
1761      REAL,    INTENT(IN)    :: DF1,YY,ZZ1
1762      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: AI, BI,CI
1763      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: STC, ZSOIL
1764      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: RHSTS
1765      REAL,                     INTENT(IN) :: TBOT
1766      INTEGER,                  INTENT(IN) :: ICE
1767      REAL                   :: DDZ,DDZ2,DENOM,DTSDZ,DTSDZ2,SSOIL,       &
1768                                ZBOT
1769      REAL                   :: HCPCT
1770      REAL :: DF1K
1771      REAL :: DF1N
1772      REAL :: ZMD
1773
1774! ----------------------------------------------------------------------
1775! SET A NOMINAL UNIVERSAL VALUE OF THE SEA-ICE SPECIFIC HEAT CAPACITY,
1776! HCPCT = 1880.0*917.0.
1777! ----------------------------------------------------------------------
1778      IF ( ICE == 1 ) THEN
1779         ! Sea-ice values
1780         HCPCT = 1.72396E+6
1781      ELSEIF (ICE == -1) THEN
1782! SET A NOMINAL UNIVERSAL VALUE OF GLACIAL-ICE SPECIFIC HEAT CAPACITY,
1783!   HCPCT = 2100.0*900.0 = 1.89000E+6 (SOURCE:  BOB GRUMBINE, 2005)
1784!   TBOT PASSED IN AS ARGUMENT, VALUE FROM GLOBAL DATA SET
1785         !
1786         ! A least-squares fit for the four points provided by
1787         ! Keith Hines for the Yen (1981) values for Antarctic
1788         ! snow firn.
1789         !
1790         HCPCT = 1.E6 * (0.8194 - 0.1309*0.5*ZSOIL(1))
1791         DF1K = DF1
1792      ENDIF
1793
1794! ----------------------------------------------------------------------
1795! THE INPUT ARGUMENT DF1 IS A UNIVERSALLY CONSTANT VALUE OF SEA-ICE
1796! THERMAL DIFFUSIVITY, SET IN ROUTINE SNOPAC AS DF1 = 2.2.
1797! ----------------------------------------------------------------------
1798! SET ICE PACK DEPTH.  USE TBOT AS ICE PACK LOWER BOUNDARY TEMPERATURE
1799! (THAT OF UNFROZEN SEA WATER AT BOTTOM OF SEA ICE PACK).  ASSUME ICE
1800! PACK IS OF N=NSOIL LAYERS SPANNING A UNIFORM CONSTANT ICE PACK
1801! THICKNESS AS DEFINED BY ZSOIL(NSOIL) IN ROUTINE SFLX.
1802! ----------------------------------------------------------------------
1803! ----------------------------------------------------------------------
1804! CALC THE MATRIX COEFFICIENTS AI, BI, AND CI FOR THE TOP LAYER
1805! ----------------------------------------------------------------------
1806      IF (ICE == 1) THEN
1807         ZBOT = ZSOIL (NSOIL)
1808      ELSE IF (ICE == -1) THEN
1809         ZBOT = -25.0
1810      ENDIF
1811      DDZ = 1.0 / ( -0.5 * ZSOIL (2) )
1812      AI (1) = 0.0
1813      CI (1) = (DF1 * DDZ) / (ZSOIL (1) * HCPCT)
1814
1815! ----------------------------------------------------------------------
1816! CALC THE VERTICAL SOIL TEMP GRADIENT BTWN THE TOP AND 2ND SOIL LAYERS.
1817! RECALC/ADJUST THE SOIL HEAT FLUX.  USE THE GRADIENT AND FLUX TO CALC
1818! RHSTS FOR THE TOP SOIL LAYER.
1819! ----------------------------------------------------------------------
1820      BI (1) = - CI (1) + DF1/ (0.5 * ZSOIL (1) * ZSOIL (1) * HCPCT *    &
1821       ZZ1)
1822      DTSDZ = ( STC (1) - STC (2) ) / ( -0.5 * ZSOIL (2) )
1823      SSOIL = DF1 * ( STC (1) - YY ) / ( 0.5 * ZSOIL (1) * ZZ1 )
1824
1825! ----------------------------------------------------------------------
1826! INITIALIZE DDZ2
1827! ----------------------------------------------------------------------
1828      RHSTS (1) = ( DF1 * DTSDZ - SSOIL ) / ( ZSOIL (1) * HCPCT )
1829
1830! ----------------------------------------------------------------------
1831! LOOP THRU THE REMAINING SOIL LAYERS, REPEATING THE ABOVE PROCESS
1832! ----------------------------------------------------------------------
1833      DDZ2 = 0.0
1834      DF1K = DF1
1835      DF1N = DF1
1836      DO K = 2,NSOIL
1837
1838       IF ( ICE == -1 ) THEN
1839          ZMD = 0.5 * (ZSOIL(K)+ZSOIL(K-1))
1840          ! For the land-ice case
1841! kmh 09/03/2006 use Yen (1981)'s values for Antarctic snow firn
1842!         IF ( K .eq. 2 ) HCPCT = 0.855108E6
1843!         IF ( K .eq. 3 ) HCPCT = 0.922906E6
1844!         IF ( K .eq. 4 ) HCPCT = 1.009986E6
1845
1846          ! Least squares fit to the four points supplied by Keith Hines
1847          ! from Yen (1981) for Antarctic snow firn.  Not optimal, but
1848          ! probably better than just a constant.
1849          HCPCT = 1.E6 * ( 0.8194 - 0.1309*ZMD )
1850
1851!         IF ( K .eq. 2 ) DF1N = 0.345356
1852!         IF ( K .eq. 3 ) DF1N = 0.398777
1853!         IF ( K .eq. 4 ) DF1N = 0.472653
1854
1855          ! Least squares fit to the three points supplied by Keith Hines
1856          ! from Yen (1981) for Antarctic snow firn.  Not optimal, but
1857          ! probably better than just a constant.
1858          DF1N = 0.32333 - ( 0.10073 * ZMD )
1859       ENDIF
1860! ----------------------------------------------------------------------
1861! CALC THE VERTICAL SOIL TEMP GRADIENT THRU THIS LAYER.
1862! ----------------------------------------------------------------------
1863         IF (K /= NSOIL) THEN
1864            DENOM = 0.5 * ( ZSOIL (K -1) - ZSOIL (K +1) )
1865
1866! ----------------------------------------------------------------------
1867! CALC THE MATRIX COEF, CI, AFTER CALC'NG ITS PARTIAL PRODUCT.
1868! ----------------------------------------------------------------------
1869            DTSDZ2 = ( STC (K) - STC (K +1) ) / DENOM
1870            DDZ2 = 2. / (ZSOIL (K -1) - ZSOIL (K +1))
1871            CI (K) = - DF1N * DDZ2 / ( (ZSOIL (K -1) - ZSOIL (K))*HCPCT)
1872
1873! ----------------------------------------------------------------------
1874! CALC THE VERTICAL SOIL TEMP GRADIENT THRU THE LOWEST LAYER.
1875! ----------------------------------------------------------------------
1876         ELSE
1877
1878! ----------------------------------------------------------------------
1879! SET MATRIX COEF, CI TO ZERO.
1880! ----------------------------------------------------------------------
1881            DTSDZ2 = (STC (K) - TBOT)/ (.5 * (ZSOIL (K -1) + ZSOIL (K)) &
1882                     - ZBOT)
1883            CI (K) = 0.
1884! ----------------------------------------------------------------------
1885! CALC RHSTS FOR THIS LAYER AFTER CALC'NG A PARTIAL PRODUCT.
1886! ----------------------------------------------------------------------
1887         END IF
1888         DENOM = ( ZSOIL (K) - ZSOIL (K -1) ) * HCPCT
1889
1890! ----------------------------------------------------------------------
1891! CALC MATRIX COEFS, AI, AND BI FOR THIS LAYER.
1892! ----------------------------------------------------------------------
1893         RHSTS (K) = ( DF1N * DTSDZ2- DF1K * DTSDZ ) / DENOM
1894         AI (K) = - DF1K * DDZ / ( (ZSOIL (K -1) - ZSOIL (K)) * HCPCT)
1895
1896! ----------------------------------------------------------------------
1897! RESET VALUES OF DTSDZ AND DDZ FOR LOOP TO NEXT SOIL LYR.
1898! ----------------------------------------------------------------------
1899         BI (K) = - (AI (K) + CI (K))
1900         DF1K = DF1N
1901         DTSDZ = DTSDZ2
1902         DDZ = DDZ2
1903      END DO
1904! ----------------------------------------------------------------------
1905  END SUBROUTINE HRTICE
1906! ----------------------------------------------------------------------
1907
1908      SUBROUTINE HSTEP (STCOUT,STCIN,RHSTS,DT,NSOIL,AI,BI,CI)
1909
1910! ----------------------------------------------------------------------
1911! SUBROUTINE HSTEP
1912! ----------------------------------------------------------------------
1913! CALCULATE/UPDATE THE SOIL TEMPERATURE FIELD.
1914! ----------------------------------------------------------------------
1915      IMPLICIT NONE
1916      INTEGER, INTENT(IN)  :: NSOIL
1917      INTEGER              :: K
1918
1919      REAL, DIMENSION(1:NSOIL), INTENT(IN):: STCIN
1920      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: STCOUT
1921      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: RHSTS
1922      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: AI,BI,CI
1923      REAL, DIMENSION(1:NSOIL) :: RHSTSin
1924      REAL, DIMENSION(1:NSOIL) :: CIin
1925      REAL                 :: DT
1926
1927! ----------------------------------------------------------------------
1928! CREATE FINITE DIFFERENCE VALUES FOR USE IN ROSR12 ROUTINE
1929! ----------------------------------------------------------------------
1930      DO K = 1,NSOIL
1931         RHSTS (K) = RHSTS (K) * DT
1932         AI (K) = AI (K) * DT
1933         BI (K) = 1. + BI (K) * DT
1934         CI (K) = CI (K) * DT
1935      END DO
1936! ----------------------------------------------------------------------
1937! COPY VALUES FOR INPUT VARIABLES BEFORE CALL TO ROSR12
1938! ----------------------------------------------------------------------
1939      DO K = 1,NSOIL
1940         RHSTSin (K) = RHSTS (K)
1941      END DO
1942      DO K = 1,NSOIL
1943         CIin (K) = CI (K)
1944      END DO
1945! ----------------------------------------------------------------------
1946! SOLVE THE TRI-DIAGONAL MATRIX EQUATION
1947! ----------------------------------------------------------------------
1948      CALL ROSR12 (CI,AI,BI,CIin,RHSTSin,RHSTS,NSOIL)
1949! ----------------------------------------------------------------------
1950! CALC/UPDATE THE SOIL TEMPS USING MATRIX SOLUTION
1951! ----------------------------------------------------------------------
1952      DO K = 1,NSOIL
1953         STCOUT (K) = STCIN (K) + CI (K)
1954      END DO
1955! ----------------------------------------------------------------------
1956  END SUBROUTINE HSTEP
1957! ----------------------------------------------------------------------
1958
1959      SUBROUTINE NOPAC (ETP,ETA,PRCP,SMC,SMCMAX,SMCWLT,                 &
1960                         SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT,SHDFAC,      &
1961                         SBETA,Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,EMISSI,    &
1962                         SSOIL,                                         &
1963                         STC,EPSCA,BEXP,PC,RCH,RR,CFACTR,               &
1964                         SH2O,SLOPE,KDT,FRZFACT,PSISAT,ZSOIL,           &
1965                         DKSAT,DWSAT,TBOT,ZBOT,RUNOFF1,RUNOFF2,         &
1966                         RUNOFF3,EDIR,EC,ET,ETT,NROOT,ICE,RTDIS,        &
1967                         QUARTZ,FXEXP,CSOIL,                            &
1968                         BETA,DRIP,DEW,FLX1,FLX3,VEGTYP,ISURBAN)
1969
1970! ----------------------------------------------------------------------
1971! SUBROUTINE NOPAC
1972! ----------------------------------------------------------------------
1973! CALCULATE SOIL MOISTURE AND HEAT FLUX VALUES AND UPDATE SOIL MOISTURE
1974! CONTENT AND SOIL HEAT CONTENT VALUES FOR THE CASE WHEN NO SNOW PACK IS
1975! PRESENT.
1976! ----------------------------------------------------------------------
1977      IMPLICIT NONE
1978
1979      INTEGER, INTENT(IN)  :: ICE, NROOT,NSOIL,VEGTYP
1980      INTEGER, INTENT(IN)  :: ISURBAN
1981      INTEGER              :: K
1982
1983      REAL, INTENT(IN)     :: BEXP,CFACTR, CMCMAX,CSOIL,DKSAT,DT,DWSAT, &
1984                              EPSCA,ETP,FDOWN,F1,FXEXP,FRZFACT,KDT,PC,  &
1985                              PRCP,PSISAT,Q2,QUARTZ,RCH,RR,SBETA,SFCTMP,&
1986                              SHDFAC,SLOPE,SMCDRY,SMCMAX,SMCREF,SMCWLT, &
1987                              T24,TBOT,TH2,ZBOT,EMISSI
1988      REAL, INTENT(INOUT)  :: CMC,BETA,T1
1989      REAL, INTENT(OUT)    :: DEW,DRIP,EC,EDIR,ETA,ETT,FLX1,FLX3,       &
1990                              RUNOFF1,RUNOFF2,RUNOFF3,SSOIL
1991      REAL, DIMENSION(1:NSOIL),INTENT(IN)     :: RTDIS,ZSOIL
1992      REAL, DIMENSION(1:NSOIL),INTENT(OUT)    :: ET
1993      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC,SH2O,STC
1994      REAL, DIMENSION(1:NSOIL) :: ET1
1995      REAL                 :: EC1,EDIR1,ETT1,DF1,ETA1,ETP1,PRCP1,YY,    &
1996                              YYNUM,ZZ1
1997
1998! ----------------------------------------------------------------------
1999! EXECUTABLE CODE BEGINS HERE:
2000! CONVERT ETP Fnd PRCP FROM KG M-2 S-1 TO M S-1 AND INITIALIZE DEW.
2001! ----------------------------------------------------------------------
2002      PRCP1 = PRCP * 0.001
2003      ETP1 = ETP * 0.001
2004      DEW = 0.0
2005! ----------------------------------------------------------------------
2006! INITIALIZE EVAP TERMS.
2007! ----------------------------------------------------------------------
2008      EDIR = 0.
2009      EDIR1 = 0.
2010      EC1 = 0.
2011      EC = 0.
2012      DO K = 1,NSOIL
2013        ET(K) = 0.
2014        ET1(K) = 0.
2015      END DO
2016      ETT = 0.
2017      ETT1 = 0.
2018
2019      IF (ETP > 0.0) THEN
2020         CALL EVAPO (ETA1,SMC,NSOIL,CMC,ETP1,DT,ZSOIL,                  &
2021                      SH2O,                                             &
2022                      SMCMAX,BEXP,PC,SMCWLT,DKSAT,DWSAT,                &
2023                      SMCREF,SHDFAC,CMCMAX,                             &
2024                      SMCDRY,CFACTR,                                    &
2025                       EDIR1,EC1,ET1,ETT1,SFCTMP,Q2,NROOT,RTDIS,FXEXP)
2026         CALL SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL,                      &
2027                      SH2O,SLOPE,KDT,FRZFACT,                           &
2028                      SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT,                   &
2029                      SHDFAC,CMCMAX,                                    &
2030                      RUNOFF1,RUNOFF2,RUNOFF3,                          &
2031                      EDIR1,EC1,ET1,                                    &
2032                      DRIP)
2033
2034! ----------------------------------------------------------------------
2035! CONVERT MODELED EVAPOTRANSPIRATION FROM  M S-1  TO  KG M-2 S-1.
2036! ----------------------------------------------------------------------
2037
2038         ETA = ETA1 * 1000.0
2039
2040! ----------------------------------------------------------------------
2041! IF ETP < 0, ASSUME DEW FORMS (TRANSFORM ETP1 INTO DEW AND REINITIALIZE
2042! ETP1 TO ZERO).
2043! ----------------------------------------------------------------------
2044      ELSE
2045         DEW = - ETP1
2046
2047! ----------------------------------------------------------------------
2048! CONVERT PRCP FROM 'KG M-2 S-1' TO 'M S-1' AND ADD DEW AMOUNT.
2049! ----------------------------------------------------------------------
2050
2051         PRCP1 = PRCP1+ DEW
2052         CALL SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL,                      &
2053                      SH2O,SLOPE,KDT,FRZFACT,                           &
2054                      SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT,                   &
2055                      SHDFAC,CMCMAX,                                    &
2056                      RUNOFF1,RUNOFF2,RUNOFF3,                          &
2057                      EDIR1,EC1,ET1,                                    &
2058                      DRIP)
2059
2060! ----------------------------------------------------------------------
2061! CONVERT MODELED EVAPOTRANSPIRATION FROM 'M S-1' TO 'KG M-2 S-1'.
2062! ----------------------------------------------------------------------
2063!         ETA = ETA1 * 1000.0
2064      END IF
2065
2066! ----------------------------------------------------------------------
2067! BASED ON ETP AND E VALUES, DETERMINE BETA
2068! ----------------------------------------------------------------------
2069
2070      IF ( ETP <= 0.0 ) THEN
2071         BETA = 0.0
2072         ETA = ETP
2073         IF ( ETP < 0.0 ) THEN
2074            BETA = 1.0
2075         END IF
2076      ELSE
2077         BETA = ETA / ETP
2078      END IF
2079
2080! ----------------------------------------------------------------------
2081! CONVERT MODELED EVAPOTRANSPIRATION COMPONENTS 'M S-1' TO 'KG M-2 S-1'.
2082! ----------------------------------------------------------------------
2083      EDIR = EDIR1*1000.
2084      EC = EC1*1000.
2085      DO K = 1,NSOIL
2086        ET(K) = ET1(K)*1000.
2087      END DO
2088      ETT = ETT1*1000.
2089
2090! ----------------------------------------------------------------------
2091! GET SOIL THERMAL DIFFUXIVITY/CONDUCTIVITY FOR TOP SOIL LYR,
2092! CALC. ADJUSTED TOP LYR SOIL TEMP AND ADJUSTED SOIL FLUX, THEN
2093! CALL SHFLX TO COMPUTE/UPDATE SOIL HEAT FLUX AND SOIL TEMPS.
2094! ----------------------------------------------------------------------
2095
2096      CALL TDFCND (DF1,SMC (1),QUARTZ,SMCMAX,SH2O (1))
2097
2098!urban
2099      IF ( VEGTYP == ISURBAN ) DF1=3.24
2100!
2101
2102! ----------------------------------------------------------------------
2103! VEGETATION GREENNESS FRACTION REDUCTION IN SUBSURFACE HEAT FLUX
2104! VIA REDUCTION FACTOR, WHICH IS CONVENIENT TO APPLY HERE TO THERMAL
2105! DIFFUSIVITY THAT IS LATER USED IN HRT TO COMPUTE SUB SFC HEAT FLUX
2106! (SEE ADDITIONAL COMMENTS ON VEG EFFECT SUB-SFC HEAT FLX IN
2107! ROUTINE SFLX)
2108! ----------------------------------------------------------------------
2109      DF1 = DF1 * EXP (SBETA * SHDFAC)
2110! ----------------------------------------------------------------------
2111! COMPUTE INTERMEDIATE TERMS PASSED TO ROUTINE HRT (VIA ROUTINE
2112! SHFLX BELOW) FOR USE IN COMPUTING SUBSURFACE HEAT FLUX IN HRT
2113! ----------------------------------------------------------------------
2114      YYNUM = FDOWN - EMISSI*SIGMA * T24
2115      YY = SFCTMP + (YYNUM / RCH + TH2- SFCTMP - BETA * EPSCA) / RR
2116
2117      ZZ1 = DF1 / ( -0.5 * ZSOIL (1) * RCH * RR ) + 1.0
2118
2119!urban
2120      CALL SHFLX (SSOIL,STC,SMC,SMCMAX,NSOIL,T1,DT,YY,ZZ1,ZSOIL,        &
2121                  TBOT,ZBOT,SMCWLT,PSISAT,SH2O,BEXP,F1,DF1,ICE,         &
2122                  QUARTZ,CSOIL,VEGTYP,ISURBAN)
2123
2124! ----------------------------------------------------------------------
2125! SET FLX1 AND FLX3 (SNOPACK PHASE CHANGE HEAT FLUXES) TO ZERO SINCE
2126! THEY ARE NOT USED HERE IN SNOPAC.  FLX2 (FREEZING RAIN HEAT FLUX) WAS
2127! SIMILARLY INITIALIZED IN THE PENMAN ROUTINE.
2128! ----------------------------------------------------------------------
2129      FLX1 = CPH2O * PRCP * (T1- SFCTMP)
2130      FLX3 = 0.0
2131
2132! ----------------------------------------------------------------------
2133  END SUBROUTINE NOPAC
2134! ----------------------------------------------------------------------
2135
2136      SUBROUTINE PENMAN (SFCTMP,SFCPRS,CH,T2V,TH2,PRCP,FDOWN,T24,SSOIL, &
2137     &                   Q2,Q2SAT,ETP,RCH,EPSCA,RR,SNOWNG,FRZGRA,       &
2138     &              DQSDT2,FLX2,EMISSI_IN,SNEQV,T1,ICE,SNCOVR)
2139
2140! ----------------------------------------------------------------------
2141! SUBROUTINE PENMAN
2142! ----------------------------------------------------------------------
2143! CALCULATE POTENTIAL EVAPORATION FOR THE CURRENT POINT.  VARIOUS
2144! PARTIAL SUMS/PRODUCTS ARE ALSO CALCULATED AND PASSED BACK TO THE
2145! CALLING ROUTINE FOR LATER USE.
2146! ----------------------------------------------------------------------
2147      IMPLICIT NONE
2148      LOGICAL, INTENT(IN)     :: SNOWNG, FRZGRA
2149      REAL, INTENT(IN)        :: CH, DQSDT2,FDOWN,PRCP,                 &
2150                                 Q2, Q2SAT,SSOIL, SFCPRS, SFCTMP,       &
2151                                 T2V, TH2,EMISSI_IN,SNEQV
2152      REAL, INTENT(IN)        :: T1 , SNCOVR
2153!
2154! kmh 09/13/2006
2155      INTEGER, INTENT(IN)     :: ICE
2156! kmh 09/03/2006
2157!
2158      REAL, INTENT(OUT)       :: EPSCA,ETP,FLX2,RCH,RR,T24
2159      REAL                    :: A, DELTA, FNET,RAD,RHO,EMISSI,ELCP1,LVS
2160
2161      REAL, PARAMETER      :: ELCP = 2.4888E+3, LSUBC = 2.501000E+6,CP = 1004.6
2162      REAL, PARAMETER      :: LSUBS = 2.83E+6
2163
2164! ----------------------------------------------------------------------
2165! EXECUTABLE CODE BEGINS HERE:
2166! ----------------------------------------------------------------------
2167! ----------------------------------------------------------------------
2168! PREPARE PARTIAL QUANTITIES FOR PENMAN EQUATION.
2169! ----------------------------------------------------------------------
2170        EMISSI=EMISSI_IN
2171        IF (ICE==0) THEN
2172           ELCP1  = (1.0-SNCOVR)*ELCP  + SNCOVR*ELCP*LSUBS/LSUBC
2173           LVS    = (1.0-SNCOVR)*LSUBC + SNCOVR*LSUBS
2174        ELSE
2175           IF ( T1 > 273.15 ) THEN
2176              ELCP1=ELCP
2177              LVS=LSUBC
2178           ELSE
2179              ELCP1  = ELCP*LSUBS/LSUBC
2180              LVS    = LSUBS
2181           ENDIF
2182        ENDIF
2183
2184      FLX2 = 0.0
2185!      DELTA = ELCP * DQSDT2
2186      DELTA = ELCP1 * DQSDT2
2187      T24 = SFCTMP * SFCTMP * SFCTMP * SFCTMP
2188!      RR = T24 * 6.48E-8 / (SFCPRS * CH) + 1.0
2189      RR = EMISSI*T24 * 6.48E-8 / (SFCPRS * CH) + 1.0
2190      RHO = SFCPRS / (RD * T2V)
2191
2192! ----------------------------------------------------------------------
2193! ADJUST THE PARTIAL SUMS / PRODUCTS WITH THE LATENT HEAT
2194! EFFECTS CAUSED BY FALLING PRECIPITATION.
2195! ----------------------------------------------------------------------
2196      RCH = RHO * CP * CH
2197      IF (.NOT. SNOWNG) THEN
2198         IF (PRCP >  0.0) RR = RR + CPH2O * PRCP / RCH
2199      ELSE
2200         RR = RR + CPICE * PRCP / RCH
2201      END IF
2202
2203! ----------------------------------------------------------------------
2204! INCLUDE THE LATENT HEAT EFFECTS OF FRZNG RAIN CONVERTING TO ICE ON
2205! IMPACT IN THE CALCULATION OF FLX2 AND FNET.
2206! ----------------------------------------------------------------------
2207!      FNET = FDOWN - SIGMA * T24- SSOIL
2208      FNET = FDOWN -  EMISSI*SIGMA * T24- SSOIL
2209      IF (FRZGRA) THEN
2210         FLX2 = - LSUBF * PRCP
2211         FNET = FNET - FLX2
2212! ----------------------------------------------------------------------
2213! FINISH PENMAN EQUATION CALCULATIONS.
2214! ----------------------------------------------------------------------
2215      END IF
2216      RAD = FNET / RCH + TH2- SFCTMP
2217!      A = ELCP * (Q2SAT - Q2)
2218      A = ELCP1 * (Q2SAT - Q2)
2219      EPSCA = (A * RR + RAD * DELTA) / (DELTA + RR)
2220!      ETP = EPSCA * RCH / LSUBC
2221      ETP = EPSCA * RCH / LVS
2222
2223! ----------------------------------------------------------------------
2224  END SUBROUTINE PENMAN
2225! ----------------------------------------------------------------------
2226
2227      SUBROUTINE REDPRM (VEGTYP,SOILTYP,SLOPETYP,CFACTR,CMCMAX,RSMAX,      &
2228                         TOPT,                                             &
2229                         REFKDT,KDT,SBETA, SHDFAC,RSMIN,RGL,HS,ZBOT,FRZX,  &
2230                         PSISAT,SLOPE,SNUP,SALP,BEXP,DKSAT,DWSAT,          &
2231                         SMCMAX,SMCWLT,SMCREF,SMCDRY,F1,QUARTZ,FXEXP,      &
2232                         RTDIS,SLDPTH,ZSOIL, NROOT,NSOIL,CZIL,             &
2233                         LAIMIN, LAIMAX, EMISSMIN, EMISSMAX, ALBEDOMIN,    &
2234                         ALBEDOMAX, Z0MIN, Z0MAX, CSOIL, PTU, LLANDUSE,    &
2235                         LSOIL, LOCAL,LVCOEF)
2236
2237      IMPLICIT NONE
2238! ----------------------------------------------------------------------
2239! Internally set (default valuess)
2240! all soil and vegetation parameters required for the execusion oF
2241! the Noah lsm are defined in VEGPARM.TBL, SOILPARM.TB, and GENPARM.TBL.
2242! ----------------------------------------------------------------------
2243!     Vegetation parameters:
2244!             ALBBRD: SFC background snow-free albedo
2245!             CMXTBL: MAX CNPY Capacity
2246!              Z0BRD: Background roughness length
2247!             SHDFAC: Green vegetation fraction
2248!              NROOT: Rooting depth
2249!              RSMIN: Mimimum stomatal resistance
2250!              RSMAX: Max. stomatal resistance
2251!                RGL: Parameters used in radiation stress function
2252!                 HS: Parameter used in vapor pressure deficit functio
2253!               TOPT: Optimum transpiration air temperature.
2254!             CMCMAX: Maximum canopy water capacity
2255!             CFACTR: Parameter used in the canopy inteception calculation
2256!               SNUP: Threshold snow depth (in water equivalent m) that
2257!                     implies 100 percent snow cover
2258!                LAI: Leaf area index
2259!
2260! ----------------------------------------------------------------------
2261!      Soil parameters:
2262!        SMCMAX: MAX soil moisture content (porosity)
2263!        SMCREF: Reference soil moisture  (field capacity)
2264!        SMCWLT: Wilting point soil moisture
2265!        SMCWLT: Air dry soil moist content limits
2266!       SSATPSI: SAT (saturation) soil potential
2267!         DKSAT: SAT soil conductivity
2268!          BEXP: B parameter
2269!        SSATDW: SAT soil diffusivity
2270!           F1: Soil thermal diffusivity/conductivity coef.
2271!        QUARTZ: Soil quartz content
2272!  Modified by F. Chen (12/22/97)  to use the STATSGO soil map
2273!  Modified By F. Chen (01/22/00)  to include PLaya, Lava, and White San
2274!  Modified By F. Chen (08/05/02)  to include additional parameters for the Noah
2275! NOTE: SATDW = BB*SATDK*(SATPSI/MAXSMC)
2276!         F11 = ALOG10(SATPSI) + BB*ALOG10(MAXSMC) + 2.0
2277!       REFSMC1=MAXSMC*(5.79E-9/SATDK)**(1/(2*BB+3)) 5.79E-9 m/s= 0.5 mm
2278!       REFSMC=REFSMC1+1./3.(MAXSMC-REFSMC1)
2279!       WLTSMC1=MAXSMC*(200./SATPSI)**(-1./BB)    (Wetzel and Chang, 198
2280!       WLTSMC=WLTSMC1-0.5*WLTSMC1
2281! Note: the values for playa is set for it to have a thermal conductivit
2282! as sand and to have a hydrulic conductivity as clay
2283!
2284! ----------------------------------------------------------------------
2285! Class parameter 'SLOPETYP' was included to estimate linear reservoir
2286! coefficient 'SLOPE' to the baseflow runoff out of the bottom layer.
2287! lowest class (slopetyp=0) means highest slope parameter = 1.
2288! definition of slopetyp from 'zobler' slope type:
2289! slope class  percent slope
2290! 1            0-8
2291! 2            8-30
2292! 3            > 30
2293! 4            0-30
2294! 5            0-8 & > 30
2295! 6            8-30 & > 30
2296! 7            0-8, 8-30, > 30
2297! 9            GLACIAL ICE
2298! BLANK        OCEAN/SEA
2299!       SLOPE_DATA: linear reservoir coefficient
2300!       SBETA_DATA: parameter used to caluculate vegetation effect on soil heat
2301!       FXEXP_DAT:  soil evaporation exponent used in DEVAP
2302!       CSOIL_DATA: soil heat capacity [J M-3 K-1]
2303!       SALP_DATA: shape parameter of  distribution function of snow cover
2304!       REFDK_DATA and REFKDT_DATA: parameters in the surface runoff parameteriz
2305!       FRZK_DATA: frozen ground parameter
2306!       ZBOT_DATA: depth[M] of lower boundary soil temperature
2307!       CZIL_DATA: calculate roughness length of heat
2308!       SMLOW_DATA and MHIGH_DATA: two soil moisture wilt, soil moisture referen
2309!                 parameters
2310! Set maximum number of soil-, veg-, and slopetyp in data statement.
2311! ----------------------------------------------------------------------
2312      INTEGER, PARAMETER     :: MAX_SLOPETYP=30,MAX_SOILTYP=30,MAX_VEGTYP=30
2313      LOGICAL                :: LOCAL
2314      CHARACTER (LEN=256), INTENT(IN)::  LLANDUSE, LSOIL
2315
2316! Veg parameters
2317      INTEGER, INTENT(IN)    :: VEGTYP
2318      INTEGER, INTENT(OUT)   :: NROOT
2319      REAL, INTENT(INOUT)    :: SHDFAC
2320      REAL, INTENT(OUT)      :: HS,RSMIN,RGL,SNUP,                          &
2321                                CMCMAX,RSMAX,TOPT,                          &
2322                                EMISSMIN,  EMISSMAX,                        &
2323                                LAIMIN,    LAIMAX,                          &
2324                                Z0MIN,     Z0MAX,                           &
2325                                ALBEDOMIN, ALBEDOMAX
2326! Soil parameters
2327      INTEGER, INTENT(IN)    :: SOILTYP
2328      REAL, INTENT(OUT)      :: BEXP,DKSAT,DWSAT,F1,QUARTZ,SMCDRY,          &
2329                                SMCMAX,SMCREF,SMCWLT,PSISAT
2330! General parameters
2331      INTEGER, INTENT(IN)    :: SLOPETYP,NSOIL
2332      INTEGER                :: I
2333
2334      REAL,    INTENT(OUT)   :: SLOPE,CZIL,SBETA,FXEXP,                     &
2335                                CSOIL,SALP,FRZX,KDT,CFACTR,      &
2336                                ZBOT,REFKDT,PTU
2337      REAL,    INTENT(OUT)   :: LVCOEF
2338      REAL,DIMENSION(1:NSOIL),INTENT(IN) :: SLDPTH,ZSOIL
2339      REAL,DIMENSION(1:NSOIL),INTENT(OUT):: RTDIS
2340      REAL                   :: FRZFACT,FRZK,REFDK
2341
2342!      SAVE
2343! ----------------------------------------------------------------------
2344!
2345               IF (SOILTYP .gt. SLCATS) THEN
2346                        CALL wrf_error_fatal ( 'Warning: too many input soil types' )
2347               END IF
2348               IF (VEGTYP .gt. LUCATS) THEN
2349                     CALL wrf_error_fatal ( 'Warning: too many input landuse types' )
2350               END IF
2351               IF (SLOPETYP .gt. SLPCATS) THEN
2352                     CALL wrf_error_fatal ( 'Warning: too many input slope types' )
2353               END IF
2354
2355! ----------------------------------------------------------------------
2356!  SET-UP SOIL PARAMETERS
2357! ----------------------------------------------------------------------
2358      CSOIL = CSOIL_DATA
2359      BEXP = BB (SOILTYP)
2360      DKSAT = SATDK (SOILTYP)
2361      DWSAT = SATDW (SOILTYP)
2362      F1 = F11 (SOILTYP)
2363      PSISAT = SATPSI (SOILTYP)
2364      QUARTZ = QTZ (SOILTYP)
2365      SMCDRY = DRYSMC (SOILTYP)
2366      SMCMAX = MAXSMC (SOILTYP)
2367      SMCREF = REFSMC (SOILTYP)
2368      SMCWLT = WLTSMC (SOILTYP)
2369! ----------------------------------------------------------------------
2370! Set-up universal parameters (not dependent on SOILTYP, VEGTYP or
2371! SLOPETYP)
2372! ----------------------------------------------------------------------
2373      ZBOT = ZBOT_DATA
2374      SALP = SALP_DATA
2375      SBETA = SBETA_DATA
2376      REFDK = REFDK_DATA
2377      FRZK = FRZK_DATA
2378      FXEXP = FXEXP_DATA
2379      REFKDT = REFKDT_DATA
2380      PTU = 0.    ! (not used yet) to satisify intent(out)
2381      KDT = REFKDT * DKSAT / REFDK
2382      CZIL = CZIL_DATA
2383      SLOPE = SLOPE_DATA (SLOPETYP)
2384      LVCOEF = LVCOEF_DATA
2385
2386! ----------------------------------------------------------------------
2387! TO ADJUST FRZK PARAMETER TO ACTUAL SOIL TYPE: FRZK * FRZFACT
2388! ----------------------------------------------------------------------
2389      FRZFACT = (SMCMAX / SMCREF) * (0.412 / 0.468)
2390      FRZX = FRZK * FRZFACT
2391
2392! ----------------------------------------------------------------------
2393! SET-UP VEGETATION PARAMETERS
2394! ----------------------------------------------------------------------
2395      TOPT = TOPT_DATA
2396      CMCMAX = CMCMAX_DATA
2397      CFACTR = CFACTR_DATA
2398      RSMAX = RSMAX_DATA
2399      NROOT = NROTBL (VEGTYP)
2400      SNUP = SNUPTBL (VEGTYP)
2401      RSMIN = RSTBL (VEGTYP)
2402      RGL = RGLTBL (VEGTYP)
2403      HS = HSTBL (VEGTYP)
2404      EMISSMIN  = EMISSMINTBL  (VEGTYP)
2405      EMISSMAX  = EMISSMAXTBL  (VEGTYP)
2406      LAIMIN    = LAIMINTBL    (VEGTYP)
2407      LAIMAX    = LAIMAXTBL    (VEGTYP)
2408      Z0MIN     = Z0MINTBL     (VEGTYP)
2409      Z0MAX     = Z0MAXTBL     (VEGTYP)
2410      ALBEDOMIN = ALBEDOMINTBL (VEGTYP)
2411      ALBEDOMAX = ALBEDOMAXTBL (VEGTYP)
2412
2413               IF (VEGTYP .eq. BARE) SHDFAC = 0.0
2414               IF (NROOT .gt. NSOIL) THEN
2415                  WRITE (err_message,*) 'Error: too many root layers ',  &
2416                                                 NSOIL,NROOT
2417                  CALL wrf_error_fatal ( err_message )
2418! ----------------------------------------------------------------------
2419! CALCULATE ROOT DISTRIBUTION.  PRESENT VERSION ASSUMES UNIFORM
2420! DISTRIBUTION BASED ON SOIL LAYER DEPTHS.
2421! ----------------------------------------------------------------------
2422               END IF
2423               DO I = 1,NROOT
2424                  RTDIS (I) = - SLDPTH (I)/ ZSOIL (NROOT)
2425! ----------------------------------------------------------------------
2426!  SET-UP SLOPE PARAMETER
2427! ----------------------------------------------------------------------
2428               END DO
2429
2430!        print*,'end of PRMRED'
2431!       print*,'VEGTYP',VEGTYP,'SOILTYP',SOILTYP,'SLOPETYP',SLOPETYP,    &
2432!    & 'CFACTR',CFACTR,'CMCMAX',CMCMAX,'RSMAX',RSMAX,'TOPT',TOPT,        &
2433!    & 'REFKDT',REFKDT,'KDT',KDT,'SBETA',SBETA, 'SHDFAC',SHDFAC,         &
2434!    &  'RSMIN',RSMIN,'RGL',RGL,'HS',HS,'ZBOT',ZBOT,'FRZX',FRZX,         &
2435!    &  'PSISAT',PSISAT,'SLOPE',SLOPE,'SNUP',SNUP,'SALP',SALP,'BEXP',    &
2436!    &   BEXP,                                                           &
2437!    &  'DKSAT',DKSAT,'DWSAT',DWSAT,                                     &
2438!    &  'SMCMAX',SMCMAX,'SMCWLT',SMCWLT,'SMCREF',SMCREF,'SMCDRY',SMCDRY, &
2439!    &  'F1',F1,'QUARTZ',QUARTZ,'FXEXP',FXEXP,                           &
2440!    &  'RTDIS',RTDIS,'SLDPTH',SLDPTH,'ZSOIL',ZSOIL, 'NROOT',NROOT,      &
2441!    &  'NSOIL',NSOIL,'Z0',Z0,'CZIL',CZIL,'LAI',LAI,                     &
2442!    &  'CSOIL',CSOIL,'PTU',PTU,                                         &
2443!    &  'LOCAL', LOCAL
2444
2445      END  SUBROUTINE REDPRM
2446
2447      SUBROUTINE ROSR12 (P,A,B,C,D,DELTA,NSOIL)
2448
2449! ----------------------------------------------------------------------
2450! SUBROUTINE ROSR12
2451! ----------------------------------------------------------------------
2452! INVERT (SOLVE) THE TRI-DIAGONAL MATRIX PROBLEM SHOWN BELOW:
2453! ###                                            ### ###  ###   ###  ###
2454! #B(1), C(1),  0  ,  0  ,  0  ,   . . .  ,    0   # #      #   #      #
2455! #A(2), B(2), C(2),  0  ,  0  ,   . . .  ,    0   # #      #   #      #
2456! # 0  , A(3), B(3), C(3),  0  ,   . . .  ,    0   # #      #   # D(3) #
2457! # 0  ,  0  , A(4), B(4), C(4),   . . .  ,    0   # # P(4) #   # D(4) #
2458! # 0  ,  0  ,  0  , A(5), B(5),   . . .  ,    0   # # P(5) #   # D(5) #
2459! # .                                          .   # #  .   # = #   .  #
2460! # .                                          .   # #  .   #   #   .  #
2461! # .                                          .   # #  .   #   #   .  #
2462! # 0  , . . . , 0 , A(M-2), B(M-2), C(M-2),   0   # #P(M-2)#   #D(M-2)#
2463! # 0  , . . . , 0 ,   0   , A(M-1), B(M-1), C(M-1)# #P(M-1)#   #D(M-1)#
2464! # 0  , . . . , 0 ,   0   ,   0   ,  A(M) ,  B(M) # # P(M) #   # D(M) #
2465! ###                                            ### ###  ###   ###  ###
2466! ----------------------------------------------------------------------
2467      IMPLICIT NONE
2468
2469      INTEGER, INTENT(IN)   :: NSOIL
2470      INTEGER               :: K, KK
2471
2472      REAL, DIMENSION(1:NSOIL), INTENT(IN):: A, B, D
2473      REAL, DIMENSION(1:NSOIL),INTENT(INOUT):: C,P,DELTA
2474
2475! ----------------------------------------------------------------------
2476! INITIALIZE EQN COEF C FOR THE LOWEST SOIL LAYER
2477! ----------------------------------------------------------------------
2478      C (NSOIL) = 0.0
2479      P (1) = - C (1) / B (1)
2480! ----------------------------------------------------------------------
2481! SOLVE THE COEFS FOR THE 1ST SOIL LAYER
2482! ----------------------------------------------------------------------
2483
2484! ----------------------------------------------------------------------
2485! SOLVE THE COEFS FOR SOIL LAYERS 2 THRU NSOIL
2486! ----------------------------------------------------------------------
2487      DELTA (1) = D (1) / B (1)
2488      DO K = 2,NSOIL
2489         P (K) = - C (K) * ( 1.0 / (B (K) + A (K) * P (K -1)) )
2490         DELTA (K) = (D (K) - A (K)* DELTA (K -1))* (1.0/ (B (K) + A (K)&
2491                    * P (K -1)))
2492      END DO
2493! ----------------------------------------------------------------------
2494! SET P TO DELTA FOR LOWEST SOIL LAYER
2495! ----------------------------------------------------------------------
2496      P (NSOIL) = DELTA (NSOIL)
2497
2498! ----------------------------------------------------------------------
2499! ADJUST P FOR SOIL LAYERS 2 THRU NSOIL
2500! ----------------------------------------------------------------------
2501      DO K = 2,NSOIL
2502         KK = NSOIL - K + 1
2503         P (KK) = P (KK) * P (KK +1) + DELTA (KK)
2504      END DO
2505! ----------------------------------------------------------------------
2506  END SUBROUTINE ROSR12
2507! ----------------------------------------------------------------------
2508
2509
2510      SUBROUTINE SHFLX (SSOIL,STC,SMC,SMCMAX,NSOIL,T1,DT,YY,ZZ1,ZSOIL,  &
2511                         TBOT,ZBOT,SMCWLT,PSISAT,SH2O,BEXP,F1,DF1,ICE,  &
2512                         QUARTZ,CSOIL,VEGTYP,ISURBAN)
2513
2514! ----------------------------------------------------------------------
2515! SUBROUTINE SHFLX
2516! ----------------------------------------------------------------------
2517! UPDATE THE TEMPERATURE STATE OF THE SOIL COLUMN BASED ON THE THERMAL
2518! DIFFUSION EQUATION AND UPDATE THE FROZEN SOIL MOISTURE CONTENT BASED
2519! ON THE TEMPERATURE.
2520! ----------------------------------------------------------------------
2521      IMPLICIT NONE
2522
2523      INTEGER, INTENT(IN)   :: ICE, NSOIL, VEGTYP, ISURBAN
2524      INTEGER               :: I
2525
2526      REAL, INTENT(IN)      :: BEXP,CSOIL,DF1,DT,F1,PSISAT,QUARTZ,     &
2527                               SMCMAX, SMCWLT, TBOT,YY, ZBOT,ZZ1
2528      REAL, INTENT(INOUT)   :: T1
2529      REAL, INTENT(OUT)     :: SSOIL
2530      REAL, DIMENSION(1:NSOIL), INTENT(IN)    :: SMC,ZSOIL
2531      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O
2532      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: STC
2533      REAL, DIMENSION(1:NSOIL)             :: AI, BI, CI, STCF,RHSTS
2534      REAL, PARAMETER       :: T0 = 273.15
2535
2536! ----------------------------------------------------------------------
2537! HRT ROUTINE CALCS THE RIGHT HAND SIDE OF THE SOIL TEMP DIF EQN
2538! ----------------------------------------------------------------------
2539
2540! ----------------------------------------------------------------------
2541! SEA-ICE CASE, GLACIAL ICE CASE
2542! ----------------------------------------------------------------------
2543      IF ( ICE /= 0 ) THEN
2544
2545         CALL HRTICE (RHSTS,STC,TBOT,ICE,NSOIL,ZSOIL,YY,ZZ1,DF1,AI,BI,CI)
2546
2547         CALL HSTEP (STCF,STC,RHSTS,DT,NSOIL,AI,BI,CI)
2548
2549! ----------------------------------------------------------------------
2550! LAND-MASS CASE
2551! ----------------------------------------------------------------------
2552      ELSE
2553         CALL HRT (RHSTS,STC,SMC,SMCMAX,NSOIL,ZSOIL,YY,ZZ1,TBOT,        &
2554                    ZBOT,PSISAT,SH2O,DT,                                &
2555                    BEXP,F1,DF1,QUARTZ,CSOIL,AI,BI,CI,VEGTYP,ISURBAN)
2556
2557         CALL HSTEP (STCF,STC,RHSTS,DT,NSOIL,AI,BI,CI)
2558      END IF
2559      DO I = 1,NSOIL
2560         STC (I) = STCF (I)
2561      END DO
2562
2563! ----------------------------------------------------------------------
2564! IN THE NO SNOWPACK CASE (VIA ROUTINE NOPAC BRANCH,) UPDATE THE GRND
2565! (SKIN) TEMPERATURE HERE IN RESPONSE TO THE UPDATED SOIL TEMPERATURE
2566! PROFILE ABOVE.  (NOTE: INSPECTION OF ROUTINE SNOPAC SHOWS THAT T1
2567! BELOW IS A DUMMY VARIABLE ONLY, AS SKIN TEMPERATURE IS UPDATED
2568! DIFFERENTLY IN ROUTINE SNOPAC)
2569! ----------------------------------------------------------------------
2570! ----------------------------------------------------------------------
2571! CALCULATE SURFACE SOIL HEAT FLUX
2572! ----------------------------------------------------------------------
2573      T1 = (YY + (ZZ1- 1.0) * STC (1)) / ZZ1
2574      SSOIL = DF1 * (STC (1) - T1) / (0.5 * ZSOIL (1))
2575
2576! ----------------------------------------------------------------------
2577  END SUBROUTINE SHFLX
2578! ----------------------------------------------------------------------
2579
2580      SUBROUTINE SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL,                   &
2581     &                   SH2O,SLOPE,KDT,FRZFACT,                        &
2582     &                   SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT,                &
2583     &                   SHDFAC,CMCMAX,                                 &
2584     &                   RUNOFF1,RUNOFF2,RUNOFF3,                       &
2585     &                   EDIR,EC,ET,                                    &
2586     &                   DRIP)
2587
2588! ----------------------------------------------------------------------
2589! SUBROUTINE SMFLX
2590! ----------------------------------------------------------------------
2591! CALCULATE SOIL MOISTURE FLUX.  THE SOIL MOISTURE CONTENT (SMC - A PER
2592! UNIT VOLUME MEASUREMENT) IS A DEPENDENT VARIABLE THAT IS UPDATED WITH
2593! PROGNOSTIC EQNS. THE CANOPY MOISTURE CONTENT (CMC) IS ALSO UPDATED.
2594! FROZEN GROUND VERSION:  NEW STATES ADDED: SH2O, AND FROZEN GROUND
2595! CORRECTION FACTOR, FRZFACT AND PARAMETER SLOPE.
2596! ----------------------------------------------------------------------
2597      IMPLICIT NONE
2598
2599      INTEGER, INTENT(IN)   :: NSOIL
2600      INTEGER               :: I,K
2601
2602      REAL, INTENT(IN)      :: BEXP, CMCMAX, DKSAT,DWSAT, DT, EC, EDIR,  &
2603                               KDT, PRCP1, SHDFAC, SLOPE, SMCMAX, SMCWLT
2604      REAL, INTENT(OUT)                      :: DRIP, RUNOFF1, RUNOFF2, RUNOFF3
2605      REAL, INTENT(INOUT)   :: CMC
2606      REAL, DIMENSION(1:NSOIL), INTENT(IN)   :: ET,ZSOIL
2607      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: SMC, SH2O
2608      REAL, DIMENSION(1:NSOIL)             :: AI, BI, CI, STCF,RHSTS, RHSTT, &
2609                                              SICE, SH2OA, SH2OFG
2610      REAL                  :: DUMMY, EXCESS,FRZFACT,PCPDRP,RHSCT,TRHSCT
2611      REAL :: FAC2
2612      REAL :: FLIMIT
2613
2614! ----------------------------------------------------------------------
2615! EXECUTABLE CODE BEGINS HERE.
2616! ----------------------------------------------------------------------
2617! ----------------------------------------------------------------------
2618! COMPUTE THE RIGHT HAND SIDE OF THE CANOPY EQN TERM ( RHSCT )
2619! ----------------------------------------------------------------------
2620      DUMMY = 0.
2621
2622! ----------------------------------------------------------------------
2623! CONVERT RHSCT (A RATE) TO TRHSCT (AN AMOUNT) AND ADD IT TO EXISTING
2624! CMC.  IF RESULTING AMT EXCEEDS MAX CAPACITY, IT BECOMES DRIP AND WILL
2625! FALL TO THE GRND.
2626! ----------------------------------------------------------------------
2627      RHSCT = SHDFAC * PRCP1- EC
2628      DRIP = 0.
2629      TRHSCT = DT * RHSCT
2630      EXCESS = CMC + TRHSCT
2631
2632! ----------------------------------------------------------------------
2633! PCPDRP IS THE COMBINED PRCP1 AND DRIP (FROM CMC) THAT GOES INTO THE
2634! SOIL
2635! ----------------------------------------------------------------------
2636      IF (EXCESS > CMCMAX) DRIP = EXCESS - CMCMAX
2637      PCPDRP = (1. - SHDFAC) * PRCP1+ DRIP / DT
2638
2639! ----------------------------------------------------------------------
2640! STORE ICE CONTENT AT EACH SOIL LAYER BEFORE CALLING SRT and SSTEP
2641!
2642      DO I = 1,NSOIL
2643         SICE (I) = SMC (I) - SH2O (I)
2644      END DO
2645! ----------------------------------------------------------------------
2646! CALL SUBROUTINES SRT AND SSTEP TO SOLVE THE SOIL MOISTURE
2647! TENDENCY EQUATIONS.
2648! IF THE INFILTRATING PRECIP RATE IS NONTRIVIAL,
2649!   (WE CONSIDER NONTRIVIAL TO BE A PRECIP TOTAL OVER THE TIME STEP
2650!    EXCEEDING ONE ONE-THOUSANDTH OF THE WATER HOLDING CAPACITY OF
2651!    THE FIRST SOIL LAYER)
2652! THEN CALL THE SRT/SSTEP SUBROUTINE PAIR TWICE IN THE MANNER OF
2653!   TIME SCHEME "F" (IMPLICIT STATE, AVERAGED COEFFICIENT)
2654!   OF SECTION 2 OF KALNAY AND KANAMITSU (1988, MWR, VOL 116,
2655!   PAGES 1945-1958)TO MINIMIZE 2-DELTA-T OSCILLATIONS IN THE
2656!   SOIL MOISTURE VALUE OF THE TOP SOIL LAYER THAT CAN ARISE BECAUSE
2657!   OF THE EXTREME NONLINEAR DEPENDENCE OF THE SOIL HYDRAULIC
2658!   DIFFUSIVITY COEFFICIENT AND THE HYDRAULIC CONDUCTIVITY ON THE
2659!   SOIL MOISTURE STATE
2660! OTHERWISE CALL THE SRT/SSTEP SUBROUTINE PAIR ONCE IN THE MANNER OF
2661!   TIME SCHEME "D" (IMPLICIT STATE, EXPLICIT COEFFICIENT)
2662!   OF SECTION 2 OF KALNAY AND KANAMITSU
2663! PCPDRP IS UNITS OF KG/M**2/S OR MM/S, ZSOIL IS NEGATIVE DEPTH IN M
2664! ----------------------------------------------------------------------
2665!  According to Dr. Ken Mitchell's suggestion, add the second contraint
2666!  to remove numerical instability of runoff and soil moisture
2667!  FLIMIT is a limit value for FAC2
2668      FAC2=0.0
2669      DO I=1,NSOIL
2670         FAC2=MAX(FAC2,SH2O(I)/SMCMAX)
2671      ENDDO
2672      CALL FAC2MIT(SMCMAX,FLIMIT)
2673
2674! ----------------------------------------------------------------------
2675! FROZEN GROUND VERSION:
2676! SMC STATES REPLACED BY SH2O STATES IN SRT SUBR.  SH2O & SICE STATES
2677! INC&UDED IN SSTEP SUBR.  FROZEN GROUND CORRECTION FACTOR, FRZFACT
2678! ADDED.  ALL WATER BALANCE CALCULATIONS USING UNFROZEN WATER
2679! ----------------------------------------------------------------------
2680      IF ( ( (PCPDRP * DT) > (0.0001*1000.0* (- ZSOIL (1))* SMCMAX) )   &
2681           .OR. (FAC2 > FLIMIT) ) THEN
2682         CALL SRT (RHSTT,EDIR,ET,SH2O,SH2O,NSOIL,PCPDRP,ZSOIL,          &
2683                    DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1,                    &
2684                    RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZFACT,SICE,AI,BI,CI)
2685         CALL SSTEP (SH2OFG,SH2O,DUMMY,RHSTT,RHSCT,DT,NSOIL,SMCMAX,     &
2686                        CMCMAX,RUNOFF3,ZSOIL,SMC,SICE,AI,BI,CI)
2687         DO K = 1,NSOIL
2688            SH2OA (K) = (SH2O (K) + SH2OFG (K)) * 0.5
2689         END DO
2690         CALL SRT (RHSTT,EDIR,ET,SH2O,SH2OA,NSOIL,PCPDRP,ZSOIL,         &
2691                    DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1,                    &
2692                    RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZFACT,SICE,AI,BI,CI)
2693         CALL SSTEP (SH2O,SH2O,CMC,RHSTT,RHSCT,DT,NSOIL,SMCMAX,         &
2694                        CMCMAX,RUNOFF3,ZSOIL,SMC,SICE,AI,BI,CI)
2695
2696      ELSE
2697         CALL SRT (RHSTT,EDIR,ET,SH2O,SH2O,NSOIL,PCPDRP,ZSOIL,          &
2698                    DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1,                    &
2699                      RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZFACT,SICE,AI,BI,CI)
2700         CALL SSTEP (SH2O,SH2O,CMC,RHSTT,RHSCT,DT,NSOIL,SMCMAX,         &
2701                        CMCMAX,RUNOFF3,ZSOIL,SMC,SICE,AI,BI,CI)
2702!      RUNOF = RUNOFF
2703
2704      END IF
2705
2706! ----------------------------------------------------------------------
2707  END SUBROUTINE SMFLX
2708! ----------------------------------------------------------------------
2709
2710
2711      SUBROUTINE SNFRAC (SNEQV,SNUP,SALP,SNOWH,SNCOVR)
2712
2713! ----------------------------------------------------------------------
2714! SUBROUTINE SNFRAC
2715! ----------------------------------------------------------------------
2716! CALCULATE SNOW FRACTION (0 -> 1)
2717! SNEQV   SNOW WATER EQUIVALENT (M)
2718! SNUP    THRESHOLD SNEQV DEPTH ABOVE WHICH SNCOVR=1
2719! SALP    TUNING PARAMETER
2720! SNCOVR  FRACTIONAL SNOW COVER
2721! ----------------------------------------------------------------------
2722      IMPLICIT NONE
2723
2724      REAL, INTENT(IN)     :: SNEQV,SNUP,SALP,SNOWH
2725      REAL, INTENT(OUT)    :: SNCOVR
2726      REAL                 :: RSNOW, Z0N
2727
2728! ----------------------------------------------------------------------
2729! SNUP IS VEG-CLASS DEPENDENT SNOWDEPTH THRESHHOLD (SET IN ROUTINE
2730! REDPRM) ABOVE WHICH SNOCVR=1.
2731! ----------------------------------------------------------------------
2732      IF (SNEQV < SNUP) THEN
2733         RSNOW = SNEQV / SNUP
2734         SNCOVR = 1. - ( EXP ( - SALP * RSNOW) - RSNOW * EXP ( - SALP))
2735      ELSE
2736         SNCOVR = 1.0
2737      END IF
2738
2739!     FORMULATION OF DICKINSON ET AL. 1986
2740!     Z0N = 0.035
2741
2742!        SNCOVR=SNOWH/(SNOWH + 5*Z0N)
2743
2744!     FORMULATION OF MARSHALL ET AL. 1994
2745!        SNCOVR=SNEQV/(SNEQV + 2*Z0N)
2746
2747! ----------------------------------------------------------------------
2748  END SUBROUTINE SNFRAC
2749! ----------------------------------------------------------------------
2750
2751      SUBROUTINE SNKSRC (TSNSR,TAVG,SMC,SH2O,ZSOIL,NSOIL,               &
2752     &                      SMCMAX,PSISAT,BEXP,DT,K,QTOT)
2753! ----------------------------------------------------------------------
2754! SUBROUTINE SNKSRC
2755! ----------------------------------------------------------------------
2756! CALCULATE SINK/SOURCE TERM OF THE TERMAL DIFFUSION EQUATION. (SH2O) IS
2757! AVAILABLE LIQUED WATER.
2758! ----------------------------------------------------------------------
2759      IMPLICIT NONE
2760
2761      INTEGER, INTENT(IN)   :: K,NSOIL
2762      REAL, INTENT(IN)      :: BEXP, DT, PSISAT, QTOT, SMC, SMCMAX,    &
2763                               TAVG
2764      REAL, INTENT(INOUT)   :: SH2O
2765
2766      REAL, DIMENSION(1:NSOIL), INTENT(IN):: ZSOIL
2767
2768      REAL                  :: DF, DZ, DZH, FREE, TSNSR,               &
2769                               TDN, TM, TUP, TZ, X0, XDN, XH2O, XUP
2770
2771      REAL, PARAMETER       :: DH2O = 1.0000E3, HLICE = 3.3350E5,      &
2772                               T0 = 2.7315E2
2773
2774      IF (K == 1) THEN
2775         DZ = - ZSOIL (1)
2776      ELSE
2777         DZ = ZSOIL (K -1) - ZSOIL (K)
2778      END IF
2779! ----------------------------------------------------------------------
2780! VIA FUNCTION FRH2O, COMPUTE POTENTIAL OR 'EQUILIBRIUM' UNFROZEN
2781! SUPERCOOLED FREE WATER FOR GIVEN SOIL TYPE AND SOIL LAYER TEMPERATURE.
2782! FUNCTION FRH20 INVOKES EQN (17) FROM V. KOREN ET AL (1999, JGR, VOL.
2783! 104, PG 19573).  (ASIDE:  LATTER EQN IN JOURNAL IN CENTIGRADE UNITS.
2784! ROUTINE FRH2O USE FORM OF EQN IN KELVIN UNITS.)
2785! ----------------------------------------------------------------------
2786!      FREE = FRH2O(TAVG,SMC,SH2O,SMCMAX,BEXP,PSISAT)
2787
2788! ----------------------------------------------------------------------
2789! IN NEXT BLOCK OF CODE, INVOKE EQN 18 OF V. KOREN ET AL (1999, JGR,
2790! VOL. 104, PG 19573.)  THAT IS, FIRST ESTIMATE THE NEW AMOUNTOF LIQUID
2791! WATER, 'XH2O', IMPLIED BY THE SUM OF (1) THE LIQUID WATER AT THE BEGIN
2792! OF CURRENT TIME STEP, AND (2) THE FREEZE OF THAW CHANGE IN LIQUID
2793! WATER IMPLIED BY THE HEAT FLUX 'QTOT' PASSED IN FROM ROUTINE HRT.
2794! SECOND, DETERMINE IF XH2O NEEDS TO BE BOUNDED BY 'FREE' (EQUIL AMT) OR
2795! IF 'FREE' NEEDS TO BE BOUNDED BY XH2O.
2796! ----------------------------------------------------------------------
2797      CALL FRH2O (FREE,TAVG,SMC,SH2O,SMCMAX,BEXP,PSISAT)
2798
2799! ----------------------------------------------------------------------
2800! FIRST, IF FREEZING AND REMAINING LIQUID LESS THAN LOWER BOUND, THEN
2801! REDUCE EXTENT OF FREEZING, THEREBY LETTING SOME OR ALL OF HEAT FLUX
2802! QTOT COOL THE SOIL TEMP LATER IN ROUTINE HRT.
2803! ----------------------------------------------------------------------
2804      XH2O = SH2O + QTOT * DT / (DH2O * HLICE * DZ)
2805      IF ( XH2O < SH2O .AND. XH2O < FREE) THEN
2806         IF ( FREE > SH2O ) THEN
2807            XH2O = SH2O
2808         ELSE
2809            XH2O = FREE
2810         END IF
2811      END IF
2812! ----------------------------------------------------------------------
2813! SECOND, IF THAWING AND THE INCREASE IN LIQUID WATER GREATER THAN UPPER
2814! BOUND, THEN REDUCE EXTENT OF THAW, THEREBY LETTING SOME OR ALL OF HEAT
2815! FLUX QTOT WARM THE SOIL TEMP LATER IN ROUTINE HRT.
2816! ----------------------------------------------------------------------
2817      IF ( XH2O > SH2O .AND. XH2O > FREE ) THEN
2818         IF ( FREE < SH2O ) THEN
2819            XH2O = SH2O
2820         ELSE
2821            XH2O = FREE
2822         END IF
2823      END IF
2824
2825! ----------------------------------------------------------------------
2826! CALCULATE PHASE-CHANGE HEAT SOURCE/SINK TERM FOR USE IN ROUTINE HRT
2827! AND UPDATE LIQUID WATER TO REFLCET FINAL FREEZE/THAW INCREMENT.
2828! ----------------------------------------------------------------------
2829!      SNKSRC = -DH2O*HLICE*DZ*(XH2O-SH2O)/DT
2830      IF (XH2O < 0.) XH2O = 0.
2831      IF (XH2O > SMC) XH2O = SMC
2832      TSNSR = - DH2O * HLICE * DZ * (XH2O - SH2O)/ DT
2833      SH2O = XH2O
2834
2835! ----------------------------------------------------------------------
2836  END SUBROUTINE SNKSRC
2837! ----------------------------------------------------------------------
2838
2839      SUBROUTINE SNOPAC (ETP,ETA,PRCP,PRCPF,SNOWNG,SMC,SMCMAX,SMCWLT,   &
2840                          SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT,            &
2841                          SBETA,DF1,                                    &
2842                          Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,SSOIL,STC,EPSCA,&
2843                         SFCPRS,BEXP,PC,RCH,RR,CFACTR,SNCOVR,ESD,SNDENS,&
2844                          SNOWH,SH2O,SLOPE,KDT,FRZFACT,PSISAT,          &
2845                          ZSOIL,DWSAT,DKSAT,TBOT,ZBOT,SHDFAC,RUNOFF1,   &
2846                          RUNOFF2,RUNOFF3,EDIR,EC,ET,ETT,NROOT,SNOMLT,  &
2847                          ICE,RTDIS,QUARTZ,FXEXP,CSOIL,                 &
2848                          BETA,DRIP,DEW,FLX1,FLX2,FLX3,ESNOW,ETNS,EMISSI,&
2849                          RIBB,SOLDN,                                   &
2850                          ISURBAN,                                      &
2851
2852                          VEGTYP)
2853
2854! ----------------------------------------------------------------------
2855! SUBROUTINE SNOPAC
2856! ----------------------------------------------------------------------
2857! CALCULATE SOIL MOISTURE AND HEAT FLUX VALUES & UPDATE SOIL MOISTURE
2858! CONTENT AND SOIL HEAT CONTENT VALUES FOR THE CASE WHEN A SNOW PACK IS
2859! PRESENT.
2860! ----------------------------------------------------------------------
2861      IMPLICIT NONE
2862
2863      INTEGER, INTENT(IN)   :: ICE, NROOT, NSOIL,VEGTYP
2864      INTEGER, INTENT(IN)   :: ISURBAN
2865      INTEGER               :: K
2866!
2867! kmh 09/03/2006 add IT16 for surface temperature iteration
2868!
2869      INTEGER               :: IT16
2870      LOGICAL, INTENT(IN)   :: SNOWNG
2871      REAL, INTENT(IN)      :: BEXP,CFACTR, CMCMAX,CSOIL,DF1,DKSAT,     &
2872                               DT,DWSAT, EPSCA,FDOWN,F1,FXEXP,          &
2873                               FRZFACT,KDT,PC, PRCP,PSISAT,Q2,QUARTZ,   &
2874                               RCH,RR,SBETA,SFCPRS, SFCTMP, SHDFAC,     &
2875                               SLOPE,SMCDRY,SMCMAX,SMCREF,SMCWLT, T24,  &
2876                               TBOT,TH2,ZBOT,EMISSI,SOLDN
2877      REAL, INTENT(INOUT)   :: CMC, BETA, ESD,FLX2,PRCPF,SNOWH,SNCOVR,  &
2878                               SNDENS, T1, RIBB, ETP
2879      REAL, INTENT(OUT)     :: DEW,DRIP,EC,EDIR, ETNS, ESNOW,ETT,       &
2880                               FLX1,FLX3, RUNOFF1,RUNOFF2,RUNOFF3,      &
2881                               SSOIL,SNOMLT
2882      REAL, DIMENSION(1:NSOIL),INTENT(IN)     :: RTDIS,ZSOIL
2883      REAL, DIMENSION(1:NSOIL),INTENT(OUT)    :: ET
2884      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC,SH2O,STC
2885      REAL, DIMENSION(1:NSOIL) :: ET1
2886      REAL                  :: DENOM,DSOIL,DTOT,EC1,EDIR1,ESDFLX,ETA,   &
2887                               ETT1, ESNOW1, ESNOW2, ETA1,ETP1,ETP2,    &
2888                               ETP3, ETNS1, ETANRG, ETAX, EX, FLX3X,    &
2889                               FRCSNO,FRCSOI, PRCP1, QSAT,RSNOW, SEH,   &
2890                               SNCOND,SSOIL1, T11,T12, T12A, T12AX,     &
2891                               T12B, T14, YY, ZZ1
2892!                               T12B, T14, YY, ZZ1,EMISSI_S
2893!
2894! kmh 01/11/2007 add T15, T16, and DTOT2 for SFC T iteration and snow heat flux
2895!
2896      REAL                  :: T15, T16, DTOT2
2897      REAL, PARAMETER       :: ESDMIN = 1.E-6, LSUBC = 2.501000E+6,     &
2898                               LSUBS = 2.83E+6, TFREEZ = 273.15,        &
2899                               SNOEXP = 2.0
2900
2901! ----------------------------------------------------------------------
2902! EXECUTABLE CODE BEGINS HERE:
2903! ----------------------------------------------------------------------
2904! IF SEA-ICE (ICE=1) OR GLACIAL-ICE (ICE=-1), SNOWCOVER FRACTION = 1.0,
2905! AND SUBLIMATION IS AT THE POTENTIAL RATE.
2906! FOR NON-GLACIAL LAND (ICE=0), IF SNOWCOVER FRACTION < 1.0, TOTAL
2907! EVAPORATION < POTENTIAL DUE TO NON-POTENTIAL CONTRIBUTION FROM
2908! NON-SNOW COVERED FRACTION.
2909! ----------------------------------------------------------------------
2910! INITIALIZE EVAP TERMS.
2911! ----------------------------------------------------------------------
2912! conversions:
2913! ESNOW [KG M-2 S-1]
2914! ESDFLX [KG M-2 S-1] .le. ESNOW
2915! ESNOW1 [M S-1]
2916! ESNOW2 [M]
2917! ETP [KG M-2 S-1]
2918! ETP1 [M S-1]
2919! ETP2 [M]
2920! ----------------------------------------------------------------------
2921      DEW = 0.
2922      EDIR = 0.
2923      EDIR1 = 0.
2924      EC1 = 0.
2925      EC = 0.
2926!      EMISSI_S=0.95    ! For snow
2927
2928      DO K = 1,NSOIL
2929         ET (K) = 0.
2930         ET1 (K) = 0.
2931      END DO
2932      ETT = 0.
2933      ETT1 = 0.
2934      ETNS = 0.
2935      ETNS1 = 0.
2936      ESNOW = 0.
2937      ESNOW1 = 0.
2938      ESNOW2 = 0.
2939
2940! ----------------------------------------------------------------------
2941! CONVERT POTENTIAL EVAP (ETP) FROM KG M-2 S-1 TO ETP1 IN M S-1
2942! ----------------------------------------------------------------------
2943      PRCP1 = PRCPF *0.001
2944! ----------------------------------------------------------------------
2945! IF ETP<0 (DOWNWARD) THEN DEWFALL (=FROSTFALL IN THIS CASE).
2946! ----------------------------------------------------------------------
2947      BETA = 1.0
2948      IF (ETP <= 0.0) THEN
2949         IF ( ( RIBB >= 0.1 ) .AND. ( FDOWN > 150.0 ) ) THEN
2950            ETP=(MIN(ETP*(1.0-RIBB),0.)*SNCOVR/0.980 + ETP*(0.980-SNCOVR))/0.980
2951         ENDIF
2952        IF(ETP == 0.) BETA = 0.0
2953        ETP1 = ETP * 0.001
2954         DEW = -ETP1
2955         ESNOW2 = ETP1*DT
2956         ETANRG = ETP*((1.-SNCOVR)*LSUBC + SNCOVR*LSUBS)
2957      ELSE
2958         ETP1 = ETP * 0.001
2959         IF ( ICE /= 0 ) THEN
2960            ! SEA-ICE AND GLACIAL-ICE CASE
2961            ESNOW = ETP
2962            ESNOW1 = ESNOW*0.001
2963            ESNOW2 = ESNOW1*DT
2964            ETANRG = ESNOW*LSUBS
2965         ELSE IF ( ICE ==  0) THEN
2966            ! NON-GLACIAL LAND CASE
2967             IF (SNCOVR <  1.) THEN
2968               CALL EVAPO (ETNS1,SMC,NSOIL,CMC,ETP1,DT,ZSOIL,           &
2969                            SH2O,                                       &
2970                            SMCMAX,BEXP,PC,SMCWLT,DKSAT,DWSAT,          &
2971                            SMCREF,SHDFAC,CMCMAX,                       &
2972                            SMCDRY,CFACTR,                              &
2973                            EDIR1,EC1,ET1,ETT1,SFCTMP,Q2,NROOT,RTDIS,   &
2974                            FXEXP)
2975! ----------------------------------------------------------------------------
2976               EDIR1 = EDIR1* (1. - SNCOVR)
2977               EC1 = EC1* (1. - SNCOVR)
2978               DO K = 1,NSOIL
2979                  ET1 (K) = ET1 (K)* (1. - SNCOVR)
2980               END DO
2981               ETT1 = ETT1*(1.-SNCOVR)
2982!               ETNS1 = EDIR1+ EC1+ ETT1
2983               ETNS1 = ETNS1*(1.-SNCOVR)
2984! ----------------------------------------------------------------------------
2985               EDIR = EDIR1*1000.
2986               EC = EC1*1000.
2987               DO K = 1,NSOIL
2988                  ET (K) = ET1 (K)*1000.
2989               END DO
2990               ETT = ETT1*1000.
2991               ETNS = ETNS1*1000.
2992! ----------------------------------------------------------------------
2993
2994!   end IF (SNCOVR .lt. 1.)
2995            END IF
2996!   end IF (ICE .ne. 1)
2997         END IF
2998         ESNOW = ETP*SNCOVR
2999         ESNOW1 = ESNOW*0.001
3000         ESNOW2 = ESNOW1*DT
3001         ETANRG = ESNOW*LSUBS + ETNS*LSUBC
3002!   end IF (ETP .le. 0.0)
3003      END IF
3004
3005! ----------------------------------------------------------------------
3006! IF PRECIP IS FALLING, CALCULATE HEAT FLUX FROM SNOW SFC TO NEWLY
3007! ACCUMULATING PRECIP.  NOTE THAT THIS REFLECTS THE FLUX APPROPRIATE FOR
3008! THE NOT-YET-UPDATED SKIN TEMPERATURE (T1).  ASSUMES TEMPERATURE OF THE
3009! SNOWFALL STRIKING THE GROUND IS =SFCTMP (LOWEST MODEL LEVEL AIR TEMP).
3010! ----------------------------------------------------------------------
3011      FLX1 = 0.0
3012      IF (SNOWNG) THEN
3013         FLX1 = CPICE * PRCP * (T1- SFCTMP)
3014      ELSE
3015         IF (PRCP >  0.0) FLX1 = CPH2O * PRCP * (T1- SFCTMP)
3016! ----------------------------------------------------------------------
3017! CALCULATE AN 'EFFECTIVE SNOW-GRND SFC TEMP' (T12) BASED ON HEAT FLUXES
3018! BETWEEN THE SNOW PACK AND THE SOIL AND ON NET RADIATION.
3019! INCLUDE FLX1 (PRECIP-SNOW SFC) AND FLX2 (FREEZING RAIN LATENT HEAT)
3020! FLUXES.  FLX1 FROM ABOVE, FLX2 BROUGHT IN VIA COMMOM BLOCK RITE.
3021! FLX2 REFLECTS FREEZING RAIN LATENT HEAT FLUX USING T1 CALCULATED IN
3022! PENMAN.
3023! ----------------------------------------------------------------------
3024      END IF
3025      DSOIL = - (0.5 * ZSOIL (1))
3026      DTOT = SNOWH + DSOIL
3027      DENOM = 1.0+ DF1 / (DTOT * RR * RCH)
3028! surface emissivity weighted by snow cover fraction
3029!      T12A = ( (FDOWN - FLX1 - FLX2 -                                   &
3030!     &       ((SNCOVR*EMISSI_S)+EMISSI*(1.0-SNCOVR))*SIGMA *T24)/RCH    &
3031!     &       + TH2 - SFCTMP - ETANRG/RCH ) / RR
3032      T12A = ( (FDOWN - FLX1- FLX2- EMISSI * SIGMA * T24)/ RCH                    &
3033                + TH2- SFCTMP - ETANRG / RCH ) / RR
3034
3035      T12B = DF1 * STC (1) / (DTOT * RR * RCH)
3036
3037! ----------------------------------------------------------------------
3038! IF THE 'EFFECTIVE SNOW-GRND SFC TEMP' IS AT OR BELOW FREEZING, NO SNOW
3039! MELT WILL OCCUR.  SET THE SKIN TEMP TO THIS EFFECTIVE TEMP.  REDUCE
3040! (BY SUBLIMINATION ) OR INCREASE (BY FROST) THE DEPTH OF THE SNOWPACK,
3041! DEPENDING ON SIGN OF ETP.
3042! UPDATE SOIL HEAT FLUX (SSOIL) USING NEW SKIN TEMPERATURE (T1)
3043! SINCE NO SNOWMELT, SET ACCUMULATED SNOWMELT TO ZERO, SET 'EFFECTIVE'
3044! PRECIP FROM SNOWMELT TO ZERO, SET PHASE-CHANGE HEAT FLUX FROM SNOWMELT
3045! TO ZERO.
3046! ----------------------------------------------------------------------
3047! SUB-FREEZING BLOCK
3048! ----------------------------------------------------------------------
3049      T12 = (SFCTMP + T12A + T12B) / DENOM
3050      IF (T12 <=  TFREEZ) THEN
3051         T1 = T12
3052         SSOIL = DF1 * (T1- STC (1)) / DTOT
3053!        ESD = MAX (0.0, ESD- ETP2)
3054         ESD = MAX(0.0, ESD-ESNOW2)
3055         FLX3 = 0.0
3056         EX = 0.0
3057
3058         SNOMLT = 0.0
3059! ----------------------------------------------------------------------
3060! IF THE 'EFFECTIVE SNOW-GRND SFC TEMP' IS ABOVE FREEZING, SNOW MELT
3061! WILL OCCUR.  CALL THE SNOW MELT RATE,EX AND AMT, SNOMLT.  REVISE THE
3062! EFFECTIVE SNOW DEPTH.  REVISE THE SKIN TEMP BECAUSE IT WOULD HAVE CHGD
3063! DUE TO THE LATENT HEAT RELEASED BY THE MELTING. CALC THE LATENT HEAT
3064! RELEASED, FLX3. SET THE EFFECTIVE PRECIP, PRCP1 TO THE SNOW MELT RATE,
3065! EX FOR USE IN SMFLX.  ADJUSTMENT TO T1 TO ACCOUNT FOR SNOW PATCHES.
3066! CALCULATE QSAT VALID AT FREEZING POINT.  NOTE THAT ESAT (SATURATION
3067! VAPOR PRESSURE) VALUE OF 6.11E+2 USED HERE IS THAT VALID AT FRZZING
3068! POINT.  NOTE THAT ETP FROM CALL PENMAN IN SFLX IS IGNORED HERE IN
3069! FAVOR OF BULK ETP OVER 'OPEN WATER' AT FREEZING TEMP.
3070! UPDATE SOIL HEAT FLUX (S) USING NEW SKIN TEMPERATURE (T1)
3071! ----------------------------------------------------------------------
3072! ABOVE FREEZING BLOCK
3073! ----------------------------------------------------------------------
3074      ELSE
3075         T1 = TFREEZ * SNCOVR ** SNOEXP + T12 * (1.0- SNCOVR ** SNOEXP)
3076         BETA = 1.0
3077
3078! ----------------------------------------------------------------------
3079! IF POTENTIAL EVAP (SUBLIMATION) GREATER THAN DEPTH OF SNOWPACK.
3080! BETA<1
3081! SNOWPACK HAS SUBLIMATED AWAY, SET DEPTH TO ZERO.
3082! ----------------------------------------------------------------------
3083         IF ( ICE /= 0 ) then
3084            ! kmh  12/15/2005 modify SSOIL
3085            ! kmh  09/03/2006 modify DTOT
3086            IF ( DTOT .GT. 2.0*DSOIL ) THEN
3087               DTOT = 2.0*DSOIL
3088            ENDIF
3089         ENDIF
3090         SSOIL = DF1 * (T1- STC (1)) / DTOT
3091         IF (ESD-ESNOW2 <= ESDMIN) THEN
3092            ESD = 0.0
3093            EX = 0.0
3094            SNOMLT = 0.0
3095            FLX3 = 0.0
3096! ----------------------------------------------------------------------
3097! SUBLIMATION LESS THAN DEPTH OF SNOWPACK
3098! SNOWPACK (ESD) REDUCED BY ESNOW2 (DEPTH OF SUBLIMATED SNOW)
3099! ----------------------------------------------------------------------
3100         ELSE
3101            ESD = ESD-ESNOW2
3102            ETP3 = ETP * LSUBC
3103            SEH = RCH * (T1- TH2)
3104            T14 = T1* T1
3105            T14 = T14* T14
3106!           FLX3 = FDOWN - FLX1 - FLX2 -                                 &
3107!                  ((SNCOVR*EMISSI_S)+EMISSI*(1-SNCOVR))*SIGMA*T14 -     &
3108!                    SSOIL - SEH - ETANRG
3109            FLX3 = FDOWN - FLX1- FLX2- EMISSI*SIGMA * T14- SSOIL - SEH - ETANRG
3110            IF (FLX3 <= 0.0) FLX3 = 0.0
3111! ----------------------------------------------------------------------
3112! SNOWMELT REDUCTION DEPENDING ON SNOW COVER
3113! ----------------------------------------------------------------------
3114            EX = FLX3*0.001/ LSUBF
3115
3116! ----------------------------------------------------------------------
3117! ESDMIN REPRESENTS A SNOWPACK DEPTH THRESHOLD VALUE BELOW WHICH WE
3118! CHOOSE NOT TO RETAIN ANY SNOWPACK, AND INSTEAD INCLUDE IT IN SNOWMELT.
3119! ----------------------------------------------------------------------
3120            SNOMLT = EX * DT
3121            IF (ESD- SNOMLT >=  ESDMIN) THEN
3122               ESD = ESD- SNOMLT
3123! ----------------------------------------------------------------------
3124! SNOWMELT EXCEEDS SNOW DEPTH
3125! ----------------------------------------------------------------------
3126            ELSE
3127               EX = ESD / DT
3128               FLX3 = EX *1000.0* LSUBF
3129               SNOMLT = ESD
3130
3131               ESD = 0.0
3132! ----------------------------------------------------------------------
3133! END OF 'ESD .LE. ETP2' IF-BLOCK
3134! ----------------------------------------------------------------------
3135            END IF
3136         END IF
3137
3138! ----------------------------------------------------------------------
3139! END OF 'T12 .LE. TFREEZ' IF-BLOCK
3140! ----------------------------------------------------------------------
3141! ----------------------------------------------------------------------
3142! IF NON-GLACIAL LAND, ADD SNOWMELT RATE (EX) TO PRECIP RATE TO BE USED
3143! IN SUBROUTINE SMFLX (SOIL MOISTURE EVOLUTION) VIA INFILTRATION.
3144!
3145! FOR SEA-ICE AND GLACIAL-ICE, THE SNOWMELT WILL BE ADDED TO SUBSURFACE
3146! RUNOFF/BASEFLOW LATER NEAR THE END OF SFLX (AFTER RETURN FROM CALL TO
3147! SUBROUTINE SNOPAC)
3148! ----------------------------------------------------------------------
3149         IF (ICE == 0) PRCP1 = PRCP1+ EX
3150
3151! ----------------------------------------------------------------------
3152! SET THE EFFECTIVE POTNL EVAPOTRANSP (ETP1) TO ZERO SINCE THIS IS SNOW
3153! CASE, SO SURFACE EVAP NOT CALCULATED FROM EDIR, EC, OR ETT IN SMFLX
3154! (BELOW).
3155! IF SEAICE (ICE==1) SKIP CALL TO SMFLX.
3156! SMFLX RETURNS UPDATED SOIL MOISTURE VALUES FOR NON-GLACIAL LAND.
3157! IF SEA-ICE (ICE==1) OR GLACIAL-ICE (ICE==-1), SKIP CALL TO SMFLX,
3158! SINCE NO SOIL MEDIUM FOR SEA-ICE OR GLACIAL-ICE.
3159! ----------------------------------------------------------------------
3160      END IF
3161      IF (ICE == 0) THEN
3162         CALL SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL,                      &
3163                      SH2O,SLOPE,KDT,FRZFACT,                           &
3164                      SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT,                   &
3165                      SHDFAC,CMCMAX,                                    &
3166                      RUNOFF1,RUNOFF2,RUNOFF3,                          &
3167                      EDIR1,EC1,ET1,                                    &
3168                      DRIP)
3169! ----------------------------------------------------------------------
3170! BEFORE CALL SHFLX IN THIS SNOWPACK CASE, SET ZZ1 AND YY ARGUMENTS TO
3171! SPECIAL VALUES THAT ENSURE THAT GROUND HEAT FLUX CALCULATED IN SHFLX
3172! MATCHES THAT ALREADY COMPUTER FOR BELOW THE SNOWPACK, THUS THE SFC
3173! HEAT FLUX TO BE COMPUTED IN SHFLX WILL EFFECTIVELY BE THE FLUX AT THE
3174! SNOW TOP SURFACE.  T11 IS A DUMMY ARGUEMENT SO WE WILL NOT USE THE
3175! SKIN TEMP VALUE AS REVISED BY SHFLX.
3176! ----------------------------------------------------------------------
3177      END IF
3178      ZZ1 = 1.0
3179      YY = STC (1) -0.5* SSOIL * ZSOIL (1)* ZZ1/ DF1
3180
3181! ----------------------------------------------------------------------
3182! SHFLX WILL CALC/UPDATE THE SOIL TEMPS.  NOTE:  THE SUB-SFC HEAT FLUX
3183! (SSOIL1) AND THE SKIN TEMP (T11) OUTPUT FROM THIS SHFLX CALL ARE NOT
3184! USED  IN ANY SUBSEQUENT CALCULATIONS. RATHER, THEY ARE DUMMY VARIABLES
3185! HERE IN THE SNOPAC CASE, SINCE THE SKIN TEMP AND SUB-SFC HEAT FLUX ARE
3186! UPDATED INSTEAD NEAR THE BEGINNING OF THE CALL TO SNOPAC.
3187! ----------------------------------------------------------------------
3188      T11 = T1
3189      CALL SHFLX (SSOIL1,STC,SMC,SMCMAX,NSOIL,T11,DT,YY,ZZ1,ZSOIL,      &
3190                   TBOT,ZBOT,SMCWLT,PSISAT,SH2O,BEXP,F1,DF1,ICE,        &
3191                   QUARTZ,CSOIL,VEGTYP,ISURBAN)
3192
3193! ----------------------------------------------------------------------
3194! SNOW DEPTH AND DENSITY ADJUSTMENT BASED ON SNOW COMPACTION.  YY IS
3195! ASSUMED TO BE THE SOIL TEMPERTURE AT THE TOP OF THE SOIL COLUMN.
3196! ----------------------------------------------------------------------
3197      IF (ICE == 0) THEN
3198         ! NON-GLACIAL LAND
3199         IF (ESD >  0.) THEN
3200            CALL SNOWPACK (ESD,DT,SNOWH,SNDENS,T1,YY)
3201         ELSE
3202            ESD = 0.
3203            SNOWH = 0.
3204            SNDENS = 0.
3205            SNCOND = 1.
3206            SNCOVR = 0.
3207         END IF
3208      ELSEIF (ICE == 1) THEN
3209         ! SEA-ICE
3210         IF (ESD .GE. 0.01) THEN
3211            CALL SNOWPACK (ESD,DT,SNOWH,SNDENS,T1,YY)
3212        ELSE
3213           ESD = 0.01
3214           SNOWH = 0.05
3215           !KWM???? SNDENS =
3216           !KWM???? SNCOND =
3217           SNCOVR = 1.0
3218        ENDIF
3219      ELSEIF (ICE == -1) THEN
3220         ! GLACIAL-ICE
3221         IF (ESD .GE. 0.10) THEN
3222            CALL SNOWPACK (ESD,DT,SNOWH,SNDENS,T1,YY)
3223         ELSE
3224            ESD = 0.10
3225            SNOWH = 0.50
3226            !KWM???? SNDENS =
3227            !KWM???? SNCOND =
3228            SNCOVR = 1.0
3229        ENDIF
3230      ENDIF
3231! ----------------------------------------------------------------------
3232  END SUBROUTINE SNOPAC
3233! ----------------------------------------------------------------------
3234
3235
3236      SUBROUTINE SNOWPACK (ESD,DTSEC,SNOWH,SNDENS,TSNOW,TSOIL)
3237
3238! ----------------------------------------------------------------------
3239! SUBROUTINE SNOWPACK
3240! ----------------------------------------------------------------------
3241! CALCULATE COMPACTION OF SNOWPACK UNDER CONDITIONS OF INCREASING SNOW
3242! DENSITY, AS OBTAINED FROM AN APPROXIMATE SOLUTION OF E. ANDERSON'S
3243! DIFFERENTIAL EQUATION (3.29), NOAA TECHNICAL REPORT NWS 19, BY VICTOR
3244! KOREN, 03/25/95.
3245! ----------------------------------------------------------------------
3246! ESD     WATER EQUIVALENT OF SNOW (M)
3247! DTSEC   TIME STEP (SEC)
3248! SNOWH   SNOW DEPTH (M)
3249! SNDENS  SNOW DENSITY (G/CM3=DIMENSIONLESS FRACTION OF H2O DENSITY)
3250! TSNOW   SNOW SURFACE TEMPERATURE (K)
3251! TSOIL   SOIL SURFACE TEMPERATURE (K)
3252
3253! SUBROUTINE WILL RETURN NEW VALUES OF SNOWH AND SNDENS
3254! ----------------------------------------------------------------------
3255      IMPLICIT NONE
3256
3257      INTEGER                :: IPOL, J
3258      REAL, INTENT(IN)       :: ESD, DTSEC,TSNOW,TSOIL
3259      REAL, INTENT(INOUT)    :: SNOWH, SNDENS
3260      REAL                   :: BFAC,DSX,DTHR,DW,SNOWHC,PEXP,           &
3261                                TAVGC,TSNOWC,TSOILC,ESDC,ESDCX
3262      REAL, PARAMETER        :: C1 = 0.01, C2 = 21.0, G = 9.81,         &
3263                                KN = 4000.0
3264! ----------------------------------------------------------------------
3265! CONVERSION INTO SIMULATION UNITS
3266! ----------------------------------------------------------------------
3267      SNOWHC = SNOWH *100.
3268      ESDC = ESD *100.
3269      DTHR = DTSEC /3600.
3270      TSNOWC = TSNOW -273.15
3271      TSOILC = TSOIL -273.15
3272
3273! ----------------------------------------------------------------------
3274! CALCULATING OF AVERAGE TEMPERATURE OF SNOW PACK
3275! ----------------------------------------------------------------------
3276! ----------------------------------------------------------------------
3277! CALCULATING OF SNOW DEPTH AND DENSITY AS A RESULT OF COMPACTION
3278!  SNDENS=DS0*(EXP(BFAC*ESD)-1.)/(BFAC*ESD)
3279!  BFAC=DTHR*C1*EXP(0.08*TAVGC-C2*DS0)
3280! NOTE: BFAC*ESD IN SNDENS EQN ABOVE HAS TO BE CAREFULLY TREATED
3281! NUMERICALLY BELOW:
3282!   C1 IS THE FRACTIONAL INCREASE IN DENSITY (1/(CM*HR))
3283!   C2 IS A CONSTANT (CM3/G) KOJIMA ESTIMATED AS 21 CMS/G
3284! ----------------------------------------------------------------------
3285      TAVGC = 0.5* (TSNOWC + TSOILC)
3286      IF (ESDC >  1.E-2) THEN
3287         ESDCX = ESDC
3288      ELSE
3289         ESDCX = 1.E-2
3290      END IF
3291
3292!      DSX = SNDENS*((DEXP(BFAC*ESDC)-1.)/(BFAC*ESDC))
3293! ----------------------------------------------------------------------
3294! THE FUNCTION OF THE FORM (e**x-1)/x IMBEDDED IN ABOVE EXPRESSION
3295! FOR DSX WAS CAUSING NUMERICAL DIFFICULTIES WHEN THE DENOMINATOR "x"
3296! (I.E. BFAC*ESDC) BECAME ZERO OR APPROACHED ZERO (DESPITE THE FACT THAT
3297! THE ANALYTICAL FUNCTION (e**x-1)/x HAS A WELL DEFINED LIMIT AS
3298! "x" APPROACHES ZERO), HENCE BELOW WE REPLACE THE (e**x-1)/x
3299! EXPRESSION WITH AN EQUIVALENT, NUMERICALLY WELL-BEHAVED
3300! POLYNOMIAL EXPANSION.
3301
3302! NUMBER OF TERMS OF POLYNOMIAL EXPANSION, AND HENCE ITS ACCURACY,
3303! IS GOVERNED BY ITERATION LIMIT "IPOL".
3304!      IPOL GREATER THAN 9 ONLY MAKES A DIFFERENCE ON DOUBLE
3305!            PRECISION (RELATIVE ERRORS GIVEN IN PERCENT %).
3306!       IPOL=9, FOR REL.ERROR <~ 1.6 E-6 % (8 SIGNIFICANT DIGITS)
3307!       IPOL=8, FOR REL.ERROR <~ 1.8 E-5 % (7 SIGNIFICANT DIGITS)
3308!       IPOL=7, FOR REL.ERROR <~ 1.8 E-4 % ...
3309! ----------------------------------------------------------------------
3310      BFAC = DTHR * C1* EXP (0.08* TAVGC - C2* SNDENS)
3311      IPOL = 4
3312      PEXP = 0.
3313!        PEXP = (1. + PEXP)*BFAC*ESDC/REAL(J+1)
3314      DO J = IPOL,1, -1
3315         PEXP = (1. + PEXP)* BFAC * ESDCX / REAL (J +1)
3316      END DO
3317
3318      PEXP = PEXP + 1.
3319! ----------------------------------------------------------------------
3320! ABOVE LINE ENDS POLYNOMIAL SUBSTITUTION
3321! ----------------------------------------------------------------------
3322!     END OF KOREAN FORMULATION
3323
3324!     BASE FORMULATION (COGLEY ET AL., 1990)
3325!     CONVERT DENSITY FROM G/CM3 TO KG/M3
3326!       DSM=SNDENS*1000.0
3327
3328!       DSX=DSM+DTSEC*0.5*DSM*G*ESD/
3329!    &      (1E7*EXP(-0.02*DSM+KN/(TAVGC+273.16)-14.643))
3330
3331!  &   CONVERT DENSITY FROM KG/M3 TO G/CM3
3332!       DSX=DSX/1000.0
3333
3334!     END OF COGLEY ET AL. FORMULATION
3335
3336! ----------------------------------------------------------------------
3337! SET UPPER/LOWER LIMIT ON SNOW DENSITY
3338! ----------------------------------------------------------------------
3339      DSX = SNDENS * (PEXP)
3340      IF (DSX > 0.40) DSX = 0.40
3341      IF (DSX < 0.05) DSX = 0.05
3342! ----------------------------------------------------------------------
3343! UPDATE OF SNOW DEPTH AND DENSITY DEPENDING ON LIQUID WATER DURING
3344! SNOWMELT.  ASSUMED THAT 13% OF LIQUID WATER CAN BE STORED IN SNOW PER
3345! DAY DURING SNOWMELT TILL SNOW DENSITY 0.40.
3346! ----------------------------------------------------------------------
3347      SNDENS = DSX
3348      IF (TSNOWC >=  0.) THEN
3349         DW = 0.13* DTHR /24.
3350         SNDENS = SNDENS * (1. - DW) + DW
3351         IF (SNDENS >=  0.40) SNDENS = 0.40
3352! ----------------------------------------------------------------------
3353! CALCULATE SNOW DEPTH (CM) FROM SNOW WATER EQUIVALENT AND SNOW DENSITY.
3354! CHANGE SNOW DEPTH UNITS TO METERS
3355! ----------------------------------------------------------------------
3356      END IF
3357      SNOWHC = ESDC / SNDENS
3358      SNOWH = SNOWHC *0.01
3359
3360! ----------------------------------------------------------------------
3361  END SUBROUTINE SNOWPACK
3362! ----------------------------------------------------------------------
3363
3364      SUBROUTINE SNOWZ0 (SNCOVR,Z0, Z0BRD, SNOWH)
3365
3366! ----------------------------------------------------------------------
3367! SUBROUTINE SNOWZ0
3368! ----------------------------------------------------------------------
3369! CALCULATE TOTAL ROUGHNESS LENGTH OVER SNOW
3370! SNCOVR  FRACTIONAL SNOW COVER
3371! Z0      ROUGHNESS LENGTH (m)
3372! Z0S     SNOW ROUGHNESS LENGTH:=0.001 (m)
3373! ----------------------------------------------------------------------
3374      IMPLICIT NONE
3375      REAL, INTENT(IN)        :: SNCOVR, Z0BRD
3376      REAL, INTENT(OUT)       :: Z0
3377      REAL, PARAMETER         :: Z0S=0.001
3378      REAL, INTENT(IN)        :: SNOWH
3379      REAL                    :: BURIAL
3380      REAL                    :: Z0EFF
3381
3382!m      Z0 = (1.- SNCOVR)* Z0BRD + SNCOVR * Z0S
3383      BURIAL = 7.0*Z0BRD - SNOWH
3384      IF(BURIAL.LE.0.0007) THEN
3385        Z0EFF = Z0S
3386      ELSE     
3387        Z0EFF = BURIAL/7.0
3388      ENDIF
3389     
3390      Z0 = (1.- SNCOVR)* Z0BRD + SNCOVR * Z0EFF
3391
3392! ----------------------------------------------------------------------
3393  END SUBROUTINE SNOWZ0
3394! ----------------------------------------------------------------------
3395
3396
3397      SUBROUTINE SNOW_NEW (TEMP,NEWSN,SNOWH,SNDENS)
3398
3399! ----------------------------------------------------------------------
3400! SUBROUTINE SNOW_NEW
3401! ----------------------------------------------------------------------
3402! CALCULATE SNOW DEPTH AND DENSITITY TO ACCOUNT FOR THE NEW SNOWFALL.
3403! NEW VALUES OF SNOW DEPTH & DENSITY RETURNED.
3404
3405! TEMP    AIR TEMPERATURE (K)
3406! NEWSN   NEW SNOWFALL (M)
3407! SNOWH   SNOW DEPTH (M)
3408! SNDENS  SNOW DENSITY (G/CM3=DIMENSIONLESS FRACTION OF H2O DENSITY)
3409! ----------------------------------------------------------------------
3410      IMPLICIT NONE
3411      REAL, INTENT(IN)        :: NEWSN, TEMP
3412      REAL, INTENT(INOUT)     :: SNDENS, SNOWH
3413      REAL                    :: DSNEW, HNEWC, SNOWHC,NEWSNC,TEMPC
3414
3415! ----------------------------------------------------------------------
3416! CONVERSION INTO SIMULATION UNITS
3417! ----------------------------------------------------------------------
3418      SNOWHC = SNOWH *100.
3419      NEWSNC = NEWSN *100.
3420
3421! ----------------------------------------------------------------------
3422! CALCULATING NEW SNOWFALL DENSITY DEPENDING ON TEMPERATURE
3423! EQUATION FROM GOTTLIB L. 'A GENERAL RUNOFF MODEL FOR SNOWCOVERED
3424! AND GLACIERIZED BASIN', 6TH NORDIC HYDROLOGICAL CONFERENCE,
3425! VEMADOLEN, SWEDEN, 1980, 172-177PP.
3426!-----------------------------------------------------------------------
3427      TEMPC = TEMP -273.15
3428      IF (TEMPC <=  -15.) THEN
3429         DSNEW = 0.05
3430      ELSE
3431         DSNEW = 0.05+0.0017* (TEMPC +15.)**1.5
3432      END IF
3433! ----------------------------------------------------------------------
3434! ADJUSTMENT OF SNOW DENSITY DEPENDING ON NEW SNOWFALL
3435! ----------------------------------------------------------------------
3436      HNEWC = NEWSNC / DSNEW
3437      IF (SNOWHC + HNEWC .LT. 1.0E-3) THEN
3438         SNDENS = MAX(DSNEW,SNDENS)
3439      ELSE
3440         SNDENS = (SNOWHC * SNDENS + HNEWC * DSNEW)/ (SNOWHC + HNEWC)
3441      ENDIF
3442      SNOWHC = SNOWHC + HNEWC
3443      SNOWH = SNOWHC *0.01
3444
3445! ----------------------------------------------------------------------
3446  END SUBROUTINE SNOW_NEW
3447! ----------------------------------------------------------------------
3448
3449      SUBROUTINE SRT (RHSTT,EDIR,ET,SH2O,SH2OA,NSOIL,PCPDRP,            &
3450                       ZSOIL,DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1,           &
3451                       RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZX,SICE,AI,BI,CI)
3452
3453! ----------------------------------------------------------------------
3454! SUBROUTINE SRT
3455! ----------------------------------------------------------------------
3456! CALCULATE THE RIGHT HAND SIDE OF THE TIME TENDENCY TERM OF THE SOIL
3457! WATER DIFFUSION EQUATION.  ALSO TO COMPUTE ( PREPARE ) THE MATRIX
3458! COEFFICIENTS FOR THE TRI-DIAGONAL MATRIX OF THE IMPLICIT TIME SCHEME.
3459! ----------------------------------------------------------------------
3460      IMPLICIT NONE
3461      INTEGER, INTENT(IN)       :: NSOIL
3462      INTEGER                   :: IALP1, IOHINF, J, JJ,  K, KS
3463      REAL, INTENT(IN)          :: BEXP, DKSAT, DT, DWSAT, EDIR, FRZX,  &
3464                                   KDT, PCPDRP, SLOPE, SMCMAX, SMCWLT
3465      REAL, INTENT(OUT)         :: RUNOFF1, RUNOFF2
3466      REAL, DIMENSION(1:NSOIL), INTENT(IN)   :: ET, SH2O, SH2OA, SICE,  &
3467                                                ZSOIL
3468      REAL, DIMENSION(1:NSOIL), INTENT(OUT)  :: RHSTT
3469      REAL, DIMENSION(1:NSOIL), INTENT(OUT)  :: AI, BI, CI
3470      REAL, DIMENSION(1:NSOIL)  :: DMAX
3471      REAL                      :: ACRT, DD, DDT, DDZ, DDZ2, DENOM,     &
3472                                   DENOM2,DICE, DSMDZ, DSMDZ2, DT1,     &
3473                                   FCR,INFMAX,MXSMC,MXSMC2,NUMER,PDDUM, &
3474                                   PX, SICEMAX,SLOPX, SMCAV, SSTT,      &
3475                                   SUM, VAL, WCND, WCND2, WDF, WDF2
3476      INTEGER, PARAMETER        :: CVFRZ = 3
3477
3478! ----------------------------------------------------------------------
3479! FROZEN GROUND VERSION:
3480! REFERENCE FROZEN GROUND PARAMETER, CVFRZ, IS A SHAPE PARAMETER OF
3481! AREAL DISTRIBUTION FUNCTION OF SOIL ICE CONTENT WHICH EQUALS 1/CV.
3482! CV IS A COEFFICIENT OF SPATIAL VARIATION OF SOIL ICE CONTENT.  BASED
3483! ON FIELD DATA CV DEPENDS ON AREAL MEAN OF FROZEN DEPTH, AND IT CLOSE
3484! TO CONSTANT = 0.6 IF AREAL MEAN FROZEN DEPTH IS ABOVE 20 CM.  THAT IS
3485! WHY PARAMETER CVFRZ = 3 (INT{1/0.6*0.6}).
3486! CURRENT LOGIC DOESN'T ALLOW CVFRZ BE BIGGER THAN 3
3487! ----------------------------------------------------------------------
3488
3489! ----------------------------------------------------------------------
3490! DETERMINE RAINFALL INFILTRATION RATE AND RUNOFF.  INCLUDE THE
3491! INFILTRATION FORMULE FROM SCHAAKE AND KOREN MODEL.
3492! MODIFIED BY Q DUAN
3493! ----------------------------------------------------------------------
3494! ----------------------------------------------------------------------
3495! LET SICEMAX BE THE GREATEST, IF ANY, FROZEN WATER CONTENT WITHIN SOIL
3496! LAYERS.
3497! ----------------------------------------------------------------------
3498      IOHINF = 1
3499      SICEMAX = 0.0
3500      DO KS = 1,NSOIL
3501         IF (SICE (KS) >  SICEMAX) SICEMAX = SICE (KS)
3502! ----------------------------------------------------------------------
3503! DETERMINE RAINFALL INFILTRATION RATE AND RUNOFF
3504! ----------------------------------------------------------------------
3505      END DO
3506      PDDUM = PCPDRP
3507      RUNOFF1 = 0.0
3508
3509! ----------------------------------------------------------------------
3510! MODIFIED BY Q. DUAN, 5/16/94
3511! ----------------------------------------------------------------------
3512!        IF (IOHINF == 1) THEN
3513
3514      IF (PCPDRP /=  0.0) THEN
3515         DT1 = DT /86400.
3516         SMCAV = SMCMAX - SMCWLT
3517
3518! ----------------------------------------------------------------------
3519! FROZEN GROUND VERSION:
3520! ----------------------------------------------------------------------
3521         DMAX (1)= - ZSOIL (1)* SMCAV
3522
3523         DICE = - ZSOIL (1) * SICE (1)
3524         DMAX (1)= DMAX (1)* (1.0- (SH2OA (1) + SICE (1) - SMCWLT)/      &
3525                    SMCAV)
3526
3527         DD = DMAX (1)
3528
3529! ----------------------------------------------------------------------
3530! FROZEN GROUND VERSION:
3531! ----------------------------------------------------------------------
3532         DO KS = 2,NSOIL
3533
3534            DICE = DICE+ ( ZSOIL (KS -1) - ZSOIL (KS) ) * SICE (KS)
3535            DMAX (KS) = (ZSOIL (KS -1) - ZSOIL (KS))* SMCAV
3536            DMAX (KS) = DMAX (KS)* (1.0- (SH2OA (KS) + SICE (KS)        &
3537                        - SMCWLT)/ SMCAV)
3538            DD = DD+ DMAX (KS)
3539! ----------------------------------------------------------------------
3540! VAL = (1.-EXP(-KDT*SQRT(DT1)))
3541! IN BELOW, REMOVE THE SQRT IN ABOVE
3542! ----------------------------------------------------------------------
3543         END DO
3544         VAL = (1. - EXP ( - KDT * DT1))
3545         DDT = DD * VAL
3546         PX = PCPDRP * DT
3547         IF (PX <  0.0) PX = 0.0
3548
3549! ----------------------------------------------------------------------
3550! FROZEN GROUND VERSION:
3551! REDUCTION OF INFILTRATION BASED ON FROZEN GROUND PARAMETERS
3552! ----------------------------------------------------------------------
3553         INFMAX = (PX * (DDT / (PX + DDT)))/ DT
3554         FCR = 1.
3555         IF (DICE >  1.E-2) THEN
3556            ACRT = CVFRZ * FRZX / DICE
3557            SUM = 1.
3558            IALP1 = CVFRZ - 1
3559            DO J = 1,IALP1
3560               K = 1
3561               DO JJ = J +1,IALP1
3562                  K = K * JJ
3563               END DO
3564               SUM = SUM + (ACRT ** ( CVFRZ - J)) / FLOAT (K)
3565            END DO
3566            FCR = 1. - EXP ( - ACRT) * SUM
3567         END IF
3568
3569! ----------------------------------------------------------------------
3570! CORRECTION OF INFILTRATION LIMITATION:
3571! IF INFMAX .LE. HYDROLIC CONDUCTIVITY ASSIGN INFMAX THE VALUE OF
3572! HYDROLIC CONDUCTIVITY
3573! ----------------------------------------------------------------------
3574!         MXSMC = MAX ( SH2OA(1), SH2OA(2) )
3575         INFMAX = INFMAX * FCR
3576
3577         MXSMC = SH2OA (1)
3578         CALL WDFCND (WDF,WCND,MXSMC,SMCMAX,BEXP,DKSAT,DWSAT,           &
3579                         SICEMAX)
3580         INFMAX = MAX (INFMAX,WCND)
3581
3582         INFMAX = MIN (INFMAX,PX/DT)
3583         IF (PCPDRP >  INFMAX) THEN
3584            RUNOFF1 = PCPDRP - INFMAX
3585            PDDUM = INFMAX
3586         END IF
3587! ----------------------------------------------------------------------
3588! TO AVOID SPURIOUS DRAINAGE BEHAVIOR, 'UPSTREAM DIFFERENCING' IN LINE
3589! BELOW REPLACED WITH NEW APPROACH IN 2ND LINE:
3590! 'MXSMC = MAX(SH2OA(1), SH2OA(2))'
3591! ----------------------------------------------------------------------
3592      END IF
3593
3594      MXSMC = SH2OA (1)
3595      CALL WDFCND (WDF,WCND,MXSMC,SMCMAX,BEXP,DKSAT,DWSAT,              &
3596                    SICEMAX)
3597! ----------------------------------------------------------------------
3598! CALC THE MATRIX COEFFICIENTS AI, BI, AND CI FOR THE TOP LAYER
3599! ----------------------------------------------------------------------
3600      DDZ = 1. / ( - .5 * ZSOIL (2) )
3601      AI (1) = 0.0
3602      BI (1) = WDF * DDZ / ( - ZSOIL (1) )
3603
3604! ----------------------------------------------------------------------
3605! CALC RHSTT FOR THE TOP LAYER AFTER CALC'NG THE VERTICAL SOIL MOISTURE
3606! GRADIENT BTWN THE TOP AND NEXT TO TOP LAYERS.
3607! ----------------------------------------------------------------------
3608      CI (1) = - BI (1)
3609      DSMDZ = ( SH2O (1) - SH2O (2) ) / ( - .5 * ZSOIL (2) )
3610      RHSTT (1) = (WDF * DSMDZ + WCND- PDDUM + EDIR + ET (1))/ ZSOIL (1)
3611
3612! ----------------------------------------------------------------------
3613! INITIALIZE DDZ2
3614! ----------------------------------------------------------------------
3615      SSTT = WDF * DSMDZ + WCND+ EDIR + ET (1)
3616
3617! ----------------------------------------------------------------------
3618! LOOP THRU THE REMAINING SOIL LAYERS, REPEATING THE ABV PROCESS
3619! ----------------------------------------------------------------------
3620      DDZ2 = 0.0
3621      DO K = 2,NSOIL
3622         DENOM2 = (ZSOIL (K -1) - ZSOIL (K))
3623         IF (K /= NSOIL) THEN
3624
3625! ----------------------------------------------------------------------
3626! AGAIN, TO AVOID SPURIOUS DRAINAGE BEHAVIOR, 'UPSTREAM DIFFERENCING' IN
3627! LINE BELOW REPLACED WITH NEW APPROACH IN 2ND LINE:
3628! 'MXSMC2 = MAX (SH2OA(K), SH2OA(K+1))'
3629! ----------------------------------------------------------------------
3630            SLOPX = 1.
3631
3632            MXSMC2 = SH2OA (K)
3633            CALL WDFCND (WDF2,WCND2,MXSMC2,SMCMAX,BEXP,DKSAT,DWSAT,     &
3634                          SICEMAX)
3635! -----------------------------------------------------------------------
3636! CALC SOME PARTIAL PRODUCTS FOR LATER USE IN CALC'NG RHSTT
3637! ----------------------------------------------------------------------
3638            DENOM = (ZSOIL (K -1) - ZSOIL (K +1))
3639
3640! ----------------------------------------------------------------------
3641! CALC THE MATRIX COEF, CI, AFTER CALC'NG ITS PARTIAL PRODUCT
3642! ----------------------------------------------------------------------
3643            DSMDZ2 = (SH2O (K) - SH2O (K +1)) / (DENOM * 0.5)
3644            DDZ2 = 2.0 / DENOM
3645            CI (K) = - WDF2 * DDZ2 / DENOM2
3646
3647         ELSE
3648! ----------------------------------------------------------------------
3649! SLOPE OF BOTTOM LAYER IS INTRODUCED
3650! ----------------------------------------------------------------------
3651
3652! ----------------------------------------------------------------------
3653! RETRIEVE THE SOIL WATER DIFFUSIVITY AND HYDRAULIC CONDUCTIVITY FOR
3654! THIS LAYER
3655! ----------------------------------------------------------------------
3656            SLOPX = SLOPE
3657          CALL WDFCND (WDF2,WCND2,SH2OA (NSOIL),SMCMAX,BEXP,DKSAT,DWSAT,     &
3658                            SICEMAX)
3659
3660! ----------------------------------------------------------------------
3661! CALC A PARTIAL PRODUCT FOR LATER USE IN CALC'NG RHSTT
3662! ----------------------------------------------------------------------
3663
3664! ----------------------------------------------------------------------
3665! SET MATRIX COEF CI TO ZERO
3666! ----------------------------------------------------------------------
3667            DSMDZ2 = 0.0
3668            CI (K) = 0.0
3669! ----------------------------------------------------------------------
3670! CALC RHSTT FOR THIS LAYER AFTER CALC'NG ITS NUMERATOR
3671! ----------------------------------------------------------------------
3672         END IF
3673         NUMER = (WDF2 * DSMDZ2) + SLOPX * WCND2- (WDF * DSMDZ)         &
3674                 - WCND+ ET (K)
3675
3676! ----------------------------------------------------------------------
3677! CALC MATRIX COEFS, AI, AND BI FOR THIS LAYER
3678! ----------------------------------------------------------------------
3679         RHSTT (K) = NUMER / ( - DENOM2)
3680         AI (K) = - WDF * DDZ / DENOM2
3681
3682! ----------------------------------------------------------------------
3683! RESET VALUES OF WDF, WCND, DSMDZ, AND DDZ FOR LOOP TO NEXT LYR
3684! RUNOFF2:  SUB-SURFACE OR BASEFLOW RUNOFF
3685! ----------------------------------------------------------------------
3686         BI (K) = - ( AI (K) + CI (K) )
3687         IF (K .eq. NSOIL) THEN
3688            RUNOFF2 = SLOPX * WCND2
3689         END IF
3690         IF (K .ne. NSOIL) THEN
3691            WDF = WDF2
3692            WCND = WCND2
3693            DSMDZ = DSMDZ2
3694            DDZ = DDZ2
3695         END IF
3696      END DO
3697! ----------------------------------------------------------------------
3698  END SUBROUTINE SRT
3699! ----------------------------------------------------------------------
3700
3701      SUBROUTINE SSTEP (SH2OOUT,SH2OIN,CMC,RHSTT,RHSCT,DT,              &
3702                        NSOIL,SMCMAX,CMCMAX,RUNOFF3,ZSOIL,SMC,SICE,     &
3703                        AI,BI,CI)
3704
3705! ----------------------------------------------------------------------
3706! SUBROUTINE SSTEP
3707! ----------------------------------------------------------------------
3708! CALCULATE/UPDATE SOIL MOISTURE CONTENT VALUES AND CANOPY MOISTURE
3709! CONTENT VALUES.
3710! ----------------------------------------------------------------------
3711      IMPLICIT NONE
3712      INTEGER, INTENT(IN)       :: NSOIL
3713      INTEGER                   :: I, K, KK11
3714
3715      REAL, INTENT(IN)          :: CMCMAX, DT, SMCMAX
3716      REAL, INTENT(OUT)         :: RUNOFF3
3717      REAL, INTENT(INOUT)       :: CMC
3718      REAL, DIMENSION(1:NSOIL), INTENT(IN)     :: SH2OIN, SICE, ZSOIL
3719      REAL, DIMENSION(1:NSOIL), INTENT(OUT)    :: SH2OOUT
3720      REAL, DIMENSION(1:NSOIL), INTENT(INOUT)  :: RHSTT, SMC
3721      REAL, DIMENSION(1:NSOIL), INTENT(INOUT)  :: AI, BI, CI
3722      REAL, DIMENSION(1:NSOIL)  :: RHSTTin
3723      REAL, DIMENSION(1:NSOIL)  :: CIin
3724      REAL                      :: DDZ, RHSCT, STOT, WPLUS
3725
3726! ----------------------------------------------------------------------
3727! CREATE 'AMOUNT' VALUES OF VARIABLES TO BE INPUT TO THE
3728! TRI-DIAGONAL MATRIX ROUTINE.
3729! ----------------------------------------------------------------------
3730      DO K = 1,NSOIL
3731         RHSTT (K) = RHSTT (K) * DT
3732         AI (K) = AI (K) * DT
3733         BI (K) = 1. + BI (K) * DT
3734         CI (K) = CI (K) * DT
3735      END DO
3736! ----------------------------------------------------------------------
3737! COPY VALUES FOR INPUT VARIABLES BEFORE CALL TO ROSR12
3738! ----------------------------------------------------------------------
3739      DO K = 1,NSOIL
3740         RHSTTin (K) = RHSTT (K)
3741      END DO
3742      DO K = 1,NSOIL
3743         CIin (K) = CI (K)
3744      END DO
3745! ----------------------------------------------------------------------
3746! CALL ROSR12 TO SOLVE THE TRI-DIAGONAL MATRIX
3747! ----------------------------------------------------------------------
3748      CALL ROSR12 (CI,AI,BI,CIin,RHSTTin,RHSTT,NSOIL)
3749! ----------------------------------------------------------------------
3750! SUM THE PREVIOUS SMC VALUE AND THE MATRIX SOLUTION TO GET A
3751! NEW VALUE.  MIN ALLOWABLE VALUE OF SMC WILL BE 0.02.
3752! RUNOFF3: RUNOFF WITHIN SOIL LAYERS
3753! ----------------------------------------------------------------------
3754      WPLUS = 0.0
3755      RUNOFF3 = 0.
3756
3757      DDZ = - ZSOIL (1)
3758      DO K = 1,NSOIL
3759         IF (K /= 1) DDZ = ZSOIL (K - 1) - ZSOIL (K)
3760         SH2OOUT (K) = SH2OIN (K) + CI (K) + WPLUS / DDZ
3761         STOT = SH2OOUT (K) + SICE (K)
3762         IF (STOT > SMCMAX) THEN
3763            IF (K .eq. 1) THEN
3764               DDZ = - ZSOIL (1)
3765            ELSE
3766               KK11 = K - 1
3767               DDZ = - ZSOIL (K) + ZSOIL (KK11)
3768            END IF
3769            WPLUS = (STOT - SMCMAX) * DDZ
3770         ELSE
3771            WPLUS = 0.
3772         END IF
3773         SMC (K) = MAX ( MIN (STOT,SMCMAX),0.02 )
3774         SH2OOUT (K) = MAX ( (SMC (K) - SICE (K)),0.0)
3775      END DO
3776
3777! ----------------------------------------------------------------------
3778! UPDATE CANOPY WATER CONTENT/INTERCEPTION (CMC).  CONVERT RHSCT TO
3779! AN 'AMOUNT' VALUE AND ADD TO PREVIOUS CMC VALUE TO GET NEW CMC.
3780! ----------------------------------------------------------------------
3781      RUNOFF3 = WPLUS
3782      CMC = CMC + DT * RHSCT
3783      IF (CMC < 1.E-20) CMC = 0.0
3784      CMC = MIN (CMC,CMCMAX)
3785
3786! ----------------------------------------------------------------------
3787  END SUBROUTINE SSTEP
3788! ----------------------------------------------------------------------
3789
3790      SUBROUTINE TBND (TU,TB,ZSOIL,ZBOT,K,NSOIL,TBND1)
3791
3792! ----------------------------------------------------------------------
3793! SUBROUTINE TBND
3794! ----------------------------------------------------------------------
3795! CALCULATE TEMPERATURE ON THE BOUNDARY OF THE LAYER BY INTERPOLATION OF
3796! THE MIDDLE LAYER TEMPERATURES
3797! ----------------------------------------------------------------------
3798      IMPLICIT NONE
3799      INTEGER, INTENT(IN)       :: NSOIL
3800      INTEGER                   :: K
3801      REAL, INTENT(IN)          :: TB, TU, ZBOT
3802      REAL, INTENT(OUT)         :: TBND1
3803      REAL, DIMENSION(1:NSOIL), INTENT(IN)   :: ZSOIL
3804      REAL                      :: ZB, ZUP
3805      REAL, PARAMETER           :: T0 = 273.15
3806
3807! ----------------------------------------------------------------------
3808! USE SURFACE TEMPERATURE ON THE TOP OF THE FIRST LAYER
3809! ----------------------------------------------------------------------
3810     IF (K == 1) THEN
3811         ZUP = 0.
3812      ELSE
3813         ZUP = ZSOIL (K -1)
3814      END IF
3815! ----------------------------------------------------------------------
3816! USE DEPTH OF THE CONSTANT BOTTOM TEMPERATURE WHEN INTERPOLATE
3817! TEMPERATURE INTO THE LAST LAYER BOUNDARY
3818! ----------------------------------------------------------------------
3819      IF (K ==  NSOIL) THEN
3820         ZB = 2.* ZBOT - ZSOIL (K)
3821      ELSE
3822         ZB = ZSOIL (K +1)
3823      END IF
3824! ----------------------------------------------------------------------
3825! LINEAR INTERPOLATION BETWEEN THE AVERAGE LAYER TEMPERATURES
3826! ----------------------------------------------------------------------
3827
3828      TBND1 = TU + (TB - TU)* (ZUP - ZSOIL (K))/ (ZUP - ZB)
3829! ----------------------------------------------------------------------
3830  END SUBROUTINE TBND
3831! ----------------------------------------------------------------------
3832
3833
3834      SUBROUTINE TDFCND ( DF, SMC, QZ, SMCMAX, SH2O)
3835
3836! ----------------------------------------------------------------------
3837! SUBROUTINE TDFCND
3838! ----------------------------------------------------------------------
3839! CALCULATE THERMAL DIFFUSIVITY AND CONDUCTIVITY OF THE SOIL FOR A GIVEN
3840! POINT AND TIME.
3841! ----------------------------------------------------------------------
3842! PETERS-LIDARD APPROACH (PETERS-LIDARD et al., 1998)
3843! June 2001 CHANGES: FROZEN SOIL CONDITION.
3844! ----------------------------------------------------------------------
3845      IMPLICIT NONE
3846      REAL, INTENT(IN)          :: QZ,  SMC, SMCMAX, SH2O
3847      REAL, INTENT(OUT)         :: DF
3848      REAL                      :: AKE, GAMMD, THKDRY, THKICE, THKO,    &
3849                                   THKQTZ,THKSAT,THKS,THKW,SATRATIO,XU, &
3850                                   XUNFROZ
3851
3852! ----------------------------------------------------------------------
3853! WE NOW GET QUARTZ AS AN INPUT ARGUMENT (SET IN ROUTINE REDPRM):
3854!      DATA QUARTZ /0.82, 0.10, 0.25, 0.60, 0.52,
3855!     &             0.35, 0.60, 0.40, 0.82/
3856! ----------------------------------------------------------------------
3857! IF THE SOIL HAS ANY MOISTURE CONTENT COMPUTE A PARTIAL SUM/PRODUCT
3858! OTHERWISE USE A CONSTANT VALUE WHICH WORKS WELL WITH MOST SOILS
3859! ----------------------------------------------------------------------
3860!  THKW ......WATER THERMAL CONDUCTIVITY
3861!  THKQTZ ....THERMAL CONDUCTIVITY FOR QUARTZ
3862!  THKO ......THERMAL CONDUCTIVITY FOR OTHER SOIL COMPONENTS
3863!  THKS ......THERMAL CONDUCTIVITY FOR THE SOLIDS COMBINED(QUARTZ+OTHER)
3864!  THKICE ....ICE THERMAL CONDUCTIVITY
3865!  SMCMAX ....POROSITY (= SMCMAX)
3866!  QZ .........QUARTZ CONTENT (SOIL TYPE DEPENDENT)
3867! ----------------------------------------------------------------------
3868! USE AS IN PETERS-LIDARD, 1998 (MODIF. FROM JOHANSEN, 1975).
3869
3870!                                  PABLO GRUNMANN, 08/17/98
3871! REFS.:
3872!      FAROUKI, O.T.,1986: THERMAL PROPERTIES OF SOILS. SERIES ON ROCK
3873!              AND SOIL MECHANICS, VOL. 11, TRANS TECH, 136 PP.
3874!      JOHANSEN, O., 1975: THERMAL CONDUCTIVITY OF SOILS. PH.D. THESIS,
3875!              UNIVERSITY OF TRONDHEIM,
3876!      PETERS-LIDARD, C. D., ET AL., 1998: THE EFFECT OF SOIL THERMAL
3877!              CONDUCTIVITY PARAMETERIZATION ON SURFACE ENERGY FLUXES
3878!              AND TEMPERATURES. JOURNAL OF THE ATMOSPHERIC SCIENCES,
3879!              VOL. 55, PP. 1209-1224.
3880! ----------------------------------------------------------------------
3881! NEEDS PARAMETERS
3882! POROSITY(SOIL TYPE):
3883!      POROS = SMCMAX
3884! SATURATION RATIO:
3885! PARAMETERS  W/(M.K)
3886      SATRATIO = SMC / SMCMAX
3887! ICE CONDUCTIVITY:
3888      THKICE = 2.2
3889! WATER CONDUCTIVITY:
3890      THKW = 0.57
3891! THERMAL CONDUCTIVITY OF "OTHER" SOIL COMPONENTS
3892!      IF (QZ .LE. 0.2) THKO = 3.0
3893      THKO = 2.0
3894! QUARTZ' CONDUCTIVITY
3895      THKQTZ = 7.7
3896! SOLIDS' CONDUCTIVITY
3897      THKS = (THKQTZ ** QZ)* (THKO ** (1. - QZ))
3898
3899! UNFROZEN FRACTION (FROM 1., i.e., 100%LIQUID, TO 0. (100% FROZEN))
3900      XUNFROZ = SH2O / SMC
3901! UNFROZEN VOLUME FOR SATURATION (POROSITY*XUNFROZ)
3902      XU = XUNFROZ * SMCMAX
3903
3904! SATURATED THERMAL CONDUCTIVITY
3905      THKSAT = THKS ** (1. - SMCMAX)* THKICE ** (SMCMAX - XU)* THKW **   &
3906         (XU)
3907
3908! DRY DENSITY IN KG/M3
3909      GAMMD = (1. - SMCMAX)*2700.
3910
3911! DRY THERMAL CONDUCTIVITY IN W.M-1.K-1
3912      THKDRY = (0.135* GAMMD+ 64.7)/ (2700. - 0.947* GAMMD)
3913! FROZEN
3914      IF ( (SH2O + 0.0005) <  SMC ) THEN
3915         AKE = SATRATIO
3916! UNFROZEN
3917! RANGE OF VALIDITY FOR THE KERSTEN NUMBER (AKE)
3918      ELSE
3919
3920! KERSTEN NUMBER (USING "FINE" FORMULA, VALID FOR SOILS CONTAINING AT
3921! LEAST 5% OF PARTICLES WITH DIAMETER LESS THAN 2.E-6 METERS.)
3922! (FOR "COARSE" FORMULA, SEE PETERS-LIDARD ET AL., 1998).
3923
3924         IF ( SATRATIO >  0.1 ) THEN
3925
3926            AKE = LOG10 (SATRATIO) + 1.0
3927
3928! USE K = KDRY
3929         ELSE
3930
3931            AKE = 0.0
3932         END IF
3933!  THERMAL CONDUCTIVITY
3934
3935      END IF
3936
3937      DF = AKE * (THKSAT - THKDRY) + THKDRY
3938! ----------------------------------------------------------------------
3939  END SUBROUTINE TDFCND
3940! ----------------------------------------------------------------------
3941
3942      SUBROUTINE TMPAVG (TAVG,TUP,TM,TDN,ZSOIL,NSOIL,K)
3943
3944! ----------------------------------------------------------------------
3945! SUBROUTINE TMPAVG
3946! ----------------------------------------------------------------------
3947! CALCULATE SOIL LAYER AVERAGE TEMPERATURE (TAVG) IN FREEZING/THAWING
3948! LAYER USING UP, DOWN, AND MIDDLE LAYER TEMPERATURES (TUP, TDN, TM),
3949! WHERE TUP IS AT TOP BOUNDARY OF LAYER, TDN IS AT BOTTOM BOUNDARY OF
3950! LAYER.  TM IS LAYER PROGNOSTIC STATE TEMPERATURE.
3951! ----------------------------------------------------------------------
3952      IMPLICIT NONE
3953      INTEGER  K
3954
3955      INTEGER  NSOIL
3956      REAL     DZ
3957      REAL     DZH
3958      REAL     T0
3959      REAL     TAVG
3960      REAL     TDN
3961      REAL     TM
3962      REAL     TUP
3963      REAL     X0
3964      REAL     XDN
3965      REAL     XUP
3966
3967      REAL     ZSOIL (NSOIL)
3968
3969! ----------------------------------------------------------------------
3970      PARAMETER (T0 = 2.7315E2)
3971      IF (K .eq. 1) THEN
3972         DZ = - ZSOIL (1)
3973      ELSE
3974         DZ = ZSOIL (K -1) - ZSOIL (K)
3975      END IF
3976
3977      DZH = DZ *0.5
3978      IF (TUP .lt. T0) THEN
3979         IF (TM .lt. T0) THEN
3980! ----------------------------------------------------------------------
3981! TUP, TM, TDN < T0
3982! ----------------------------------------------------------------------
3983            IF (TDN .lt. T0) THEN
3984               TAVG = (TUP + 2.0* TM + TDN)/ 4.0
3985! ----------------------------------------------------------------------
3986! TUP & TM < T0,  TDN .ge. T0
3987! ----------------------------------------------------------------------
3988            ELSE
3989               X0 = (T0- TM) * DZH / (TDN - TM)
3990               TAVG = 0.5 * (TUP * DZH + TM * (DZH + X0) + T0* (        &
3991     &               2.* DZH - X0)) / DZ
3992            END IF
3993         ELSE
3994! ----------------------------------------------------------------------
3995! TUP < T0, TM .ge. T0, TDN < T0
3996! ----------------------------------------------------------------------
3997            IF (TDN .lt. T0) THEN
3998               XUP = (T0- TUP) * DZH / (TM - TUP)
3999               XDN = DZH - (T0- TM) * DZH / (TDN - TM)
4000               TAVG = 0.5 * (TUP * XUP + T0* (2.* DZ - XUP - XDN)       &
4001     &                + TDN * XDN) / DZ
4002! ----------------------------------------------------------------------
4003! TUP < T0, TM .ge. T0, TDN .ge. T0
4004! ----------------------------------------------------------------------
4005            ELSE
4006               XUP = (T0- TUP) * DZH / (TM - TUP)
4007               TAVG = 0.5 * (TUP * XUP + T0* (2.* DZ - XUP)) / DZ
4008            END IF
4009         END IF
4010      ELSE
4011         IF (TM .lt. T0) THEN
4012! ----------------------------------------------------------------------
4013! TUP .ge. T0, TM < T0, TDN < T0
4014! ----------------------------------------------------------------------
4015            IF (TDN .lt. T0) THEN
4016               XUP = DZH - (T0- TUP) * DZH / (TM - TUP)
4017               TAVG = 0.5 * (T0* (DZ - XUP) + TM * (DZH + XUP)          &
4018     &                + TDN * DZH) / DZ
4019! ----------------------------------------------------------------------
4020! TUP .ge. T0, TM < T0, TDN .ge. T0
4021! ----------------------------------------------------------------------
4022            ELSE
4023               XUP = DZH - (T0- TUP) * DZH / (TM - TUP)
4024               XDN = (T0- TM) * DZH / (TDN - TM)
4025               TAVG = 0.5 * (T0* (2.* DZ - XUP - XDN) + TM *            &
4026     & (XUP + XDN)) / DZ
4027            END IF
4028         ELSE
4029! ----------------------------------------------------------------------
4030! TUP .ge. T0, TM .ge. T0, TDN < T0
4031! ----------------------------------------------------------------------
4032            IF (TDN .lt. T0) THEN
4033               XDN = DZH - (T0- TM) * DZH / (TDN - TM)
4034               TAVG = (T0* (DZ - XDN) +0.5* (T0+ TDN)* XDN) / DZ
4035! ----------------------------------------------------------------------
4036! TUP .ge. T0, TM .ge. T0, TDN .ge. T0
4037! ----------------------------------------------------------------------
4038            ELSE
4039               TAVG = (TUP + 2.0* TM + TDN) / 4.0
4040            END IF
4041         END IF
4042      END IF
4043! ----------------------------------------------------------------------
4044  END SUBROUTINE TMPAVG
4045! ----------------------------------------------------------------------
4046
4047      SUBROUTINE TRANSP (ET,NSOIL,ETP1,SMC,CMC,ZSOIL,SHDFAC,SMCWLT,     &
4048     &                      CMCMAX,PC,CFACTR,SMCREF,SFCTMP,Q2,NROOT,    &
4049     &                      RTDIS)
4050
4051! ----------------------------------------------------------------------
4052! SUBROUTINE TRANSP
4053! ----------------------------------------------------------------------
4054! CALCULATE TRANSPIRATION FOR THE VEG CLASS.
4055! ----------------------------------------------------------------------
4056      IMPLICIT NONE
4057      INTEGER  I
4058      INTEGER  K
4059      INTEGER  NSOIL
4060
4061      INTEGER  NROOT
4062      REAL     CFACTR
4063      REAL     CMC
4064      REAL     CMCMAX
4065      REAL     DENOM
4066      REAL     ET (NSOIL)
4067      REAL     ETP1
4068      REAL     ETP1A
4069!.....REAL PART(NSOIL)
4070      REAL     GX (NROOT)
4071      REAL     PC
4072      REAL     Q2
4073      REAL     RTDIS (NSOIL)
4074      REAL     RTX
4075      REAL     SFCTMP
4076      REAL     SGX
4077      REAL     SHDFAC
4078      REAL     SMC (NSOIL)
4079      REAL     SMCREF
4080      REAL     SMCWLT
4081
4082! ----------------------------------------------------------------------
4083! INITIALIZE PLANT TRANSP TO ZERO FOR ALL SOIL LAYERS.
4084! ----------------------------------------------------------------------
4085      REAL     ZSOIL (NSOIL)
4086      DO K = 1,NSOIL
4087         ET (K) = 0.
4088! ----------------------------------------------------------------------
4089! CALCULATE AN 'ADJUSTED' POTENTIAL TRANSPIRATION
4090! IF STATEMENT BELOW TO AVOID TANGENT LINEAR PROBLEMS NEAR ZERO
4091! NOTE: GX AND OTHER TERMS BELOW REDISTRIBUTE TRANSPIRATION BY LAYER,
4092! ET(K), AS A FUNCTION OF SOIL MOISTURE AVAILABILITY, WHILE PRESERVING
4093! TOTAL ETP1A.
4094! ----------------------------------------------------------------------
4095      END DO
4096      IF (CMC .ne. 0.0) THEN
4097         ETP1A = SHDFAC * PC * ETP1 * (1.0- (CMC / CMCMAX) ** CFACTR)
4098      ELSE
4099         ETP1A = SHDFAC * PC * ETP1
4100      END IF
4101      SGX = 0.0
4102      DO I = 1,NROOT
4103         GX (I) = ( SMC (I) - SMCWLT ) / ( SMCREF - SMCWLT )
4104         GX (I) = MAX ( MIN ( GX (I), 1. ), 0. )
4105         SGX = SGX + GX (I)
4106      END DO
4107
4108      SGX = SGX / NROOT
4109      DENOM = 0.
4110      DO I = 1,NROOT
4111         RTX = RTDIS (I) + GX (I) - SGX
4112         GX (I) = GX (I) * MAX ( RTX, 0. )
4113         DENOM = DENOM + GX (I)
4114      END DO
4115
4116      IF (DENOM .le. 0.0) DENOM = 1.
4117      DO I = 1,NROOT
4118         ET (I) = ETP1A * GX (I) / DENOM
4119! ----------------------------------------------------------------------
4120! ABOVE CODE ASSUMES A VERTICALLY UNIFORM ROOT DISTRIBUTION
4121! CODE BELOW TESTS A VARIABLE ROOT DISTRIBUTION
4122! ----------------------------------------------------------------------
4123!      ET(1) = ( ZSOIL(1) / ZSOIL(NROOT) ) * GX * ETP1A
4124!      ET(1) = ( ZSOIL(1) / ZSOIL(NROOT) ) * ETP1A
4125! ----------------------------------------------------------------------
4126! USING ROOT DISTRIBUTION AS WEIGHTING FACTOR
4127! ----------------------------------------------------------------------
4128!      ET(1) = RTDIS(1) * ETP1A
4129!      ET(1) = ETP1A * PART(1)
4130! ----------------------------------------------------------------------
4131! LOOP DOWN THRU THE SOIL LAYERS REPEATING THE OPERATION ABOVE,
4132! BUT USING THE THICKNESS OF THE SOIL LAYER (RATHER THAN THE
4133! ABSOLUTE DEPTH OF EACH LAYER) IN THE FINAL CALCULATION.
4134! ----------------------------------------------------------------------
4135!      DO K = 2,NROOT
4136!        GX = ( SMC(K) - SMCWLT ) / ( SMCREF - SMCWLT )
4137!        GX = MAX ( MIN ( GX, 1. ), 0. )
4138! TEST CANOPY RESISTANCE
4139!        GX = 1.0
4140!        ET(K) = ((ZSOIL(K)-ZSOIL(K-1))/ZSOIL(NROOT))*GX*ETP1A
4141!        ET(K) = ((ZSOIL(K)-ZSOIL(K-1))/ZSOIL(NROOT))*ETP1A
4142! ----------------------------------------------------------------------
4143! USING ROOT DISTRIBUTION AS WEIGHTING FACTOR
4144! ----------------------------------------------------------------------
4145!        ET(K) = RTDIS(K) * ETP1A
4146!        ET(K) = ETP1A*PART(K)
4147!      END DO
4148      END DO
4149! ----------------------------------------------------------------------
4150  END SUBROUTINE TRANSP
4151! ----------------------------------------------------------------------
4152
4153      SUBROUTINE WDFCND (WDF,WCND,SMC,SMCMAX,BEXP,DKSAT,DWSAT,          &
4154     &                      SICEMAX)
4155
4156! ----------------------------------------------------------------------
4157! SUBROUTINE WDFCND
4158! ----------------------------------------------------------------------
4159! CALCULATE SOIL WATER DIFFUSIVITY AND SOIL HYDRAULIC CONDUCTIVITY.
4160! ----------------------------------------------------------------------
4161      IMPLICIT NONE
4162      REAL     BEXP
4163      REAL     DKSAT
4164      REAL     DWSAT
4165      REAL     EXPON
4166      REAL     FACTR1
4167      REAL     FACTR2
4168      REAL     SICEMAX
4169      REAL     SMC
4170      REAL     SMCMAX
4171      REAL     VKwgt
4172      REAL     WCND
4173
4174! ----------------------------------------------------------------------
4175!     CALC THE RATIO OF THE ACTUAL TO THE MAX PSBL SOIL H2O CONTENT
4176! ----------------------------------------------------------------------
4177      REAL     WDF
4178      FACTR1 = 0.05 / SMCMAX
4179
4180! ----------------------------------------------------------------------
4181! PREP AN EXPNTL COEF AND CALC THE SOIL WATER DIFFUSIVITY
4182! ----------------------------------------------------------------------
4183      FACTR2 = SMC / SMCMAX
4184      FACTR1 = MIN(FACTR1,FACTR2)
4185      EXPON = BEXP + 2.0
4186
4187! ----------------------------------------------------------------------
4188! FROZEN SOIL HYDRAULIC DIFFUSIVITY.  VERY SENSITIVE TO THE VERTICAL
4189! GRADIENT OF UNFROZEN WATER. THE LATTER GRADIENT CAN BECOME VERY
4190! EXTREME IN FREEZING/THAWING SITUATIONS, AND GIVEN THE RELATIVELY
4191! FEW AND THICK SOIL LAYERS, THIS GRADIENT SUFFERES SERIOUS
4192! TRUNCTION ERRORS YIELDING ERRONEOUSLY HIGH VERTICAL TRANSPORTS OF
4193! UNFROZEN WATER IN BOTH DIRECTIONS FROM HUGE HYDRAULIC DIFFUSIVITY.
4194! THEREFORE, WE FOUND WE HAD TO ARBITRARILY CONSTRAIN WDF
4195! --
4196! VERSION D_10CM: ........  FACTR1 = 0.2/SMCMAX
4197! WEIGHTED APPROACH...................... PABLO GRUNMANN, 28_SEP_1999.
4198! ----------------------------------------------------------------------
4199      WDF = DWSAT * FACTR2 ** EXPON
4200      IF (SICEMAX .gt. 0.0) THEN
4201         VKWGT = 1./ (1. + (500.* SICEMAX)**3.)
4202         WDF = VKWGT * WDF + (1. - VKWGT)* DWSAT * FACTR1** EXPON
4203! ----------------------------------------------------------------------
4204! RESET THE EXPNTL COEF AND CALC THE HYDRAULIC CONDUCTIVITY
4205! ----------------------------------------------------------------------
4206      END IF
4207      EXPON = (2.0 * BEXP) + 3.0
4208      WCND = DKSAT * FACTR2 ** EXPON
4209
4210! ----------------------------------------------------------------------
4211  END SUBROUTINE WDFCND
4212! ----------------------------------------------------------------------
4213
4214      SUBROUTINE SFCDIF_off (ZLM,Z0,THZ0,THLM,SFCSPD,CZIL,AKMS,AKHS)
4215
4216! ----------------------------------------------------------------------
4217! SUBROUTINE SFCDIF (renamed SFCDIF_off to avoid clash with Eta PBL)
4218! ----------------------------------------------------------------------
4219! CALCULATE SURFACE LAYER EXCHANGE COEFFICIENTS VIA ITERATIVE PROCESS.
4220! SEE CHEN ET AL (1997, BLM)
4221! ----------------------------------------------------------------------
4222
4223      IMPLICIT NONE
4224      REAL     WWST, WWST2, G, VKRM, EXCM, BETA, BTG, ELFC, WOLD, WNEW
4225      REAL     PIHF, EPSU2, EPSUST, EPSIT, EPSA, ZTMIN, ZTMAX, HPBL,     &
4226     & SQVISC
4227      REAL     RIC, RRIC, FHNEU, RFC, RFAC, ZZ, PSLMU, PSLMS, PSLHU,     &
4228     & PSLHS
4229      REAL     XX, PSPMU, YY, PSPMS, PSPHU, PSPHS, ZLM, Z0, THZ0, THLM
4230      REAL     SFCSPD, CZIL, AKMS, AKHS, ZILFC, ZU, ZT, RDZ, CXCH
4231      REAL     DTHV, DU2, BTGH, WSTAR2, USTAR, ZSLU, ZSLT, RLOGU, RLOGT
4232      REAL     RLMO, ZETALT, ZETALU, ZETAU, ZETAT, XLU4, XLT4, XU4, XT4
4233!CC   ......REAL ZTFC
4234
4235      REAL     XLU, XLT, XU, XT, PSMZ, SIMM, PSHZ, SIMH, USTARK, RLMN,  &
4236     &         RLMA
4237
4238      INTEGER  ITRMX, ILECH, ITR
4239      PARAMETER                                                         &
4240     &        (WWST = 1.2,WWST2 = WWST * WWST,G = 9.8,VKRM = 0.40,      &
4241     &         EXCM = 0.001                                             &
4242     &        ,BETA = 1./270.,BTG = BETA * G,ELFC = VKRM * BTG          &
4243     &                  ,WOLD =.15,WNEW = 1. - WOLD,ITRMX = 05,         &
4244     &                   PIHF = 3.14159265/2.)
4245      PARAMETER                                                         &
4246     &         (EPSU2 = 1.E-4,EPSUST = 0.07,EPSIT = 1.E-4,EPSA = 1.E-8  &
4247     &         ,ZTMIN = -5.,ZTMAX = 1.,HPBL = 1000.0                    &
4248     &          ,SQVISC = 258.2)
4249      PARAMETER                                                         &
4250     &       (RIC = 0.183,RRIC = 1.0/ RIC,FHNEU = 0.8,RFC = 0.191       &
4251     &        ,RFAC = RIC / (FHNEU * RFC * RFC))
4252
4253! ----------------------------------------------------------------------
4254! NOTE: THE TWO CODE BLOCKS BELOW DEFINE FUNCTIONS
4255! ----------------------------------------------------------------------
4256! LECH'S SURFACE FUNCTIONS
4257! ----------------------------------------------------------------------
4258      PSLMU (ZZ)= -0.96* log (1.0-4.5* ZZ)
4259      PSLMS (ZZ)= ZZ * RRIC -2.076* (1. -1./ (ZZ +1.))
4260      PSLHU (ZZ)= -0.96* log (1.0-4.5* ZZ)
4261
4262! ----------------------------------------------------------------------
4263! PAULSON'S SURFACE FUNCTIONS
4264! ----------------------------------------------------------------------
4265      PSLHS (ZZ)= ZZ * RFAC -2.076* (1. -1./ (ZZ +1.))
4266      PSPMU (XX)= -2.* log ( (XX +1.)*0.5) - log ( (XX * XX +1.)*0.5)   &
4267     &        +2.* ATAN (XX)                                            &
4268     &- PIHF
4269      PSPMS (YY)= 5.* YY
4270      PSPHU (XX)= -2.* log ( (XX * XX +1.)*0.5)
4271
4272! ----------------------------------------------------------------------
4273! THIS ROUTINE SFCDIF CAN HANDLE BOTH OVER OPEN WATER (SEA, OCEAN) AND
4274! OVER SOLID SURFACE (LAND, SEA-ICE).
4275! ----------------------------------------------------------------------
4276      PSPHS (YY)= 5.* YY
4277
4278! ----------------------------------------------------------------------
4279!     ZTFC: RATIO OF ZOH/ZOM  LESS OR EQUAL THAN 1
4280!     C......ZTFC=0.1
4281!     CZIL: CONSTANT C IN Zilitinkevich, S. S.1995,:NOTE ABOUT ZT
4282! ----------------------------------------------------------------------
4283      ILECH = 0
4284
4285! ----------------------------------------------------------------------
4286      ZILFC = - CZIL * VKRM * SQVISC
4287!     C.......ZT=Z0*ZTFC
4288      ZU = Z0
4289      RDZ = 1./ ZLM
4290      CXCH = EXCM * RDZ
4291      DTHV = THLM - THZ0
4292
4293! ----------------------------------------------------------------------
4294! BELJARS CORRECTION OF USTAR
4295! ----------------------------------------------------------------------
4296      DU2 = MAX (SFCSPD * SFCSPD,EPSU2)
4297!cc   If statements to avoid TANGENT LINEAR problems near zero
4298      BTGH = BTG * HPBL
4299      IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
4300         WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
4301      ELSE
4302         WSTAR2 = 0.0
4303      END IF
4304
4305! ----------------------------------------------------------------------
4306! ZILITINKEVITCH APPROACH FOR ZT
4307! ----------------------------------------------------------------------
4308      USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
4309
4310! ----------------------------------------------------------------------
4311      ZT = EXP (ZILFC * SQRT (USTAR * Z0))* Z0
4312      ZSLU = ZLM + ZU
4313!     PRINT*,'ZSLT=',ZSLT
4314!     PRINT*,'ZLM=',ZLM
4315!     PRINT*,'ZT=',ZT
4316
4317      ZSLT = ZLM + ZT
4318      RLOGU = log (ZSLU / ZU)
4319
4320      RLOGT = log (ZSLT / ZT)
4321!     PRINT*,'RLMO=',RLMO
4322!     PRINT*,'ELFC=',ELFC
4323!     PRINT*,'AKHS=',AKHS
4324!     PRINT*,'DTHV=',DTHV
4325!     PRINT*,'USTAR=',USTAR
4326
4327      RLMO = ELFC * AKHS * DTHV / USTAR **3
4328! ----------------------------------------------------------------------
4329! 1./MONIN-OBUKKHOV LENGTH-SCALE
4330! ----------------------------------------------------------------------
4331      DO ITR = 1,ITRMX
4332         ZETALT = MAX (ZSLT * RLMO,ZTMIN)
4333         RLMO = ZETALT / ZSLT
4334         ZETALU = ZSLU * RLMO
4335         ZETAU = ZU * RLMO
4336
4337         ZETAT = ZT * RLMO
4338         IF (ILECH .eq. 0) THEN
4339            IF (RLMO .lt. 0.)THEN
4340               XLU4 = 1. -16.* ZETALU
4341               XLT4 = 1. -16.* ZETALT
4342               XU4 = 1. -16.* ZETAU
4343
4344               XT4 = 1. -16.* ZETAT
4345               XLU = SQRT (SQRT (XLU4))
4346               XLT = SQRT (SQRT (XLT4))
4347               XU = SQRT (SQRT (XU4))
4348
4349               XT = SQRT (SQRT (XT4))
4350!     PRINT*,'-----------1------------'
4351!     PRINT*,'PSMZ=',PSMZ
4352!     PRINT*,'PSPMU(ZETAU)=',PSPMU(ZETAU)
4353!     PRINT*,'XU=',XU
4354!     PRINT*,'------------------------'
4355               PSMZ = PSPMU (XU)
4356               SIMM = PSPMU (XLU) - PSMZ + RLOGU
4357               PSHZ = PSPHU (XT)
4358               SIMH = PSPHU (XLT) - PSHZ + RLOGT
4359            ELSE
4360               ZETALU = MIN (ZETALU,ZTMAX)
4361               ZETALT = MIN (ZETALT,ZTMAX)
4362!     PRINT*,'-----------2------------'
4363!     PRINT*,'PSMZ=',PSMZ
4364!     PRINT*,'PSPMS(ZETAU)=',PSPMS(ZETAU)
4365!     PRINT*,'ZETAU=',ZETAU
4366!     PRINT*,'------------------------'
4367               PSMZ = PSPMS (ZETAU)
4368               SIMM = PSPMS (ZETALU) - PSMZ + RLOGU
4369               PSHZ = PSPHS (ZETAT)
4370               SIMH = PSPHS (ZETALT) - PSHZ + RLOGT
4371            END IF
4372! ----------------------------------------------------------------------
4373! LECH'S FUNCTIONS
4374! ----------------------------------------------------------------------
4375         ELSE
4376            IF (RLMO .lt. 0.)THEN
4377!     PRINT*,'-----------3------------'
4378!     PRINT*,'PSMZ=',PSMZ
4379!     PRINT*,'PSLMU(ZETAU)=',PSLMU(ZETAU)
4380!     PRINT*,'ZETAU=',ZETAU
4381!     PRINT*,'------------------------'
4382               PSMZ = PSLMU (ZETAU)
4383               SIMM = PSLMU (ZETALU) - PSMZ + RLOGU
4384               PSHZ = PSLHU (ZETAT)
4385               SIMH = PSLHU (ZETALT) - PSHZ + RLOGT
4386            ELSE
4387               ZETALU = MIN (ZETALU,ZTMAX)
4388
4389               ZETALT = MIN (ZETALT,ZTMAX)
4390!     PRINT*,'-----------4------------'
4391!     PRINT*,'PSMZ=',PSMZ
4392!     PRINT*,'PSLMS(ZETAU)=',PSLMS(ZETAU)
4393!     PRINT*,'ZETAU=',ZETAU
4394!     PRINT*,'------------------------'
4395               PSMZ = PSLMS (ZETAU)
4396               SIMM = PSLMS (ZETALU) - PSMZ + RLOGU
4397               PSHZ = PSLHS (ZETAT)
4398               SIMH = PSLHS (ZETALT) - PSHZ + RLOGT
4399            END IF
4400! ----------------------------------------------------------------------
4401! BELJAARS CORRECTION FOR USTAR
4402! ----------------------------------------------------------------------
4403         END IF
4404
4405! ----------------------------------------------------------------------
4406! ZILITINKEVITCH FIX FOR ZT
4407! ----------------------------------------------------------------------
4408         USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
4409
4410         ZT = EXP (ZILFC * SQRT (USTAR * Z0))* Z0
4411         ZSLT = ZLM + ZT
4412!-----------------------------------------------------------------------
4413         RLOGT = log (ZSLT / ZT)
4414         USTARK = USTAR * VKRM
4415         AKMS = MAX (USTARK / SIMM,CXCH)
4416!-----------------------------------------------------------------------
4417! IF STATEMENTS TO AVOID TANGENT LINEAR PROBLEMS NEAR ZERO
4418!-----------------------------------------------------------------------
4419         AKHS = MAX (USTARK / SIMH,CXCH)
4420         IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
4421            WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
4422         ELSE
4423            WSTAR2 = 0.0
4424         END IF
4425!-----------------------------------------------------------------------
4426         RLMN = ELFC * AKHS * DTHV / USTAR **3
4427!-----------------------------------------------------------------------
4428!     IF(ABS((RLMN-RLMO)/RLMA).LT.EPSIT)    GO TO 110
4429!-----------------------------------------------------------------------
4430         RLMA = RLMO * WOLD+ RLMN * WNEW
4431!-----------------------------------------------------------------------
4432         RLMO = RLMA
4433!     PRINT*,'----------------------------'
4434!     PRINT*,'SFCDIF OUTPUT !  ! ! ! ! ! ! ! !  !   !    !'
4435
4436!     PRINT*,'ZLM=',ZLM
4437!     PRINT*,'Z0=',Z0
4438!     PRINT*,'THZ0=',THZ0
4439!     PRINT*,'THLM=',THLM
4440!     PRINT*,'SFCSPD=',SFCSPD
4441!     PRINT*,'CZIL=',CZIL
4442!     PRINT*,'AKMS=',AKMS
4443!     PRINT*,'AKHS=',AKHS
4444!     PRINT*,'----------------------------'
4445
4446      END DO
4447! ----------------------------------------------------------------------
4448  END SUBROUTINE SFCDIF_off
4449! ----------------------------------------------------------------------
4450
4451END MODULE module_sf_noahlsm
Note: See TracBrowser for help on using the repository browser.