SUBROUTINE WEND(THLIQX,THICEX,TBARWX,BASFLW,RUNOFF,FI, 1,1
     1                WMOVE,TMOVE,LZF,NINF,TRMDR,THLINF,DELZX,
     2                ZMAT,ZRMDR,FDTBND,WADD,TADD,FDT,TFDT,
     3                THLMAX,THTEST,THLDUM,THIDUM,TDUMW,
     4                TUSED,RDUMMY,ZERO,WEXCES,XDRAIN,
     5                THPOR,THLRET,THLMIN,BI,PSISAT,GRKSAT,
     6                DELZW,ISAND,IGRN,IGRD,IZERO,
     7                IVEG,IG,IGP1,IGP2,ILG,IL1,IL2,JL   )

C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICIT
C     * OCT 15/02 - D.VERSEGHY. BUGFIX IN CALCULATION OF FDTBND
C     *                         (PRESENT ONLY IN PROTOTYPE
C     *                         VERSIONS OF CLASS VERSION 3.0).
C     * JUN 21/02 - D.VERSEGHY. UPDATE SUBROUTINE CALL; SHORTENED
C     *                         CLASS4 COMMON BLOCK.
C     * DEC 12/01 - D.VERSEGHY. ADD SEPARATE CALCULATION OF BASEFLOW
C     *                         AT BOTTOM OF SOIL COLUMN.
C     * OCT 20/97 - D.VERSEGHY. APPLY ACCURACY LIMIT ON FLOWS IN AND
C     *                         OUT OF LAYER CONTAINING WETTING FRONT,
C     *                         IN ORDER TO ENSURE MOISTURE CONSERVATION.
C     * JUN 20/97 - D.VERSEGHY. CLASS - VERSION 2.7.
C     *                         MODIFICATIONS TO ALLOW FOR VARIABLE
C     *                         SOIL PERMEABLE DEPTH.
C     * AUG 18/95 - D.VERSEGHY. CLASS - VERSION 2.4.
C     *                         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. RECALCULATE LIQUID MOISTURE CONTENT
C     *                         OF SOIL LAYERS AFTER INFILTRATION
C     *                         AND EVALUATE FLOW ("RUNOFF") FROM
C     *                         BOTTOM OF SOIL COLUMN.
C
      IMPLICIT NONE
      INTEGER IVEG,IG,IGP1,IGP2,ILG,IL1,IL2,JL,I,J,K
      REAL WREM,TREM,THDRAN,THINFL,WDRA,TDRA
C
C     * OUTPUT FIELDS.
C
      REAL THLIQX(ILG,IGP1), THICEX(ILG,IGP1), TBARWX(ILG,IGP1), 
     1     BASFLW(ILG),      RUNOFF(ILG)
C
C     * INPUT FIELDS.
C
      REAL WMOVE (ILG,IGP2), TMOVE (ILG,IGP2), THLINF(ILG,IGP1),
     1     FI    (ILG),      TRMDR (ILG),      DELZX (ILG,IGP1)
C
      INTEGER                LZF   (ILG),      NINF  (ILG), 
     1                       IGRN  (ILG)    
C
C     * INTERNAL WORK ARRAYS.
C
      REAL ZMAT  (ILG,IGP2,IGP1),  ZRMDR (ILG,IGP1)
C
      REAL FDTBND(ILG),    WADD  (ILG),    TADD  (ILG) 
C
C     * INTERNAL ARRAYS USED IN CALLING GRDRAN.
C
      REAL FDT   (ILG,IGP1), TFDT  (ILG,IGP1)
C
      REAL THLMAX(ILG,IG), THTEST(ILG,IG), THLDUM(ILG,IG),
     1     THIDUM(ILG,IG), TDUMW (ILG,IG)          
C
      REAL TUSED (ILG),    RDUMMY(ILG),    ZERO  (ILG),
     1     WEXCES(ILG)
C
      INTEGER              IGRD  (ILG),    IZERO (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
C     * INITIALIZATION.
C
      DO 100 J=1,IG
      DO 100 I=IL1,IL2
          IF(IGRN(I).GT.0 .AND. LZF(I).LE.IG)                       THEN
              THLDUM(I,J)=THLIQX(I,J)                                                 
              THIDUM(I,J)=THICEX(I,J)                                                 
              TDUMW (I,J)=TBARWX(I,J)                  
          ENDIF
  100 CONTINUE 
C
C     * DETERMINE AMOUNT OF TIME OUT OF CURRENT MODEL STEP DURING WHICH 
C     * INFILTRATION WAS OCCURRING.
C     * SET WORK ARRAY "TUSED" TO ZERO FOR POINTS WHERE WETTING FRONT
C     * IS BELOW BOTTOM OF LOWEST SOIL LAYER TO SUPPRESS CALCULATIONS
C     * DONE IN "GRDRAN".
C
      DO 125 I=IL1,IL2
          IF(IGRN(I).GT.0 .AND. LZF(I).LE.IG)                       THEN
              TUSED(I)=DELT-TRMDR(I)
          ELSE
              TUSED(I)=0.
          ENDIF
  125 CONTINUE
C
C     * CALL "GRDRAN" WITH COPIES OF CURRENT LIQUID AND FROZEN SOIL
C     * MOISTURE CONTENTS AND LAYER TEMPERATURES TO DETERMINE MOISTURE
C     * FLOW BETWEEN LAYERS BELOW THE WETTING FRONT.
C
      CALL GRDRAN(IVEG,THLDUM,THIDUM,TDUMW,FDT,TFDT,
     1            RDUMMY,RDUMMY,RDUMMY,RDUMMY,FI,ZERO,ZERO,ZERO,
     2            TUSED,WEXCES,THLMAX,THTEST,THPOR,THLRET,THLMIN,
     3            BI,PSISAT,GRKSAT,DELZW,XDRAIN,ISAND,
     4            IZERO,IGRD,IG,IGP1,IGP2,ILG,IL1,IL2,JL  )
C
C     * CONSISTENCY CHECKS ON FLOWS INTO AND OUT OF SOIL LAYER 
C     * CONTAINING WETTING FRONT.
C
      DO 150 I=IL1,IL2
          IF(IGRN(I).GT.0 .AND. LZF(I).LE.IG)                       THEN
c             FDT(I,LZF(I)+1)=MAX(FDT(I,LZF(I)+1),0.0)
              FDTBND(I)=FDT(I,LZF(I))                                          
              IF(LZF(I).GT.1)                              THEN 
                  IF(FDTBND(I).GT.0. .AND. (THLIQX(I,LZF(I)-1)-
     1                THLMIN(I,LZF(I)-1)).LT. 1.0E-3) FDTBND(I)=0.0  
              ENDIF
          ENDIF
C
C     * INITIALIZATION OF ARRAYS IN PREPARATION FOR RE-ALLOCATION OF
C     * MOISTURE STORES WITHIN SOIL LAYERS.
C
          IF(IGRN(I).GT.0)                                       THEN
               NINF(I)=MIN(NINF(I),IGP1)                                                        
          ENDIF                                                                       
  150 CONTINUE
C
      DO 200 J=IGP1,1,-1                                                           
      DO 200 I=IL1,IL2
          IF(IGRN(I).GT.0)                                          THEN
              ZRMDR(I,J)=DELZX(I,J)
              IF(J.LE.LZF(I))                  THEN
                  FDT(I,J)=0.0
              ENDIF
          ENDIF
  200 CONTINUE
C
      DO 300 J=1,IGP1                                                             
      DO 300 K=1,IGP1
      DO 300 I=IL1,IL2
          IF(IGRN(I).GT.0 .AND. K.LE.NINF(I))                       THEN
              ZMAT(I,K,J)=0.0                                                       
          ENDIF
  300 CONTINUE                        
C
C     * ASSIGN VALUES IN MATRIX "ZMAT": DETERMINE DEPTH OUT OF EACH
C     * SOIL LAYER J WHICH IS FILLED BY WATER FROM RESERVOIR K
C     * IN "WMOVE"; FIND THE DEPTH "ZRMDR" LEFT OVER WITHIN EACH
C     * SOIL LAYER.
C
      DO 400 K=1,IGP1
      DO 400 J=1,IGP1
      DO 400 I=IL1,IL2
          IF(IGRN(I).GT.0 .AND. K.LE.NINF(I))                       THEN
              IF(ZRMDR(I,J).GT.0. .AND. WMOVE(I,K).GT.0.) THEN                        
                  ZMAT(I,K,J)=WMOVE(I,K)/THLINF(I,J)                                    
                  IF(ZMAT(I,K,J).GE.ZRMDR(I,J)) THEN                                  
                      ZMAT(I,K,J)=ZRMDR(I,J)                                          
                      WMOVE(I,K)=WMOVE(I,K)-ZRMDR(I,J)*THLINF(I,J)                        
                      ZRMDR(I,J)=0.0                                                
                  ELSE                                                            
                      ZRMDR(I,J)=ZRMDR(I,J)-ZMAT(I,K,J)                                 
                      WMOVE(I,K)=0.0                                                
                  ENDIF                                                           
              ENDIF                                                               
          ENDIF
  400 CONTINUE
C
C     * ADD WATER CONTENT AND TEMPERATURE CHANGES DUE TO INFILTRATION
C     * (WADD, TADD) AND DRAINAGE (WDRA, TDRA) TO WATER REMAINING IN
C     * EACH SOIL LAYER AFTER THESE PROCESSES (WREM, TREM).
C
      DO 600 J=IG,1,-1
          DO 500 I=IL1,IL2
              IF(IGRN(I).GT.0)                                      THEN
                  WADD(I)=0.
                  TADD(I)=0.
              ENDIF
  500     CONTINUE
C  
          DO 525 K=1,IGP1
          DO 525 I=IL1,IL2
              IF(IGRN(I).GT.0 .AND. K.LE.NINF(I))                   THEN
                  WADD(I)=WADD(I)+THLINF(I,J)*ZMAT(I,K,J)                                       
                  TADD(I)=TADD(I)+TMOVE(I,K)*THLINF(I,J)*ZMAT(I,K,J)
              ENDIF
  525     CONTINUE
C
          DO 550 I=IL1,IL2
              IF(IGRN(I).GT.0)                                  THEN
                 IF(ZRMDR(I,J).GT.0.)                 THEN 
                    WREM=THLIQX(I,J)*ZRMDR(I,J)                                             
                    TREM=TBARWX(I,J)*THLIQX(I,J)*ZRMDR(I,J)                                   
                 ELSE                                                                    
                    WREM=0.0                                                            
                    TREM=0.0                                                            
                 ENDIF                                                                   
                 IF(J.EQ.LZF(I).and.DELZW(I,J).gt.0.)            THEN    
                    THDRAN=THLIQX(I,J)+(FDTBND(I)-FDT(I,J+1))/
     1                     DELZW(I,J)                          
                    THINFL=(WADD(I)+WREM-FDT(I,J+1))/DELZW(I,J)                                 
                    IF(THINFL.LT.THDRAN)   THEN                                           
                       FDT(I,J)=THDRAN*DELZW(I,J)-WADD(I)-WREM+
     1                          FDT(I,J+1)                        
                    ENDIF                                                               
                 ENDIF                                                                   
                 WDRA=FDT(I,J)-FDT(I,J+1)                                                    
                 TDRA=FDT(I,J)*TFDT(I,J)-FDT(I,J+1)*TFDT(I,J+1)                                  
                 IF(DELZW(I,J).GT.0.0) THEN
                     THLIQX(I,J)=(WADD(I)+WREM+WDRA)/DELZW(I,J)
                 ENDIF
                 IF(THPOR(I,J).GE.THLMIN(I,J)) THEN
                     THLIQX(I,J)=MAX(THLIQX(I,J),THLMIN(I,J))
                 ENDIF
c-----------------------------------------------------------------
                 IF(THLIQX(I,J).GT.THLMAX(I,J)) THEN
                     BASFLW(I)=BASFLW(I)+FI(I)*(THLIQX(I,J)-
     1                   THLMAX(I,J))*DELZW(I,J)
                     RUNOFF(I)=RUNOFF(I)+(THLIQX(I,J)-
     1                   THLMAX(I,J))*DELZW(I,J)
                     THLIQX(I,J)=THLMAX(I,J)
                 ENDIF
c-------------------------------------------------------------------
                 IF(THLIQX(I,J).GT.0.0.AND.DELZW(I,J).GT.0.) THEN
                     TBARWX(I,J)=(TADD(I)+TREM+TDRA)/max(THLIQX(I,J)*
     1                           DELZW(I,J),1.0e-8)

                 ENDIF
              ENDIF                          
  550     CONTINUE
  600 CONTINUE
C
C     * CALCULATE FLOW OUT OF BOTTOM OF SOIL COLUMN DUE TO INFILTRATION
C     * AND GRAVITY DRAINAGE AND ADD TO TOTAL RUNOFF AND BASEFLOW.
C
      DO 700 K=1,IGP1
      DO 700 I=IL1,IL2
          IF(IGRN(I).GT.0)                                      THEN
              IF(LZF(I).EQ.IGP1 .AND. K.LE.NINF(I))  THEN 
                  BASFLW(I)=BASFLW(I)+FI(I)*THLINF(I,IGP1)*
     1                      ZMAT(I,K,IGP1)
                  RUNOFF(I)=RUNOFF(I)+THLINF(I,IGP1)*ZMAT(I,K,IGP1)
              ELSE IF(K.EQ.IGP1)                     THEN
                  BASFLW(I)=BASFLW(I)+FI(I)*FDT(I,K)
                  RUNOFF(I)=RUNOFF(I)+FDT(I,K)
              ENDIF                              
          ENDIF
  700 CONTINUE                                                                
C                                                                                  
      RETURN                                                                      
      END