SUBROUTINE TMCALC(TBAR,THLIQ,THICE,HCP,TPOND,ZPOND,TSNOW,ZSNOW, 4
     1                  ALBSNO,RHOSNO,HCPSNO,TBASE,OVRFLW,RUNOFF,
     2                  HMFG,HTC,HTCS,WTRS,WTRG,FI,TBARW,GZERO,G12,
     3                  G23,TA,ZPLIM,THPOR,THLMIN,HCPS,DELZW,
     4                  DELZZ,ISAND,IWF,IG,ILG,IL1,IL2,JL)
C
C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICITC     
C     * JUN 17/02 - D.VERSEGHY. REMOVE INCORPORATION OF PONDED WATER
C     *                         INTO FIRST LAYER SOIL MOISTURE;
C     *                         UPDATE SUBROUTINE CALL; SHORTENED
C     *                         CLASS4 COMMON BLOCK.
C     * DEC 12/01 - D.VERSEGHY. PASS IN SWITCH TO DO SURFACE FLOW
C     *                         CALCULATION ONLY IF WATFLOOD ROUTINES
C     *                         ARE NOT BEING RUN.
C     * JUN 20/97 - D.VERSEGHY. CLASS - VERSION 2.7.
C     *                         MODIFICATIONS TO ALLOW FOR VARIABLE
C     *                         SOIL PERMEABLE DEPTH.
C     * JAN 02/96 - D.VERSEGHY. CLASS - VERSION 2.5.
C     *                         COMPLETION OF ENERGY BALANCE 
C     *                         DIAGNOSTICS; INTRODUCE CALCULATION
C     *                         OF OVERLAND FLOW.
C     * AUG 30/95 - D.VERSEGHY. CLASS - VERSION 2.4.
C     *                         VARIABLE SURFACE DETENTION CAPACITY
C     *                         IMPLEMENTED.
C     * AUG 18/95 - D.VERSEGHY. REVISIONS TO ALLOW FOR INHOMOGENEITY
C     *                         BETWEEN SOIL LAYERS AND FRACTIONAL
C     *                         ORGANIC MATTER CONTENT.
C     * AUG 16/95 - D.VERSEGHY. TWO NEW ARRAYS TO COMPLETE WATER
C     *                         BALANCE DIAGNOSTICS.
C     * DEC 22/94 - D.VERSEGHY. CLASS - VERSION 2.3.
C     *                         REVISE CALCULATIONS OF TBAR AND HTC;
C     *                         ALLOW SPECIFICATION OF LIMITING POND 
C     *                         DEPTH "PNDLIM" (PARALLEL CHANGES
C     *                         MADE SIMULTANEOUSLY IN CLASSW).
C     * NOV 01/93 - D.VERSEGHY. CLASS - VERSION 2.2.
C     *                         REVISED VERSION WITH IN-LINED CODE
C     *                         FROM TWCALC AND TFREEZ TO PERMIT 
C     *                         FREEZING AND THAWING OF SOIL LAYERS
C     *                         AT THE END OF EACH TIME STEP.
C     * JUL 30/93 - D.VERSEGHY/M.LAZARE. NEW DIAGNOSTIC FIELDS.
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. STORE PONDED WATER INTO FIRST 
C     *                         SOIL LAYER LIQUID WATER; STEP
C     *                         AHEAD SOIL LAYER TEMPERATURES 
C     *                         USING CONDUCTION HEAT FLUX
C     *                         CALCULATED AT TOP AND BOTTOM
C     *                         OF EACH LAYER.
C
      IMPLICIT NONE
      INTEGER IWF,IG,ILG,IL1,IL2,JL,I,J
      REAL GP1,ZFREZ,HADD,HCONV,TTEST,TLIM,HEXCES,THMELT,THFREZ
C
C     * INPUT/OUTPUT ARRAYS.
C
      REAL TBAR  (ILG,IG),   THLIQ (ILG,IG),   THICE (ILG,IG),
     1     HCP   (ILG,IG),   HMFG  (ILG,IG),   HTC   (ILG,IG)
C
      REAL TPOND (ILG),      ZPOND (ILG),      TSNOW (ILG),
     1     ZSNOW (ILG),      ALBSNO(ILG),      RHOSNO(ILG),       
     2     HCPSNO(ILG),      TBASE (ILG),      OVRFLW(ILG),
     3     RUNOFF(ILG),      HTCS  (ILG),      WTRS  (ILG),
     4     WTRG  (ILG)     
C
C     * INPUT ARRAYS.
C
      REAL FI    (ILG),      TBARW (ILG,IG),   GZERO (ILG),      
     1     G12   (ILG),      G23   (ILG),      TA    (ILG),      
     2     ZPLIM (ILG)
C
C     * SOIL INFORMATION ARRAYS.
C
      REAL THPOR (ILG,IG),   THLMIN(ILG,IG),   HCPS  (ILG,IG),   
     1     DELZW (ILG,IG),   DELZZ (ILG,IG)
C
      INTEGER                ISAND (ILG,IG)   
C
#include "class_com.cdk"
C-----------------------------------------------------------------------
C
C     * CALCULATE SUBSURFACE AND OVERLAND RUNOFF TERMS; ADJUST
C     * SURFACE PONDING DEPTH.
C
      DO 100 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).GT.-4 .AND. IWF.EQ.0)  THEN
              RUNOFF(I)=RUNOFF(I)+MAX(ZPOND(I)-ZPLIM(I),0.)
              OVRFLW(I)=OVRFLW(I)+FI(I)*MAX(ZPOND(I)-ZPLIM(I),0.)
              ZPOND(I)=MIN(ZPOND(I),ZPLIM(I))
          ENDIF
  100 CONTINUE
C
C     * UPDATE SOIL TEMPERATURES AFTER GROUND WATER MOVEMENT.
C
      DO 200 J=1,IG
      DO 200 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).GT.-4)  THEN
              HTC(I,J)=HTC(I,J)+FI(I)*((TBARW(I,J)+TFREZ)*
     1                 HCPW*THLIQ(I,J)+(TBAR(I,J)+TFREZ)*
     2                 HCPICE*THICE(I,J))*DELZW(I,J)/DELT
              HCP(I,J)=HCPW*THLIQ(I,J)+HCPICE*THICE(I,J)+
     1                 HCPS(I,J)*(1.-THPOR(I,J))                                                   
              IF(DELZW(I,J).GT.0.0)              THEN
                  TBAR(I,J)=((TBARW(I,J)+TFREZ)*HCPW*THLIQ(I,J)*
     1                      DELZW(I,J)+(TBAR(I,J)+TFREZ)*((HCPICE*
     2                      THICE(I,J)+HCPS(I,J)*(1.-THPOR(I,J)))*
     3                      DELZW(I,J)+HCPSND*(DELZZ(I,J)-DELZW(I,J))))/
     4                      (HCP(I,J)*DELZW(I,J)+HCPSND*(DELZZ(I,J)-
     5                      DELZW(I,J)))-TFREZ
              ENDIF
          ENDIF
  200 CONTINUE
C
C     * STEP AHEAD POND TEMPERATURE; CHECK FOR FREEZING, AND ADD
C     * FROZEN WATER TO SNOW PACK.
C
      DO 300 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).GT.-4 .AND. ZPOND(I).GT.0.0)
     1                                                             THEN
              HTC(I,1)=HTC(I,1)+FI(I)*HCPW*(TPOND(I)+TFREZ)*
     1            ZPOND(I)/DELT
              GP1=ZPOND(I)*(G12(I)-GZERO(I))/(ZPOND(I)+DELZZ(I,1))+
     1            GZERO(I)
              TPOND(I) =TPOND(I)+(GZERO(I)-GP1)*DELT/(HCPW*ZPOND(I))
              GZERO(I)=GP1
          ENDIF
  300 CONTINUE
C
      DO 400 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ZPOND(I).GT.0. .AND. TPOND(I).LT.0.)
     1                                                              THEN
             HTCS(I)=HTCS(I)-FI(I)*HCPSNO(I)*(TSNOW(I)+TFREZ)*
     1               ZSNOW(I)/DELT
             ZFREZ=0.0
             HADD=-TPOND(I)*HCPW*ZPOND(I)                                              
             TPOND(I)=0.0                                                               
             HCONV=CLHMLT*RHOW*ZPOND(I)                                               
             HTC(I,1)=HTC(I,1)-FI(I)*HCPW*(TPOND(I)+TFREZ)*
     1                ZPOND(I)/DELT
             IF(HADD.LE.HCONV)             THEN                                                      
                ZFREZ=HADD/(CLHMLT*RHOW)                                                
                ZPOND(I)=ZPOND(I)-ZFREZ                                                       
                ZFREZ=ZFREZ*RHOW/RHOICE                                                 
                IF(.NOT.(ZSNOW(I).GT.0.0)) ALBSNO(I)=0.50                                     
                TSNOW(I)=TSNOW(I)*HCPSNO(I)*ZSNOW(I)/(HCPSNO(I)*ZSNOW(I)
     1                  +HCPICE*ZFREZ)                    
                RHOSNO(I)=(RHOSNO(I)*ZSNOW(I)+RHOICE*ZFREZ)/(ZSNOW(I)
     1                   +ZFREZ)                        
                HCPSNO(I)=HCPICE*RHOSNO(I)/RHOICE                                             
                ZSNOW(I)=ZSNOW(I)+ZFREZ                                                       
                TPOND(I)=0.0                                                               
             ELSE                                                                        
                HADD=HADD-HCONV                                                         
                ZFREZ=ZPOND(I)*RHOW/RHOICE                                                 
                TTEST=-HADD/(HCPICE*ZFREZ)                                              
                IF(ZSNOW(I).GT.0.0) THEN
                    TLIM=MIN(TSNOW(I),TBAR(I,1))
                ELSE
                    TLIM=MIN(TA(I)-TFREZ,TBAR(I,1))
                ENDIF
                IF(TTEST.LT.TLIM)       THEN                                    
                   HEXCES=HADD+TLIM*HCPICE*ZFREZ                         
                   GZERO(I)=GZERO(I)-HEXCES/DELT                                             
                   HTC(I,1)=HTC(I,1)+FI(I)*(HADD-HEXCES)/DELT
                   TSNOW(I)=(TSNOW(I)*HCPSNO(I)*ZSNOW(I)+
     1                      TLIM*HCPICE*ZFREZ)          
     2                      /(HCPSNO(I)*ZSNOW(I)+HCPICE*ZFREZ)                                    
                ELSE                                                                    
                   TSNOW(I)=(TSNOW(I)*HCPSNO(I)*ZSNOW(I)+TTEST*HCPICE*
     1                       ZFREZ)/(HCPSNO(I)*ZSNOW(I)+HCPICE*ZFREZ)                                    
                   HTC(I,1)=HTC(I,1)+FI(I)*HADD/DELT
                ENDIF                                                                   
                IF(.NOT.(ZSNOW(I).GT.0.0)) ALBSNO(I)=0.50                                     
                RHOSNO(I)=(RHOSNO(I)*ZSNOW(I)+RHOICE*ZFREZ)/(ZSNOW(I)+
     1                     ZFREZ)                        
                HCPSNO(I)=HCPICE*RHOSNO(I)/RHOICE                                             
                ZSNOW(I)=ZSNOW(I)+ZFREZ                                                       
                ZPOND(I)=0.0                                                               
                TPOND(I)=0.0                                                               
             ENDIF                                                                       
             HTC (I,1)=HTC (I,1)+FI(I)*HCPW*(TPOND(I)+TFREZ)*
     1                 ZPOND(I)/DELT
             HMFG(I,1)=HMFG(I,1)-FI(I)*CLHMLT*RHOICE*ZFREZ/DELT
             WTRS(I)=WTRS(I)+FI(I)*ZFREZ*RHOICE/DELT
             WTRG(I)=WTRG(I)-FI(I)*ZFREZ*RHOICE/DELT
             HTCS(I)=HTCS(I)+FI(I)*HCPSNO(I)*(TSNOW(I)+TFREZ)*ZSNOW(I)/
     1               DELT
          ENDIF
  400 CONTINUE
C
C     * STEP AHEAD SOIL LAYER TEMPERATURES; CHECK FOR FREEZING OR
C     * THAWING.
C
      DO 500 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).GT.-4)               THEN
              TBAR(I,1)=TBAR(I,1)+(GZERO(I)-G12(I))*DELT/
     1                  (HCP(I,1)*DELZW(I,1)+HCPSND*(DELZZ(I,1)-
     2                  DELZW(I,1)))
              TBAR(I,2)=TBAR(I,2)+(G12  (I)-G23(I))*DELT/
     1                  (HCP(I,2)*DELZW(I,2)+HCPSND*(DELZZ(I,2)-
     2                  DELZW(I,2)))                         
              IF(DELZZ(I,IG).GT.0.0)                     THEN
                  TBAR(I,IG)=TBAR(I,IG)+G23(I)*(1.0-(DELZ(IG)-
     1                  DELZZ(I,IG))/DELZ(IG))*DELT/(HCP(I,IG)*
     2                  DELZZ(I,IG))
              ENDIF
              IF(DELZZ(I,IG).LT.DELZ(IG)) THEN
                  TBASE(I)=TBASE(I)+FI(I)*G23(I)*((DELZ(IG)-
     1                  DELZZ(I,IG))/DELZ(IG))*DELT/(HCPSND*(DELZ(IG)-
     2                  DELZZ(I,IG)))
              ENDIF
          ENDIF
  500 CONTINUE
C     
      DO 600 J=1,IG                                                               
      DO 600 I=IL1,IL2
          IF(FI(I).GT.0..AND. ISAND(I,1).GT.-4.AND.DELZW(I,J).GT.0.)THEN
              HTC(I,J)=HTC(I,J)-FI(I)*(TBAR(I,J)+TFREZ)*(HCP(I,J)*
     1                    DELZW(I,J)+HCPSND*(DELZZ(I,J)-
     2                    DELZW(I,J)))/DELT
              IF(TBAR(I,J).LT.0. .AND. THLIQ(I,J).GT.THLMIN(I,J))
     1                                                           THEN                        
                  THFREZ=-(HCP(I,J)*DELZW(I,J)+HCPSND*(DELZZ(I,J)-
     1                DELZW(I,J)))*TBAR(I,J)/(CLHMLT*RHOW*DELZW(I,J))                              
                  IF(THFREZ.LE.(THLIQ(I,J)-THLMIN(I,J))) THEN                         
                      HMFG(I,J)=HMFG(I,J)-FI(I)*THFREZ*CLHMLT*
     1                          RHOW*DELZW(I,J)/DELT
                      HTC(I,J)=HTC(I,J)-FI(I)*THFREZ*CLHMLT*
     1                          RHOW*DELZW(I,J)/DELT
                      THLIQ(I,J)=THLIQ(I,J)-THFREZ                                        
                      THICE(I,J)=THICE(I,J)+THFREZ*RHOW/RHOICE                            
                      HCP(I,J)=HCPW*THLIQ(I,J)+HCPICE*THICE(I,J)+
     1                           HCPS(I,J)*(1.-THPOR(I,J))
                      TBAR (I,J)=0.0                                                   
                  ELSE                                                                
                      HMFG(I,J)=HMFG(I,J)-FI(I)*(THLIQ(I,J)-
     1                    THLMIN(I,J))*CLHMLT*RHOW*DELZW(I,J)/DELT
                      HTC(I,J)=HTC(I,J)-FI(I)*(THLIQ(I,J)-
     1                    THLMIN(I,J))*CLHMLT*RHOW*DELZW(I,J)/DELT
                      HADD=(THFREZ-(THLIQ(I,J)-THLMIN(I,J)))*CLHMLT*
     1                     RHOW*DELZW(I,J)              
                      THICE(I,J)=THICE(I,J)+(THLIQ(I,J)-
     1                           THLMIN(I,J))*RHOW/RHOICE          
                      THLIQ(I,J)=THLMIN(I,J)
                      HCP(I,J)=HCPW*THLIQ(I,J)+HCPICE*THICE(I,J)+
     1                           HCPS(I,J)*(1.-THPOR(I,J))
                      TBAR (I,J)=-HADD/(HCP(I,J)*DELZW(I,J)+HCPSND*
     1                           (DELZZ(I,J)-DELZW(I,J)))
                  ENDIF                                                               
              ENDIF
C                                                                   
              IF(TBAR(I,J).GT.0. .AND. THICE(I,J).GT.0.)        THEN                           
                  THMELT=(HCP(I,J)*DELZW(I,J)+HCPSND*(DELZZ(I,J)-
     1             DELZW(I,J)))*TBAR(I,J)/(CLHMLT*RHOICE*DELZW(I,J))                             
                  IF(THMELT.LE.THICE(I,J))                 THEN 
                      HMFG(I,J)=HMFG(I,J)+FI(I)*THMELT*CLHMLT*
     1                          RHOICE*DELZW(I,J)/DELT
                      HTC(I,J)=HTC(I,J)+FI(I)*THMELT*CLHMLT*
     1                          RHOICE*DELZW(I,J)/DELT
                      THICE(I,J)=THICE(I,J)-THMELT                                        
                      THLIQ(I,J)=THLIQ(I,J)+THMELT*RHOICE/RHOW                            
                      HCP(I,J)=HCPW*THLIQ(I,J)+HCPICE*THICE(I,J)+
     1                           HCPS(I,J)*(1.-THPOR(I,J))
                      TBAR (I,J)=0.0                                                   
                  ELSE                                                                
                      HMFG(I,J)=HMFG(I,J)+FI(I)*THICE(I,J)*CLHMLT*
     1                          RHOICE*DELZW(I,J)/DELT
                      HTC(I,J)=HTC(I,J)+FI(I)*THICE(I,J)*CLHMLT*
     1                          RHOICE*DELZW(I,J)/DELT
                    HADD=(THMELT-THICE(I,J))*CLHMLT*RHOICE*DELZW(I,J)         
                      THLIQ(I,J)=THLIQ(I,J)+THICE(I,J)*RHOICE/RHOW                          
                      THICE(I,J)=0.0                                                    
                      HCP(I,J)=HCPW*THLIQ(I,J)+HCPICE*THICE(I,J)+
     1                           HCPS(I,J)*(1.-THPOR(I,J))
                      TBAR (I,J)=HADD/(HCP(I,J)*DELZW(I,J)+HCPSND*
     1                           (DELZZ(I,J)-DELZW(I,J)))
                  ENDIF                                                               
              ENDIF
              HTC(I,J)=HTC(I,J)+FI(I)*(TBAR(I,J)+TFREZ)*(HCP(I,J)*
     1                    DELZW(I,J)+HCPSND*(DELZZ(I,J)-
     2                    DELZW(I,J)))/DELT
          ENDIF
  600 CONTINUE
C                                                                                  
      RETURN                                                                      
      END