SUBROUTINE ICEBAL(TBAR,TPOND,ZPOND,TSNOW,RHOSNO,ZSNOW,HCPSNO, 2
     1                  HMFG,HTCS,HTC,WTRS,WTRG,RUNOFF,OVRFLW,
     2                  FI,EVAP,R,TR,GZERO,G12,G23,HCP,QMELT,ZMAT,
     3                  TMOVE,WMOVE,ZRMDR,TADD,ZMOVE,TBOT,
     4                  ISAND,ICONT,IWF,IG,IGP1,IGP2,ILG,IL1,IL2,JL )
C
C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICIT
C     * JUN 24/02 - D.VERSEGHY. UPDATE SUBROUTINE CALL; SHORTENED
C     *                         CLASS4 COMMON BLOCK.
C     * DEC 12/01 - D.VERSEGHY. PASS IN SWITCH TO CALCULATE SURFACE FLOW
C     *                         ONLY IF WATFLOOD ROUTINES ARE NOT CALLED.
C     * NOV 16/98 - M.LAZARE.   "WTRG" UPDATED TO GAIN ICE MASS AS "WTRS"
C     *                         LOSES SNOW MASS IN SNOW->ICE CONVERSION
C     *                         (TWO PLACES).
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.
C     * AUG 18/95 - D.VERSEGHY. CLASS - VERSION 2.4.
C     *                         REVISIONS TO ALLOW FOR INHOMOGENEITY 
C     *                         BETWEEN SOIL LAYERS IN MAIN CODE.
C     * JUL 30/93 - D.VERSEGHY/M.LAZARE. CLASS - VERSION 2.2.
C     *                                  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. STEP AHEAD "SOIL" LAYER TEMPERATURES
C     *                         OVER CONTINENTAL ICE SHEETS; ASSIGN
C     *                         PONDED WATER TO RUNOFF; ADJUST LAYER
C     *                         DEPTHS FOR ACCUMULATION/ABLATION.
C
      IMPLICIT NONE
      INTEGER IWF,IG,IGP1,IGP2,ILG,IL1,IL2,JL,I,J,K
      REAL RADD,ZMELT,TZERO,QADD
C
C     * INPUT/OUTPUT FIELDS.
C                                                                                 
      REAL TBAR  (ILG,IG), HMFG  (ILG,IG), HTC   (ILG,IG)
C
      REAL TPOND (ILG),    ZPOND (ILG),    TSNOW (ILG),    RHOSNO(ILG),    
     1     ZSNOW (ILG),    HCPSNO(ILG),    HTCS  (ILG),    WTRS  (ILG),    
     2     WTRG  (ILG),    RUNOFF(ILG),    OVRFLW(ILG)
C
C     * INPUT FIELDS.
C
      REAL FI   (ILG),     EVAP  (ILG),    R     (ILG),    TR    (ILG), 
     1     GZERO (ILG),    G12   (ILG),    G23   (ILG),    QMELT (ILG)
C
      REAL HCP   (ILG,IG)
C
      INTEGER              ISAND (ILG,IG)
C
C
C     * WORK FIELDS.
C
      REAL ZMAT  (ILG,IGP2,IGP1),          TMOVE (ILG,IGP2),
     1     WMOVE (ILG,IGP2),               ZRMDR (ILG,IGP1)
C
      REAL TADD  (ILG),    ZMOVE (ILG),    TBOT  (ILG) 
C
      INTEGER              ICONT (ILG)
C                                    
#include "class_com.cdk"
C-----------------------------------------------------------------------
C
C     * STEP AHEAD LAYER TEMPERATURES AND ADD HEATING EFFECTS OF
C     * RAINFALL.
C    
      DO 100 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4)                   THEN
              TZERO=TBAR(I,1)+DELZ(1)*(GZERO(I)+0.5*G12(I))/(3.0*TCGLAC)                        
              TBOT(I)=TZERO-(G23(I)*(DELZ(3)+DELZ(2))+G12(I)*
     1                (DELZ(1)+DELZ(2))+GZERO(I)*DELZ(1))/(2.0*TCGLAC)
              TBAR(I,1 )=TBAR(I,1 )+(GZERO(I)-G12(I))*DELT/
     1                   (HCP(I,1) *DELZ(1))                       
              TBAR(I,2 )=TBAR(I,2 )+(G12  (I)-G23(I))*DELT/
     1                   (HCP(I,2) *DELZ(2))                         
              TBAR(I,IG)=TBAR(I,IG)+ G23(I)          *DELT/
     1                   (HCP(I,IG)*DELZ(IG))                           
C                                                                                  
              IF(R(I).GT.0.)                                  THEN 
                 RADD=R(I)*DELT                                                             
                 TPOND(I)=(TPOND(I)*ZPOND(I)+TR(I)*RADD)/(ZPOND(I)+RADD)                                
                 ZPOND(I)=ZPOND(I)+RADD                                                        
              ENDIF                                                                       
              IF(ZPOND(I).GT.0.)                              THEN  
                 HTC (I,1)=HTC(I,1)-FI(I)*(TBAR(I,1)+TFREZ)*HCPICE*
     1                     DELZ(1)/DELT
                 TBAR(I,1)=(TBAR(I,1)*HCPICE*DELZ(1)+                   
     1                      TPOND(I)*HCPW*ZPOND(I))/(HCPICE*DELZ(1))
                 HTC (I,1)=HTC(I,1)+FI(I)*(TBAR(I,1)+TFREZ)*HCPICE*
     1                     DELZ(1)/DELT
                 IF(IWF.EQ.0) THEN
                     RUNOFF(I)=RUNOFF(I)+ZPOND(I)                                                     
                     OVRFLW(I)=OVRFLW(I)+FI(I)*ZPOND(I) 
                 ENDIF
                 ZPOND (I)=0.0                                                               
                 TPOND (I)=0.0
              ENDIF
          ENDIF
  100 CONTINUE
C
C     * IF LAYER TEMPERATURES OVERSHOOT ZERO, ADD EXCESS HEAT TO
C     * HEAT OF MELTING.
C
      DO 150 J=1,IG
      DO 150 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4)                   THEN
              IF(TBAR(I,J).GT.0.)                            THEN  
                  QADD=TBAR(I,J)*HCPICE*DELZ(J)/DELT  
                  QMELT(I)=QMELT(I)+QADD
                  HTC(I,J)=HTC(I,J)-FI(I)*QADD
                  HTC(I,1)=HTC(I,1)+FI(I)*QADD
                  TBAR(I,J)=0.0                                                       
              ENDIF
              HTC(I,J)=HTC(I,J)-FI(I)*(TBAR(I,J)+TFREZ)*HCPICE*
     1                 DELZ(J)/DELT
          ENDIF
  150 CONTINUE
C
C     * APPLY CALCULATED HEAT OF MELTING TO UPPER ICE LAYER; ADD MELTED
C     * WATER TO TOTAL RUNOFF; CALCULATE DEPTH OF ICE REMOVED BY MELTING
C     * AND SUBLIMATION; RECALCULATE ICE LAYER TEMPERATURES.
C     
      DO 200 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4)                   THEN                         
              IF(QMELT(I).GT.0. .OR. EVAP(I).GT.0.)           THEN                                        
                  TMOVE(I,1)=TBAR(I,2)                                                      
                  TMOVE(I,2)=TBAR(I,3)                                                      
                  TMOVE(I,3)=TBOT(I)                                                           
                  ZMELT=QMELT(I)*DELT/((0.0-TBAR(I,1))*HCPICE+
     1                  CLHMLT*RHOICE)                 
                  RUNOFF(I)=RUNOFF(I)+ZMELT*RHOICE/RHOW                                         
                  HMFG(I,1)=HMFG(I,1)+FI(I)*CLHMLT*RHOICE*ZMELT/DELT
                  HTC (I,1)=HTC(I,1)-FI(I)*(QMELT(I)-CLHMLT*RHOICE*
     1                     ZMELT/DELT)
                  ZMOVE (I)=ZMELT+EVAP(I)*DELT*RHOW/RHOICE
                  WTRG  (I)=WTRG(I)+FI(I)*ZMOVE(I)*RHOICE/DELT
              ENDIF
          ENDIF                                                                       
  200 CONTINUE                                       
C
      DO 250 J=1,IG
      DO 250 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4 .AND.
     1       (QMELT(I).GT.0. .OR. EVAP(I).GT.0.))                   THEN 
              TBAR(I,J)=(TBAR(I,J)*(DELZ(J)-ZMOVE(I))+TMOVE(I,J)*
     1                   ZMOVE(I))/DELZ(J)
          ENDIF                                                                       
  250 CONTINUE                                                                
C
C     * IF SNOW PACK EXCEEDS 100 KG M-2 OR SNOW DENSITY EXCEEDS 
C     * 900 KG M-3, CONVERT EXCESS TO ICE AND MOVE THE LOCATIONS
C     * OF THE ICE LAYERS ACCORDINGLY.
C     * IF SUBLIMATION (DEPOSITION) IS OCCURRING, MOVE THE ICE
C     * LAYERS AS WELL.
C
      DO 300 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4)                   THEN
              ICONT(I)=0
              HTCS(I)=HTCS(I)-FI(I)*(TSNOW(I)+TFREZ)*HCPSNO(I)*
     1                ZSNOW(I)/DELT
              IF((RHOSNO(I)*ZSNOW(I)).GT.100.)                THEN                                        
                  WMOVE(I,1)=(RHOSNO(I)*ZSNOW(I)-100.)/RHOICE                                
                  TMOVE(I,1)=TSNOW(I)                                                      
                  WTRS(I)=WTRS(I)-FI(I)*WMOVE(I,1)*RHOICE/DELT
                  WTRG(I)=WTRG(I)+FI(I)*WMOVE(I,1)*RHOICE/DELT
                  ZSNOW(I)=ZSNOW(I)-WMOVE(I,1)                                                
                  RHOSNO(I)=100.0/ZSNOW(I)                                                  
                  HCPSNO(I)=HCPICE*RHOSNO(I)/RHOICE
                  ICONT(I)=1
              ELSE IF(RHOSNO(I).GE.900.)                      THEN
                  WMOVE(I,1)=ZSNOW(I)*RHOSNO(I)/RHOICE                                        
                  TMOVE(I,1)=TSNOW(I)                                                      
                  WTRS(I)=WTRS(I)-FI(I)*WMOVE(I,1)*RHOICE/DELT
                  WTRG(I)=WTRG(I)+FI(I)*WMOVE(I,1)*RHOICE/DELT
                  ZSNOW(I)=0.0                                                           
                  RHOSNO(I)=0.0                                                          
                  HCPSNO(I)=0.0                                                          
                  TSNOW(I)=0.0
                  ICONT(I)=1
              ENDIF                     
              HTCS(I)=HTCS(I)+FI(I)*(TSNOW(I)+TFREZ)*HCPSNO(I)*
     1                ZSNOW(I)/DELT
          ENDIF
  300 CONTINUE
C               
      DO 400 J=1,IG
      DO 400 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4)                   THEN
              ZRMDR(I,J)=DELZ(J)                                                    
          ENDIF                                                  
  400 CONTINUE                                                            
C               
      DO 450 J=1,IG
      DO 450 K=1,IG+1
      DO 450 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4 .AND.
     1       ICONT(I).EQ.1)                                         THEN
              ZMAT(I,K,J)=0.0 
          ENDIF
  450 CONTINUE
C
      DO 500 J=2,IG+1
      DO 500 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4 .AND.
     1       ICONT(I).EQ.1)                                         THEN
              WMOVE(I,J)=DELZ(J-1)                                                  
              TMOVE(I,J)=TBAR(I,J-1)                                                
          ENDIF
  500 CONTINUE
C
      DO 550 K=1,IG+1
      DO 550 J=1,IG
      DO 550 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4 .AND.
     1       ICONT(I).EQ.1)                                         THEN
              IF(ZRMDR(I,J).GT.0. .AND. WMOVE(I,K).GT.0.)      THEN                    
                  ZMAT(I,K,J)=WMOVE(I,K)                                          
                  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)                              
                      ZRMDR(I,J)=0.0                                            
                  ELSE                                                        
                      ZRMDR(I,J)=ZRMDR(I,J)-ZMAT(I,K,J)                             
                      WMOVE(I,K)=0.0                                            
                  ENDIF                                                       
              ENDIF                                                           
          ENDIF
  550 CONTINUE
C
      DO 650 J=1,IG
          DO 600 I=IL1,IL2
              IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4)               THEN
                  TADD(I)=0.
              ENDIF
  600     CONTINUE
C
          DO 620 K=1,IG+1
          DO 620 I=IL1,IL2
              IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4 .AND.
     1           ICONT(I).EQ.1)                                     THEN
                  TADD(I)=TADD(I)+TMOVE(I,K)*ZMAT(I,K,J)
              ENDIF                                    
  620     CONTINUE                                                            
C
          DO 640 I=IL1,IL2
              IF(FI(I).GT.0. .AND. ISAND(I,1).EQ.-4)               THEN
                  TADD(I)=TADD(I)+TBAR(I,J)*ZRMDR(I,J)                                        
                  TBAR(I,J)=TADD(I)/DELZ(J)
                  HTC(I,J)=HTC(I,J)+FI(I)*(TBAR(I,J)+TFREZ)*HCPICE*
     1                     DELZ(J)/DELT
              ENDIF                                              
  640     CONTINUE
  650 CONTINUE                                                                
C                                                                                  
      RETURN                                                                      
      END