SUBROUTINE WFILL(WMOVE,TMOVE,LZF,NINF,ZF,TRMDR,R,TR, 1
     1                 PSIF,GRKINF,THLINF,THLIQX,TBARWX,
     2                 DELZX,ZBOTX,DZF,TIMPND,WADJ,WADD,
     3                 IFILL,IFIND,IG,IGP1,IGP2,ILG,IL1,IL2,JL   )

C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICIT
C     * JUN 21/02 - D.VERSEGHY. UPDATE SUBROUTINE CALL.
C     * MAY 17/99 - D.VERSEGHY. PUT LIMIT ON CONDITION BASED ON "GRKINF"
C     *                         SO THAT "LZF" IS ALWAYS INITIALIZED.
C     * NOV 30/94 - M.LAZARE.   BRACKET TERMS IN "WADJ" CALCULATION IN
C     *                         LOOP 200 TO AVOID OPTIMIZATION LEADING
C     *                         TO RE-ORDERING OF CALCULATION AND
C     *                         RARE VERY LARGE ITERATION LIMITS.
C     * AUG 16/93 - D.VERSEGHY/M.LAZARE. ADD MISSING OUTER LOOP ON "J"
C     *                                  IN 200 LOOP.
C     * APR 24/92 - D.VERSEGHY/M.LAZARE. 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. UNSATURATED FLOW OF WATER INTO SOIL.            
C
      IMPLICIT NONE
      INTEGER IG,IGP1,IGP2,ILG,IL1,IL2,JL,I,J
      REAL THLADD
C
C     * OUTPUT FIELDS.
C                      
      REAL WMOVE (ILG,IGP2),   TMOVE (ILG,IGP2)
C
      INTEGER                  LZF   (ILG),        NINF  (ILG) 
C
      REAL ZF    (ILG),        TRMDR (ILG)
C
C     * INPUT FIELDS.
C
      REAL R     (ILG),        TR    (ILG),        PSIF  (ILG,IGP1),   
     1     GRKINF(ILG,IGP1),   THLINF(ILG,IGP1),   THLIQX(ILG,IGP1),   
     1     TBARWX(ILG,IGP1),   DELZX (ILG,IGP1),   ZBOTX (ILG,IGP1) 
     2     
C
      INTEGER                  IFILL (ILG)
C
C     * INTERNAL WORK FIELDS.
C
      REAL DZF   (ILG),        TIMPND (ILG),
     1     WADJ  (ILG),        WADD  (ILG)      
C
      INTEGER                  IFIND (ILG) 
C-----------------------------------------------------------------------
C     * INITIALIZATION.
C
      DO 50 I=IL1,IL2
          IF(IFILL(I).GT.0)                                         THEN
             IFIND(I)=0 
             WADJ(I)=0.
          ENDIF
   50 CONTINUE
C                                                                    
C     * TEST SUCCESSIVE SOIL LAYERS TO FIND DEPTH OF WETTING FRONT 
C     * AT THE TIME PONDING BEGINS, I.E. AT THE TIME THE DECREASING
C     * INFILTRATION RATE EQUALS THE RAINFALL RATE.
C
      DO 100 J=1,IGP1
      DO 100 I=IL1,IL2
          IF(IFILL(I).GT.0 .AND. IFIND(I).EQ.0)                     THEN                                                             
             IF(GRKINF(I,J).GT.0. .AND.
     1                            GRKINF(I,J).LT.(R(I)-1.0E-8))  THEN
                  ZF(I)=PSIF(I,J)/(R(I)/GRKINF(I,J)-1)                                  
                  IF(ZF(I).LT.(ZBOTX(I,J)-DELZX(I,J))) THEN                          
                      ZF(I)=ZBOTX(I,J-1)                                           
                      LZF(I)=J                                                   
                      IFIND(I)=1                                                 
                  ELSE IF(ZF(I).LT.ZBOTX(I,J))         THEN                                 
                      LZF(I)=J                                                   
                      IFIND(I)=1                                                 
                  ENDIF                                                       
              ELSE IF (GRKINF(I,J).GT.0.) THEN
                  ZF(I)=ZBOTX(I,J)                                                 
                  LZF(I)=MIN(J+1,IGP1)                                          
              ELSE IF (GRKINF(I,J).LE.0.)                      THEN
                  ZF(I)=ZBOTX(I,J-1)                                                   
                  LZF(I)=J                                                           
                  IFIND(I)=1                                                         
              ENDIF                                                               
          ENDIF                                                                   
  100 CONTINUE
C
C     * FIND THE VOLUME OF WATER NEEDED TO CORRECT FOR THE DIFFERENCE 
C     * (IF ANY) BETWEEN THE LIQUID MOISTURE CONTENTS OF THE LAYERS 
C     * OVERLYING THE WETTING FRONT AND THAT OF THE LAYER CONTAINING 
C     * THE WETTING FRONT.
C
      DO 200 J=1,IGP1
      DO 200 I=IL1,IL2
          IF(IFILL(I).GT.0 .AND. LZF(I).GT.1 .AND. J.LT.LZF(I))     THEN
              WADJ(I)=WADJ(I)+DELZX(I,J)*( (THLINF(I,J)-THLIQX(I,J)) -
     1                (THLINF(I,LZF(I))-THLIQX(I,LZF(I))) )
          ENDIF                                                    
  200 CONTINUE                                                                
C
C     * CALCULATE THE TIME TO PONDING, GIVEN THE DEPTH REACHED BY THE 
C     * WETTING FRONT AT THAT TIME.

      DO 250 I=IL1,IL2
          IF(IFILL(I).GT.0)                                         THEN
              TIMPND(I)=(ZF(I)*(THLINF(I,LZF(I))-THLIQX(I,LZF(I)))+
     1                 WADJ(I))/MAX(R(I),1.e-11)                                 
              IF(ZF(I).GT.0.999e6) TIMPND(I)=1.0e6                                             
C
C     * IN THE CASE WHERE THE TIME TO PONDING EXCEEDS OR EQUALS THE
C     * TIME REMAINING IN THE CURRENT MODEL STEP, RECALCULATE THE 
C     * ACTUAL DEPTH ATTAINED BY THE WETTING FRONT OVER THE CURRENT
C     * MODEL STEP; ASSIGN VALUES IN THE WATER MOVEMENT MATRIX.
C      
              IF(TIMPND(I).GE.TRMDR(I))                 THEN 
                  TMOVE(I,1)=TR(I)                                                             
                  WMOVE(I,1)=R(I)*TRMDR(I)                                                        
                  WADD(I)=WMOVE(I,1)
              ENDIF
          ENDIF    
  250 CONTINUE
C
      DO 300 J=1,IGP1
      DO 300 I=IL1,IL2
        IF(IFILL(I).GT.0)                                        THEN
         IF(TIMPND(I).GE.TRMDR(I))                          THEN
           IF(WADD(I).GT.0.)        THEN
              THLADD=MAX(THLINF(I,J)-THLIQX(I,J),0.0)                           
              IF(THLADD.GT.0.)                      THEN                                          
                  DZF(I)=WADD(I)/THLADD                                             
              ELSE                                                            
                  DZF(I)=9999.                                                   
              ENDIF                                                           
              IF(DZF(I).GE.DELZX(I,J))              THEN                                        
                  WADD(I)=WADD(I)-THLADD*DELZX(I,J)                                   
              ELSE                                                            
                  LZF(I)=J                                                       
                  IF(J.EQ.1)                 THEN                                             
                      ZF(I)=DZF(I)                                                  
                  ELSE                                                        
                      ZF(I)=ZBOTX(I,J-1)+DZF(I)                                       
                  ENDIF                                                       
                  WADD(I)=0.                                                    
              ENDIF                                                           
           ENDIF                                                               
         ENDIF
        ENDIF
  300 CONTINUE
C                                                                
      DO 400 J=1,IGP1
      DO 400 I=IL1,IL2
        IF(IFILL(I).GT.0)                                        THEN
          IF(TIMPND(I).GE.TRMDR(I))                           THEN
            IF(J.LE.LZF(I))            THEN
              TMOVE(I,J+1)=TBARWX(I,J)                                                
              IF(J.EQ.LZF(I))                       THEN                                                   
                  WMOVE(I,J+1)=THLIQX(I,J)*DZF(I)                                        
              ELSE                                                                
                  WMOVE(I,J+1)=THLIQX(I,J)*DELZX(I,J)                                   
              ENDIF                                 
            ENDIF
          ENDIF                              
        ENDIF
  400 CONTINUE 
C
C     * IN THE CASE WHERE THE TIME TO PONDING IS LESS THAN THE TIME
C     * REMAINING IN THE CURRENT MODEL STEP, ACCEPT THE DEPTH OF THE
C     * WETTING FRONT FROM LOOP 100; ASSIGN VALUES IN THE WATER
C     * MOVEMENT MATRIX.
C
      DO 450 I=IL1,IL2
        IF(IFILL(I).GT.0)                                        THEN
          IF(TIMPND(I).LT.TRMDR(I))            THEN
              TMOVE(I,1)=TR(I)                                                             
              WMOVE(I,1)=R(I)*TIMPND(I)                                                        
              IF(LZF(I).EQ.1)                             THEN 
                  DZF(I)=ZF(I)                                                              
              ELSE                                                                    
                  DZF(I)=ZF(I)-ZBOTX(I,LZF(I)-1)                                                 
              ENDIF
          ENDIF
        ENDIF
  450 CONTINUE
C
      DO 500 J=1,IGP1
      DO 500 I=IL1,IL2
        IF(IFILL(I).GT.0)                                        THEN
          IF(TIMPND(I).LT.TRMDR(I))                          THEN
            IF(J.LE.LZF(I))      THEN
              TMOVE(I,J+1)=TBARWX(I,J)                                                
              IF(J.EQ.LZF(I))                      THEN                                                   
                  WMOVE(I,J+1)=THLIQX(I,J)*DZF(I)                                        
              ELSE                                                                
                  WMOVE(I,J+1)=THLIQX(I,J)*DELZX(I,J)                                   
              ENDIF                                 
            ENDIF
          ENDIF                              
        ENDIF
  500 CONTINUE                                                                
C
C     * CALCULATE TIME REMAINING IN CURRENT MODEL STEP AFTER
C     * UNSATURATED FLOW.
C
      DO 600 I=IL1,IL2
          IF(IFILL(I).GT.0)                                         THEN
              IF(TIMPND(I).GE.TRMDR(I))              THEN    
                  TRMDR(I)=0.
              ELSE
                  TRMDR(I)=TRMDR(I)-TIMPND(I)
              ENDIF
              NINF(I)=LZF(I)+1
          ENDIF               
  600 CONTINUE                                                 
C                                                                                  
      RETURN                                                                      
      END