SUBROUTINE WATROF(THLIQ,THICE,ZPOND,OVRFLW,SUBFLW,RUNOFF, 4,1
     1                  FI,ZPLIM,XSLOPE,GRKFAC,WFSURF,WFCINT,
     2                  DELZW,THPOR,THLMIN,BI,THFC,THCRIT,DODRN,
     3                  DOVER,DIDRN,DIDRNMX,ISAND,IWF,IG,ILG,IL1,IL2)

C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICIT
C     * AUG 02/02 - R.SOULIS/D.VERSEGHY. UPDATES DEVELOPED AT 
C     *             WATERLOO.
C     * DEC 10/01 - R.SOULIS/K.SNELGROVE/T.WHIDDEN/D.VERSEGHY 
C     *             WATFLOOD ROUTINE TO CALCULATE OVERLAND FLOW AND
C     *             INTERFLOW COMPONENTS OF SURFACE RUNOFF.
C
      IMPLICIT NONE
      INTEGER IWF,IG,ILG,IL1,IL2,I,J
      REAL HP,HARAT,CCH,WFFLIM,WFF,WFKMA,WFAREA,RATIO,HMULT
C
C     * INPUT/OUTPUT ARRAYS.
C
      REAL  THLIQ (ILG,IG),  THICE (ILG,IG),  ZPOND (ILG),        
     1      OVRFLW(ILG),     SUBFLW(ILG),     RUNOFF(ILG)
C
C     * INPUT ARRAYS.
C
      REAL  FI    (ILG),     ZPLIM (ILG),     XSLOPE(ILG),     
     1      GRKFAC(ILG),     WFSURF(ILG),     WFCINT(ILG)
C 
C     * SOIL INFORMATION ARRAYS.
C
      REAL  DELZW (ILG,IG),  THPOR (ILG,IG),  THLMIN(ILG,IG),
     1      BI    (ILG,IG),  THFC  (ILG,IG)

      INTEGER                ISAND (ILG,IG)
C
C     * WORK ARRAYS.
C
      REAL  THCRIT(ILG,IG),  DODRN (ILG),     DOVER (ILG),
     1      DIDRN (ILG,IG),  DIDRNMX(ILG,IG)
C
#include "class_com.cdk"
C
C-----------------------------------------------------------------------
C
C     * PART 1 - OVERLAND FLOW
C     * (MODELLED USING MANNINGS EQUATION).  
C     * CALCULATED USING A PARAMETER "WFSURF" WHICH IS A COMBINATION
C     * OF MANNING'S "N" AND THE DRAINAGE DENSITY "DD":
C     *         WFSURF = 'N' / (2*DD).  
C     * SINCE DD = 1/(AVERAGE INTERSTEAM DISTANCE) THIS CAN ALSO BE
C     * INTERPRETED AS:
C     *         WFSURF = 'N' * (EFFECTIVE HILLSLOPE LENGTH).

      DO 100 I=IL1,IL2
          IF(FI(I).GT.0.0 .AND. IWF.GT.0) THEN
              DOVER(I)=MAX(ZPOND(I)-ZPLIM(I),0.)
              DODRN(I)=DOVER(I)**(5./3.)*SQRT(XSLOPE(I))*
     1            DELT/WFSURF(I)
              IF(DOVER(I).GT.0.0) THEN
                  DODRN(I)=DODRN(I)*(1.0-0.833333*DODRN(I)/DOVER(I))
              ELSE
                  DODRN(I)=0.0
              ENDIF
              IF(DODRN(I).GT.DOVER(I)/2.0) DODRN(I)=DOVER(I)/2.0
              RUNOFF(I)=RUNOFF(I)+DODRN(I)
              OVRFLW(I)=OVRFLW(I)+FI(I)*DODRN(I)
              ZPOND(I)=ZPOND(I)-DODRN(I)
          ENDIF  
 100  CONTINUE

C     * PART 2 - INTERFLOW
C     * (MODELLED AS FLOW ALONG A SHALLOW SLOPING AQUIFER).
C     * CALCULATED FROM THE RELATIVE DEPTH OF THE CONTRIBUTING
C     * PORTION OF THE SOIL (HARAT), THE CRITICAL SOIL MOISTURE 
C     * CONTENT AT WHICH UNSATURATED FLOW BEGINS TO TAKE PLACE, 
C     * THE FIELD CAPACITY, THE RELATIVE SATURATION AND THE 
C     * INTERNAL SLOPE.

      IF(IWF.GT.0)                                                THEN
      DO 250 J=1,IWF
          DO 200 I=IL1,IL2
              IF(FI(I).GT.0.0 .AND. ISAND(I,J).GE.-2)         THEN 
                  HP=GRKFAC(I)*DELZW(I,J)
                  HARAT=(1.0-EXP(-HP))/HP
                  CCH=2.0*BI(I,J)+3.0
                  THCRIT(I,J)=(1.0-HARAT/CCH)*THPOR(I,J)
                  IF(THCRIT(I,J).LE.0.0 .OR. THCRIT(I,J).GT.
     1                                       THPOR(I,J)) THEN
                      CALL XIT('WATROF',-1)
                  ENDIF
                  WFFLIM=CCH-(CCH+1.0)*CCH/(CCH-1.0)*THFC(I,J)
                  IF(HP.GE.25.0) THEN
                      WFF=HP*((CCH-1.0)*WFFLIM/(5.0*CCH-3.0)+
     1                     2.0*CCH/(5.0*CCH-3.0))-1.0-CCH/
     2                     (5.0*CCH-3.0)
                  ELSEIF(HP.LT.0.1) THEN
                      WFF=WFFLIM
                  ELSE
                      WFKMA=CCH*HP-1.0+EXP(-HP)-
     1                    HP*THFC(I,J)*CCH
                      WFAREA=(5.0*CCH-3.0)/(CCH+1.0)-
     1                    2.0*CCH*HP/(-1.0+EXP(HP))+
     2                    2.0*(CCH-1.0)**3*(1.0-EXP(-HP/
     3                    (CCH-1.0)))/((CCH+1.0)*(-1.0+
     4                    EXP(HP)))
                      WFF=WFKMA/WFAREA-1.0
                  ENDIF
                  RATIO=((THLIQ(I,J)-THFC(I,J))/
     1                (THCRIT(I,J)-THFC(I,J)))
                  IF(RATIO.LT.0.0) RATIO=0.0
                  IF(RATIO.GT.1.0) RATIO=1.0
C
                  IF(RATIO.GT.0.0) THEN
                      IF(J.EQ.1) HMULT=0
                      IF(J.EQ.2) HMULT=DELZW(I,1)
                      IF(J.EQ.3) HMULT=DELZW(I,1)+DELZW(I,2)
                      HMULT=EXP(-GRKFAC(I)*HMULT)*HARAT*
     1                    XSLOPE(I)*DELZW(I,J)
                      HMULT=HMULT*(1.0-THICE(I,J)/(THPOR(I,J)-
     1                    THLMIN(I,J)))**0.666667
                      DIDRN(I,J)=WFCINT(I)*HMULT*(RATIO**WFF)*DELT
                      DIDRNMX(I,J)=DELZW(I,J)*(THLIQ(I,J)-THFC(I,J))
                      IF(DIDRNMX(I,J).LE.0.0) THEN
                          DIDRN(I,J)=0.0
                      ELSE
                          DIDRN(I,J)=DIDRN(I,J)*(1.0-(WFF/2.0)*
     1                        DIDRN(I,J)/DIDRNMX(I,J))
                          IF(DIDRN(I,J).GT.DIDRNMX(I,J)) DIDRN(I,J)=
     1                        DIDRNMX(I,J)
                      ENDIF
                      SUBFLW(I)=SUBFLW(I)+FI(I)*DIDRN(I,J)
                      RUNOFF(I)=RUNOFF(I)+DIDRN(I,J)
                      THLIQ(I,J)=THLIQ(I,J)-DIDRN(I,J)/DELZW(I,J)
                  ENDIF
              ENDIF 
200       CONTINUE
250   CONTINUE
      ENDIF

      RETURN
      END