SUBROUTINE CANALB(ALVSCN,ALIRCN,ALVSCS,ALIRCS,TRVSCN,TRIRCN, 1,5
     1                  TRVSCS,TRIRCS,RC,RCS,
     2                  ALVSC,ALIRC,RSMIN,QA50,VPDA,VPDB,PSIGA,PSIGB,
     3                  FC,FCS,FSNOW,FSNOWC,FCAN,FCANS,AIL,AILS,PSIGND,
     4                  FROOT,FCLOUD,COSZS,QSWINV,VPD,TA,ACVDAT,ACIDAT,
     5                  ILG,IL1,IL2,JL,IC,ICP1,IG,IALC,
     6                  CXTEFF,RCACC,RCG,RCV,RCT,GC)
C
C     * NOV 2003  - Y.DELAGE.  REARRANGE COMPUTATIONS FOR EFFICIENCY ON THE IBM
C     *                        AND TO SATISFY THE LINUX COMPILER
C     * JAN 24/02 - P.BARTLETT. TEST VERSION - EFFICIENCY IMPROVEMENTS
C     *                         IN ALBEDO AND TRANSMISSIVITY CALCULATIONS.
C     * JUL 30/02 - P.BARTLETT/D.VERSEGHY. NEW STOMATAL RESISTANCE
C     *                                    FORMULATION INCORPORATED.
C     * MAR 18/02 - D.VERSEGHY. ALLOW FOR ASSIGNMENT OF SPECIFIED TIME-
C     *                         VARYING VALUES OF VEGETATION SNOW-FREE
C     *                         ALBEDO.
C     * NOV 29/94 - M.LAZARE. CLASS - VERSION 2.3.
C     *                       CALL ABORT CHANGED TO CALL XIT TO ENABLE
C     *                       RUNNING ON PC'S.
C     * MAY 06/93 - D.VERSEGHY. EXTENSIVE MODIFICATIONS TO CANOPY
C     *                         ALBEDO LOOPS.
C     * MAR 03/92 - D.VERSEGHY/M.LAZARE. REVISED AND VECTORIZED CODE
C     *                                  FOR MODEL VERSION GCM7.
C     * AUG 12/91 - D.VERSEGHY. CANOPY ALBEDOS AND TRANSMISSIVITIES.
C
      IMPLICIT NONE
      INTEGER ILG,IL1,IL2,JL,IC,ICP1,IG,IALC,I,J,jptbad,jptbdi,iptbad
      REAL fact,alvsn,alirn,alavg,alclr,altot,alvss
      REAL alirs,trclrs,trclrt,trvs,trtot,trir
C
C     * OUTPUT ARRAYS.
C
      REAL ALVSCN(ILG),   ALIRCN(ILG),   ALVSCS(ILG),   ALIRCS(ILG),
     1     TRVSCN(ILG),   TRIRCN(ILG),   TRVSCS(ILG),   TRIRCS(ILG),
     2     RC    (ILG),   RCS   (ILG)
C
C     * 2-D INPUT ARRAYS.                                                 
C
      REAL ALVSC (ILG,ICP1),         ALIRC (ILG,ICP1),
     1     RSMIN (ILG,IC),           QA50  (ILG,IC),
     2     VPDA  (ILG,IC),           VPDB  (ILG,IC),
     3     PSIGA (ILG,IC),           PSIGB (ILG,IC),
     4     FCAN  (ILG,IC),           FCANS (ILG,IC),
     5     AIL   (ILG,IC),           AILS  (ILG,IC),                      
     6     ACVDAT(ILG,IC),           ACIDAT(ILG,IC),
     7     FROOT (ILG,IG)
C
C     * 1-D INPUT ARRAYS.
C
      REAL FC    (ILG),   FCS   (ILG),   FSNOW (ILG),   FSNOWC(ILG),
     1     PSIGND(ILG),   FCLOUD(ILG),   COSZS (ILG),   QSWINV(ILG),
     2     VPD   (ILG),   TA    (ILG)
C
C     * WORK ARRAYS.
C
      REAL CXTEFF(ILG,IC),           RCACC (ILG,IC),
     1     RCV   (ILG,IC),           RCG   (ILG,IC),
     2     RCT   (ILG),              GC    (ILG)
C
c   automatic arrays
      real fexp(ilg),ALVSCX(ilg),ALIRCX(ilg),secz(ilg)
      real rs(ilg),rt(ilg),ds1(ilg),ds2(ilg),ds3(ilg)
      real dt1(ilg),dt2(ilg),dt3(ilg),TRCLDS(ILG),TRCLDT(ILG)
c                                           
#include "class_com.cdk"
      REAL ALVSWG,ALIRWG,ALVSWS,ALIRWS,ALVSWC,ALIRWC 

      DATA ALVSWG,ALIRWG,ALVSWS,ALIRWS,ALVSWC                             
     1    /  0.03,  0.23,  0.61,  0.38,  0.17/
C----------------------------------------------------------------------
C
C     * INITIALIZE WORK ARRAYS.
C
      DO 50 I=IL1,IL2
          RCT(I)=0.0
          GC(I)=0.0
          RC(I)=0.0
50    CONTINUE
      DO 60 J=1,IC
      DO 60 I=IL1,IL2
          CXTEFF(I,J)=0.0
          RCACC(I,J)=0.0
          RCG(I,J)=0.0
          RCV(I,J)=0.0
60    CONTINUE
C
C     * ALBEDO CALCULATIONS FOR CANOPY OVER BARE SOIL.
C
C     * NEEDLELEAF AND BROADLEAF TREES.
C
      do 110 j=1,2
        do i=il1,il2
          fexp(i)=CANEXT(J)*AIL(I,J)
          ALIRWC=ALIRC(I,J)+0.04
          IF(IALC.EQ.0) THEN
            ALVSCX(I)=FSNOWC(I)*ALVSWC+(1.0-FSNOWC(I))*ALVSC(I,J)
            ALIRCX(I)=FSNOWC(I)*ALIRWC+(1.0-FSNOWC(I))*ALIRC(I,J)
          ELSE
            ALVSCX(I)=FSNOWC(I)*ALVSWC+(1.0-FSNOWC(I))*ACVDAT(I,J)
            ALIRCX(I)=FSNOWC(I)*ALIRWC+(1.0-FSNOWC(I))*ACIDAT(I,J)
          ENDIF
        enddo
        call vsexp(fexp(il1),fexp(il1),il2-il1+1)
        DO 100 I=IL1,IL2                        
           IF(FCAN(I,J).GT.0..AND. COSZS(I).GT.0.)         THEN
              IF(IALC.EQ.0) THEN
                ALVSN=(1.0-fexp(I))*ALVSCX(I)+fexp(I)*ALVSWG                  
                ALIRN=(1.0-fexp(I))*ALIRCX(I)+fexp(I)*ALIRWG                  
              ELSE
                ALVSN=(1.0-fexp(i))*ALVSCX(i)+fexp(i)*ACVDAT(I,J)
                ALIRN=(1.0-fexp(i))*ALIRCX(i)+fexp(i)*ACIDAT(I,J)
              ENDIF
              ALVSCN(I)=ALVSCN(I)+FCAN(I,J)*ALVSN
              ALIRCN(I)=ALIRCN(I)+FCAN(I,J)*ALIRN
            ENDIF
  100   CONTINUE
  110 continue
C
C     * CROPS AND GRASS.
C
      DO 125 J=3,IC
        do i=il1,il2
          fexp(i)=CANEXT(J)*AIL(I,J)
          ALAVG=0.5*(ALVSC(I,J)+ALIRC(I,J))
          IF(COSZS(I).LE.0.5) THEN
            ALCLR=ALAVG/(0.5+COSZS(I))
          ELSE
            ALCLR=ALAVG*(0.5+1.0/(1.0+2.0*COSZS(I)))
          ENDIF
          ALTOT=FCLOUD(I)*ALAVG+(1.0-FCLOUD(I))*ALCLR
          ALVSN=ALVSC(I,J)
          ALIRN=2.0*ALTOT-ALVSN
          ALIRWC=ALIRC(I,J)+0.04
          IF(IALC.EQ.0) THEN
            ALVSCX(I)=FSNOWC(I)*ALVSWC+(1.0-FSNOWC(I))*ALVSN
            ALIRCX(I)=FSNOWC(I)*ALIRWC+(1.0-FSNOWC(I))*ALIRN
          ELSE
            ALVSCX(I)=FSNOWC(I)*ALVSWC+(1.0-FSNOWC(I))*ACVDAT(I,J)
            ALIRCX(I)=FSNOWC(I)*ALIRWC+(1.0-FSNOWC(I))*ACIDAT(I,J)
          ENDIF
        enddo
        call vsexp(fexp(il1),fexp(il1),il2-il1+1)
C
        do 120 i=il1,il2
           IF(FCAN(I,J).GT.0. .AND. COSZS(I).GT.0.)             THEN            
              IF(IALC.EQ.0) THEN
                ALVSN=(1.0-fexp(I))*ALVSCX(I)+fexp(I)*ALVSWG
                ALIRN=(1.0-fexp(I))*ALIRCX(I)+fexp(I)*ALIRWG
              ELSE
                ALVSN=(1.0-fexp(i))*ALVSCX(i)+fexp(i)*ACVDAT(I,J)
                ALIRN=(1.0-fexp(i))*ALIRCX(i)+fexp(i)*ACIDAT(I,J)
              END IF
              ALVSCN(I)=ALVSCN(I)+FCAN(I,J)*ALVSN
              ALIRCN(I)=ALIRCN(I)+FCAN(I,J)*ALIRN
           ENDIF
  120    CONTINUE
  125 CONTINUE 
C
C     * TOTAL ALBEDOS.
C
      IPTBAD=0
      DO 190 I=IL1,IL2
         IF(FC(I).GT.0. .AND. COSZS(I).GT.0.)                      THEN
            ALVSCN(I)=ALVSCN(I)/FC(I)                                            
            ALIRCN(I)=ALIRCN(I)/FC(I)
         ENDIF
         IF(ALVSCN(I).GT.1. .OR. ALVSCN(I).LT.0.) IPTBAD=I
         IF(ALIRCN(I).GT.1. .OR. ALIRCN(I).LT.0.) IPTBAD=I
  190 CONTINUE
C
      IF(IPTBAD.NE.0) THEN
         WRITE(6,6100) IPTBAD,JL,ALVSCN(IPTBAD),ALIRCN(IPTBAD)
 6100    FORMAT('0AT (I,J)= (',I3,',',I3,'), ALVSCN,ALIRCN = ',2F10.5)
         CALL XIT('CANALB',-1)
      ENDIF                                                                      
C----------------------------------------------------------------------
C     * ALBEDO CALCULATIONS FOR CANOPY OVER SNOW.
C
      DO 200 J=1,IC
        do i=il1,il2
          fexp(i)=CANEXT(J)*AILS(I,J)
          ALIRWC=ALIRC(I,J)+0.04
          IF(IALC.EQ.0) THEN
            ALVSCX(I)=FSNOWC(I)*ALVSWC+(1.0-FSNOWC(I))*ALVSC(I,J)
            ALIRCX(I)=FSNOWC(I)*ALIRWC+(1.0-FSNOWC(I))*ALIRC(I,J)
          ELSE
            ALVSCX(I)=FSNOWC(I)*ALVSWC+(1.0-FSNOWC(I))*ACVDAT(I,J)
            ALIRCX(I)=FSNOWC(I)*ALIRWC+(1.0-FSNOWC(I))*ACIDAT(I,J)
          ENDIF
        enddo
        call vsexp(fexp(il1),fexp(il1),il2-il1+1)
        DO 180 I=IL1,IL2
           IF(FCANS(I,J).GT.0. .AND. COSZS(I).GT.0.)      THEN 
              ALVSS=(1.0-fexp(i))*ALVSCX(I)+fexp(i)*ALVSWS
              ALIRS=(1.0-fexp(i))*ALIRCX(I)+fexp(i)*ALIRWS
              ALVSCS(I)=ALVSCS(I)+FCANS(I,J)*ALVSS
              ALIRCS(I)=ALIRCS(I)+FCANS(I,J)*ALIRS
           ENDIF
  180   CONTINUE
  200 CONTINUE
C
C     * TOTAL ALBEDOS.
C
      IPTBAD=0
      DO 290 I=IL1,IL2
         IF(FCS(I).GT.0. .AND. COSZS(I).GT.0.)                THEN
            ALVSCS(I)=ALVSCS(I)/FCS(I)                                           
            ALIRCS(I)=ALIRCS(I)/FCS(I)
         ENDIF
         IF(ALVSCS(I).GT.1. .OR. ALVSCS(I).LT.0.) IPTBAD=I
         IF(ALIRCS(I).GT.1. .OR. ALIRCS(I).LT.0.) IPTBAD=I
  290 CONTINUE
C
      IF(IPTBAD.NE.0) THEN
         WRITE(6,6200) IPTBAD,JL,ALVSCS(IPTBAD),ALIRCS(IPTBAD)
 6200    FORMAT('0AT (I,J)= (',I3,',',I3,'), ALVSCS,ALIRCS = ',2F10.5)
         CALL XIT('CANALB',-2)
      ENDIF                                          
c
C-----------------------------------------------------------------------
C     * TRANSMISSIVITY CALCULATIONS FOR CANOPY OVER BARE SOIL.
C
      do I=IL1,IL2
        secz(i)=1/max(coszs(i),0.1)
      enddo
c
      do 300 J=1,IC
        do I=IL1,IL2
C
C     *   NEEDLELEAF TREES.
C
          if(j.eq.1)                       then
             rs(i)= -0.4*AIL(I,J)*secz(i)
             rt(i)= -0.3*AIL(I,J)*secz(i)
             ds1(i)= -0.41412*AIL(I,J)
             ds2(i)= -0.56569*AIL(I,J)
             ds3(i)= -1.54559*AIL(I,J)
             dt1(i)= -0.31059*AIL(I,J)
             dt2(i)= -0.42427*AIL(I,J)
             dt3(i)= -1.15920*AIL(I,J)
C
C     * BROADLEAF TREES.
C
          else if(j.eq.2)                  then
             rs(i)=min(-0.7*AIL(I,J),-0.4*secz(i))
             rt(i)=min(-0.4*AIL(I,J),-0.4*secz(i))
             ds1(i)=min(-0.7*AIL(I,J),-0.41412)
             ds2(i)=min(-0.7*AIL(I,J),-0.56569)
             ds3(i)=min(-0.7*AIL(I,J),-1.54559)
             dt1(i)=min(-0.4*AIL(I,J),-0.41412)
             dt2(i)=min(-0.4*AIL(I,J),-0.56569)
             dt3(i)=min(-0.4*AIL(I,J),-1.54559)
C
C     * CROPS AND GRASS.
C
          else
             rs(i)= -0.5*AIL(I,J)*secz(i)
             rt(i)= -0.4*AIL(I,J)*secz(i)
             ds1(i)= -0.51765*AIL(I,J)
             ds2(i)= -0.70711*AIL(I,J)
             ds3(i)= -1.93199*AIL(I,J)
             dt1(i)= -0.41412*AIL(I,J)
             dt2(i)= -0.56569*AIL(I,J)
             dt3(i)= -1.54559*AIL(I,J)
          endif
        enddo
        call vsexp(rs(il1),rs(il1),il2-il1+1)
        call vsexp(rt(il1),rt(il1),il2-il1+1)
        call vsexp(ds1(il1),ds1(il1),il2-il1+1)
        call vsexp(ds2(il1),ds2(il1),il2-il1+1)
        call vsexp(ds3(il1),ds3(il1),il2-il1+1)
        call vsexp(dt1(il1),dt1(il1),il2-il1+1)
        call vsexp(dt2(il1),dt2(il1),il2-il1+1)
        call vsexp(dt3(il1),dt3(il1),il2-il1+1)
        do I=IL1,IL2
             TRCLDS(i)=0.3*ds1(i)+0.5*ds2(i)+0.2*ds3(i)
             TRCLDT(i)=0.3*dt1(i)+0.5*dt2(i)+0.2*dt3(i)
        enddo
c
        do I=IL1,IL2
          IF(FCAN(I,J).GT.0. .AND. COSZS(I).GT.0.)             THEN
             TRVS  =FCLOUD(I)*TRCLDS(i)+(1.0-FCLOUD(I))*rs(i)
             TRTOT =FCLOUD(I)*TRCLDT(i)+(1.0-FCLOUD(I))*rt(i)
             TRIR  = 2.*TRTOT-TRVS
             TRVSCN(I)=TRVSCN(I)+FCAN(I,J)*TRVS
             TRIRCN(I)=TRIRCN(I)+FCAN(I,J)*TRIR
             CXTEFF(I,J)=-LOG(TRVS)/max(0.001,AIL(I,J))
          ENDIF
        enddo
c       call vslog(CXTEFF(IL1,J),CXTEFF(IL1,J),IL2-IL1+1)
c       do I=IL1,IL2
c         IF(FCANS(I,J).GT.0. .AND. COSZS(I).GT.0.
c    1          .AND. AIL(I,J).GT..001)                     THEN
c            CXTEFF(I,J)=-CXTEFF(I,J)/AIL(I,J)
c         ENDIF
c       enddo
  300 continue
C
C     * TOTAL TRANSMISSIVITIES.
C
      IPTBAD=0
      DO 350 I=IL1,IL2
         IF(FC(I).GT.0. .AND. COSZS(I).GT.0.)             THEN
            TRVSCN(I)=TRVSCN(I)/FC(I)
            TRIRCN(I)=TRIRCN(I)/FC(I)
            TRVSCN(I)=MIN( TRVSCN(I), 0.90*(1.0-ALVSCN(I)) )
            TRIRCN(I)=MIN( TRIRCN(I), 0.90*(1.0-ALIRCN(I)) )
         ENDIF
         IF(TRVSCN(I).GT.1. .OR. TRVSCN(I).LT.0.) IPTBAD=I
         IF(TRIRCN(I).GT.1. .OR. TRIRCN(I).LT.0.) IPTBAD=I
  350 CONTINUE
C
      IF(IPTBAD.NE.0) THEN
         WRITE(6,6300) IPTBAD,JL,TRVSCN(IPTBAD),TRIRCN(IPTBAD)
 6300    FORMAT('0AT (I,J)= (',I3,',',I3,'), TRVSCN,TRIRCN = ',2F10.5)
         CALL XIT('CANALB',-3)   
      ENDIF
C
C-----------------------------------------------------------------------
C     * TRANSMISSIVITY CALCULATIONS FOR CANOPY OVER SNOW.
      do 400 J=1,IC
        do I=IL1,IL2
C
C     *   NEEDLELEAF TREES.
C
          if(j.eq.1)                       then
             rs(i)= -0.4*AILS(I,J)*secz(i)
             rt(i)= -0.3*AILS(I,J)*secz(i)
             ds1(i)= -0.41412*AILS(I,J)
             ds2(i)= -0.56569*AILS(I,J)
             ds3(i)= -1.54559*AILS(I,J)
             dt1(i)= -0.31059*AILS(I,J)
             dt2(i)= -0.42427*AILS(I,J)
             dt3(i)= -1.15920*AILS(I,J)
C
C     * BROADLEAF TREES.
C
          else if(j.eq.2)                  then
             rs(i)=min(-0.7*AILS(I,J),-0.4*secz(i))
             rt(i)=min(-0.4*AILS(I,J),-0.4*secz(i))
             ds1(i)=min(-0.7*AILS(I,J),-0.41412)
             ds2(i)=min(-0.7*AILS(I,J),-0.56569)
             ds3(i)=min(-0.7*AILS(I,J),-1.54559)
             dt1(i)=min(-0.4*AILS(I,J),-0.41412)
             dt2(i)=min(-0.4*AILS(I,J),-0.56569)
             dt3(i)=min(-0.4*AILS(I,J),-1.54559)
C
C     * CROPS AND GRASS.
C
          else
             rs(i)= -0.5*AILS(I,J)*secz(i)
             rt(i)= -0.4*AILS(I,J)*secz(i)
             ds1(i)= -0.51765*AILS(I,J)
             ds2(i)= -0.70711*AILS(I,J)
             ds3(i)= -1.93199*AILS(I,J)
             dt1(i)= -0.41412*AILS(I,J)
             dt2(i)= -0.56569*AILS(I,J)
             dt3(i)= -1.54559*AILS(I,J)
          endif
        enddo
        call vsexp(rs(il1),rs(il1),il2-il1+1)
        call vsexp(rt(il1),rt(il1),il2-il1+1)
        call vsexp(ds1(il1),ds1(il1),il2-il1+1)
        call vsexp(ds2(il1),ds2(il1),il2-il1+1)
        call vsexp(ds3(il1),ds3(il1),il2-il1+1)
        call vsexp(dt1(il1),dt1(il1),il2-il1+1)
        call vsexp(dt2(il1),dt2(il1),il2-il1+1)
        call vsexp(dt3(il1),dt3(il1),il2-il1+1)
        do I=IL1,IL2
             TRCLDS(i)=0.3*ds1(i)+0.5*ds2(i)+0.2*ds3(i)
             TRCLDT(i)=0.3*dt1(i)+0.5*dt2(i)+0.2*dt3(i)
        enddo
c
        do I=IL1,IL2
          IF(FCANS(I,J).GT.0. .AND. COSZS(I).GT.0.)             THEN
             TRVS  =FCLOUD(I)*TRCLDS(i)+(1.0-FCLOUD(I))*rs(i)
             TRTOT =FCLOUD(I)*TRCLDT(i)+(1.0-FCLOUD(I))*rt(i)
             TRIR  = 2.*TRTOT-TRVS
             TRVSCS(I)=TRVSCS(I)+FCANS(I,J)*TRVS
             TRIRCS(I)=TRIRCS(I)+FCANS(I,J)*TRIR
          ENDIF
        enddo
  400 continue
C
C     * TOTAL TRANSMISSIVITIES AND CONSISTENCY CHECKS.
C
      IPTBAD=0
      JPTBAD=0
      DO 450 I=IL1,IL2
         IF(FCS(I).GT.0. .AND. COSZS(I).GT.0.)                     THEN
            TRVSCS(I)=TRVSCS(I)/FCS(I)
            TRIRCS(I)=TRIRCS(I)/FCS(I)
            TRVSCS(I)=MIN( TRVSCS(I), 0.90*(1.0-ALVSCS(I)) )
            TRIRCS(I)=MIN( TRIRCS(I), 0.90*(1.0-ALIRCS(I)) )
         ENDIF
         IF(TRVSCS(I).GT.1. .OR. TRVSCS(I).LT.0.) IPTBAD=I
         IF(TRIRCS(I).GT.1. .OR. TRIRCS(I).LT.0.) IPTBAD=I
         IF((1.-ALVSCN(I)-TRVSCN(I)).LT.0.)     THEN
            JPTBAD=1000+I
            JPTBDI=I
         ENDIF
         IF((1.-ALVSCS(I)-TRVSCS(I)).LT.0.)     THEN
            JPTBAD=2000+I
            JPTBDI=I
         ENDIF
         IF((1.-ALIRCN(I)-TRIRCN(I)).LT.0.)     THEN
            JPTBAD=3000+I
            JPTBDI=I
         ENDIF
         IF((1.-ALIRCS(I)-TRIRCS(I)).LT.0.)     THEN
            JPTBAD=4000+I
            JPTBDI=I
         ENDIF
  450 CONTINUE
C
      IF(IPTBAD.NE.0) THEN
         WRITE(6,6400) IPTBAD,JL,TRVSCS(IPTBAD),TRIRCS(IPTBAD)
 6400    FORMAT('0AT (I,J)= (',I3,',',I3,'), TRVSCS,TRIRCS = ',2F10.5)
         CALL XIT('CANALB',-4)
      ENDIF
C
      IF(JPTBAD.NE.0) THEN
         WRITE(6,6500) JPTBDI,JL,JPTBAD
 6500    FORMAT('0AT (I,J)= (',I3,',',I3,'), JPTBAD =  ',I5)
         CALL XIT('CANALB',-5)
      ENDIF
C
C     * BULK STOMATAL RESISTANCES FOR CANOPY OVERLYING SNOW AND CANOPY
C     * OVERLYING BARE SOIL.
C
      DO 500 I=IL1,IL2
          IF((FCS(I)+FC(I)).GT.0.0)                               THEN
              IF(TA(I).LE.268.15)                          THEN
                  RCT(I)=250.
              ELSEIF(TA(I).LT.278.15)                 THEN
                  RCT(I)=1./(1.-(278.15-TA(I))*.1)
              ELSEIF(TA(I).GT.313.15)                      THEN
                  IF(TA(I).GE.323.15)               THEN
                      RCT(I)=250.
                  ELSE
                      RCT(I)=1./(1.-(TA(I)-313.15)*0.1)
                  ENDIF
              ELSE
                  RCT(I)=1.
              ENDIF
          ENDIF
500   CONTINUE
C
      DO 550 J=1,IC
      DO 550 I=IL1,IL2
          IF(FCAN(I,J).GT.0.)                                     THEN
              IF(VPD(I).LE.0.)                                 THEN
                  RCV(I,J)=1.0
              ELSE
                  IF(VPDA(I,J).GT.0.0.AND.VPDB(I,J).EQ.0.0) THEN
                      RCV(I,J)=1./EXP(-VPDA(I,J)*VPD(I)/10.)
                  ELSEIF(VPDA(I,J).GT.0.)                       THEN
                      RCV(I,J)=MAX(1.,((VPD(I)/10.)**VPDB(I,J))/
     1                         VPDA(I,J))
                  ENDIF
              ENDIF
              IF(PSIGA(I,J).GT.10.)
     1             RCG(I,J)=1.+(PSIGND(I)/PSIGA(I,J))**PSIGB(I,J)
              IF(QSWINV(I).GT.0..AND.COSZS(I).GT.0.
     1           .AND.CXTEFF(I,J).GT.0.0001.AND.RCG(I,J).LT.1.E5) THEN
                RCACC(I,J)=MIN(CXTEFF(I,J)*RSMIN(I,J)/MAX(1.E-4,
     1                  LOG((QSWINV(I)+
     1            QA50(I,J)/CXTEFF(I,J))/(QSWINV(I)*EXP(-CXTEFF(I,J)*
     2          AIL(I,J))+QA50(I,J)/CXTEFF(I,J))))*RCV(I,J)*RCG(I,J)*
     3            RCT(I),5000.)
              ELSE
                RCACC(I,J)=5000.
              ENDIF
              RC(I)=RC(I)+FCAN(I,J)*RCACC(I,J)
              GC(I)=GC(I)+FCAN(I,J)/MAX(RCACC(I,J),1.E-4)
          ENDIF
550   CONTINUE
C
      DO 600 I=IL1,IL2
          IF((FCS(I)+FC(I)).GT.0.)                                THEN
              IF(MAX(FROOT(I,1),FROOT(I,2),FROOT(I,3))
     1                         .LT. 1.0E-6)                   THEN
                  RCS(I)=1.0E+20
                  RC(I) =1.0E+20
              ELSEIF(QSWINV(I).LT.2.0)                        THEN
                  RCS(I)=5000.0
                  RC(I)=5000.0
              ELSEIF(RC(I).GT.0.)                             THEN
                  RCS(I)=5000.0
                  RC(I)= 2./((FCS(I)+FC(I))/RC(I)+
     1                GC(I)/(FCS(I)+FC(I)))
              ELSE
                  RCS(I)=5000.0
              ENDIF                                                         
          ELSE
              RC(I)=0.0
              RCS(I)=0.0
          ENDIF                                                             
  600 CONTINUE
      return
      end