SUBROUTINE APREP(FC,FG,FCS,FGS,AILCAN,AILCNS,FSVF,FSVFS,  1,2
     1            FRAINC,FSNOWC,RAICAN,RAICNS,SNOCAN,SNOCNS,DISP,
     2            DISPS,ZOMLNC,ZOMLCS,ZOELNC,ZOELCS,ZOMLNG,ZOMLNS, 
     3            ZOELNG,ZOELNS,CHCAP,CHCAPS,CMASSC,CMASCS,CWCAP,
     4            CWCAPS,DLEAF,FROOT,ZPLIMC,ZPLIMG,ZPLMCS,ZPLMGS,
     5            HTCC,HTCS,HTC,WTRC,WTRS,WTRG,CMAI,
     6            AIL,AILS,FCAN,FCANS,PSIGND,
     7            FCANMX,ZOLN,AILMAX,AILMIN,CWGTMX,ZRTMAX,
     8            AILDAT,HGTDAT,THLIQ,THICE,TBAR,RCAN,SCAN,
     9            TCAN,GROWTH,ZSNOW,TSNOW,FSNOW,RHOSNO,SNO,Z0ORO,
     A            ZBLEND,TA,RHOAIR,RADJ,ILAND,DLON,DELZW,ZBOTW,
     B            THPOR,THLMIN,PSISAT,BI,PSIWLT,HCPS,ISAND,
     C            ILG,IL1,IL2,IC,ICP1,IG,IDAY,IDISP,IZREF,ILAI,IHGT,
     D            RMAT,H,HS,CWCPAV,GROWA,GROWN,GROWB,
     E            RRESID,SRESID,FRTOT,jl )               
C
C     * NOV 2003  - Y.DELAGE.   MODIFY SOME DO LOOPS TO SATISFY THE LINUX COMPILER
C     * JUL 23/03 - Y.DELAGE.   ADD CONTRIBUTION OF SUBGRID SCALE 
C     *                         TOPOGRAPHY TO Z0
C     * JUL 02/03 - D.VERSEGHY. RATIONALIZE ASSIGNMENT OF RESIDUAL
C     *                         CANOPY MOISTURE TO SOIL LAYERS.
C     * DEC 05/02 - Y.DELAGE/D.VERSEGHY. ADD PARTS OF CANOPY AIR MASS TO 
C     *                         CANOPY MASS ONLY IF IDISP=0 OR IZREF=2.
C     *                         ALSO, REPLACE LOGARITHMIC AVERAGING OF
C     *                         ROUGHNESS HEIGHTS WITH BLENDING HEIGHT
C     *                         AVERAGING.
C     * JUL 31/02 - D.VERSEGHY. MOVE CALCULATION OF PSIGND AND FULL 
C     *                         CALCULATION OF FROOT INTO THIS ROUTINE
C     *                         FROM TPREP; REMOVE CALCULATION OF RCMIN.
C     *                         SHORTENED CLASS3 COMMON BLOCK.
C     * JUL 23/02 - D.VERSEGHY. MOVE ADDITION OF AIR TO CANOPY MASS
C     *                         INTO THIS ROUTINE; SHORTENED CLASS4
C     *                         COMMON BLOCK.
C     * MAR 18/02 - D.VERSEGHY. MOVE CALCULATION OF SOIL PROPERTIES INTO
C     *                         ROUTINE "CLASSB"; ALLOW FOR ASSIGNMENT 
C     *                         OF SPECIFIED TIME-VARYING VEGETATION
C     *                         HEIGHT AND LEAF AREA INDEX.
C     * SEP 19/00 - D.VERSEGHY. ADD CALCULATION OF VEGETATION-DEPENDENT
C     *                         COEFFICIENTS FOR DETERMINATION OF STOMATAL 
C     *                         RESISTANCE.
C     * APR 12/00 - D.VERSEGHY. RCMIN NOW VARIES WITH VEGETATION TYPE:
C     *                         PASS IN BACKGROUND ARRAY "RCMINX".
C     * DEC 16/99 - A.WU/D.VERSEGHY. ADD CALCULATION OF NEW LEAF DIMENSION 
C     *                              PARAMETER FOR REVISED CANOPY TURBULENT
C     *                              TRANSFER FORMULATION.
C     * NOV 16/98 - M.LAZARE.   "DLON" NOW PASSED IN AND USED DIRECTLY
C     *                         (INSTEAD OF INFERRING FROM "LONSL" AND 
C     *                         "ILSL" WHICH USED TO BE PASSED) TO CALCULATE
C     *                         GROWTH INDEX. THIS IS DONE TO MAKE THE PHYSICS
C     *                         PLUG COMPATIBLE FOR USE WITH THE RCM WHICH 
C     *                         DOES NOT HAVE EQUALLY-SPACED LONGITUDES.
C     * JUN 20/97 - D.VERSEGHY. CLASS - VERSION 2.7.
C     *                         MODIFICATIONS TO ALLOW FOR VARIABLE
C     *                         SOIL PERMEABLE DEPTH.
C     * OCT 11/96 - D.VERSEGHY. CLASS - VERSION 2.6.
C     *                         BUG FIX: TO AVOID ROUND-OFF ERRORS,
C     *                         SET CANOPY COVER EQUAL TO 1 IF THE
C     *                         CALCULATED SUM OF FC AND FCS IS
C     *                         VERY CLOSE TO 1.
C     * JAN 02/96 - D.VERSEGHY. CLASS - VERSION 2.5.
C     *                         COMPLETION OF ENERGY BALANCE 
C     *                         DIAGNOSTICS.
C     *                         ALSO CORRECT BUG IN CALCULATION OF
C     *                         DEGLON, AND USE IDISP TO DETERMINE
C     *                         METHOD OF CALCULATING DISP AND DISPS.
C     * AUG 30/95 - D.VERSEGHY. CLASS - VERSION 2.4.
C     *                         VARIABLE SURFACE DETENTION CAPACITY
C     *                         IMPLEMENTED.
C     * AUG 16/95 - D.VERSEGHY. THREE NEW ARRAYS TO COMPLETE WATER
C     *                         BALANCE DIAGNOSTICS.
C     * NOV 22/94 - D.VERSEGHY. CLASS - VERSION 2.3.
C     *                         RATIONALIZE CALCULATION OF RCMIN. 
C     * NOV 12/94 - D.VERSEGHY. FIX BUGS IN SENESCING LIMB OF CROP
C     *                         GROWTH INDEX AND IN CANOPY MASS
C     *                         CALCULATION.
C     * MAY 06/93 - M.LAZARE/D.VERSEGHY. CLASS - VERSION 2.1.
C     *                                  USE NEW "CANEXT" CANOPY 
C     *                                  EXTINCTION ARRAY TO DEFINE
C     *                                  SKY-VIEW FACTORS. ALSO, CORRECT
C     *                                  MINOR BUG WHERE HAD "IF(IN.LE.9)..."
C     *                                  INSTEAD OF "IF(IN.GT.9)...".  
C     * DEC 12/92 - M.LAZARE.   MODIFIED FOR MULTIPLE LATITUDES.
C     * OCT 24/92 - D.VERSEGHY/M.LAZARE. REVISED AND VECTORIZED CODE 
C     *                                  FOR MODEL VERSION GCM7.
C     * AUG 12/91 - D.VERSEGHY. CALCULATION OF LAND SURFACE CANOPY 
C     *                         PARAMETERS.
C
       IMPLICIT NONE
       integer jl
       INTEGER ILG,IL1,IL2,IC,ICP1,IG,IDAY,IDISP,IZREF,ILAI,IHGT
       INTEGER i,j,il,in,nl
       REAL PI,day,deglon,growg,fsum,snoi,zsnadd
       real zroot,fcoeff,psii,lzblend,lz0oro,lzomx
       real thsum
C                                                                                 
C     * OUTPUT ARRAYS USED ELSEWHERE IN CLASS.                                    
C                                                                                 
      REAL FC    (ILG),   FG    (ILG),   FCS   (ILG),   FGS   (ILG),          
     1     AILCAN(ILG),   AILCNS(ILG),   FSVF  (ILG),   FSVFS (ILG),   
     2     FRAINC(ILG),   FSNOWC(ILG),   RAICAN(ILG),   RAICNS(ILG),   
     3     SNOCAN(ILG),   SNOCNS(ILG),   DISP  (ILG),   DISPS (ILG),  
     4     ZOMLNC(ILG),   ZOMLCS(ILG),   ZOELNC(ILG),   ZOELCS(ILG),          
     5     ZOMLNG(ILG),   ZOMLNS(ILG),   ZOELNG(ILG),   ZOELNS(ILG),          
     6     DLEAF (ILG),   CHCAP (ILG),   CHCAPS(ILG),   
     7     CMASSC(ILG),   CMASCS(ILG),   CWCAP (ILG),   CWCAPS(ILG),   
     8     ZPLIMC(ILG),   ZPLIMG(ILG),   ZPLMCS(ILG),   ZPLMGS(ILG),   
     9     HTCC  (ILG),   HTCS  (ILG),   WTRC  (ILG),   WTRS  (ILG),   
     A     WTRG  (ILG),   CMAI  (ILG)  
C                                                                                 
      REAL FROOT (ILG,IG),  HTC   (ILG,IG)
C                                                                                 
C     * OUTPUT ARRAYS ONLY USED ELSEWHERE IN CLASSA.                              
C                                                                                 
      REAL AIL   (ILG,IC),  AILS  (ILG,IC),  
     1     FCAN  (ILG,IC),  FCANS (ILG,IC),  PSIGND(ILG)
C                                                                                 
C     * INPUT ARRAYS.                                      
C                                                                                 
      REAL FCANMX(ILG,ICP1),                 ZOLN  (ILG,ICP1),                    
     1     AILMAX(ILG,IC),  AILMIN(ILG,IC),  CWGTMX(ILG,IC),                      
     2     ZRTMAX(ILG,IC),  AILDAT(ILG,IC),  HGTDAT(ILG,IC),
     3     THLIQ (ILG,IG),  THICE (ILG,IG),  TBAR  (ILG,IG) 
C                                                                                 
      REAL RCAN  (ILG),     SCAN  (ILG),     TCAN  (ILG),     
     1     GROWTH(ILG),     ZSNOW (ILG),     TSNOW (ILG),          
     2     FSNOW (ILG),     RHOSNO(ILG),     SNO   (ILG),     
     3     TA    (ILG),     RHOAIR(ILG),     DLON  (ILG),
     4     ZBLEND(ILG),     Z0ORO (ILG)
C
      REAL RADJ(ILG) 
C
      INTEGER ILAND (ILG)
C                                                                                 
C     * SOIL PROPERTY ARRAYS.                                     
C                                                                                 
      REAL DELZW(ILG,IG),   ZBOTW(ILG,IG),   THPOR(ILG,IG),   
     1     THLMIN(ILG,IG),  PSISAT(ILG,IG),  BI   (ILG,IG),
     2     PSIWLT(ILG,IG),  HCPS (ILG,IG)
C                                                                                 
      INTEGER               ISAND (ILG,IG)
C                                                                                 
C     * WORK ARRAYS NOT USED ELSEWHERE IN CLASSA.                          
C                                                                                 
      REAL RMAT (ILG,IC,IG),H     (ILG,IC),  HS    (ILG,IC),                      
     1     CWCPAV(ILG),     GROWA (ILG),     GROWN (ILG),     
     2     GROWB (ILG),     RRESID(ILG),     SRESID(ILG),
     3     FRTOT (ILG) 
C
C     AUTOMATIC ARRAYS
      real THICEI(ilg),thliqi(ilg)
C
#include "class_com.cdk"
      PI=3.141592654
C-----------------------------------------------------------------------          
      IF(IC.NE.4)                               CALL XIT('APREP',-2)
C
C     * INITIALIZE DIAGNOSTIC AND OTHER ARRAYS.
C
      DO 100 I=IL1,IL2
          HTCC(I) =0.0
          HTCS(I) =0.0
          HTC(I,1)=0.0
          HTC(I,2)=0.0
          HTC(I,3)=0.0
          WTRC(I) =0.0
          WTRS(I) =0.0
          WTRG(I) =0.0
          FRTOT(I)=0.0
          PSIGND(I)=1.0E+5
  100 CONTINUE
C 
C     * DETERMINE GROWTH INDEX FOR CROPS (VEGETATION TYPE 3).
C     * MUST USE UN-GATHERED LONGITUDES TO COMPUTE ACTUAL LONGITUDE/
C     * LATITUDE VALUES.  
C                                                                                 
      DAY=FLOAT(IDAY)                                                             
      DO 120 I=IL1,IL2
          IL = ILAND(I)
          IN = INT( (RADJ(IL)+PI/2.0)*18.0/PI ) + 1
          DEGLON=DLON(IL)
          IF(DEGLON.GT.190. .AND. DEGLON.LT.330.)              THEN           
              NL=2                                                            
          ELSE                                                                
              NL=1                                                            
          ENDIF                                                               
          IF(GROWYR(IN,1,NL).LT.0.1)                           THEN           
              GROWA(I)=1.0                                                    
          ELSE                                                                
              IF(IN.GT.9)                                 THEN
                IF(DAY.GE.GROWYR(IN,2,NL).AND.DAY.LT.GROWYR(IN,3,NL))           
     1              GROWA(I)=1.0                                                
                IF(DAY.GE.GROWYR(IN,4,NL).OR.DAY.LT.GROWYR(IN,1,NL))            
     1              GROWA(I)=0.0                                
              ELSE
                IF(DAY.GE.GROWYR(IN,2,NL).OR.DAY.LT.GROWYR(IN,3,NL))           
     1              GROWA(I)=1.0                                                
                IF(DAY.GE.GROWYR(IN,4,NL).AND.DAY.LT.GROWYR(IN,1,NL))            
     1              GROWA(I)=0.0                                
              ENDIF                
              IF(DAY.GE.GROWYR(IN,1,NL).AND.DAY.LT.GROWYR(IN,2,NL))           
     1            GROWA(I)=(DAY-GROWYR(IN,1,NL))/(GROWYR(IN,2,NL)-            
     2                     GROWYR(IN,1,NL))                                   
              IF(DAY.GE.GROWYR(IN,3,NL).AND.DAY.LT.GROWYR(IN,4,NL))           
     1            GROWA(I)=(GROWYR(IN,4,NL)-DAY)/(GROWYR(IN,4,NL)-            
     2                     GROWYR(IN,3,NL))                                   
          ENDIF                                                               
  120 CONTINUE                                                                
C                                                                                 
C     * DETERMINE GROWTH INDICES FOR NEEDLELEAF TREES, BROADLEAF
C     * TREES AND GRASS (VEGETATION TYPES 1, 2 AND 4); CALCULATE
C     * VEGETATION HEIGHT, CORRECTED FOR GROWTH STAGE FOR CROPS
C     * AND FOR SNOW COVER FOR CROPS AND GRASS; CALCULATE CURRENT
C     * LEAF AREA INDEX FOR FOUR VEGETATION TYPES.
C
      DO 150 I=IL1,IL2                                                            
          GROWN(I)=ABS(GROWTH(I))                                                 
          GROWG=1.0                                                               
          IF(GROWTH(I).GT.0.0)                      THEN                          
              GROWB(I)=MIN(1.0,GROWTH(I)*2.0)                                   
          ELSE                                                                    
              GROWB(I)=MAX(0.0,(ABS(GROWTH(I))*2.0-1.0))                        
          ENDIF                                                                   
C                                                                                 
          IF(IHGT.EQ.0) THEN
              H(I,1)=10.0*ZOLN(I,1)
              H(I,2)=10.0*ZOLN(I,2)                               
              H(I,3)=10.0*ZOLN(I,3)*GROWA(I)                   
              H(I,4)=10.0*ZOLN(I,4)                                              
          ELSE
              H(I,1)=HGTDAT(I,1)
              H(I,2)=HGTDAT(I,2)
              H(I,3)=HGTDAT(I,3)
              H(I,4)=HGTDAT(I,4)
          ENDIF
          HS(I,1)=H(I,1)                                                          
          HS(I,2)=H(I,2)                                                          
          HS(I,3)=MAX(H(I,3)-ZSNOW(I),1.0E-3)                                       
          HS(I,4)=MAX(H(I,4)-ZSNOW(I),1.0E-3)                                       
C                                                                                 
          IF(ILAI.EQ.0) THEN
              AIL(I,1)=AILMIN(I,1)+GROWN(I)*(AILMAX(I,1)-AILMIN(I,1))                 
              AIL(I,2)=AILMIN(I,2)+GROWB(I)*(AILMAX(I,2)-AILMIN(I,2))                 
              AIL(I,3)=AILMIN(I,3)+GROWA(I)*(AILMAX(I,3)-AILMIN(I,3))                 
              AIL(I,4)=AILMIN(I,4)+GROWG   *(AILMAX(I,4)-AILMIN(I,4))                 
          ELSE
              AIL(I,1)=AILDAT(I,1)
              AIL(I,2)=AILDAT(I,2)
              AIL(I,3)=AILDAT(I,3)
              AIL(I,4)=AILDAT(I,4)
          ENDIF
          AILS(I,1)=AIL(I,1)                                                      
          AILS(I,2)=AIL(I,2)                                                      
          IF(H(I,3).GT.0.0) THEN                                                  
              AILS(I,3)=AIL(I,3)*HS(I,3)/H(I,3)                                   
          ELSE                                                                    
              AILS(I,3)=0.0                                                       
          ENDIF                                                                   
          IF(H(I,4).GT.0.0) THEN                                                  
              AILS(I,4)=AIL(I,4)*HS(I,4)/H(I,4)                                   
          ELSE                                                                    
              AILS(I,4)=0.0                                                       
          ENDIF                                                                   
  150 CONTINUE                                                                    
C
C     * ADJUST FRACTIONAL COVERAGE OF GRID CELL FOR CROPS AND
C     * GRASS IF LAI FALLS BELOW 1.0 DUE TO GROWTH STAGE OR
C     * SNOW COVER; RESET LAI TO 1.0; CALCULATE RESULTANT
C     * GRID CELL COVERAGE BY CANOPY, BARE GROUND, CANOPY OVER
C     * SNOW AND SNOW OVER BARE GROUND.
C     * ALSO CALCULATE SURFACE DETENTION CAPACITY FOR FOUR
C     * GRID CELL SUBAREAS BASED ON VALUES SUPPLIED BY 
C     * U. OF WATERLOO:
C     *        IMPERMEABLE SURFACES: 0.001 M.
C     *        BARE SOIL:            0.002 M.
C     *        LOW VEGETATION:       0.003 M.
C     *        FOREST:               0.01  M.
C     * FOR NOW, ASSIGN WETLANDS A VALUE OF 0.10 M.
C                                                                                 
      DO 175 I=IL1,IL2                                                            
          FCAN(I,1)=FCANMX(I,1)*(1.0-FSNOW(I))                                    
          FCAN(I,2)=FCANMX(I,2)*(1.0-FSNOW(I))                                    
          IF(AIL(I,3).LT.1.0) THEN                                                
              FCAN(I,3)=FCANMX(I,3)*(1.0-FSNOW(I))*AIL(I,3)                       
              AIL (I,3)=1.0                                                       
          ELSE                                                                    
              FCAN(I,3)=FCANMX(I,3)*(1.0-FSNOW(I))                                
          ENDIF                                                                   
          IF(AIL(I,4).LT.1.0) THEN                                                
              FCAN(I,4)=FCANMX(I,4)*(1.0-FSNOW(I))*AIL(I,4)                       
              AIL (I,4)=1.0                                                       
          ELSE                                                                    
              FCAN(I,4)=FCANMX(I,4)*(1.0-FSNOW(I))                                
          ENDIF                                                                   
C                                                                                 
          FCANS(I,1)=FCANMX(I,1)*FSNOW(I)                                         
          FCANS(I,2)=FCANMX(I,2)*FSNOW(I)                                         
          IF(AILS(I,3).LT.1.0) THEN                                               
              FCANS(I,3)=FCANMX(I,3)*FSNOW(I)*AILS(I,3)                           
              AILS (I,3)=1.0                                                      
          ELSE                                                                    
              FCANS(I,3)=FCANMX(I,3)*FSNOW(I)                                     
          ENDIF                                                                   
          IF(AILS(I,4).LT.1.0) THEN                                               
              FCANS(I,4)=FCANMX(I,4)*FSNOW(I)*AILS(I,4)                           
              AILS (I,4)=1.0                                                      
          ELSE                                                                    
              FCANS(I,4)=FCANMX(I,4)*FSNOW(I)                                     
          ENDIF                                                                   
                                                                          
          do j=1,ic
             if(fcan(i,j).lt.1.e-5) fcan(i,j)=0.
             if(fcans(i,j).lt.1.e-5) fcans(i,j)=0.
          enddo
          FC (I)=FCAN(I,1)+FCAN(I,2)+FCAN(I,3)+FCAN(I,4)                          
          FG (I)=1.0-FSNOW(I)-FC(I)                                               
          FCS(I)=FCANS(I,1)+FCANS(I,2)+FCANS(I,3)+FCANS(I,4)                      
          FGS(I)=FSNOW(I)-FCS(I)                                                  
          IF(ABS(1.0-FCS(I)-FC(I)).LT.1.0E-5) THEN
              FCS(I)=MIN(FSNOW(I),1.0)
              FC(I)=1.0-FCS(I)
              FGS(I)=0.0
              FG(I)=0.0
          ENDIF
          FC (I)=MAX(FC (I),0.0)
          FG (I)=MAX(FG (I),0.0)
          FCS(I)=MAX(FCS(I),0.0)
          FGS(I)=MAX(FGS(I),0.0)
          FSUM=(FCS(I)+FGS(I)+FC(I)+FG(I))
          FC (I)=FC (I)/FSUM
          FG (I)=FG (I)/FSUM
          FCS(I)=FCS(I)/FSUM
          FGS(I)=FGS(I)/FSUM
          IF(ABS(1.0-FCS(I)-FGS(I)-FC(I)-FG(I)).GT.1.0E-5) 
     1                                   CALL XIT('APREP',-1)
C
          IF(ISAND(I,1).EQ.-2) THEN
              ZPLIMG(I)=0.10
              ZPLMGS(I)=0.10
              ZPLIMC(I)=0.10
              ZPLMCS(I)=0.10
          ELSE
              IF(ISAND(I,1).EQ.-4) ZPLIMG(I)=0.0
              IF(ISAND(I,1).EQ.-3) ZPLIMG(I)=0.001
              IF(ISAND(I,1).GT. 0) ZPLIMG(I)=0.002
              IF(FGS(I).GT.0.0) THEN
                  ZPLMGS(I)=(ZPLIMG(I)*FSNOW(I)*(1.0-FCANMX(I,1)-
     1                      FCANMX(I,2)-FCANMX(I,3)-FCANMX(I,4))+
     2                      ZPLIMG(I)*(FSNOW(I)*FCANMX(I,3)-
     3                      FCANS(I,3))+0.003*(FSNOW(I)*FCANMX(I,4)-
     4                      FCANS(I,4)))/FGS(I)
              ELSE
                  ZPLMGS(I)=0.0
              ENDIF
              IF(FC(I).GT.0.0) THEN
                  ZPLIMC(I)=(0.01*(FCAN(I,1)+FCAN(I,2))+0.003*
     1                      (FCAN(I,3)+FCAN(I,4)))/FC(I)
              ELSE
                  ZPLIMC(I)=0.0
              ENDIF
              IF(FCS(I).GT.0.0) THEN
                  ZPLMCS(I)=(0.01*(FCANS(I,1)+FCANS(I,2))+0.003*
     1                      (FCANS(I,3)+FCANS(I,4)))/FCS(I)
              ELSE
                  ZPLMCS(I)=0.0
              ENDIF
          ENDIF
C
  175 CONTINUE                                                                    
C                                                                                 
C     * PARTITION INTERCEPTED LIQUID AND FROZEN MOISTURE BETWEEN
C     * CANOPY OVERLYING BARE GROUND AND CANOPY OVERLYING SNOW; ADD
C     * RESIDUAL TO SOIL MOISTURE OR SNOW (IF PRESENT); CALCULATE
C     * RELATIVE FRACTIONS OF LIQUID AND FROZEN INTERCEPTED 
C     * MOISTURE ON CANOPY.
C                                                                                 
      DO 190 I=IL1,IL2                                                            
          IF(FC(I).GT.0.)                                     THEN                
              AILCAN(I)=(FCAN(I,1)*AIL(I,1)+FCAN(I,2)*AIL(I,2)+                   
     1                   FCAN(I,3)*AIL(I,3)+FCAN(I,4)*AIL(I,4))/FC(I)             
          ELSE                                                                    
              AILCAN(I)=0.0                                                       
          ENDIF                                                                   
          IF(FCS(I).GT.0.)                                    THEN                
              AILCNS(I)=(FCANS(I,1)*AILS(I,1)+FCANS(I,2)*AILS(I,2)+               
     1                   FCANS(I,3)*AILS(I,3)+FCANS(I,4)*AILS(I,4))/              
     2                   FCS(I)                                                   
          ELSE                                                                    
              AILCNS(I)=0.0                                                       
          ENDIF                                                                   
C                                                                                 
          CWCAP (I)=0.20*AILCAN(I)                                                
          CWCAPS(I)=0.20*AILCNS(I)                                                
          RRESID(I)=0.0
          SRESID(I)=0.0
          IF(RCAN(I).GT.0. .AND. (FC(I)+FCS(I)).LE.1.0E-8)    THEN
              RRESID(I)=RRESID(I)+RCAN(I)
              RCAN(I)=0.0
          ENDIF
          IF(SCAN(I).GT.0. .AND. (FC(I)+FCS(I)).LE.1.0E-8)    THEN
              SRESID(I)=SRESID(I)+SCAN(I)
              SCAN(I)=0.0
          ENDIF
          IF(RCAN(I).GT.0. .AND. (FC(I)+FCS(I)).GT.0.)        THEN                
              RCAN(I)=RCAN(I)/(FC(I)+FCS(I))                                      
              IF(AILCAN(I).GT.0.0)                 THEN                           
                  RAICAN(I)=RCAN(I)*(FC(I)+FCS(I))/(FC(I)+FCS(I)*                 
     1                      AILCNS(I)/AILCAN(I))                                  
              ELSE                                                                
                  RAICAN(I)=0.0                                                   
              ENDIF                                                               
              IF(AILCNS(I).GT.0.0)                 THEN                           
                  RAICNS(I)=RCAN(I)*(FC(I)+FCS(I))/(FCS(I)+FC(I)*                 
     1                      AILCAN(I)/AILCNS(I))                                  
              ELSE                                                                
                  RAICNS(I)=0.0                                                   
              ENDIF                                                               
          ELSE                                                                    
              RAICAN(I)=0.0                                                       
              RAICNS(I)=0.0                                                       
          ENDIF                                                                   
C                                                                                 
          IF(SCAN(I).GT.0. .AND. (FC(I)+FCS(I)).GT.0.)        THEN                
              SCAN(I)=SCAN(I)/(FC(I)+FCS(I))                                      
              IF(AILCAN(I).GT.0.0)                 THEN                           
                  SNOCAN(I)=SCAN(I)*(FC(I)+FCS(I))/(FC(I)+FCS(I)*                 
     1                      AILCNS(I)/AILCAN(I))                                  
              ELSE                                                                
                  SNOCAN(I)=0.0                                                   
              ENDIF                                                               
              IF(AILCNS(I).GT.0.0)                 THEN                           
                  SNOCNS(I)=SCAN(I)*(FC(I)+FCS(I))/(FCS(I)+FC(I)*                 
     1                      AILCAN(I)/AILCNS(I))                                  
              ELSE                                                                
                  SNOCNS(I)=0.0                                                   
              ENDIF                                                               
          ELSE                                                                    
              SNOCAN(I)=0.0                                                       
              SNOCNS(I)=0.0                                                       
          ENDIF                                                                   
C                                                                                 
          IF((FC(I)+FCS(I)).GT.0.)                 THEN                           
              CWCPAV(I)=(FC(I)*CWCAP(I)+FCS(I)*CWCAPS(I))/(FC(I)+FCS(I))          
          ELSE                                                                    
              CWCPAV(I)=0.0                                                       
          ENDIF                                                                   
          IF(CWCPAV(I).GT.0.0)                     THEN                           
              FRAINC(I)=RCAN(I)/MAX((RCAN(I)+SCAN(I)),CWCPAV(I))                
              FSNOWC(I)=SCAN(I)/MAX((RCAN(I)+SCAN(I)),CWCPAV(I))                
          ELSE                                                                    
              FRAINC(I)=0.0                                                       
              FSNOWC(I)=0.0                                                       
          ENDIF                                                                   
C                                                                                 
          IF((RAICAN(I)+SNOCAN(I)).GT.CWCAP(I)) THEN
              RRESID(I)=RRESID(I)+FC(I)*(RAICAN(I)-FRAINC(I)*CWCAP(I))
              SRESID(I)=SRESID(I)+FC(I)*(SNOCAN(I)-FSNOWC(I)*CWCAP(I))
              RAICAN(I)=FRAINC(I)*CWCAP(I)
              SNOCAN(I)=FSNOWC(I)*CWCAP(I)
          ENDIF
C
          IF((RAICNS(I)+SNOCNS(I)).GT.CWCAPS(I)) THEN
              RRESID(I)=RRESID(I)+FCS(I)*(RAICNS(I)-FRAINC(I)*CWCAPS(I))
              SRESID(I)=SRESID(I)+FCS(I)*(SNOCNS(I)-FSNOWC(I)*CWCAPS(I))
              RAICNS(I)=FRAINC(I)*CWCAPS(I)
              SNOCNS(I)=FSNOWC(I)*CWCAPS(I)
          ENDIF
C
          WTRC (I)=WTRC(I)-(RRESID(I)+SRESID(I))/DELT
          HTCC (I)=HTCC(I)-TCAN(I)*(SPHW*RRESID(I)+SPHICE*SRESID(I))/
     1             DELT
          IF(FSNOW(I).GT.0.0)                      THEN                           
              SNOI=SNO(I)
              ZSNADD=SRESID(I)/(RHOSNO(I)*FSNOW(I))                               
              ZSNOW(I)=ZSNOW(I)+ZSNADD
              SNO(I)=ZSNOW(I)*FSNOW(I)*RHOSNO(I)                                  
              TSNOW(I)=(TCAN(I)*SPHICE*SRESID(I)+TSNOW(I)*HCPICE*
     1                 SNOI/RHOICE)/(HCPICE*SNO(I)/RHOICE)
              HTCS (I)=HTCS(I)+TCAN(I)*SPHICE*SRESID(I)/DELT
              WTRS (I)=WTRS(I)+SRESID(I)/DELT
              SRESID(I)=0.0
          ENDIF 
  190 continue
C
          DO 200 J=1,IG
          do i=il1,il2
              thliqi(I)=0.
          enddo
          do i=il1,il2
              IF(DELZW(I,J).GT.0.0 .AND. (RRESID(I).GT.0.0
     1                  .OR. SRESID(I).GT.0.0))         then    
                  THSUM=THLIQ(I,J)+THICE(I,J)*RHOICE/RHOW+
     1                (RRESID(I)+SRESID(I))/(RHOW*DELZW(I,J))
                  IF(THSUM.LE.THPOR(I,J)) THEN
                      THICEI(I)=THICE(I,J)
                      THLIQI(I)=THLIQ(I,J)
                      THICE(I,J)=THICE(I,J)+SRESID(I)/
     1                    (RHOICE*DELZW(I,J))
                      THLIQ(I,J)=THLIQ(I,J)+RRESID(I)/
     1                    (RHOW*DELZW(I,J))
                  endif
              ENDIF
          enddo
          do i=il1,il2
              if(thliqi(I).gt.1.e-5) then
                      TBAR(I,J)=(TBAR(I,J)*((DELZ(J)-DELZW(I,J))*
     1                    HCPSND+DELZW(I,J)*(THLIQI(I)*HCPW+THICEI(I)*
     2                    HCPICE+(1.0-THPOR(I,J))*HCPS(I,J)))+TCAN(I)*
     3                    (RRESID(I)*HCPW/RHOW+SRESID(I)*HCPICE/RHOICE))
     4                    /((DELZ(J)-DELZW(I,J))*HCPSND+DELZW(I,J)*
     5                    (HCPW*THLIQ(I,J)+HCPICE*THICE(I,J)+HCPS(I,J)*
     6                    (1.0-THPOR(I,J))))
               endif
          enddo
           do i=il1,il2
              if(thliqi(I).gt.1.e-5) then
                      WTRG (I)=WTRG(I)+(RRESID(I)+SRESID(I))/DELT
                      HTC(I,J)=HTC(I,J)+TCAN(I)*(RRESID(I)*HCPW/RHOW+
     1                    SRESID(I)*HCPICE/RHOICE)/DELT
                      RRESID(I)=0.0
                      SRESID(I)=0.0
c                 ENDIF
              ENDIF
          enddo
  200     CONTINUE
C
C                                                                                 
C     * REMAINING CANOPY PARAMETERS.                                                
C     * FIRST, INITIALIZE WORK FIELDS FOR SUBSEQUENT CALCULATIONS FOR             
C     * BOTH SNOW-FREE AND SNOW-COVERED CASES.                                    
C                                                                                 
      DO 250 I=IL1,IL2                                                            
          DISP  (I)=0.                                                            
          ZOMLNC(I)=0.                                                            
          ZOELNC(I)=1.                                                            
          DISPS (I)=0.                                                            
          ZOMLCS(I)=0.                                                            
          ZOELCS(I)=1.                                                            
          ZOMLNG(I)=0.                                                            
          ZOELNG(I)=0.                                                            
          ZOMLNS(I)=0.                                                            
          ZOELNS(I)=0.                                                            
          CMASSC(I)=0.                                                            
          CMASCS(I)=0.                                                            
  250 CONTINUE                                                                    
C
C     * CALCULATION OF ROUGHNESS LENGTHS FOR HEAT AND MOMENTUM AND
C     * ZERO-PLANE DISPLACEMENT FOR CANOPY OVERLYING BARE SOIL AND
C     * CANOPY OVERLYING SNOW.
C                                                                                 
      DO 275 J=1,IC                                                               
      DO 275 I=IL1,IL2                                                            
          IF(FC(I).GT.0. .AND. H(I,J).GT.0.)                     THEN             
              IF(IDISP.EQ.1)   DISP(I)=DISP(I)+FCAN (I,J)*
     1                                 LOG(0.7*H(I,J))                     
              ZOMLNC(I)=ZOMLNC(I)+FCAN (I,J)/
     1                  ((LOG(ZBLEND(I)/(0.1*H(I,J))))**2)
              ZOELNC(I)=ZOELNC(I)*
     1                  (0.01*H(I,J)*H(I,J)/ZORAT(IC))**FCAN(I,J)
          ENDIF                                                                   
          IF(FCS(I).GT.0. .AND. HS(I,J).GT.0.)                   THEN             
              IF(IDISP.EQ.1)   DISPS(I)=DISPS (I)+FCANS(I,J)*
     1                         LOG(0.7*HS(I,J))                    
              ZOMLCS(I)=ZOMLCS(I)+FCANS(I,J)/
     1                  ((LOG(ZBLEND(I)/(0.1*HS(I,J))))**2)
              ZOELCS(I)=ZOELCS(I)*
     1                  (0.01*HS(I,J)*HS(I,J)/ZORAT(IC))**FCANS(I,J)
          ENDIF                                                                   
  275 CONTINUE                                                                    
C                                                                                 
      DO 290 I=IL1,IL2                                                            
          IF(FC(I).GT.0.)                                        THEN             
              IF(IDISP.EQ.1)   DISP(I)=EXP(DISP(I)/FC(I))                                        
              ZOMLNC(I)=ZBLEND(I)/EXP(SQRT(1.0/(ZOMLNC(I)/FC(I)))) 
              ZOELNC(I)=ZOELNC(I)**(1.0/FC(I))/ZOMLNC(I)
              ZOMLNC(I)=log(ZOMLNC(I))
              ZOELNC(I)=log(ZOELNC(I))
          ENDIF                                                                   
          IF(FCS(I).GT.0.)                                       THEN             
              IF(IDISP.EQ.1)   DISPS(I)=EXP(DISPS(I)/FCS(I))                                      
              ZOMLCS(I)=ZBLEND(I)/EXP(SQRT(1.0/(ZOMLCS(I)/FCS(I)))) 
              ZOELCS(I)=ZOELCS(I)**(1.0/FCS(I))/ZOMLCS(I)
              ZOMLCS(I)=log(ZOMLCS(I))
              ZOELCS(I)=max(-9.2,log(ZOELCS(I)))
          ENDIF                                                                   
  290 CONTINUE                                                                    
C                                                                                 
C     * ADJUST ROUGHNESS LENGTHS OF BARE SOIL AND SNOW-COVERED BARE
C     * SOIL FOR URBAN ROUGHNESS IF PRESENT.
C                                                                                 
      DO 300 I=IL1,IL2                                                            
          IF(FG(I).GT.0.)                                        THEN             
              IF(ISAND(I,1).NE.-4)                   THEN                         
                  ZOMLNG(I)=((FG(I)-FCANMX(I,5)*(1.0-FSNOW(I)))*ZOLNG+            
     1     FCANMX(I,5)*(1.0-FSNOW(I))*LOG(max(ZOLN(I,5),.0001)))/FG(I)           
              ELSE                                                                
                  ZOMLNG(I)=ZOLNI                                                 
              ENDIF                                                               
              ZOELNG(I)=ZOMLNG(I)-LOG(ZORATG)                                    
          ENDIF                                                                   
          IF(FGS(I).GT.0.)                                       THEN             
              ZOMLNS(I)=((FGS(I)-FCANMX(I,5)*FSNOW(I))*ZOLNS+                     
     1        FCANMX(I,5)*FSNOW(I)*LOG(max(ZOLN(I,5),.0001)))/FGS(I)                    
              ZOELNS(I)=ZOMLNS(I)-LOG(ZORATG)                                    
          ENDIF                                                                   
  300 CONTINUE                                                                   
C                                                                                 
C     * INCLUDE CONTRIBUTION FROM OROGRAPHY TO MOMENTUM ROUGNESS LENGTH
C
      DO 325 I=IL1,IL2
          LZ0ORO=LOG(Z0ORO(I)) 
          ZOMLNC(I)=MAX(ZOMLNC(I),LZ0ORO)
          ZOMLCS(I)=MAX(ZOMLCS(I),LZ0ORO)
          ZOMLNG(I)=MAX(ZOMLNG(I),LZ0ORO)
          ZOMLNS(I)=MAX(ZOMLNS(I),LZ0ORO)
  325  CONTINUE
C
C     * CALCULATE HEAT CAPACITY FOR CANOPY OVERLYING BARE SOIL AND
C     * CANOPY OVERLYING SNOW.
C     * ALSO CALCULATE INSTANTANEOUS GRID-CELL AVERAGED CANOPY MASS.
C                                                                                 
      DO 350 I=IL1,IL2                                                            
          IF(FC(I).GT.0.)                                       THEN                     
              CMASSC(I)=(FCAN(I,1)*CWGTMX(I,1)+FCAN (I,2)*CWGTMX(I,2)+                   
     1                   FCAN(I,3)*CWGTMX(I,3)*GROWA(I)+
     2                   FCAN(I,4)*CWGTMX(I,4))/FC (I)           
              IF(IDISP.EQ.0) THEN
                  CMASSC(I)=CMASSC(I)+RHOAIR(I)*(SPHAIR/SPHVEG)*0.7*
     1                     (FCAN(I,1)*H(I,1)+FCAN(I,2)*H(I,2)+
     2                      FCAN(I,3)*H(I,3)+FCAN(I,4)*H(I,4))/FC(I)
              ENDIF
              IF(IZREF.EQ.2) THEN
                  CMASSC(I)=CMASSC(I)+RHOAIR(I)*(SPHAIR/SPHVEG)*0.1*
     1                     (FCAN(I,1)*H(I,1)+FCAN(I,2)*H(I,2)+
     2                      FCAN(I,3)*H(I,3)+FCAN(I,4)*H(I,4))/FC(I)
              ENDIF
          ENDIF                                                                          
          IF(FCS(I).GT.0.)                                      THEN                     
              CMASCS(I)=(FCANS(I,1)*CWGTMX(I,1)+FCANS(I,2)*CWGTMX(I,2)+                  
     1                   FCANS(I,3)*CWGTMX(I,3)                        
     2                  *HS(I,3)/MAX(H(I,3),1.0E-12)+                            
     3                   FCANS(I,4)*CWGTMX(I,4)                         
     4                  *HS(I,4)/MAX(H(I,4),1.0E-12))/FCS(I)                     
              IF(IDISP.EQ.0) THEN
                  CMASCS(I)=CMASCS(I)+RHOAIR(I)*(SPHAIR/SPHVEG)*0.7*
     1                      (FCANS(I,1)*HS(I,1)+FCANS(I,2)*HS(I,2)+
     2                       FCANS(I,3)*HS(I,3)+FCANS(I,4)*HS(I,4))/
     3                       FCS(I)
              ENDIF
              IF(IZREF.EQ.2) THEN
                  CMASCS(I)=CMASCS(I)+RHOAIR(I)*(SPHAIR/SPHVEG)*0.1*
     1                      (FCANS(I,1)*HS(I,1)+FCANS(I,2)*HS(I,2)+
     2                       FCANS(I,3)*HS(I,3)+FCANS(I,4)*HS(I,4))/
     3                       FCS(I)
              ENDIF
          ENDIF                                                                   
          CHCAP (I)=SPHVEG*CMASSC(I)+SPHW*RAICAN(I)+SPHICE*SNOCAN(I)              
          CHCAPS(I)=SPHVEG*CMASCS(I)+SPHW*RAICNS(I)+SPHICE*SNOCNS(I)              
          HTCC  (I)=HTCC(I)-SPHVEG*CMAI(I)*TCAN(I)/DELT
          IF(CMAI(I).LT.1.0E-8 .AND. (CMASSC(I).GT.0.0 .OR.
     1              CMASCS(I).GT.0.0)) TCAN(I)=TA(I)
          CMAI  (I)=FC(I)*CMASSC(I)+FCS(I)*CMASCS(I)
          HTCC  (I)=HTCC(I)+SPHVEG*CMAI(I)*TCAN(I)/DELT
  350 CONTINUE                                                                    
C                                                                                 
C     * CALCULATE VEGETATION ROOTING DEPTH AND FRACTION OF ROOTS 
C     * IN EACH SOIL LAYER (SAME FOR SNOW/BARE SOIL CASES).
C                                                                                 
      DO 400 J=1,IC                                                               
      DO 400 I=IL1,IL2                                                            
          ZROOT=ZRTMAX(I,J)
          IF(J.EQ.3) ZROOT=ZRTMAX(I,J)*GROWA(I)                                   
          ZROOT=MIN(ZROOT,(DELZW(I,1)+DELZW(I,2)+DELZW(I,3)))
          IF(ZROOT.LE.ZBOTW(I,1))                                   THEN             
              RMAT(I,J,1)=1.0                                                     
              RMAT(I,J,2)=0.0                                                     
              RMAT(I,J,3)=0.0                                                     
          ELSE                                                                    
              FCOEFF=EXP(-3.0*ZROOT)                                              
              RMAT(I,J,1)=1.0-(EXP(-3.0*ZBOTW(I,1))-FCOEFF)/(1.0-FCOEFF)             
              IF(ZROOT.LE.ZBOTW(I,2)) THEN                                           
                  RMAT(I,J,2)=1.0-RMAT(I,J,1)                                     
                  RMAT(I,J,3)=0.0                                                 
              ELSE                                                                
                  RMAT(I,J,3)=(EXP(-3.0*ZBOTW(I,2))-FCOEFF)/(1.0-FCOEFF)             
                  RMAT(I,J,2)=1.0-RMAT(I,J,1)-RMAT(I,J,3)                         
              ENDIF                                                               
          ENDIF                                                                   
  400 CONTINUE                                                                    
C                                                                                 
      DO 500 J=1,IG                                                               
      DO 500 I=IL1,IL2                                                            
          IF((FC(I)+FCS(I)).GT.0.)                               THEN             
              FROOT(I,J)=((FCAN(I,1)+FCANS(I,1))*RMAT(I,1,J) +                    
     1                    (FCAN(I,2)+FCANS(I,2))*RMAT(I,2,J) +                    
     2                    (FCAN(I,3)+FCANS(I,3))*RMAT(I,3,J) +                    
     3                    (FCAN(I,4)+FCANS(I,4))*RMAT(I,4,J))/                    
     4                    (FC(I)+FCS(I))                                          
          ELSE                                                                    
              FROOT(I,J)=0.0                                                      
          ENDIF                                                                   
  500 CONTINUE                                                                    
C                                                                                 
C     * CALCULATE SKY-VIEW FACTORS FOR BARE GROUND AND SNOW 
C     * UNDERLYING CANOPY.                                                         
C     * ALSO CALCULATE LEAF DIMENSION PARAMETER DLEAF.
C                                                                                 
      DO 600 I=IL1,IL2                                                            
          IF(FC(I).GT.0.)                                        THEN             
              FSVF (I)=(FCAN (I,1)*EXP(CANEXT(1)*AIL (I,1)) +                          
     1                  FCAN (I,2)*EXP(CANEXT(2)*AIL (I,2)) +                          
     2                  FCAN (I,3)*EXP(CANEXT(3)*AIL (I,3)) +                          
     3                  FCAN (I,4)*EXP(CANEXT(4)*AIL (I,4)))/FC (I)                    
          ELSE                                                                    
              FSVF (I)=0.                                                         
          ENDIF                                                                   
          IF(FCS(I).GT.0.)                                       THEN             
              FSVFS(I)=(FCANS(I,1)*EXP(CANEXT(1)*AILS(I,1)) +                          
     1                  FCANS(I,2)*EXP(CANEXT(2)*AILS(I,2)) +                          
     2                  FCANS(I,3)*EXP(CANEXT(3)*AILS(I,3)) +                          
     3                  FCANS(I,4)*EXP(CANEXT(4)*AILS(I,4)))/FCS(I)                    
          ELSE                                                                    
              FSVFS(I)=0.                                                         
          ENDIF                                                                   
          IF((FC(I)+FCS(I)).GT.0.)                               THEN             
              DLEAF(I)=((FCAN(I,1)+FCANS(I,1))*XLEAF(1) +                    
     1                  (FCAN(I,2)+FCANS(I,2))*XLEAF(2) +                    
     2                  (FCAN(I,3)+FCANS(I,3))*XLEAF(3) +                    
     3                  (FCAN(I,4)+FCANS(I,4))*XLEAF(4))/                    
     4                  (FC(I)+FCS(I))                                          
          ELSE                                                                    
              DLEAF(I)=0.0                                                      
          ENDIF                                                                   
  600 CONTINUE                                       
C                                                                                  
C     * CALCULATE BULK SOIL MOISTURE SUCTION FOR STOMATAL RESISTANCE.
C     * CALCULATE FRACTIONAL TRANSPIRATION EXTRACTED FROM SOIL LAYERS.
C
      DO 650 J=1,IG                                                               
      DO 650 I=IL1,IL2                                                            
          IF(FCS(I).GT.0.0 .OR. FC(I).GT.0.0)                      THEN          
              IF(THLIQ(I,J).GT.(THLMIN(I,J)+0.01) .AND. 
     1                           FROOT(I,J).GT.0.)             THEN               
                  PSII=PSISAT(I,J)*(THLIQ(I,J)/THPOR(I,J))**(-BI(I,J))
                  PSII=MIN(PSII,PSIWLT(I,J))
                  PSIGND(I)=MIN(PSIGND(I),PSII)                                 
                  FROOT(I,J)=FROOT(I,J)*(PSIWLT(I,J)-PSII)/
     1                       (PSIWLT(I,J)-PSISAT(I,J))          
                  FRTOT(I)=FRTOT(I)+FROOT(I,J)                                    
              ELSE
                  FROOT(I,J)=0.0
              ENDIF                                                               
          ENDIF                                                                   
  650 CONTINUE                                                                    
C                                                                                 
      DO 700 J=1,IG                                                               
      DO 700 I=IL1,IL2                                                            
          IF(FRTOT(I).GT.0.)                                       THEN           
              FROOT(I,J)=FROOT(I,J)/FRTOT(I)                                      
          ENDIF                                                                   
  700 CONTINUE                                                                    
C                                                                                 
      RETURN                                                                     
      END