MODULE module_sf_noahlsm
  USE module_model_constants, only : CP, R_D, XLF, XLV, RHOWATER, STBOLT, KARMAN
  REAL, PARAMETER :: RD = 287.04, SIGMA = 5.67E-8, &
                          CPH2O = 4.218E+3,CPICE = 2.106E+3, &
                          LSUBF = 3.335E+5, &
                          EMISSI_S = 0.95
        INTEGER :: LUCATS , BARE
        INTEGER :: NATURAL
        integer, PARAMETER :: NLUS=50
        CHARACTER(LEN=256) LUTYPE
        INTEGER, DIMENSION(1:NLUS) :: NROTBL
        real, dimension(1:NLUS) :: SNUPTBL, RSTBL, RGLTBL, HSTBL, &
                                    SHDTBL, MAXALB, &
                                    EMISSMINTBL, EMISSMAXTBL, &
                                    LAIMINTBL, LAIMAXTBL, &
                                    Z0MINTBL, Z0MAXTBL, &
                                    ALBEDOMINTBL, ALBEDOMAXTBL
        REAL :: TOPT_DATA,CMCMAX_DATA,CFACTR_DATA,RSMAX_DATA
        INTEGER :: SLCATS
        INTEGER, PARAMETER :: NSLTYPE=30
        CHARACTER(LEN=256) SLTYPE
        REAL, DIMENSION (1:NSLTYPE) :: BB,DRYSMC,F11, &
        MAXSMC, REFSMC,SATPSI,SATDK,SATDW, WLTSMC,QTZ
        INTEGER :: SLPCATS
        INTEGER, PARAMETER :: NSLOPE=30
        REAL, DIMENSION (1:NSLOPE) :: SLOPE_DATA
        REAL :: SBETA_DATA,FXEXP_DATA,CSOIL_DATA,SALP_DATA,REFDK_DATA, &
                 REFKDT_DATA,FRZK_DATA,ZBOT_DATA, SMLOW_DATA,SMHIGH_DATA, &
                        CZIL_DATA
        REAL :: LVCOEF_DATA
        CHARACTER*256 :: err_message
        integer, private :: iloc, jloc
CONTAINS
      SUBROUTINE SFLX (IILOC,JJLOC,ICE,FFROZP,ISURBAN,DT,ZLVL,NSOIL,SLDPTH, &
                       LOCAL, &
                       LLANDUSE, LSOIL, &
                       LWDN,SOLDN,SOLNET,SFCPRS,PRCP,SFCTMP,Q2,SFCSPD, &
                       COSZ,PRCPRAIN, SOLARDIRECT, &
                       TH2,Q2SAT,DQSDT2, &
                       VEGTYP,SOILTYP,SLOPETYP,SHDFAC,SHDMIN,SHDMAX, &
                       ALB, SNOALB,TBOT, Z0BRD, Z0, EMISSI, EMBRD, &
                       CMC,T1,STC,SMC,SH2O,SNOWH,SNEQV,ALBEDO,CH,CM, &
                       ETA,SHEAT, ETA_KINEMATIC,FDOWN, &
                       EC,EDIR,ET,ETT,ESNOW,DRIP,DEW, &
                       BETA,ETP,SSOIL, &
                       FLX1,FLX2,FLX3, &
                       SNOMLT,SNCOVR, &
                       RUNOFF1,RUNOFF2,RUNOFF3, &
                       RC,PC,RSMIN,XLAI,RCS,RCT,RCQ,RCSOIL, &
                       SOILW,SOILM,Q1,SMAV, &
                       RDLAI2D,USEMONALB, &
                       SNOTIME1, &
                       RIBB, &
                       SMCWLT,SMCDRY,SMCREF,SMCMAX,NROOT)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: IILOC, JJLOC
      LOGICAL, INTENT(IN):: LOCAL
      LOGICAL :: FRZGRA, SNOWNG
      CHARACTER (LEN=256), INTENT(IN):: LLANDUSE, LSOIL
      INTEGER,INTENT(IN) :: ICE,NSOIL,SLOPETYP,SOILTYP,VEGTYP
      INTEGER, INTENT(IN) :: ISURBAN
      INTEGER,INTENT(OUT):: NROOT
      INTEGER KZ, K, iout
      LOGICAL, INTENT(IN) :: RDLAI2D
      LOGICAL, INTENT(IN) :: USEMONALB
      REAL, INTENT(IN) :: SHDMIN,SHDMAX,DT,DQSDT2,LWDN,PRCP,PRCPRAIN, &
                            Q2,Q2SAT,SFCPRS,SFCSPD,SFCTMP, SNOALB, &
                            SOLDN,SOLNET,TBOT,TH2,ZLVL, &
                            FFROZP
      REAL, INTENT(OUT) :: EMBRD
      REAL, INTENT(OUT) :: ALBEDO
      REAL, INTENT(INOUT):: COSZ, SOLARDIRECT,CH,CM, &
                            CMC,SNEQV,SNCOVR,SNOWH,T1,XLAI,SHDFAC,Z0BRD, &
                            EMISSI, ALB
      REAL, INTENT(INOUT):: SNOTIME1
      REAL, INTENT(INOUT):: RIBB
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SLDPTH
      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: ET
      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: SMAV
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O, SMC, STC
      REAL,DIMENSION(1:NSOIL):: RTDIS, ZSOIL
      REAL,INTENT(OUT) :: ETA_KINEMATIC,BETA,DEW,DRIP,EC,EDIR,ESNOW,ETA, &
                            ETP,FLX1,FLX2,FLX3,SHEAT,PC,RUNOFF1,RUNOFF2, &
                            RUNOFF3,RC,RSMIN,RCQ,RCS,RCSOIL,RCT,SSOIL, &
                            SMCDRY,SMCMAX,SMCREF,SMCWLT,SNOMLT, SOILM, &
                            SOILW,FDOWN,Q1
      REAL :: BEXP,CFACTR,CMCMAX,CSOIL,CZIL,DF1,DF1H,DF1A,DKSAT,DWSAT, &
              DSOIL,DTOT,ETT,FRCSNO,FRCSOI,EPSCA,F1,FXEXP,FRZX,HS, &
              KDT,LVH2O,PRCP1,PSISAT,QUARTZ,R,RCH,REFKDT,RR,RGL, &
              RSMAX, &
              RSNOW,SNDENS,SNCOND,SBETA,SN_NEW,SLOPE,SNUP,SALP,SOILWM, &
              SOILWW,T1V,T24,T2V,TH2V,TOPT,TFREEZ,TSNOW,ZBOT,Z0,PRCPF, &
              ETNS,PTU,LSUBS
        REAL :: LVCOEF
      REAL :: INTERP_FRACTION
      REAL :: LAIMIN, LAIMAX
      REAL :: ALBEDOMIN, ALBEDOMAX
      REAL :: EMISSMIN, EMISSMAX
      REAL :: Z0MIN, Z0MAX
      PARAMETER (TFREEZ = 273.15)
      PARAMETER (LVH2O = 2.501E+6)
      PARAMETER (LSUBS = 2.83E+6)
      PARAMETER (R = 287.04)
      ILOC = IILOC
      JLOC = JJLOC
      RUNOFF1 = 0.0
      RUNOFF2 = 0.0
      RUNOFF3 = 0.0
      SNOMLT = 0.0
      IF (ICE == 1) call wrf_error_fatal3("<stdin>",363,&
"Sea-ice point in Noah-LSM")
      IF (ICE == -1) SHDFAC = 0.0
      ZSOIL (1) = - SLDPTH (1)
      DO KZ = 2,NSOIL
         ZSOIL (KZ) = - SLDPTH (KZ) + ZSOIL (KZ -1)
      END DO
         CALL REDPRM (VEGTYP,SOILTYP,SLOPETYP,CFACTR,CMCMAX,RSMAX,TOPT, &
                       REFKDT,KDT,SBETA, SHDFAC,RSMIN,RGL,HS,ZBOT,FRZX, &
                         PSISAT,SLOPE,SNUP,SALP,BEXP,DKSAT,DWSAT, &
                         SMCMAX,SMCWLT,SMCREF,SMCDRY,F1,QUARTZ,FXEXP, &
                         RTDIS,SLDPTH,ZSOIL,NROOT,NSOIL,CZIL, &
                         LAIMIN, LAIMAX, EMISSMIN, EMISSMAX, ALBEDOMIN, &
                         ALBEDOMAX, Z0MIN, Z0MAX, CSOIL, PTU, LLANDUSE, &
                         LSOIL,LOCAL,LVCOEF)
         IF(VEGTYP==ISURBAN)THEN
              SHDFAC=0.05
              RSMIN=400.0
              SMCMAX = 0.45
              SMCREF = 0.42
              SMCWLT = 0.40
              SMCDRY = 0.40
         ENDIF
         IF ( SHDFAC >= SHDMAX ) THEN
            EMBRD = EMISSMAX
            IF (.NOT. RDLAI2D) THEN
               XLAI = LAIMAX
            ENDIF
            IF (.NOT. USEMONALB) THEN
               ALB = ALBEDOMIN
            ENDIF
            Z0BRD = Z0MAX
         ELSE IF ( SHDFAC <= SHDMIN ) THEN
            EMBRD = EMISSMIN
            IF(.NOT. RDLAI2D) THEN
               XLAI = LAIMIN
            ENDIF
            IF(.NOT. USEMONALB) then
               ALB = ALBEDOMAX
            ENDIF
            Z0BRD = Z0MIN
         ELSE
            IF ( SHDMAX > SHDMIN ) THEN
               INTERP_FRACTION = ( SHDFAC - SHDMIN ) / ( SHDMAX - SHDMIN )
               INTERP_FRACTION = MIN ( INTERP_FRACTION, 1.0 )
               INTERP_FRACTION = MAX ( INTERP_FRACTION, 0.0 )
               EMBRD = ( ( 1.0 - INTERP_FRACTION ) * EMISSMIN ) + ( INTERP_FRACTION * EMISSMAX )
               IF (.NOT. RDLAI2D) THEN
                  XLAI = ( ( 1.0 - INTERP_FRACTION ) * LAIMIN ) + ( INTERP_FRACTION * LAIMAX )
               ENDIF
               if (.not. USEMONALB) then
                  ALB = ( ( 1.0 - INTERP_FRACTION ) * ALBEDOMAX ) + ( INTERP_FRACTION * ALBEDOMIN )
               endif
               Z0BRD = ( ( 1.0 - INTERP_FRACTION ) * Z0MIN ) + ( INTERP_FRACTION * Z0MAX )
            ELSE
               EMBRD = 0.5 * EMISSMIN + 0.5 * EMISSMAX
               IF (.NOT. RDLAI2D) THEN
                  XLAI = 0.5 * LAIMIN + 0.5 * LAIMAX
               ENDIF
               if (.not. USEMONALB) then
                  ALB = 0.5 * ALBEDOMIN + 0.5 * ALBEDOMAX
               endif
               Z0BRD = 0.5 * Z0MIN + 0.5 * Z0MAX
            ENDIF
         ENDIF
         SNOWNG = .FALSE.
         FRZGRA = .FALSE.
         IF ( ICE == -1 ) THEN
            IF ( SNEQV < 0.10 ) THEN
               SNEQV = 0.10
               SNOWH = 0.50
            ENDIF
            DO KZ = 1,NSOIL
               SMC(KZ) = 1.0
               SH2O(KZ) = 1.0
            END DO
         ENDIF
         IF ( SNEQV <= 1.E-7 ) THEN
            SNEQV = 0.0
            SNDENS = 0.0
            SNOWH = 0.0
            SNCOND = 1.0
         ELSE
            SNDENS = SNEQV / SNOWH
            IF(SNDENS > 1.0) THEN
             CALL wrf_error_fatal3("<stdin>",487,&
'Physical snow depth is less than snow water equiv.' )
            ENDIF
            CALL CSNOW (SNCOND,SNDENS)
         END IF
         IF (PRCP > 0.0) THEN
            IF (FFROZP .GT. 0.5) THEN
               SNOWNG = .TRUE.
            ELSE
               IF (T1 <= TFREEZ) FRZGRA = .TRUE.
            END IF
         END IF
         IF ( (SNOWNG) .OR. (FRZGRA) ) THEN
            SN_NEW = PRCP * DT * 0.001
            SNEQV = SNEQV + SN_NEW
            PRCPF = 0.0
            CALL SNOW_NEW (SFCTMP,SN_NEW,SNOWH,SNDENS)
           IF ( (ICE == -1) .and. (SNCOVR .GT. 0.99) ) THEN
              IF ( STC(1) .LT. (TFREEZ - 5.) ) SNDENS = 0.2
              IF ( SNOWNG .AND. (T1.LT.273.) .AND. (SFCTMP.LT.273.) ) SNDENS=0.2
           ENDIF
            CALL CSNOW (SNCOND,SNDENS)
         ELSE
            PRCPF = PRCP
         ENDIF
         IF (SNEQV == 0.0) THEN
            SNCOVR = 0.0
            ALBEDO = ALB
            EMISSI = EMBRD
         ELSE
            CALL SNFRAC (SNEQV,SNUP,SALP,SNOWH,SNCOVR)
            IF ( ICE == 0 ) SNCOVR = MIN(SNCOVR,0.98)
            CALL ALCALC (ALB,SNOALB,EMBRD,SHDFAC,SHDMIN,SNCOVR,T1, &
                 ALBEDO,EMISSI,DT,SNOWNG,SNOTIME1,LVCOEF)
         ENDIF
         IF ( ICE == -1 ) THEN
            DF1 = 2.2
            IF ( SNCOVR .GT. 0.97 ) THEN
               DF1 = SNCOND
            ENDIF
         ELSEIF ( ICE == 0 ) THEN
            CALL TDFCND (DF1,SMC (1),QUARTZ,SMCMAX,SH2O (1))
            IF ( VEGTYP == ISURBAN ) DF1=3.24
            DF1 = DF1 * EXP (SBETA * SHDFAC)
            IF ( SNCOVR .GT. 0.97 ) THEN
               DF1 = SNCOND
            ENDIF
         END IF
         DSOIL = - (0.5 * ZSOIL (1))
         IF (SNEQV == 0.) THEN
            SSOIL = DF1 * (T1- STC (1) ) / DSOIL
         ELSE
            DTOT = SNOWH + DSOIL
            FRCSNO = SNOWH / DTOT
            FRCSOI = DSOIL / DTOT
            DF1H = (SNCOND * DF1)/ (FRCSOI * SNCOND+ FRCSNO * DF1)
            DF1A = FRCSNO * SNCOND+ FRCSOI * DF1
            DF1 = DF1A * SNCOVR + DF1* (1.0- SNCOVR)
            IF ( ICE == -1 ) then
               IF ( DTOT .GT. 2.*DSOIL ) then
                  DTOT = 2.*DSOIL
               ENDIF
            ENDIF
            SSOIL = DF1 * (T1- STC (1) ) / DTOT
         END IF
         IF (SNCOVR > 0. ) THEN
            CALL SNOWZ0 (SNCOVR,Z0,Z0BRD,SNOWH)
         ELSE
            Z0=Z0BRD
         END IF
         FDOWN = SOLNET + LWDN
         T2V = SFCTMP * (1.0+ 0.61 * Q2 )
         iout=0
         if(iout.eq.1) then
         print*,'before penman'
         print*,' SFCTMP',SFCTMP,'SFCPRS',SFCPRS,'CH',CH,'T2V',T2V, &
       'TH2',TH2,'PRCP',PRCP,'FDOWN',FDOWN,'T24',T24,'SSOIL',SSOIL, &
        'Q2',Q2,'Q2SAT',Q2SAT,'ETP',ETP,'RCH',RCH, &
        'EPSCA',EPSCA,'RR',RR ,'SNOWNG',SNOWNG,'FRZGRA',FRZGRA, &
        'DQSDT2',DQSDT2,'FLX2',FLX2,'SNOWH',SNOWH,'SNEQV',SNEQV, &
        ' DSOIL',DSOIL,' FRCSNO',FRCSNO,' SNCOVR',SNCOVR,' DTOT',DTOT, &
       ' ZSOIL (1)',ZSOIL(1),' DF1',DF1,'T1',T1,' STC1',STC(1), &
        'ALBEDO',ALBEDO,'SMC',SMC,'STC',STC,'SH2O',SH2O
         endif
         CALL PENMAN (SFCTMP,SFCPRS,CH,T2V,TH2,PRCP,FDOWN,T24,SSOIL, &
                       Q2,Q2SAT,ETP,RCH,EPSCA,RR,SNOWNG,FRZGRA, &
                         DQSDT2,FLX2,EMISSI,SNEQV,T1,ICE,SNCOVR)
         IF (SHDFAC > 0.) THEN
            CALL CANRES (SOLDN,CH,SFCTMP,Q2,SFCPRS,SH2O,ZSOIL,NSOIL, &
                          SMCWLT,SMCREF,RSMIN,RC,PC,NROOT,Q2SAT,DQSDT2, &
                          TOPT,RSMAX,RGL,HS,XLAI, &
                          RCS,RCT,RCQ,RCSOIL,EMISSI)
         ELSE
            RC = 0.0
         END IF
         ESNOW = 0.0
         IF (SNEQV == 0.0) THEN
            CALL NOPAC (ETP,ETA,PRCP,SMC,SMCMAX,SMCWLT, &
                            SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT, &
                            SHDFAC, &
                            SBETA,Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,EMISSI, &
                            SSOIL, &
                            STC,EPSCA,BEXP,PC,RCH,RR,CFACTR, &
                            SH2O,SLOPE,KDT,FRZX,PSISAT,ZSOIL, &
                            DKSAT,DWSAT,TBOT,ZBOT,RUNOFF1,RUNOFF2, &
                            RUNOFF3,EDIR,EC,ET,ETT,NROOT,ICE,RTDIS, &
                            QUARTZ,FXEXP,CSOIL, &
                            BETA,DRIP,DEW,FLX1,FLX3,VEGTYP,ISURBAN)
            ETA_KINEMATIC = ETA
         ELSE
            CALL SNOPAC (ETP,ETA,PRCP,PRCPF,SNOWNG,SMC,SMCMAX,SMCWLT, &
                         SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT, &
                         SBETA,DF1, &
                         Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,SSOIL,STC,EPSCA, &
                         SFCPRS,BEXP,PC,RCH,RR,CFACTR,SNCOVR,SNEQV,SNDENS,&
                         SNOWH,SH2O,SLOPE,KDT,FRZX,PSISAT, &
                         ZSOIL,DWSAT,DKSAT,TBOT,ZBOT,SHDFAC,RUNOFF1, &
                         RUNOFF2,RUNOFF3,EDIR,EC,ET,ETT,NROOT,SNOMLT, &
                         ICE,RTDIS,QUARTZ,FXEXP,CSOIL, &
                         BETA,DRIP,DEW,FLX1,FLX2,FLX3,ESNOW,ETNS,EMISSI, &
                         RIBB,SOLDN, &
                         ISURBAN, &
                         VEGTYP)
            ETA_KINEMATIC = ESNOW + ETNS
         END IF
     Q1=Q2+ETA_KINEMATIC*CP/RCH
         SHEAT = - (CH * CP * SFCPRS)/ (R * T2V) * ( TH2- T1 )
      EDIR = EDIR * LVH2O
      EC = EC * LVH2O
      DO K=1,4
      ET(K) = ET(K) * LVH2O
      ENDDO
      ETT = ETT * LVH2O
      ESNOW = ESNOW * LSUBS
      ETP = ETP*((1.-SNCOVR)*LVH2O + SNCOVR*LSUBS)
      IF (ETP .GT. 0.) THEN
         ETA = EDIR + EC + ETT + ESNOW
      ELSE
        ETA = ETP
      ENDIF
      IF (ETP == 0.0) THEN
        BETA = 0.0
      ELSE
        BETA = ETA/ETP
      ENDIF
         SSOIL = -1.0* SSOIL
         IF (ICE == 0) THEN
            RUNOFF3 = RUNOFF3/ DT
            RUNOFF2 = RUNOFF2+ RUNOFF3
            SOILM = -1.0* SMC (1)* ZSOIL (1)
            DO K = 2,NSOIL
              SOILM = SOILM + SMC (K)* (ZSOIL (K -1) - ZSOIL (K))
            END DO
            SOILWM = -1.0* (SMCMAX - SMCWLT)* ZSOIL (1)
            SOILWW = -1.0* (SMC (1) - SMCWLT)* ZSOIL (1)
            DO K = 1,NSOIL
               SMAV(K)=(SMC(K) - SMCWLT)/(SMCMAX - SMCWLT)
            END DO
            IF (NROOT >= 2) THEN
              DO K = 2,NROOT
               SOILWM = SOILWM + (SMCMAX - SMCWLT)* (ZSOIL (K -1) - ZSOIL (K))
               SOILWW = SOILWW + (SMC(K) - SMCWLT)* (ZSOIL (K -1) - ZSOIL (K))
              END DO
            END IF
            IF (SOILWM .LT. 1.E-6) THEN
              SOILWM = 0.0
              SOILW = 0.0
              SOILM = 0.0
            ELSE
              SOILW = SOILWW / SOILWM
            END IF
         ELSEIF ( ICE == -1 ) THEN
            RUNOFF1 = SNOMLT/DT
           SOILWM = 0.0
           SOILW = 0.0
           SOILM = 0.0
           DO K = 1,NSOIL
             SMAV(K)= 1.0
           END DO
         END IF
  END SUBROUTINE SFLX
      SUBROUTINE ALCALC (ALB,SNOALB,EMBRD,SHDFAC,SHDMIN,SNCOVR,TSNOW,ALBEDO,EMISSI, &
                         DT,SNOWNG,SNOTIME1,LVCOEF)
      IMPLICIT NONE
      REAL, INTENT(IN) :: ALB, SNOALB, EMBRD, SHDFAC, SHDMIN, SNCOVR, TSNOW
      REAL, INTENT(IN) :: DT
      LOGICAL, INTENT(IN) :: SNOWNG
      REAL, INTENT(INOUT):: SNOTIME1
      REAL, INTENT(OUT) :: ALBEDO, EMISSI
      REAL :: SNOALB2
      REAL :: TM,SNOALB1
      REAL, INTENT(IN) :: LVCOEF
      REAL, PARAMETER :: SNACCA=0.94,SNACCB=0.58,SNTHWA=0.82,SNTHWB=0.46
      ALBEDO = ALB + SNCOVR*(SNOALB-ALB)
      EMISSI = EMBRD + SNCOVR*(EMISSI_S - EMBRD)
         SNOALB1 = SNOALB+LVCOEF*(0.85-SNOALB)
         SNOALB2=SNOALB1
          IF (SNOWNG) THEN
             SNOTIME1 = 0.
          ELSE
           SNOTIME1=SNOTIME1+DT
                   SNOALB2=SNOALB1*(SNACCA**((SNOTIME1/86400.0)**SNACCB))
          ENDIF
           SNOALB2 = MAX ( SNOALB2, ALB )
           ALBEDO = ALB + SNCOVR*(SNOALB2-ALB)
           IF (ALBEDO .GT. SNOALB2) ALBEDO=SNOALB2
  END SUBROUTINE ALCALC
      SUBROUTINE CANRES (SOLAR,CH,SFCTMP,Q2,SFCPRS,SMC,ZSOIL,NSOIL, &
                         SMCWLT,SMCREF,RSMIN,RC,PC,NROOT,Q2SAT,DQSDT2, &
                         TOPT,RSMAX,RGL,HS,XLAI, &
                         RCS,RCT,RCQ,RCSOIL,EMISSI)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NROOT,NSOIL
      INTEGER K
      REAL, INTENT(IN) :: CH,DQSDT2,HS,Q2,Q2SAT,RSMIN,RGL,RSMAX, &
                             SFCPRS,SFCTMP,SMCREF,SMCWLT, SOLAR,TOPT,XLAI, &
                             EMISSI
      REAL,DIMENSION(1:NSOIL), INTENT(IN) :: SMC,ZSOIL
      REAL, INTENT(OUT):: PC,RC,RCQ,RCS,RCSOIL,RCT
      REAL :: DELTA,FF,GX,P,RR
      REAL, DIMENSION(1:NSOIL) :: PART
      REAL, PARAMETER :: SLV = 2.501000E6
      RCS = 0.0
      RCT = 0.0
      RCQ = 0.0
      RCSOIL = 0.0
      RC = 0.0
      FF = 0.55*2.0* SOLAR / (RGL * XLAI)
      RCS = (FF + RSMIN / RSMAX) / (1.0+ FF)
      RCS = MAX (RCS,0.0001)
      RCT = 1.0- 0.0016* ( (TOPT - SFCTMP)**2.0)
      RCT = MAX (RCT,0.0001)
      RCQ = 1.0/ (1.0+ HS * (Q2SAT - Q2))
      RCQ = MAX (RCQ,0.01)
      GX = (SMC (1) - SMCWLT) / (SMCREF - SMCWLT)
      IF (GX > 1.) GX = 1.
      IF (GX < 0.) GX = 0.
      PART (1) = (ZSOIL (1)/ ZSOIL (NROOT)) * GX
      DO K = 2,NROOT
         GX = (SMC (K) - SMCWLT) / (SMCREF - SMCWLT)
         IF (GX > 1.) GX = 1.
         IF (GX < 0.) GX = 0.
         PART (K) = ( (ZSOIL (K) - ZSOIL (K -1))/ ZSOIL (NROOT)) * GX
      END DO
      DO K = 1,NROOT
         RCSOIL = RCSOIL + PART (K)
      END DO
      RCSOIL = MAX (RCSOIL,0.0001)
      RC = RSMIN / (XLAI * RCS * RCT * RCQ * RCSOIL)
      RR = (4.* EMISSI *SIGMA * RD / CP)* (SFCTMP **4.)/ (SFCPRS * CH) &
             + 1.0
      DELTA = (SLV / CP)* DQSDT2
      PC = (RR + DELTA)/ (RR * (1. + RC * CH) + DELTA)
  END SUBROUTINE CANRES
      SUBROUTINE CSNOW (SNCOND,DSNOW)
      IMPLICIT NONE
      REAL, INTENT(IN) :: DSNOW
      REAL, INTENT(OUT):: SNCOND
      REAL :: C
      REAL, PARAMETER :: UNIT = 0.11631
      C = 0.328*10** (2.25* DSNOW)
      SNCOND = 2.0 * UNIT * C
  END SUBROUTINE CSNOW
      SUBROUTINE DEVAP (EDIR,ETP1,SMC,ZSOIL,SHDFAC,SMCMAX,BEXP, &
                        DKSAT,DWSAT,SMCDRY,SMCREF,SMCWLT,FXEXP)
      IMPLICIT NONE
      REAL, INTENT(IN) :: ETP1,SMC,BEXP,DKSAT,DWSAT,FXEXP, &
                          SHDFAC,SMCDRY,SMCMAX,ZSOIL,SMCREF,SMCWLT
      REAL, INTENT(OUT):: EDIR
      REAL :: FX, SRATIO
      SRATIO = (SMC - SMCDRY) / (SMCMAX - SMCDRY)
      IF (SRATIO > 0.) THEN
        FX = SRATIO**FXEXP
        FX = MAX ( MIN ( FX, 1. ) ,0. )
      ELSE
        FX = 0.
      ENDIF
      EDIR = FX * ( 1.0- SHDFAC ) * ETP1
  END SUBROUTINE DEVAP
      SUBROUTINE EVAPO (ETA1,SMC,NSOIL,CMC,ETP1,DT,ZSOIL, &
                         SH2O, &
                         SMCMAX,BEXP,PC,SMCWLT,DKSAT,DWSAT, &
                         SMCREF,SHDFAC,CMCMAX, &
                         SMCDRY,CFACTR, &
                         EDIR,EC,ET,ETT,SFCTMP,Q2,NROOT,RTDIS,FXEXP)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL, NROOT
      INTEGER :: I,K
      REAL, INTENT(IN) :: BEXP, CFACTR,CMC,CMCMAX,DKSAT, &
                                 DT,DWSAT,ETP1,FXEXP,PC,Q2,SFCTMP, &
                                 SHDFAC,SMCDRY,SMCMAX,SMCREF,SMCWLT
      REAL, INTENT(OUT) :: EC,EDIR,ETA1,ETT
      REAL :: CMC2MS
      REAL,DIMENSION(1:NSOIL), INTENT(IN) :: RTDIS, SMC, SH2O, ZSOIL
      REAL,DIMENSION(1:NSOIL), INTENT(OUT) :: ET
      EDIR = 0.
      EC = 0.
      ETT = 0.
      DO K = 1,NSOIL
         ET (K) = 0.
      END DO
      IF (ETP1 > 0.0) THEN
         IF (SHDFAC < 1.) THEN
             CALL DEVAP (EDIR,ETP1,SMC (1),ZSOIL (1),SHDFAC,SMCMAX, &
                         BEXP,DKSAT,DWSAT,SMCDRY,SMCREF,SMCWLT,FXEXP)
         END IF
         IF (SHDFAC > 0.0) THEN
            CALL TRANSP (ET,NSOIL,ETP1,SH2O,CMC,ZSOIL,SHDFAC,SMCWLT, &
                          CMCMAX,PC,CFACTR,SMCREF,SFCTMP,Q2,NROOT,RTDIS)
            DO K = 1,NSOIL
               ETT = ETT + ET ( K )
            END DO
            IF (CMC > 0.0) THEN
               EC = SHDFAC * ( ( CMC / CMCMAX ) ** CFACTR ) * ETP1
            ELSE
               EC = 0.0
            END IF
            CMC2MS = CMC / DT
            EC = MIN ( CMC2MS, EC )
         END IF
      END IF
      ETA1 = EDIR + ETT + EC
  END SUBROUTINE EVAPO
  SUBROUTINE FAC2MIT(SMCMAX,FLIMIT)
    IMPLICIT NONE
    REAL, INTENT(IN) :: SMCMAX
    REAL, INTENT(OUT) :: FLIMIT
    FLIMIT = 0.90
    IF ( SMCMAX == 0.395 ) THEN
       FLIMIT = 0.59
    ELSE IF ( ( SMCMAX == 0.434 ) .OR. ( SMCMAX == 0.404 ) ) THEN
       FLIMIT = 0.85
    ELSE IF ( ( SMCMAX == 0.465 ) .OR. ( SMCMAX == 0.406 ) ) THEN
       FLIMIT = 0.86
    ELSE IF ( ( SMCMAX == 0.476 ) .OR. ( SMCMAX == 0.439 ) ) THEN
       FLIMIT = 0.74
    ELSE IF ( ( SMCMAX == 0.200 ) .OR. ( SMCMAX == 0.464 ) ) THEN
       FLIMIT = 0.80
    ENDIF
  END SUBROUTINE FAC2MIT
      SUBROUTINE FRH2O (FREE,TKELV,SMC,SH2O,SMCMAX,BEXP,PSIS)
      IMPLICIT NONE
      REAL, INTENT(IN) :: BEXP,PSIS,SH2O,SMC,SMCMAX,TKELV
      REAL, INTENT(OUT) :: FREE
      REAL :: BX,DENOM,DF,DSWL,FK,SWL,SWLK
      INTEGER :: NLOG,KCOUNT
      REAL, PARAMETER :: CK = 8.0, BLIM = 5.5, ERROR = 0.005, &
                              HLICE = 3.335E5, GS = 9.81,DICE = 920.0, &
                              DH2O = 1000.0, T0 = 273.15
      BX = BEXP
      IF (BEXP > BLIM) BX = BLIM
      NLOG = 0
      KCOUNT = 0
      IF (TKELV > (T0- 1.E-3)) THEN
          FREE = SMC
      ELSE
         IF (CK /= 0.0) THEN
            SWL = SMC - SH2O
            IF (SWL > (SMC -0.02)) SWL = SMC -0.02
            IF (SWL < 0.) SWL = 0.
 1001 Continue
              IF (.NOT.( (NLOG < 10) .AND. (KCOUNT == 0))) goto 1002
              NLOG = NLOG +1
              DF = ALOG ( ( PSIS * GS / HLICE ) * ( ( 1. + CK * SWL )**2.) * &
                   ( SMCMAX / (SMC - SWL) )** BX) - ALOG ( - ( &
                   TKELV - T0)/ TKELV)
              DENOM = 2. * CK / ( 1. + CK * SWL ) + BX / ( SMC - SWL )
              SWLK = SWL - DF / DENOM
              IF (SWLK > (SMC -0.02)) SWLK = SMC - 0.02
              IF (SWLK < 0.) SWLK = 0.
              DSWL = ABS (SWLK - SWL)
              SWL = SWLK
              IF ( DSWL <= ERROR ) THEN
                    KCOUNT = KCOUNT +1
              END IF
           goto 1001
 1002 continue
           FREE = SMC - SWL
         END IF
         IF (KCOUNT == 0) THEN
             PRINT *,'Flerchinger USEd in NEW version. Iterations=',NLOG
                  FK = ( ( (HLICE / (GS * ( - PSIS)))* &
                       ( (TKELV - T0)/ TKELV))** ( -1/ BX))* SMCMAX
             IF (FK < 0.02) FK = 0.02
             FREE = MIN (FK, SMC)
         END IF
      END IF
  END SUBROUTINE FRH2O
      SUBROUTINE HRT (RHSTS,STC,SMC,SMCMAX,NSOIL,ZSOIL,YY,ZZ1, &
                       TBOT,ZBOT,PSISAT,SH2O,DT,BEXP, &
                       F1,DF1,QUARTZ,CSOIL,AI,BI,CI,VEGTYP,ISURBAN)
      IMPLICIT NONE
      LOGICAL :: ITAVG
      INTEGER, INTENT(IN) :: NSOIL, VEGTYP
      INTEGER, INTENT(IN) :: ISURBAN
      INTEGER :: I, K
      REAL, INTENT(IN) :: BEXP, CSOIL, DF1, DT,F1,PSISAT,QUARTZ, &
                              SMCMAX ,TBOT,YY,ZZ1, ZBOT
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC,STC,ZSOIL
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: SH2O
      REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: RHSTS
      REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: AI, BI,CI
      REAL :: DDZ, DDZ2, DENOM, DF1N, DF1K, DTSDZ, &
                              DTSDZ2,HCPCT,QTOT,SSOIL,SICE,TAVG,TBK, &
                              TBK1,TSNSR,TSURF,CSOIL_LOC
      REAL, PARAMETER :: T0 = 273.15, CAIR = 1004.0, CICE = 2.106E6,&
                              CH2O = 4.2E6
        IF( VEGTYP == ISURBAN ) then
            CSOIL_LOC=3.0E6
        ELSE
            CSOIL_LOC=CSOIL
        ENDIF
       ITAVG = .TRUE.
      HCPCT = SH2O (1)* CH2O + (1.0- SMCMAX)* CSOIL_LOC + (SMCMAX - SMC (1))&
       * CAIR &
              + ( SMC (1) - SH2O (1) )* CICE
      DDZ = 1.0 / ( -0.5 * ZSOIL (2) )
      AI (1) = 0.0
      CI (1) = (DF1 * DDZ) / (ZSOIL (1) * HCPCT)
      BI (1) = - CI (1) + DF1 / (0.5 * ZSOIL (1) * ZSOIL (1)* HCPCT * &
       ZZ1)
      DTSDZ = (STC (1) - STC (2)) / ( -0.5 * ZSOIL (2))
      SSOIL = DF1 * (STC (1) - YY) / (0.5 * ZSOIL (1) * ZZ1)
      DENOM = (ZSOIL (1) * HCPCT)
      RHSTS (1) = (DF1 * DTSDZ - SSOIL) / DENOM
      QTOT = -1.0* RHSTS (1)* DENOM
      SICE = SMC (1) - SH2O (1)
      IF (ITAVG) THEN
         TSURF = (YY + (ZZ1-1) * STC (1)) / ZZ1
         CALL TBND (STC (1),STC (2),ZSOIL,ZBOT,1,NSOIL,TBK)
         IF ( (SICE > 0.) .OR. (STC (1) < T0) .OR. &
            (TSURF < T0) .OR. (TBK < T0) ) THEN
            CALL TMPAVG (TAVG,TSURF,STC (1),TBK,ZSOIL,NSOIL,1)
            CALL SNKSRC (TSNSR,TAVG,SMC (1),SH2O (1), &
                          ZSOIL,NSOIL,SMCMAX,PSISAT,BEXP,DT,1,QTOT)
            RHSTS (1) = RHSTS (1) - TSNSR / DENOM
         END IF
      ELSE
         IF ( (SICE > 0.) .OR. (STC (1) < T0) ) THEN
            CALL SNKSRC (TSNSR,STC (1),SMC (1),SH2O (1), &
                          ZSOIL,NSOIL,SMCMAX,PSISAT,BEXP,DT,1,QTOT)
            RHSTS (1) = RHSTS (1) - TSNSR / DENOM
         END IF
      END IF
      DDZ2 = 0.0
      DF1K = DF1
      DO K = 2,NSOIL
         HCPCT = SH2O (K)* CH2O + (1.0- SMCMAX)* CSOIL_LOC + (SMCMAX - SMC ( &
                K))* CAIR + ( SMC (K) - SH2O (K) )* CICE
         IF (K /= NSOIL) THEN
            CALL TDFCND (DF1N,SMC (K),QUARTZ,SMCMAX,SH2O (K))
       IF ( VEGTYP == ISURBAN ) DF1N = 3.24
            DENOM = 0.5 * ( ZSOIL (K -1) - ZSOIL (K +1) )
            DTSDZ2 = ( STC (K) - STC (K +1) ) / DENOM
            DDZ2 = 2. / (ZSOIL (K -1) - ZSOIL (K +1))
            CI (K) = - DF1N * DDZ2 / ( (ZSOIL (K -1) - ZSOIL (K)) * &
       HCPCT)
            IF (ITAVG) THEN
               CALL TBND (STC (K),STC (K +1),ZSOIL,ZBOT,K,NSOIL,TBK1)
            END IF
         ELSE
            CALL TDFCND (DF1N,SMC (K),QUARTZ,SMCMAX,SH2O (K))
       IF ( VEGTYP == ISURBAN ) DF1N = 3.24
            DENOM = .5 * (ZSOIL (K -1) + ZSOIL (K)) - ZBOT
            DTSDZ2 = (STC (K) - TBOT) / DENOM
            CI (K) = 0.
            IF (ITAVG) THEN
               CALL TBND (STC (K),TBOT,ZSOIL,ZBOT,K,NSOIL,TBK1)
            END IF
         END IF
         DENOM = ( ZSOIL (K) - ZSOIL (K -1) ) * HCPCT
         RHSTS (K) = ( DF1N * DTSDZ2- DF1K * DTSDZ ) / DENOM
         QTOT = -1.0* DENOM * RHSTS (K)
         SICE = SMC (K) - SH2O (K)
         IF (ITAVG) THEN
            CALL TMPAVG (TAVG,TBK,STC (K),TBK1,ZSOIL,NSOIL,K)
            IF ( (SICE > 0.) .OR. (STC (K) < T0) .OR. &
               (TBK .lt. T0) .OR. (TBK1 .lt. T0) ) THEN
               CALL SNKSRC (TSNSR,TAVG,SMC (K),SH2O (K),ZSOIL,NSOIL, &
                             SMCMAX,PSISAT,BEXP,DT,K,QTOT)
               RHSTS (K) = RHSTS (K) - TSNSR / DENOM
            END IF
         ELSE
            IF ( (SICE > 0.) .OR. (STC (K) < T0) ) THEN
               CALL SNKSRC (TSNSR,STC (K),SMC (K),SH2O (K),ZSOIL,NSOIL, &
                             SMCMAX,PSISAT,BEXP,DT,K,QTOT)
               RHSTS (K) = RHSTS (K) - TSNSR / DENOM
            END IF
         END IF
         AI (K) = - DF1K * DDZ / ( (ZSOIL (K -1) - ZSOIL (K)) * HCPCT)
         BI (K) = - (AI (K) + CI (K))
         TBK = TBK1
         DF1K = DF1N
         DTSDZ = DTSDZ2
         DDZ = DDZ2
      END DO
  END SUBROUTINE HRT
      SUBROUTINE HRTICE_GLACIAL (RHSTS,STC,TBOT,NSOIL,ZSOIL,YY,ZZ1,DF1, &
           AI,BI,CI)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL
      INTEGER :: K
      REAL, INTENT(IN) :: DF1,YY,ZZ1
      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: AI, BI,CI
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: STC, ZSOIL
      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: RHSTS
      REAL, INTENT(IN) :: TBOT
      REAL :: DDZ,DDZ2,DENOM,DTSDZ,DTSDZ2,SSOIL, &
                                ZBOT
      REAL :: HCPCT
      REAL :: DF1K
      REAL :: DF1N
      REAL :: ZMD
      HCPCT = 1.E6 * (0.8194 - 0.1309*0.5*ZSOIL(1))
      DF1K = DF1
      ZBOT = -25.0
      DDZ = 1.0 / ( -0.5 * ZSOIL (2) )
      AI (1) = 0.0
      CI (1) = (DF1 * DDZ) / (ZSOIL (1) * HCPCT)
      BI (1) = - CI (1) + DF1/ (0.5 * ZSOIL (1) * ZSOIL (1) * HCPCT * &
       ZZ1)
      DTSDZ = ( STC (1) - STC (2) ) / ( -0.5 * ZSOIL (2) )
      SSOIL = DF1 * ( STC (1) - YY ) / ( 0.5 * ZSOIL (1) * ZZ1 )
      RHSTS (1) = ( DF1 * DTSDZ - SSOIL ) / ( ZSOIL (1) * HCPCT )
      DDZ2 = 0.0
      DF1K = DF1
      DF1N = DF1
      DO K = 2,NSOIL
          ZMD = 0.5 * (ZSOIL(K)+ZSOIL(K-1))
          HCPCT = 1.E6 * ( 0.8194 - 0.1309*ZMD )
          DF1N = 0.32333 - ( 0.10073 * ZMD )
         IF (K /= NSOIL) THEN
            DENOM = 0.5 * ( ZSOIL (K -1) - ZSOIL (K +1) )
            DTSDZ2 = ( STC (K) - STC (K +1) ) / DENOM
            DDZ2 = 2. / (ZSOIL (K -1) - ZSOIL (K +1))
            CI (K) = - DF1N * DDZ2 / ( (ZSOIL (K -1) - ZSOIL (K))*HCPCT)
         ELSE
            DTSDZ2 = (STC (K) - TBOT)/ (.5 * (ZSOIL (K -1) + ZSOIL (K)) &
                     - ZBOT)
            CI (K) = 0.
         END IF
         DENOM = ( ZSOIL (K) - ZSOIL (K -1) ) * HCPCT
         RHSTS (K) = ( DF1N * DTSDZ2- DF1K * DTSDZ ) / DENOM
         AI (K) = - DF1K * DDZ / ( (ZSOIL (K -1) - ZSOIL (K)) * HCPCT)
         BI (K) = - (AI (K) + CI (K))
         DF1K = DF1N
         DTSDZ = DTSDZ2
         DDZ = DDZ2
      END DO
  END SUBROUTINE HRTICE_GLACIAL
      SUBROUTINE HSTEP (STCOUT,STCIN,RHSTS,DT,NSOIL,AI,BI,CI)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL
      INTEGER :: K
      REAL, DIMENSION(1:NSOIL), INTENT(IN):: STCIN
      REAL, DIMENSION(1:NSOIL), INTENT(OUT):: STCOUT
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: RHSTS
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: AI,BI,CI
      REAL, DIMENSION(1:NSOIL) :: RHSTSin
      REAL, DIMENSION(1:NSOIL) :: CIin
      REAL :: DT
      DO K = 1,NSOIL
         RHSTS (K) = RHSTS (K) * DT
         AI (K) = AI (K) * DT
         BI (K) = 1. + BI (K) * DT
         CI (K) = CI (K) * DT
      END DO
      DO K = 1,NSOIL
         RHSTSin (K) = RHSTS (K)
      END DO
      DO K = 1,NSOIL
         CIin (K) = CI (K)
      END DO
      CALL ROSR12 (CI,AI,BI,CIin,RHSTSin,RHSTS,NSOIL)
      DO K = 1,NSOIL
         STCOUT (K) = STCIN (K) + CI (K)
      END DO
  END SUBROUTINE HSTEP
      SUBROUTINE NOPAC (ETP,ETA,PRCP,SMC,SMCMAX,SMCWLT, &
                         SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT,SHDFAC, &
                         SBETA,Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,EMISSI, &
                         SSOIL, &
                         STC,EPSCA,BEXP,PC,RCH,RR,CFACTR, &
                         SH2O,SLOPE,KDT,FRZFACT,PSISAT,ZSOIL, &
                         DKSAT,DWSAT,TBOT,ZBOT,RUNOFF1,RUNOFF2, &
                         RUNOFF3,EDIR,EC,ET,ETT,NROOT,ICE,RTDIS, &
                         QUARTZ,FXEXP,CSOIL, &
                         BETA,DRIP,DEW,FLX1,FLX3,VEGTYP,ISURBAN)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: ICE, NROOT,NSOIL,VEGTYP
      INTEGER, INTENT(IN) :: ISURBAN
      INTEGER :: K
      REAL, INTENT(IN) :: BEXP,CFACTR, CMCMAX,CSOIL,DKSAT,DT,DWSAT, &
                              EPSCA,ETP,FDOWN,F1,FXEXP,FRZFACT,KDT,PC, &
                              PRCP,PSISAT,Q2,QUARTZ,RCH,RR,SBETA,SFCTMP,&
                              SHDFAC,SLOPE,SMCDRY,SMCMAX,SMCREF,SMCWLT, &
                              T24,TBOT,TH2,ZBOT,EMISSI
      REAL, INTENT(INOUT) :: CMC,BETA,T1
      REAL, INTENT(OUT) :: DEW,DRIP,EC,EDIR,ETA,ETT,FLX1,FLX3, &
                              RUNOFF1,RUNOFF2,RUNOFF3,SSOIL
      REAL, DIMENSION(1:NSOIL),INTENT(IN) :: RTDIS,ZSOIL
      REAL, DIMENSION(1:NSOIL),INTENT(OUT) :: ET
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC,SH2O,STC
      REAL, DIMENSION(1:NSOIL) :: ET1
      REAL :: EC1,EDIR1,ETT1,DF1,ETA1,ETP1,PRCP1,YY, &
                              YYNUM,ZZ1
      PRCP1 = PRCP * 0.001
      ETP1 = ETP * 0.001
      DEW = 0.0
      EDIR = 0.
      EDIR1 = 0.
      EC1 = 0.
      EC = 0.
      DO K = 1,NSOIL
        ET(K) = 0.
        ET1(K) = 0.
      END DO
      ETT = 0.
      ETT1 = 0.
      IF (ETP > 0.0) THEN
         CALL EVAPO (ETA1,SMC,NSOIL,CMC,ETP1,DT,ZSOIL, &
                      SH2O, &
                      SMCMAX,BEXP,PC,SMCWLT,DKSAT,DWSAT, &
                      SMCREF,SHDFAC,CMCMAX, &
                      SMCDRY,CFACTR, &
                       EDIR1,EC1,ET1,ETT1,SFCTMP,Q2,NROOT,RTDIS,FXEXP)
         CALL SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL, &
                      SH2O,SLOPE,KDT,FRZFACT, &
                      SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT, &
                      SHDFAC,CMCMAX, &
                      RUNOFF1,RUNOFF2,RUNOFF3, &
                      EDIR1,EC1,ET1, &
                      DRIP)
         ETA = ETA1 * 1000.0
      ELSE
         DEW = - ETP1
         PRCP1 = PRCP1+ DEW
         CALL SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL, &
                      SH2O,SLOPE,KDT,FRZFACT, &
                      SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT, &
                      SHDFAC,CMCMAX, &
                      RUNOFF1,RUNOFF2,RUNOFF3, &
                      EDIR1,EC1,ET1, &
                      DRIP)
      END IF
      IF ( ETP <= 0.0 ) THEN
         BETA = 0.0
         ETA = ETP
         IF ( ETP < 0.0 ) THEN
            BETA = 1.0
         END IF
      ELSE
         BETA = ETA / ETP
      END IF
      EDIR = EDIR1*1000.
      EC = EC1*1000.
      DO K = 1,NSOIL
        ET(K) = ET1(K)*1000.
      END DO
      ETT = ETT1*1000.
      CALL TDFCND (DF1,SMC (1),QUARTZ,SMCMAX,SH2O (1))
      IF ( VEGTYP == ISURBAN ) DF1=3.24
      DF1 = DF1 * EXP (SBETA * SHDFAC)
      YYNUM = FDOWN - EMISSI*SIGMA * T24
      YY = SFCTMP + (YYNUM / RCH + TH2- SFCTMP - BETA * EPSCA) / RR
      ZZ1 = DF1 / ( -0.5 * ZSOIL (1) * RCH * RR ) + 1.0
      CALL SHFLX (SSOIL,STC,SMC,SMCMAX,NSOIL,T1,DT,YY,ZZ1,ZSOIL, &
                  TBOT,ZBOT,SMCWLT,PSISAT,SH2O,BEXP,F1,DF1,ICE, &
                  QUARTZ,CSOIL,VEGTYP,ISURBAN)
      FLX1 = CPH2O * PRCP * (T1- SFCTMP)
      FLX3 = 0.0
  END SUBROUTINE NOPAC
      SUBROUTINE PENMAN (SFCTMP,SFCPRS,CH,T2V,TH2,PRCP,FDOWN,T24,SSOIL, &
     & Q2,Q2SAT,ETP,RCH,EPSCA,RR,SNOWNG,FRZGRA, &
     & DQSDT2,FLX2,EMISSI_IN,SNEQV,T1,ICE,SNCOVR)
      IMPLICIT NONE
      LOGICAL, INTENT(IN) :: SNOWNG, FRZGRA
      REAL, INTENT(IN) :: CH, DQSDT2,FDOWN,PRCP, &
                                 Q2, Q2SAT,SSOIL, SFCPRS, SFCTMP, &
                                 T2V, TH2,EMISSI_IN,SNEQV
      REAL, INTENT(IN) :: T1 , SNCOVR
      INTEGER, INTENT(IN) :: ICE
      REAL, INTENT(OUT) :: EPSCA,ETP,FLX2,RCH,RR,T24
      REAL :: A, DELTA, FNET,RAD,RHO,EMISSI,ELCP1,LVS
      REAL, PARAMETER :: ELCP = 2.4888E+3, LSUBC = 2.501000E+6,CP = 1004.6
      REAL, PARAMETER :: LSUBS = 2.83E+6
        EMISSI=EMISSI_IN
        IF ( ICE == 0 ) THEN
           ELCP1 = (1.0-SNCOVR)*ELCP + SNCOVR*ELCP*LSUBS/LSUBC
           LVS = (1.0-SNCOVR)*LSUBC + SNCOVR*LSUBS
        ELSEIF ( ICE == -1 ) THEN
           IF ( T1 > 273.15 ) THEN
              ELCP1=ELCP
              LVS=LSUBC
           ELSE
              ELCP1 = ELCP*LSUBS/LSUBC
              LVS = LSUBS
           ENDIF
        ENDIF
      FLX2 = 0.0
      DELTA = ELCP1 * DQSDT2
      T24 = SFCTMP * SFCTMP * SFCTMP * SFCTMP
      RR = EMISSI*T24 * 6.48E-8 / (SFCPRS * CH) + 1.0
      RHO = SFCPRS / (RD * T2V)
      RCH = RHO * CP * CH
      IF (.NOT. SNOWNG) THEN
         IF (PRCP > 0.0) RR = RR + CPH2O * PRCP / RCH
      ELSE
         RR = RR + CPICE * PRCP / RCH
      END IF
      FNET = FDOWN - EMISSI*SIGMA * T24- SSOIL
      IF (FRZGRA) THEN
         FLX2 = - LSUBF * PRCP
         FNET = FNET - FLX2
      END IF
      RAD = FNET / RCH + TH2- SFCTMP
      A = ELCP1 * (Q2SAT - Q2)
      EPSCA = (A * RR + RAD * DELTA) / (DELTA + RR)
      ETP = EPSCA * RCH / LVS
  END SUBROUTINE PENMAN
      SUBROUTINE REDPRM (VEGTYP,SOILTYP,SLOPETYP,CFACTR,CMCMAX,RSMAX, &
                         TOPT, &
                         REFKDT,KDT,SBETA, SHDFAC,RSMIN,RGL,HS,ZBOT,FRZX, &
                         PSISAT,SLOPE,SNUP,SALP,BEXP,DKSAT,DWSAT, &
                         SMCMAX,SMCWLT,SMCREF,SMCDRY,F1,QUARTZ,FXEXP, &
                         RTDIS,SLDPTH,ZSOIL, NROOT,NSOIL,CZIL, &
                         LAIMIN, LAIMAX, EMISSMIN, EMISSMAX, ALBEDOMIN, &
                         ALBEDOMAX, Z0MIN, Z0MAX, CSOIL, PTU, LLANDUSE, &
                         LSOIL, LOCAL,LVCOEF)
      IMPLICIT NONE
      INTEGER, PARAMETER :: MAX_SLOPETYP=30,MAX_SOILTYP=30,MAX_VEGTYP=30
      LOGICAL :: LOCAL
      CHARACTER (LEN=256), INTENT(IN):: LLANDUSE, LSOIL
      INTEGER, INTENT(IN) :: VEGTYP
      INTEGER, INTENT(OUT) :: NROOT
      REAL, INTENT(INOUT) :: SHDFAC
      REAL, INTENT(OUT) :: HS,RSMIN,RGL,SNUP, &
                                CMCMAX,RSMAX,TOPT, &
                                EMISSMIN, EMISSMAX, &
                                LAIMIN, LAIMAX, &
                                Z0MIN, Z0MAX, &
                                ALBEDOMIN, ALBEDOMAX
      INTEGER, INTENT(IN) :: SOILTYP
      REAL, INTENT(OUT) :: BEXP,DKSAT,DWSAT,F1,QUARTZ,SMCDRY, &
                                SMCMAX,SMCREF,SMCWLT,PSISAT
      INTEGER, INTENT(IN) :: SLOPETYP,NSOIL
      INTEGER :: I
      REAL, INTENT(OUT) :: SLOPE,CZIL,SBETA,FXEXP, &
                                CSOIL,SALP,FRZX,KDT,CFACTR, &
                                ZBOT,REFKDT,PTU
      REAL, INTENT(OUT) :: LVCOEF
      REAL,DIMENSION(1:NSOIL),INTENT(IN) :: SLDPTH,ZSOIL
      REAL,DIMENSION(1:NSOIL),INTENT(OUT):: RTDIS
      REAL :: FRZFACT,FRZK,REFDK
               IF (SOILTYP .gt. SLCATS) THEN
                        CALL wrf_error_fatal3("<stdin>",2308,&
'Warning: too many input soil types' )
               END IF
               IF (VEGTYP .gt. LUCATS) THEN
                     CALL wrf_error_fatal3("<stdin>",2312,&
'Warning: too many input landuse types' )
               END IF
               IF (SLOPETYP .gt. SLPCATS) THEN
                     CALL wrf_error_fatal3("<stdin>",2316,&
'Warning: too many input slope types' )
               END IF
      CSOIL = CSOIL_DATA
      BEXP = BB (SOILTYP)
      DKSAT = SATDK (SOILTYP)
      DWSAT = SATDW (SOILTYP)
      F1 = F11 (SOILTYP)
      PSISAT = SATPSI (SOILTYP)
      QUARTZ = QTZ (SOILTYP)
      SMCDRY = DRYSMC (SOILTYP)
      SMCMAX = MAXSMC (SOILTYP)
      SMCREF = REFSMC (SOILTYP)
      SMCWLT = WLTSMC (SOILTYP)
      ZBOT = ZBOT_DATA
      SALP = SALP_DATA
      SBETA = SBETA_DATA
      REFDK = REFDK_DATA
      FRZK = FRZK_DATA
      FXEXP = FXEXP_DATA
      REFKDT = REFKDT_DATA
      PTU = 0.
      KDT = REFKDT * DKSAT / REFDK
      CZIL = CZIL_DATA
      SLOPE = SLOPE_DATA (SLOPETYP)
      LVCOEF = LVCOEF_DATA
      FRZFACT = (SMCMAX / SMCREF) * (0.412 / 0.468)
      FRZX = FRZK * FRZFACT
      TOPT = TOPT_DATA
      CMCMAX = CMCMAX_DATA
      CFACTR = CFACTR_DATA
      RSMAX = RSMAX_DATA
      NROOT = NROTBL (VEGTYP)
      SNUP = SNUPTBL (VEGTYP)
      RSMIN = RSTBL (VEGTYP)
      RGL = RGLTBL (VEGTYP)
      HS = HSTBL (VEGTYP)
      EMISSMIN = EMISSMINTBL (VEGTYP)
      EMISSMAX = EMISSMAXTBL (VEGTYP)
      LAIMIN = LAIMINTBL (VEGTYP)
      LAIMAX = LAIMAXTBL (VEGTYP)
      Z0MIN = Z0MINTBL (VEGTYP)
      Z0MAX = Z0MAXTBL (VEGTYP)
      ALBEDOMIN = ALBEDOMINTBL (VEGTYP)
      ALBEDOMAX = ALBEDOMAXTBL (VEGTYP)
               IF (VEGTYP .eq. BARE) SHDFAC = 0.0
               IF (NROOT .gt. NSOIL) THEN
                  WRITE (err_message,*) 'Error: too many root layers ', &
                                                 NSOIL,NROOT
                  CALL wrf_error_fatal3("<stdin>",2382,&
err_message )
               END IF
               DO I = 1,NROOT
                  RTDIS (I) = - SLDPTH (I)/ ZSOIL (NROOT)
               END DO
      END SUBROUTINE REDPRM
      SUBROUTINE ROSR12 (P,A,B,C,D,DELTA,NSOIL)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL
      INTEGER :: K, KK
      REAL, DIMENSION(1:NSOIL), INTENT(IN):: A, B, D
      REAL, DIMENSION(1:NSOIL),INTENT(INOUT):: C,P,DELTA
      C (NSOIL) = 0.0
      P (1) = - C (1) / B (1)
      DELTA (1) = D (1) / B (1)
      DO K = 2,NSOIL
         P (K) = - C (K) * ( 1.0 / (B (K) + A (K) * P (K -1)) )
         DELTA (K) = (D (K) - A (K)* DELTA (K -1))* (1.0/ (B (K) + A (K)&
                    * P (K -1)))
      END DO
      P (NSOIL) = DELTA (NSOIL)
      DO K = 2,NSOIL
         KK = NSOIL - K + 1
         P (KK) = P (KK) * P (KK +1) + DELTA (KK)
      END DO
  END SUBROUTINE ROSR12
      SUBROUTINE SHFLX (SSOIL,STC,SMC,SMCMAX,NSOIL,T1,DT,YY,ZZ1,ZSOIL, &
                         TBOT,ZBOT,SMCWLT,PSISAT,SH2O,BEXP,F1,DF1,ICE, &
                         QUARTZ,CSOIL,VEGTYP,ISURBAN)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: ICE, NSOIL, VEGTYP, ISURBAN
      INTEGER :: I
      REAL, INTENT(IN) :: BEXP,CSOIL,DF1,DT,F1,PSISAT,QUARTZ, &
                               SMCMAX, SMCWLT, TBOT,YY, ZBOT,ZZ1
      REAL, INTENT(INOUT) :: T1
      REAL, INTENT(OUT) :: SSOIL
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC,ZSOIL
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: STC
      REAL, DIMENSION(1:NSOIL) :: AI, BI, CI, STCF,RHSTS
      REAL, PARAMETER :: T0 = 273.15
      IF ( ICE == -1 ) THEN
         CALL HRTICE_GLACIAL (RHSTS,STC,TBOT,NSOIL,ZSOIL,YY,ZZ1,DF1,&
              AI,BI,CI)
         CALL HSTEP (STCF,STC,RHSTS,DT,NSOIL,AI,BI,CI)
      ELSEIF ( ICE == 0 ) THEN
         CALL HRT (RHSTS,STC,SMC,SMCMAX,NSOIL,ZSOIL,YY,ZZ1,TBOT, &
                    ZBOT,PSISAT,SH2O,DT, &
                    BEXP,F1,DF1,QUARTZ,CSOIL,AI,BI,CI,VEGTYP,ISURBAN)
         CALL HSTEP (STCF,STC,RHSTS,DT,NSOIL,AI,BI,CI)
      ENDIF
      DO I = 1,NSOIL
         STC (I) = STCF (I)
      ENDDO
      T1 = (YY + (ZZ1- 1.0) * STC (1)) / ZZ1
      SSOIL = DF1 * (STC (1) - T1) / (0.5 * ZSOIL (1))
  END SUBROUTINE SHFLX
      SUBROUTINE SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL, &
     & SH2O,SLOPE,KDT,FRZFACT, &
     & SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT, &
     & SHDFAC,CMCMAX, &
     & RUNOFF1,RUNOFF2,RUNOFF3, &
     & EDIR,EC,ET, &
     & DRIP)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL
      INTEGER :: I,K
      REAL, INTENT(IN) :: BEXP, CMCMAX, DKSAT,DWSAT, DT, EC, EDIR, &
                               KDT, PRCP1, SHDFAC, SLOPE, SMCMAX, SMCWLT
      REAL, INTENT(OUT) :: DRIP, RUNOFF1, RUNOFF2, RUNOFF3
      REAL, INTENT(INOUT) :: CMC
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ET,ZSOIL
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT):: SMC, SH2O
      REAL, DIMENSION(1:NSOIL) :: AI, BI, CI, STCF,RHSTS, RHSTT, &
                                              SICE, SH2OA, SH2OFG
      REAL :: DUMMY, EXCESS,FRZFACT,PCPDRP,RHSCT,TRHSCT
      REAL :: FAC2
      REAL :: FLIMIT
      DUMMY = 0.
      RHSCT = SHDFAC * PRCP1- EC
      DRIP = 0.
      TRHSCT = DT * RHSCT
      EXCESS = CMC + TRHSCT
      IF (EXCESS > CMCMAX) DRIP = EXCESS - CMCMAX
      PCPDRP = (1. - SHDFAC) * PRCP1+ DRIP / DT
      DO I = 1,NSOIL
         SICE (I) = SMC (I) - SH2O (I)
      END DO
      FAC2=0.0
      DO I=1,NSOIL
         FAC2=MAX(FAC2,SH2O(I)/SMCMAX)
      ENDDO
      CALL FAC2MIT(SMCMAX,FLIMIT)
      IF ( ( (PCPDRP * DT) > (0.0001*1000.0* (- ZSOIL (1))* SMCMAX) ) &
           .OR. (FAC2 > FLIMIT) ) THEN
         CALL SRT (RHSTT,EDIR,ET,SH2O,SH2O,NSOIL,PCPDRP,ZSOIL, &
                    DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1, &
                    RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZFACT,SICE,AI,BI,CI)
         CALL SSTEP (SH2OFG,SH2O,DUMMY,RHSTT,RHSCT,DT,NSOIL,SMCMAX, &
                        CMCMAX,RUNOFF3,ZSOIL,SMC,SICE,AI,BI,CI)
         DO K = 1,NSOIL
            SH2OA (K) = (SH2O (K) + SH2OFG (K)) * 0.5
         END DO
         CALL SRT (RHSTT,EDIR,ET,SH2O,SH2OA,NSOIL,PCPDRP,ZSOIL, &
                    DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1, &
                    RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZFACT,SICE,AI,BI,CI)
         CALL SSTEP (SH2O,SH2O,CMC,RHSTT,RHSCT,DT,NSOIL,SMCMAX, &
                        CMCMAX,RUNOFF3,ZSOIL,SMC,SICE,AI,BI,CI)
      ELSE
         CALL SRT (RHSTT,EDIR,ET,SH2O,SH2O,NSOIL,PCPDRP,ZSOIL, &
                    DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1, &
                      RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZFACT,SICE,AI,BI,CI)
         CALL SSTEP (SH2O,SH2O,CMC,RHSTT,RHSCT,DT,NSOIL,SMCMAX, &
                        CMCMAX,RUNOFF3,ZSOIL,SMC,SICE,AI,BI,CI)
      END IF
  END SUBROUTINE SMFLX
      SUBROUTINE SNFRAC (SNEQV,SNUP,SALP,SNOWH,SNCOVR)
      IMPLICIT NONE
      REAL, INTENT(IN) :: SNEQV,SNUP,SALP,SNOWH
      REAL, INTENT(OUT) :: SNCOVR
      REAL :: RSNOW, Z0N
      IF (SNEQV < SNUP) THEN
         RSNOW = SNEQV / SNUP
         SNCOVR = 1. - ( EXP ( - SALP * RSNOW) - RSNOW * EXP ( - SALP))
      ELSE
         SNCOVR = 1.0
      END IF
  END SUBROUTINE SNFRAC
      SUBROUTINE SNKSRC (TSNSR,TAVG,SMC,SH2O,ZSOIL,NSOIL, &
     & SMCMAX,PSISAT,BEXP,DT,K,QTOT)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: K,NSOIL
      REAL, INTENT(IN) :: BEXP, DT, PSISAT, QTOT, SMC, SMCMAX, &
                               TAVG
      REAL, INTENT(INOUT) :: SH2O
      REAL, DIMENSION(1:NSOIL), INTENT(IN):: ZSOIL
      REAL :: DF, DZ, DZH, FREE, TSNSR, &
                               TDN, TM, TUP, TZ, X0, XDN, XH2O, XUP
      REAL, PARAMETER :: DH2O = 1.0000E3, HLICE = 3.3350E5, &
                               T0 = 2.7315E2
      IF (K == 1) THEN
         DZ = - ZSOIL (1)
      ELSE
         DZ = ZSOIL (K -1) - ZSOIL (K)
      END IF
      CALL FRH2O (FREE,TAVG,SMC,SH2O,SMCMAX,BEXP,PSISAT)
      XH2O = SH2O + QTOT * DT / (DH2O * HLICE * DZ)
      IF ( XH2O < SH2O .AND. XH2O < FREE) THEN
         IF ( FREE > SH2O ) THEN
            XH2O = SH2O
         ELSE
            XH2O = FREE
         END IF
      END IF
      IF ( XH2O > SH2O .AND. XH2O > FREE ) THEN
         IF ( FREE < SH2O ) THEN
            XH2O = SH2O
         ELSE
            XH2O = FREE
         END IF
      END IF
      IF (XH2O < 0.) XH2O = 0.
      IF (XH2O > SMC) XH2O = SMC
      TSNSR = - DH2O * HLICE * DZ * (XH2O - SH2O)/ DT
      SH2O = XH2O
  END SUBROUTINE SNKSRC
      SUBROUTINE SNOPAC (ETP,ETA,PRCP,PRCPF,SNOWNG,SMC,SMCMAX,SMCWLT, &
                          SMCREF,SMCDRY,CMC,CMCMAX,NSOIL,DT, &
                          SBETA,DF1, &
                          Q2,T1,SFCTMP,T24,TH2,FDOWN,F1,SSOIL,STC,EPSCA,&
                         SFCPRS,BEXP,PC,RCH,RR,CFACTR,SNCOVR,ESD,SNDENS,&
                          SNOWH,SH2O,SLOPE,KDT,FRZFACT,PSISAT, &
                          ZSOIL,DWSAT,DKSAT,TBOT,ZBOT,SHDFAC,RUNOFF1, &
                          RUNOFF2,RUNOFF3,EDIR,EC,ET,ETT,NROOT,SNOMLT, &
                          ICE,RTDIS,QUARTZ,FXEXP,CSOIL, &
                          BETA,DRIP,DEW,FLX1,FLX2,FLX3,ESNOW,ETNS,EMISSI,&
                          RIBB,SOLDN, &
                          ISURBAN, &
                          VEGTYP)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: ICE, NROOT, NSOIL,VEGTYP
      INTEGER, INTENT(IN) :: ISURBAN
      INTEGER :: K
      INTEGER :: IT16
      LOGICAL, INTENT(IN) :: SNOWNG
      REAL, INTENT(IN) :: BEXP,CFACTR, CMCMAX,CSOIL,DF1,DKSAT, &
                               DT,DWSAT, EPSCA,FDOWN,F1,FXEXP, &
                               FRZFACT,KDT,PC, PRCP,PSISAT,Q2,QUARTZ, &
                               RCH,RR,SBETA,SFCPRS, SFCTMP, SHDFAC, &
                               SLOPE,SMCDRY,SMCMAX,SMCREF,SMCWLT, T24, &
                               TBOT,TH2,ZBOT,EMISSI,SOLDN
      REAL, INTENT(INOUT) :: CMC, BETA, ESD,FLX2,PRCPF,SNOWH,SNCOVR, &
                               SNDENS, T1, RIBB, ETP
      REAL, INTENT(OUT) :: DEW,DRIP,EC,EDIR, ETNS, ESNOW,ETT, &
                               FLX1,FLX3, RUNOFF1,RUNOFF2,RUNOFF3, &
                               SSOIL,SNOMLT
      REAL, DIMENSION(1:NSOIL),INTENT(IN) :: RTDIS,ZSOIL
      REAL, DIMENSION(1:NSOIL),INTENT(OUT) :: ET
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC,SH2O,STC
      REAL, DIMENSION(1:NSOIL) :: ET1
      REAL :: DENOM,DSOIL,DTOT,EC1,EDIR1,ESDFLX,ETA, &
                               ETT1, ESNOW1, ESNOW2, ETA1,ETP1,ETP2, &
                               ETP3, ETNS1, ETANRG, ETAX, EX, FLX3X, &
                               FRCSNO,FRCSOI, PRCP1, QSAT,RSNOW, SEH, &
                               SNCOND,SSOIL1, T11,T12, T12A, T12AX, &
                               T12B, T14, YY, ZZ1
      REAL :: T15, T16, DTOT2
      REAL, PARAMETER :: ESDMIN = 1.E-6, LSUBC = 2.501000E+6, &
                               LSUBS = 2.83E+6, TFREEZ = 273.15, &
                               SNOEXP = 2.0
      DEW = 0.
      EDIR = 0.
      EDIR1 = 0.
      EC1 = 0.
      EC = 0.
      DO K = 1,NSOIL
         ET (K) = 0.
         ET1 (K) = 0.
      END DO
      ETT = 0.
      ETT1 = 0.
      ETNS = 0.
      ETNS1 = 0.
      ESNOW = 0.
      ESNOW1 = 0.
      ESNOW2 = 0.
      PRCP1 = PRCPF *0.001
      BETA = 1.0
      IF (ETP <= 0.0) THEN
         IF ( ( RIBB >= 0.1 ) .AND. ( FDOWN > 150.0 ) ) THEN
            ETP=(MIN(ETP*(1.0-RIBB),0.)*SNCOVR/0.980 + ETP*(0.980-SNCOVR))/0.980
         ENDIF
         IF(ETP == 0.) BETA = 0.0
         ETP1 = ETP * 0.001
         DEW = -ETP1
         ESNOW2 = ETP1*DT
         ETANRG = ETP*((1.-SNCOVR)*LSUBC + SNCOVR*LSUBS)
      ELSE
         ETP1 = ETP * 0.001
         IF ( ICE == -1 ) THEN
            ESNOW = ETP
            ESNOW1 = ESNOW*0.001
            ESNOW2 = ESNOW1*DT
            ETANRG = ESNOW*LSUBS
         ELSEIF ( ICE == 0) THEN
            IF (SNCOVR < 1.) THEN
               CALL EVAPO (ETNS1,SMC,NSOIL,CMC,ETP1,DT,ZSOIL, &
                            SH2O, &
                            SMCMAX,BEXP,PC,SMCWLT,DKSAT,DWSAT, &
                            SMCREF,SHDFAC,CMCMAX, &
                            SMCDRY,CFACTR, &
                            EDIR1,EC1,ET1,ETT1,SFCTMP,Q2,NROOT,RTDIS, &
                            FXEXP)
               EDIR1 = EDIR1* (1. - SNCOVR)
               EC1 = EC1* (1. - SNCOVR)
               DO K = 1,NSOIL
                  ET1 (K) = ET1 (K)* (1. - SNCOVR)
               END DO
               ETT1 = ETT1*(1.-SNCOVR)
               ETNS1 = ETNS1*(1.-SNCOVR)
               EDIR = EDIR1*1000.
               EC = EC1*1000.
               DO K = 1,NSOIL
                  ET (K) = ET1 (K)*1000.
               END DO
               ETT = ETT1*1000.
               ETNS = ETNS1*1000.
            ENDIF
         ENDIF
         ESNOW = ETP*SNCOVR
         ESNOW1 = ESNOW*0.001
         ESNOW2 = ESNOW1*DT
         ETANRG = ESNOW*LSUBS + ETNS*LSUBC
      ENDIF
      FLX1 = 0.0
      IF (SNOWNG) THEN
         FLX1 = CPICE * PRCP * (T1- SFCTMP)
      ELSE
         IF (PRCP > 0.0) FLX1 = CPH2O * PRCP * (T1- SFCTMP)
      END IF
      DSOIL = - (0.5 * ZSOIL (1))
      DTOT = SNOWH + DSOIL
      DENOM = 1.0+ DF1 / (DTOT * RR * RCH)
      T12A = ( (FDOWN - FLX1- FLX2- EMISSI * SIGMA * T24)/ RCH &
                + TH2- SFCTMP - ETANRG / RCH ) / RR
      T12B = DF1 * STC (1) / (DTOT * RR * RCH)
      T12 = (SFCTMP + T12A + T12B) / DENOM
      IF (T12 <= TFREEZ) THEN
         T1 = T12
         SSOIL = DF1 * (T1- STC (1)) / DTOT
         ESD = MAX(0.0, ESD-ESNOW2)
         FLX3 = 0.0
         EX = 0.0
         SNOMLT = 0.0
      ELSE
         T1 = TFREEZ * SNCOVR ** SNOEXP + T12 * (1.0- SNCOVR ** SNOEXP)
         BETA = 1.0
         IF ( ICE == -1 ) then
            IF ( DTOT .GT. 2.0*DSOIL ) THEN
               DTOT = 2.0*DSOIL
            ENDIF
         ENDIF
         SSOIL = DF1 * (T1- STC (1)) / DTOT
         IF (ESD-ESNOW2 <= ESDMIN) THEN
            ESD = 0.0
            EX = 0.0
            SNOMLT = 0.0
            FLX3 = 0.0
         ELSE
            ESD = ESD-ESNOW2
            ETP3 = ETP * LSUBC
            SEH = RCH * (T1- TH2)
            T14 = T1* T1
            T14 = T14* T14
            FLX3 = FDOWN - FLX1- FLX2- EMISSI*SIGMA * T14- SSOIL - SEH - ETANRG
            IF (FLX3 <= 0.0) FLX3 = 0.0
            EX = FLX3*0.001/ LSUBF
            SNOMLT = EX * DT
            IF (ESD- SNOMLT >= ESDMIN) THEN
               ESD = ESD- SNOMLT
            ELSE
               EX = ESD / DT
               FLX3 = EX *1000.0* LSUBF
               SNOMLT = ESD
               ESD = 0.0
            END IF
         END IF
         IF (ICE == 0) PRCP1 = PRCP1+ EX
      END IF
      IF (ICE == 0) THEN
         CALL SMFLX (SMC,NSOIL,CMC,DT,PRCP1,ZSOIL, &
                      SH2O,SLOPE,KDT,FRZFACT, &
                      SMCMAX,BEXP,SMCWLT,DKSAT,DWSAT, &
                      SHDFAC,CMCMAX, &
                      RUNOFF1,RUNOFF2,RUNOFF3, &
                      EDIR1,EC1,ET1, &
                      DRIP)
      END IF
      ZZ1 = 1.0
      YY = STC (1) -0.5* SSOIL * ZSOIL (1)* ZZ1/ DF1
      T11 = T1
      CALL SHFLX (SSOIL1,STC,SMC,SMCMAX,NSOIL,T11,DT,YY,ZZ1,ZSOIL, &
                   TBOT,ZBOT,SMCWLT,PSISAT,SH2O,BEXP,F1,DF1,ICE, &
                   QUARTZ,CSOIL,VEGTYP,ISURBAN)
      IF (ICE == 0) THEN
         IF (ESD > 0.) THEN
            CALL SNOWPACK (ESD,DT,SNOWH,SNDENS,T1,YY)
         ELSE
            ESD = 0.
            SNOWH = 0.
            SNDENS = 0.
            SNCOND = 1.
            SNCOVR = 0.
         END IF
      ELSEIF (ICE == -1) THEN
         IF (ESD .GE. 0.10) THEN
            CALL SNOWPACK (ESD,DT,SNOWH,SNDENS,T1,YY)
         ELSE
            ESD = 0.10
            SNOWH = 0.50
            SNCOVR = 1.0
        ENDIF
      ENDIF
  END SUBROUTINE SNOPAC
      SUBROUTINE SNOWPACK (ESD,DTSEC,SNOWH,SNDENS,TSNOW,TSOIL)
      IMPLICIT NONE
      INTEGER :: IPOL, J
      REAL, INTENT(IN) :: ESD, DTSEC,TSNOW,TSOIL
      REAL, INTENT(INOUT) :: SNOWH, SNDENS
      REAL :: BFAC,DSX,DTHR,DW,SNOWHC,PEXP, &
                                TAVGC,TSNOWC,TSOILC,ESDC,ESDCX
      REAL, PARAMETER :: C1 = 0.01, C2 = 21.0, G = 9.81, &
                                KN = 4000.0
      SNOWHC = SNOWH *100.
      ESDC = ESD *100.
      DTHR = DTSEC /3600.
      TSNOWC = TSNOW -273.15
      TSOILC = TSOIL -273.15
      TAVGC = 0.5* (TSNOWC + TSOILC)
      IF (ESDC > 1.E-2) THEN
         ESDCX = ESDC
      ELSE
         ESDCX = 1.E-2
      END IF
      BFAC = DTHR * C1* EXP (0.08* TAVGC - C2* SNDENS)
      IPOL = 4
      PEXP = 0.
      DO J = IPOL,1, -1
         PEXP = (1. + PEXP)* BFAC * ESDCX / REAL (J +1)
      END DO
      PEXP = PEXP + 1.
      DSX = SNDENS * (PEXP)
      IF (DSX > 0.40) DSX = 0.40
      IF (DSX < 0.05) DSX = 0.05
      SNDENS = DSX
      IF (TSNOWC >= 0.) THEN
         DW = 0.13* DTHR /24.
         SNDENS = SNDENS * (1. - DW) + DW
         IF (SNDENS >= 0.40) SNDENS = 0.40
      END IF
      SNOWHC = ESDC / SNDENS
      SNOWH = SNOWHC *0.01
  END SUBROUTINE SNOWPACK
      SUBROUTINE SNOWZ0 (SNCOVR,Z0, Z0BRD, SNOWH)
      IMPLICIT NONE
      REAL, INTENT(IN) :: SNCOVR, Z0BRD
      REAL, INTENT(OUT) :: Z0
      REAL, PARAMETER :: Z0S=0.001
      REAL, INTENT(IN) :: SNOWH
      REAL :: BURIAL
      REAL :: Z0EFF
      BURIAL = 7.0*Z0BRD - SNOWH
      IF(BURIAL.LE.0.0007) THEN
        Z0EFF = Z0S
      ELSE
        Z0EFF = BURIAL/7.0
      ENDIF
      Z0 = (1.- SNCOVR)* Z0BRD + SNCOVR * Z0EFF
  END SUBROUTINE SNOWZ0
      SUBROUTINE SNOW_NEW (TEMP,NEWSN,SNOWH,SNDENS)
      IMPLICIT NONE
      REAL, INTENT(IN) :: NEWSN, TEMP
      REAL, INTENT(INOUT) :: SNDENS, SNOWH
      REAL :: DSNEW, HNEWC, SNOWHC,NEWSNC,TEMPC
      SNOWHC = SNOWH *100.
      NEWSNC = NEWSN *100.
      TEMPC = TEMP -273.15
      IF (TEMPC <= -15.) THEN
         DSNEW = 0.05
      ELSE
         DSNEW = 0.05+0.0017* (TEMPC +15.)**1.5
      END IF
      HNEWC = NEWSNC / DSNEW
      IF (SNOWHC + HNEWC .LT. 1.0E-3) THEN
         SNDENS = MAX(DSNEW,SNDENS)
      ELSE
         SNDENS = (SNOWHC * SNDENS + HNEWC * DSNEW)/ (SNOWHC + HNEWC)
      ENDIF
      SNOWHC = SNOWHC + HNEWC
      SNOWH = SNOWHC *0.01
  END SUBROUTINE SNOW_NEW
      SUBROUTINE SRT (RHSTT,EDIR,ET,SH2O,SH2OA,NSOIL,PCPDRP, &
                       ZSOIL,DWSAT,DKSAT,SMCMAX,BEXP,RUNOFF1, &
                       RUNOFF2,DT,SMCWLT,SLOPE,KDT,FRZX,SICE,AI,BI,CI)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL
      INTEGER :: IALP1, IOHINF, J, JJ, K, KS
      REAL, INTENT(IN) :: BEXP, DKSAT, DT, DWSAT, EDIR, FRZX, &
                                   KDT, PCPDRP, SLOPE, SMCMAX, SMCWLT
      REAL, INTENT(OUT) :: RUNOFF1, RUNOFF2
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ET, SH2O, SH2OA, SICE, &
                                                ZSOIL
      REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: RHSTT
      REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: AI, BI, CI
      REAL, DIMENSION(1:NSOIL) :: DMAX
      REAL :: ACRT, DD, DDT, DDZ, DDZ2, DENOM, &
                                   DENOM2,DICE, DSMDZ, DSMDZ2, DT1, &
                                   FCR,INFMAX,MXSMC,MXSMC2,NUMER,PDDUM, &
                                   PX, SICEMAX,SLOPX, SMCAV, SSTT, &
                                   SUM, VAL, WCND, WCND2, WDF, WDF2
      INTEGER, PARAMETER :: CVFRZ = 3
      IOHINF = 1
      SICEMAX = 0.0
      DO KS = 1,NSOIL
         IF (SICE (KS) > SICEMAX) SICEMAX = SICE (KS)
      END DO
      PDDUM = PCPDRP
      RUNOFF1 = 0.0
      IF (PCPDRP /= 0.0) THEN
         DT1 = DT /86400.
         SMCAV = SMCMAX - SMCWLT
         DMAX (1)= - ZSOIL (1)* SMCAV
         DICE = - ZSOIL (1) * SICE (1)
         DMAX (1)= DMAX (1)* (1.0- (SH2OA (1) + SICE (1) - SMCWLT)/ &
                    SMCAV)
         DD = DMAX (1)
         DO KS = 2,NSOIL
            DICE = DICE+ ( ZSOIL (KS -1) - ZSOIL (KS) ) * SICE (KS)
            DMAX (KS) = (ZSOIL (KS -1) - ZSOIL (KS))* SMCAV
            DMAX (KS) = DMAX (KS)* (1.0- (SH2OA (KS) + SICE (KS) &
                        - SMCWLT)/ SMCAV)
            DD = DD+ DMAX (KS)
         END DO
         VAL = (1. - EXP ( - KDT * DT1))
         DDT = DD * VAL
         PX = PCPDRP * DT
         IF (PX < 0.0) PX = 0.0
         INFMAX = (PX * (DDT / (PX + DDT)))/ DT
         FCR = 1.
         IF (DICE > 1.E-2) THEN
            ACRT = CVFRZ * FRZX / DICE
            SUM = 1.
            IALP1 = CVFRZ - 1
            DO J = 1,IALP1
               K = 1
               DO JJ = J +1,IALP1
                  K = K * JJ
               END DO
               SUM = SUM + (ACRT ** ( CVFRZ - J)) / FLOAT (K)
            END DO
            FCR = 1. - EXP ( - ACRT) * SUM
         END IF
         INFMAX = INFMAX * FCR
         MXSMC = SH2OA (1)
         CALL WDFCND (WDF,WCND,MXSMC,SMCMAX,BEXP,DKSAT,DWSAT, &
                         SICEMAX)
         INFMAX = MAX (INFMAX,WCND)
         INFMAX = MIN (INFMAX,PX/DT)
         IF (PCPDRP > INFMAX) THEN
            RUNOFF1 = PCPDRP - INFMAX
            PDDUM = INFMAX
         END IF
      END IF
      MXSMC = SH2OA (1)
      CALL WDFCND (WDF,WCND,MXSMC,SMCMAX,BEXP,DKSAT,DWSAT, &
                    SICEMAX)
      DDZ = 1. / ( - .5 * ZSOIL (2) )
      AI (1) = 0.0
      BI (1) = WDF * DDZ / ( - ZSOIL (1) )
      CI (1) = - BI (1)
      DSMDZ = ( SH2O (1) - SH2O (2) ) / ( - .5 * ZSOIL (2) )
      RHSTT (1) = (WDF * DSMDZ + WCND- PDDUM + EDIR + ET (1))/ ZSOIL (1)
      SSTT = WDF * DSMDZ + WCND+ EDIR + ET (1)
      DDZ2 = 0.0
      DO K = 2,NSOIL
         DENOM2 = (ZSOIL (K -1) - ZSOIL (K))
         IF (K /= NSOIL) THEN
            SLOPX = 1.
            MXSMC2 = SH2OA (K)
            CALL WDFCND (WDF2,WCND2,MXSMC2,SMCMAX,BEXP,DKSAT,DWSAT, &
                          SICEMAX)
            DENOM = (ZSOIL (K -1) - ZSOIL (K +1))
            DSMDZ2 = (SH2O (K) - SH2O (K +1)) / (DENOM * 0.5)
            DDZ2 = 2.0 / DENOM
            CI (K) = - WDF2 * DDZ2 / DENOM2
         ELSE
            SLOPX = SLOPE
          CALL WDFCND (WDF2,WCND2,SH2OA (NSOIL),SMCMAX,BEXP,DKSAT,DWSAT, &
                            SICEMAX)
            DSMDZ2 = 0.0
            CI (K) = 0.0
         END IF
         NUMER = (WDF2 * DSMDZ2) + SLOPX * WCND2- (WDF * DSMDZ) &
                 - WCND+ ET (K)
         RHSTT (K) = NUMER / ( - DENOM2)
         AI (K) = - WDF * DDZ / DENOM2
         BI (K) = - ( AI (K) + CI (K) )
         IF (K .eq. NSOIL) THEN
            RUNOFF2 = SLOPX * WCND2
         END IF
         IF (K .ne. NSOIL) THEN
            WDF = WDF2
            WCND = WCND2
            DSMDZ = DSMDZ2
            DDZ = DDZ2
         END IF
      END DO
  END SUBROUTINE SRT
      SUBROUTINE SSTEP (SH2OOUT,SH2OIN,CMC,RHSTT,RHSCT,DT, &
                        NSOIL,SMCMAX,CMCMAX,RUNOFF3,ZSOIL,SMC,SICE, &
                        AI,BI,CI)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL
      INTEGER :: I, K, KK11
      REAL, INTENT(IN) :: CMCMAX, DT, SMCMAX
      REAL, INTENT(OUT) :: RUNOFF3
      REAL, INTENT(INOUT) :: CMC
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2OIN, SICE, ZSOIL
      REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: SH2OOUT
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: RHSTT, SMC
      REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: AI, BI, CI
      REAL, DIMENSION(1:NSOIL) :: RHSTTin
      REAL, DIMENSION(1:NSOIL) :: CIin
      REAL :: DDZ, RHSCT, STOT, WPLUS
      DO K = 1,NSOIL
         RHSTT (K) = RHSTT (K) * DT
         AI (K) = AI (K) * DT
         BI (K) = 1. + BI (K) * DT
         CI (K) = CI (K) * DT
      END DO
      DO K = 1,NSOIL
         RHSTTin (K) = RHSTT (K)
      END DO
      DO K = 1,NSOIL
         CIin (K) = CI (K)
      END DO
      CALL ROSR12 (CI,AI,BI,CIin,RHSTTin,RHSTT,NSOIL)
      WPLUS = 0.0
      RUNOFF3 = 0.
      DDZ = - ZSOIL (1)
      DO K = 1,NSOIL
         IF (K /= 1) DDZ = ZSOIL (K - 1) - ZSOIL (K)
         SH2OOUT (K) = SH2OIN (K) + CI (K) + WPLUS / DDZ
         STOT = SH2OOUT (K) + SICE (K)
         IF (STOT > SMCMAX) THEN
            IF (K .eq. 1) THEN
               DDZ = - ZSOIL (1)
            ELSE
               KK11 = K - 1
               DDZ = - ZSOIL (K) + ZSOIL (KK11)
            END IF
            WPLUS = (STOT - SMCMAX) * DDZ
         ELSE
            WPLUS = 0.
         END IF
         SMC (K) = MAX ( MIN (STOT,SMCMAX),0.02 )
         SH2OOUT (K) = MAX ( (SMC (K) - SICE (K)),0.0)
      END DO
      RUNOFF3 = WPLUS
      CMC = CMC + DT * RHSCT
      IF (CMC < 1.E-20) CMC = 0.0
      CMC = MIN (CMC,CMCMAX)
  END SUBROUTINE SSTEP
      SUBROUTINE TBND (TU,TB,ZSOIL,ZBOT,K,NSOIL,TBND1)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: NSOIL
      INTEGER :: K
      REAL, INTENT(IN) :: TB, TU, ZBOT
      REAL, INTENT(OUT) :: TBND1
      REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL
      REAL :: ZB, ZUP
      REAL, PARAMETER :: T0 = 273.15
     IF (K == 1) THEN
         ZUP = 0.
      ELSE
         ZUP = ZSOIL (K -1)
      END IF
      IF (K == NSOIL) THEN
         ZB = 2.* ZBOT - ZSOIL (K)
      ELSE
         ZB = ZSOIL (K +1)
      END IF
      TBND1 = TU + (TB - TU)* (ZUP - ZSOIL (K))/ (ZUP - ZB)
  END SUBROUTINE TBND
      SUBROUTINE TDFCND ( DF, SMC, QZ, SMCMAX, SH2O)
      IMPLICIT NONE
      REAL, INTENT(IN) :: QZ, SMC, SMCMAX, SH2O
      REAL, INTENT(OUT) :: DF
      REAL :: AKE, GAMMD, THKDRY, THKICE, THKO, &
                                   THKQTZ,THKSAT,THKS,THKW,SATRATIO,XU, &
                                   XUNFROZ
      SATRATIO = SMC / SMCMAX
      THKICE = 2.2
      THKW = 0.57
      THKO = 2.0
      THKQTZ = 7.7
      THKS = (THKQTZ ** QZ)* (THKO ** (1. - QZ))
      XUNFROZ = SH2O / SMC
      XU = XUNFROZ * SMCMAX
      THKSAT = THKS ** (1. - SMCMAX)* THKICE ** (SMCMAX - XU)* THKW ** &
         (XU)
      GAMMD = (1. - SMCMAX)*2700.
      THKDRY = (0.135* GAMMD+ 64.7)/ (2700. - 0.947* GAMMD)
      IF ( (SH2O + 0.0005) < SMC ) THEN
         AKE = SATRATIO
      ELSE
         IF ( SATRATIO > 0.1 ) THEN
            AKE = LOG10 (SATRATIO) + 1.0
         ELSE
            AKE = 0.0
         END IF
      END IF
      DF = AKE * (THKSAT - THKDRY) + THKDRY
  END SUBROUTINE TDFCND
      SUBROUTINE TMPAVG (TAVG,TUP,TM,TDN,ZSOIL,NSOIL,K)
      IMPLICIT NONE
      INTEGER K
      INTEGER NSOIL
      REAL DZ
      REAL DZH
      REAL T0
      REAL TAVG
      REAL TDN
      REAL TM
      REAL TUP
      REAL X0
      REAL XDN
      REAL XUP
      REAL ZSOIL (NSOIL)
      PARAMETER (T0 = 2.7315E2)
      IF (K .eq. 1) THEN
         DZ = - ZSOIL (1)
      ELSE
         DZ = ZSOIL (K -1) - ZSOIL (K)
      END IF
      DZH = DZ *0.5
      IF (TUP .lt. T0) THEN
         IF (TM .lt. T0) THEN
            IF (TDN .lt. T0) THEN
               TAVG = (TUP + 2.0* TM + TDN)/ 4.0
            ELSE
               X0 = (T0- TM) * DZH / (TDN - TM)
               TAVG = 0.5 * (TUP * DZH + TM * (DZH + X0) + T0* ( &
     & 2.* DZH - X0)) / DZ
            END IF
         ELSE
            IF (TDN .lt. T0) THEN
               XUP = (T0- TUP) * DZH / (TM - TUP)
               XDN = DZH - (T0- TM) * DZH / (TDN - TM)
               TAVG = 0.5 * (TUP * XUP + T0* (2.* DZ - XUP - XDN) &
     & + TDN * XDN) / DZ
            ELSE
               XUP = (T0- TUP) * DZH / (TM - TUP)
               TAVG = 0.5 * (TUP * XUP + T0* (2.* DZ - XUP)) / DZ
            END IF
         END IF
      ELSE
         IF (TM .lt. T0) THEN
            IF (TDN .lt. T0) THEN
               XUP = DZH - (T0- TUP) * DZH / (TM - TUP)
               TAVG = 0.5 * (T0* (DZ - XUP) + TM * (DZH + XUP) &
     & + TDN * DZH) / DZ
            ELSE
               XUP = DZH - (T0- TUP) * DZH / (TM - TUP)
               XDN = (T0- TM) * DZH / (TDN - TM)
               TAVG = 0.5 * (T0* (2.* DZ - XUP - XDN) + TM * &
     & (XUP + XDN)) / DZ
            END IF
         ELSE
            IF (TDN .lt. T0) THEN
               XDN = DZH - (T0- TM) * DZH / (TDN - TM)
               TAVG = (T0* (DZ - XDN) +0.5* (T0+ TDN)* XDN) / DZ
            ELSE
               TAVG = (TUP + 2.0* TM + TDN) / 4.0
            END IF
         END IF
      END IF
  END SUBROUTINE TMPAVG
      SUBROUTINE TRANSP (ET,NSOIL,ETP1,SMC,CMC,ZSOIL,SHDFAC,SMCWLT, &
     & CMCMAX,PC,CFACTR,SMCREF,SFCTMP,Q2,NROOT, &
     & RTDIS)
      IMPLICIT NONE
      INTEGER I
      INTEGER K
      INTEGER NSOIL
      INTEGER NROOT
      REAL CFACTR
      REAL CMC
      REAL CMCMAX
      REAL DENOM
      REAL ET (NSOIL)
      REAL ETP1
      REAL ETP1A
      REAL GX (NROOT)
      REAL PC
      REAL Q2
      REAL RTDIS (NSOIL)
      REAL RTX
      REAL SFCTMP
      REAL SGX
      REAL SHDFAC
      REAL SMC (NSOIL)
      REAL SMCREF
      REAL SMCWLT
      REAL ZSOIL (NSOIL)
      DO K = 1,NSOIL
         ET (K) = 0.
      END DO
      IF (CMC .ne. 0.0) THEN
         ETP1A = SHDFAC * PC * ETP1 * (1.0- (CMC / CMCMAX) ** CFACTR)
      ELSE
         ETP1A = SHDFAC * PC * ETP1
      END IF
      SGX = 0.0
      DO I = 1,NROOT
         GX (I) = ( SMC (I) - SMCWLT ) / ( SMCREF - SMCWLT )
         GX (I) = MAX ( MIN ( GX (I), 1. ), 0. )
         SGX = SGX + GX (I)
      END DO
      SGX = SGX / NROOT
      DENOM = 0.
      DO I = 1,NROOT
         RTX = RTDIS (I) + GX (I) - SGX
         GX (I) = GX (I) * MAX ( RTX, 0. )
         DENOM = DENOM + GX (I)
      END DO
      IF (DENOM .le. 0.0) DENOM = 1.
      DO I = 1,NROOT
         ET (I) = ETP1A * GX (I) / DENOM
      END DO
  END SUBROUTINE TRANSP
      SUBROUTINE WDFCND (WDF,WCND,SMC,SMCMAX,BEXP,DKSAT,DWSAT, &
     & SICEMAX)
      IMPLICIT NONE
      REAL BEXP
      REAL DKSAT
      REAL DWSAT
      REAL EXPON
      REAL FACTR1
      REAL FACTR2
      REAL SICEMAX
      REAL SMC
      REAL SMCMAX
      REAL VKwgt
      REAL WCND
      REAL WDF
      FACTR1 = 0.05 / SMCMAX
      FACTR2 = SMC / SMCMAX
      FACTR1 = MIN(FACTR1,FACTR2)
      EXPON = BEXP + 2.0
      WDF = DWSAT * FACTR2 ** EXPON
      IF (SICEMAX .gt. 0.0) THEN
         VKWGT = 1./ (1. + (500.* SICEMAX)**3.)
         WDF = VKWGT * WDF + (1. - VKWGT)* DWSAT * FACTR1** EXPON
      END IF
      EXPON = (2.0 * BEXP) + 3.0
      WCND = DKSAT * FACTR2 ** EXPON
  END SUBROUTINE WDFCND
      SUBROUTINE SFCDIF_off (ZLM,Z0,THZ0,THLM,SFCSPD,CZIL,AKMS,AKHS)
      IMPLICIT NONE
      REAL WWST, WWST2, G, VKRM, EXCM, BETA, BTG, ELFC, WOLD, WNEW
      REAL PIHF, EPSU2, EPSUST, EPSIT, EPSA, ZTMIN, ZTMAX, HPBL, &
     & SQVISC
      REAL RIC, RRIC, FHNEU, RFC, RFAC, ZZ, PSLMU, PSLMS, PSLHU, &
     & PSLHS
      REAL XX, PSPMU, YY, PSPMS, PSPHU, PSPHS, ZLM, Z0, THZ0, THLM
      REAL SFCSPD, CZIL, AKMS, AKHS, ZILFC, ZU, ZT, RDZ, CXCH
      REAL DTHV, DU2, BTGH, WSTAR2, USTAR, ZSLU, ZSLT, RLOGU, RLOGT
      REAL RLMO, ZETALT, ZETALU, ZETAU, ZETAT, XLU4, XLT4, XU4, XT4
      REAL XLU, XLT, XU, XT, PSMZ, SIMM, PSHZ, SIMH, USTARK, RLMN, &
     & RLMA
      INTEGER ITRMX, ILECH, ITR
      PARAMETER &
     & (WWST = 1.2,WWST2 = WWST * WWST,G = 9.8,VKRM = 0.40, &
     & EXCM = 0.001 &
     & ,BETA = 1./270.,BTG = BETA * G,ELFC = VKRM * BTG &
     & ,WOLD =.15,WNEW = 1. - WOLD,ITRMX = 05, &
     & PIHF = 3.14159265/2.)
      PARAMETER &
     & (EPSU2 = 1.E-4,EPSUST = 0.07,EPSIT = 1.E-4,EPSA = 1.E-8 &
     & ,ZTMIN = -5.,ZTMAX = 1.,HPBL = 1000.0 &
     & ,SQVISC = 258.2)
      PARAMETER &
     & (RIC = 0.183,RRIC = 1.0/ RIC,FHNEU = 0.8,RFC = 0.191 &
     & ,RFAC = RIC / (FHNEU * RFC * RFC))
      PSLMU (ZZ)= -0.96* log (1.0-4.5* ZZ)
      PSLMS (ZZ)= ZZ * RRIC -2.076* (1. -1./ (ZZ +1.))
      PSLHU (ZZ)= -0.96* log (1.0-4.5* ZZ)
      PSLHS (ZZ)= ZZ * RFAC -2.076* (1. -1./ (ZZ +1.))
      PSPMU (XX)= -2.* log ( (XX +1.)*0.5) - log ( (XX * XX +1.)*0.5) &
     & +2.* ATAN (XX) &
     &- PIHF
      PSPMS (YY)= 5.* YY
      PSPHU (XX)= -2.* log ( (XX * XX +1.)*0.5)
      PSPHS (YY)= 5.* YY
      ILECH = 0
      ZILFC = - CZIL * VKRM * SQVISC
      ZU = Z0
      RDZ = 1./ ZLM
      CXCH = EXCM * RDZ
      DTHV = THLM - THZ0
      DU2 = MAX (SFCSPD * SFCSPD,EPSU2)
      BTGH = BTG * HPBL
      IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
         WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
      ELSE
         WSTAR2 = 0.0
      END IF
      USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
      ZT = EXP (ZILFC * SQRT (USTAR * Z0))* Z0
      ZSLU = ZLM + ZU
      ZSLT = ZLM + ZT
      RLOGU = log (ZSLU / ZU)
      RLOGT = log (ZSLT / ZT)
      RLMO = ELFC * AKHS * DTHV / USTAR **3
      DO ITR = 1,ITRMX
         ZETALT = MAX (ZSLT * RLMO,ZTMIN)
         RLMO = ZETALT / ZSLT
         ZETALU = ZSLU * RLMO
         ZETAU = ZU * RLMO
         ZETAT = ZT * RLMO
         IF (ILECH .eq. 0) THEN
            IF (RLMO .lt. 0.)THEN
               XLU4 = 1. -16.* ZETALU
               XLT4 = 1. -16.* ZETALT
               XU4 = 1. -16.* ZETAU
               XT4 = 1. -16.* ZETAT
               XLU = SQRT (SQRT (XLU4))
               XLT = SQRT (SQRT (XLT4))
               XU = SQRT (SQRT (XU4))
               XT = SQRT (SQRT (XT4))
               PSMZ = PSPMU (XU)
               SIMM = PSPMU (XLU) - PSMZ + RLOGU
               PSHZ = PSPHU (XT)
               SIMH = PSPHU (XLT) - PSHZ + RLOGT
            ELSE
               ZETALU = MIN (ZETALU,ZTMAX)
               ZETALT = MIN (ZETALT,ZTMAX)
               PSMZ = PSPMS (ZETAU)
               SIMM = PSPMS (ZETALU) - PSMZ + RLOGU
               PSHZ = PSPHS (ZETAT)
               SIMH = PSPHS (ZETALT) - PSHZ + RLOGT
            END IF
         ELSE
            IF (RLMO .lt. 0.)THEN
               PSMZ = PSLMU (ZETAU)
               SIMM = PSLMU (ZETALU) - PSMZ + RLOGU
               PSHZ = PSLHU (ZETAT)
               SIMH = PSLHU (ZETALT) - PSHZ + RLOGT
            ELSE
               ZETALU = MIN (ZETALU,ZTMAX)
               ZETALT = MIN (ZETALT,ZTMAX)
               PSMZ = PSLMS (ZETAU)
               SIMM = PSLMS (ZETALU) - PSMZ + RLOGU
               PSHZ = PSLHS (ZETAT)
               SIMH = PSLHS (ZETALT) - PSHZ + RLOGT
            END IF
         END IF
         USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST)
         ZT = EXP (ZILFC * SQRT (USTAR * Z0))* Z0
         ZSLT = ZLM + ZT
         RLOGT = log (ZSLT / ZT)
         USTARK = USTAR * VKRM
         AKMS = MAX (USTARK / SIMM,CXCH)
         AKHS = MAX (USTARK / SIMH,CXCH)
         IF (BTGH * AKHS * DTHV .ne. 0.0) THEN
            WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2./3.)
         ELSE
            WSTAR2 = 0.0
         END IF
         RLMN = ELFC * AKHS * DTHV / USTAR **3
         RLMA = RLMO * WOLD+ RLMN * WNEW
         RLMO = RLMA
      END DO
  END SUBROUTINE SFCDIF_off
END MODULE module_sf_noahlsm