SUBROUTINE GRDRAN(IVEG,THLIQ,THICE,TBARW,FDT,TFDT, 6,3
     1                  BASFLW,RUNOFF,QFG,WLOST,FI,EVAP,R,ZPOND,DT,
     2                  WEXCES,THLMAX,THTEST,THPOR,THLRET,THLMIN,
     3                  BI,PSISAT,GRKSAT,DELZW,XDRAIN,ISAND,
     4                  IGRN,IGRD,IG,IGP1,IGP2,ILG,IL1,IL2,JL  )
C
C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICIT
C     * OCT 23/02 - D.VERSEGHY. REFINEMENT OF TEST IN 400 LOOP.
C     * JUN 21/02 - D.VERSEGHY. BUGFIX IN CALCULATION OF FDT'S IN
C     *                         400 LOOP; UPDATE SUBROUTINE CALL;
C     *                         SHORTENED CLASS4 COMMON BLOCK.
C     * MAY 21/02 - D.VERSEGHY. STREAMLINE CALCULATIONS FOR ORGANIC
C     *                         SOILS AND MODIFY CHECK ON EVAPORATION
C     *                         RATE.
C     * DEC 12/01 - D.VERSEGHY. ADD SEPARATE CALCULATION OF BASEFLOW
C     *                         AT BOTTOM OF SOIL COLUMN.
C     * SEP 28/00 - P.BARTLETT/D.VERSEGHY. BUG FIX IN CALCULATION
C     *                                    OF PSI IN LOOP 200.
C     * FEB 08/00 - D.VERSEGHY/L.SPACEK. MINOR BUG FIX IN LOOP 600
C     *                                  RE. ADDRESSING OF THLIQ.
C     * JUN 20/97 - D.VERSEGHY. CLASS - VERSION 2.7.
C     *                         MODIFICATIONS TO ALLOW FOR VARIABLE
C     *                         SOIL PERMEABLE DEPTH.
C     * DEC 30/96 - D.VERSEGHY. CLASS - VERSION 2.6.
C     *                         BUGFIX IN CALCULATION OF QFG.
C     * AUG 30/95 - D.VERSEGHY. CLASS - VERSION 2.4.
C     *                         ADDITIONAL DIAGNOSTIC CALCULATIONS.
C     * AUG 18/95 - D.VERSEGHY. REVISIONS TO ALLOW FOR INHOMOGENEITY
C     *                         BETWEEN SOIL LAYERS.
C     * APR 24/92 - D.VERSEGHY/M.LAZARE. CLASS - VERSION 2.1.
C     *                                  REVISED AND VECTORIZED CODE
C     *                                  FOR MODEL VERSION GCM7.
C     * AUG 12/91 - D.VERSEGHY. CODE FOR MODEL VERSION GCM7U -
C     *                         CLASS VERSION 2.0 (WITH CANOPY).
C     * APR 11/89 - D.VERSEGHY. UPDATE SOIL LAYER TEMPERATURES AND
C     *                         LIQUID MOISTURE CONTENTS FOR
C     *                         NON-INFILTRATING CONDITIONS (I.E.
C     *                         NO PONDED WATER AND NO RAINFALL 
C     *                         OCCURRING WITHIN CURRENT TIMESTEP).
C
      IMPLICIT NONE
      INTEGER IVEG,IG,IGP1,IGP2,ILG,IL1,IL2,JL,I,J,IPTBAD,NIGRD
      REAL THPBND,THLBND,DTHLDZ,DTHPDZ,BBND,GRSBND,PSSBND,GRK,PSI,
     1     THSUBL,WLIMIT,THLTHR
C
C     * INPUT/OUTPUT FIELDS.
C
      REAL THLIQ (ILG,IG),  THICE (ILG,IG),  TBARW (ILG,IG),  
     1     FDT  (ILG,IGP1), TFDT  (ILG,IGP1)
C                        
      REAL BASFLW(ILG),    RUNOFF(ILG),    QFG   (ILG),    
     1     WLOST (ILG)
C
C     * INPUT FIELDS.
C
      REAL FI    (ILG),    EVAP  (ILG),    R     (ILG),    
     1     ZPOND (ILG),    DT    (ILG)
C
      INTEGER              IGRN  (ILG)
C
C     * WORK FIELDS.
C
      REAL WEXCES(ILG),    THLMAX(ILG,IG), THTEST(ILG,IG) 
C
      INTEGER              IGRD  (ILG)
C
C     * SOIL INFORMATION ARRAYS.
C
      REAL THPOR (ILG,IG), THLRET(ILG,IG), THLMIN(ILG,IG), 
     1     BI    (ILG,IG), PSISAT(ILG,IG), GRKSAT(ILG,IG), 
     2     DELZW (ILG,IG), XDRAIN(ILG)    
C  
      INTEGER              ISAND (ILG,IG)
C
#include "class_com.cdk"
C-----------------------------------------------------------------------
C     * DETERMINE POINTS WHICH SATISFY CONDITIONS FOR THESE CALCULATIONS
C     * AND STORE THEM AS HAVING NON-ZERO VALUES FOR WORK ARRAY "IGRD".
C     * NOTE THAT POINTS WHICH GO THROUGH THE ROUTINE "GRINFL" SHOULD
C     * NOT GO THROUGH THIS ROUTINE WHEN IT IS CALLED FROM CLASSW.
C     * THE INPUT ARRAY "IGRN" HANDLES THIS CONDITION (PASSED AS
C     * "IZERO" ARRAY WHEN CALLED FROM "WEND" OR THE END OF "GRINFL"). 
C
      DO 50 I=IL1,IL2
          IF(FI (I).GT.0. .AND. 
     1       ISAND(I,1).GT.-4 .AND.DT(I).GT.0. .AND.IGRN(I).EQ.0 .AND.
     2       (R(I).EQ.0. .AND. ZPOND(I).EQ.0.))                     THEN
              IGRD(I)=1
          ELSE
              IGRD(I)=0
          ENDIF
   50 CONTINUE
      nigrd=0
      do I=IL1,IL2
        if(igrd(i).gt.0) nigrd=1
      enddo
      if (nigrd.eq.0)                      return
C
C     * CALCULATE MAXIMUM LIQUID WATER CONTENT OF EACH SOIL LAYER.
C
      DO 100 J=1,IG
      DO 100 I=IL1,IL2
          IF(IGRD(I).GT.0)                                          THEN
             IF(THICE(I,J).GT.0.)                             THEN
                THLMAX(I,J)=MAX((THPOR(I,J)-THICE(I,J)*RHOICE/RHOW),
     1              THLMIN(I,J))                
             ELSE                                                                    
                THLMAX(I,J)=THPOR(I,J)
             ENDIF                                                                   
          ENDIF
  100 CONTINUE
C
C     * CALCULATE THEORETICAL FLOW RATES AT BOTTOM OF SOIL COLUMN AND
C     * BETWEEN SOIL LAYERS.

      DO 150 I=IL1,IL2
          IF(IGRD(I).GT.0)                                          THEN
             FDT(I,1)=-EVAP(I)*DT(I)                                                           
             IF(THLIQ(I,IG).GT.THLRET(I,IG))              THEN 
                FDT(I,IG+1)=GRKSAT(I,3)*DT(I)*XDRAIN(I)*
     1                      ((THLIQ(I,3)/THPOR(I,3))**(2.*BI(I,3)+3.))
             ELSE                                                                        
                FDT(I,IG+1)=0.0                                                           
             ENDIF                                                                       
          ENDIF
  150 CONTINUE
C
      DO 200 J=1,IG-1                                                             
      DO 200 I=IL1,IL2
          IF(IGRD(I).GT.0)                                          THEN
              IF(THPOR(I,J).GT.0.0.AND.THPOR(I,J+1).GT.0.0.AND.
     1                  ISAND(I,J+1).GT.-3)            THEN
                  IF(DELZW(I,J+1).GT.DELZW(I,J)) THEN
                      THPBND=(THPOR(I,J)+THPOR(I,J+1))/2.0
                      THLBND=(THLIQ(I,J)+THLIQ(I,J+1))/2.0                                        
                      DTHLDZ=(THLIQ(I,J+1)-THLBND)/DELZW(I,J+1)+
     1                       (THLBND-THLIQ(I,J))/DELZW(I,J)
                  ELSE
                      DTHLDZ=2.0*(THLIQ(I,J+1)-THLIQ(I,J))/
     1                       (DELZW(I,J+1)+DELZW(I,J))
                      THLBND=THLIQ(I,J)+0.5*DTHLDZ*DELZW(I,J)
                      DTHPDZ=2.0*(THPOR(I,J+1)-THPOR(I,J))/
     1                       (DELZW(I,J+1)+DELZW(I,J))
                      THPBND=THPOR(I,J)+0.5*DTHPDZ*DELZW(I,J)
                  ENDIF
                  BBND=(BI(I,J)+BI(I,J+1))/2.0
                  GRSBND=(GRKSAT(I,J)+GRKSAT(I,J+1))/2.0
                  PSSBND=(PSISAT(I,J)+PSISAT(I,J+1))/2.0
                  GRK=MIN(GRSBND*(THLBND/THPBND)**(2.*BBND+3.),
     1                   GRSBND)                     
                  PSI=MAX(PSSBND*(THLBND/THPBND)**(-BBND),PSSBND)                          
                  FDT(I,J+1)=GRK*DT(I)*((-BBND*PSI*DTHLDZ/THLBND)+1.)
              ELSE
                  FDT(I,J+1)=0.0
              ENDIF
          ENDIF
  200 CONTINUE 
C                               
C     * CHECK FOR SUSTAINABLE EVAPORATION RATE FROM TOP SOIL LAYER; IF
C     * LIQUID WATER SUPPLY IS INSUFFICIENT, TRY TO REMOVE WATER FROM 
C     * FROZEN SOIL MOISTURE.
C
      IPTBAD=0                                        
      DO 250 J=1,IG                                                               
      DO 250 I=IL1,IL2
        IF(IGRD(I).GT.0)                                        THEN
          IF(J.EQ.1 .AND. FDT(I,J).LT.0.)    THEN 
              THTEST(I,J)=THLIQ(I,J)+FDT(I,J)/DELZW(I,J)
              IF(THTEST(I,J).LT.THLMIN(I,J))             THEN
                  FDT(I,J)=FDT(I,J)+(THLIQ(I,J)-THLMIN(I,J))*
     1                DELZW(I,J)
                  THLIQ(I,J)=THLMIN(I,J)
                  WEXCES(I)=-FDT(I,J)                                                  
                  FDT(I,J)=0.0                                                      
                  THSUBL=WEXCES(I)*RHOW/(RHOICE*DELZW(I,J))
                  IF(THLIQ(I,J).GT.0.0)                 THEN
                      TBARW(I,J)=TBARW(I,J)-(CLHMLT*RHOICE*THSUBL)/ 
     1                           (HCPW*THLIQ(I,J)) 
                  ENDIF
                  IF(THSUBL.LE.THICE(I,J))              THEN
                      THICE(I,J)=THICE(I,J)-THSUBL
                  ELSE
                      THSUBL=THSUBL-THICE(I,J)
                      THICE(I,J)=0.0
                      QFG(I)=QFG(I)-FI(I)*THSUBL*RHOICE*DELZW(I,J)/
     1                       DELT
                      WLOST(I)=WLOST(I)+THSUBL*RHOICE*DELZW(I,J)
                  ENDIF
              ENDIF
              IF(THICE(I,J).LT.0.) IPTBAD=I
          ENDIF
C                                                    
C     * ENSURE THAT CALCULATED WATER FLOWS BETWEEN SOIL LAYERS DO NOT
C     * CAUSE LIQUID MOISTURE CONTENT OF ANY LAYER TO FALL BELOW THE
C     * RESIDUAL VALUE OR TO EXCEED THE CALCULATED MAXIMUM.
C
          IF(THLIQ(I,J).LE.THLMIN(I,J))    THEN 
              IF(FDT(I,J).LE.0. .AND. FDT(I,J+1).GE.0.)      THEN                          
                  FDT(I,J)=0.0    
                  FDT(I,J+1)=0.0   
              ELSE IF(FDT(I,J).GE.0. .AND. FDT(I,J+1).GT.0.) THEN                      
                  FDT(I,J+1)=0.0 
              ELSE IF(FDT(I,J).LT.0. .AND. FDT(I,J+1).LE.0.) THEN                      
                  FDT(I,J)=0.0    
              ENDIF
          ENDIF   
        ENDIF
  250 CONTINUE    
C
      IF(IPTBAD.NE.0)                                           THEN
          WRITE(6,6500) IPTBAD,JL,IVEG,THICE(IPTBAD,1)
 6500     FORMAT('0AT (I,J)=(',I3,',',I3,'), IVEG=',I2,' THICE(1)= ',
     1            E13.5)
          CALL XIT('GRDRAN',-1)
      ENDIF
C
      DO 300 J=IG,1,-1                                                            
      DO 300 I=IL1,IL2
        IF(IGRD(I).GT.0)                                         THEN
          IF(THLIQ(I,J).GE.THLMAX(I,J))          THEN
              IF(FDT(I,J).GE.0. .AND. FDT(I,J+1).LE.0.)      THEN                          
                  FDT(I,J)=0.0                                                      
                  FDT(I,J+1)=0.0                                                    
              ELSE IF(FDT(I,J).GT.0. .AND. FDT(I,J+1).GE.0.) THEN                      
                  IF(FDT(I,J).GT.FDT(I,J+1)) FDT(I,J)=FDT(I,J+1)                          
              ELSE IF(FDT(I,J).LE.0. .AND. FDT(I,J+1).LT.0.) THEN                      
                  IF(FDT(I,J+1).LT.FDT(I,J)) FDT(I,J+1)=FDT(I,J)                          
              ENDIF                                                               
          ENDIF                                                                   
        ENDIF
  300 CONTINUE
C
C     * (FOR FOLLOWING LOOPS VECTORIZATION AND OPTIMIZATION ARE ENHANCED
C     * BY UNROLLING THE INNER-MOST LOOP. THIS EXPLICITLY ASSUMES THAT
C     * IG=3 AND THE ROUTINE IS ABORTED IF SUCH IS NOT THE CASE.)
C
      IF(IG.NE.3)                      CALL XIT('GRDRAN',-2)
C
      DO 400 J=1,IG                                                               
      DO 400 I=IL1,IL2
          IF(IGRD(I).GT.0.AND.ISAND(I,J).NE.-3) THEN
              IF(DELZW(I,J).GT.0.)
     1        THTEST(I,J)=THLIQ(I,J)+(FDT(I,J)-FDT(I,J+1))/DELZW(I,J)
              IF(J.EQ.1) THEN
                  THLTHR=THLMIN(I,J)
              ELSE
                  THLTHR=MIN(THLRET(I,J),THLIQ(I,J))
              ENDIF
              IF(THTEST(I,J).LT.THLTHR)                             THEN
                  IF(FDT(I,J+1).GT.0.) THEN                      
                      FDT(I,J+1)=FDT(I,J)+(THLIQ(I,J)-THLTHR)*
     1                    DELZW(I,J)  
                  ELSE 
                      FDT(I,J)=FDT(I,J+1)-(THLIQ(I,J)-THLTHR)*
     1                    DELZW(I,J)  
                  ENDIF
                  THTEST(I,J)=THLTHR
                  IF(J.LT.IG) THEN
                      IF(DELZW(I,J+1).GT.0.0) THTEST(I,J+1)=THLIQ(I,J+1)
     1                   +(FDT(I,J+1)-FDT(I,J+2))/DELZW(I,J+1)
                  ENDIF
                  IF(J.GT.1) THEN
                      IF(DELZW(I,J-1).GT.0.0) THTEST(I,J-1)=THLIQ(I,J-1)
     1                    +(FDT(I,J-1)-FDT(I,J))/DELZW(I,J-1)
                  ENDIF
              ENDIF                                                                   
          ELSE
              THTEST(I,J)=0.0
          ENDIF
  400 CONTINUE               
C
      DO 500 J=IG,1,-1                                                            
      DO 500 I=IL1,IL2
        IF(IGRD(I).GT.0)                                         THEN
          IF(THTEST(I,J).GT.THLMAX(I,J))         THEN
c         IF(THTEST(I,J).GT.THLMAX(I,J).and.DELZW(I,3).GT.0.0)    THEN
             WLIMIT=MAX((THLMAX(I,J)-THLIQ(I,J)),0.0)*DELZW(I,J)                      
             WEXCES(I)=(THTEST(I,J)-THLMAX(I,J))*DELZW(I,J)                                
             IF(FDT(I,J).GE.0. .AND. FDT(I,J+1).LE.0.)        THEN                          
                IF(FDT(I,J).GE.WLIMIT)             THEN                                       
                   FDT(I,J)=WLIMIT                                               
                   FDT(I,J+1)=0.0                                                
                ELSE                                                            
                   FDT(I,J+1)=FDT(I,J)-WLIMIT                                      
                ENDIF                                                           
             ELSE IF(FDT(I,J).GT.0. .AND. FDT(I,J+1).GE.0.)   THEN                      
                FDT(I,J)=FDT(I,J)-WEXCES(I)                                            
             ELSE IF(FDT(I,J).LE.0. .AND. FDT(I,J+1).LT.0.)   THEN                      
                FDT(I,J+1)=FDT(I,J+1)+WEXCES(I)    
             ENDIF                                                               
             IF(DELZW(I,1).GT.0.0)                            THEN
                 THTEST(I,1)=THLIQ(I,1)+(FDT(I,1)-FDT(I,2))/DELZW(I,1)                    
             ENDIF
             IF(DELZW(I,2).GT.0.0)                            THEN
                 THTEST(I,2)=THLIQ(I,2)+(FDT(I,2)-FDT(I,3))/DELZW(I,2)
             ENDIF
             IF(DELZW(I,3).GT.0.0)                            THEN
                 THTEST(I,3)=THLIQ(I,3)+(FDT(I,3)-FDT(I,4))/DELZW(I,3)
c                if(THTEST(I,3).gt.thpor(i,3))  then
c          FDT(I,4)=FDT(I,3)+DELZW(I,3)*(THLIQ(I,3)-thpor(i,3)+0.001)
c                THTEST(I,3)=THLIQ(I,3)+(FDT(I,3)-FDT(I,4))/DELZW(I,3)
c                endif
             ENDIF
          ENDIF                                                                   
        ENDIF
  500 CONTINUE
C
      IPTBAD=0
      DO 600 I=IL1,IL2
          IF(IGRD(I).GT.0)                                        THEN
              IF(FDT(I,IG+1).LT.0.)                         THEN
                  WEXCES(I)=-FDT(I,IG+1)
                  FDT(I,1)=FDT(I,1)+WEXCES(I)
                  FDT(I,2)=FDT(I,2)+WEXCES(I)
                  FDT(I,3)=FDT(I,3)+WEXCES(I)
                  FDT(I,4)=FDT(I,4)+WEXCES(I)                                                
                  THSUBL=WEXCES(I)*RHOW/(RHOICE*DELZW(I,1))                                     
                  IF(THLIQ(I,1).GT.0.0)               THEN
                      TBARW(I,1)=TBARW(I,1)-(CLHMLT*RHOICE*THSUBL)/
     1                           (HCPW*THLIQ(I,1))                
                  ENDIF
                  IF(THSUBL.LE.THICE(I,1))            THEN
                      THICE(I,1)=THICE(I,1)-THSUBL                                        
                  ELSE
                      THSUBL=THSUBL-THICE(I,1)
                      THICE(I,1)=0.0
                      QFG(I)=QFG(I)-FI(I)*THSUBL*RHOICE*DELZW(I,1)/
     1                       DELT
                      WLOST(I)=WLOST(I)+THSUBL*RHOICE*DELZW(I,1)
                  ENDIF
                  IF(THICE(I,1).LT.0.0) IPTBAD=I
              ENDIF                                                                       
C
C     * CALCULATE DRAINAGE FROM BOTTOM OF SOIL COLUMN AND RE-EVALUATE
C     * SOIL LAYER TEMPERATURES AND LIQUID MOISTURE CONTENTS AFTER
C     * WATER MOVEMENT.
C
              TFDT(I,1)=TBARW(I,1) 
              TFDT(I,IG+1)=TBARW(I,IG)
              BASFLW(I)=BASFLW(I)+FI(I)*FDT(I,IG+1)
              RUNOFF(I)=RUNOFF(I)+FDT(I,IG+1)
          ENDIF
  600 CONTINUE
C
      IF(IPTBAD.NE.0)                                           THEN
          WRITE(6,6500) IPTBAD,JL,IVEG,THICE(IPTBAD,1)
          CALL XIT('GRDRAN',-3)
      ENDIF
C                                                      
      DO 700 J=1,IG
      DO 700 I=IL1,IL2
          IF(IGRD(I).GT.0)                                          THEN
             IF(J.LT.IG)                               THEN
                IF(FDT(I,J+1).GT.0.)          THEN                                                
                   TFDT(I,J+1)=TBARW(I,J)                                                  
                ELSE                                                                    
                   TFDT(I,J+1)=TBARW(I,J+1)                                                
                ENDIF                                                                   
             ENDIF
             IF(THTEST(I,J).GT.0.0.AND.DELZW(I,J).GT.0.)           THEN
                 TBARW(I,J)=(THLIQ(I,J)*TBARW(I,J)+(FDT(I,J)*TFDT(I,J)-
     1                      FDT(I,J+1)*TFDT(I,J+1))/DELZW(I,J))/
     2                      THTEST(I,J)                                       
             ENDIF
             THLIQ(I,J)=THTEST(I,J)
          ENDIF                                                      
  700 CONTINUE                               
C                                                                   
      RETURN                                                                      
      END