SUBROUTINE SNINFL(R,TR,ZSNOW,TSNOW,RHOSNO,HCPSNO,HTCS,HMFN,PCPG, 2
     1                  ROFN,FI,ILG,IL1,IL2,JL)                      
C
C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICIT
C     * JUL 26/02 - D.VERSEGHY. SHORTENED CLASS4 COMMON BLOCK.
C     * JUN 20/97 - D.VERSEGHY. CLASS - VERSION 2.7.
C     *                         PASS IN NEW "CLASS4" COMMON BLOCK.
C     * JAN 02/96 - D.VERSEGHY. CLASS - VERSION 2.5.
C     *                         COMPLETION OF ENERGY BALANCE
C     *                         DIAGNOSTICS.
C     * DEC 16/94 - D.VERSEGHY. CLASS - VERSION 2.3.
C     *                         NEW DIAGNOSTIC FIELD "ROFN" ADDED.
C     * JUL 30/93 - D.VERSEGHY/M.LAZARE. CLASS - VERSION 2.2.
C     *                                  NEW DIAGNOSTIC FIELDS.
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. RAIN INFILTRATION INTO SNOWPACK.
C
      IMPLICIT NONE
      INTEGER ILG,IL1,IL2,JL,I
      REAL RAIN,HRCOOL,HRFREZ,HSNWRM,HSNMLT,ZMELT,ZFREZ
C     * INPUT/OUTPUT ARRAYS.
C
      REAL R     (ILG),    TR    (ILG),    ZSNOW (ILG),    TSNOW (ILG),
     1     RHOSNO(ILG),    HCPSNO(ILG),    HTCS  (ILG),    HMFN  (ILG),
     2     PCPG  (ILG),    ROFN  (ILG)
C
C     * INPUT ARRAY.
C
      REAL FI    (ILG)
C                                                               
#include "class_com.cdk"
C-----------------------------------------------------------------------
      DO 100 I=IL1,IL2
          IF(FI(I).GT.0. .AND. R(I).GT.0. .AND. ZSNOW(I).GT.0.)
     1                                                              THEN    
              HTCS(I)=HTCS(I)-FI(I)*HCPSNO(I)*(TSNOW(I)+TFREZ)*
     1                ZSNOW(I)/DELT
              RAIN=R(I)*DELT                                                                 
              HRCOOL=TR(I)*HCPW*RAIN                                                         
              HRFREZ=CLHMLT*RHOW*RAIN                                                     
              HSNWRM=(0.0-TSNOW(I))*HCPSNO(I)*ZSNOW(I)                                             
              HSNMLT=CLHMLT*RHOSNO(I)*ZSNOW(I)                                                  
              IF(HRCOOL.GE.(HSNWRM+HSNMLT))                 THEN                                          
                  HRCOOL=HRCOOL-(HSNWRM+HSNMLT)                                           
                  ZMELT=ZSNOW(I)*RHOSNO(I)/RHOW                                                 
                  HMFN(I)=HMFN(I)+FI(I)*CLHMLT*ZMELT*RHOW/DELT
                  HTCS(I)=HTCS(I)+FI(I)*CLHMLT*ZMELT*RHOW/DELT
                  TR(I)=HRCOOL/(HCPW*(ZMELT+RAIN))                                           
                  R(I)=R(I)+ZMELT/DELT                                                          
                  ZSNOW(I)=0.0                                                               
                  TSNOW(I)=0.0                                                               
                  RHOSNO(I)=0.0                                                              
                  HCPSNO(I)=0.0                                                              
              ELSE IF(HRCOOL.GE.HSNWRM .AND. HRCOOL.LT.(HSNWRM+HSNMLT))
     1                                                      THEN
                  HSNMLT=HRCOOL-HSNWRM                                                    
                  ZMELT=HSNMLT/(CLHMLT*RHOSNO(I))                                            
                  HMFN(I)=HMFN(I)+FI(I)*CLHMLT*ZMELT*RHOSNO(I)/DELT
                  HTCS(I)=HTCS(I)+FI(I)*CLHMLT*ZMELT*RHOSNO(I)/DELT
                  ZSNOW(I)=ZSNOW(I)-ZMELT                                                       
                  ZMELT=ZMELT*RHOSNO(I)/RHOW                                                 
                  TSNOW(I)=0.0                                                               
                  TR(I)=0.0                                                                  
                  R(I)=R(I)+ZMELT/DELT                                                          
              ELSE IF(HSNWRM.GE.(HRCOOL+HRFREZ))            THEN                                      
                  HSNWRM=(HRCOOL+HRFREZ)-HSNWRM                                           
                  HMFN(I)=HMFN(I)-FI(I)*HRFREZ/DELT
                  HTCS(I)=HTCS(I)-FI(I)*HRFREZ/DELT
                  RHOSNO(I)=(RHOSNO(I)*ZSNOW(I)+RHOW*RAIN)/ZSNOW(I)                                   
                  IF(RHOSNO(I).GT.RHOICE)      THEN                                               
                      ZSNOW(I)=RHOSNO(I)*ZSNOW(I)/RHOICE                                           
                      RHOSNO(I)=RHOICE                                                       
                  ENDIF                                                                   
                  HCPSNO(I)=HCPICE*RHOSNO(I)/RHOICE                                             
                  TSNOW(I)=HSNWRM/(HCPSNO(I)*ZSNOW(I))                                             
                  TR(I)=0.0                                                                  
                  R(I)=0.0                                                                   
              ELSE IF(HSNWRM.GT.HRCOOL .AND. HSNWRM.LT.(HRCOOL+HRFREZ)) 
     1                                                      THEN
                  HRFREZ=HSNWRM-HRCOOL                                                    
                  ZFREZ=HRFREZ/(CLHMLT*RHOW)                                              
                  HMFN(I)=HMFN(I)-FI(I)*CLHMLT*ZFREZ*RHOW/DELT
                  HTCS(I)=HTCS(I)-FI(I)*CLHMLT*ZFREZ*RHOW/DELT
                  RHOSNO(I)=(RHOSNO(I)*ZSNOW(I)+RHOW*ZFREZ)/ZSNOW(I)                                  
                  IF(RHOSNO(I).GT.RHOICE)      THEN                                               
                      ZSNOW(I)=RHOSNO(I)*ZSNOW(I)/RHOICE                                           
                      RHOSNO(I)=RHOICE                                                       
                  ENDIF                                                                   
                  HCPSNO(I)=HCPICE*RHOSNO(I)/RHOICE                                             
                  R(I)=R(I)-ZFREZ/DELT                                                          
                  TR(I)=0.0                                                                  
                  TSNOW(I)=0.0                                                               
              ENDIF                                                                       
              HTCS(I)=HTCS(I)+FI(I)*HCPSNO(I)*(TSNOW(I)+TFREZ)*
     1                ZSNOW(I)/DELT
              PCPG(I)=PCPG(I)+FI(I)*R(I)*RHOW
              ROFN(I)=ROFN(I)+FI(I)*R(I)*RHOW
          ENDIF
  100 CONTINUE
C                                                                          
      RETURN                                                                      
      END