SUBROUTINE TSOLVC(ISNOW,FI, 2,6
     1                 QSWNET,QSWNC,QSWNG,QLWOUT,QLWOC,QLWOG,QTRANS,
     2                 QSENS,QSENSC,QSENSG,QEVAP,QEVAPC,QEVAPG,EVAPC,
     3                 EVAPG,TCAN,QCAN,TZERO,QZERO,GZERO,QMELTC,
     4                 QMELTG,RAICAN,SNOCAN,CDH,CDM,RIB,TAC,CFLUX,
     5                 FTEMP,FVAP,ILMO,UE,H,
     6                 QSWINV,QSWINI,QLWIN,TPOTA,QA,VA,VAC,PADRY,RHOAIR,
     7                 ALVISC,ALNIRC,ALVISG,ALNIRG,TRVISC,TRNIRC,FSVF,
     8                 CRIB,CPHCHC,CPHCHG,CEVAP,TADP,TVIRTA,RC,DLEAF,
     9                 AILCAN,ZOSCLH,ZOSCLM,ZRSLFH,ZRSLFM,ZOH,ZOM,
     A                 FCOR,GCONST,GCOEFF,TGND,TRSNOW,FSNOWC,FRAINC,
     B                 CHCAP,CMASS,IWATER,IEVAP,ITERCT,
     C                 ISLFD,ILW,ILG,IL1,IL2,JL,  
     D                 TSTEP,TVIRTC,TVIRTG,EVBETA,XEVAP,EVPWET,Q0SAT,
     E                 RB,RAGINV,RBINV,XEVAPM,RBCINV,QAC,TVRTAC,TPOTG,
     F                 RESID,IEVAPC,DCFLXM,WC,DRAGIN,CFLUXM,TCANO,
     G                 TRTOP,QSTOR,A,B,ZOMS,ZOHS,LZZ0,LZZ0T,FM,FH,
     H                 ITER,NITER,KF1,KF2 )
C               
C     * AUG 19/04 - Y.DELAGE.   REGROUP COMMON BLOCKS
C     *                         MAKE DECLARATIONS EXPLICIT
C     * AUG 05/03 - Y.DELAGE.   USE THE CANOPY AIR RESISTANCE TO CALCULATE A 
C     *                         ROUGHNESS LENGTH FOR TEMPERATURE AND HUMIDITY.
C     *                         REPLACE SECANT METHOD BY NEWTON-RAPHSON SCHEME
C     *                         FOR BOTH ITERATION LOOPS.
C     *                         LIMIT NUMBER OF ITERATIONS (ITERMX) TO 5 AND
C     *                         APPLY CORRECTIONS IF RESIDUE REMAINS.
C     * NOV 07/02 - Y.DELAGE/D.VERSEGHY. NEW CALL TO FLXSURFZ; VIRTUAL
C     *                         AND POTENTIAL TEMPERATURE CORRECTIONS.
C     * NOV 01/02 - P.BARTLETT. MODIFICATIONS TO CALCULATIONS OF QAC
C     *                         AND RB.
C     * JUL 26/02 - D.VERSEGHY. SHORTENED CLASS4 COMMON BLOCK.
C     * MAR 28/02 - D.VERSEGHY. STREAMLINED SUBROUTINE CALL.
C     * MAR 10/02 - M.LAZARE.   VECTORIZE LOOP 650 BY SPLITTING INTO TWO.
C     * JAN 18/02 - P.BARTLETT/D.VERSEGHY. NEW "BETA" FORMULATION FOR 
C     *                         BARE SOIL EVAPORATION BASED ON LEE AND
C     *                         PIELKE.
C     * APR 11/01 - M.LAZARE.   SHORTENED "CLASS2" COMMON BLOCK.
C     * OCT 06/00 - D.VERSEGHY. CONDITIONAL "IF" IN ITERATION SEQUENCE
C     *                         TO AVOID DIVIDE BY ZERO.
C     * DEC 16/99 - A.WU/D.VERSEGHY. REVISED CANOPY TURBULENT FLUX 
C     *                              FORMULATION: ADD PARAMETRIZATION
C     *                              OF CANOPY AIR TEMPERATURE.
C     * DEC 07/99 - A.WU/D.VERSEGHY. NEW SOIL EVAPORATION FORMULATION.
C     * JUL 24/97 - D.VERSEGHY. CLASS - VERSION 2.7.
C     *                         REPLACE BISECTION METHOD IN SURFACE 
C     *                         TEMPERATURE ITERATION SCHEME WITH 
C     *                         SECANT METHOD FOR FIRST TEN ITERATIONS.
C     *                         PASS QZERO,QA,ZOMS,ZOHS TO REVISED
C     *                         DRCOEF (ZOMS AND ZOHS ALSO NEW WORK ARRAYS
C     *                         PASSED TO THIS ROUTINE).
C     * JUN 20/97 - D.VERSEGHY. PASS IN NEW "CLASS4" COMMON BLOCK.
C     * JAN 02/96 - D.VERSEGHY. CLASS - VERSION 2.5.
C     *                         COMPLETION OF ENERGY BALANCE 
C     *                         DIAGNOSTICS.  ALSO, PASS SWITCH "ILW"
C     *                         THROUGH SUBROUTINE CALL, SPECIFYING 
C     *                         WHETHER QLWIN REPRESENTS INCOMING
C     *                         (ILW=1) OR NET (ILW=2) LONGWAVE
C     *                         RADIATION ABOVE THE GROUND.
C     * NOV 30/94 - M.LAZARE.   CLASS - VERSION 2.3.
C     *                         NEW DRAG COEFFICIENT AND RELATED FIELDS,
C     *                         NOW DETERMINED IN ROUTINE "DRCOEF".
C     * OCT 04/94 - D.VERSEGHY. CHANGE "CALL ABORT" TO "CALL XIT" TO
C     *                         ENABLE RUNNING ON PCS.
C     * JAN 24/94 - M.LAZARE.   UNFORMATTED I/O COMMENTED OUT IN LOOPS
C     *                         200 AND 600. 
C     * JUL 29/93 - D.VERSEGHY. CLASS - VERSION 2.2.
C     *                         ADD TRANSMISSION THROUGH SNOWPACK TO
C     *                         "QSWNET" FOR DIAGNOSTIC PURPOSES. 
C     * OCT 15/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. ITERATIVE TEMPERATURE CALCULATIONS 
C     *                         FOR VEGETATION CANOPY AND UNDERLYING
C     *                         SURFACE.
C
      IMPLICIT NONE
C     * OUTPUT ARRAYS.
C
      REAL QSWNET(ILG),    QSWNC (ILG),    QSWNG (ILG),    QLWOUT(ILG),   
     1     QLWOC (ILG),    QLWOG (ILG),    QTRANS(ILG),    QSENS (ILG),    
     2     QSENSC(ILG),    QSENSG(ILG),    QEVAP (ILG),    QEVAPC(ILG),    
     3     QEVAPG(ILG),    EVAPC (ILG),    EVAPG (ILG),    TCAN  (ILG),   
     4     QCAN  (ILG),    TZERO (ILG),    QZERO (ILG),    GZERO (ILG),    
     5     QMELTC(ILG),    QMELTG(ILG),    RAICAN(ILG),    SNOCAN(ILG),    
     6     CDH   (ILG),    CDM   (ILG),    RIB   (ILG),    TAC   (ILG),    
     7     CFLUX (ILG),    FTEMP (ILG),    FVAP  (ILG),    ILMO  (ILG),
     8     UE    (ILG),    H     (ILG)
C
C     * INPUT ARRAYS.
C
      REAL FI    (ILG),    QSWINV(ILG),    QSWINI(ILG),    QLWIN (ILG),    
     1     TPOTA (ILG),    QA    (ILG),    VA    (ILG),    VAC   (ILG),
     2     PADRY (ILG),    RHOAIR(ILG),    ALVISC(ILG),    ALNIRC(ILG),    
     3     ALVISG(ILG),    ALNIRG(ILG),    TRVISC(ILG),    TRNIRC(ILG),    
     4     FSVF  (ILG),    CRIB  (ILG),    CPHCHC(ILG),    CPHCHG(ILG),    
     5     CEVAP (ILG),    TADP  (ILG),    TVIRTA(ILG),    RC    (ILG),    
     6     DLEAF (ILG),    AILCAN(ILG),    ZOSCLH(ILG),    ZOSCLM(ILG),
     7     ZRSLFH(ILG),    ZRSLFM(ILG),    ZOH   (ILG),    ZOM   (ILG),
     8     FCOR  (ILG),    GCONST(ILG),    GCOEFF(ILG),    TGND  (ILG),    
     9     TRSNOW(ILG),    FSNOWC(ILG),    FRAINC(ILG),    
     A     CHCAP (ILG),    CMASS (ILG)
C
      INTEGER              IWATER(ILG),    IEVAP (ILG),    
     1                     ITERCT(ILG,6,50)
C
C     * INTERNAL WORK ARRAYS.
C
      REAL TSTEP (ILG),    TVIRTC(ILG),    TVIRTG(ILG),
     1     EVBETA(ILG),    XEVAP (ILG),    EVPWET(ILG),    Q0SAT (ILG),
     2     RB    (ILG),    RAGINV(ILG),    RBINV (ILG),    XEVAPM(ILG),    
     3     RBCINV(ILG),    QAC   (ILG),    TVRTAC(ILG),    TPOTG (ILG),    
     4     RESID (ILG),    IEVAPC(ILG),    DCFLXM(ILG),    
     5     WC    (ILG),    DRAGIN(ILG),    CFLUXM(ILG),    TCANO (ILG),    
     6     TRTOP (ILG),    QSTOR (ILG),    A     (ILG),    B     (ILG),    
     7     ZOMS  (ILG),    ZOHS  (ILG),    LZZ0  (ILG),    LZZ0T (ILG),    
     8     FM    (ILG),    FH    (ILG)
C
      INTEGER              ITER  (ILG),    NITER (ILG),
     1                     KF1   (ILG),    KF2   (ILG)    
C
      REAL YEVAP,DXEVAP,qswnvg,qswnig,qswnvc,qswnic,ca,cb,wzero,dq0dt,
     1     drdt0,tzerot,qevapt,bowen,wcan,dcflux,tcant,qevapct,hfrez,
     2     hconv,rconv,hmelt,hcool,sconv,hwarm,TBETA,rat
      INTEGER I,IL1,IL2,ILG,ITERMX,isnow,islfd,ilw,jl,numit,ibad,nit
      logical prnt
#include "class_com.cdk"
C
      DATA ITERMX /5/
      DATA TBETA /2.5/
c     data prnt /.true./
      data prnt /.false./
       if(prnt) then
      print*,'fi',fi
      print*,'TPOTA',TPOTA
      print*,'QSWINV',QSWINV
      print*,'QSWINI',QSWINI
      print*,'QLWIN',QLWIN
      print*,'QA',QA
      print*,'VA',VA
      print*,'PADRY',PADRY
      print*,'RHOAIR',RHOAIR
      print*,'CPHCHC',CPHCHC
      print*,'CEVAP',CEVAP
      print*,'TADP',TADP
      print*,'TVIRTA',TVIRTA
      print*,'ZRSLFH',ZRSLFH
      print*,'ZRSLFM',ZRSLFM
      print*,'ZOH',ZOH
      print*,'ZOM',ZOM
      print*,'FCOR',FCOR
      print*,'GCONST',GCONST
      print*,'GCOEFF',GCOEFF
      print*,'TGND',TGND
      print*,'TRSNOW',TRSNOW
      print*,'ISLFD,ILW,ILG,IL1,IL2,JL',ISLFD,ILW,ILG,IL1,IL2,JL
      endif
C-----------------------------------------------------------------------
C     * INITIALIZATION AND PRE-ITERATION SEQUENCE.
C
      DO 50 I=IL1,IL2
          ITER(I)=2
          IF(FI(I).GT.0.)                                          THEN
              IF(ISNOW.EQ.0)                      THEN
                  TRTOP(I)=0.
              ELSE
                  TRTOP(I)=TRSNOW(I)
              ENDIF
              QSWNVG=QSWINV(I)*TRVISC(I)*(1.0-ALVISG(I)) 
              QSWNIG=QSWINI(I)*TRNIRC(I)*(1.0-ALNIRG(I))
              QSWNVC=QSWINV(I)*(1.0-ALVISC(I))-QSWNVG     
              QSWNIC=QSWINI(I)*(1.0-ALNIRC(I))-QSWNIG    
              QSWNG(I)=QSWNVG+QSWNIG                    
              QSWNC(I)=QSWNVC+QSWNIC
              QTRANS(I)=QSWNG(I)*TRTOP(I)   
              QSWNG(I)=QSWNG(I)-QTRANS(I)  
              QMELTC(I)=0.0    
              QMELTG(I)=0.0   
C
              IF(ABS(TCAN(I)).LT.1.0E-8)        TCAN(I)=TPOTA(I)
              TCANO(I)=TCAN(I)
              TAC(I)=(1.0-FSVF(I))*TCAN(I)+FSVF(I)*TPOTA(I)
              QAC(I)=QA(I)
              QCAN(I)=QA(I)
              TVRTAC(I)=TAC(I)*(1.0+0.61*QAC(I))   
              TVIRTC(I)=TVRTAC(I)
              TZERO(I)=TGND(I)
              TSTEP(I)=5.0
C                                                                                 
              RBINV(I)=(TBETA/307.0)*SQRT(VAC(I)/DLEAF(I))
     1            *2.0*MAX(1.0,AILCAN(I))
              QLWOC(I)=SBC*TCAN(I)*TCAN(I)*TCAN(I)*TCAN(I)
              IF(TAC(I).GE.TFREZ)                         THEN
                  CA=17.269                                                       
                  CB=35.86                                                        
              ELSE                                                                
                  CA=21.874                                                       
                  CB=7.66                                                         
              ENDIF  
              RESID(I)=999999.
              ITER(I)=1
              NITER(I)=1
              IF(ISNOW.EQ.1)                               THEN
                  KF1(I)=1
                  KF2(I)=2
              ELSE
                  KF1(I)=4
                  KF2(I)=5
              ENDIF
          ENDIF
   50 CONTINUE
C
C     * ITERATION FOR SURFACE TEMPERATURE OF GROUND UNDER CANOPY.
C     * LOOP IS REPEATED UNTIL SOLUTIONS HAVE BEEN FOUND FOR ALL POINTS
C     * ON THE CURRENT LATITUDE CIRCLE(S).
C  
  100 CONTINUE
C
      NUMIT=0
      DO 150 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ITER(I).EQ.1)                       THEN    
              IF(TZERO(I).GE.TFREZ)                        THEN
                  A(I)=17.269     
                  B(I)=35.86     
              ELSE              
                  A(I)=21.874  
                  B(I)=7.66   
              ENDIF  
              WZERO=0.622*611.0*EXP(A(I)*(TZERO(I)-TFREZ)/
     1              (TZERO(I)-B(I)))/PADRY(I)           
              Q0SAT(I)=WZERO/(1.0+WZERO)    
              IF(IWATER(I).GT.0 .OR. ISNOW.EQ.1 .OR. QA(I).GT.Q0SAT(I))
     1                                                        THEN
                  EVBETA(I)=1.0        
                  QZERO(I)=Q0SAT(I)
              ELSEIF(IEVAP(I).GT.0.)                          THEN
                  EVBETA(I)=CEVAP(I)
                  QZERO(I)=EVBETA(I)*Q0SAT(I)+(1.0-EVBETA(I))*QA(I)
                  IF(QZERO(I).LT.QA(I))                  THEN
                      EVBETA(I)=0.0
                      QZERO(I)=QA(I)
                  ENDIF
              ELSE                    
                  EVBETA(I)=0.0
                  QZERO(I)=QA(I)
              ENDIF
              DQ0DT=-WZERO*A(I)*(B(I)-TFREZ)/((TZERO(I)-B(I))*
     1               (1+WZERO))**2*EVBETA(I)
              QLWOG(I)=SBC*TZERO(I)*TZERO(I)*TZERO(I)*TZERO(I)
              GZERO(I)=GCOEFF(I)*TZERO(I)+GCONST(I)
C
              TPOTG(I)=TZERO(I)-8.0*ZOM(I)*G/SPHAIR
              TVIRTG(I)=TPOTG(I)*(1.0+0.61*QZERO(I))   
              IF(TVIRTG(I).GT.TVRTAC(I)+1.)                   THEN 
                  RAGINV(I)=1.9E-3*(TVIRTG(I)-TVRTAC(I))**0.333333
                  DRAGIN(I)=0.333*1.9E-3*(TVIRTG(I)-TVIRTC(I))**(-.667)
              ELSEIF(TVIRTG(I).GT.TVIRTC(I))                  THEN
                  RAGINV(I)=1.9E-3*(TVIRTG(I)-TVIRTC(I))
                  DRAGIN(I)=1.9E-3
              ELSE
                  RAGINV(I)=0.0
                  DRAGIN(I)=0.0
              ENDIF             
              QSENSG(I)=RHOAIR(I)*SPHAIR*(TPOTG(I)-TAC(I))*RAGINV(I)
              EVAPG (I)=RHOAIR(I)*(QZERO(I)-QA(I))*RAGINV(I)
              QEVAPG(I)=CPHCHG(I)*EVAPG(I)    
C
              IF(ILW.EQ.2) THEN
                  RESID(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                (QLWOC(I)-QLWOG(I))-QSENSG(I)-QEVAPG(I)-GZERO(I)
              ELSE
                  RESID(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                QLWOC(I)-QLWOG(I)-QSENSG(I)-QEVAPG(I)-GZERO(I)
              ENDIF
              IF(ABS(RESID(I)).LT.1.0)                     ITER(I)=0
              DRDT0=-4*SBC*TZERO(I)**3*(1.0-FSVF(I)*(ILW-1))
     1               -GCOEFF(I)-RHOAIR(I)*SPHAIR*
     2              (RAGINV(I)+(TPOTG(I)-TAC(I))*DRAGIN(I))-
     3               CPHCHG(I)*RHOAIR(I)*(DQ0DT*RAGINV(I)
     4              +(QZERO(I)-QA(I))*DRAGIN(I))
              TSTEP(I)=-RESID(I)/DRDT0
          ENDIF
C
          IF(FI(I).GT.0. .AND. NITER(I).EQ.ITERMX)        ITER(I)=-1
          IF(FI(I).GT.0. .AND. ITER(I).EQ.1)                       THEN    
              TZERO(I)=TZERO(I)+TSTEP(I)
              NITER(I)=NITER(I)+1
              NUMIT=NUMIT+1
          ENDIF
  150 CONTINUE
C
      IF(NUMIT.GT.0)                                    GO TO 100
C
C     * IF CONVERGENCE HAS NOT BEEN REACHED, CALCULATE TEMPERATURE AND
C     * FLUXES ASSUMING NEUTRAL STABILITY AND USING BOWEN RATIO APPROACH
C
      DO 195 I=IL1,IL2
          IF(ITER(I).EQ.-1)                                  THEN
             TZEROT=TVIRTC(I)/(1.0+0.61*QZERO(I))
             IF(TZEROT.LT.TZERO(I)+5..AND.ABS(RESID(I)).GT.15.) THEN
                TZERO(I)=TZEROT
                IF(TZERO(I).GE.TFREZ)                        THEN
                  A(I)=17.269
                  B(I)=35.86
                ELSE
                  A(I)=21.874
                  B(I)=7.66
                ENDIF
                WZERO=0.622*611.0*EXP(A(I)*(TZERO(I)-TFREZ)/
     1              (TZERO(I)-B(I)))/PADRY(I)
                Q0SAT(I)=WZERO/(1.0+WZERO)
                QZERO(I)=EVBETA(I)*Q0SAT(I)+(1-EVBETA(I))*QA(I)
                GZERO(I)=GCOEFF(I)*TZERO(I)+GCONST(I)
                QLWOG(I)=SBC*TZERO(I)*TZERO(I)*TZERO(I)*TZERO(I)
                IF(ILW.EQ.2) THEN
                    RESID(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1               (QLWOC(I)-QLWOG(I))-GZERO(I)
                ELSE
                    RESID(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1               QLWOC(I)-QLWOG(I)-GZERO(I)
                ENDIF
                QEVAPT=CPHCHG(I)*(QZERO(I)-QAC(I))
                BOWEN=SPHAIR*(TZERO(I)-TAC(I))/
     1             SIGN(MAX(ABS(QEVAPT),1.E-6),QEVAPT)
                QEVAPG(I)=RESID(I)/SIGN(MAX(ABS(1+BOWEN),0.1),1+BOWEN)
                QSENSG(I)=RESID(I)-QEVAPG(I)
                RESID(I)=0.
                EVAPG(I)=QEVAPG(I)/CPHCHG(I)
             ENDIF
          ENDIF
  195 CONTINUE
      IBAD=0
C
      DO 200 I=IL1,IL2
c          IF(FI(I).GT.0. .AND. ITER(I).EQ.-1)                     THEN 
c              WRITE(6,6250) I,JL,NITER(I),RESID(I),TZERO(I),RIB(I)
c6250          FORMAT('0SUBCAN ITERATION LIMIT',3X,3I3,3(F8.2,E12.4))
c          ENDIF                                            
          IF(FI(I).GT.0.)                                          THEN
              IF(TZERO(I).LT.173.16 .OR.TZERO(I).GT.373.16)  IBAD=I
          ENDIF
 200  CONTINUE
C
      IF(IBAD.NE.0)                                                 THEN
          WRITE(6,6370) IBAD,JL,TZERO(IBAD),NITER(IBAD),ISNOW
 6370     FORMAT('0BAD GROUND ITERATION TEMPERATURE',3X,2I3,F16.2,2I4)
          WRITE(6,6380) QSWNG(IBAD),FSVF(IBAD),QLWIN(IBAD),QLWOC(IBAD),
     1        QLWOG(IBAD),QSENSG(IBAD),QEVAPG(IBAD),GZERO(IBAD)
          WRITE(6,6380) TCAN(IBAD)
          CALL XIT('TSOLVC',-1)
      ENDIF
C
C     * POST-ITERATION CLEAN-UP.
C
      DO 250 I=IL1,IL2
        IF(FI(I).GT.0.)                                          THEN
          QSENSG(I)=QSENSG(I)+RESID(I)*0.5
          GZERO(I)=GZERO(I)+RESID(I)*0.5
          IF((IWATER(I).EQ.1 .AND. TZERO(I).LT.TFREZ) .OR. 
     1        (IWATER(I).EQ.2 .AND. TZERO(I).GT.TFREZ))           THEN 
              TZERO(I)=TFREZ      
              WZERO=0.622*611.0/PADRY(I)
              QZERO(I)=WZERO/(1.0+WZERO)
              EVBETA(I)=1.0
              QLWOG(I)=SBC*TZERO(I)*TZERO(I)*TZERO(I)*TZERO(I)
              GZERO(I)=GCOEFF(I)*TZERO(I)+GCONST(I)
C
              TPOTG(I)=TZERO(I)-8.0*ZOM(I)*G/SPHAIR
              TVIRTG(I)=TPOTG(I)*(1.0+0.61*QZERO(I))   
              IF(TVIRTG(I).GT.TVRTAC(I))                   THEN 
                  RAGINV(I)=1.9E-3*(TVIRTG(I)-TVRTAC(I))**0.333333
                  QSENSG(I)=RHOAIR(I)*SPHAIR*(TPOTG(I)-TAC(I))*
     1                      RAGINV(I)          
                  EVAPG (I)=RHOAIR(I)*(QZERO(I)-QA(I))*RAGINV(I)
                  IF(EVAPG(I).LT.0. .AND. TZERO(I).GE.TADP(I))
     1            EVAPG(I)=0. 
              ELSE                  
                  RAGINV(I)=0.0
                  QSENSG(I)=0.0    
                  EVAPG (I)=0.0   
              ENDIF              
              QEVAPG(I)=CPHCHG(I)*EVAPG(I)   
C
              IF(ILW.EQ.2) THEN
                  QMELTG(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                 (QLWOC(I)-QLWOG(I))-QSENSG(I)-QEVAPG(I)-GZERO(I)
              ELSE
                  QMELTG(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                 QLWOC(I)-QLWOG(I)-QSENSG(I)-QEVAPG(I)-GZERO(I)
              ENDIF
              RESID(I)=0.0
          ENDIF                                                                   
        ENDIF
  250 CONTINUE
C
C     * GROUND ITERATION COUNT, AND PRE-ITERATION SEQUENCE FOR 
C     * VEGETATION CANOPY.
C
      DO 300 I=IL1,IL2
          IF(FI(I).GT.0.)                                          THEN
              ITERCT(I,KF2(I),NITER(I))=ITERCT(I,KF2(I),NITER(I))+1
              ITER(I)=1
              NITER(I)=1      
              RAT=EXP(VKC**2*VA(I)/(RBINV(I)*LOG(ZOSCLM(I))))
              ZOSCLH(I)=MAX(ZOSCLH(I)*RAT,1.E-6)
              ZOH(I)=MAX(ZOH(I)*RAT,1.E-4)
              TSTEP(I)=5.0
              RESID(I)=999999.
              CFLUXM(I)=0.
              DCFLXM(I)=0.
          ENDIF
  300 CONTINUE
C
C     * ITERATION FOR CANOPY TEMPERATURE.
C     * LOOP IS REPEATED UNTIL SOLUTIONS HAVE BEEN FOUND FOR ALL POINTS
C     * ON THE CURRENT LATITUDE CIRCLE(S).
C  
  400 CONTINUE
C
      NUMIT=0
      NIT=0
      DO 450 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ITER(I).EQ.1)                       THEN    
              TVIRTC(I)=TCAN(I)*(1.0+0.61*QCAN(I))
              NIT=NIT+1
          ENDIF
  450 CONTINUE      
C
      IF(NIT.GT.0)                                                  THEN 
C
C     * CALCULATE SURFACE DRAG COEFFICIENTS (STABILITY-DEPENDENT)
C     * AND OTHER RELATED QUANTITIES BETWEEN CANOPY AIR SPACE AND 
C     * ATMOSPHERE.
C
        IF(ISLFD.LT.2) THEN
            CALL DRCOEF(CDM,CDH,RIB,CFLUX,QA,QA,ZOSCLM,ZOSCLH,
     1                  CRIB,TVIRTC,TVIRTA,VA,ZOMS,ZOHS,FI,ITER,
     2                  ILG,IL1,IL2)
        ELSE
            CALL FLXSURFZ(CDM,CDH,CFLUX,RIB,FTEMP,FVAP,ILMO,
     1                    UE,FCOR,TPOTA,QA,ZRSLFM,ZRSLFH,VA,
     2                    TCAN,QCAN,H,ZOM,ZOH,
     3                    LZZ0,LZZ0T,FM,FH,ILG,ITER,JL )
        ENDIF
C
C     * CALCULATE CANOPY AIR TEMPERATURE AND SPECIFIC HUMIDITY OF 
C     * CANOPY AIR (FIRST WITHOUT RC TO CHECK FOR CONDENSATION; 
C     * IF NO CONDENSATION EXISTS, RECALCULATE).
C
        DO 500 I=IL1,IL2
            IF (FI(I).GT.0. .AND. ITER(I).EQ.1)                THEN    
                RB(I)=1./CFLUX(I)
                IF(QA(I).GT.QCAN(I))                         THEN
                    XEVAP(I)=1.0/RB(I)
                ELSE
                    IF(FSNOWC(I).GT.0.0)               THEN
                        XEVAP(I)=(FRAINC(I)+FSNOWC(I))/RB(I)
                    ELSE
                        XEVAP(I)=FRAINC(I)/RB(I)+(1.0-FRAINC(I))/
     1                           (RB(I)+RC(I))
                    ENDIF
                ENDIF
                TAC(I)=TCAN(I)
              IF(TCAN(I).GE.TFREZ)                         THEN
                  A(I)=17.269   
                  B(I)=35.86    
              ELSE
                  A(I)=21.874  
                  B(I)=7.66   
              ENDIF
              WCAN=0.622*611.0*EXP(A(I)*(TCAN(I)-TFREZ)/
     1             (TCAN(I)-B(I)))/PADRY(I)
              WC(I)=WCAN
              QCAN(I)=WCAN/(1.0+WCAN)
           QCAN(I)=RB(I)*XEVAP(I)*QCAN(I)+(1-RB(I)*XEVAP(I))*QA(I)
              TVIRTC(I)=TCAN(I)*(1.0+0.61*QCAN(I))
            ENDIF
500     CONTINUE
C
C     * CALCULATE THE TERMS IN THE ENERGY BALANCE AND SOLVE.
C
        DO 550 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ITER(I).EQ.1)                       THEN    
              QLWOC(I)=SBC*TCAN(I)*TCAN(I)*TCAN(I)*TCAN(I)
              QSENSC(I)=RHOAIR(I)*SPHAIR*CFLUX(I)*(TCAN(I)-TPOTA(I))
              IF(FRAINC(I).GT.0. .OR. FSNOWC(I).GT.0. .OR. 
     1           RC(I).LE.5000. .OR. QA(I).GT.QCAN(I))       THEN 
                  EVAPC(I)=RHOAIR(I)*CFLUX(I)*(QCAN(I)-QA(I))
                  IEVAPC(I)=1
              ELSE     
                  EVAPC(I)=0.
                  IEVAPC(I)=0   
              ENDIF             
              EVPWET(I)=(CLHVAP*RAICAN(I)+(CLHVAP+CLHMLT)*SNOCAN(I))/
     1            DELT
              IF((FRAINC(I)+FSNOWC(I)).GT.0.50 .AND. 
     1                                 EVAPC(I).GT.EVPWET(I))    THEN
                  EVAPC(I)=EVPWET(I)
                  IEVAPC(I)=0
              ENDIF
              QEVAPC(I)=CPHCHC(I)*EVAPC(I)  
              QSTOR (I)=CHCAP(I)*(TCAN(I)-TCANO(I))/DELT
              IF(ILW.EQ.2) THEN
                  RESID(I)=QSWNC(I)+(QLWIN(I)+QLWOG(I)-QLWOC(I))*
     1                 (1.0-FSVF(I))-QSENSC(I)-QEVAPC(I)-
     2                 QSTOR(I)-QMELTC(I)
              ELSE
                  RESID(I)=QSWNC(I)+(QLWIN(I)+QLWOG(I)-2.0*QLWOC(I))*
     1                 (1.0-FSVF(I))-QSENSC(I)-QEVAPC(I)-
     2                 QSTOR(I)-QMELTC(I)
              ENDIF
              IF(ABS(RESID(I)).LT.1.0)                       ITER(I)=0
              IF(FI(I).GT.0. .AND. NITER(I).EQ.ITERMX)      ITER(I)=-1
          ENDIF
  550   CONTINUE     
C
C     * CALCULATE TEMPERATURE STEP FOR NEXT ITERATION.
C
        DO 575 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ITER(I).EQ.1)                       THEN    
                DCFLUX=(CFLUX(I)-CFLUXM(I))/
     1             SIGN(MAX(.001,ABS(TSTEP(I))),TSTEP(I))
                IF(ABS(TVIRTA(I)-TVIRTC(I)).LT.0.4)
     1             DCFLUX=MAX(DCFLUX,0.8*DCFLXM(I))
                IF(NITER(I).GT.1)                                     THEN
                   DXEVAP=(XEVAP(I)-XEVAPM(I))/
     1             SIGN(MAX(.001,ABS(TSTEP(I))),TSTEP(I))
                ELSE
                   DXEVAP=0.
                ENDIF
                XEVAPM(I)=XEVAP(I)
                CFLUXM(I)=CFLUX(I)
                DCFLXM(I)=DCFLUX
                DRDT0=-4*SBC*TCAN(I)*TCAN(I)*TCAN(I)*(1.0-FSVF(I))*(3-ILW)
     1       -RHOAIR(I)*SPHAIR*(CFLUX(I)+MAX(0.,TCAN(I)-TPOTA(I))*DCFLUX)
     2           +IEVAPC(I)*CPHCHC(I)*RHOAIR(I)*(XEVAP(I)*WC(I)*A(I)
     3                *(B(I)-TFREZ)/((TCAN(I)-B(I))*(1+WC(I)))**2
     4          -(QCAN(I)-QA(I))*DXEVAP)-CHCAP(I)/DELT
                TSTEP(I)=-RESID(I)/DRDT0
                TSTEP(I)=max(-10.,min(5.,TSTEP(I)))
                TCAN(I)=TCAN(I)+TSTEP(I)
              IF(ABS(TCAN(I)-TFREZ).LT.1.0E-3)             TCAN(I)=TFREZ
              NITER(I)=NITER(I)+1
              NUMIT=NUMIT+1
          ENDIF
  575   CONTINUE
      ENDIF
C
      IF(NUMIT.GT.0)                                    GO TO 400
C
C     * IF CONVERGENCE HAS NOT BEEN REACHED, CALCULATE TEMPERATURE AND
C     * FLUXES ASSUMING NEUTRAL STABILITY AND USING BOWEN RATIO APPROACH
C
        DO 585 I=IL1,IL2
          IEVAPC(I)=0
          NUMIT=0
          IF(ITER(I).EQ.-1)                   THEN
            TCANT=TVIRTA(I)/(1.0+0.61*QCAN(I))
            IF(TCANT.LT.TCAN(I)+5..AND.ABS(RESID(I)).GT.25.)  THEN
               TCAN(I)=TCANT
               IF(TCAN(I).GE.TFREZ)                         THEN
                  A(I)=17.269
                  B(I)=35.86
               ELSE
                  A(I)=21.874
                  B(I)=7.66
               ENDIF
               WCAN=0.622*611.0*EXP(A(I)*(TCAN(I)-TFREZ)/
     1             (TCAN(I)-B(I)))/PADRY(I)
               QCAN(I)=WCAN/(1.0+WCAN)
               IF(FSNOWC(I).GT.0.0)               THEN
                   YEVAP=FRAINC(I)+FSNOWC(I)
               ELSE
                   YEVAP=FRAINC(I)+(1.0-FRAINC(I))*10./(10.+RC(I))
               ENDIF
               QCAN(I)=YEVAP*QCAN(I)+(1-YEVAP)*QA(I)
c              QEVAPCT=CPHCHC(I)*(QCAN(I)-QA(I))
c              BOWEN=SPHAIR*(TCAN(I)-TPOTA(I))/
c    1             SIGN(MAX(ABS(QEVAPCT),1.E-6),QEVAPCT)
               QSTOR(I)=CHCAP(I)*(TCAN(I)-TCANO(I))/DELT
               QLWOC(I)=SBC*TCAN(I)*TCAN(I)*TCAN(I)*TCAN(I)
               IF(ILW.EQ.2) THEN
                  RESID(I)=QSWNC(I)+(QLWIN(I)+QLWOG(I)-QLWOC(I))*
     1               (1.0-FSVF(I))+QSENSG(I)-QSTOR(I)
               ELSE
                   RESID(I)=QSWNC(I)+(QLWIN(I)+QLWOG(I)-2.0*QLWOC(I))*
     1               (1.0-FSVF(I))+QSENSG(I)-QSTOR(I)
               ENDIF
c              QEVAPC(I)=RESID(I)/SIGN(MAX(ABS(1+BOWEN),0.1),1+BOWEN)
               IF(RESID(I).GT.0.) THEN
                   QEVAPC(I)=RESID(I)
               ELSE
                   QEVAPC(I)=RESID(I)*0.5
               ENDIF
               QSENSC(I)=RESID(I)-QEVAPC(I)
               RESID(I)=0.
               EVAPC(I)=QEVAPC(I)/CPHCHC(I)
               TVIRTC(I)=TCAN(I)*(1.0+0.61*QCAN(I))
               NUMIT=NUMIT+1
               IEVAPC(I)=1
            ENDIF
          ENDIF
  585   CONTINUE
c
      IF(NUMIT.GT.0) THEN
         IF(ISLFD.LT.2) THEN
            CALL DRCOEF(CDM,CDH,RIB,CFLUX,QA,QA,ZOSCLM,ZOSCLH,
     1                  CRIB,TVIRTC,TVIRTA,VA,ZOMS,ZOHS,FI,IEVAPC,
     2                  ILG,IL1,IL2)
         ELSE
            CALL FLXSURFZ(CDM,CDH,CFLUX,RIB,FTEMP,FVAP,ILMO,
     1                    UE,FCOR,TPOTA,QA,ZRSLFM,ZRSLFH,VA,
     2                    TCAN,QCAN,H,ZOM,ZOH,
     3                    LZZ0,LZZ0T,FM,FH,ILG,IEVAPC,JL )
         ENDIF
      ENDIF  
c
      IBAD=0
C
      DO 600 I=IL1,IL2
C         IF(FI(I).GT.0. .AND. ITER(I).EQ.-1)                      THEN 
C             WRITE(6,6350) I,JL,NITER(I),RESID(I),TCAN(I),RIB(I)
C6350         FORMAT('0CANOPY ITERATION LIMIT',3X,3I3,3(F8.2,E12.4))            
C         ENDIF                                            
          IF(FI(I).GT.0. .AND. (TCAN(I).LT.173.16 .OR.
     1                           TCAN(I).GT.373.16))                THEN
              IBAD=I
          ENDIF  
  600 CONTINUE
C  
      IF(IBAD.NE.0)                                                 THEN
          WRITE(6,6375) IBAD,JL,TCAN(IBAD),NITER(IBAD),ISNOW
 6375     FORMAT('0BAD CANOPY ITERATION TEMPERATURE',3X,2I3,F16.2,2I4)
          WRITE(6,6380) QSWNC(IBAD),QLWIN(IBAD),QLWOG(IBAD),
     1                  QLWOC(IBAD),QSENSG(IBAD),QSENSC(IBAD),
     2                  QEVAPC(IBAD),QSTOR(IBAD),QMELTC(IBAD)
          WRITE(6,6380) TAC(IBAD),TPOTA(IBAD),TZERO(IBAD)
 6380     FORMAT(2X,9F10.2)
          CALL XIT('TSOLVC',-2)
      ENDIF
C
C     * POST-ITERATION CLEAN-UP.
C
      NIT=0
      DO 650 I=IL1,IL2
          IF(FI(I).GT.0.) THEN
              IF(RAICAN(I).GT.0. .AND. TCAN(I).LT.TFREZ)      THEN 
                  QSTOR(I)=-CHCAP(I)*TCANO(I)/DELT
                  HFREZ=CHCAP(I)*(TFREZ-TCAN(I))   
                  HCONV=RAICAN(I)*CLHMLT          
                  ITER(I)=1
                  NIT=NIT+1
                  IF(HFREZ.LT.HCONV)                       THEN 
                     RCONV=HFREZ/CLHMLT          
                     SNOCAN(I)=SNOCAN(I)+RCONV  
                     RAICAN(I)=RAICAN(I)-RCONV 
                     TCAN  (I)=TFREZ          
                     QMELTC(I)=-CLHMLT*RCONV/DELT
                     CHCAP(I)=SPHVEG*CMASS(I)+SPHICE*SNOCAN(I)+
     1                         SPHW*RAICAN(I)
                     QSTOR(I)=QSTOR(I)+CHCAP(I)*TCAN(I)/DELT
                     WCAN=0.622*611.0/PADRY(I)  
                     QCAN(I)=WCAN/(1.0+WCAN)                                                 
                     TVIRTC(I)=TCAN(I)*(1.0+0.61*QCAN(I))
                  ELSE                    
                     HCOOL=HFREZ-HCONV   
                     SNOCAN(I)=SNOCAN(I)+RAICAN(I)  
                     TCAN  (I)=-HCOOL/(SPHVEG*CMASS(I)+SPHICE*
     1                         SNOCAN(I))+TFREZ  
                     QMELTC(I)=-CLHMLT*RAICAN(I)/DELT
                     RAICAN(I)=0.0                 
                     CHCAP(I)=SPHVEG*CMASS(I)+SPHICE*SNOCAN(I)
                     QSTOR(I)=QSTOR(I)+CHCAP(I)*TCAN(I)/DELT
                     A(I)=21.874                  
                     B(I)=7.66                   
                     WCAN=0.622*611.0*EXP(A(I)*(TCAN(I)-TFREZ)/
     1                    (TCAN(I)-B(I)))/PADRY(I)           
                     QCAN(I)=WCAN/(1.0+WCAN)    
                     TVIRTC(I)=TCAN(I)*(1.0+0.61*QCAN(I))
                  ENDIF    
              ELSE
                  ITER(I)=0
              ENDIF                       
          ENDIF
  650 CONTINUE      
C
      DO 675 I=IL1,IL2
          IF(FI(I).GT.0.) THEN
              IF(SNOCAN(I).GT.0. .AND. TCAN(I).GT.TFREZ)    THEN
                  QSTOR(I)=-CHCAP(I)*TCANO(I)/DELT
                  HMELT=CHCAP(I)*(TCAN(I)-TFREZ)    
                  HCONV=SNOCAN(I)*CLHMLT           
                  ITER(I)=1
                  NIT=NIT+1
                  IF(HMELT.LT.HCONV)                       THEN 
                     SCONV=HMELT/CLHMLT           
                     SNOCAN(I)=SNOCAN(I)-SCONV   
                     RAICAN(I)=RAICAN(I)+SCONV  
                     TCAN  (I)=TFREZ           
                     QMELTC(I)=CLHMLT*SCONV/DELT
                     CHCAP(I)=SPHVEG*CMASS(I)+SPHW*RAICAN(I)+
     1                        SPHICE*SNOCAN(I)
                     QSTOR(I)=QSTOR(I)+CHCAP(I)*TCAN(I)/DELT
                     WCAN=0.622*611.0/PADRY(I)  
                     QCAN(I)=WCAN/(1.0+WCAN)  
                     TVIRTC(I)=TCAN(I)*(1.0+0.61*QCAN(I))
                  ELSE                       
                     HWARM=HMELT-HCONV      
                     RAICAN(I)=RAICAN(I)+SNOCAN(I)    
                     TCAN  (I)=HWARM/(SPHVEG*CMASS(I)+SPHW*
     1                         RAICAN(I))+TFREZ                         
                     QMELTC(I)=CLHMLT*SNOCAN(I)/DELT
                     SNOCAN(I)=0.0                   
                     CHCAP(I)=SPHVEG*CMASS(I)+SPHW*RAICAN(I)
                     QSTOR(I)=QSTOR(I)+CHCAP(I)*TCAN(I)/DELT
                     A(I)=17.269      
                     B(I)=35.86      
                     WCAN=0.622*611.0*EXP(A(I)*(TCAN(I)-TFREZ)/
     1                    (TCAN(I)-B(I)))/PADRY(I)           
                     QCAN(I)=WCAN/(1.0+WCAN)   
                     TVIRTC(I)=TCAN(I)*(1.0+0.61*QCAN(I))
                  ENDIF                       
              ENDIF                       
          ENDIF
  675 CONTINUE      
C
C     * REMAINING CALCULATIONS.
C
      DO 700 I=IL1,IL2
          IF(FI(I).GT.0. .AND. ITER(I).EQ.1)                       THEN    
              QLWOC(I)=SBC*TCAN(I)*TCAN(I)*TCAN(I)*TCAN(I)
              QSENSC(I)=RHOAIR(I)*SPHAIR*CFLUX(I)*(TCAN(I)-TPOTA(I))
              IF(QA(I).GT.QCAN(I))                         THEN
                  XEVAP(I)=1.0/RB(I)      
              ELSE                       
                  IF(FSNOWC(I).GT.0.0)               THEN 
                      XEVAP(I)=(FRAINC(I)+FSNOWC(I))/RB(I)  
                  ELSE                                     
                      XEVAP(I)=FRAINC(I)/RB(I)+(1.0-FRAINC(I))/
     1                         (RB(I)+RC(I))                            
                  ENDIF                                   
              ENDIF                                      
C
              IF(FRAINC(I).GT.0. .OR. FSNOWC(I).GT.0. .OR. 
     1           RC(I).LE.5000. .OR. QA(I).GT.QCAN(I))       THEN 
                  EVAPC(I)=RHOAIR(I)*XEVAP(I)*(QCAN(I)-QA(I))
              ELSE                 
                  EVAPC(I)=0.0        
              ENDIF                  
              IF(EVAPC(I).LT.0. .AND. TCAN(I).GE.TADP(I)) EVAPC(I)=0.0
              EVPWET(I)=(CLHVAP*RAICAN(I)+(CLHVAP+CLHMLT)*SNOCAN(I))/
     1            DELT
              IF((FRAINC(I)+FSNOWC(I)).GT.0.50 .AND. 
     1            EVAPC(I).GT.EVPWET(I)) EVAPC(I)=EVPWET(I)
              QEVAPC(I)=CPHCHC(I)*EVAPC(I)    
              IF(ILW.EQ.2) THEN
                  RESID(I)=QSWNC(I)+(QLWIN(I)+QLWOG(I)-QLWOC(I))*
     1                 (1.0-FSVF(I))-QSENSC(I)-QEVAPC(I)-
     2                 QSTOR(I)-QMELTC(I)
              ELSE
                  RESID(I)=QSWNC(I)+(QLWIN(I)+QLWOG(I)-2.0*QLWOC(I))*
     1                 (1.0-FSVF(I))-QSENSC(I)-QEVAPC(I)-
     2                 QSTOR(I)-QMELTC(I)
              ENDIF
          ENDIF
C
          IF(FI(I).GT.0.)                                          THEN 
              QSENSC(I)=QSENSC(I)+RESID(I)
              IF(TAC(I).GE.TFREZ) THEN       
                  CA=17.269                                                       
                  CB=35.86                                                        
              ELSE                                                                
                  CA=21.874                                                       
                  CB=7.66                                                         
              ENDIF  
              IF(EVAPG(I).LT.0. .AND. TZERO(I).GE.TADP(I)) EVAPG(I)=0.
              QEVAPG(I)=CPHCHG(I)*EVAPG(I)
              IF(ABS(TZERO(I)-TFREZ).LT.1.0E-8) THEN
                  IF(ILW.EQ.2) THEN
                      QMELTG(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                    (QLWOC(I)-QLWOG(I))-QSENSG(I)-QEVAPG(I)-
     2                    GZERO(I)
                      QLWOUT(I)=0.0
                  ELSE
                      QMELTG(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                    QLWOC(I)-QLWOG(I)-QSENSG(I)-QEVAPG(I)-GZERO(I)
                      QLWOUT(I)=FSVF(I)*QLWOG(I)+(1.0-FSVF(I))*QLWOC(I)
                  ENDIF
              ELSE
                  IF(ILW.EQ.2) THEN
                      GZERO(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                    (QLWOC(I)-QLWOG(I))-QSENSG(I)-QEVAPG(I)
                      QLWOUT(I)=0.0
                  ELSE
                      GZERO(I)=QSWNG(I)+FSVF(I)*QLWIN(I)+(1.0-FSVF(I))*
     1                    QLWOC(I)-QLWOG(I)-QSENSG(I)-QEVAPG(I)
                      QLWOUT(I)=FSVF(I)*QLWOG(I)+(1.0-FSVF(I))*QLWOC(I)
                  ENDIF
              ENDIF
              QSWNET(I)=QSWNG(I)+QSWNC(I)+QTRANS(I)
              QSENS(I)=QSENSC(I)+QSENSG(I)
              QEVAP(I)=QEVAPC(I)+QEVAPG(I)    
              EVAPC(I)=EVAPC(I)/RHOW         
              EVAPG(I)=EVAPG(I)/RHOW
              ITERCT(I,KF1(I),NITER(I))=ITERCT(I,KF1(I),NITER(I))+1
          ENDIF
  700 CONTINUE
C                                           
      RETURN                                                                      
      END