#include "rundeck_opts.h"


      MODULE RADPAR 12
!@sum radiation module based originally on rad00b.radcode1.F
!@auth A. Lacis/V. Oinas/R. Ruedy

      IMPLICIT NONE

C--------------------------------------------------
C     Grid parameters: Vertical resolution/profiles
C--------------------------------------------------

!@var LX max.number of vertical layers of the radiation (1D)-model
!@+
!@+   The Radiation Model can accomodate  arbitrary vertical resolution,
!@+              the number of layers may be time or location dependent,
!@+              but it cannot exceed LX.
!@+   Since the GCM uses 3 radiative equilibrium layers on top of the
!@+   model atmosphere, the number LM of GCM layers may be at most LX-3.
      INTEGER, PARAMETER :: LX = 54+3

!     optional repartitioning of gases - OFFLINE use only
!@var MRELAY if not 0, gases/aerosols are repartitioned to new layering
!@var KEEP10 if =10 N2 is kept, not repartitioned    (only if MRELAY>0)
!@+           n=1-9 N2 not repartitioned and replaces gas n
!@+         n=11-19 N2 not repartitioned and added to gas n-10
!@var NO3COL if >0 ozone is rescaled before repartitioning if MRELAY>0
!@var RO3COL = rescaled column amount of O3 if NO3COL>0   (if MRELAY>0)
      INTEGER :: MRELAY=0, KEEP10=0, NO3COL=0 ; REAL*8 :: RO3COL=1.

!     temperature profile within a layer: TLB,TLM,TLT bottom,mid,top T
!@var TLGRAD if >=0 tlt=tlm+dT*TLGRAD, tlb=tlm-dT*TLGRAD where
!@+        dT is chosen to try to minimize discontinuities if TLGRAD=1
!@+        if TLGRAD<0 tlt,tlm,tlb are all inputs        (OFFLINE use)
!@var PTLISO tlt=tlb=tlm above PTLISO mb independent of TLGRAD
      REAL*8 :: TLGRAD=1.             !     control param
      REAL*8 :: PTLISO=2.5d0          ! GCM control param

C-------------------------------------------
C     Grid parameters: Horizontal resolution
C-------------------------------------------

!@var MLAT46,MLON72 horizontal grid dimensions referred to in this model
!@+   The Radiation Model utilizes Data with 72x46 (lon,lat) resolution.
!@+               For GCM resolution other than 72x46, set JLAT and ILON
!@+               to appropriately Sample  (rather than interpolate) the
!@+               72x46 aerosol, ozone, cloud heterogeneity data sets
      INTEGER, PARAMETER ::  MLAT46=46,MLON72=72

!@var JNORTH latitude index defining northern hemisphere : jlat>jnorth
      INTEGER, PARAMETER ::  JNORTH=MLAT46/2

!     longitudes of box centers (degrees): -177.5,-172.5., ... ,177.5
!@var DLAT46 latitudes of box centers (degrees)
      REAL*8, PARAMETER :: DLAT46(46)=(/
     A    -90.,-86.,-82.,-78.,-74.,-70.,-66.,-62.,-58.,-54.,-50.,-46.,
     B    -42.,-38.,-34.,-30.,-26.,-22.,-18.,-14.,-10., -6., -2.,  2.,
     C      6., 10., 14., 18., 22., 26., 30., 34., 38., 42., 46., 50.,
     D     54., 58., 62., 66., 70., 74., 78., 82., 86., 90./)

C----------------
C     Input data               for the 1-d radiation
C----------------

!@var LASTVC if >= 0 picks sample atmosph. and ground data, OFFLINE only
      INTEGER :: LASTVC=-123456

!@var COSZ          cosine of zenith angle  (1)
      REAL*8 cosz
!@var JLAT,ILON     lat,lon index  w.r.to 72x46 lon-lat grid
!@var NL,L1         highest and lowest above ground layer
!@var LS1_loc       local tropopause level, used to limit H2O-scaling
      INTEGER   :: JLAT,ILON, NL,L1, LS1_loc ! Offline deflts L1=LS1_loc=1
!@var JYEAR,JDAY    current year, Julian date
      INTEGER :: JYEAR=1980, JDAY=1

!@var PLB           layer pressure (mb) at bottom of layer
!@var HLB           height (km) at bottom of layer - currently NOT Used
!@var TLm           mean layer temperature (K)
!@var TLb,TLt       bottom,top layer temperature (K) - derived from TLm
!@+                                                    (unless TLGRAD<0)
!@var SHL,RHL       layer specific,relative humidity (1)
      REAL*8, dimension(LX+1) :: PLB,HLB,TLB
      REAL*8, dimension(LX)   :: TLT,TLM,SHL,RHL
!@var KEEPRH  if 0: find RH from SH, 1: find SH from RH, 2: keep both
      INTEGER :: KEEPRH=2

!@var ULGAS         current gas amounts, 13 types  (cm atm) (in getgas)
!@var TAUWC,TAUIC   opt.depth of water,ice cloud layer (1)
!@var SIZEWC,SIZEIC particle size of water,ice clouds (micron)
!@var CLDEPS        cloud heterogeneity; is computed using KCLDEP,EPSCON
      REAL*8 :: ULGAS(LX,13),TAUWC(LX),TAUIC(LX),SIZEWC(LX),SIZEIC(LX)
     *     ,CLDEPS(LX)
!@var       EPSCON  cldeps=EPSCON if KCLDEP=1
!@var       KCLDEP  KCLDEP=0->CLDEPS=0, 1->=EPSCON, 2->as is, 3,4->isccp
      REAL*8 :: EPSCON=0. ; INTEGER :: KCLDEP=4 ! control param

!@var KDELIQ Flag for dry(0) or wet(1) air deliquescence
      INTEGER :: KDELIQ(LX,4)
!@var KRHDTK if 1, RHlevel for deliquescence is temperature dependent
      INTEGER :: KRHDTK=1    !  control parameter

!@var SRBALB,SRXALB diffuse,direct surface albedo (1); see KEEPAL
      REAL*8 :: SRBALB(6),SRXALB(6),dalbsn ! prescr change in snowalbedo
!@var       KEEPAL  if 0, SRBALB,SRXALB are computed in SET/GETSUR
      INTEGER :: KEEPAL=0       ! control param
!@dbparm    KSIALB  sea ice albedo computation flag: 0=Hansen 1=Lacis
      INTEGER :: KSIALB=0
!@var PVT           frac. of surf.type (bareWhite+veg*8+bareDark+ocn)(1)
!@var AGESN 1-3     age of snow    (over soil,oice,land ice) (days)
!@var SNOWE,SNOWLI  amount of snow (over soil,land ice)   (kg/m^2)
!@var SNOWOI        amount of snow (over ocean/lake ice)  (kg/m^2)
!@var WEARTH        soil wetness (1)
!@var WMAG          wind speed (m/s)
!@var POCEAN        fraction of box covered by ocean or lake  (1)
!@var PLAKE         fraction of box covered by lake           (1)
!@var PEARTH        fraction of box covered by soil           (1)
!@var POICE         fraction of box covered by ocean/lakeice  (1)
!@var PLICE         fraction of box covered by glacial ice    (1)
!@var TGO           top layer water temperature (K) of ocean/lake
!@var TGE,TGOI,TGLI top layer ground temperature (K) soil,seaice,landice
!@var TSL           surface air temperature (K)
      REAL*8 PVT(12),AGESN(3),SNOWE,SNOWOI,SNOWLI,WEARTH,WMAG,POCEAN
     *     ,PEARTH,POICE,PLICE,PLAKE,TGO,TGE,TGOI,TGLI,TSL
!@var KZSNOW        =1 for snow/ice albedo zenith angle dependence
      INTEGER :: KZSNOW=1
!     Additional info for Schramm/Schmidt/Hansen sea ice albedo KSIALB=0
!@var ZSNWOI        depth of snow over ocean ice (m)
!@var zoice         depth of ocean ice (m)
!@var zmp           depth of melt pond (m)
!@var fmp           fraction of melt pond area (1)
!@var zlake         lake depth (m)
!@var flags         true if snow is wet
!@var snow_frac(2)  fraction of snow over bare(1),vegetated(2) soil (1)
!@var snoage_fac_max  max snow age reducing-factor for sea ice albedo
      REAL*8 :: zsnwoi,zoice,zmp,fmp,zlake,snow_frac(2)
      REAL*8 :: snoage_fac_max=.5d0

!@var ITRMAX maximum number of optional tracers
      INTEGER, PARAMETER :: ITRMAX=50
!@var TRACER array to add up to ITRMAX additional aerosol species
      REAL*8    :: TRACER(LX,ITRMAX)
!@var FSTOPX,FTTOPX scales optional aerosols (solar,thermal component)
      REAL*8    :: FSTOPX(ITRMAX),FTTOPX(ITRMAX)
!@var O3_IN column variable for importing ozone field from rest of model
!@var use_tracer_ozone: set U0GAS(L,3)=O3_IN(L), L=L1,use_tracer_ozone
      REAL*8  O3_IN(LX)
      INTEGER use_tracer_ozone
      LOGICAL*4 :: flags

      COMMON/RADPAR_INPUT_IJDATA/    !              Input data to RCOMPX
     A              PLB,HLB,TLB,TLT,TLM,SHL,RHL,ULGAS
     B             ,TAUWC,TAUIC,SIZEWC,SIZEIC,CLDEPS
     C             ,TRACER,SRBALB,SRXALB,dalbsn
     D             ,PVT,AGESN,SNOWE,SNOWOI,SNOWLI,WEARTH,WMAG
     E             ,POCEAN,PEARTH,POICE,PLICE,PLAKE
     F             ,TGO,TGE,TGOI,TGLI,TSL,COSZ,FSTOPX,FTTOPX,O3_IN
     X             ,zsnwoi,zoice,zmp,fmp,snow_frac,zlake,FTAUC
C      integer variables start here, followed by logicals
     Y             ,JLAT,ILON, L1,NL, LS1_loc, use_tracer_ozone, flags
     Z             ,KDELIQ                ! is updated by rad. after use
!$OMP  THREADPRIVATE(/RADPAR_INPUT_IJDATA/)

!@var U0GAS   reference gas amounts, 13 types  (cm atm)      (in setgas)
C     array with local and global entries: repeat this section in driver
      REAL*8 U0GAS(LX,13)
      COMMON/RADPAR_hybrid/U0GAS
!$OMP THREADPRIVATE(/RADPAR_hybrid/)
C     end of section to be repeated in driver (needed for 'copyin')

C--------------------------------------------------------
C     Output data     (from RCOMPX)  grid point dependent
C--------------------------------------------------------

!@var TRDFLB,TRUFLB,TRNFLB  Thrml down,up,net Flux at Layr Bottom (W/m2)
!@var SRDFLB,SRUFLB,SRNFLB  Solar down,up,net Flux at Layr Bottom (W/m2)
!@var TRFCRL,SRFHRL         layer LW Cooling Rate,SW Heating Rate (W/m2)
!@var SR.VIS,SR.NIR         SW fluxes in vis,near-IR domain       (W/m2)
!@var PLA...,ALB...         planetary and surface albedos            (1)
!@var TR...W,WINDZF            fluxes in the window region        (W/m2)
!@var BTEMPW,WINDZT      Brightness temperature in the window region (K)
!@var SK...,SRK...       Spectral breakdown of fluxes/heat.rates  (W/m2)
!@var FSRNFG,FTRUFG      surface type fractions of SW,LW fluxes   (W/m2)
!@var DTRUFG               not used                               (W/m2)
!sl!@var FTAUSL,TAUSL,...  surface layer computations commented out: !sl
!@var LBOTCL,LTOPCL  bottom and top cloud level (lbot < ltop)
!@var chem_out column variable for exporting radiation code quantities
!@    1=Ozone, 2=aerosol ext, 3=N2O, 4=CH4,5=CFC11+CFC12
!@var TTAUSV saves special aerosol optical thickness for diagnostic
!@var aesqex saves extinction aerosol optical thickness
!@var aesqsc saves scattering aerosol optical thickness
!@var aesqcb saves aerosol scattering asymmetry factor

      REAL*8 TRDFLB(LX+1),TRUFLB(LX+1),TRNFLB(LX+1), TRFCRL(LX)
      REAL*8 SRDFLB(LX+1),SRUFLB(LX+1),SRNFLB(LX+1), SRFHRL(LX)
      REAL*8 chem_out(LX,5)
      REAL*8 SRIVIS,SROVIS,PLAVIS,SRINIR,SRONIR,PLANIR,
     *       SRDVIS,SRUVIS,ALBVIS,SRDNIR,SRUNIR,ALBNIR,
     *       SRTVIS,SRRVIS,SRAVIS,SRTNIR,SRRNIR,SRANIR
      REAL*8 TRDFGW,TRUFGW,TRUFTW,BTEMPW,SRXVIS,SRXNIR
      REAL*8 WINDZF(3),WINDZT(3),TOTLZF(3),TOTLZT(3)
      REAL*8 SRKINC(16),SRKALB(16),SRKGAX(16,4),SRKGAD(16,4)
      REAL*8, dimension(LX,17) ::   SKFHRL
      REAL*8, dimension(LX+1,17) :: SKDFLB,SKUFLB,SKNFLB
      REAL*8 FSRNFG(4),FTRUFG(4),DTRUFG(4) ! ,SRXATM(4)
!sl   REAL*8 FTAUSL(33),TAUSL(33)             ! surf.layer input data
!nu  K      ,TRDFSL,TRUFSL,TRSLCR,SRSLHR,TRSLWV  !nu = not (yet) used
!sl  K      ,TRSLTS,TRSLTG,TRSLBS
      REAL*8 TTAUSV(LX,ITRMAX),aesqex(lx,6,itrmax),aesqsc(lx,6,itrmax),
     &     aesqcb(lx,6,itrmax)

      INTEGER :: LBOTCL,LTOPCL

      COMMON/RADPAR_OUTPUT_IJDATA/
     A              TRDFLB,TRUFLB,TRNFLB,TRFCRL
     B             ,SRDFLB,SRUFLB,SRNFLB,SRFHRL
     C             ,SRIVIS,SROVIS,PLAVIS,SRINIR,SRONIR,PLANIR  !,SRXATM
     D             ,SRDVIS,SRUVIS,ALBVIS,SRDNIR,SRUNIR,ALBNIR,FSRNFG
     E             ,SRTVIS,SRRVIS,SRAVIS,SRTNIR,SRRNIR,SRANIR,FTRUFG
     F             ,TRDFGW,TRUFGW,TRUFTW,BTEMPW,DTRUFG
     G             ,WINDZF,WINDZT,TOTLZF,TOTLZT,SRKINC
     I             ,SRKALB,SRKGAX,SRKGAD,SKDFLB
     J             ,SKUFLB,SKNFLB,SKFHRL,SRXVIS,SRXNIR
!sl  K             ,FTAUSL,TAUSL    ! input rather than output ?
!nu  K             ,TRDFSL,TRUFSL,TRSLCR,SRSLHR,TRSLWV   !nu = not used
!sl  K             ,TRSLTS,TRSLTG,TRSLBS
     K             ,TTAUSV,chem_out,aesqex,aesqsc,aesqcb
     L             ,LBOTCL,LTOPCL   ! integers last for alignment
!$OMP THREADPRIVATE(/RADPAR_OUTPUT_IJDATA/)
!nu   EQUIVALENCE (SRXATM(1),SRXVIS),(SRXATM(2),SRXNIR)
!nu   EQUIVALENCE (SRXATM(3),XXAVIS),(SRXATM(4),XXANIR)  !nu = not used

C----------------   scratch pad for temporary arrays that are passed to
C     Work arrays   other routines while working on a lat/lon point;
C----------------   but with openMP, each cpu needs its own copy !!

      REAL*8, dimension(LX,6) ::
     *     SRAEXT,SRASCT,SRAGCB,SRBEXT,SRBSCT,SRBGCB,
     *     SRDEXT,SRDSCT,SRDGCB,SRVEXT,SRVSCT,SRVGCB,
     *     SRCEXT,SRCSCT,SRCGCB,SRCPI0
      REAL*8, dimension(LX+1,6) :: DBLEXT,DBLSCT,DBLGCB,DBLPI0
      REAL*8, dimension(LX ,33) :: TRTAUK,TRGXLK
     *        ,TRCALK,TRAALK,TRBALK,TRDALK,TRVALK
      REAL*8 DFLB(LX+1,33),UFLB(LX+1,33)
      REAL*8, dimension(33) :: TRCTCA,DFSL,UFSL,TXCTPG,TSCTPG
     *     ,TGCTPG,AVH2S,TRGALB,BGFEMT,BGFEMD
      REAL*8, dimension(LX) :: PL,DPL,O2FHRL,SRAXNL,SRASNL,SRAGNL,O2FHRB
      REAL*8 BXA(7),PRNB(6,4),PRNX(6,4),Q55H2S
     *     ,QVH2S(6),SVH2S(6),GVH2S(6),XTRU(LX,4),XTRD(LX,4)
     *     ,DXAERU(LX,4,4,LX+4),DXAERD(LX,4,4,LX+4)
      INTEGER IP24C9(LX)
C**** local except for special radiative aerosol diagnostics aadiag

      COMMON/WORKDATA/          !          Temp data generated by RCOMPX
     A              SRAEXT,SRASCT,SRAGCB,TRCALK
     B             ,SRBEXT,SRBSCT,SRBGCB,TRAALK
     C             ,SRDEXT,SRDSCT,SRDGCB,TRBALK
     D             ,SRVEXT,SRVSCT,SRVGCB,TRTAUK
     E             ,DBLEXT,DBLSCT,DBLGCB,DBLPI0
     F             ,SRCEXT,SRCSCT,SRCGCB,SRCPI0
     G             ,TRDALK,TRVALK,TRGXLK,TRCTCA
     H             ,DFLB,UFLB,PL,DPL
     I             ,TRGALB,BGFEMT,BGFEMD
     K             ,DFSL,UFSL
     P             ,BXA,PRNB,PRNX
     Q             ,Q55H2S
     S             ,TXCTPG,TSCTPG,TGCTPG
     V             ,O2FHRL,SRAXNL,SRASNL,SRAGNL
     W             ,O2FHRB
     X             ,QVH2S,SVH2S,GVH2S,AVH2S
     F             ,XTRU,XTRD,DXAERU,DXAERD
     I             ,IP24C9                     ! INTEGERs last
!$OMP  THREADPRIVATE(/WORKDATA/)

      REAL*8 ::  SRCQPI(6,15),TRCQPI(33,15)       !??? to setcld/getcld
                 !  Temp data used by WRITER, WRITET
      REAL*8  :: TRAQAB(33,11),TRBQAB(33,10),TRCQAB(33,15),TRDQAB(33,25)
      INTEGER :: NORDER(16),NMWAVA(16),NMWAVB(16)

C------------------------------------------
C     Reference data, Tables, Climatologies
C------------------------------------------

      REAL*8, PARAMETER :: DKS0(16)=(/
     *           .010, .030, .040, .040, .040, .002, .004, .013,
     +           .002, .003, .003, .072, .200, .480, .050, .011/)

      INTEGER ::  NKSLAM=14
      INTEGER,parameter :: KSLAM(16)=(/1,1,2,2,5,5,5,5,1,1,1,3,4,6,6,1/)

      REAL*8 ::                 !   Model parameters generated by RCOMP1
     H              HLB0(LX+1),PLB0(LX+1),TLM0(LX),U0GAS3(LX)
     A             ,TKPFW(630),TKPFT(900),AO3(460)
     D             ,FPXCO2(LX),FPXOZO(LX) !nu ,PIAERO(10)
     E ,QXDUST(6,8),QSDUST(6,8),QCDUST(6,8),ATDUST(33,8),QDST55(8) !?DST
     D             ,TRAX(LX,33,5),DBLN(30),TCLMIN

C            RADDAT_TR_SGP_TABLES          read from  radfile1, radfile2
#ifndef USE_RADIATION_E1
      INTEGER, PARAMETER :: NGUX=1024, NTX=8, NPX=19
      REAL*8, dimension(NGUX,NTX,NPX) :: TAUTBL,TAUWV0,TAUCD0
      REAL*8  PLANCK(124:373,33), H2O(100),FCO2(100)
      REAL*8  XKCFC(12,8,17:20),ULOX(19,16),DUX(19,16), XTFAC(11,9)
      REAL*8  XTU0(24,3),XTD0(24,3), XTRUP(24,15,3),XTRDN(24,15,3)
      REAL*8, dimension(24,15,11,3) ::
     *        DXUP2,DXUP3,DXUP6,DXUP7,DXUP8,DXUP9      ! dim(24,15,11,3)
     *       ,DXDN2,DXDN3,DXDN6,DXDN7,DXDN8,DXDN9      ! dim(24,15,11,3)
      REAL*8, dimension(24,15,3) :: DXUP13,DXDN13
#else
      INTEGER, PARAMETER :: NGUX=1008, NTX=8, NPX=19
      REAL*8, dimension(NGUX,NTX,NPX) :: TAUTBL,TAUWV0
      REAL*8 PLANCK(124:373,33)
      REAL*8 XKCFC(12,8,16:19),ULOX(19,15),DUX(19,15)
      REAL*8 XTU0(24,3),XTD0(24,3), XTRUP(24,3,15),XTRDN(24,3,15)
      REAL*8 XUCH4(9,15),XUN2O(9,15),CXUO3(7,15),CXUCO2(7,15)
      REAL*8 XUCH40(9),XUN2O0(9)
      REAL*4 DXTRUA(24,3,4,13),DXTRDA(24,3,4,13),SAX(4,13)
#endif
c---------------------------------------------------------------------
C         Default h2o continuum is Ma 2000.  Other options: Ma 2004
C         Roberts, MT_CKD model (Mlawer/Tobin_Clough/Kneizys/Davies)
C---------------------------------------------------------------------
      REAL*8 H2OCN8(33,8,14),H2OCF8(33,8,5)

C            RADDAT_AERCLD_MIEPAR          read from            radfile3
      REAL*8 ::
     A              SRAQEX( 6,11),SRAQSC( 6,11),SRAQCB( 6,11),Q55A11(11)
     B             ,TRAQEX(33,11),TRAQSC(33,11),TRAQCB(33,11),REFA11(11)
     C             ,SRBQEX( 6,10),SRBQSC( 6,10),SRBQCB( 6,10),Q55B10(10)
     D             ,TRBQEX(33,10),TRBQSC(33,10),TRBQCB(33,10),REFB10(10)
     E             ,SRCQEX( 6,15),SRCQSC( 6,15),SRCQCB( 6,15),Q55C15(15)
     F             ,TRCQEX(33,15),TRCQSC(33,15),TRCQCB(33,15),REFC15(15)
     G             ,TRCQAL(33,15),VEFC15(15)   ,VEFA11(   11),VEFB10(10)
     H             ,SRDQEX( 6,25),SRDQSC( 6,25),SRDQCB( 6,25),Q55D25(25)
     I             ,TRDQEX(33,25),TRDQSC(33,25),TRDQCB(33,25),REFD25(25)
     J             ,TRDQAL(33,25),VEFD25(25)
     K         ,SRVQEX( 6,20,6),SRVQSC( 6,20,6),SRVQCB( 6,20,6)
     L         ,TRVQEX(33,20,6),TRVQSC(33,20,6),TRVQCB(33,20,6)
     M         ,TRVQAL(33,20,6),Q55V20(20,6),REFV20(20,6),VEFV20(20,6)
     N         ,SRUQEX( 6,120),SRUQSC( 6,120),SRUQCB( 6,120),Q55U22(120)
     O         ,TRUQEX(33,120),TRUQSC(33,120),TRUQCB(33,120),REFU22(120)
     P         ,TRUQAL(33,120),VEFU22(120),TRSQAL(33,25),VEFS25(25)
     Q             ,SRSQEX( 6,25),SRSQSC( 6,25),SRSQCB( 6,25),Q55S25(25)
     R             ,TRSQEX(33,25),TRSQSC(33,25),TRSQCB(33,25),REFS25(25)

      REAL*8    SRQV( 6,20),SRSV( 6,20),SRGV( 6,20),Q55V(   20),REFV(20)
      REAL*8    TRQV(33,20),TRSV(33,20),TRGV(33,20),TRAV(33,20),VEFV(20)
      EQUIVALENCE (SRVQEX(1,1,6),SRQV(1,1)), (SRVQSC(1,1,6),SRSV(1,1))
      EQUIVALENCE (SRVQCB(1,1,6),SRGV(1,1)),   (Q55V20(1,6),Q55V(1))
      EQUIVALENCE (TRVQEX(1,1,6),TRQV(1,1)), (TRVQSC(1,1,6),TRSV(1,1))
      EQUIVALENCE (TRVQCB(1,1,6),TRGV(1,1)), (TRVQAL(1,1,6),TRAV(1,1))
      EQUIVALENCE   (REFV20(1,6),REFV(1)),     (VEFV20(1,6),VEFV(1))

C            RADDAT_CLDCOR_TRSCAT           read from           radfileE
      REAL*8 :: RIJTPG(6,49,17,21),FDXTPG(3,49,17,21),FEMTPG(3,49,17,21)



C--------------------------------------   This also should be moved out
C     History files (+ control options)   of RADPAR, which should just
C--------------------------------------   have to handle 1 point in time

!     -------------------------------------------------------i/o control
!@var MADxxx  Model Add-on Data of Extended Climatology Enable Parameter
!@+   ------   if 0   input process is skipped
!@+ 2 MADAER   =  1   Reads  Aerosol tropospheric climatology
!@+ 3 MADDST   =  1   Reads  Dust-windblown mineral climatology   RFILE6
!@+ 4 MADVOL   =  1   Reads  Volcanic 1950-00 aerosol climatology RFILE7
!@+ 5 MADEPS   =  1   Reads  Epsilon cloud heterogeneity data     RFILE8
!@+ 6 MADLUV   =  1   Reads  Lean's SolarUV 1882-1998 variability RFILE9
!@+   MADGHG   =  1          Enables UPDGHG update. MADGHG=0: no update
!@+   MADSUR   =  1   Reads  Vegetation,Topography data    RFILEC,RFILED
!@+   MADBAK   if 1          Adds background aerosols
!     ------------------------------------------------------------------
      INTEGER :: MADO3M=1,MADAER=1,MADDST=1,MADVOL=1,MADEPS=1,MADLUV=1
      INTEGER :: MADGHG=1,MADSUR=0,MADBAK=0 ! MADSUR=1 for OFF-line only

!     ------------------------------------------------------time control
!@var KYEARx,KJDAYx if both are 0   : data are updated to current yr/day
!@+   -------------    only KJDAYx=0: data cycle through year KYEARx
!@+                    neither is 0 : yr/day=KYEARx/KJDAYx data are used
!@+   KYEARS,KJDAYS: Solar Trend
!@+   KYEARO,KJDAYO: Ozone Trend
!@+   KYEARD,KJDAYD: Dust Trend
!@+   KYEARE,KJDAYE: CldEps Trend
!@+   KYEARG,KJDAYG: GHG  Trend
!@+   KYEARR,KJDAYR: RVegeTrend (Ground Albedo)
!@+   KYEARV,KJDAYV: Volc.Aerosol Trend
!@+   KYEARA,KJDAYA: trop.Aerosol Trend
!     ------------------------------------------------------------------
      INTEGER ::                    KYEARS=0,KJDAYS=0, KYEARG=0,KJDAYG=0
     *          ,KYEARO=0,KJDAYO=0, KYEARA=0,KJDAYA=0, KYEARD=0,KJDAYD=0
     *          ,KYEARV=0,KJDAYV=0, KYEARE=0,KJDAYE=0, KYEARR=0,KJDAYR=0

      INTEGER, PARAMETER :: NLO3=49 !  # of layers in ozone data files
!@var O3YR_max last year before O3 data repeat last ann. cycle
      INTEGER :: O3YR_max=1997
      REAL*8 :: O3JDAY(NLO3,MLON72,MLAT46)
      COMMON/O3JCOM/O3JDAY
C**** PLBO3(NLO3+1) could be read off the titles of the decadal files
      REAL*8 :: PLBO3(NLO3+1) = (/ ! plbo3(1) depends on plb0  ! ??
     *       984d0, 934d0, 854d0, 720d0, 550d0, 390d0, 285d0, 210d0,
     *       150d0, 125d0, 100d0,  80d0,  60d0,  55d0,  50d0,
     *        45d0,  40d0,  35d0,  30d0,  25d0,  20d0,  15d0,
     *       10.d0,  7.d0,  5.d0,  4.d0,  3.d0,  2.d0,  1.5d0,
     *        1.d0,  7d-1,  5d-1,  4d-1,  3d-1,  2d-1,  1.5d-1,
     *        1d-1,  7d-2,  5d-2,  4d-2,  3d-2,  2d-2,  1.5d-2,
     *        1d-2,  7d-3,  5d-3,  4d-3,  3d-3,  1d-3,  1d-7/)

!@var PLBA09 Vert. Layering for tropospheric aerosols/dust (reference)
      REAL*8, PARAMETER :: PLBA09(10)=(/
     *  1010.,934.,854.,720.,550.,390.,255.,150., 70., 10./)
C     Layer  1    2    3    4    5    6    7    8    9
      INTEGER, PARAMETER :: La720=3 ! top low cloud level (aerosol-grid)

C            RADMAD3_DUST_SEASONAL            (user SETDST)     radfile6
      REAL*4 TDUST(72,46,9,8,12)
      REAL*8 DDJDAY(9,8,72,46)

C            RADMAD4_VOLCAER_DECADAL          (user SETVOL)     radfile7
      REAL*8 V4TAUR(1800,24,5),FDATA(80),GDATA(80)
     C      ,HTFLAT(49,4),SIZLAT(49),TAULAT(49)

C            RADMAD5_CLDEPS_3D_SEASONAL       (user SETCLD)     radfile8
      REAL*4 EPLMHC(72,46,12,4)
      REAL*8 EPLOW(72,46),EPMID(72,46),EPHIG(72,46),EPCOL(72,46)

C            RADMAD6_SOLARUV_DECADAL          (user SETSOL)     radfile9
!@var iy1S0,MS0X first year, max.number of months for S0 history
!@var icycs0,mcycs0 solar cycle in yrs,months used to extend S0 history
!@var KSOLAR controls which data are used: <0 Thekaekara, else Lean:
!@+          1: use monthly data, 2: use annual data, 0: constant data
!@+          9: use annual data from file but with Thekaekara bins
      INTEGER :: KSOLAR=1       ! MADLUV=KSOLAR=0 only possible OFF-line

      INTEGER, PARAMETER :: iy1S0=1882, MS0X=12*(1998-iy1S0+1)
      INTEGER, PARAMETER :: icycs0=11,  mcycs0=icycs0*12
      REAL*4 UVLEAN(Ms0X,190),yr1S0,yr2S0
      REAL*8 TSI1(Ms0X),TSI2(Ms0X),FSLEAN(190),W1LEAN(190)

      REAL*8 :: S00WM2=1366.2911d0, S0=1366.d0, RATLS0=1.

      REAL*8 :: WSOLAR(190),FSOLAR(190)

C***  alternate sources to get WSOLAR,FSOLAR:
      REAL*8, dimension(190) :: WSLEAN,DSLEAN,FRLEAN
      common/LEAN1950/   WSLEAN,DSLEAN,FRLEAN              ! if MADLUV=0

      REAL*8, PARAMETER :: WTHEK(190)=(/        ! if KSOLAR<0
     *           .115,.120,.125,.130,.140,.150,.160,.170,.180,.190,.200,
     1 .210,.220,.225,.230,.235,.240,.245,.250,.255,.260,.265,.270,.275,
     2      .280,.285,.290,.295,.300,.305,.310,.315,.320,.325,.330,.335,
     3           .340,.345,.350,.355,.360,.365,.370,.375,.380,.385,.390,
     4           .395,.400,.405,.410,.415,.420,.425,.430,.435,.440,.445,
     5           .450,.455,.460,.465,.470,.475,.480,.485,.490,.495,.500,
     6           .505,.510,.515,.520,.525,.530,.535,.540,.545,.550,.555,
     7           .560,.565,.570,.575,.580,.585,.590,.595,.600,.605,.610,
     8           .620,.630,.640,.650,.660,.670,.680,.690,.700,.710,.720,
     9           .730,.740,.750,.760,.770,.780,.790,.800,.810,.820,.830,
     A .840,.850,.860,.870,.880,.890,.900,.910,.920,.930,.940,.950,.960,
     B 0.97,0.98,0.99,1.00,1.05,1.10,1.15,1.20,1.25,1.30,1.35,1.40,1.45,
     C 1.50,1.55,1.60,1.65,1.70,1.75,1.80,1.85,1.90,1.95,2.00,2.10,2.20,
     D 2.30,2.40,2.50,2.60,2.70,2.80,2.90,3.00,3.10,3.20,3.30,3.40,3.50,
     E 3.60,3.70,3.80,3.90,4.00,4.10,4.20,4.30,4.40,4.50,4.60,4.70,4.80,
     F  4.9, 5.0, 6.0, 7.0, 8.0, 9.0,10.0,11.0,12.0,13.0,14.0,15.00/)

      REAL*8, PARAMETER :: FTHEK(190)=(/
     *         .007,.900,.007,.007,.030,.070,.230,.630,1.25,2.71,10.7,
     1 22.9,57.5,64.9,66.7,59.3,63.0,72.3,70.4,104.,130.,185.,232.,204.,
     2    222.,315.,482.,584.,514.,603.,689.,764.,830.,975.,1059.,1081.,
     31074.,1069.,1093.,1083.,1068.,1132.,1181.,1157.,1120.,1098.,1098.,
     41189.,1429.,1644.,1751.,1774.,1747.,1693.,1639.,1663.,1810.,1922.,
     52006.,2057.,2066.,2048.,2033.,2044.,2074.,1976.,1950.,1960.,1942.,
     61920.,1882.,1833.,1833.,1852.,1842.,1818.,1783.,1754.,1725.,1720.,
     71695.,1705.,1712.,1719.,1715.,1712.,1700.,1682.,1666.,1647.,1635.,
     81602.,1570.,1544.,1511.,1486.,1456.,1427.,1402.,1389.,1344.,1314.,
     91290.,1260.,1235.,1211.,1185.,1159.,1134.,1109.,1085.,1060.,1036.,
     A1013.,990.,968.,947.,926.,908.,891.,880.,869.,858.,847.,837.,820.,
     B 803.,785.,767.,748.,668.,593.,535.,485.,438.,397.,358.,337.,312.,
     C 288.,267.,245.,223.,202.,180.,159.,142.,126.,114.,103., 90., 79.,
     D 69.0,62.0,55.0,48.0,43.0,39.0,35.0,31.0,26.0,22.6,19.2,16.6,14.6,
     E 13.5,12.3,11.1,10.3, 9.5,8.70,7.80,7.10,6.50,5.92,5.35,4.86,4.47,
     F  4.11,3.79,1.82,0.99,.585,.367,.241,.165,.117,.0851,.0634,.0481/)

!icb         RADMAD7_VEG_TOPOG          (user SETSUR)  radfileC,radfileD
!icb                 FVEG11(72,46,11),FOLGIZ(72,46,9)

C            RADMAD8_RELHUM_AERDATA     (user SETAER,SETREL)    radfileH
!nu   KRHAER(4) -1/0/1 flag to base aeros.sizes on 70%/0%/model rel.humi
!nu   INTEGER :: KRHAER(4)=(/1,1,1,1/) ! SO4,SSalt,NO3,OC
!@var KRHTRA(ITRMAX) 0/1 to make tracer aerosols rel.humid dependent
      INTEGER :: KRHTRA(ITRMAX)= 1
      REAL*8 ::
     A               SRHQEX(6,190,4),SRHQSC(6,190,4),SRHQCB( 6,190,4)
     B              ,TRHQAB(33,190,4),RHINFO(190,15,4),A6JDAY(9,6,72,46)
     C   ,SRTQEX(6,190,ITRMAX),SRTQSC(6,190,ITRMAX),SRTQCB(6,190,ITRMAX)
     D   ,TRTQAB(33,190,ITRMAX),RTINFO(190,15,ITRMAX)
     E   ,anssdd(72,46),mdpi(4,72,46),mdcur(5,72,46)
!new
!new  save TSOIL,TVEGE                  (not implemented)
!nu   DIMENSION PI0TRA(11)
!new  save FTRUFS,FTRUFV,DTRUFS,DTRUFV  (not implemented)

C     -----------------------
C     Ozone absorption tables
C     -----------------------
      REAL*8, PARAMETER ::        XWAVO3(226)=(/
     *            .2002,.2012,.2022,.2032,.2042,.2052,.2062,.2072,.2082,
     A.2092,.2102,.2112,.2122,.2132,.2142,.2152,.2162,.2172,.2182,.2192,
     B.2202,.2212,.2222,.2232,.2242,.2252,.2262,.2272,.2282,.2292,.2302,
     C.2312,.2322,.2332,.2342,.2352,.2362,.2372,.2382,.2392,.2400,.2402,
     D.2412,.2422,.2432,.2438,.2444,.2452,.2458,.2463,.2472,.2478,.2482,
     E.2490,.2492,.2500,.2508,.2519,.2527,.2539,.2543,.2553,.2562,.2566,
     F.2571,.2575,.2579,.2587,.2597,.2604,.2617,.2624,.2635,.2643,.2650,
     G.2654,.2662,.2669,.2675,.2682,.2692,.2695,.2702,.2712,.2718,.2722,
     H.2732,.2742,.2746,.2752,.2762,.2772,.2782,.2792,.2802,.2812,.2822,
     I.2830,.2842,.2852,.2862,.2872,.2882,.2892,.2902,.2912,.2922,.2932,
     J.2942,.2952,.2962,.2972,.2982,.2992,.2998,
     &            .3004,.3016,.3021,.3029,.3036,.3037,.3051,.3053,.3059,
     A.3061,.3066,.3075,.3077,.3083,.3085,.3092,.3098,.3100,.3104,.3106,
     B.3109,.3112,.3130,.3135,.3146,.3148,.3151,.3154,.3167,.3170,.3173,
     C.3176,.3190,.3194,.3199,.3200,.3209,.3210,.3216,.3220,.3223,.3226,
     D.3239,.3242,.3245,.3248,.3253,.3255,.3269,.3272,.3275,.3279,.3292,
     E.3295,.3299,.3303,.3309,.3312,.3328,.3332,.3334,.3338,.3357,.3365,
     F.3369,.3372,.3391,.3395,.3398,.3401,.3417,.3421,.3426,.3430,.3437,
     G.3439,.3451,.3455,.3460,.3463,.3466,.3472,.3481,.3485,.3489,.3493,
     H.3499,.3501,.3506,.3514,.3521,.3523,.3546,.3550,.3554,.3556,.3561,
     I.3567,.3572,.3573,.3588,.3594,.3599,.3600,.3604,.3606,.3639,.3647,
     J.3650,.3654,.3660/)
      REAL*8 ::  UVA(226)
      REAL*8, PARAMETER ::  FUVKO3(226)=(/
     *             8.3,  8.3,  8.1,  8.3,  8.6,  9.0,  9.7, 10.8, 11.7,
     A 13.0, 14.3, 16.0, 18.0, 20.6, 23.0, 26.1, 29.3, 32.6, 36.9, 40.8,
     B 46.9, 51.4, 56.7, 63.4, 69.1, 76.6, 84.0, 91.4, 99.9,110.0,118.0,
     C126.0,136.0,145.0,154.0,164.0,175.0,186.0,192.0,201.0,210.0,212.0,
     D221.0,230.0,239.0,248.0,250.0,259.0,264.0,264.0,273.0,277.0,275.0,
     E283.0,283.0,290.0,283.0,297.0,290.0,300.0,290.0,302.0,295.0,283.0,
     F293.0,290.0,286.0,297.0,281.0,280.0,271.0,275.0,254.0,264.0,250.0,
     G248.0,242.0,228.0,230.0,216.0,213.0,211.0,199.0,188.0,188.0,178.0,
     H169.0,153.0,155.0,148.0,136.0,127.0,117.0,108.0, 97.0, 88.7, 81.3,
     I 78.7, 67.9, 61.4, 54.3, 49.6, 43.1, 38.9, 34.6, 30.2, 27.5, 23.9,
     J 21.0, 18.6, 16.2, 14.2, 12.3, 10.7,  9.5,
     &            8.880,7.520,6.960,6.160,5.810,5.910,4.310,4.430,4.130,
     A4.310,4.020,3.330,3.390,3.060,3.100,2.830,2.400,2.490,2.330,2.320,
     B2.120,2.200,1.436,1.595,1.074,1.138,1.068,1.262,0.818,0.948,0.860,
     C1.001,0.543,0.763,0.665,0.781,0.382,0.406,0.373,0.608,0.484,0.601,
     D0.209,0.276,0.259,0.470,0.319,0.354,0.131,0.223,0.185,0.339,0.080,
     E0.093,0.079,0.184,0.139,0.214,0.053,0.074,0.068,0.152,0.038,0.070,
     F.0540000,.1030000,.0240000,.0382500,.0292500,.0550000,.0135000,
     G.0155250,.0127500,.0188250,.0167250,.0262500,.0115500,.0140250,
     H.0099750,.0115500,.0081000,.0104250,.0050100,.0057000,.0046650,
     I.0073425,.0051825,.0055275,.0040575,.0077700,.0048900,.0054600,
     J.0015375,.0017775,.0013275,.0014100,.0011550,.0023325,.0018825,
     K.0019650,.0009600,.0013650,.0011925,.0013200,.0008925,.0009825,
     L.0001350,.0006300,.0004500,.0006225,0.0/)

C     ------------------------------------------------------------------
C          NO2 Trace Gas Vertical Distribution and Concentration Profile
C     ------------------------------------------------------------------

      REAL*8, PARAMETER ::
     *     CMANO2(42)=(/            ! every 2 km starting at 0km
     1  8.66E-06,5.15E-06,2.85E-06,1.50E-06,9.89E-07,6.91E-07,7.17E-07,
     2  8.96E-07,3.67E-06,4.85E-06,5.82E-06,6.72E-06,7.77E-06,8.63E-06,
     3  8.77E-06,8.14E-06,6.91E-06,5.45E-06,4.00E-06,2.67E-06,1.60E-06,
     4  8.36E-07,3.81E-07,1.58E-07,6.35E-08,2.57E-08,1.03E-08,4.18E-09,
     5  1.66E-09,6.57E-10,2.58E-10,1.02E-10,4.11E-11,1.71E-11,7.73E-12,
     6  9.07E-12,4.63E-12,2.66E-12,1.73E-12,1.28E-12,1.02E-12,1.00E-30/)

C     ------------------------------------------------------------------
C     TRACE GAS REFERENCE AMOUNTS & DISTRIBUTIONS ARE DEFINED IN  SETGAS
C     ------------------------------------------------------------------

C-------------------------
C     Scaling/kill factors
C-------------------------

!@var FULGAS scales the various atmospheric constituents:
!@+         H2O CO2 O3 O2 NO2 N2O CH4 F11 F12 N2C CFC11 CFC12 SO2
!@+   Note: FULGAS(1) only acts in the stratosphere (unless LS1_loc=1)
      REAL*8 :: FULGAS(13) = (/    ! scales ULGAS

C      H2O CO2  O3  O2 NO2 N2O CH4 F11 F12 N2C CFC11+ CFC12+ SO2
C        1   2   3   4   5   6   7   8   9  10    11     12   13
     +   1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,   1.,    1.,  0./)
#ifdef ALTER_RADF_BY_LAT
!@var FULGAS_orig saves initial FULGAS values
      REAL*8, dimension(13) :: FULGAS_orig
#endif

!@var FGOLDH scales background aerosols for Glb Ocn Land Desert Haze
C                         GLOBAL  OCEAN   LAND  DESERT    HAZE
C     for setbak/getbak only   1      2      3       4       5
      REAL*8 :: FGOLDH(5)=(/ 1d0, .68d0, .32d0, 1.d-20, 1.d-20 /)

!@var FSxAER,FTxAER scales solar,thermal opt.depth for var. aerosols:
!@+     x =    T:total B:background A:atmClim  D:dust  V:volcanic
      REAL*8 :: FSTAER=1.,FSBAER=1.,FSAAER=1.,FSDAER=1.,FSVAER=1.
     *         ,FTTAER=1.,FTBAER=1.,FTAAER=1.,FTDAER=1.,FTVAER=1.

!@var FTAUC factor to control cloud optical depth in radiation calc.
!@+   =1 for full expression, =0 for clear sky calculation.
      REAL*8 :: FTAUC ! to be set in calling routine, thread-private ! deflt=1

!@var PIVMAX limits PI0 of volcanic aerosols
      REAL*8 :: PIVMAX=1.0
!@var ECLTRA,KCLDEM scales,enables full cloud scattering correction
      REAL*8 :: ECLTRA=1. ; INTEGER :: KCLDEM=1
!@var FCLDTR,FCLDSR scales opt.depth of clouds - not used (yet)
!@var FRAYLE        scales Rayleigh parameter
      REAL*8 ::   FCLDTR=1.,  FCLDSR=1.,  FRAYLE=1.

!@var KUVFAC,UVFACT,UVWAVL,KSNORM rescale UV spectral flux distribution
      INTEGER :: KUVFAC=0,  KSNORM=0  ! no rescaling
      REAL*8  :: UVWAVL(3)=(/0.295d0, 0.310d0, 0.366d0/)
      REAL*8  :: UVFACT(3)=(/0.98011d0, 0.99467d0, 0.99795d0/)

!@var SRCGSF Scaling Factors for Cloud Asymmetry Parameter for
!@+                            Water    Ice    MieIce
      REAL*8  ::  SRCGSF(3)=(/ 1.000,  1.000,  1.000/)

!@var TAUWC0,TAUIC0 lower limits for water/ice cloud opt.depths
      REAL*8 ::  TAUWC0=1d-3, TAUIC0=1d-3

!@var KPFCO2,KPFOZO if > 0 scale CO2,O3 to stand. vertical profile
      INTEGER :: KPFCO2=0,  KPFOZO=0

!@var KANORM,KCNORM if > 0 renormalize aerosols,cloud albedos
      INTEGER :: KANORM=0, KCNORM=0

!@var KWVCON        ON/OFF flag for water vapor continuum absorption
!@var KUFH2O,KUFCO2 H2O,CO2 column absorb.scaling
!@var KCSELF,KCFORN H2O_ContSelf-Broadening,CO2_ContForeign-Broadening
      INTEGER :: KWVCON=1, KUFH2O=1,  KUFCO2=1,  KCSELF=1,  KCFORN=1
!@var XCSELF,XCFORN scaling factors for Cont.Broadening (Deflt: Ma 2000)
      REAL*8 :: XCSELF=1. , XCFORN=1.

!@var ICE012 pick ice droplet type: 0 liquid, 1 ice non-spher, 2 ice Mie
      INTEGER :: ICE012=1

!@var VEFF0 effective volc. aerosol size distribution variance
      REAL*8  :: VEFF0=0.35d0,  REFF0=0.30d0      ! REFF0 not used

!@var NORMS0 if =1, Incident (TOA) Solar flux is normalized to equal S0
      INTEGER :: NORMS0=1

!@var KORDER,KWTRAB controls WRITER-output (Mie-scattering info)
      INTEGER :: KWTRAB=0, KORDER=0

C-----------------------------------------------------------------------
C      COMPOSITION & VERTICAL DISTRIBUTION FOR 5 SPECIFIED AEROSOL TYPES
C-----------------------------------------------------------------------
C TYPE
C    1   STRATOSPHERIC GLOBAL AEROSOL  A,B,C ARE GLOBAL AVERAGE VALUES
C    2    TROPOSPHERIC  OCEAN AEROSOL  A,B,C ARE GLOBAL AVERAGE VALUES
C    3    TROPOSPHERIC   LAND AEROSOL  A,B,C ARE GLOBAL AVERAGE VALUES
C    4    TROPOSPHERIC DESERT AEROSOL  A,B,C ARE  LOCAL AVERAGE VALUES
C    5    TROPOSPHERIC   HAZE AEROSOL  A,B,C ARE  LOCAL AVERAGE VALUES

C        1     2     3     4     5     6     7     8     9    10    11
C      ACID1 SSALT SLFT1 SLFT2 BSLT1 BSLT2 DUST1 DUST2 DUST3 CARB1 CARB2
      REAL*8, dimension(11,5) :: AGOLDH=reshape( (/
     1 .005,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,
     2   .0, .020, .010, .010, .005,   .0, .010,   .0,   .0, .005,   .0,
     3   .0,   .0,   .0, .020, .005,   .0, .010, .010,   .0,   .0, .015,
     4   .0,   .0,   .0,   .0,   .0,   .0,   .0, .020, .010,   .0,   .0,
     5   .0,   .0,   .0, .010,   .0,   .0,   .0,   .0,   .0,   .0, .005/
     *  ),(/11,5/) )
      REAL*8, dimension(11,5) :: BGOLDH=reshape( (/
     1 20.0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,
     2   .0, 1.00, 4.00, 1.00, 4.00, 1.00, 4.00,   .0,   .0, 1.00,   .0,
     3   .0,   .0,   .0, 0.00, 2.00,   .0, 4.00, 2.00,   .0,   .0, 0.00,
     4   .0,   .0,   .0,   .0,   .0,   .0,   .0, 2.00, 0.00,   .0,   .0,
     5   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0, 0.00/
     *  ),(/11,5/) )
      REAL*8, dimension(11,5) :: CGOLDH=reshape( (/
     1 3.00,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,   .0,
     2   .0, 1.00, 3.00, 2.00, 3.00, 1.00, 2.00,   .0,   .0, 1.00,   .0,
     3   .0,   .0,   .0, 1.00, 3.00,   .0, 1.00, 1.00,   .0,   .0, 1.00,
     4   .0,   .0,   .0,   .0,   .0,   .0,   .0, 1.00, 1.00,   .0,   .0,
     5   .0,   .0,   .0, 1.00,   .0,   .0,   .0,   .0,   .0,   .0, 1.00/
     *  ),(/11,5/) )

!nu   REAL*8, dimension(11) :: PI0VIS=(/
!nu         1          2          3          4          5          6
!nu       ACID1      SSALT      SLFT1      SLFT2      BSLT1      BSLT2
!nu  1   1.00000,   1.00000,   1.00000,   1.00000,   0.98929,   0.95609,
!nu
!nu         7          8          9         10         11
!nu       DUST1      DUST2      DUST3      CARB1      CARB2
!nu  2   0.91995,   0.78495,   0.63594,   0.31482,   0.47513/)

      REAL*8, dimension(8) ::
C                TROPOSPHERIC AEROSOL COMPOSITIONAL/TYPE PARAMETERS
C                  SO4    SEA    ANT    OCX    BCI    BCB    DST   VOL
     *  REFDRY=(/0.200, 1.000, 0.300, 0.300, 0.100, 0.100, 1.000,1.000/)

!nu  * ,REFWET=(/0.272, 1.808, 0.398, 0.318, 0.100, 0.100, 1.000,1.000/)

     * ,DRYM2G=(/4.667, 0.866, 4.448, 5.017, 9.000, 9.000, 1.000,1.000/)

CKoch   DRYM2G=(/5.000, 2.866, 8.000, 8.000, 9.000, 9.000, 1.000,1.000/)

!nu     RHTMAG=(/1.788, 3.310, 1.756, 1.163, 1.000, 1.000, 1.000,1.000/)
!nu alt RHTMAG=(/1.982, 3.042, 1.708, 1.033, 1.000, 1.000, 1.000,1.000/)
!old *  WETM2G=(/8.345, 2.866, 7.811, 5.836, 9.000, 9.000, 1.000,1.000/)
!nu  * ,WETM2G=(/9.250, 2.634, 7.598, 5.180, 9.000, 9.000, 1.000,1.000/)
     * ,Q55DRY=(/2.191, 2.499, 3.069, 3.010, 1.560, 1.560, 1.000,1.000/)

     * ,DENAER=(/1.760, 2.165, 1.725, 1.500, 1.300, 1.300, 2.000,2.000/)

!@dbparm ref_mult factor to control REFDRY from rundeck
      INTEGER :: ref_mult=1d0

C     TROP AEROSOL 1850 BACKGROUND, INDUSTRIAL & BIO-BURNING PARAMETERS
      REAL*8, dimension(13) :: AERMIX=(/
C      Pre-Industrial+Natural 1850 Level  Industrial Process  BioMBurn
C      ---------------------------------  ------------------  --------
C       1    2    3    4    5    6    7    8    9   10   11   12   13
C      SNP  SBP  SSP  ANP  ONP  OBP  BBP  SUI  ANI  OCI  BCI  OCB  BCB
     + 1.0, 1.0, 1.0, 1.0, 2.5, 2.5, 1.9, 1.0, 1.0, 2.5, 1.9, 2.5, 1.9/)

      REAL*8, dimension(8) ::
C                TROPOSPHERIC AEROSOL COMPOSITIONAL/TYPE PARAMETERS
C                  SO4    SEA    ANT    OCX    BCI    BCB    DST   VOL
     *  FS8OPX=(/1.000, 1.000, 1.000, 1.000, 2.000, 2.000, 1.000, 1.00/)

     * ,FT8OPX=(/1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.300, 1.00/)

     * ,FRSULF=(/0.000, 0.000, 0.000, 0.330, 0.000, 0.000, 0.000, 1.00/)

     * ,PI0MAX=(/1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.00/)

!nu  * ,A8VEFF=(/ .200,  .200,  .200,  .200,  .200,  .200,  .200, .200/)

#ifdef ALTER_RADF_BY_LAT
!@var FS8OPX_orig saves initial FS8OPX values
!@var FT8OPX_orig saves initial FT8OPX values
      REAL*8, dimension(8) :: FS8OPX_orig, FT8OPX_orig
#endif

      REAL*8, dimension(8) ::
C                          MINERAL DUST PARAMETERS
C                         CLAY                  SILT
#ifndef USE_RADIATION_E1
     *REDUST=(/0.132D0,0.23D0,0.416D0,0.766D0,1.386D0,2.773D0,5.545D0,
     &                                        8D0/) ! <- not used; 3 silt only
#else
     *REDUST=(/ 0.1, 0.2, 0.4, 0.8,   1.0, 2.0, 4.0, 8.0/)
#endif
!nu  *  ,VEDUST=(/ 0.2, 0.2, 0.2, 0.2,   0.2, 0.2, 0.2, 0.2/)
     *  ,RODUST=(/2.5D0,2.5D0,2.5D0,2.5D0,2.65D0,2.65D0,2.65D0,
     &                                        2.65D0/)! <- not used; 3 silt only
!nu  *  ,FSDUST=(/ 1.0, 1.0, 1.0, 1.0,   1.0, 1.0, 1.0, 1.0/)
!nu  *  ,FTDUST=(/ 1.0, 1.0, 1.0, 1.0,   1.0, 1.0, 1.0, 1.0/)

C-----------------------------------------------------------------------
C     GHG 1980 Reference Concentrations and Vertical Profile Definitions
C-----------------------------------------------------------------------

!@var KTREND if > 0 table GHG concentrations (Trend G) are used for
!@+             yr/day KYEARG/KJDAYG; if KTREND=0, GHG are set to PPMVK0
      INTEGER :: KTREND=1

!@var PPMV80  reference GHG concentrations (ppm)
      REAL*8, dimension(13) ::
C     GAS NUMBER    1         2    3      4    5         6           7
C                 H2O       CO2   O3     O2  NO2       N2O         CH4
     *   PPMV80=(/0d0, 337.90d0, 0d0,  21d4, 0d0,  .3012d0,   1.5470d0
     *     ,.1666d-03,.3003d-03, 0d0,   .978D-04,  .0010D-10,  .0420d0/)
C              CCL3F1    CCL2F2   N2     CFC-Y       CFC-Z         SO2
C     GAS NUMBER    8         9   10        11          12          13

!@var PPMVK0  user set  GHG concentrations (ppm), used if KTREND=0
      REAL*8, dimension(12) ::
C     GAS  NUMBER   1         2    3      4    5         6           7
C                 H2O       CO2   O3     O2  NO2       N2O         CH4
     *   PPMVK0=(/0d0, 337.90d0, 0d0, 21.d4, 0d0,  .3012d0,   1.5470d0
     *               ,.1666d-03,  .3003d-03, 0d0, .978D-04, 0.0010D-10/)
C                        CCL3F1      CCL2F2   N2     CFC-Y       CFC-Z
C     GAS  NUMBER             8           9   10        11          12

C     Makiko's GHG Trend Compilation  GHG.1850-2050.Dec1999 in GTREND
C     ---------------------------------------------------------------
!@var nghg nr. of well-mixed GHgases: CO2 N2O CH4 CFC-11 CFC-12 others
!@var nyrsghg max.number of years of prescr. greenhouse gas history
      INTEGER, PARAMETER :: nghg=6, nyrsghg=2050-1850+1

!@var ghgyr1,ghgyr2 first and last year of GHG history
      INTEGER ghgyr1,ghgyr2
!@var ghgam,xref,xnow     GHG-mixing ratios in ppm,ppm,ppm,ppb,ppb,ppb
      REAL*8 GHGAM(nghg,nyrsghg),XREF(nghg+1),XNOW(nghg+1)
      common/ghgcom/ghgyr1,ghgyr2,ghgam,xref,xnow

C     GTREND:  1980.,  337.9,  .3012,  1.547,  .1666,  .3003,  .0978,
C     ---------------------------------------------------------------

!@var KGGVDF,KPGRAD,KLATZ0 control parameters for vertical GHG profiles
!@+   -----------------------------------------------------------------
!@+   Minschwaner et al JGR (1998) CH4, N2O, CFC-12 Vertical profiles
!@+   IF(KGGVDF > 0) Then:
!@+      Gas decreases are linear with pressure, from unity at ground to
!@+      the fractional value PPMVDF(NGAS) at the top of the atmosphere.
!@+   Exponential decrease by EXP(-(Z-Z0)/H) is superimposed on this.
!@+   IF(KLATZ0 > 0) Then: Z0 depends on latitude, KGGVDF not used
!@+   KPGRAD>0: Pole-to-Pole lat. gradient (PPGRAD) is also superimposed
!@+   ------------------------------------------------------------------
!@var Z0,ZH   scale heights used for vertical profile (km)
!@var PPMVDF  frac. value at top of atmosphere (used if KGGVDF > 0)
!@var PPGRAD  Pole-to-Pole latitud.gradient for GHG (used if KPGRAD > 0)
      INTEGER :: KGGVDF=0, KPGRAD=1, KLATZ0=1

      REAL*8, dimension(12) ::
C     NUMBER   1    2    3    4  5    6    7    8     9   10   11  12
C             H2O  CO2  O3   O2 NO2  N2O  CH4 CFC11 CFC12 N2 CF-Y  CF-Z
     *   Z0=(/0.0, 0.0,0.0, 0.0,0.0, 16., 16., 16., 16., 0.0, 16., 16./)
     *  ,ZH=(/8.0, 8.0,8.0, 8.0,8.0, 30., 50., 30., 30., 0.0, 30., 30./)

C     GAS NUMBER    1     2    3    4    5         6         7
C                 H2O   CO2   O3   O2  NO2       N2O       CH4
     *  ,PPMVDF=(/1.0,  1.0, 1.0, 1.0, 1.0,  0.88888,  0.88888,
     *              0.88888,  0.88888, 1.0,  0.88888,  0.88888/)
C                    CCL3F1    CCL2F2   N2     CFC-Y     CFC-Z
C     GAS NUMBER          8         9   10        11        12

C     GAS  NUMBER   1     2    3    4    5         6         7
C                 H2O   CO2   O3   O2  NO2       N2O       CH4
     *  ,PPGRAD=(/0.0,  0.0, 0.0, 0.0, 0.0,   0.0100,   0.0900,
     *               0.0600,   0.0600, 0.0,   0.0600,   0.0600/)
C                    CCL3F1    CCL2F2   N2     CFC-Y     CFC-Z
C     GAS  NUMBER         8         9   10        11        12

C---------------------
C     Optional Tracers    used via setbak/getbak
C---------------------
      INTEGER, dimension(ITRMAX) :: ITR=1
      INTEGER :: NTRACE=0

      REAL*8, dimension(ITRMAX) ::
C                TRACER AEROSOL COMPOSITIONAL/TYPE PARAMETERS
     *  TRRDRY= .1d0
!nu  * ,TRVEFF= .2d0
     * ,TRADEN= 1.d0
!loc * ,FSTOPX= 1.d0
!loc * ,FTTOPX= 1.d0

      SAVE

      CONTAINS


      SUBROUTINE RCOMP1(NRFUN) 1,23
      use DOMAIN_DECOMP, only: AM_I_ROOT
      IMPLICIT NONE
C     ------------------------------------------------------------------
C     Solar,GHG Trend, VolcAer Size Selection Parameters:    Defaults
C                                           Process       KYEARX  KJDAYX
c                                         SolarCon, UV       0       0
c                                         GH Gas Trend       0       0
c                                                         REFF0= 0.3
c                                                         VEFF0= 0.35
C     ------------------------------------------------------------------

c     NRFUN is now set as an argument from calling routine so that unit
c     numbers can be set automatically
      INTEGER :: NRFUN(14)
C          radfile1   2   3   4   5   6   7   8   9   A   B   C   D   E
!?    DATA NRFN0/71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84/

      INTEGER, SAVE :: IFIRST=1 ! ,NRFN0
      CHARACTER*80 EPSTAG,TITLE

      REAL*4 OZONLJ(44,46),R72X46(72,46),VTAUR4(1800,24)
      REAL*8 :: EJMLAT(47),E20LAT(20)
#ifdef USE_RADIATION_E1
      REAL*8 :: filler(784)
#endif
      INTEGER :: I,J,K,L,M,N,N1,N2,NRFU,KK,NN,IYEAR,IMONTH,JJDAYS,JYEARS
     *     ,JJDAYG,JYEARG,yr2S0i
      REAL*8 :: WAVNA,WAVNB,PFWI,TKOFPF,SUMV,EPK,EPL,DEP,SFNORM,D,O,Q,S
     *     ,OCM,WCM
!@var GTAU,TGDATA temporary array to read data and pass it to RAD_UTILS
      REAL*8 :: GTAU(51,11,143),TGDATA(122,13)

!?    IF(LASTVC > 0) NRFUN=NRFN0
      IF(IFIRST < 1) GO TO 9999

C     ------------------------------------------------------------------
C     Input data are read as specified in the first CALL RCOMP1 (NRFUN).
C     Subsequent calls to RCOMP1 can be used to re-initialize parameters
C     in SETXXX subroutines to different values, but no new data is read
C     ------------------------------------------------------------------

C     ------------------------------------------------------------------
C     MADVEL  Model Add-on Data of Extended Climatology Enable Parameter
C             Each MADVEL digit is ON/OFF switch for corresponding input
C             e.g. MADVEL=123456   (zero digit skips input process)
C
C     MADO3M   =  1   Reads  Decadal Ozone files and Ozone trend file
C     MADAER   =  2   Reads  Aerosol 50y tropospheric climatology RFILE5
C     MADDST   =  3   Reads  Dust-windblown mineral climatology   RFILE6
C     MADVOL   =  4   Reads  Volcanic 1950-00 aerosol climatology RFILE7
C     MADEPS   =  5   Reads  Epsilon cloud heterogeneity data     RFILE8
C     MADLUV   =  6   Reads  Lean's SolarUV 1882-1998 variability RFILE9
C
C                 Related Model Add-on Data Parameters set in RADPAR
C
C     MADGHG   =  1  Default Enables UPDGHG update. (MADGHG=0),no update
C     MADSUR   =  1   Reads  V72X46N.1.cor Vegetation type data   RFILEC
C                            Z72X46N Ocean fraction, topography   RFILED
C     ------------------------------------------------------------------


C              Initialize variables that might not otherwise get defined
C              ---------------------------------------------------------

       TAUWC(:) = 0  ;   TAUIC(:) = 0
      SIZEWC(:) = 0  ;  SIZEIC(:) = 0
      CLDEPS(:) = 0
      FPXCO2(:) = 1  ;  FPXOZO(:) = 1
       TLB(:) = 250  ;   TLT(:) = 250  ;   TLM(:) = 250
       SHL(:) =   0  ;   RHL(:) =   0
      SRAEXT(:,:) = 0  ;  SRASCT(:,:) = 0  ;  SRAGCB(:,:) = 0
      SRBEXT(:,:) = 0  ;  SRBSCT(:,:) = 0  ;  SRBGCB(:,:) = 0
      SRDEXT(:,:) = 0  ;  SRDSCT(:,:) = 0  ;  SRDGCB(:,:) = 0
      SRVEXT(:,:) = 0  ;  SRVSCT(:,:) = 0  ;  SRVGCB(:,:) = 0
      SRCEXT(:,:) = 0  ;  SRCSCT(:,:) = 0  ;  SRCGCB(:,:) = 0
      SRCPI0(:,:) = 0  ;  DBLPI0(:,:) = 0
      DBLEXT(:,:) = 0  ;  DBLSCT(:,:) = 0  ;  DBLGCB(:,:) = 0
      TRAALK(:,:) = 0  ;  TRBALK(:,:) = 0  ;  TRDALK(:,:) = 0
      TRVALK(:,:) = 0  ;  TRCALK(:,:) = 0  ;  TRGXLK(:,:) = 0
       U0GAS(:,:) = 0  ;   ULGAS(:,:) = 0
      TRACER(:,:) = 0

      IF(LASTVC > 0) CALL SETATM
      IF(NL+1 > LX)   call stop_model('rcomp1: increase LX',255)

C**** Use (global mean) pressures to get standard mid-latitude summer
C**** values for height, density, temperature, ozone, water vapor
      DO 120 L=1,NL+1
      PLB0(L)=PLB(L)
      CALL PHATMO(PLB0(L),HLB0(L),D,TLB(L),O,Q,S,OCM,WCM,1,2)
  120 CONTINUE
      DO 121 L=1,NL
      TLT(L)=TLB(L+1)
      TLM(L)=0.5D0*(TLB(L)+TLT(L))
  121 CONTINUE

!sl   De-activate surface layer computations
!sl   TAUSL(:)=0.0
!sl   FTAUSL(:)=0.0

C-----------------------------------------------------------------------
CR(1) Reads GTAU Asymmetry Parameter Conversion Table used within SGPGXG
C
C       (SGPGXG does Multiple Scattering Parameterization used in SOLAR)
C       ----------------------------------------------------------------

      NRFU=NRFUN(1)
      READ (NRFU) GTAU,TGDATA
      CALL SETGTS(TGDATA)
      CALL SET_SGPGXG(GTAU)


C-----------------------------------------------------------------------
CR(2)    Reads in Merged k-Distribution Tau Tables for Thermal Radiation
C        CFCs, H2O Continuum Tau Table, Merged k-Distr Planck Flux Table
C
C        (Reads: TAUCD0,TAUTBL,TAUWV0,PLANCK,XKCFC,H2OCN8,H2OCF8
c                DUCH4,SDUCH4,DUN2O,SDUN2O,ULOX,DUX      used in TAUGAS)
C       ----------------------------------------------------------------

      NRFU=NRFUN(2)
#ifdef USE_RADIATION_E1
      READ(NRFU) TAUTBL,filler,TAUWV0,filler, PLANCK, XKCFC,
     *            H2OCN8,H2OCF8, XUN2O,XUN2O0, XUCH4,XUCH40,
     *            XTRUP,XTU0,XTRDN,XTD0, CXUCO2,CXUO3, ULOX,DUX
      READ(NRFU) DXTRUA,DXTRDA,SAX
#else
      READ(NRFU) title,TAUTBL
      READ(NRFU) title,TAUWV0
      READ(NRFU) title,TAUCD0
      READ(NRFU) title,PLANCK
      READ(NRFU) title,XKCFC
      READ(NRFU) title,ULOX,DUX

      NRFU=NRFUN(4)
      READ(NRFU) title,XTRUP,XTRDN,XTU0,XTD0
      READ(NRFU) title,XTFAC
      READ(NRFU) title,DXUP2,DXDN2    ! CO2
      READ(NRFU) title,DXUP3,DXDN3    ! O3
      READ(NRFU) title,DXUP6,DXDN6    ! N2O
      READ(NRFU) title,DXUP7,DXDN7    ! CH4
      READ(NRFU) title,DXUP8,DXDN8    ! CFC11
      READ(NRFU) title,DXUP9,DXDN9    ! CFC12
      READ(NRFU) title,DXUP13,DXDN13  ! SO2

C**** H2O Continuum Tau Tables (Ma_2000 or Ma_2004,Roberts,MT_CKD)
      NRFU=NRFUN(5)
      READ(NRFU) title,H2OCN8,XCSELF
      if(Am_I_Root()) write(6,*) title,' scaling factor:',XCSELF
      READ(NRFU) title,H2OCF8,XCFORN
      if(Am_I_Root()) write(6,*) title,' scaling factor:',XCFORN
#endif

C        Define Window Flux to Brightness Temperature Conversion Factors
C        ---------------------------------------------------------------

      do i=1,100 ; TKPFW(i    ) = TKofPF(85d1,9d2,    .001d0*I) ; end do
      do i=1, 90 ; TKPFW(i+100) = TKofPF(85d1,9d2,.1d0+.01d0*I) ; end do
      do i=1,440 ; TKPFW(i+190) = TKofPF(85d1,9d2,1.d0+ .1d0*I) ; end do
      do i=1,900 ; TKPFT(i    ) = TKofPF( 0d0,1d4,     dble(I)) ; end do

C                            PLANCK Table interpolation limit parameters
C                            -------------------------------------------
C-----------------------------------------------------------------------
CR(3)        Read Mie Scattering Parameters [Qext, Qscat, AsymParameter]
C            (1) Tropospheric Aerosols [11 Background, 8 Trop8 Aerosols]
C            (2) Clouds [5 Water, 5 non-spherical Ice, 5 Mie Ice Clouds]
C            (3) Desert Dust Aerosols  [25 particle sizes - to select 8]
C            (4) Volcanic Aerosols [20 particle sizes, 5 size variances]
C            (5) Sulfate  Aerosols [22 particle sizes, 0.1 - 10. micron]
C            (6) Soot   Aerosols [25 particle sizes, 0.001 - 5.0 micron]
C            -----------------------------------------------------------

      NRFU=NRFUN(3)

C                               GCM 11 background aerosol Mie parameters
C                               ----------------------------------------
      DO 301 N=1,11
      READ (NRFU,3000) TITLE
 3000 FORMAT(A80)
      READ (NRFU,3001) (SRAQEX(K,N),K=1,6)
 3001 FORMAT( 18X,6(F7.5,1X))
      READ (NRFU,3001) (SRAQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRAQCB(K,N),K=1,6)
  301 CONTINUE
      READ (NRFU,3002) (Q55A11(N),N=1,11)
 3002 FORMAT( 18X,6(F7.5,1X)/18X,6(F7.5,1X))
      READ (NRFU,3003) (REFA11(N),N=1,11)
 3003 FORMAT( 18X,6(F7.3,1X)/18X,5(F7.3,1X))
      READ (NRFU,3003) (VEFA11(N),N=1,11)
      DO 302 N=1,11
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRAQEX(K,N),K=1,33)
 3004 FORMAT( 14X,7(F7.5,1X),4(/14X,7(F7.5,1X)))
 3005 FORMAT(/14X,7(F7.5,1X),4(/14X,7(F7.5,1X)))
      READ (NRFU,3005) (TRAQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRAQCB(K,N),K=1,33)
  302 CONTINUE

C                       GCM 9 (of 10) climatology aerosol Mie parameters
C                       ------------------------------------------------
      DO 303 N=1,10
      IF(N==6) GO TO 303
      READ (NRFU,3000) TITLE
      READ (NRFU,3001) (SRBQEX(K,N),K=1,6)
      READ (NRFU,3001) (SRBQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRBQCB(K,N),K=1,6)
  303 CONTINUE
      READ (NRFU,3002) (Q55B10(N),N=1,5),(Q55B10(N),N=7,10)
      READ (NRFU,3003) (REFB10(N),N=1,5),(REFB10(N),N=7,10)
      READ (NRFU,3003) (VEFB10(N),N=1,5),(VEFB10(N),N=7,10)
      DO 304 N=1,10
      IF(N==6) GO TO 304
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRBQEX(K,N),K=1,33)
      READ (NRFU,3005) (TRBQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRBQCB(K,N),K=1,33)
  304 CONTINUE


C                               Cloud Water, Ice-non, Ice-Mie parameters
C                               ----------------------------------------
      DO 305 N=1,15
      READ (NRFU,3000) TITLE
      READ (NRFU,3001) (SRCQEX(K,N),K=1,6)
      READ (NRFU,3001) (SRCQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRCQCB(K,N),K=1,6)
  305 CONTINUE
      READ (NRFU,3006) (Q55C15(N),N=1,15)
 3006 FORMAT( 18X,6(F7.5,1X)/18X,6(F7.5,1X)/18X,6(F7.5,1X))
      READ (NRFU,3007) (REFC15(N),N=1,15)
 3007 FORMAT( 18X,6(F7.3,1X)/18X,6(F7.3,1X)/18X,6(F7.3,1X))
      READ (NRFU,3007) (VEFC15(N),N=1,15)
      DO 306 N=1,15
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRCQEX(K,N),K=1,33)
      READ (NRFU,3005) (TRCQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRCQCB(K,N),K=1,33)
      READ (NRFU,3005) (TRCQAL(K,N),K=1,33)
  306 CONTINUE

C                               Desert Dust 25 sizes, Mie parameter data
C                               ----------------------------------------
      DO 307 N=1,25
      READ (NRFU,3001) (SRDQEX(K,N),K=1,6)
      READ (NRFU,3001) (SRDQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRDQCB(K,N),K=1,6)
  307 CONTINUE
      READ (NRFU,3008) (Q55D25(N),N=1,25)
 3008 FORMAT( 18X,5(F7.5,1X),4(/18X,5(F7.5,1X)))
      READ (NRFU,3009) (REFD25(N),N=1,25)
 3009 FORMAT( 18X,12(F3.1,1X)/18X,12(F3.1,1X)/18X,F3.0)
      READ (NRFU,3010) (VEFD25(N),N=1,25)
 3010 FORMAT( 18X,12(F3.1,1X)/18X,12(F3.1,1X)/18X,F3.1)
      DO 308 N=1,25
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRDQEX(K,N),K=1,33)
      READ (NRFU,3005) (TRDQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRDQCB(K,N),K=1,33)
      READ (NRFU,3005) (TRDQAL(K,N),K=1,33)
  308 CONTINUE

      TRDQAB(:,:)=TRDQEX(:,:)-TRDQSC(:,:)  !  used in writer only

C                               Volcanic aerosol Mie size, variance data
C                               ----------------------------------------
      DO 313 M=1,5
      IF(M==4) GO TO 313
      DO 311 N=1,20
      READ (NRFU,3001) (SRVQEX(K,N,M),K=1,6)
      READ (NRFU,3001) (SRVQSC(K,N,M),K=1,6)
      READ (NRFU,3001) (SRVQCB(K,N,M),K=1,6)
  311 CONTINUE
      READ (NRFU,3011) (Q55V20(N,M),N=1,20)
 3011 FORMAT( 18X,5(F7.5,1X),3(/18X,5(F7.5,1X)))
      READ (NRFU,3012) (REFV20(N,M),N=1,20)
 3012 FORMAT( 18X,12(F3.1,1X)/18X,8(F3.1,1X))
      READ (NRFU,3012) (VEFV20(N,M),N=1,20)
      DO 312 N=1,20
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRVQEX(K,N,M),K=1,33)
      READ (NRFU,3005) (TRVQSC(K,N,M),K=1,33)
      READ (NRFU,3005) (TRVQCB(K,N,M),K=1,33)
      READ (NRFU,3005) (TRVQAL(K,N,M),K=1,33)
  312 CONTINUE
  313 CONTINUE
      DO 316 N=1,20
      DO 314 K=1,6
      SRVQEX(K,N,4)=(SRVQEX(K,N,3)+SRVQEX(K,N,5))/2.D0
      SRVQSC(K,N,4)=(SRVQSC(K,N,3)+SRVQSC(K,N,5))/2.D0
      SRVQCB(K,N,4)=(SRVQCB(K,N,3)+SRVQCB(K,N,5))/2.D0
  314 CONTINUE
      Q55V20(N,4)=(Q55V20(N,3)+Q55V20(N,5))/2.D0
      REFV20(N,4)=(REFV20(N,3)+REFV20(N,5))/2.D0
      VEFV20(N,4)=(VEFV20(N,3)+VEFV20(N,5))/2.D0
      DO 315 K=1,33
      TRVQEX(K,N,4)=(TRVQEX(K,N,3)+TRVQEX(K,N,5))/2.D0
      TRVQSC(K,N,4)=(TRVQSC(K,N,3)+TRVQSC(K,N,5))/2.D0
      TRVQCB(K,N,4)=(TRVQCB(K,N,3)+TRVQCB(K,N,5))/2.D0
      TRVQAL(K,N,4)=(TRVQAL(K,N,3)+TRVQAL(K,N,5))/2.D0
  315 CONTINUE
  316 CONTINUE

C                            Sulfate aerosol, Mie parameter 22-size data
C                            -------------------------------------------
      DO 321 N=1,22
      READ (NRFU,3000) TITLE
      READ (NRFU,3001) (SRUQEX(K,N),K=1,6)
      READ (NRFU,3001) (SRUQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRUQCB(K,N),K=1,6)
  321 CONTINUE
      READ (NRFU,3008) (Q55U22(N),N=1,22)
      READ (NRFU,3013) (REFU22(N),N=1,22)
 3013 FORMAT( 18X,5(F7.3,1X),4(/18X,5(F7.3,1X)))
      READ (NRFU,3013) (VEFU22(N),N=1,22)
      DO 322 N=1,22
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRUQEX(K,N),K=1,33)
      READ (NRFU,3005) (TRUQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRUQCB(K,N),K=1,33)
      READ (NRFU,3005) (TRUQAL(K,N),K=1,33)
  322 CONTINUE

C                               Soot aerosol, Mie parameter 25-size data
C                               ----------------------------------------
      DO 323 N=1,25
      READ (NRFU,3000) TITLE
      READ (NRFU,3001) (SRSQEX(K,N),K=1,6)
      READ (NRFU,3001) (SRSQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRSQCB(K,N),K=1,6)
  323 CONTINUE
      READ (NRFU,3008) (Q55S25(N),N=1,25)
      READ (NRFU,3013) (REFS25(N),N=1,25)
      READ (NRFU,3013) (VEFS25(N),N=1,25)
      DO 324 N=1,25
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRSQEX(K,N),K=1,33)
      READ (NRFU,3005) (TRSQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRSQCB(K,N),K=1,33)
      READ (NRFU,3005) (TRSQAL(K,N),K=1,33)
  324 CONTINUE

C                            Seasalt aerosol, Mie parameter 22-size data
C                            Nitrate aerosol, Mie parameter 22-size data
C                            (Water) aerosol, Mie parameter 22-size data
C                            Organic aerosol, Mie parameter 22-size data
C                            -------------------------------------------
      N1=23
      DO 326 KK=1,4
      N2=N1+21
      DO 325 N=N1,N2
      READ (NRFU,3000) TITLE
      READ (NRFU,3001) (SRUQEX(K,N),K=1,6)
      READ (NRFU,3001) (SRUQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRUQCB(K,N),K=1,6)
  325 CONTINUE
      READ (NRFU,3008) (Q55U22(N),N=N1,N2)
      READ (NRFU,3013) (REFU22(N),N=N1,N2)
      READ (NRFU,3013) (VEFU22(N),N=N1,N2)
      N1=N2+1
  326 CONTINUE
      N1=23
      DO 328 KK=1,4
      N2=N1+21
      DO 327 N=N1,N2
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRUQEX(K,N),K=1,33)
      READ (NRFU,3005) (TRUQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRUQCB(K,N),K=1,33)
      READ (NRFU,3005) (TRUQAL(K,N),K=1,33)
  327 CONTINUE
      N1=N2+1
  328 CONTINUE

C                        Sinyuk Desert Dust 25 sizes, Mie parameter data
C                        -----------------------------------------------

      DO 347 N=1,25
      READ (NRFU,3001) (SRDQEX(K,N),K=1,6)
      READ (NRFU,3001) (SRDQSC(K,N),K=1,6)
      READ (NRFU,3001) (SRDQCB(K,N),K=1,6)
  347 CONTINUE
      READ (NRFU,3008) (Q55D25(N),N=1,25)
      READ (NRFU,3009) (REFD25(N),N=1,25)
      READ (NRFU,3010) (VEFD25(N),N=1,25)
      DO 348 N=1,25
      READ (NRFU,3000) TITLE
      READ (NRFU,3004) (TRDQEX(K,N),K=1,33)
      READ (NRFU,3005) (TRDQSC(K,N),K=1,33)
      READ (NRFU,3005) (TRDQCB(K,N),K=1,33)
      READ (NRFU,3005) (TRDQAL(K,N),K=1,33)
  348 CONTINUE

      TRDQAB(:,:)=TRDQEX(:,:)-TRDQSC(:,:)  !  used in writer only

C-----------------------------------------------------------------------
CR(6) DUST:   Monthly-Mean Desert Dust (Clay,Silt) 8-Size Optical Depths
C                  Map: IJ=72x46,  Lay: L=1-9, Siz: S=1-8, Month: M=1-12
C                  -----------------------------------------------------

      IF(MADDST < 1) GO TO 699
      NRFU=NRFUN(6)
      READ (NRFU) TDUST

  699 CONTINUE

C-----------------------------------------------------------------------
CR(7)        Read Makiko's Stratospheric binary data made in April, 2002
C                               (1800 months (1850-1999) x 24 latitudes)
C              If KyearV<0 use the 1800-month mean as background aerosol
C              ---------------------------------------------------------
      IF(MADVOL < 1) GO TO 799
      NRFU=NRFUN(7)
      READ (NRFU) TITLE
      IF(TITLE(1:13)=='Optical Depth')
     &     call stop_model('rcomp1: use new RADN7',255)
      REWIND (NRFU)
      DO K=1,5
        READ (NRFU) TITLE,VTAUR4
        DO J=1,24
          SUMV=0.
        DO I=1,1800
          V4TAUR(I,J,K)=VTAUR4(I,J)
          SUMV=SUMV+VTAUR4(I,J)
        END DO
          if(kyearv < 0) V4TAUR(1,J,K)=SUMV/1800
        END DO
      END DO

  799 CONTINUE

C-----------------------------------------------------------------------
CR(8)  ISCCP Derived Cloud Variance (EPSILON) Cloud Optical Depth Factor
C      Low, Mid, High  Cloud Optical Depths are Reduced by (1 - EPSILON)
C
C               INPUT DATA FILE:  UNIT = INFILE
C                                 TAG  = EPSTAG  (CHARACTER*80)
C                                 DATA = EPLMHC  (72,46,12,4) REAL*4
C
C      Data are 72X46 Monthly Mean Low, Mid, High, Column EPSILON Values
C      Cloud Heterogeneity selections used in UPDEPS, GETEPS (in SETCLD)
C
C             EPSCON  Column Cloud Inhomogeneity EPSILON (when KCLDEP=1)
C             KCLDEP  Selects Cloud Inhomogeneity Option (0-4):
C                     KCLDEP =  0  Sets Column CLDEPS to Zero
C                     KCLDEP =  1  Sets Column CLDEPS to EPSCON
C                     KCLDEP =  2  Keeps whatever is specified in CLDEPS
C                     KCLDEP =  3  Uses: Column EPCOL(72,46) Climatology
C                     KCLDEP =  4  Uses: Ht Dep EPLOW, EPMID, EPHIG Data
C               --------------------------------------------------------

      IF(MADEPS < 1) GO TO 899
      NRFU=NRFUN(8)
      READ (NRFU) EPSTAG,EPLMHC


      DO 810 N=1,4
      DO 810 M=1,12
      DO 810 I=1,72
!**** extend northern-most non-neg.value to N.Pole
      J=46 ! MLAT46
      do while (EPLMHC(I,J,M,N) < 0) ; J=J-1 ; end do
      IF(J < 46) EPLMHC(I,J+1:46,M,N) = EPLMHC(I,J,M,N)
!**** extend southern-most non-neg.value to S.Pole
      J=1
      do while (EPLMHC(I,J,M,N) < 0) ; J=J+1 ; end do
      IF (J > 1) EPLMHC(I,1:J-1,M,N) = EPLMHC(I,J,M,N)
      IF (J==46) GO TO 810
!**** linearly interpolate across remaining intervals with EP<0
  805 J=J+1                                    ! find start of interval:
      do while (EPLMHC(I,J,M,N) >= 0)
        J=J+1 ; IF (J > 46) GO TO 810
      end do
      K=J-1
      EPK=EPLMHC(I,K,M,N)
      J=J+1                                    ! find  end  of interval:
      do while (EPLMHC(I,J,M,N) < 0) ; J=J+1 ; end do
      L=J
      EPL=EPLMHC(I,L,M,N)            ! EPk>=0, EPk+1,...,EPl-1<0, EPl>=0
      DEP=(EPL-EPK)/(L-K)
      do NN=1,L-1-K                  ! replace EP(k+1)...EP(l-1)
        EPLMHC(I,K+NN,M,N)=EPK+NN*DEP
      end do
      IF (J < 46) GO TO 805
  810 CONTINUE

  899 CONTINUE


C-----------------------------------------------------------------------
CR(E)
C             KCLDEM  Selects: Top-Cloud (Thermal) Scattering Correction
C                     KCLDEM =  0  Utilizes Non-scattering approximation
C                     KCLDEM =  1  Modifies emission and transmission by
C                                  top cloud (over-rides old correction)
C             ----------------------------------------------------------

      NRFU=NRFUN(14)
      READ (NRFU) RIJTPG,FDXTPG,FEMTPG


C-----------------------------------------------------------------------
CR(9)         Read Judith Lean's Solar UV and Solar Constant Variability
C                                      Monthly-Mean Solar UV (1882-1998)
C                                      ---------------------------------

      IF(KSOLAR < 0) GO TO 949
      IF(MADLUV < 1) THEN
        WSLEAN(:)=WSLEAN(:)/1000.D0
        DSLEAN(:)=DSLEAN(:)/1000.D0
        W1LEAN(:)=WSLEAN(:)-0.5D0*DSLEAN(:)
        GO TO 949
      END IF
      NRFU=NRFUN(9)

      IF(KSOLAR.ne.9) THEN
        READ(NRFU,'(a80)') TITLE
        if(ksolar >= 2 .and. TITLE(1:3).ne.'ANN')
     &    call stop_model('rcomp1: change RADN9 to ann.file',255)
        if(ksolar < 2 .and. TITLE(1:3)=='ANN')
     &    call stop_model('rcomp1: change RADN9 to monthly file',255)
        READ(NRFU,'(5F14.2)') WSLEAN   !  1:190
        READ(NRFU,'(a80)') TITLE
        READ(NRFU,'(5E14.3)') DSLEAN   !  1:190

        WSLEAN(:)=WSLEAN(:)/1000.D0
        DSLEAN(:)=DSLEAN(:)/1000.D0
        W1LEAN(:)=WSLEAN(:)-0.5D0*DSLEAN(:)

        READ(NRFU,'(a80)') TITLE
        READ(NRFU,'(a80)') TITLE
      END IF
      IF(KSOLAR < 2) THEN
C****   Read in monthly-mean data
        DO I=1,Ms0X
          READ(NRFU,'(2I6,3F17.6)') IYEAR,IMONTH,TSI1(I),TSI2(I)
          READ(NRFU,'(5E14.6)')     FSLEAN    ! 1:190
          SFNORM = TSI1(I) / SUM(FSLEAN(:)*DSLEAN(:))
          UVLEAN(I,:)=FSLEAN(:)*SFNORM
        END DO
      ELSE
C****   Read in annual-mean data
        DO I=1,Ms0X
          IF(KSOLAR.ne.9) THEN
            READ(NRFU,'(F12.1,2F15.4)',end=908) yr2S0,TSI1(I),TSI2(I)
          ELSE
            READ(NRFU,'(I6,2F17.6)',end=908) yr2S0i,TSI1(I),TSI2(I)
            yr2S0=real(yr2S0i)+0.5
          END IF
          if(I==1) yr1S0 = yr2S0
          IF(KSOLAR.ne.9) THEN
            READ(NRFU,'(5E14.6)')   FSLEAN    ! 1:190
            SFNORM=TSI1(I) / SUM(FSLEAN(:)*DSLEAN(:))
            UVLEAN(I,:)=FSLEAN(:)*SFNORM
          ELSE ! ksolar=9
            READ(NRFU,'(5E14.6)')               (UVLEAN(I,K),K=1,190)
          ENDIF
        END DO
  908   if(Am_I_Root()) write(6,*) 'read S0-history: ',yr1S0,' - ',yr2S0
      END IF

  949 CONTINUE

C-----------------------------------------------------------------------
CR(C)     Read:    Elaine Mathews 10 Fractional Vegetation Distributions
C         10 global maps (72x46) depict fractional vegetation/soil types
C         Map-1 (bright sand) + Map-10 (black dirt) define desert albedo
C         (sum of Maps 1-10 over land-area (ILON,JLAT) grid boxes = 1.0)
C
C         Map-11 refers to plankton concentrations over ocean areas that
C         are yet to be implemented.
C         --------------------------------------------------------------





C-----------------------------------------------------------------------
CR(D)      Read:   1   FOCEAN   72x46 ocean fraction   (FOCEAN = 0 or 1)
C                  2   FLAKE    72x46 lake  fraction
C                  3   FGRND    72x46 lake  fraction
C                  4   FGICE    72x46 glacial ice fraction
C                               (FLAKE + FGRND + FGICE + FOCEAN = 1.000)
C


C                  5   ZATMO    72x46 topography (ocean = 0.0)
C                  6   HOCEAN   72x46 ocean depth
C                  7   HLAKE    72x46 lake  depth
C                  8   HGICE    72x46 glice depth
C                  9   ZSOLID   72x46 topography of solid ground surface
C                  -----------------------------------------------------
C
C     FOLGIZ is for off-line use only, and is not used in GCM radiation.
C     GCM supplies dynamically changing POCEAN,POICE,PEARTH,PLICE values
C     ------------------------------------------------------------------



  999 CONTINUE

      IFIRST=0
 9999 CONTINUE


C     ---------------------------------------------------------------
C     LASTVC     Initialize:  Default Atmospheric Layering, Structure
C                (for Off-Line use)  as Specified by LASTVC Parameter
C                If LASTVC < 0, GCM defines all Radiation Model Input
C     otherwise:
C                Each LASTVC digit(6) specifies a model configuration
C          e.g.:    LASTVC= 123456
C                L=0,1,..9  Layers NL=  Any,GCM12,GCM23,Pset,Hset,etc
C                A=0,1,..6  Atmosphere  Any,Trop,MLS,MLW,SAS,SAW,Std
C                S=0,1,..9  Surf Types  POCEAN=1,PEARTH=1,POICE=1,etc
C                T=0,1,..9  Tracer Aer  Tau=0,  Tau=0.1 Aer Comp(1-9)
C                V=0,1,..9  Vegetation  Sand,Tundra,Grass,Shrubs, etc
C                C=0,1,..9  Cloud,R=10  Clim Cloud Tau in Layer(1,-9)
C                ----------------------------------------------------

      IF(LASTVC >= 0) CALL SETATM

C             -------------------------------------------------------
C             Set Solar Constant for Default Reference Time: Jan 1950
C             Default used for KSOLAR(=1) is that specified in RADPAR
C             -------------------------------------------------------

      JJDAYS=1
      JYEARS=1950
      IF(KJDAYS > 0)             JJDAYS=KJDAYS
      IF(KYEARS > 0)             JYEARS=KYEARS
C----------------------------------------------
                      CALL SETSOL(JYEARS,JJDAYS)
C----------------------------------------------


C             -------------------------------------------------------
C             Set Default Greenhouse Gas Reference Year to:  Mid 1980
C             Default used for KTREND(=1) is that specified in RADPAR
C             -------------------------------------------------------

      JJDAYG=184
      JYEARG=1980
C----------------------------------------------
                      CALL SETGHG(JYEARG,JJDAYG)
C----------------------------------------------
      IF(KJDAYG > 0)             JJDAYG=KJDAYG
      IF(KYEARG > 0)             JYEARG=KYEARG
C----------------------------------------------
                      CALL UPDGHG(JYEARG,JJDAYG)
C----------------------------------------------

C--------------------------------
                      CALL SETGAS
C
                                   CALL SETBAK
      IF(MADAER > 0.or.NTRACE > 0) CALL SETAER
      IF(MADDST > 0) CALL SETDST
C--------------------------------


C               -----------------------------------------------------
C               Set Volcanic Aerosol Effective Variance Default Value
C                   Particle Size(REFF0=0.3) when not known from data
C                   (VEFF0=0.35 is value based on thermal ISAMS data)
C                   -------------------------------------------------

C----------------------------------------------
      IF(MADVOL > 0) CALL SETVOL
C----------------------------------------------

C--------------------------------
                      CALL SETCLD

C--------------------------------

      CALL SOLAR0

      RETURN
      END SUBROUTINE RCOMP1


      SUBROUTINE RCOMPT 1,9
      use SURF_ALBEDO, only : UPDSUR
      IMPLICIT NONE
C-----------------------------------------------------------------------
C
C     Time Trend Selection Parameters and Options:
C     -------------------------------------------
C
C             The Nominal Default Values are KYEARX = 0, and KJDAYX = 0,
C             in which case RADPAR supplied Time JYEAR and JDAY are used
C
C             When Non-Zero Values are specified for  KYEARX and KJDAYX,
C             the JYEAR,JDAY Time Dependence of the Specified Process is
C             over-ridden by the Non-Zero KYEARX and KJDAYX Value.
C             ----------------------------------------------------------
C                                  Process       KYEARX  KJDAYX
c             KYEARS,KJDAYS        SolarCon, UV       0       0
c             KYEARG,KJDAYG        GH Gas Trend       0       0
c             KYEARO,KJDAYO        Ozone Distr        0       0
c             KYEARA,KJDAYA        AerClimtolgy       0       0
c             KYEARD,KJDAYD        Desert Dust        0       0
c             KYEARV,KJDAYV        Volcanic Aer       0       0
c             KYEARE,KJDAYE        Epsilon Clds       0       0
c             KYEARR,KJDAYR        Refl Surface       0       0

C     ------------------------------------------------------------------
C     MADVEL  Model Add-on Data of Extended Climatology Enable Parameter
C             Each MADVEL digit is ON/OFF switch for corresponding input
C             e.g. MADVEL=123456   (zero digit skips input process)
C
C     MADAER  =  2  Updates  Aerosol 50y tropospheric climatology RFILE5
C     MADDST  =  3  Updates  Dust-windblown mineral climatology   RFILE6
C     MADVOL  =  4  Updates  Volcanic 1950-00 aerosol climatology RFILE7
C     MADEPS  =  5  Updates  Epsilon cloud heterogeneity data     RFILE8
C     MADLUV  =  6  Updates  Lean's SolarUV 1882-1998 variability RFILE9
C
C                 Related Model Add-on Data Parameters set in RADPAR
C
C     MADGHG   =  1  Default Enables UPDGHG update. (MADGHG=0),no update
C     MADSUR   =  1          V72X46N.1.cor Vegetation type data   RFILEC
C                            Z72X46N Ocean fraction, topography   RFILED
C     ------------------------------------------------------------------
      INTEGER JJDAYS,JYEARS,JJDAYG,JYEARG,JJDAYO,JYEARO,JJDAYA,JYEARA
     *     ,JJDAYD,JYEARD,JJDAYV,JYEARV,JJDAYE,JYEARE,JJDAYR,JYEARR

C                      -------------------------------------------------
C                      Set Seasonal and Time (JDAY) Dependent Quantities
C                      -------------------------------------------------

      JJDAYS=JDAY
      JYEARS=JYEAR
      IF(KJDAYS > 0)             JJDAYS=KJDAYS
      IF(KYEARS > 0)             JYEARS=KYEARS
C----------------------------------------------
      IF(MADLUV > 0) CALL UPDSOL(JYEARS,JJDAYS)
C----------------------------------------------

      JJDAYG=JDAY
      JYEARG=JYEAR
      IF(KJDAYG > 0)             JJDAYG=KJDAYG
      IF(KYEARG > 0)             JYEARG=KYEARG
C----------------------------------------------
      IF(MADGHG > 0) CALL UPDGHG(JYEARG,JJDAYG)
C----------------------------------------------


      JJDAYO=JDAY
      JYEARO=JYEAR
      IF(KJDAYO.ne.0)             JJDAYO=KJDAYO
      IF(KYEARO.ne.0)             JYEARO=KYEARO
C----------------------------------------------
                      CALL UPDO3D(JYEARO,JJDAYO)
C----------------------------------------------

      JJDAYA=JDAY
      JYEARA=JYEAR
      IF(KJDAYA > 0)             JJDAYA=KJDAYA
      IF(KYEARA.ne.0)            JYEARA=KYEARA
C----------------------------------------------
      IF(MADAER.ne.0) CALL UPDAER(JYEARA,JJDAYA)
C----------------------------------------------

      JJDAYD=JDAY
      JYEARD=JYEAR
      IF(KJDAYD > 0)             JJDAYD=KJDAYD
      IF(KYEARD > 0)             JYEARD=KYEARD
C----------------------------------------------
      IF(MADDST > 0) CALL UPDDST(JYEARD,JJDAYD)
C----------------------------------------------

      JJDAYV=JDAY
      JYEARV=JYEAR
      IF(KJDAYV > 0)             JJDAYV=KJDAYV
      IF(KYEARV.ne.0)             JYEARV=KYEARV
C----------------------------------------------
      IF(MADVOL > 0) CALL UPDVOL(JYEARV,JJDAYV)
C----------------------------------------------

      JJDAYE=JDAY
      JYEARE=JYEAR
      IF(KJDAYE > 0)             JJDAYE=KJDAYE
      IF(KYEARE > 0)             JYEARE=KYEARE
C----------------------------------------------
      IF(MADEPS > 0) CALL UPDEPS(JYEARE,JJDAYE)
C----------------------------------------------

      JJDAYR=JDAY
      JYEARR=JYEAR
      IF(KJDAYR > 0)             JJDAYR=KJDAYR
      IF(KYEARR > 0)             JYEARR=KYEARR
C----------------------------------------------
                      CALL UPDSUR(JYEARR,JJDAYR)
C----------------------------------------------

      RETURN
      END SUBROUTINE RCOMPT


      SUBROUTINE RCOMPX 4,12
      use SURF_ALBEDO, only : getsur
      IMPLICIT NONE
C     ------------------------------------------------------------------
C     MADVEL  Model Add-on Data of Extended Climatology Enable Parameter
C             Each MADVEL digit is ON/OFF switch for corresponding input
C             e.g. MADVEL=123456   (zero digit skips process)
C
C     MADO3M  =  1           Makiko's 1951-1997 Ozone climatology RFILEA
C     MADAER  =  2  Updates  Aerosol 50y tropospheric climatology RFILE5
C     MADDST  =  3  Updates  Dust-windblown mineral climatology   RFILE6
C     MADVOL  =  4  Updates  Volcanic 1950-00 aerosol climatology RFILE7
C     MADEPS  =  5           Epsilon cloud heterogeneity data     RFILE8
C     MADLUV  =  6           Lean's SolarUV 1882-1998 variability RFILE9
C
C                 Related Model Add-on Data Parameters set in RADPAR
C
C     MADGHG   =  1  Default Enables UPDGHG update. (MADGHG=0),no update
C     MADSUR   =  1          V72X46N.1.cor Vegetation type data   RFILEC
C                            Z72X46N Ocean fraction, topography   RFILED
C     ------------------------------------------------------------------
C
C      -----------------------------------------------------------------
C      Get Surface, Atmosphere, Sun Angle, Radiative Forcing, etc. Input
C      to compute Solar/Thermal Radiation for given (JLAT,ILON) Grid-box
C
C      The Radiation Model utilizes Data with 72x46 (lon,lat) resolution
C                 for GCM resolution other than 72x46, set JLAT and ILON
C                 to appropriately Sample  (rather than interpolate) the
C                 72x46 aerosol, ozone, cloud heterogeneity data sets
C
C      The Radiation Model can accommodate arbitrary vertical resolution
C      -----------------------------------------------------------------


C--------------------------------
!!!                   CALL GETO3D(ILON,JLAT) ! may have to be changed ??
      CALL REPART (O3JDAY(1,ILON,JLAT),PLBO3,NLO3+1, ! in
     *                      U0GAS(1,3),PLB0, NL+1)   ! out, ok if L1>1 ?
      if(use_tracer_ozone > 0) then
        U0GAS(1:use_tracer_ozone,3)=O3_IN(1:use_tracer_ozone)
        FULGAS(3)=1.d0
      endif
                      CALL GETGAS
C--------------------------------


C--------------------------------
      SRBEXT=1.d-20 ; SRBSCT=0. ; SRBGCB=0. ; TRBALK=0.
      IF(MADBAK > 0) CALL GETBAK

      IF(MADAER.ne.0.OR.NTRACE > 0) THEN ; CALL GETAER
       ELSE ; SRAEXT=0.     ; SRASCT=0. ; SRAGCB=0. ; TRAALK=0. ; END IF
      IF(MADDST > 0) THEN ; CALL GETDST
       ELSE ; SRDEXT=0.     ; SRDSCT=0. ; SRDGCB=0. ; TRDALK=0. ; END IF
      IF(MADVOL > 0) THEN ; CALL GETVOL
       ELSE ; SRVEXT=0.     ; SRVSCT=0. ; SRVGCB=0. ; TRVALK=0. ; END IF
      chem_out(:,2)=SRVEXT(:,6) ! save 3D aerosol extinction in SUB RADIA
C--------------------------------


C--------------------------------  (GETSUR sets albedo needed by GETCLD)
                      CALL GETSUR(
     i     snoage_fac_max,
     i     MLAT46,jnorth,KEEPAL,KSIALB,KZSNOW,MADSUR,
     i     COSZ,PLANCK,
     i     ILON,JLAT,
     i     AGESN,POCEAN,POICE,PEARTH,PLICE,PLAKE,zlake,
     i     TGO,TGOI,TGE,TGLI,ZOICE,FMP,ZSNWOI,zmp,
     i     SNOWOI,SNOWE,SNOWLI,SNOW_FRAC,WEARTH,WMAG,PVT,dalbsn,
     i     flags,
     o     BXA,PRNB,PRNX,SRBALB,SRXALB,TRGALB,
     o     BGFEMD,BGFEMT,
     o     DTRUFG,FTRUFG
     &     )
                      CALL GETEPS
                      CALL GETCLD
C--------------------------------

C--------------------------------
                      CALL THERML

                      CALL SOLARM
C--------------------------------

      RETURN
      END SUBROUTINE RCOMPX



      subroutine UPDSOL(JYEARS,JJDAYS) 1,1
      INTEGER, INTENT(IN) :: JYEARS,JJDAYS
      call SETSOL(JYEARS,JJDAYS,1)
      end subroutine UPDSOL


      SUBROUTINE SETSOL(JYEARS,JJDAYS,UPDSOL_flag) 2,3
      IMPLICIT NONE
C-----------------------------------------------------------------------
C
C     SETSOL Parameters:
C----------------------
C            KSOLAR    Selects Solar Spectrum, (Lean vs Thekaekara Flux)
C            JYEARS    JYEAR Proxy:  Sets: Solar Constant Reference Year
C            JJDAYS    JDAY  Proxy:  Sets Reference Year Month JDAY/30.5
C                      (Nominal Reference: JYEARS= 1950 JJDAYS= January)
C
C-----------------------------------------------------------------------
C            KSOLAR   SOLSPEC     UVWAVLs       UVFACTs         KUVFAC
C-----------------------------------------------------------------------
C              -1     THEK      Can be set    Can be set   (if KUVFAC=1)
C-----------------------------------------------------------------------
C               0     LEAN      Can be set    Can be set   (if KUVFAC=1)
C-----------------------------------------------------------------------
C               1     LEAN      Can be set    Can be set   (if KUVFAC=1)
C-----------------------------------------------------------------------
C
C                               (Option to Modify Solar UV Fluxes)
C            UVWAVL    Specified Edges of UV Flux Variation SubIntervals
C            UVFACT    Factors to Change the Amplitude of UV Variability
C
C            KUVFAC    ON/OFF switch for activating UV Flux Modification
C            KSNORM    Re-Normalize S0 (VIS) (after UV Amplitude Change)
C                         (Nominal UVWAVLs are: 0.295,0.310,0.366)
C
C-----------------------------------------------------------------------
C     SETSOL Output:
C------------------
C
C        AO3 =   Ozone Absorption Table AO3(460)
C                (Solar UV Flux Weighted Absorption Table is used by the
C                FUNCTION AO3ABS(OCM) in SOLAR to compute Ozone Heating)
C                AO3 is the fraction of total Solar Flux absorbed by O3.
C
C     S00WM2 =   Solar Constant Reference Value for Time = JYEARS,JJDAYS
C                (Thekaekara, if KSOLAR=-1, Reference = 1367 WATTS/M**2)
C
C
C     SETSOL  is Generally Called once at Model Initialization to Select
C                Solar Flux (LEAN,THEK), and to Define S00WM2 (RATLS0=1)
C
C-----------------------------------------------------------------------
C NOTE:
C-----
C     S00WM2 = Nominal Reference Solar Constant 1366.448785D0 WATTS/M**2
C                (Spectral Integral: Lean99 Solar Flux for January 1950)
C
C     KSOLAR=-1  Reproduces Thekaekhara Ozone Absorption, e.g., XRAD83XX
C     KSOLAR= 0  Uses Lean99 Solar Flux as set for Time= (JYEARS,JJDAYS)
C     KSOLAR= 1  Sets Lean99 Solar Flux to Current Time= (JYEARS,JJDAYS)
C     KSOLAR= 2  same as 1 but based on annual (not monthly) data
C                (JJDAYS used to select the specified Monthly-Mean Flux)
C     KSOLAR= 9  annual data for current time from file, but Thekaekhara
C                wavelength bins
C
C-----------------------------------------------------------------------
C
C     UPDSOL Parameters:
C----------------------
C            JYEARS    JYEAR Proxy:  Selects Solar Constant Current Year
C            JJDAYS    JDAY  Proxy:  Selects Lean Data Month JJDAYS/30.5
C
C     UPDSOL Output:
C------------------
C
C        AO3 =   Ozone Absorption Table AO3(460)
C                (Solar UV Flux Weighted Absorption Table is used by the
C                FUNCTION AO3ABS(OCM) in SOLAR to compute Ozone Heating)
C                AO3 is the fraction of total Solar Flux absorbed by O3.
C
C     RATLS0 =   Ratio:  Current-Time Solar Constant to Reference S00WM2
C
C-----------------------------------------------------------------------
C     Remark:
C
C     UPDSOL  is Called in RCOMPT to Update Solar Constant and Ozone AO3
C                Solar UV Absorption Dependence.  (Monthly-Mean Data are
C                NOT Interpolated in Time, but get Updated with Changing
C                Month, i.e., whenever JDAY/30.5 Reaches Integer Value.)
C
C-----------------------------------------------------------------------
      REAL*8, PARAMETER :: CORFAC=1366.2911D0/1366.4487855D0
      INTEGER, INTENT(IN) :: JYEARS,JJDAYS
      INTEGER, INTENT(IN), optional :: UPDSOL_flag
      INTEGER, SAVE :: LMOREF=0
      INTEGER JMO,LMO,Is0x,K,I,NWSUV,II,J,NUV
      REAL*8 FLXSUM,FFLUX(3),UVNORM,XX,OCM,TAUK,UVWAVA,UVWAVB,AO33

      if ( present(UPDSOL_flag) ) goto 777

C                                          Thekaekhara Solar Flux Option
C                                          -----------------------------
      IF(KSOLAR < 0) THEN
        WSOLAR(1:190)=WTHEK(1:190)
        FSOLAR(1:190)=FTHEK(1:190)
        S00WM2=1367.D0
        LMOREF=-111
        NWSUV=190
        GO TO 130
      END IF
C                                           Lean99 Solar Flux, UV Option
C                                           ----------------------------
      if(Ksolar < 2) then    ! monthly data
        JMO=1+JJDAYS/30.5D0
        IF(JMO > 12) JMO=12
        LMO=(JYEARS-iy1S0)*12+JMO
        IF(LMO > Ms0X) LMO=LMO-mcycs0*((LMO-Ms0X+mcycs0-1)/mcycs0)
        IF(LMO < 1) LMO=LMO+mcycs0*((mcycs0-lmo)/mcycs0)
      else                    ! annual data
        Is0x = nint( yr2s0-yr1s0+1 )
        lmo = nint( jyears - yr1s0 + 1.5 )
        IF(LMO > Is0X) LMO=LMO-icycs0*((LMO-Is0X+icycs0-1)/icycs0)
        IF(LMO < 1) LMO=LMO+icycs0*((icycs0-lmo)/icycs0)
      end if
      LMOREF=LMO

C                        IF(MADLUV==0) Default Option is then in force
C                        Default (FRLEAN) = Lean 1950 Jan Solar, UV flux
C                        CORFAC accounts for DSLEAN units in BLOCK DATA,
C                        and TSI1/TSI2 normalization of Lean input data.
C                        -----------------------------------------------

c      CORFAC=1366.2911D0/1366.4487855D0
      IF(KSOLAR.ne.9) THEN
        IF(MADLUV == 0) S00WM2 = SUM(FRLEAN(:)*DSLEAN(:)*CORFAC)
        IF(MADLUV >  0) S00WM2 = SUM(UVLEAN(LMO,:)*DSLEAN(:))
      ELSE
        S00WM2=TSI2(LMO)
      END IF

      IF(KSOLAR.ne.9) THEN
        I=0
        DO K=1,50
          I=I+1
          WSOLAR(I)=W1LEAN(K)
          IF(MADLUV == 0) FSOLAR(I)=FRLEAN(K)
          IF(MADLUV >  0) FSOLAR(I)=UVLEAN(LMO,K)
          I=I+1
          WSOLAR(I)=W1LEAN(K+1)
          FSOLAR(I)=FSOLAR(I-1)
        END DO
        NWSUV=100
      ELSE
        IF(MADLUV==0)call stop_model("invalid MADLUV for KSOLAR=9",255)
        WSOLAR(1:190)=WTHEK(1:190)
        FSOLAR(1:190)=UVLEAN(LMO,1:190)
        NWSUV=190
      END IF

C                                         Option to Modify Solar UV Flux
C                                         ------------------------------
  130 IF(KUVFAC==1) THEN
        FFLUX(:)=0.D0
        NUV=1
        DO I=1,NWSUV,2          ! by twos to account for histogram
 140      IF(WSOLAR(I+1) <= UVWAVL(NUV)) THEN
            FFLUX(NUV)=FFLUX(NUV)+FSOLAR(I)*(WSOLAR(I+1)-WSOLAR(I))
            FSOLAR(I:I+1)=FSOLAR(I:I+1)*UVFACT(NUV)
          ELSE
            NUV=NUV+1
            IF (NUV.LE.3) GOTO 140
            EXIT
          END IF
        END DO
        UVNORM = SUM(FFLUX(:)*(1d0-UVFACT(:)))
        IF (MADLUV==0) UVNORM=UVNORM*CORFAC
        IF (KSNORM==0) S00WM2=S00WM2-UVNORM
      ENDIF
C                  -----------------------------------------------------
C                  When KUVFAC=1 option multiplicative factors UVFACT(I)
C                  are used to change the UV spectral flux distribution,
C                  KSNORM=1 provides the option to keep S00WM2 constant.
C                  -----------------------------------------------------

      RATLS0=1.D0

      DO 190 I=1,460
      II=(I-10)/90-4
      XX=I-((I-10)/90)*90
      OCM=XX*10.D0**II
      DO 180 J=1,226
      TAUK=FUVKO3(J)*OCM
      IF(TAUK > 35.D0) TAUK=35.D0
      UVA(J)=1.D0-EXP(-TAUK)
  180 CONTINUE
      UVWAVA=0.100D0
      UVWAVB=0.400D0
      CALL FXGINT(UVA,XWAVO3,226,FSOLAR,WSOLAR,NWSUV,UVWAVA,UVWAVB,AO33)
      AO3(I)=AO33/S00WM2
  190 CONTINUE

C                       ------------------------------------------------
C                       NOTE:  AO3 is the Ozone-path Absorption Function
C                              AO3 convolves O3 asborption with solar UV
C                              spectral variations by FXGINT integration
C                              AO3 is expressed as the absorbed fraction
C                              of the total solar flux (S00WM2=1366W/m2)
C                              -----------------------------------------

      RETURN

C--------------------------------
!      ENTRY UPDSOL(JYEARS,JJDAYS)
C--------------------------------
 777  continue

      IF(KSOLAR < 1) RETURN   ! solar constant not time dependent
      IF(JYEARS < 1) RETURN   ! solar constant not time dependent

      if(Ksolar == 1) then    ! monthly data
        JMO=1+JJDAYS/30.5D0
        IF(JMO > 12) JMO=12
        LMO=(JYEARS-iy1S0)*12+JMO
        IF(LMO > Ms0X) LMO=LMO-mcycs0*((LMO-Ms0X+mcycs0-1)/mcycs0)
        IF(LMO < 1) LMO=LMO+mcycs0*((mcycs0-lmo)/mcycs0)
      else                    ! annual data        ksolar=2,9
        Is0x = nint( yr2s0-yr1s0+1 )
        lmo = nint( jyears - yr1s0 + 1.5 )
        IF(LMO > Is0X) LMO=LMO-icycs0*((LMO-Is0X+icycs0-1)/icycs0)
        IF(LMO < 1) LMO=LMO+icycs0*((icycs0-lmo)/icycs0)
      end if

      IF(LMO==LMOREF) RETURN  ! solar constant up-to-date
      LMOREF=LMO

C                                               Select Lean99 Solar Flux
C                                               ------------------------
      IF(KSOLAR.ne.9)THEN
        FLXSUM = SUM(UVLEAN(LMO,1:190)*DSLEAN(1:190))
      ELSE
        FLXSUM=TSI2(LMO)
      END IF

      IF(KSOLAR.ne.9) THEN
        I=0
        DO K=1,50
          I=I+1
          WSOLAR(I)=W1LEAN(K)
          FSOLAR(I)=UVLEAN(LMO,K)
          I=I+1
          WSOLAR(I)=W1LEAN(K+1)
          FSOLAR(I)=FSOLAR(I-1)
        END DO
        NWSUV=100
      ELSE
C                                          Select Thekaekhara Solar Flux
C                                          -----------------------------
        WSOLAR(1:190)=WTHEK(1:190)
        FSOLAR(1:190)=UVLEAN(LMO,1:190)
        NWSUV=190
      END IF
C                                         Option to Modify Solar UV Flux
C                                         ------------------------------
      IF(KUVFAC==1) THEN
        FFLUX(:)=0.D0
        NUV=1
        DO I=1,NWSUV,2          ! by twos to account for histogram
 240      IF(WSOLAR(I+1) <= UVWAVL(NUV)) THEN
            FFLUX(NUV)=FFLUX(NUV)+FSOLAR(I)*(WSOLAR(I+1)-WSOLAR(I))
            FSOLAR(I:I+1)=FSOLAR(I:I+1)*UVFACT(NUV)
          ELSE
            NUV=NUV+1
            IF (NUV.LE.3) GOTO 240
            EXIT
          END IF
        END DO
        UVNORM = SUM(FFLUX(:)*(1d0-UVFACT(:)))
        IF (MADLUV==0) UVNORM=UVNORM*CORFAC
        IF (KSNORM==0) FLXSUM=FLXSUM-UVNORM
      ENDIF

      RATLS0=FLXSUM/S00WM2

      DO 290 I=1,460
      II=(I-10)/90-4
      XX=I-((I-10)/90)*90
      OCM=XX*10.D0**II
      DO 280 J=1,226
      TAUK=FUVKO3(J)*OCM
      IF(TAUK > 35.D0) TAUK=35.D0
      UVA(J)=1.D0-EXP(-TAUK)
  280 CONTINUE
      UVWAVA=0.100D0
      UVWAVB=0.400D0
      CALL FXGINT(UVA,XWAVO3,226,FSOLAR,WSOLAR,NWSUV,UVWAVA,UVWAVB,AO33)
      AO3(I)=AO33/FLXSUM
  290 CONTINUE

      RETURN
      END SUBROUTINE SETSOL



      SUBROUTINE SETGHG(JYEARG,JJDAYG) 1,1
      IMPLICIT NONE
C
C
C     ---------------------------------------------------------------
C     SETGHG  Sets Default Greenhouse Gas Reference Year (for FULGAS)
C
C     Control Parameter:
C                     KTREND (specified in RADPAR) activates GH Trend
C               Default
C     KTREND  =   1
C     Selects   GTREND
C     ---------------------------------------------------------------
      INTEGER, INTENT(IN) :: JYEARG,JJDAYG
      REAL*8 TREF,TNOW
      INTEGER I
C
      TREF=JYEARG+(JJDAYG-0.999D0)/366.D0
C
      IF(KTREND==0) THEN
        XREF(1)=PPMV80(2)
        XREF(2)=PPMV80(6)
        XREF(3)=PPMV80(7)
        XREF(4)=PPMV80(8)*1000.D0
        XREF(5)=PPMV80(9)*1000.D0
        XREF(6)=PPMV80(11)*1000.D0  ! YREF11=PPMV80(11)*1000.D0
        XREF(7)=PPMV80(12)*1000.D0  ! ZREF12=PPMV80(12)*1000.D0
        RETURN
      END IF

      CALL GTREND(XREF,TREF)     ! finds xref 1-6 (yref11=xx6=xref(6))
      XREF(7)=1.D-13             ! ZREF12=1.D-13
      DO 120 I=1,NGHG
      IF(XREF(I) < 1.D-06) XREF(I)=1.D-06
  120 CONTINUE
      PPMV80(2)=XREF(1)
      PPMV80(6)=XREF(2)
      PPMV80(7)=XREF(3)
      PPMV80(8)=XREF(4)/1000.D0
      PPMV80(9)=XREF(5)/1000.D0
      PPMV80(11)=XREF(6)/1000.d0   ! YREF11/1000.D0
      PPMV80(12)=XREF(7)/1000.D0   ! ZREF12/1000.D0
      RETURN
      end SUBROUTINE SETGHG
C
C--------------------------------
!      ENTRY UPDGHG(JYEARG,JJDAYG)
C--------------------------------

      subroutine UPDGHG(JYEARG,JJDAYG) 4,1
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: JYEARG,JJDAYG
      REAL*8 TREF,TNOW
      INTEGER I
C
      TNOW=JYEARG+(JJDAYG-0.999D0)/366.D0
C
      IF(KTREND==0) THEN
        FULGAS(2)=PPMVK0(2)/XREF(1)
        FULGAS(6)=PPMVK0(6)/XREF(2)
        FULGAS(7)=PPMVK0(7)/XREF(3)
        FULGAS(8)=PPMVK0(8)/XREF(4)
        FULGAS(9)=PPMVK0(9)/XREF(5)
        FULGAS(11)=PPMVK0(11)/XREF(6) ! YREF11
        FULGAS(12)=PPMVK0(12)/XREF(7) ! .../ZREF12
        RETURN
      END IF

      CALL GTREND(XNOW,TNOW) ! finds xnow 1-6 (ynow11=xx6=xnow(6))
      XNOW(7)=1.D-20         ! ZNOW12=1.D-20
      FULGAS(2)=XNOW(1)/XREF(1)
      FULGAS(6)=XNOW(2)/XREF(2)
      FULGAS(7)=XNOW(3)/XREF(3)
      FULGAS(8)=XNOW(4)/XREF(4)
      FULGAS(9)=XNOW(5)/XREF(5)
      FULGAS(11)=XNOW(6)/XREF(6) ! YNOW11/YREF11
      FULGAS(12)=XNOW(7)/XREF(7) ! ZNOW12/ZREF12
C
      RETURN
      end subroutine UPDGHG


      SUBROUTINE UPDO3D(JYEARO,JJDAYO) 3,22

!!!   use RADPAR, only : MLON72,MLAT46,NL,PLB0,U0GAS,MADO3M
      USE FILEMANAGER, only : openunit,closeunit
      USE DOMAIN_DECOMP, only: AM_I_ROOT
      USE PARAM
      IMPLICIT NONE

!     In 2003, 9 decadal files and an ozone trend data file have been
!     defined using 49-layer PLB pressure levels. Because of strange
!     discontinuities in the stratosphere, they were replaced in 2004

      INTEGER, PARAMETER ::
     *     NFO3x=9,      !  max. number of decadal ozone files used
!!!  *     NLO3=49,      !  number of layers of ozone data files
     *     IYIO3=1850, IYEO3=2050, ! beg & end year of O3 trend file
     *     LMONTR=12*(IYEO3-IYIO3+1) ! length of O3 trend file

      REAL*4 O3YEAR(MLON72,MLAT46,NLO3,0:12),OTREND(MLAT46,NLO3,LMONTR)
      REAL*4 O3ICMA(MLON72,MLAT46,NLO3,12),O3JCMA(MLON72,MLAT46,NLO3,12)
      INTEGER LJTTRO(MLAT46)
      real*4, dimension(MLON72,MLAT46,NLO3,0:12) :: delta_O3_max_min
      real*4, dimension(NLO3) :: delta_O3_now
!!!   COMMON/O3JCOM/O3JDAY(NLO3,MLON72,MLAT46)   !  for offline testing

C     UPDO3D CALLs GTREND to get CH4 to interpolate tropospheric O3
C     -----------------------------------------------------------------

      CHARACTER*80 TITLE
      logical qexist
!@dbparam use_sol_Ox_cycle if =1, a cycle of ozone is appled to
!@+ o3year, as a function of the solar constant cycle.
!@var add_sol is [S00WM2(now)-1/2(S00WM2min+S00WM2max)]/
!@+ [S00WM2max-S00WM2min] so that O3(altered) = O3(default) +
!@+ add_sol*delta_O3_max_min
      integer :: use_sol_Ox_cycle = 0
      real*8 :: add_sol
      real*8 :: S0min, S0max

C**** The data statements below are only used if  MADO3M > -1
      CHARACTER*40, DIMENSION(NFO3X) :: DDFILE = (/
     1            'aug2003_o3_shindelltrop_72x46x49x12_1850'
     2           ,'aug2003_o3_shindelltrop_72x46x49x12_1890'
     3           ,'aug2003_o3_shindelltrop_72x46x49x12_1910'
     4           ,'aug2003_o3_shindelltrop_72x46x49x12_1930'
     5           ,'aug2003_o3_shindelltrop_72x46x49x12_1950'
     6           ,'aug2003_o3_shindelltrop_72x46x49x12_1960'
     7           ,'aug2003_o3_shindelltrop_72x46x49x12_1970'
     8           ,'aug2003_o3_shindelltrop_72x46x49x12_1980'
     9           ,'aug2003_o3_shindelltrop_72x46x49x12_1990'/)
      INTEGER, DIMENSION(NFO3X) :: IYEAR =
     *     (/1850,1890,1910,1930,1950,1960,1970,1980,1990/)
      INTEGER :: NFO3 = NFO3X
      CHARACTER*40 :: OTFILE ='aug2003_o3timetrend_46x49x2412_1850_2050'
      INTEGER :: IFILE=11            ! not used in GCM runs
      integer :: idfile

!!!   REAL*8 :: PLBO3(NLO3+1) = (/ ! could be read off the titles
!!!  *      1010d0, 934d0, 854d0, 720d0, 550d0, 390d0, 285d0, 210d0,
!!!  *       150d0, 125d0, 100d0,  80d0,  60d0,  55d0,  50d0,
!!!  *        45d0,  40d0,  35d0,  30d0,  25d0,  20d0,  15d0,
!!!  *       10.d0,  7.d0,  5.d0,  4.d0,  3.d0,  2.d0,  1.5d0,
!!!  *        1.d0,  7d-1,  5d-1,  4d-1,  3d-1,  2d-1,  1.5d-1,
!!!  *        1d-1,  7d-2,  5d-2,  4d-2,  3d-2,  2d-2,  1.5d-2,
!!!  *        1d-2,  7d-3,  5d-3,  4d-3,  3d-3,  1d-3,  1d-7/)
C**** LJTTRO(MLAT46) below layer 1+LJTTRO,  O3-interp is based on CH4
      DATA LJTTRO/9*0,4*7,20*8,7*7,6*6/ ! does not work well near S.Pole
      INTEGER, SAVE :: IYR=0, JYRNOW=0, IYRDEC=0, IFIRST=1, JYR

      save nfo3,iyear,ljttro,otrend,o3year,delta_O3_max_min
!!!   save plbo3
      save ddfile,ifile,idfile,S0min,S0max

      INTEGER :: JYEARO,JJDAYO
      INTEGER I,J,L,M,N,IY,JY,MI,MJ,MN,NLT,JYEARX  !! ,ILON,JLAT
      REAL*8 WTTI,WTTJ, WTSI,WTSJ,WTMJ,WTMI, XMI,DSO3

C**** Deal with out-of-range years (incl. starts before 1850)
      if(abs(jyearo) < abs(jyrnow)) jyearo=-jyrnow ! keep cycling
      if(abs(jyearo) > O3YR_max) jyearo=-O3YR_max ! cycle thru O3YR_max

      IF(IFIRST==1) THEN

      call sync_param("use_sol_Ox_cycle",use_sol_Ox_cycle)

      if(use_sol_Ox_cycle==1)then
        call openunit ("delta_O3",idfile,.true.,.true.)
        read(idfile)S0min,S0max
        do m=1,12; do L=1,NLO3
          read(idfile)TITLE,delta_O3_max_min(:,:,L,M)
        enddo    ; enddo
        delta_O3_max_min(:,:,:,0)=delta_O3_max_min(:,:,:,12)
        call closeunit (idfile)
      endif

      if(plbo3(1) < plb0(1)) plbo3(1)=plb0(1)                  ! ??
      IF(MADO3M < 0) then
C****   Find O3 data files and fill array IYEAR from title(1:4)
        nfo3=0
        if (AM_I_ROOT()) write(6,'(/a)') ' List of O3 files used:'
        do n=1,nfo3X    !  files have the generic names O3file_01,....
          ddfile(n)=' '
          write (ddfile(n),'(a7,i2.2)') 'O3file_',n
          inquire (file=trim(ddfile(n)),exist=qexist)
          if(.not.qexist) go to 10 !  exit
          call openunit (ddfile(n),ifile,.true.,.true.)
          read(ifile) title
          call closeunit (ifile)
          if (AM_I_ROOT())
     *         write(6,'(a,a)') ' read O3 file, record 1: ',title
          read(title(1:4),*) IYEAR(n)
          nfo3=nfo3+1
        end do

   10   continue
        if(nfo3==1) JYEARO=-IYEAR(1)
        if(nfo3==0) call stop_model('updo3d: no Ozone files',255)
        OTFILE='O3trend '
      END IF

C**** Prior to first year of data, cycle through first year of data
      if(abs(jyearo) < IYEAR(1)) jyearo=-IYEAR(1)

      IY=0
      IF(JYEARO < 0) THEN ! 1 year of O3 data is used in a cyclical way
        do n=1,nfo3        ! check whether we need the O3 trend array
           if(IYEAR(n)==-JYEARO) IY=n
        end do
      end if

      if(IY <= 1.and.nfo3 > 1) then
                       ! READ strat O3 time trend for strat O3 interpol.
        call openunit (OTFILE,ifile,.true.,.true.)
        READ (IFILE) OTREND
        call closeunit (ifile)
        if (AM_I_ROOT()) then
           if(MADO3M < 0) write(6,'(a,a)') ' read ',OTfile
        end if
      end if

      if(IY > 0) then
        call openunit (ddfile(IY),ifile,.true.,.true.)
        DO 30 M=1,12
        DO 30 L=1,NLO3
   30   READ (IFILE) TITLE,O3YEAR(:,:,L,M)
        O3YEAR(:,:,:,0)=O3YEAR(:,:,:,12)
        call closeunit (ifile)
        JYRNOW=-JYEARO  ! insures that O3YEAR is no longer changed
      end if

      IFIRST=0
      ENDIF

C     To time input data READs, JYEARX is set ahead of JYEARO by 15 days
C     ------------------------------------------------------------------
      IF(JYEARO < 0) THEN    !              ... except in cyclical case
        JYEARX=-JYEARO        ! Use fixed-year decadal climatology
      ELSE
        JYEARX=MIN(JYEARO+(JJDAYO+15)/366,IYEO3+1) ! +1 for continuity
      END IF                                       !         at Dec 15

      IF(JYEARX==JYRNOW) GO TO 500    ! Get O3JDAY from current O3YEAR
      IF(JYRNOW > O3YR_max) GO TO 500  ! cyclical case

C****
C**** Get 13 months of O3 data O3YEAR starting with the leading December
C****
      do jy=1,nfo3                  ! nfo3 is at least 2, if we get here
        if(iyear(jy) > JYEARx) go to 100
      end do
      jy=nfo3
  100 if(jy <= 1) jy=2
      iy=jy-1
      IYR=IYEAR(IY)
      JYR=IYEAR(JY)

C**** Get first decadal file
      call openunit (ddfile(IY),ifile,.true.,.true.)               ! IYR
      DO 110 M=1,12
      DO 110 L=1,NLO3
  110 READ (IFILE) TITLE,O3ICMA(:,:,L,M)
      call closeunit (ifile)

      IF(JYEARX == IYR.and.IYRDEC.ne.JYEARX-1 .and. IY > 1 .and.
     *   JYEARO > 0.and.JYEARX <= O3YR_max) THEN
C        READ and use prior decadal file to define prior year December
C        (only when starting up with JYEARO=1890,1910,1930,...1980
C         and only for non-cyclical cases)
      call openunit (ddfile(IY-1),ifile,.true.,.true.)             ! KYR
      DO 210 M=1,12
      DO 210 L=1,NLO3
  210 READ(IFILE) TITLE,O3JCMA(:,:,L,M)
      call closeunit (ifile)

C     Tropospheric & stratospheric ozone timetrend interpolation weights
C       Tropospheric ozone time variability is proportional to CH4 trend
C          Stratospheric ozone (above level LJTTRO(J)) is linear in time
C     ------------------------------------------------------------------

      CALL O3_WTS (IYIO3,LMONTR, IYR,IYEAR(IY-1), JYEARX-1,12,     ! in
     *             WTTI,WTTJ, WTSI,WTSJ, MI,MJ,MN)                 ! out

      DO 290 J=1,MLAT46
      NLT=LJTTRO(J)     !      NLT=LJTTRO(J) is top layer of troposphere
      DO 250 L=1,NLT
      DO 250 I=1,MLON72
      O3YEAR(I,J,L,0)=WTTI*O3ICMA(I,J,L,12)+WTTJ*O3JCMA(I,J,L,12)
      IF(O3YEAR(I,J,L,0) < 0.) O3YEAR(I,J,L,0)=0.
  250 CONTINUE

C     DSO3 = add-on residual intra-decadal stratospheric O3 variability
C     ------------------------------------------------------------------
      DO 270 L=NLT+1,NLO3
      DSO3=OTREND(J,L,MN)-WTSI*OTREND(J,L,MI)-WTSJ*OTREND(J,L,MJ)
      DO 270 I=1,MLON72
      O3YEAR(I,J,L,0)=WTSI*O3ICMA(I,J,L,12)+WTSJ*O3JCMA(I,J,L,12)+ DSO3
      IF(O3YEAR(I,J,L,0) < 0.) O3YEAR(I,J,L,0)=0.
  270 CONTINUE

  290 CONTINUE
      IYRDEC=JYEARX    !   Set flag to indicate December data is current
      ENDIF

C**** Get next  decadal file
      call openunit (ddfile(JY),ifile,.true.,.true.)               ! JYR
      DO 310 M=1,12
      DO 310 L=1,NLO3
  310 READ(IFILE) TITLE,O3JCMA(:,:,L,M)
      call closeunit (ifile)

      IF(JYEARX==IYRDEC) GO TO 410    ! done with prior December

      IF(JYEARX==IYRDEC+1) THEN      ! copy data from M=12 -> M=0
        O3YEAR(:,:,:,0)=O3YEAR(:,:,:,12)      !     DEC from prior year
        IF(JYEARX > O3YR_max) JYEARX=O3YR_max
        IYRDEC=JYEARX   !  Set flag to indicate December data is current
      ELSE IF(JYEARO > IYEAR(1)) THEN
C       Interpolate prior December from the decadal files - start-up
        CALL O3_WTS (IYIO3,LMONTR, IYR,JYR, JYEARX-1,12,        ! in
     *               WTTI,WTTJ, WTSI,WTSJ, MI,MJ,MN)            ! out

        DO 400 J=1,MLAT46
        NLT=LJTTRO(J)     !    NLT=LJTTRO(J) is top layer of troposphere
        DO 360 L=1,NLT
        DO 360 I=1,MLON72
        O3YEAR(I,J,L,0)=WTTI*O3ICMA(I,J,L,12)+WTTJ*O3JCMA(I,J,L,12)
        IF(O3YEAR(I,J,L,0) < 0.) O3YEAR(I,J,L,0)=0.
  360   CONTINUE

        DO 370 L=NLT+1,NLO3
        DSO3=OTREND(J,L,MN)-WTSI*OTREND(J,L,MI)-WTSJ*OTREND(J,L,MJ)
        DO 370 I=1,MLON72
        O3YEAR(I,J,L,0)=WTSI*O3ICMA(I,J,L,12)+WTSJ*O3JCMA(I,J,L,12)+DSO3
        IF(O3YEAR(I,J,L,0) < 0.) O3YEAR(I,J,L,0)=0.
  370   CONTINUE

  400   CONTINUE
        IYRDEC=JYEARX  !   Set flag to indicate December data is current
      END IF

C            Fill in a full year of O3 data by interpolation
C            -----------------------------------------------
  410 CONTINUE
      IF(JYEARX > O3YR_max) JYEARX=O3YR_max
      CALL O3_WTS (IYIO3,LMONTR, IYR,JYR, JYEARX,0,           ! in
     *             WTTI,WTTJ, WTSI,WTSJ, MI,MJ,MN)            ! out

C            Tropospheric O3 interpolation is in proportion to CH4 trend
C                         ----------------------------------------------
      DO 490 M=1,12
      DO 490 J=1,MLAT46
      NLT=LJTTRO(J)     !      NLT=LJTTRO(J) is top layer of troposphere
      DO 440 L=1,NLT
      DO 440 I=1,MLON72
      O3YEAR(I,J,L,M)=WTTI*O3ICMA(I,J,L,M)+WTTJ*O3JCMA(I,J,L,M)
      IF(O3YEAR(I,J,L,M) < 0.) O3YEAR(I,J,L,M)=0.
  440 CONTINUE

C     DSO3 = add-on residual intra-decadal stratospheric O3 variability
C     ------------------------------------------------------------------
      DO 460 L=NLT+1,NLO3
      DSO3=OTREND(J,L,M+MN)-WTSI*OTREND(J,L,M+MI)-WTSJ*OTREND(J,L,M+MJ)
      DO 460 I=1,MLON72
      O3YEAR(I,J,L,M)=WTSI*O3ICMA(I,J,L,M)+WTSJ*O3JCMA(I,J,L,M) + DSO3
      IF(O3YEAR(I,J,L,M) < 0.) O3YEAR(I,J,L,M)=0.
  460 CONTINUE

  490 CONTINUE

      IF(JYEARX.ne.IYRDEC) THEN               ! cyclical start-up case
        O3YEAR(:,:,:,0)=O3YEAR(:,:,:,12)      ! DEC from current year
        IYRDEC=JYEARX   !  Set flag to indicate December data is current
      END IF
      JYRNOW=JYEARX

C****
C**** O3JDAY is interpolated daily from O3YEAR seasonal data via JJDAYO
C****

  500 CONTINUE
C     the formula below yields M near the middle of month M
      XMI=(JJDAYO+JJDAYO+31-(JJDAYO+15)/61+(JJDAYO+14)/61)/61.D0
      MI=XMI
      WTMJ=XMI-MI       !   Intra-year interpolation is linear in JJDAYO
      WTMI=1.D0-WTMJ
      IF(MI > 11) MI=0
      MJ=MI+1
      if(use_sol_Ox_cycle==1)then
        add_sol = (S00WM2*RATLS0-0.5d0*(S0min+S0max))/(S0max-S0min)
        write(661,661)JJDAYO,S00WM2*RATLS0,S0min,S0max,add_sol
      endif
  661 format('JJDAYO,S00WM2*RATLS0,S0min,S0max,frac=',I4,3F9.2,F7.3)
      DO 510 J=1,MLAT46
      DO 510 I=1,MLON72
      O3JDAY(:,I,J)=WTMI*O3YEAR(I,J,:,MI)+WTMJ*O3YEAR(I,J,:,MJ)
      if(use_sol_Ox_cycle==1) then
        delta_O3_now(:) = WTMI*delta_O3_max_min(I,J,:,MI) +
     &                    WTMJ*delta_O3_max_min(I,J,:,MJ)
        O3JDAY(:,I,J) = O3JDAY(:,I,J) + add_sol*delta_O3_now(:)
      endif
  510 CONTINUE
      RETURN

!!    ENTRY GETO3D (ILON,JLAT)
C

!!    CALL REPART(O3JDAY(1,ILON,JLAT),PLBO3,NLO3+1,U0GAS(1,3),PLB0,NL+1)

!!    RETURN
      END SUBROUTINE UPDO3D


      SUBROUTINE O3_WTS (IYI,MONTHS, IY1,IY2, IYX,MON,        !  input 3,3
     *                   WTTI,WTTJ, WTSI,WTSJ, MI,MJ,MN)      ! output
!@sum O3_WTS finds the weights needed for Ozone interpolation
!@auth A. Lacis/R. Ruedy
      implicit none
      INTEGER IYI,MONTHS  ! first year, length of O3-trend data - input
      INTEGER IY1,IY2     ! 2 distinct years with O3 data       - input
      INTEGER IYX,MON     ! current year and month              - input
      INTEGER MI, MJ, MN  ! indices for ozone trend array       - output
      REAL*8  WTTI,WTTJ   ! tropospheric weights                - output
      REAL*8  WTSI,WTSJ   ! stratospheric weights               - output

      REAL*8  GHGAS(6)     ! greenhouse gas conentrations (3=CH4)
      REAL*8  dYEAR,CH4IY1,CH4IY2,CH4NOW  ! dummies

C     Tropospheric O3 interpolation is in proportion to CH4 trend
C                    GTREND returns mid-year (annual mean) values
C     -----------------------------------------------------------
      CALL GTREND(GHGAS,IY1+.5d0)
      CH4IY1=GHGAS(3)

      CALL GTREND(GHGAS,IY2+.5d0)
      CH4IY2=GHGAS(3)

      CALL GTREND(GHGAS,IYX+.5d0)
      CH4NOW=GHGAS(3)

      WTTI=(CH4IY2-CH4NOW)/(CH4IY2-CH4IY1)      !  Trop O3 varies as CH4
      WTTJ=1.D0-WTTI

C     Strat O3 interpolation uses relative monthly variability in OTREND
C     ------------------------------------------------------------------
      DYEAR=IY2-IY1
      WTSI=(IY2-IYX)/DYEAR                      ! Strat O3 = time linear
      IF(WTSI < 0.D0) WTSI=0.D0
      IF(WTSI > 1.D0) WTSI=1.D0
      WTSJ=1.d0-WTSI

      MI=    (IY1-IYI)*12 + MON
      MJ=    (IY2-IYI)*12 + MON
      MN=MAX((IYX-IYI)*12,0)
      IF(MN > MONTHS-12) MN=MONTHS-12
      MN=MN+MON
c     write(0,*) 'IYI,MON,IY1,IY2,IYX,MON',IYI,MONTHS,IY1,IY2,IYX,MON
c     write(0,*) 'MI,MJ,MN',MI,MJ,MN
c     write(0,*) 'WTTI,WTTJ, WTSI,WTSJ',WTTI,WTTJ, WTSI,WTSJ


      RETURN
      END SUBROUTINE O3_WTS



      subroutine GETGAS 1,1
      call SETGAS(1)
      end subroutine GETGAS


      SUBROUTINE SETGAS( GETGAS_flag) 2,3
      IMPLICIT NONE
C-----------------------------------------------------------------------
C     Global   U.S. (1976) Standard Atmosphere  P, T, Geo Ht  Parameters
C-----------------------------------------------------------------------
      INTEGER, optional :: GETGAS_flag
      REAL*8, PARAMETER ::
     * P36(36) = (/
     *  1.2000D+3, .9720D+3, .9445D+3, .9065D+3, .8515D+3, .7645D+3,
     *   .6400D+3, .4975D+3, .3695D+3, .2795D+3, .2185D+3, .1710D+3,
     *   .1250D+3, .8500D+2, .6000D+2, .4000D+2, .2500D+2, .1500D+2,
     *   .7500D+1, .4000D+1, .2500D+1, .1500D+1, .7500D+0, .4000D+0,
     *   .2500D+0, .1500D+0, .7810D-1, .4390D-1, .2470D-1, .1390D-1,
     *   .7594D-2, .3623D-2, .1529D-2, .7030D-3, .2059D-3, .0D0/),
     * UFAC36(36) = (/
     *  0.800d0,0.800d0,0.800d0,0.750d0,0.750d0,0.750d0,0.700d0,
     *  0.750d0,0.846d0,0.779d0,0.892d0,0.886d0,0.881d0,0.875d0,
     *  0.870d0,0.846d0,0.840d0,0.902d0,0.880d0,0.775d0,0.796d0,
     *  0.842d0,0.866d0,0.861d0,0.821d0,0.903d0,1.264d0,1.732d0,
     *  2.000d0,1.701d0,1.609d0,1.478d0,1.253d0,1.372d0,1.571d0,
     *  1.571d0/)

      REAL*8, PARAMETER :: HPCON=34.16319d0,P0=1013.25d0,
     *     PI=3.141592653589793D0
      REAL*8, SAVE :: SINLAT(46)
      INTEGER, SAVE :: IFIRST=1, NL0
      INTEGER I,NLAY,NATM,L,J,K,N
      REAL*8 RHP,EST,FWB,FWT,PLT,DP,EQ,ES,ACM,HI,FI,HL,HJ,FJ,DH
     *     ,FF,GGVDF,ZT,ZB,EXPZT,EXPZB,PARTTR,PARTTG,PTRO,DL,DLS,DLN
     *     ,Z0LAT,SUMCOL,ULGASL,UGAS0(LX),UGASR(LX)

      if ( present(GETGAS_flag) ) goto 777

      IF(IFIRST==1) THEN
        SINLAT(:) = SIN(DLAT46(:)*PI/180.D0)
        NL0=NL
        IFIRST=0
      ENDIF
C                  -----------------------------------------------------
C                  Use PLB to fix Standard Heights for Gas Distributions
C                  -----------------------------------------------------

!nu   PS0=PLB0(1)

      DO 100 L=1,NL0
      DPL(L)=PLB0(L)-PLB0(L+1)
      PL(L)=(PLB0(L)+PLB0(L+1))*0.5D0
!nu   HLB(L)=HLB0(L)
  100 CONTINUE
!nu   HLB(NL0+1)=HLB0(NL0+1)
      CALL RETERP(UFAC36,P36,36,FPXCO2,PL,NL0)
cc    IUFAC=1
cc    IF(IUFAC==0) FPXCO2(:)=1

      NLAY=LASTVC/100000
      NATM=(LASTVC-NLAY*100000)/10000
      IF(NATM > 0) GO TO 112

C     ----------------------------------------------------------------
C     Define Default Global Mean Gas Amounts for Off-Line Use Purposes
C
C     IGAS=1                              Global Mean H2O Distribution
C                                         ----------------------------
      RHP=0.77D0
      EST=10.D0**(9.4051D0-2353.D0/TLB(1))
      FWB=0.662D0*RHP*EST/(PLB0(1)-RHP*EST)
      DO 111 L=1,NL0
      PLT=PLB0(L+1)
      DP=PLB0(L)-PLT
      RHP=0.77D0*(PLT/P0-0.02D0)/.98D0
      EST=10.D0**(9.4051D0-2353.D0/TLT(L))
      FWT=0.662D0*RHP*EST/(PLT-RHP*EST)
      IF(FWT > 3.D-06) GO TO 110
      FWT=3.D-06
      RHP=FWT*PLT/(EST*(FWT+0.662D0))
  110 CONTINUE
      ULGASL=0.5D0*(FWB+FWT)*DP*1268.75D0
      U0GAS(L,1)=ULGASL
      SHL(L)=ULGASL/(ULGASL+1268.75D0*DP)
      EQ=0.5D0*(PLB0(L)+PLT)*SHL(L)/(0.662D0+0.378D0*SHL(L))
      ES=10.D0**(9.4051D0-2353.D0/TLM(L))
      RHL(L)=EQ/ES
      FWB=FWT
  111 CONTINUE
  112 CONTINUE

C                                         ----------------------------
C     IGAS=5                              Global Mean NO2 Distribution
C                                         ----------------------------
      ACM=0.D0
      HI=0.D0
      FI=CMANO2(1)
      HL=HLB0(2)
      L=1
      J=1
  130 CONTINUE
      J=J+1
      IF(J > 42) GO TO 133
      HJ=HI+2.D0
      FJ=CMANO2(J)
  131 CONTINUE
      DH=HJ-HI
      IF(HJ > HL) GO TO 132
      ACM=ACM+(FI+FJ)*DH*0.5D0
      HI=HJ
      FI=FJ
      GO TO 130
  132 CONTINUE
      FF=FI+(FJ-FI)*(HL-HI)/DH
      DH=HL-HI
      ACM=ACM+(FI+FJ)*DH*0.5D0
      U0GAS(L,5)=ACM
      ACM=0.D0
      HI=HL
      FI=FF
      IF(L==NL0) GO TO 133
      L=L+1
      HL=HLB0(L+1)
      GO TO 131
  133 CONTINUE
      U0GAS(L,5)=ACM
      ACM=0.D0
      L=L+1
      IF(L < NL0+1) GO TO 133
C                            -----------------------------------------
C     IGAS=2 and 4           (CO2,O2) Uniformly Mixed Gas Distribution
C                            -----------------------------------------
      DO 140 K=2,4,2
      U0GAS(1:NL0,K)=PPMV80(K)*0.8D0*DPL(1:NL0)/P0
  140 CONTINUE
C                -----------------------------------------------------
C     IGAS=6-12  (N20,CH4,F11,F12) Specified Vertical Gas Distribution
C                -----------------------------------------------------
      DO 151 K=6,12
      IF(K==10) GO TO 151
      DO 150 N=1,NL0
      GGVDF=1.D0-(1.D0-PPMVDF(K))*(1.D0-PLB0(N)/PLB0(1))
      IF(KGGVDF < 1) GGVDF=1.D0
      U0GAS(N,K)=PPMV80(K)*0.8D0*DPL(N)/P0*GGVDF
      ZT=(HLB0(N+1)-Z0(K))/ZH(K)
      IF(ZT <= 0.D0) GO TO 150
      ZB=(HLB0(N)-Z0(K))/ZH(K)
      EXPZT=EXP(-ZT)
      EXPZB=EXP(-ZB)
      IF(ZB < 0.D0) EXPZB=1.D0-ZB
      U0GAS(N,K)=U0GAS(N,K)*(EXPZB-EXPZT)/(ZT-ZB)
  150 CONTINUE
  151 CONTINUE
C                         --------------------------------------------
C                         Specification of  FULGAS  Scaled Gas Amounts
C                         --------------------------------------------

Cc*** Adjust water vapor in ALL layers                        ! IGAS=1
cc    ULGAS(1:NL0,1)=U0GAS(1:NL0,1)*FULGAS(1)
c**** Only adjust stratospheric levels (above LS1_loc)
      ULGAS(1:LS1_loc-1,1)=U0GAS(1:LS1_loc-1,1)
      ULGAS(LS1_loc:NL0,1)=U0GAS(LS1_loc:NL0,1)*FULGAS(1)
C****
      ULGAS(1:NL0,3)=U0GAS(1:NL0,3)*FULGAS(3)                 ! IGAS=3
      IF(KPFOZO==1) ULGAS(1:NL0,3)=ULGAS(1:NL0,3)*FPXOZO(1:NL0)

      DO 240 L=1,NL0                                     ! IGAS=2,4-13
!!!   PARTTR = (PLB(L)-PLB(L+1)) / (PLB0(L)-PLB0(L+1))   ! PLB=PLB0 ??
      DO 240 K=2,12
      IF(K==3) GO TO 240
!!!   PARTTG=PARTTR  ! next line not possible at this point (jlat=???)
!!!   IF(KPGRAD > 0) PARTTG=PARTTG*(1.D0+0.5D0*PPGRAD(K)*SINLAT(JLAT))
      ULGAS(L,K)=U0GAS(L,K)*FULGAS(K) !!! *PARTTG
  240 CONTINUE
      ULGAS(1:NL0,13)=U0GAS(1:NL0,13)*FULGAS(13)

      IF(KPFCO2==1) ULGAS(1:NL0,2)=ULGAS(1:NL0,2)*FPXCO2(1:NL0)

      RETURN


C-----------------
!      ENTRY GETGAS
C-----------------
 777  continue
C                        ---------------------------------------------
C                        Specify ULGAS: Get Gas Absorption from TAUGAS
C                        ---------------------------------------------

C                -----------------------------------------------------
C                N20,CH4,F11,F12 Specified Latitudinal Z0 Distribution
C                -----------------------------------------------------

      IF(KLATZ0 > 0) THEN
        PTRO=100.D0
        DL=DLAT46(JLAT)
        DLS=-40.D0
        DLN= 40.D0
        IF(DL < DLS) PTRO=189.D0-(DL+40.D0)*2.22D0
        IF(DL > DLN) PTRO=189.D0+(DL-40.D0)*2.22D0
        DO L=1,NL0
          IF(PLB0(L) >= PTRO) Z0LAT=HLB0(L)  ! orig. hlb not hlb0
        END DO
        DO 251 K=6,12
        IF(K==10) GO TO 251
        DO 250 L=1,NL0
        U0GAS(L,K)=PPMV80(K)*0.8D0*(PLB0(L)-PLB0(L+1))/P0
        ZT=(HLB0(L+1)-Z0LAT)/ZH(K)           ! orig. hlb not hlb0
        IF(ZT <= 0.D0) GO TO 250
        ZB=(HLB0(L)-Z0LAT)/ZH(K)             ! orig. hlb not hlb0
        EXPZT=EXP(-ZT)
        EXPZB=EXP(-ZB)
        IF(ZB < 0.D0) EXPZB=1.D0-ZB
        U0GAS(L,K)=U0GAS(L,K)*(EXPZB-EXPZT)/(ZT-ZB)
  250   CONTINUE
  251   CONTINUE
      ENDIF

      DO 300 L=L1,NL
      DPL(L)=PLB(L)-PLB(L+1)
      PL(L)=(PLB(L)+PLB(L+1))*0.5D0
  300 CONTINUE

      IF(KEEPRH==2) GO TO 313                  ! keep RH,SH
      IF(KEEPRH==1) GO TO 311                  ! find SH from RH
      DO 310 L=L1,NL                           ! find RH from SH
      EQ=PL(L)*SHL(L)/(0.662D0+0.378D0*SHL(L))
      ES=10.D0**(9.4051D0-2353.D0/TLM(L))
      RHL(L)=EQ/ES
  310 CONTINUE
      GO TO 313
  311 CONTINUE
      DO 312 L=L1,NL
      ES=10.D0**(9.4051D0-2353.D0/TLM(L))
      SHL(L)=0.622D0*(RHL(L)*ES)/(PL(L)-0.378D0*(RHL(L)*ES))
  312 CONTINUE
  313 CONTINUE

      U0GAS(L1:NL,1)=1268.75d0*DPL(L1:NL)*SHL(L1:NL)/(1-SHL(L1:NL))
Cc*** Adjust water vapor in ALL layers
cc    ULGAS(L1:NL,1)=U0GAS(L1:NL,1)*FULGAS(1)
c**** Only adjust stratospheric levels (above LS1_loc)
      ULGAS(L1:LS1_loc-1,1)=U0GAS(L1:LS1_loc-1,1)
      ULGAS(LS1_loc:NL,1)=U0GAS(LS1_loc:NL,1)*FULGAS(1)
C****
      ULGAS(1:NL0,3)=U0GAS(1:NL0,3)*FULGAS(3)
      IF(KPFOZO==1) ULGAS(1:NL0,3)=ULGAS(1:NL0,3)*FPXOZO(1:NL0)

      DO 340 L=L1,NL0   ! =L1,NL for GCM use, =1,NL0 for offline use
      PARTTR = (PLB(L)-PLB(L+1)) / (PLB0(L)-PLB0(L+1))
      DO 339 K=2,12
      IF(K==3) GO TO 339
      PARTTG=PARTTR
      IF(KPGRAD > 0) PARTTG=PARTTG*(1.D0+0.5D0*PPGRAD(K)*SINLAT(JLAT))
      ULGAS(L,K)=U0GAS(L,K)*FULGAS(K)*PARTTG
  339 CONTINUE
      ULGAS(L,13)=U0GAS(L,13)*FULGAS(13)
  340 CONTINUE

      IF(KPFCO2==1) ULGAS(1:NL0,2)=ULGAS(1:NL0,2)*FPXCO2(1:NL0)

      IF(MRELAY > 0) THEN          ! for offline use only
        IF(NO3COL > 0)             ! rescale ozone to col.amount RO3COL
     *    ULGAS(1:NL0,3) = U0GAS(1:NL0,3)*RO3COL/SUM( U0GAS(1:NL0,3) )
        DO 450 K=2,12                      ! repartition to new layering
          IF(K==10.and.KEEP10 > 0) GO TO 450
          UGAS0(1:NL0) = ULGAS(1:NL0,K)
          CALL REPART(UGAS0,PLB0,NL0+1, UGASR,PLB,NL+1)
          ULGAS(1:NL,K)=UGASR(1:NL)
  450   CONTINUE
        IF (KEEP10 > 0 .and. KEEP10 < 10)
     *    ULGAS(1:NL,KEEP10) = ULGAS(1:NL,10)
        IF (KEEP10 > 10)
     *    ULGAS(1:NL,KEEP10-10)=ULGAS(1:NL,KEEP10-10)+ULGAS(L,10)
      ENDIF

      chem_out(:,1)=ULGAS(:,3)              ! O3
C     chem_out(:,2)= _________              ! set in RCOMPX
      chem_out(:,3)=ULGAS(:,6)              ! N2O
      chem_out(:,4)=ULGAS(:,7)              ! CH4
      chem_out(:,5)=ULGAS(:,8)+ULGAS(:,9)   ! CFC11(+)   +  CFC12(+)

C-----------------
      CALL  TAUGAS
C-----------------

      RETURN
      END SUBROUTINE SETGAS



      subroutine GETO2A 1,1
      call SETO2A(1)
      end subroutine GETO2A


      SUBROUTINE SETO2A( GETO2A_flag ) 1
      IMPLICIT NONE
      INTEGER,optional :: GETO2A_flag

      INTEGER, PARAMETER :: NW=18, NZ=11, NKO2=6
      REAL*8, PARAMETER ::
     *SFWM2(NW) = (/
     A     2.196E-3, 0.817E-3, 1.163E-3, 1.331E-3, 1.735E-3, 1.310E-3,
     B     1.311E-3, 2.584E-3, 2.864E-3, 4.162E-3, 5.044E-3, 6.922E-3,
     C     6.906E-3,10.454E-3, 5.710E-3, 6.910E-3,14.130E-3,18.080E-3/),

     *SIGMA(NW,NKO2) = RESHAPE( (/
     A     2.74E-19, 2.74E-19, 2.74E-19, 2.74E-19, 2.74E-19, 2.74E-19,
     B     4.33E-21, 4.89E-21, 6.63E-21, 1.60E-20, 7.20E-20, 1.59E-18,
     C     2.10E-21, 2.32E-21, 3.02E-21, 6.30E-21, 3.46E-20, 7.52E-19,
     D     5.95E-22, 9.72E-22, 2.53E-21, 7.57E-21, 7.38E-20, 7.44E-19,
     E     3.33E-22, 1.02E-22, 4.09E-21, 1.63E-20, 8.79E-20, 3.81E-19,
     F     1.09E-21, 1.16E-21, 1.45E-21, 3.32E-21, 2.00E-20, 4.04E-19,
     G     1.15E-21, 1.30E-21, 1.90E-21, 4.89E-21, 2.62E-20, 4.08E-19,
     H     3.90E-22, 4.90E-22, 9.49E-22, 3.33E-21, 2.14E-20, 2.39E-19,
     I     1.29E-22, 2.18E-22, 8.28E-22, 3.46E-21, 1.94E-20, 1.06E-19,
     J     6.26E-23, 7.80E-23, 2.62E-22, 1.83E-21, 1.25E-20, 3.95E-20,
     K     2.74E-23, 3.58E-23, 8.64E-23, 4.03E-22, 2.13E-21, 1.95E-20,
     L     1.95E-23, 2.44E-23, 4.89E-23, 2.87E-22, 1.95E-21, 1.36E-20,
     M     1.84E-23, 1.96E-23, 2.71E-23, 8.52E-23, 6.48E-22, 3.89E-21,
     N     1.80E-23, 1.81E-23, 1.87E-23, 2.69E-23, 1.34E-22, 1.52E-21,
     O     1.80E-23, 1.80E-23, 1.82E-23, 2.40E-23, 5.71E-23, 5.70E-22,
     P     1.76E-23, 1.76E-23, 1.76E-23, 1.76E-23, 1.76E-23, 3.50E-23,
     Q     1.71E-23, 1.71E-23, 1.71E-23, 1.71E-23, 1.71E-23, 2.68E-23,
     R     1.00E-23, 1.00E-23, 1.00E-23, 1.00E-23, 1.00E-23, 1.00E-23/)
     *     , (/ NW, NKO2 /) ),
     *WTKO2(NKO2) = (/0.05,0.20,0.25,0.25,0.20,0.05/),
     *STPMOL=2.68714D+19

      REAL*8 , SAVE :: ZTABLE(LX+1,11)
      INTEGER, SAVE :: NL0
      INTEGER, SAVE :: IFIRST=1
      REAL*8 FSUM,SUMMOL,ZCOS,WSUM,TAU,DLFLUX,WTI,WTJ
      INTEGER I,J,K,L,JI,JJ,N,LL

      if ( present(GETO2A_flag) ) goto 777

      IF(IFIRST==1) THEN
        NL0=NL
        DO N=1,NL0
          ULGAS(N,4)=PPMV80(4)*0.8D0*(PLB0(N)-PLB0(N+1))/PLB0(1)
        END DO
        IFIRST=0
      ENDIF

      FSUM = SUM(SFWM2(:))
      ZTABLE(NL0+1,:) = FSUM

      SUMMOL=0.D0
      DO 150 L=NL0,1,-1
      SUMMOL=SUMMOL+ULGAS(L,4)*STPMOL
      DO 140 J=1,NZ
      ZCOS=0.01D0*(1/J)+0.1D0*(J-1)
      FSUM=0.D0
      DO 130 I=1,NW
      WSUM=0.D0
      DO 120 K=1,NKO2
      TAU = SIGMA(I,K)*SUMMOL/ZCOS ; IF (TAU > 30) TAU=30
      WSUM=WSUM+WTKO2(K)*EXP(-TAU)
  120 CONTINUE
      FSUM=FSUM+WSUM*SFWM2(I)
  130 CONTINUE
      ZTABLE(L,J)=FSUM
  140 CONTINUE
  150 CONTINUE
      DO 160 J=1,NZ
      DO 160 L=1,NL0
      DLFLUX=ZTABLE(L+1,J)-ZTABLE(L,J)
      ZTABLE(L,J)=DLFLUX/1366.D0
  160 CONTINUE

      RETURN

C-----------------
!      ENTRY GETO2A
C-----------------
 777  continue

C              ---------------------------------------------------------
C              UV absorption by Oxygen is expressed as a fraction of the
C              total solar flux S0. Hence, O2FHRL(L)=ZTABLE(L,J) must be
C              normalized within SOLARM, dividing the GETO2A absorptions
C              O2FHRL(L) and O2FHRB(L) by the fraction of the solar flux
C              within the spectral interval DKS0(15), nominally by 0.05.
C              ---------------------------------------------------------
                          ! offline: may not yet work properly if NL>NL0
      ZCOS=1.D0+10.D0*COSZ
      JI=ZCOS ; IF (JI > 10) JI=10
      JJ=JI+1
      WTJ=ZCOS-JI
      WTI=1.0-WTJ
      O2FHRL(L1:NL) = WTI*ZTABLE(L1:NL,JI) + WTJ*ZTABLE(L1:NL,JJ)
      O2FHRB(L1:NL) =     ZTABLE(L1:NL,6)

      RETURN
      END SUBROUTINE SETO2A



      subroutine GETBAK 1,1
      call SETBAK(1)
      end subroutine GETBAK


      SUBROUTINE SETBAK( GETBAK_flag ) 2
      IMPLICIT NONE
      INTEGER, optional :: GETBAK_flag
C     ------------------------------------------------------------------
C     SETBAK,GETBAK  Initializes Background Aerosol Specification, i.e.,
C                    Aerosol Composition and Distribution that is set in
C                    RADPAR by AGOLDH, BGOLDH, CGOLDH Factors
C                    and controlled by FGOLDH ON/OFF Scaling Parameters.
C                    Optional tracers may be added in SETAER/GETAER
C     ------------------------------------------------------------------
C     Tau Scaling Factors:    Solar    Thermal    apply to:
c                             FSTAER   FTTAER  ! Total Aerosol
c                             FSBAER   FTBAER  ! Bgrnd Aerosol
C
C     Control Parameters/Aerosol Scaling (kill) Factors
C                        FSTAER    SW   (All-type) Aerosol Optical Depth
C                        FTTAER    LW   (All-type) Aerosol Optical Depth
C                        FSBAER    SW   SETBAKonly Aerosol Optical Depth
C                        FTBAER    LW   SETBAKonly Aerosol Optical Depth
C                        -----------------------------------------------

      REAL*8,  SAVE :: SRAX(LX,6,5),SRAS(LX,6,5),SRAC(LX,6,5)
      INTEGER, SAVE :: IFIRST=1
      INTEGER, SAVE :: NL0=0

      REAL*8 SGOLDH(5),TGOLDH(5),C,BC,ABC,HXPB,HXPT,ABCD
      INTEGER I,J,K,L,JJ

      if ( present(GETBAK_flag) ) goto 777

C**** Background aerosols
C     ------------------------------------------------------------------
C     Thermal: Set (5) Aerosol Type Compositions & Vertical Distribution
C     ------------------------------------------------------------------
      IF(IFIRST==1) THEN
        NL0=NL
        IFIRST=0
      ENDIF

      TRAX(:,:,:)=0                          ! 1:NL0,1:NKBAND,1:5

      DO 105 I=1,11
      DO 103 J=1,5
      IF(AGOLDH(I,J) < 1.D-06) GO TO 103
      C=CGOLDH(I,J)
      BC=EXP(-BGOLDH(I,J)/C)
      ABC=AGOLDH(I,J)*(1.D0+BC)

      HXPB=1.D0
      DO 102 L=1,NL0
      HXPT=HLB0(L+1)/C                       ! orig. hlb not hlb0
      IF(HXPT > 80.D0) GO TO 102
      HXPT=EXP(HXPT)
      ABCD=ABC/(1.D0+BC*HXPB)
     +    -ABC/(1.D0+BC*HXPT)
      HXPB=HXPT
      TRAX(L,:,J)=TRAX(L,:,J)+ABCD*(TRAQEX(:,I)-TRAQSC(:,I)) ! 1:NKBAND
  102 CONTINUE
  103 CONTINUE
      TRAQAB(:,I)=TRAQEX(:,I)-TRAQSC(:,I)
  105 CONTINUE

      TRBALK(:,:)=0                          ! 1:NL0,1:NKBAND

C-----------------------------------------------------------------------
C     SOLAR:   Set (5) Aerosol Type Compositions & Vertical Distribution
C-----------------------------------------------------------------------

      SRAX(:,:,:) = 1.D-20                   ! 1:NL0,1:6,1:5
      SRAS(:,:,:) = 1.D-30
      SRAC(:,:,:) = 0

      DO 114 I=1,11
      DO 113 J=1,5
      IF(AGOLDH(I,J) < 1.D-06) GO TO 113
      C=CGOLDH(I,J)
      BC=EXP(-BGOLDH(I,J)/C)
      ABC=AGOLDH(I,J)*(1.D0+BC)

      HXPB=1.D0
      DO 112 L=1,NL0
      HXPT=HLB0(L+1)/C                       ! orig. hlb not hlb0
      IF(HXPT > 80.D0) GO TO 112
      HXPT=EXP(HXPT)
      ABCD=ABC/(1.D0+BC*HXPB)
     +    -ABC/(1.D0+BC*HXPT)
      HXPB=HXPT
      SRAX(L,:,J) = SRAX(L,:,J) + ABCD*SRAQEX(:,I)
      SRAS(L,:,J) = SRAS(L,:,J) + ABCD*SRAQSC(:,I)
      SRAC(L,:,J) = SRAC(L,:,J) + ABCD*SRAQCB(:,I)*SRAQSC(:,I)
  112 CONTINUE
  113 CONTINUE
  114 CONTINUE

      SRAC(:,:,:) = SRAC(:,:,:)/SRAS(:,:,:)  ! 1:NL0,1:6,1:5

      SRBEXT(:,:) = 1.D-20                   ! 1:NL0,1:6
      SRBSCT(:,:) = 0
      SRBGCB(:,:) = 0
!nu   SRBPI0(:,:) = 0

      RETURN

C-----------------
!      ENTRY GETBAK
C-----------------
 777  continue
C     ------------------------------------------------------------------
C     GETBAK   Specifies Background Aerosol Contribution and Initializes
C                    (1) Thermal Radiation Aerosol Coefficient Table:
C                        TRAALK(L,K), for (L=1,NL), (K=1,33)
C
C                    (2) Solar Radiation Coefficient Tables:
C                        SRAEXT(L,K),SRASCT(L,K),SRAGCB(L,K) for (K=1,6)
C                    ---------------------------------------------------
C     Warning: MRELAY-section missing: not ready if NL.ne.NL0
C                                                              (Thermal)
C                                                              ---------
      TGOLDH(:)=FTTAER*FTBAER*FGOLDH(:)      ! 1:5
      DO 202 K=1,33
      DO 202 L=L1,NL0
      TRBALK(L,K) = SUM( TGOLDH(:)*TRAX(L,K,:) ) + 1.D-20
  202 CONTINUE

C                                                                (Solar)
C                                                                -------

      SGOLDH(:)=FSTAER*FSBAER*FGOLDH(:)      ! 1:5
      DO 212 K=1,6
      DO 212 L=L1,NL0
      SRBEXT(L,K) = SUM(SGOLDH(:)*SRAX(L,K,:)) + 1.D-20
      SRBSCT(L,K) = SUM(SGOLDH(:)*SRAS(L,K,:)) + 1.D-30
      SRBGCB(L,K) = SUM(SGOLDH(:)*SRAS(L,K,:)*SRAC(L,K,:)) / SRBSCT(L,K)
  212 CONTINUE


      RETURN
      END SUBROUTINE SETBAK



      subroutine GETAER 2,1
      call SETAER(1)
      end subroutine GETAER


      SUBROUTINE SETAER( GETAER_flag ) 2,7
cc    INCLUDE  'rad00def.radCOMMON.f'
      IMPLICIT NONE
      INTEGER, optional :: GETAER_flag
C     ---------------------------------------------------------------
C     GISS MONTHLY-MEAN (1850-2050)  TROPOSPHERIC AEROSOL CLIMATOLOGY
C     ---------------------------------------------------------------

C     Tau Scaling Factors:    Solar    Thermal    apply to:
c                             FSTAER   FTTAER  ! Total Aerosol
c                             FSAAER   FTAAER  ! AClim Aerosol

C     Control Parameters/Aerosol Scaling (kill) Factors
C                        FSTAER    SW   (All-type) Aerosol Optical Depth
C                        FTTAER    LW   (All-type) Aerosol Optical Depth
C                        FSAAER    SW   AClim Aer  Aerosol Optical Depth
C                        FTAAER    LW   AClim Aer  Aerosol Optical Depth
C                        -----------------------------------------------

!nu   DIMENSION ATAU09(9)
cc    DIMENSION PLBA09(10)          !       Aerosol data pressure levels
cc    DATA PLBA09/1010.,934.,854.,720.,550.,390.,255.,150.,70.,10./
      REAL*8, PARAMETER, dimension(4) ::
C              Crystallization RH               Deliquescence RH
     *  RHC=(/.38d0,.47d0,.28d0,.38d0/), RHD=(/.80d0,.75d0,.62d0,.80d0/)

C     ------------------------------------------------------------------
C                  Define aerosol size according to REFDRY specification
C                                      (if KRHAER(NA)=0, REFWET is used)
C                  FRSULF= Sulfate fraction of basic aerosol composition
C
C          Set size SO4 (NA=1) = Sulfate aerosol  (Nominal dry Reff=0.2)
C          Set size SEA (NA=2) = SeaSalt aerosol  (Nominal dry Reff=1.0)
C          Set size ANT (NA=3) = Nitrate aerosol  (Nominal dry Reff=0.3)
C          Set size OCX (NA=4) = Organic aerosol  (Nominal dry Reff=0.3)
C     ------------------------------------------------------------------
      REAL*8 AREFF, XRH,FSXTAU,FTXTAU,SRAGQL,RHFTAU,q55,RHDNA,RHDTNA
      REAL*8 ATAULX(LX,6),TTAULX(LX,ITRMAX),SRBGQL,FAC
      INTEGER NRHNAN(LX,8),K,L,NA,N,NRH,M,KDREAD,NT

      if ( present(GETAER_flag) ) goto 200

      IF(MADAER <= 0) GO TO 150
      DO 110 NA=1,4
      AREFF=REFDRY(NA)*ref_mult
!nu   IF(KRHAER(NA) < 0) AREFF=REFWET(NA)
      CALL GETMIE(NA,AREFF,SRHQEX(1,1,NA),SRHQSC(1,1,NA),SRHQCB(1,1,NA)
     +                    ,TRHQAB(1,1,NA),Q55DRY(NA))
      DRYM2G(NA)=0.75D0/DENAER(NA)*Q55DRY(NA)/AREFF
!nu   IF(KRHAER(NA) < 0) DRYM2G(NA)=WETM2G(NA)
      RHINFO(1,1,NA)=0.D0                                     !  Rel Hum
      RHINFO(1,2,NA)=1.D0                                     !  TAUFAC
      RHINFO(1,3,NA)=AREFF                                    !  AerSize
      RHINFO(1,4,NA)=0.D0                                     !  LW g/m2
      RHINFO(1,5,NA)=1.33333333D0*AREFF*DENAER(NA)/Q55DRY(NA) !  Dryg/m2
      RHINFO(1,6,NA)=1.33333333D0*AREFF*DENAER(NA)/Q55DRY(NA) !  Totg/m2
      RHINFO(1,7,NA)=1.D0                                     !  Xmas fr
      RHINFO(1,8,NA)=DENAER(NA)                               !  Density
      RHINFO(1,9,NA)=Q55DRY(NA)                               !  Q55 Ext
  110 CONTINUE

C     Set size BCI (NA=5) = Black Carbon (Industrial) (Nominal Reff=0.1)
C     Set size BCB (NA=6) = Black Carbon (BioBurning) (Nominal Reff=0.1)
C     ------------------------------------------------------------------
      DO 120 NA=5,6
      AREFF=REFDRY(NA)*ref_mult
      CALL GETMIE(NA,AREFF,SRBQEX(1,NA),SRBQSC(1,NA),SRBQCB(1,NA)
     +                    ,TRBQAB(1,NA),Q55DRY(NA))
      DRYM2G(NA)=0.75D0/DENAER(NA)*Q55DRY(NA)/AREFF
  120 CONTINUE

              !      Extend default dry aerosol coefficients for N=2,190
      DO 135 N=2,190
      DO 135 NA=1,4
      SRHQEX(:,N,NA) = SRHQEX(:,1,NA)   !  1:6
      SRHQSC(:,N,NA) = SRHQSC(:,1,NA)   !  1:6
      SRHQCB(:,N,NA) = SRHQCB(:,1,NA)   !  1:6
      TRHQAB(:,N,NA) = TRHQAB(:,1,NA)   !  1:33
      RHINFO(N,1:9,NA) = RHINFO(1,1:9,NA)
  135 CONTINUE
                          !  Over-write dry coefficients if KRHAER(NA)=1
      KDREAD=71           !  default unit number for offline use only
      DO 140 NA=1,4
!nu   IF(KRHAER(NA) > 0) THEN
      CALL SETREL(REFDRY(NA),NA ,kdread
     A           ,SRUQEX,SRUQSC,SRUQCB
     B           ,TRUQEX,TRUQSC,TRUQCB
     C           ,REFU22,Q55U22,FRSULF
     D      ,SRHQEX(1,1,NA),SRHQSC(1,1,NA),SRHQCB(1,1,NA)
     E      ,TRHQAB(1,1,NA)
     F      ,RHINFO(1,1,NA))
!nu   ENDIF
  140 CONTINUE

  150 CONTINUE
      IF(NTRACE <= 0) RETURN

C**** Optional Tracer aerosols initializations
      DO NT=1,NTRACE
      NA=ITR(NT)
      AREFF=TRRDRY(NT)
      CALL GETMIE(NA,AREFF,SRTQEX(1,1,NT),SRTQSC(1,1,NT),SRTQCB(1,1,NT)
     +                    ,TRTQAB(1,1,NT),Q55)
      RTINFO(1,1,NT)=0.0
      RTINFO(1,2,NT)=1.0
      RTINFO(1,3,NT)=AREFF
      RTINFO(1,4,NT)=0.0
      RTINFO(1,5,NT)=1.33333333D0*AREFF*DENAER(NA)/Q55
      RTINFO(1,6,NT)=1.33333333D0*AREFF*DENAER(NA)/Q55
      RTINFO(1,7,NT)=1.0
      RTINFO(1,8,NT)=DENAER(NA)
      RTINFO(1,9,NT)=Q55
      END DO
            !      Define default dry aerosol coefficients for N=2,190
      DO N=2,190
      DO NT=1,NTRACE
        SRTQEX(:,N,NT) = SRTQEX(:,1,NT)    ! 1:6
        SRTQSC(:,N,NT) = SRTQSC(:,1,NT)    ! 1:6
        SRTQCB(:,N,NT) = SRTQCB(:,1,NT)    ! 1:6
        TRTQAB(:,N,NT) = TRTQAB(:,1,NT)    ! 1:33
        RTINFO(N,1:9,NT) = RTINFO(1,1:9,NT)
      END DO
      END DO
                          !  Over-write dry coefficients if KRHTRA(NT)=1
      KDREAD=71           !  default unit number for offline use only
      DO NT=1,NTRACE
      NA=ITR(NT)
      IF (KRHTRA(NT) > 0 .and. NA <= 4) THEN
      CALL SETREL(TRRDRY(NT),NA,KDREAD
     A           ,SRUQEX,SRUQSC,SRUQCB
     B           ,TRUQEX,TRUQSC,TRUQCB
     C           ,REFU22,Q55U22,FRSULF
     D      ,SRTQEX(1,1,NT),SRTQSC(1,1,NT),SRTQCB(1,1,NT)
     E      ,TRTQAB(1,1,NT)
     F      ,RTINFO(1,1,NT))
      ENDIF
      END DO

      RETURN


C-----------------
!      ENTRY GETAER
C-----------------
  200 continue

      NRHNAN(:,:) = 1
      DO 230 L=L1,NL
      if (RHL(L) > 0.9005D0) then
        XRH = (RHL(L)-0.899499D0)*1000.D0
        NRH = XRH+90 ; if (NRH > 189) NRH=189
      else
        XRH=RHL(L)*100.D0+0.5D0
        NRH=XRH  ;   if (NRH < 0) NRH=0
      endif
      DO 220 NA=1,4
      if (KDELIQ(L,NA)==0) then
        RHDNA = RHD(NA) ; if (KRHDTK==1) RHDNA = RHDTNA(TLM(L),NA)
        if (RHL(L) > RHDNA)   KDELIQ(L,NA)=1
      else
        if (RHL(L) < RHC(NA)) KDELIQ(L,NA)=0
      endif
      NRHNAN(L,NA)=NRH*KDELIQ(L,NA)+1
  220 CONTINUE
  230 CONTINUE

      IF(MADAER <= 0) GO TO 500

      DO NA=1,6
      CALL REPART (A6JDAY(1,NA,ILON,JLAT),PLBA09,10,    ! in
     *             ATAULX(1,NA),PLB,NL+1)               ! out
      END DO

      FSXTAU=FSTAER*FSAAER+1.D-10
      FTXTAU=FTTAER*FTAAER
                           !            (Solar BCI,BCB components)
      DO 250 L=L1,NL
      SRAEXT(L,:)= SRBQEX(:,5)*ATAULX(L,5)*FSXTAU*FS8OPX(5)       ! 1:6
     +            +SRBQEX(:,6)*ATAULX(L,6)*FSXTAU*FS8OPX(6)
      SRASCT(L,:)= SRBQSC(:,5)*ATAULX(L,5)*FSXTAU*FS8OPX(5)
     +            +SRBQSC(:,6)*ATAULX(L,6)*FSXTAU*FS8OPX(6)
      SRAGCB(L,:)=(SRBQSC(:,5)*ATAULX(L,5)*FSXTAU*FS8OPX(5)*SRBQCB(:,5)
     +            +SRBQSC(:,6)*ATAULX(L,6)*FSXTAU*FS8OPX(6)*SRBQCB(:,6))
     /            /(SRASCT(L,:)+1.D-10)
  250 CONTINUE
                          !           (Thermal BCI,BCB components)
      DO 260 L=L1,NL
      TRAALK(L,:) = TRBQAB(:,5)*ATAULX(L,5)*FTXTAU*FT8OPX(5) +   ! 1:33
     +              TRBQAB(:,6)*ATAULX(L,6)*FTXTAU*FT8OPX(6)
      IF(PLB(L) > 10) GO TO 260
      TRAALK(L,:)=0
  260 CONTINUE

      DO 330 NA=1,4
      DO 330 L=L1,NL
      RHFTAU=RHINFO(NRHNAN(L,NA),2,NA)*ATAULX(L,NA)*FSXTAU*FS8OPX(NA)
      DO 330 K=1,6
      SRAEXT(L,K)=SRAEXT(L,K)
     +        +SRHQEX(K,NRHNAN(L,NA),NA)*RHFTAU
      SRAGQL     =SRAGCB(L,K)*SRASCT(L,K)+SRHQCB(K,NRHNAN(L,NA),NA)
     +           *SRHQSC(K,NRHNAN(L,NA),NA)*RHFTAU
      SRASCT(L,K)=SRASCT(L,K)
     +        +SRHQSC(K,NRHNAN(L,NA),NA)*RHFTAU
      SRAGCB(L,K)=SRAGQL/(SRASCT(L,K)+1.D-10)
  330 CONTINUE

      DO 360 NA=1,4
      DO 360 L=L1,NL
      RHFTAU=RHINFO(NRHNAN(L,NA),2,NA)*ATAULX(L,NA)*FTXTAU*FT8OPX(NA)
      TRAALK(L,:)=TRAALK(L,:)+TRHQAB(:,NRHNAN(L,NA),NA)*RHFTAU    ! 1:33
  360 CONTINUE

  500 CONTINUE
      IF(NTRACE <= 0) RETURN

C     ------------------------------------------------------------------
C     Option to add on Tracer Type aerosol thermal & solar contributions
C
C     NOTE:  Aerosol carried as a tracer is assumed to be in kg/m2 units
C     ------------------------------------------------------------------

      DO NT=1,NTRACE
        IF (ITR(NT) == 7) THEN
          FAC = 1d3*.75d0/TRADEN(NT)*RTINFO(1,9,NT)/TRRDRY(NT)
        ELSE
          FAC = 1d3*.75d0/DENAER(ITR(NT))*Q55DRY(ITR(NT))/TRRDRY(NT)
        END IF
        TTAULX(L1:NL,NT) = TRACER(L1:NL,NT) * FAC
      END DO

      FSXTAU=FSTAER*FSBAER+1.D-10
      FTXTAU=FTTAER*FTBAER

      DO 700 NT=1,NTRACE
      NA=ITR(NT)
      DO 700 L=L1,NL
      RHFTAU=RTINFO(NRHNAN(L,NA),2,NT)*TTAULX(L,NT)*FSXTAU
      IF (FSTOPX(NT) > 0) THEN
        RHFTAU=RHFTAU*FSTOPX(NT)
        DO K=1,6
          SRBEXT(L,K)=SRBEXT(L,K)+SRTQEX(K,NRHNAN(L,NA),NT)*RHFTAU
          SRBGQL =SRBGCB(L,K)*SRBSCT(L,K)+SRTQCB(K,NRHNAN(L,NA),NT)
     +           *SRTQSC(K,NRHNAN(L,NA),NT)*RHFTAU
          SRBSCT(L,K)=SRBSCT(L,K)+SRTQSC(K,NRHNAN(L,NA),NT)*RHFTAU
          SRBGCB(L,K)=SRBGQL/(SRBSCT(L,K)+1.D-10)
        END DO
      END IF
      TTAUSV(L,NT)=SRTQEX(6,NRHNAN(L,NA),NT)*RHFTAU
      aesqex(L,:,nt)=srtqex(:,nrhnan(L,na),nt)*rhftau           ! 1:6
      aesqsc(L,:,nt)=srtqsc(:,nrhnan(L,na),nt)*rhftau
      aesqcb(L,:,nt)=srtqcb(:,nrhnan(L,na),nt)*aesqsc(L,:,nt)
  700 CONTINUE

      DO 750 NT=1,NTRACE
      NA=ITR(NT)
      DO 750 L=L1,NL
      RHFTAU=RTINFO(NRHNAN(L,NA),2,NT)*TTAULX(L,NT)*FTXTAU*FTTOPX(NT)
      TRBALK(L,:)=TRBALK(L,:)+TRTQAB(:,NRHNAN(L,NA),NT)*RHFTAU ! 1:33
  750 CONTINUE

      RETURN
      END SUBROUTINE SETAER



      SUBROUTINE UPDAER(JYEARA,JJDAYA) 2,16

cc    INCLUDE 'rad00def.radCOMMON.f'
C     ------------------------------------------------------------------
C     Reads: sep2003_XXX_Koch_kg_m2_72x46x9_1850-1990 aerosol kg/m2 data
C     for SUI,OCI,BCI, and PRE (PRE=SNP,SBP,SSP,ANP,ONP,OBP,ANI,OCB,BCB)
C
C     Makes: A6YEAR(72,46,9,0:12,6), A6JDAY(9,6,72,46) (dry aerosol Tau)
C     ------------------------------------------------------------------

      USE FILEMANAGER, only : openunit,closeunit
      implicit none

      INTEGER, intent(in) :: jyeara,jjdaya
      REAL*4 A6YEAR(72,46,9,0:12,6) !  ,mddust(72,46)
      REAL*4  PREDD(72,46,9,12,10),SUIDD(72,46,9,12,8)
      REAL*4  OCIDD(72,46,9,12, 8),BCIDD(72,46,9,12,8)
      REAL*8  md1850(4,72,46,0:12),anfix(72,46,0:12)
      save A6YEAR,PREDD,SUIDD,OCIDD,BCIDD,md1850,anfix ! ,mddust

      CHARACTER*80 XTITLE
      CHARACTER*40 :: RDFILE(5) = (/                !  Input file names
     1            'sep2003_PRE_Koch_kg_m2_ChinSEA_Liao_1850'
     2           ,'sep2003_SUI_Koch_kg_m2_72x46x9_1875-1990'
     3           ,'sep2003_OCI_Koch_kg_m2_72x46x9_1875-1990'
     4           ,'sep2003_BCI_Koch_kg_m2_72x46x9_1875-1990'
     5           ,'low.dust.72x46.monthly.bin              '/)

      CHARACTER*40 :: RDFGEN(5) = (/                ! generic names
     * 'TAero_PRE','TAero_SUI','TAero_OCI','TAero_BCI','M_LowDust'/)

C                TROPOSPHERIC AEROSOL COMPOSITIONAL/TYPE PARAMETERS
C                   SO4    SEA    ANT    OCX    BCI    BCB   *BCB  *BCB
C     DATA REFDRY/0.200, 1.000, 0.300, 0.300, 0.100, 0.100, 0.200,0.050/
C
C     DATA REFWET/0.272, 1.808, 0.398, 0.318, 0.100, 0.100, 0.200,0.050/
C
C     DATA DRYM2G/4.667, 0.866, 4.448, 5.018, 9.000, 9.000, 5.521,8.169/
C
CKoch DATA DRYM2G/5.000, 2.866, 8.000, 8.000, 9.000, 9.000, 5.521,8.169/
C
C     DATA RHTMAG/1.788, 3.310, 1.756, 1.163, 1.000, 1.000, 1.000,1.000/
C
CRH70 DATA WETM2G/8.345, 2.866, 7.811, 5.836, 9.000, 9.000, 5.521,8.169/
C
C     DATA Q55DRY/2.191, 2.499, 3.069, 3.010, 1.560, 1.560, 1.914,0.708/
C
C     DATA DENAER/1.760, 2.165, 1.725, 1.500, 1.300, 1.300, 1.300,1.300/
C
C     ------------------------------------------------------------------
C          DRYM2G(I) = 0.75/DENAER(I)*Q55DRY(I)/REFDRY(I)
C          WETM2G(I) = DRYM2G(I)*RHTMAG(I)
C          RHTMAG(I) = Rel Humidity TAU Magnification factor  at RH=0.70
C          REFWET(I) = Rel Humidity REFDRY Magnification      at RH=0.70
C     ------------------------------------------------------------------

C     TROP AEROSOL 1850 BACKGROUND, INDUSTRIAL & BIO-BURNING PARAMETERS
C     DATA AERMIX/
C       Pre-Industrial+Natural 1850 Level  Industrial Process  BioMBurn
C       ---------------------------------  ------------------  --------
C        1    2    3    4    5    6    7    8    9   10   11   12   13
C       SNP  SBP  SSP  ANP  ONP  OBP  BBP  SUI  ANI  OCI  BCI  OCB  BCB
C    +  1.0, 1.0, 1.0, 1.0, 2.5, 2.5, 1.9, 1.0, 1.0, 2.5, 1.9, 2.5, 1.9/

C      A6YEAR          PRE                  SUI         OCI        BCI
C     ------------------------------------------------------------------
C     NAER=1=SO4 = SNP*1+SBP*2         +  SUI*I,J
C          2=SEA = SSP*3
C          3=ANT = ANP*4+ANI*0,8
C          4=OCX = ONP*5+OBP*6+OCB*0,9             +  OCI*I,J
C          5=BCI =                                               BCI*I,J
C          6=BCB = BBP*7,BCB*0,10
C     ------------------------------------------------------------------
C     Aerosol input data is from designated source files PRE SUI OCI BCI
C     Aerosol output is accumulated for 6-A6YEAR designated compositions
C           SNP*1 represents AERMIX(1)*PRE(I,J,L,M,1) = 1850 Natural SO4
C           SBP*2 represents AERMIX(2)*PRE(I,J,L,M,2) = 1850 BioBurn SO4
C         SUI*I,J represents AERMIX(8)*(SUI(I,J,L,M,I)intSUI(I,J,L,M,J))
C           SSP*1 represents AERMIX(3)*PRE(I,J,L,M,3) = 1850 SeaSalt
C         BCB*0,10represents AERMIX(11)*(0_interpol_PRE(I,J,L,M,10)) BCB
C         (which is interpolated linearly in time from 0 amount in 1850)
C
C         1850 Background   Sulfate  SO4 = 0.870 Natural + 0.130 BioBurn
C         1850 Background  Sea Salt  SEA =  all Natural-Mean SSP SeaSalt
C         1850 Background AmmNitrate ANT = ANP=(1.26/5.27)*1990(ANP+ANI)
C         1850 Background Org Carbon OCX = 0.162 Natural + 0.838 BioBurn
C         1850 Background Blk Carbon BCI = 0  (No Industrial BC in 1850)
C         1850 Background Blk Carbon BCB = BBP,all of 1850 BC is BioBurn
C     ------------------------------------------------------------------
      logical qexist
      INTEGER, save :: IFILE=11, IFIRST=1, JYRNOW=0

      INTEGER ia,idd,ndd,m,mi,mj,i,j,l,n,jyearx,iys,jys,iyc,jyc
      REAL*8 WTANI,WTOCB,WTBCB,wt75,swti,swtj,cwti,cwtj,xmi,wtmi,wtmj
      REAL*8 , PARAMETER :: Za720=2635. ! depth of low cloud region (m)
      REAL*8 xsslt,byz ! ,xdust
      IF(IFIRST==1) THEN
C                                       READ Input PRE,SUI,OCI,BCI Files
C                                       --------------------------------
      inquire (file=RDFGEN(1),exist=qexist) ! decide whether specific or
      if(qexist) RDFILE=RDFGEN              !     generic names are used
      inquire (file=RDFILE(1),exist=qexist) !     stop if neither exist
      if(.not.qexist) call stop_model('updaer: no TropAero files',255)

!**** Pre-industrial data
      call openunit (RDFILE(1),ifile,.true.,.true.)    ! unformatted,old
      DO 101 IDD=1,10
      DO 101 M=1,12
  101 READ (IFILE) XTITLE,PREDD(:,:,:,M,IDD)
      call closeunit (ifile)
!**** Industrial Sulfates
      call openunit (RDFILE(2),ifile,.true.,.true.)
      DO 102 IDD=1,8
      DO 102 M=1,12
  102 READ (IFILE) XTITLE,SUIDD(:,:,:,M,IDD)
      call closeunit (ifile)
!**** Industrial Organic Carbons
      call openunit (RDFILE(3),ifile,.true.,.true.)
      DO 103 IDD=1,8
      DO 103 M=1,12
  103 READ (IFILE) XTITLE,OCIDD(:,:,:,M,IDD)
      call closeunit (ifile)
!**** Industrial Black Carbons
      call openunit (RDFILE(4),ifile,.true.,.true.)
      DO 104 IDD=1,8
      DO 104 M=1,12
  104 READ (IFILE) XTITLE,BCIDD(:,:,:,M,IDD)
      call closeunit (ifile)

C**** Prepare for aerosol indirect effect parameterization:
C     - Collect the monthly aerosol number densities (an) for the time
C       independent aerosols (desert dust and sea salt)       an:  /cm^3
C     - Save the monthly 1850 mass densities (md) for the time dependent
C       aerosols (Sulfates,Nitrates,Organic & Black Carbons)  md: kg/cm3

!!!   call openunit (RDFILE(5),ifile,.true.,.true.) !neglect desert dust
!!!   xdust=.33/(2000.*4.1888*(.40d-6)**3)     ! f/[rho*4pi/3*r^3] (/kg)
      xsslt=aermix(3)/(2000.*4.1888*(.44d-6)**3) ! x/particle-mass (/kg)
      byz = 1d-6/za720 ! 1d-6/depth in m (+conversion /m3 -> /cm3)
      DO M=1,12
!!!     READ (IFILE) XTITLE,mddust
      DO J=1,46
      DO I=1,72
        anfix(i,j,m) = 0. !!! xdust*mddust(i,j) ! aerosol number (/cm^3)
     +               +    byz * SUM(PREDD(I,J,1:la720,M,3)) * Xsslt
C****   md1850(1:4,i,j,m)  !  mass density (kg/cm^3): SO4, NO3, OC, BCB
        md1850(1,i,j,m) = byz * SUM(AERMIX(1)*PREDD(I,J,1:La720,M,1) +
     +                              AERMIX(2)*PREDD(I,J,1:La720,M,2))
        md1850(2,i,j,m) = byz * SUM(AERMIX(4)*PREDD(I,J,1:La720,M,4))
        md1850(3,i,j,m) = byz * SUM(AERMIX(5)*PREDD(I,J,1:La720,M,5) +
     +                              AERMIX(6)*PREDD(I,J,1:La720,M,6))
        md1850(4,i,j,m) = byz * SUM(AERMIX(7)*PREDD(I,J,1:La720,M,7))
      end do
      end do
      end do
      anfix(:,:,0) = anfix(:,:,12) ; md1850(:,:,:,0) = md1850(:,:,:,12)
!!!   call closeunit (ifile)

      IFIRST=0
      ENDIF


C     To time input data READs, JYEARX is set ahead of JYEARA by 15 days
C     ------------------------------------------------------------------
      if(JYEARA<0) then
        JYEARX = -JYEARA
      else
        JYEARX=MIN(JYEARA+(JJDAYA+15)/366,2050)
      end if

      IF(JYEARX==JYRNOW) GO TO 500    ! Get A6JDAY from current A6YEAR

C     Begin current A6YEAR  with 1850 Background SO4,SEA,ANT,OCX,BCI,BCB
      DO 114 M=1,12
      A6YEAR(:,:,:,M,1) = AERMIX(1)*PREDD(:,:,:,M,1)*1000*DRYM2G(1)
     +                   +AERMIX(2)*PREDD(:,:,:,M,2)*1000*DRYM2G(1)
      A6YEAR(:,:,:,M,2) = AERMIX(3)*PREDD(:,:,:,M,3)*1000*DRYM2G(2)
      A6YEAR(:,:,:,M,3) = AERMIX(4)*PREDD(:,:,:,M,4)*1000*DRYM2G(3)
      A6YEAR(:,:,:,M,4) = AERMIX(5)*PREDD(:,:,:,M,5)*1000*DRYM2G(4)
     +                   +AERMIX(6)*PREDD(:,:,:,M,6)*1000*DRYM2G(4)
      A6YEAR(:,:,:,M,5) = 0
      A6YEAR(:,:,:,M,6) = AERMIX(7)*PREDD(:,:,:,M,7)*1000*DRYM2G(6)
  114 CONTINUE
!****                                   Define 1849 Background  Dec data
      DO N=1,6
        A6YEAR(:,:,:,0,N)=A6YEAR(:,:,:,12,N)
      END DO

      IF(JYEARX > 1850) THEN                           !   (JYEAR>1850)
        WTANI=GLOPOP(JYEARX)
        WTOCB=min( 1d0 , (JYEARX-1850)/140.D0 )
        WTBCB=min( 1d0 , (JYEARX-1850)/140.D0 )
        DO M=1,12            !  Add time dependent JYEAR ANI,OCB,BCB
          A6YEAR(:,:,:,M,3) = A6YEAR(:,:,:,M,3)+
     +        AERMIX( 9)*WTANI*PREDD(:,:,:,M, 8)*1000*DRYM2G(3)
          A6YEAR(:,:,:,M,4) = A6YEAR(:,:,:,M,4)+
     +        AERMIX(12)*WTOCB*PREDD(:,:,:,M, 9)*1000*DRYM2G(4)
          A6YEAR(:,:,:,M,6) = A6YEAR(:,:,:,M,6)+
     +        AERMIX(13)*WTBCB*PREDD(:,:,:,M,10)*1000*DRYM2G(6)
        END DO
        WTANI=GLOPOP(JYEARX-1)
        WTOCB=min( 139/140d0 , (JYEARX-1851)/140.D0 )
        WTBCB=min( 139/140d0 , (JYEARX-1851)/140.D0 )
        M=12        !  Add time dependent JYEAR-1 ANI,OCB,BCB Dec data
        A6YEAR(:,:,:,0,3) = A6YEAR(:,:,:,0,3)+
     +      AERMIX( 9)*WTANI*PREDD(:,:,:,M, 8)*1000*DRYM2G(3)
        A6YEAR(:,:,:,0,4) = A6YEAR(:,:,:,0,4)+
     +      AERMIX(12)*WTOCB*PREDD(:,:,:,M, 9)*1000*DRYM2G(4)
        A6YEAR(:,:,:,0,6) = A6YEAR(:,:,:,0,6)+
     +      AERMIX(13)*WTBCB*PREDD(:,:,:,M,10)*1000*DRYM2G(6)
      ENDIF

      IF(JYEARX > 1850.and.JYEARX < 1876) THEN   !   (1850<JYEAR<1876)
       WT75=(JYEARX-1850)/25.D0
       DO M=1,12          !    Add time dependent JYEAR SUI,OCI,BCI
       A6YEAR(:,:,:,M,1) = A6YEAR(:,:,:,M,1)+
     +                 WT75*SUIDD(:,:,:,M,1)*AERMIX( 8)*1000*DRYM2G(1)
       A6YEAR(:,:,:,M,4) = A6YEAR(:,:,:,M,4)+
     +                 WT75*OCIDD(:,:,:,M,1)*AERMIX(10)*1000*DRYM2G(4)
       A6YEAR(:,:,:,M,5) = A6YEAR(:,:,:,M,5)+
     +                 WT75*BCIDD(:,:,:,M,1)*AERMIX(11)*1000*DRYM2G(5)
       END DO

       WT75=(JYEARX-1851)/25.D0
       M=12          !  Add time dependent JYEAR-1 SUI,OCI,BCI Dec data
       A6YEAR(:,:,:,0,1) = A6YEAR(:,:,:,0,1)+
     +                 WT75*SUIDD(:,:,:,M,1)*AERMIX( 8)*1000*DRYM2G(1)
       A6YEAR(:,:,:,0,4) = A6YEAR(:,:,:,0,4)+
     +                 WT75*OCIDD(:,:,:,M,1)*AERMIX(10)*1000*DRYM2G(4)
       A6YEAR(:,:,:,0,5) = A6YEAR(:,:,:,0,5)+
     +                 WT75*BCIDD(:,:,:,M,1)*AERMIX(11)*1000*DRYM2G(5)
      ENDIF

      IF(JYEARX > 1875) THEN                         !     (JYEAR>1875)
      CALL STREND(JYEARX,IYS,JYS,SWTI,SWTJ)
      CALL CTREND(JYEARX,IYC,JYC,CWTI,CWTJ)
      DO 141 M=1,12            !    Add time dependent JYEAR SUI,OCI,BCI
      DO 141 L=1,9
      DO 141 J=1,46
      DO 141 I=1,72
      A6YEAR(I,J,L,M,1)=A6YEAR(I,J,L,M,1)+AERMIX( 8)*1000.D0*DRYM2G(1)*
     +                 (SWTI*SUIDD(I,J,L,M,IYS)+SWTJ*SUIDD(I,J,L,M,JYS))
      A6YEAR(I,J,L,M,4)=A6YEAR(I,J,L,M,4)+AERMIX(10)*1000.D0*DRYM2G(4)*
     +                 (CWTI*OCIDD(I,J,L,M,IYC)+CWTJ*OCIDD(I,J,L,M,JYC))
      A6YEAR(I,J,L,M,5)=A6YEAR(I,J,L,M,5)+AERMIX(11)*1000.D0*DRYM2G(5)*
     +                 (CWTI*BCIDD(I,J,L,M,IYC)+CWTJ*BCIDD(I,J,L,M,JYC))
      IF(A6YEAR(I,J,L,M,1) < 0.) A6YEAR(I,J,L,M,1)=0.
      IF(A6YEAR(I,J,L,M,4) < 0.) A6YEAR(I,J,L,M,4)=0.
      IF(A6YEAR(I,J,L,M,5) < 0.) A6YEAR(I,J,L,M,5)=0.
  141 CONTINUE

      CALL STREND(JYEARX-1,IYS,JYS,SWTI,SWTJ)
      CALL CTREND(JYEARX-1,IYC,JYC,CWTI,CWTJ)
      M=12            !  Add time dependent JYEAR-1 SUI,OCI,BCI Dec data
      DO 145 L=1,9
      DO 145 J=1,46
      DO 145 I=1,72
      A6YEAR(I,J,L,0,1)=A6YEAR(I,J,L,0,1)+AERMIX( 8)*1000.D0*DRYM2G(1)*
     +                 (SWTI*SUIDD(I,J,L,M,IYS)+SWTJ*SUIDD(I,J,L,M,JYS))
      A6YEAR(I,J,L,0,4)=A6YEAR(I,J,L,0,4)+AERMIX(10)*1000.D0*DRYM2G(4)*
     +                 (CWTI*OCIDD(I,J,L,M,IYC)+CWTJ*OCIDD(I,J,L,M,JYC))
      A6YEAR(I,J,L,0,5)=A6YEAR(I,J,L,0,5)+AERMIX(11)*1000.D0*DRYM2G(5)*
     +                 (CWTI*BCIDD(I,J,L,M,IYC)+CWTJ*BCIDD(I,J,L,M,JYC))
      IF(A6YEAR(I,J,L,0,1) < 0.) A6YEAR(I,J,L,0,1)=0.
      IF(A6YEAR(I,J,L,0,4) < 0.) A6YEAR(I,J,L,0,4)=0.
      IF(A6YEAR(I,J,L,0,5) < 0.) A6YEAR(I,J,L,0,5)=0.
  145 CONTINUE
      ENDIF
      JYRNOW=JYEARX
      if(jyeara<0) then  ! cyclic case
        DO N=1,6
          A6YEAR(:,:,:,0,N)=A6YEAR(:,:,:,12,N)
        END DO
      end if

C      A6JDAY is interpolated daily from A6YEAR seasonal data via JJDAYA
C      -----------------------------------------------------------------

  500 CONTINUE
      XMI=(JJDAYA+JJDAYA+31-(JJDAYA+15)/61+(JJDAYA+14)/61)/61.D0
      MI=XMI
      WTMJ=XMI-MI       !   Intra-year interpolation is linear in JJDAYA
      WTMI=1.D0-WTMJ
      IF(MI > 11) MI=0
      MJ=MI+1
      DO 510 J=1,46
      DO 510 I=1,72
      DO 510 N=1,6
      DO 510 L=1,9
      A6JDAY(L,N,I,J)=WTMI*A6YEAR(I,J,L,MI,N)+WTMJ*A6YEAR(I,J,L,MJ,N)
  510 CONTINUE

C**** Needed for aerosol indirect effect parameterization in GCM
      byz=1d-9/za720
      do j=1,46
      do i=1,72
C**** sea salt, desert dust
         anssdd(i,j) = WTMI*anfix(i,j,mi)+WTMJ*anfix(i,j,mj)
C**** SU4,NO3,OCX,BCB,BCI (reordered: no sea salt, no pre-ind BCI)
        mdpi(:,i,j) = WTMI*md1850(:,i,j,mi) + WTMJ*md1850(:,i,j,mj) !1:4
        mdcur(1,i,j) = SUM (A6JDAY(1:La720,1,I,J)) * byz/drym2g(1)
        mdcur(2,i,j) = SUM (A6JDAY(1:La720,3,I,J)) * byz/drym2g(3)
        mdcur(3,i,j) = SUM (A6JDAY(1:La720,4,I,J)) * byz/drym2g(4)
        mdcur(4,i,j) = SUM (A6JDAY(1:La720,6,I,J)) * byz/drym2g(6)
        mdcur(5,i,j) = SUM (A6JDAY(1:La720,5,I,J)) * byz/drym2g(5)
      end do
      end do

      RETURN        !  A6JDAY(9,6,72,46) is used in GETAER via ILON,JLAT
      END SUBROUTINE UPDAER



      REAL*8 FUNCTION GLOPOP(JYEAR) 2
      IMPLICIT none

C     ----------------------------------------------------------------
C     GLOPOP = normalized global population trend set to unity in 1990
C              based on UN statistics & population projections to 2050
C
C     GLOPOP = 0.000 for 1850 and earlier
C            = 1.000 for 1990
C            = 1.658 for 2050 and later
C     ----------------------------------------------------------------

      INTEGER, intent(in) :: jyear
      REAL*8 :: GPNORM = 5.27-1.26 ,DNGPOP(21), GPOP(21) = (/
C               1850                     1900                     1950
     A          1.26,1.33,1.41,1.49,1.57,1.65,1.75,1.86,2.07,2.30,2.52
C                                        2000                     2050
     B              ,3.02,3.70,4.44,5.27,6.06,6.79,7.50,8.11,8.58,8.91/)
      INTEGER i,iy
      REAL*8 xy,dy

      DO 110 I=1,21
      DNGPOP(I)=(GPOP(I)-GPOP(1))/GPNORM
  110 CONTINUE
      XY=(JYEAR-1840)/10.D0
      IY=XY
      DY=XY-IY
      if (IY <  1) then ; IY =  1 ; DY = 0 ; endif
      if (IY > 20) then ; IY = 20 ; DY = 1 ; endif
      GLOPOP=DNGPOP(IY)+DY*(DNGPOP(IY+1)-DNGPOP(IY))
      RETURN
      END FUNCTION GLOPOP


      SUBROUTINE SETDST 1,1
      IMPLICIT NONE

C     ---------------------------------------------------------------
C     MONTHLY-MEAN DESERT DUST CLIMATOLOGY
C     ---------------------------------------------------------------

C           OUTPUT: via SRDEXT(L,K)   D Dust Extinction Optical Depth
C                       SRDSCT(L,K)   D Dust Scattering Optical Depth
C                       SRDGCB(L,K)   D Dust Asymmetry Parameter  g
C                       TRDALK(L,K)  Thermal Absorption Optical Depth

C     Tau Scaling Factors:    Solar    Thermal    apply to:
C                             FSTAER   FTTAER  ! Total Aerosol
C                             FSDAER   FTDAER  ! Dust  Aerosol
C
C     Control Parameters/Aerosol Scaling (kill) Factors
C                        FSTAER    SW   (All-type) Aerosol Optical Depth
C                        FTTAER    LW   (All-type) Aerosol Optical Depth
C                        FSDAER    SW   Dust Aer   Aerosol Optical Depth
C                        FTDAER    LW   Dust Aer   Aerosol Optical Depth
C                        -----------------------------------------------

C     Select Desert Dust (NA=7) Mie scattering parameters for REDUST(N)
!nu   REAL*8 TAUCON(8),pidust(8)
      !INTEGER, INTENT(IN) :: JYEARD,JJDAYD
      REAL*8 XMI,WTMI,WTMJ,SRDGQL,FSXTAU,FTXTAU,DTAULX(LX+1,8)
      INTEGER I,J,K,L,N,MI,MJ

      DO 110 N=1,8
      CALL GETMIE(7,REDUST(N),QXDUST(1,N),QSDUST(1,N),QCDUST(1,N)
     +                    ,ATDUST(1,N),QDST55(N))
!nu   TAUCON(N)=0.75E+03*QDST55(N)/(RODUST(N)*REDUST(N))
!nu   PIDUST(N)=QSDUST(6,N)/(QXDUST(6,N)+1.D-10)
  110 CONTINUE

      RETURN
      end SUBROUTINE SETDST

C--------------------------------
!      ENTRY UPDDST(JYEARD,JJDAYD)
C--------------------------------

      subroutine UPDDST(JYEARD,JJDAYD) 2
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: JYEARD,JJDAYD
      REAL*8 XMI,WTMI,WTMJ,SRDGQL,FSXTAU,FTXTAU,DTAULX(LX+1,8)
      INTEGER I,J,K,L,N,MI,MJ
C     ------------------------------------------------------------------
C     Makes DDJDAY(9,8,72,46) from TDUST(72,46,9,8,12) read in in RCOMP1
C
C      DDJDAY is interpolated daily from  TDUST seasonal data via JJDAYD
C      -----------------------------------------------------------------
!nu   JYEARX=MIN(JYEARD,(JJDAYD+15)/366,2050)

  500 CONTINUE
      XMI=(JJDAYD+JJDAYD+31-(JJDAYD+15)/61+(JJDAYD+14)/61)/61.D0
      MI=XMI
      WTMJ=XMI-MI       !   Intra-year interpolation is linear in JJDAYD
      WTMI=1.D0-WTMJ
      IF(MI < 1) MI=12
      IF(MI > 12) MI=1
      MJ=MI+1
      IF(MJ > 12) MJ=1
      DO 510 J=1,46
      DO 510 I=1,72
      DO 510 N=1,8
      DO 510 L=1,9
      DDJDAY(L,N,I,J)=WTMI*TDUST(I,J,L,N,MI)+WTMJ*TDUST(I,J,L,N,MJ)
  510 CONTINUE
      RETURN        !  DDJDAY(9,8,72,46) is used in GETDST via ILON,JLAT
      end subroutine UPDDST

C-----------------
!      ENTRY GETDST
C-----------------

      subroutine GETDST 2,1
      IMPLICIT NONE
      REAL*8 XMI,WTMI,WTMJ,SRDGQL,FSXTAU,FTXTAU,DTAULX(LX+1,8)
      INTEGER I,J,K,L,N,MI,MJ

      DO 200 N=1,8
      CALL REPART(DDJDAY(1,N,ILON,JLAT),PLBA09,10,DTAULX(1,N),PLB,NL+1)
  200 CONTINUE

C                     Apply Solar/Thermal Optical Depth Scaling Factors
C                              Dust Aerosol  Solar   FSXD=FSTAER*FSDAER
C                              Dust Aerosol Thermal  FTXD=FSTAER*FTDAER
C                              ----------------------------------------

      FSXTAU=FSTAER*FSDAER+1.D-10
      FTXTAU=FTTAER*FTDAER

      DO 220 K=1,6
      DO 210 L=L1,NL
      SRDEXT(L,K)=2.D-10
      SRDSCT(L,K)=1.D-10
      SRDGCB(L,K)=0.D0
  210 CONTINUE
  220 CONTINUE

      DO 270 L=L1,NL
      DO 260 K=1,6
      SRDGQL=0.
      DO 250 N=1,8
      SRDEXT(L,K)=SRDEXT(L,K)+QXDUST(K,N)*DTAULX(L,N)*FSXTAU*FS8OPX(7)
      SRDSCT(L,K)=SRDSCT(L,K)+QSDUST(K,N)*DTAULX(L,N)*FSXTAU*FS8OPX(7)
      SRDGQL     =SRDGQL +
     +            QCDUST(K,N)*QSDUST(K,N)*DTAULX(L,N)*FSXTAU*FS8OPX(7)
  250 CONTINUE
      SRDGCB(L,K)=SRDGQL/(SRDSCT(L,K)+1.D-10)
  260 CONTINUE
  270 CONTINUE

      DO 280 L=L1,NL
      DO 280 K=1,33
      TRDALK(L,K)= sum (ATDUST(K,:)*DTAULX(L,:)*FTXTAU*FT8OPX(7)) ! 1:8
  280 CONTINUE

      RETURN
      end subroutine GETDST



      subroutine UPDVOL(JYEARV,JDAYVA) 2,1
      INTEGER, INTENT(IN) :: JYEARV,JDAYVA
      call SETVOL(JYEARV,JDAYVA)
      end subroutine UPDVOL


      subroutine GETVOL 2,1
      call SETVOL(GETVOL_flag=1)
      end subroutine GETVOL


      SUBROUTINE SETVOL(JYEARV,JDAYVA,GETVOL_flag) 3,5
      IMPLICIT NONE

      REAL*8, SAVE :: E24LAT(25),EJMLAT(47)
      REAL*8  HLATTF(4),HTPROF(LX+1)
      REAL*8, PARAMETER :: HLATKM(5) = (/15.0, 20.0, 25.0, 30.0, 35.0/)
cx    INTEGER, SAVE :: LATVOL = 0   ! not ok for grids finer than 72x46

!nu   REAL*8, PARAMETER :: htplim=1.d-3
      REAL*8, SAVE :: FSXTAU,FTXTAU
      INTEGER, SAVE :: NJ25,NJJM
      INTEGER, INTENT(IN), optional :: JYEARV,JDAYVA,GETVOL_flag
      INTEGER J,L,MI,MJ,K
      REAL*8 XYYEAR,XYI,WMI,WMJ,SIZVOL !nu ,SUMHTF

C     ------------------------------------------------------------------
C     Tau Scaling Factors:    Solar    Thermal    apply to:
c                             FSTAER   FTTAER  ! Total Aerosol
c                             FSVAER   FTVAER  ! SETVOL Aer

C     Control Parameters/Aerosol Scaling (kill) Factors
C                        FSTAER    SW  (All-type) Aerosol Optical Depth
C                        FTTAER    LW  (All-type) Aerosol Optical Depth
C                        FSVAER    SW  SETVOLonly Aerosol Optical Depth
C                        FTVAER    LW  SETVOLonly Aerosol Optical Depth
C                        -----------------------------------------------

C     -----------------------------------------------------------------
C     VEFF0   Selects Size Distribution Variance (this affects Thermal)
C     REFF0   Selects Effective Particle Size for Archive Volcanic Data
C     -----------------------------------------------------------------

      if ( present(JYEARV) ) goto 777 ! UPDVOL
      if ( present (GETVOL_flag) ) goto 778 ! GETVOL

      FSXTAU=FSTAER*FSVAER
      FTXTAU=FTTAER*FTVAER

C                   Set Grid-Box Edge Latitudes for Data Repartitioning
C                   ---------------------------------------------------
      NJ25=25
      DO 110 J=2,24
      E24LAT(J)=-90.D0+(J-1.5D0)*180.D0/23.D0
  110 CONTINUE
      E24LAT( 1)=-90.D0
      E24LAT(25)= 90.D0
      NJJM=46+1
      DO 120 J=2,46
      EJMLAT(J)=-90.D0+(J-1.5D0)*180.D0/(MLAT46-1)
  120 CONTINUE
      EJMLAT(   1)=-90.D0
      EJMLAT(NJJM)= 90.D0

      HTPROF(:)=0

C                       -----------------------------------------------
C                       Initialize H2SO4 Q,S,C,A Tables for Input VEFF0
C                       -----------------------------------------------
C     ------------------
      CALL SETQVA(VEFF0)
C     ------------------

      RETURN


C--------------------------------
!      ENTRY UPDVOL(JYEARV,JDAYVA)
C--------------------------------
 777  continue

C                                          (Makiko's 1850-1999 data)
C                                          -------------------------
      XYYEAR=JYEARV+JDAYVA/366.D0
      IF(XYYEAR < 1850.D0) XYYEAR=1850.D0
      XYI=(XYYEAR-1850.D0)*12.D0+1.D0
      IF(XYI > 1799.999D0) XYI=1799.999D0
      MI=XYI
      WMJ=XYI-MI
      WMI=1.D0-WMJ
      MJ=MI+1
      DO 250 J=1,24
      GDATA(J)=WMI*V4TAUR(MI,J,5)+WMJ*V4TAUR(MJ,J,5)
  250 CONTINUE
      CALL RETERP(GDATA,E24LAT,NJ25,SIZLAT,EJMLAT,NJJM)
      DO 270 K=1,4
      DO 260 J=1,24
      FDATA(J)=WMI*V4TAUR(MI,J,K)+WMJ*V4TAUR(MJ,J,K)
  260 CONTINUE
      CALL RETERP(FDATA,E24LAT,NJ25,HTFLAT(1,K),EJMLAT,NJJM)
  270 CONTINUE
!nu   DO J=1,46
      TAULAT(J) = SUM (HTFLAT(J,:))
!nu   END DO

      RETURN


C-----------------
!      ENTRY GETVOL
C-----------------
 778   continue
cx    IF(MRELAY > 0)    GO TO 300
cx    IF(JLAT==LATVOL) GO TO 350  ! not ok for grids finer than 72x46

C                      Set JLAT Dependent Aerosol Distribution and Size
C                      ------------------------------------------------
cx300 CONTINUE

      HLATTF(1:4)=HTFLAT(JLAT,1:4)
      CALL REPART(HLATTF,HLATKM,5,HTPROF,HLB0,NL+1)
!nu   LHPMAX=0       ! not used
!nu   LHPMIN=NL      ! not used
!nu   DO L=L1,NL
!nu     N=NL+1-L
!nu     IF(HTPROF(L) >= HTPLIM) LHPMAX=L
!nu     IF(HTPROF(N) >= HTPLIM) LHPMIN=N
!nu   END DO
!nu   SUMHTF=1.D-10
      DO 330 L=L1,NL
      IF(HTPROF(L) < 0.) HTPROF(L)=0.D0
!nu   SUMHTF=SUMHTF+HTPROF(L)
  330 CONTINUE

      SIZVOL=SIZLAT(JLAT)

C                        Select H2SO4 Q,S,C,A Tables for  Size = SIZVOL
C                        ----------------------------------------------

C------------------------
      CALL GETQVA(SIZVOL)
C------------------------

cx    LATVOL=JLAT
cx350 CONTINUE
C                                  ------------------------------------
C                                  H2SO4 Thermal Contribution in TRVALK
C                                  ------------------------------------
      DO 420 K=1,33
      TRVALK(L1:NL,K)=HTPROF(L1:NL)*AVH2S(K)*FTXTAU*FT8OPX(8)
  420 CONTINUE

C                      H2SO4 Solar Contribution in SRVEXT,SRVSCT,SRVGCB
C                      ------------------------------------------------

      DO 440 K=1,6
      SRVEXT(L1:NL,K)=QVH2S(K)*HTPROF(L1:NL)*FSXTAU*FS8OPX(8)
      SRVSCT(L1:NL,K)=SVH2S(K)*HTPROF(L1:NL)*FSXTAU*PIVMAX*FS8OPX(8)
      SRVGCB(L1:NL,K)=GVH2S(K)
  440 CONTINUE

      RETURN
      END SUBROUTINE SETVOL



      subroutine GETQVA(SIZVOL) 2,1
      REAL*8, INTENT(IN) :: SIZVOL
      call SETQVA(SIZVOL=SIZVOL)
      end subroutine GETQVA


      SUBROUTINE SETQVA(VEFF,SIZVOL) 2,16
      IMPLICIT NONE
C     ------------------------------------------------------------------
C     SETQVA   Selects (interpolates) H2SO4 Mie Parameters for specified
C              Variance VEFF for subsequent Size interpolation by GETQVA
C     ------------------------------------------------------------------

ceq   REAL*8 SRQV( 6,20),SRSV( 6,20),SRGV( 6,20),Q55V(   20),REFV(20)
ceq   REAL*8 TRQV(33,20),TRSV(33,20),TRGV(33,20),TRAV(33,20),VEFV(20)
      REAL*8 TRAB(33,20),Q5(5),RV20(20),QV20(20)
      REAL*8, PARAMETER ::  V5(5)=(/ .1d0, .2d0, .3d0, .4d0, .5d0/)
      SAVE TRAB

C     ------------------------------------------------------------------
C     SRVQEX Volcanic Aerosol sizes (Reff) range from 0.1 to 5.0 microns
C     To utilize equal interval interpolation, Reff N=9,20 are redefined
C     so Volcanic Aerosol sizes have effective range of 0.1-2.0 microns.
C     ------------------------------------------------------------------
      REAL*8, INTENT(IN), optional :: SIZVOL,VEFF
      REAL*8 REFN,RADX,WTJHI,WTJLO
      INTEGER I,K,N,JRXLO,JRXHI

      if ( present(SIZVOL) ) goto 777

      DO 130 N=1,20
      RV20(N)=REFV20(N,1)
      VEFV(N)=VEFF
      REFV(N)=N/10.D0
      Q5(:) = Q55V20(N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,Q55V(N),1.D0,1.D0,1)
      DO 115 K=1,6
      Q5(:) = SRVQEX(K,N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,SRQV(K,N),1.D0,1.D0,1)
      Q5(:) = SRVQSC(K,N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,SRSV(K,N),1.D0,1.D0,1)
      Q5(:) = SRVQCB(K,N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,SRGV(K,N),1.D0,1.D0,1)
  115 CONTINUE
      DO 120 K=1,33
      Q5(:) = TRVQEX(K,N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,TRQV(K,N),1.D0,1.D0,1)
      Q5(:) = TRVQSC(K,N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,TRSV(K,N),1.D0,1.D0,1)
      Q5(:) = TRVQCB(K,N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,TRGV(K,N),1.D0,1.D0,1)
      Q5(:) = TRVQAL(K,N,:5)
      CALL SPLINE(V5,Q5,5,VEFF,TRAV(K,N),1.D0,1.D0,1)
  120 CONTINUE
      TRAB(:,N) = TRQV(:,N)-TRSV(:,N)    ! 1:33
  130 CONTINUE

      QV20(:) = Q55V(:)                  ! 1:20
      DO 132 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,Q55V(N),1.D0,1.D0,1)
  132 CONTINUE
      DO 140 K=1,6
      QV20(:) = SRQV(K,:)
      DO 134 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,SRQV(K,N),1.D0,1.D0,1)
  134 CONTINUE
      QV20(:) = SRSV(K,:)
      DO 136 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,SRSV(K,N),1.D0,1.D0,1)
  136 CONTINUE
      QV20(:) = SRGV(K,:)
      DO 138 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,SRGV(K,N),1.D0,1.D0,1)
  138 CONTINUE
  140 CONTINUE
      DO 150 K=1,33
      QV20(:) = TRQV(K,:)
      DO 142 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,TRQV(K,N),1.D0,1.D0,1)
  142 CONTINUE
      QV20(:) = TRSV(K,:)
      DO 144 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,TRSV(K,N),1.D0,1.D0,1)
  144 CONTINUE
      QV20(:) = TRGV(K,:)
      DO 146 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,TRGV(K,N),1.D0,1.D0,1)
  146 CONTINUE
      QV20(:) = TRAV(K,:)
      DO 148 N=9,20
      REFN=REFV(N)
      CALL SPLINE(RV20,QV20,20,REFN,TRAV(K,N),1.D0,1.D0,1)
  148 CONTINUE
      DO 149 N=9,20
      TRAB(K,N)=TRQV(K,N)-TRSV(K,N)
  149 CONTINUE
  150 CONTINUE

      RETURN

C-------------------------
!      ENTRY GETQVA(SIZVOL)
C-------------------------
 777  continue
C     ------------------------------------------------------------------
C     Volcanic Aerosol sizes have effective range of  0.1 - 2.0 microns.
C     ------------------------------------------------------------------

      RADX=SIZVOL*10.D0
      IF(RADX < 1.000001D0) RADX=1.000001D0
      IF(RADX > 19.99999D0) RADX=19.99999D0
      JRXLO=RADX
      WTJHI=RADX-JRXLO
      WTJLO=1.D0-WTJHI
      JRXHI=JRXLO+1

      QVH2S(:) = WTJLO*SRQV(:,JRXLO) + WTJHI*SRQV(:,JRXHI)   ! 1:6
      SVH2S(:) = WTJLO*SRSV(:,JRXLO) + WTJHI*SRSV(:,JRXHI)
      GVH2S(:) = WTJLO*SRGV(:,JRXLO) + WTJHI*SRGV(:,JRXHI)

      Q55H2S=WTJLO*Q55V(JRXLO)+WTJHI*Q55V(JRXHI)

      AVH2S(:) = WTJLO*TRAB(:,JRXLO) + WTJHI*TRAB(:,JRXHI)   ! 1:33

      RETURN
      END SUBROUTINE SETQVA


      SUBROUTINE SETCLD 1
      IMPLICIT NONE
C-----------------------------------------------------------------------
C     Control Parameters used in SETCLD,GETCLD,GETEPS: defined in RADPAR
C
C             ICE012  Selects Water, Non-Mie, Mie  Ice Cloud Qex,Qsc,Pi0
C             TAUWC0  Minimum Optical Depth for Water Clouds
C             TAUIC0  Minimum Optical Depth for   Ice Clouds
C             FCLDTR  Scaling Factor for Thermal Cloud Optical Depth
C             FCLDSR  Scaling Factor for  Solar  Cloud Optical Depth
C             EPSCON  Column Cloud Inhomogeneity EPSILON (when KCLDEP=1)
C             KCLDEP  Selects Cloud Inhomogeneity Option (0-4):
C                     KCLDEP =  0  Sets Column CLDEPS to Zero
C                     KCLDEP =  1  Sets Column CLDEPS to EPSCON
C                     KCLDEP =  2  Keeps whatever is specified in CLDEPS
C                     KCLDEP =  3  Uses: Column EPCOL(72,46) Climatology
C                     KCLDEP =  4  Uses: Ht Dep EPLOW, EPMID, EPHIG Data
C
C-----------------------------------------------------------------------
C                    Define Cloud Absorption Cross-Sections
C
C     Selected by:   ICE012 = 0    Liquid Water Droplets   (N =  1 -  5)
C                    ICE012 = 1    Ice - Non-Spherical     (N =  6 - 10)
C                    ICE012 = 2    Ice - Mie (Spherical)   (N = 11 - 15)
C
C     Define Solar,Thermal Cloud Single Scattering Albedo: SRCQPI( 6,15)
C                                                          TRCQPI(33,15)
C-----------------------------------------------------------------------
      !INTEGER, INTENT(IN) :: JYEARE,JJDAYE
      REAL*8 SIZWCL,SIZICL,XRW,XMW,XPW,EPS,VEP,VEP1,VEP2,VEPP,TAUWCL
     *     ,TAUICL,QAWATK,QPWATK,SRCGFW,QXWATK,QSWATK,QGWATK,XRI,XMI,XPI
     *     ,QAICEK,QPICEK,SRCGFC,QXICEK,QSICEK,QGICEK,SCTTAU,GCBICE
     *     ,SCTGCB,TCTAUW,TCTAUC,ALWATK,WTI,WTW,ALICEK,TRCTCI,XJDAY,XMO
     *     ,WTMJ,WTMI
      INTEGER I,J,N,K,L,LBOTCW,LTOPCW,LBOTCI,LTOPCI,IRWAT,IRICE,MI,MJ

      TRCQAB(:,:)=TRCQEX(:,:)-TRCQSC(:,:)   ! 1:33,1:15
      TRCQPI(:,:)=TRCQSC(:,:)/TRCQEX(:,:)

      SRCQPI(:,:)=SRCQSC(:,:)/SRCQEX(:,:)   ! 1:6,1:15

C                          Initialize  GETCLD Output Parameters to Zero
C                          --------------------------------------------
      TRCTCA(:)=0          ! 1:33
      TRCALK(:,:)=0        ! 1:NL,1:33
      SRCEXT(:,:)=1.D-20   ! 1:NL,1:6
      SRCSCT(:,:)=0
      SRCGCB(:,:)=0

      RETURN
      end SUBROUTINE SETCLD
C-----------------
!      ENTRY GETCLD
C-----------------

      subroutine GETCLD 1
      IMPLICIT NONE
      REAL*8 SIZWCL,SIZICL,XRW,XMW,XPW,EPS,VEP,VEP1,VEP2,VEPP,TAUWCL
     *     ,TAUICL,QAWATK,QPWATK,SRCGFW,QXWATK,QSWATK,QGWATK,XRI,XMI,XPI
     *     ,QAICEK,QPICEK,SRCGFC,QXICEK,QSICEK,QGICEK,SCTTAU,GCBICE
     *     ,SCTGCB,TCTAUW,TCTAUC,ALWATK,WTI,WTW,ALICEK,TRCTCI,XJDAY,XMO
     *     ,WTMJ,WTMI
      INTEGER I,J,N,K,L,LBOTCW,LTOPCW,LBOTCI,LTOPCI,IRWAT,IRICE,MI,MJ

C-----------------------------------------------------------------------
C           Define:    TRCALK(LX,33)  Thermal Radiation Cloud Absorption
C                      TRCTCA(33)     Thermal Radiation Top Cloud Albedo
C
C                      SRCEXT(LX,6)   Solar Radiation Cloud Ext Op Depth
C                      SRCSCT(LX,6)   Solar Radiation Cloud Sct Op Depth
C                      SRCGCB(LX,6)   Solar Radiation Cloud Asym Param g
C
C                         LTOPCL      Top Cloud Layer Location
C                         LBOTCL      Bot Cloud Layer Location
C
C                         LTOPCW      Top Water Cloud Layer Location
C                         LBOTCW      Bot Water Cloud Layer Location
C
C                         LTOPCI      Top Ice Cloud Layer Location
C                         LBOTCI      Bot Ice Cloud Layer Location
C
C-----------------------------------------------------------------------

      LBOTCW=0
      LTOPCW=0
      LBOTCI=0
      LTOPCI=0
      TRCTCA(:)=0              ! 1:33
      DO 280 L=L1,NL
      TRCALK(L,:)=0
      SRCEXT(L,:)=1.D-20       ! 1:6
      SRCSCT(L,:)=1.D-30
      SRCGCB(L,:)=0
      SRCPI0(L,:)=0
C                                         Water Cloud Size Interpolation
C                                         ------------------------------

      IF(FTAUC*TAUWC(L) > TAUWC0) THEN
      SIZWCL=SIZEWC(L)
      LTOPCW=L
      IF(LBOTCW==0) LBOTCW=L
      IF(SIZWCL < 15.D0) THEN
      IF(SIZWCL < 3.0D0) SIZWCL=3.0D0
      IRWAT=2
      XRW=SIZWCL/10.0D0-1.00D0
      ELSE
      IF(SIZWCL > 25.D0) SIZWCL=25.D0
      IRWAT=4
      XRW=SIZWCL/10.0D0-2.00D0
      ENDIF
      XMW=1.D0-XRW-XRW
      XPW=1.D0+XRW+XRW
      EPS=CLDEPS(L)
      VEP=EPS/(1.D0-EPS)
      VEP1=1.D0+VEP
      TAUWCL=FTAUC*TAUWC(L)
      DO 240 K=1,33
      QAWATK=XMW*XPW*TRCQAB(K,IRWAT)
     +      -XMW*XRW*TRCQAB(K,IRWAT-1)+XPW*XRW*TRCQAB(K,IRWAT+1)
      QPWATK=XMW*XPW*TRCQPI(K,IRWAT)
     +      -XMW*XRW*TRCQPI(K,IRWAT-1)+XPW*XRW*TRCQPI(K,IRWAT+1)
      VEPP=VEP*QPWATK
      TRCALK(L,K)=TRCALK(L,K)+TAUWCL*QAWATK/(VEP1-VEPP)
  240 CONTINUE
      SRCGFW=SRCGSF(1)
      DO 250 K=1,6
      QXWATK=XMW*XPW*SRCQEX(K,IRWAT)
     +      -XMW*XRW*SRCQEX(K,IRWAT-1)+XPW*XRW*SRCQEX(K,IRWAT+1)
      QSWATK=XMW*XPW*SRCQSC(K,IRWAT)
     +      -XMW*XRW*SRCQSC(K,IRWAT-1)+XPW*XRW*SRCQSC(K,IRWAT+1)
      QGWATK=XMW*XPW*SRCQCB(K,IRWAT)
     +      -XMW*XRW*SRCQCB(K,IRWAT-1)+XPW*XRW*SRCQCB(K,IRWAT+1)
      QPWATK=XMW*XPW*SRCQPI(K,IRWAT)
     +      -XMW*XRW*SRCQPI(K,IRWAT-1)+XPW*XRW*SRCQPI(K,IRWAT+1)
      QGWATK=QGWATK*SRCGFW
      VEPP=VEP*QPWATK
      VEP2=VEP1-VEPP
      SRCEXT(L,K)=SRCEXT(L,K)+TAUWCL*QXWATK/VEP1
      SRCSCT(L,K)=TAUWCL*QSWATK/(VEP1*VEP2)
      SRCGCB(L,K)=QGWATK*VEP2/(VEP1-VEPP*QGWATK)
  250 CONTINUE
      ENDIF
C                                           Ice Cloud Size Interpolation
C                                           ----------------------------
      IF(FTAUC*TAUIC(L) > TAUIC0) THEN
      SIZICL=SIZEIC(L)
      LTOPCI=L
      IF(LBOTCI==0) LBOTCI=L
      IF(SIZICL < 25.D0) THEN
      IF(SIZICL < 3.0D0) SIZICL=3.0D0
      IRICE=2+ICE012*5
      XRI=SIZICL/20.D0-0.75D0
      ELSE
      IF(SIZICL > 75.D0) SIZICL=75.D0
      IRICE=4+ICE012*5
      XRI=SIZICL/50.D0-1.00D0
      ENDIF
      XMI=1.D0-XRI-XRI
      XPI=1.D0+XRI+XRI
      EPS=CLDEPS(L)
      VEP=EPS/(1.D0-EPS)
      VEP1=1.D0+VEP
      TAUICL=FTAUC*TAUIC(L)
      DO 260 K=1,33
      QAICEK=XMI*XPI*TRCQAB(K,IRICE)
     +      -XMI*XRI*TRCQAB(K,IRICE-1)+XPI*XRI*TRCQAB(K,IRICE+1)
      QPICEK=XMI*XPI*TRCQPI(K,IRICE)
     +      -XMI*XRI*TRCQPI(K,IRICE-1)+XPI*XRI*TRCQPI(K,IRICE+1)
      VEPP=VEP*QPICEK
      TRCALK(L,K)=TRCALK(L,K)+TAUICL*QAICEK/(VEP1-VEPP)
  260 CONTINUE

      SRCGFC=SRCGSF(2)
      IF(ICE012==2) SRCGFC=SRCGSF(3)
      DO 270 K=1,6
      QXICEK=XMI*XPI*SRCQEX(K,IRICE)
     +      -XMI*XRI*SRCQEX(K,IRICE-1)+XPI*XRI*SRCQEX(K,IRICE+1)
      QSICEK=XMI*XPI*SRCQSC(K,IRICE)
     +      -XMI*XRI*SRCQSC(K,IRICE-1)+XPI*XRI*SRCQSC(K,IRICE+1)
      QGICEK=XMI*XPI*SRCQCB(K,IRICE)
     +      -XMI*XRI*SRCQCB(K,IRICE-1)+XPI*XRI*SRCQCB(K,IRICE+1)
      QPICEK=XMI*XPI*SRCQPI(K,IRICE)
     +      -XMI*XRI*SRCQPI(K,IRICE-1)+XPI*XRI*SRCQPI(K,IRICE+1)
      QGICEK=QGICEK*SRCGFC
      VEPP=VEP*QPICEK
      VEP2=VEP1-VEPP
      SRCEXT(L,K)=SRCEXT(L,K)+TAUICL*QXICEK/VEP1
      SCTTAU=TAUICL*QSICEK/(VEP1*VEP2)
      GCBICE=QGICEK*VEP2/(VEP1-VEPP*QGICEK)
      SCTGCB=SRCSCT(L,K)*SRCGCB(L,K)+SCTTAU*GCBICE
      SRCSCT(L,K)=SRCSCT(L,K)+SCTTAU
      SRCGCB(L,K)=SCTGCB/SRCSCT(L,K)
  270 CONTINUE
      ENDIF
  280 CONTINUE

C     ------------------------------------------------------------------
C     Identify Top Cloud (LTOPCL) and define top cloud albedo correction
C
C     Full Scattering Correction:      KCLDEM=1   ECLTRA=1.0   (default)
C     Partial(rad99a) Correction:      KCLDEM=0   ECLTRA=1.0
C       No Scattering Correction:      KCLDEM=0   ECLTRA=0.0
C
C     KCLDEM=1 Top-cloud scattering correction uses TXCTPG,TSCTPG,TGCTPG
C              to generate correction (over-rides old ECLTRA correction)
C              (KCLDEM correction is computed in THRMAL at LTOPCL level)
C     ------------------------------------------------------------------

      LTOPCL=LTOPCI
      IF(LTOPCI > LTOPCW) GO TO 330
      IF(LTOPCW < 1) GO TO 350
      LTOPCL=LTOPCW
      TCTAUW=FTAUC*TAUWC(LTOPCL)
      DO 310 K=1,33
      ALWATK=XMW*XPW*TRCQAL(K,IRWAT)
     +      -XMW*XRW*TRCQAL(K,IRWAT-1)+XPW*XRW*TRCQAL(K,IRWAT+1)
      QXWATK=XMW*XPW*TRCQEX(K,IRWAT)
     +      -XMW*XRW*TRCQEX(K,IRWAT-1)+XPW*XRW*TRCQEX(K,IRWAT+1)
      TRCTCA(K)=(1.D0-EXP(-FTAUC*TAUWC(LTOPCL)*QXWATK))*ALWATK*ECLTRA
      QSWATK=XMW*XPW*TRCQSC(K,IRWAT)
     +      -XMW*XRW*TRCQSC(K,IRWAT-1)+XPW*XRW*TRCQSC(K,IRWAT+1)
      QGWATK=XMW*XPW*TRCQCB(K,IRWAT)
     +      -XMW*XRW*TRCQCB(K,IRWAT-1)+XPW*XRW*TRCQCB(K,IRWAT+1)
      TXCTPG(K)=QXWATK*TCTAUW
      TSCTPG(K)=QSWATK*TCTAUW
      TGCTPG(K)=QGWATK
  310 CONTINUE
      LBOTCL=LBOTCW
      IF(LBOTCI < 1) GO TO 360
      IF(LBOTCI <= LBOTCW) LBOTCL=LBOTCI
      IF(LTOPCI==LTOPCW) THEN
      TCTAUW=FTAUC*TAUWC(LTOPCL)
      TCTAUC=FTAUC*TAUIC(LTOPCL)
      WTI=TAUIC(LTOPCL)/(TAUIC(LTOPCL)+TAUWC(LTOPCL))
      WTW=TAUWC(LTOPCL)/(TAUIC(LTOPCL)+TAUWC(LTOPCL))
      DO 320 K=1,33
      ALICEK=XMI*XPI*TRCQAL(K,IRICE)
     +      -XMI*XRI*TRCQAL(K,IRICE-1)+XPI*XRI*TRCQAL(K,IRICE+1)
      QXICEK=XMI*XPI*TRCQEX(K,IRICE)
     +      -XMI*XRI*TRCQEX(K,IRICE-1)+XPI*XRI*TRCQEX(K,IRICE+1)
      TRCTCI=(1.D0-EXP(-FTAUC*TAUIC(LTOPCL)*QXICEK))*ALICEK*ECLTRA
      TRCTCA(K)=WTW*TRCTCA(K)+WTI*TRCTCI
      QSICEK=XMI*XPI*TRCQSC(K,IRICE)
     +      -XMI*XRI*TRCQSC(K,IRICE-1)+XPI*XRI*TRCQSC(K,IRICE+1)
      QGICEK=XMI*XPI*TRCQCB(K,IRICE)
     +      -XMI*XRI*TRCQCB(K,IRICE-1)+XPI*XRI*TRCQCB(K,IRICE+1)
      TXCTPG(K)=TXCTPG(K)+QXICEK*TCTAUC
      SCTGCB=TSCTPG(K)*TGCTPG(K)+QSICEK*TCTAUC*QGICEK
      TSCTPG(K)=TSCTPG(K)+QSICEK*TCTAUC
      TGCTPG(K)=SCTGCB/(1.D-10+TSCTPG(K))
  320 CONTINUE
      ENDIF
      GO TO 360
  330 CONTINUE
      LTOPCL=LTOPCI
      TCTAUC=FTAUC*TAUIC(LTOPCL)
      DO 340 K=1,33
      ALICEK=XMI*XPI*TRCQAL(K,IRICE)
     +      -XMI*XRI*TRCQAL(K,IRICE-1)+XPI*XRI*TRCQAL(K,IRICE+1)
      QXICEK=XMI*XPI*TRCQEX(K,IRICE)
     +      -XMI*XRI*TRCQEX(K,IRICE-1)+XPI*XRI*TRCQEX(K,IRICE+1)
      TRCTCA(K)=(1.D0-EXP(-FTAUC*TAUIC(LTOPCL)*QXICEK))*ALICEK*ECLTRA
      QSICEK=XMI*XPI*TRCQSC(K,IRICE)
     +      -XMI*XRI*TRCQSC(K,IRICE-1)+XPI*XRI*TRCQSC(K,IRICE+1)
      QGICEK=XMI*XPI*TRCQCB(K,IRICE)
     +      -XMI*XRI*TRCQCB(K,IRICE-1)+XPI*XRI*TRCQCB(K,IRICE+1)
      TXCTPG(K)=QXICEK*TCTAUC
      TSCTPG(K)=QSICEK*TCTAUC
      TGCTPG(K)=QGICEK
  340 CONTINUE
      LBOTCL=LBOTCI
      IF(LBOTCW==0) GO TO 360
      LBOTCL=LBOTCW
      GO TO 360
  350 CONTINUE
      LBOTCL=0
      LTOPCL=0
  360 CONTINUE

      RETURN
      end subroutine GETCLD

C--------------------------------
!      ENTRY UPDEPS(JYEARE,JJDAYE)
C--------------------------------

      subroutine UPDEPS(JYEARE,JJDAYE) 1
C                 Select ISCCP-Based Cloud Heterogeneity Time Dependence
C                 ------------------------------------------------------
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: JYEARE,JJDAYE
      REAL*8 SIZWCL,SIZICL,XRW,XMW,XPW,EPS,VEP,VEP1,VEP2,VEPP,TAUWCL
     *     ,TAUICL,QAWATK,QPWATK,SRCGFW,QXWATK,QSWATK,QGWATK,XRI,XMI,XPI
     *     ,QAICEK,QPICEK,SRCGFC,QXICEK,QSICEK,QGICEK,SCTTAU,GCBICE
     *     ,SCTGCB,TCTAUW,TCTAUC,ALWATK,WTI,WTW,ALICEK,TRCTCI,XJDAY,XMO
     *     ,WTMJ,WTMI
      INTEGER I,J,N,K,L,LBOTCW,LTOPCW,LBOTCI,LTOPCI,IRWAT,IRICE,MI,MJ

      XJDAY=JJDAYE-0.999D0
      XMO=XJDAY/30.5D0+.5D0
      MI=XMO
      WTMJ=XMO-MI
      WTMI=1.D0-WTMJ
      IF(MI < 1) MI=12
      MJ=MI+1
      IF(MJ > 12) MJ=1

      EPLOW(:,:) = WTMI*EPLMHC(:,:,MI,1) + WTMJ*EPLMHC(:,:,MJ,1) ! 72,46
      EPMID(:,:) = WTMI*EPLMHC(:,:,MI,2) + WTMJ*EPLMHC(:,:,MJ,2)
      EPHIG(:,:) = WTMI*EPLMHC(:,:,MI,3) + WTMJ*EPLMHC(:,:,MJ,3)
      EPCOL(:,:) = WTMI*EPLMHC(:,:,MI,4) + WTMJ*EPLMHC(:,:,MJ,4)

      RETURN
      end subroutine UPDEPS

C-----------------
!      ENTRY GETEPS
C-----------------

      subroutine GETEPS 1
C             ----------------------------------------------------------
C                     Select Cloud Heterogeneity CLDEPS Options
C             EPSCON  Column Cloud Inhomogeneity EPSILON (when KCLDEP=1)
C             KCLDEP  Selects Cloud Inhomogeneity Option (0-4):
C                     KCLDEP =  0  Sets Column CLDEPS to Zero
C                     KCLDEP =  1  Sets Column CLDEPS to EPSCON
C                     KCLDEP =  2  Keeps whatever is specified in CLDEPS
C                     KCLDEP =  3  Uses: Column EPCOL(72,46) Climatology
C                     KCLDEP =  4  Uses: Ht Dep EPLOW, EPMID, EPHIG Data
C                     --------------------------------------------------
      IMPLICIT NONE
      REAL*8 SIZWCL,SIZICL,XRW,XMW,XPW,EPS,VEP,VEP1,VEP2,VEPP,TAUWCL
     *     ,TAUICL,QAWATK,QPWATK,SRCGFW,QXWATK,QSWATK,QGWATK,XRI,XMI,XPI
     *     ,QAICEK,QPICEK,SRCGFC,QXICEK,QSICEK,QGICEK,SCTTAU,GCBICE
     *     ,SCTGCB,TCTAUW,TCTAUC,ALWATK,WTI,WTW,ALICEK,TRCTCI,XJDAY,XMO
     *     ,WTMJ,WTMI
      INTEGER I,J,N,K,L,LBOTCW,LTOPCW,LBOTCI,LTOPCI,IRWAT,IRICE,MI,MJ

      IF(KCLDEP == 0)  CLDEPS(L1:NL) = 0
      IF(KCLDEP == 1)  CLDEPS(L1:NL) = EPSCON
      IF(KCLDEP == 3)  CLDEPS(L1:NL) = EPCOL(ILON,JLAT)
      IF(KCLDEP == 4)  then
        DO L=L1,NL
          CLDEPS(L) = EPMID(ILON,JLAT)
          IF(PLB(L) > 750)  CLDEPS(L) = EPLOW(ILON,JLAT)
          IF(PLB(L) < 430)  CLDEPS(L) = EPHIG(ILON,JLAT)
        END DO
      ENDIF

      RETURN
      end subroutine GETEPS

#ifndef USE_RADIATION_E1

      SUBROUTINE TAUGAS 1
      IMPLICIT NONE
C     ----------------------------------------------------------
C     TAUGAS INPUT REQUIRES:  L1,NL,PL,DPL,TLM,ULGAS,    TAUCD0
C                             TAUTBL,TAUWV0,XKCFC,H2OCN8,H2OCF8
C                             ULOX,DUX,XTRUP,XTU0,XTRDN,XTD0
C                             DXUP2,DXDN2,DXUP3,DXDN3,DXUP6,DXDN6
C                             DXUP7,DXDN7,DXUP8,DXDN8,DXUP9,DXDN9
C                             DXUP13,DXDN13
C     TAUGAS OUTPUT DATA IS:  TRGXLK,XTRU,XTRD
C     ----------------------------------------------------------

      INTEGER, PARAMETER :: NPU2=14, NPU=5
      REAL*8, PARAMETER :: TLOX=181.d0, DTX=23.d0, P0=1013.25d0

      REAL*8, PARAMETER :: PX(NPX)= (/1000d0, 750d0, 500d0, 300d0,
     *        200d0, 100d0, 50d0, 20d0, 10d0,   5d0,   2d0,   1d0,
     *         .5d0,  .2d0, .1d0,.03d0,.01d0,.003d0,.001d0/)

      INTEGER, PARAMETER :: NGX(4) = (/12,12, 8,33/),
     *                     IG1X(4) = (/ 2,14,26, 1/)
      REAL*8, PARAMETER :: PDPU2(NPU2) = (/1.d4, 1.d5,2.d5,5.d5,
     *           1.d6,2.d6,5.d6, 1.d7,2.d7,5.d7, 1.d8,2.d8,5.d8, 1.d9/)
      REAL*8, PARAMETER ::  PU(NPU) = (/  50.,200.,800.,3200.,12800./)
      INTEGER, PARAMETER :: IGASX(21) = (/ 1, 2, 3, 1, 1, 2, 2, 3, 3, 6,
     *     6, 6, 7, 7,13,13, 8, 8, 9, 9, 1/)
      INTEGER, PARAMETER :: KGX(21) =   (/ 1, 2, 3, 2, 3, 1, 3, 1, 2, 1,
     *     2, 3, 1, 3, 1, 3, 2, 3, 2, 3, 4/)
      INTEGER, PARAMETER :: NUX(16) = (/25, 9, 9, 9, 9, 5, 5, 5, 5, 2, 2
     *     ,2 , 2, 2, 2,2/)
      INTEGER, PARAMETER :: IGUX(16) = (/ 0,300,408,480,588,660,720,760
     *     ,820,880,904,928,944,968,984,1008/)

      REAL*8, PARAMETER ::  XKCFCW(8,2) = RESHAPE( (/
     + 11.0, 11.7, 11.5, 10.9, 10.3, 9.90, 9.90, 9.90,
     + 5.75, 5.72, 5.95, 5.95, 5.90, 6.51, 6.51, 6.51 /)
     *     , (/8,2/) )

      REAL*8, PARAMETER ::  P24(24) = (/
     $ .100D+04,.973D+03,.934D+03,.865D+03,.752D+03,.603D+03,
     $ .439D+03,.283D+03,.156D+03,.754D+02,.350D+02,.162D+02,
     $ .754D+01,.350D+01,.162D+01,.743D+00,.340D+00,.152D+00,
     $ .701D-01,.347D-01,.159D-01,.750D-02,.350D-02,.100D-02/)
      REAL*8, PARAMETER ::  DP24(24) = (/
     $     24.4,32.0,46.6,89.8,136.8,162.0,165.4,146.9,106.5,55.2,25.6
     *     ,11.9,5.52,2.56,1.20,.551,.256,.119,.0452,.0256,.0119,.005,
     *     .003,.002/)
      REAL*8, PARAMETER ::  DLSQ2 =.1505d0,  ULMNH2=2.060d0,
     *     ULMNCH=-.8105d0, ULMNN2=-1.521d0, ULMNF1=-4.780d0,
     *     ULMNO3=-1.393d0, ULMNCO= 1.529d0, ULMNF2=-4.524d0,
     *     USO2S=.042d0
      REAL*8 XTU(24,3),XTD(24,3),DXUP(24,3,15),DXDN(24,3,15)
      INTEGER MLGAS(21)
      INTEGER I,IM,L,LL,IP,IULOW,IU,IPX,IAA,ITX
     *     ,IGAS,NG,KK,IK1,IK2,IPU,IK,NU,IUA
     *     ,IUB,IH2O0,IG  ,ICDlow,ICO20, IUW,IU1,IU2
     *     ,i2u1,i2u2,i3u1,i3u2,i6u1,i6u2,i7u1,i7u2,i8u1,i8u2,i9u1,i9u2

      REAL*8 UH2O, UH2OL,UCO2L,UO3LL,UCH4L,UN2OL,UCF1L,UCF2L,USO2
     *     ,DUH2,DU1,DU2,DUCO,D2U1,D2U2,DUO3,D3U1,D3U2,DUCH,D7U1,D7U2
     *     ,DUN2,D6U1,D6U2,DUF1,D8U1,D8U2,DUF2,D9U1,D9U2,SUM1,SUM2
     *     ,TAUT1,TAUT2,TAUHFB,TAUCF,TAUIPG,TAUSUM,TAU11,TAU12
     *     ,QAA,QAB,QBA,QBB, PLL,FPL,PRAT,PRATT,PU2, U,UP,UGAS, FNU1
     *     ,UAA,UAB,UBA,UBB, WPB, WT,WTB,WTPU, XA,XB,XK,XUA,XUB
     *     ,WAA,WAB,WBA,WBB,WAAA,WAAB,WABA,WABB,WBAA,WBAB,WBBA,WBBB

C                          MLGAS DEF.
C                          ----------
C     H2O: 1,4,5   CO2: 2,6,7   O3: 3,8,9   N2O: 10,11,12   CH4: 13,14
C     SO2: 15,16   CFC: 17-20   WVCON: 21

      MLGAS(:)=1  !  1:21

C              KWVCON = ON/OFF flag for water vapor continuum absorption
C              ---------------------------------------------------------
      IF(KWVCON < 1) MLGAS(21)=0

C**** Find XTU and XTD
      UH2O = 1d-10 + SUM(ULGAS(L1:NL,1))
      IF (UH2O < 1.1d-10) THEN  ! low water vapor
        IUlow    = 1
        XTU(:,:) = XTU0(:,:)                                  ! 1:24,1:3
        XTD(:,:) = XTD0(:,:)                                  ! 1:24,1:3
        GO TO 180
      END IF

      IUlow = 0                 ! with water vapor
      UH2OL = max( log10(UH2O) , log10(228d0) )
      UCO2L = LOG10 (1d-10 + SUM(ULGAS(L1:NL,2)))
      UO3LL = LOG10 (1d-10 + SUM(ULGAS(L1:NL,3)))
      UCH4L = LOG10 (1d-10 + SUM(ULGAS(L1:NL,7)))
      UN2OL = LOG10 (1d-10 + SUM(ULGAS(L1:NL,6)))
      UCF1L = LOG10 (1d-10 + SUM(ULGAS(L1:NL,8)))
      UCF2L = LOG10 (1d-10 + SUM(ULGAS(L1:NL,9)))
      USO2  = SUM(ULGAS(L1:NL,13))

      ICDLOW=0
      if(UCO2L < -9.958607315d0) ICDlow = 1  ! if UCO2<1.1d-10 (low CO2)

      DUH2=UH2OL-ULMNH2
      IF(DUH2.LT.0.) DUH2=0.D0
      IU1=DUH2/DLSQ2+1.D0
      IF(IU1.LT.1) IU1=1
      IF(IU1.GT.14) IU1=14
!!!!  DUH2=max( UH2OL-ULMNH2 , 0.d0)
!!!!  IU1=DUH2/DLSQ2+1 ; if(IU1 > 14) IU1=14
      IU2=IU1+1
      DU1=DUH2-(IU1-1)*DLSQ2
      DU2=DLSQ2-DU1

      DUCO=UCO2L-ULMNCO
      IF(DUCO.LT.0.) DUCO=0.
      I2U1=DUCO/DLSQ2+1
      IF(I2U1.LT.1) I2U1=1
      IF(I2U1.GT.10) I2U1=10
      I2U2=I2U1+1
      D2U1=DUCO-(I2U1-1)*DLSQ2
      D2U2=DLSQ2-D2U1

      DUO3=UO3LL-ULMNO3
      IF(DUO3.LT.0.) DUO3=0.
      I3U1=DUO3/DLSQ2+1
      IF(I3U1.LT.1) I3U1=1
      IF(I3U1.GT.10) I3U1=10
      I3U2=I3U1+1
      D3U1=DUO3-(I3U1-1)*DLSQ2
      D3U2=DLSQ2-D3U1

      DUCH=UCH4L-ULMNCH
      IF(DUCH.LT.0.) DUCH=DUCH*.57
      IF(DUCH.LT.-.68) DUCH=-.68
      I7U1=DUCH/DLSQ2+1
      IF(I7U1.LT.1) I7U1=1
      IF(I7U1.GT.10) I7U1=10
      I7U2=I7U1+1
      D7U1=DUCH-(I7U1-1)*DLSQ2
      D7U2=DLSQ2-D7U1

      DUN2=UN2OL-ULMNN2
      IF(DUN2.LT.0.) DUN2=DUN2*.5
      IF(DUN2.LT.-.56) DUN2=-.56
      I6U1=DUN2/DLSQ2+1
      IF(I6U1.LT.1) I6U1=1
      IF(I6U1.GT.10) I6U1=10
      I6U2=I6U1+1
      D6U1=DUN2-(I6U1-1)*DLSQ2
      D6U2=DLSQ2-D6U1

      DUF1=UCF1L-ULMNF1
      IF(DUF1.LT.-.25) DUF1=-.25
      I8U1=DUF1/DLSQ2+1
      IF(I8U1.LT.1) I8U1=1
      IF(I8U1.GT.10) I8U1=10
      I8U2=I8U1+1
      D8U1=DUF1-(I8U1-1)*DLSQ2
      D8U2=DLSQ2-D8U1

      DUF2=UCF2L-ULMNF2
      IF(DUF2.LT.-.2) DUF2=-.2
      I9U1=DUF2/DLSQ2+1
      IF(I9U1.LT.1) I9U1=1
      IF(I9U1.GT.10) I9U1=10
      I9U2=I9U1+1
      D9U1=DUF2-(I9U1-1)*DLSQ2
      D9U2=DLSQ2-D9U1

      DO 160 IM=1,3
      DO 160 IUW=IU1,IU2
      DO 160 I=1,24
      SUM1=DXUP2(I,IUW,I2U2,IM)*D2U1+DXUP2(I,IUW,I2U1,IM)*D2U2+
     $     DXUP3(I,IUW,I3U2,IM)*D3U1+DXUP3(I,IUW,I3U1,IM)*D3U2+
     $     DXUP7(I,IUW,I7U2,IM)*D7U1+DXUP7(I,IUW,I7U1,IM)*D7U2+
     $     DXUP6(I,IUW,I6U2,IM)*D6U1+DXUP6(I,IUW,I6U1,IM)*D6U2+
     $     DXUP8(I,IUW,I8U2,IM)*D8U1+DXUP8(I,IUW,I8U1,IM)*D8U2+
     $     DXUP9(I,IUW,I9U2,IM)*D9U1+DXUP9(I,IUW,I9U1,IM)*D9U2
      SUM2=DXDN2(I,IUW,I2U2,IM)*D2U1+DXDN2(I,IUW,I2U1,IM)*D2U2+
     $     DXDN3(I,IUW,I3U2,IM)*D3U1+DXDN3(I,IUW,I3U1,IM)*D3U2+
     $     DXDN7(I,IUW,I7U2,IM)*D7U1+DXDN7(I,IUW,I7U1,IM)*D7U2+
     $     DXDN6(I,IUW,I6U2,IM)*D6U1+DXDN6(I,IUW,I6U1,IM)*D6U2+
     $     DXDN8(I,IUW,I8U2,IM)*D8U1+DXDN8(I,IUW,I8U1,IM)*D8U2+
     $     DXDN9(I,IUW,I9U2,IM)*D9U1+DXDN9(I,IUW,I9U1,IM)*D9U2

      DXUP(I,IUW,IM)=SUM1/DLSQ2+DXUP13(I,IUW,IM)*USO2/USO2S
      DXDN(I,IUW,IM)=SUM2/DLSQ2+DXDN13(I,IUW,IM)*USO2/USO2S
  160 CONTINUE

      DO 170 IM=1,3
      DO 170 I=1,24
      XTU(I,IM)=((XTRUP(I,IU2,IM)+DXUP(I,IU2,IM))*DU1+
     $           (XTRUP(I,IU1,IM)+DXUP(I,IU1,IM))*DU2)/DLSQ2
      XTD(I,IM)=((XTRDN(I,IU2,IM)+DXDN(I,IU2,IM))*DU1+
     $           (XTRDN(I,IU1,IM)+DXDN(I,IU1,IM))*DU2)/DLSQ2
  170 CONTINUE

C**** Find XTRU and XTRD from XTU and XTD
  180 XTRU(L1:NL,1:4)=1. ; XTRD(L1:NL,1:4)=1.            ! defaults
      IP=2
      DO 190 L=L1,NL
      PLL=PL(L)
      IF(PLL >= P24(1)) THEN                             ! PLL>P24_bot
        PRAT = DPL(L)/DP24(1)
        XTRU(L,2:4)=1-PRAT*(1 - XTU(1,1:3))
        XTRD(L,2:4)=1-PRAT*(1 - XTD(1,1:3))
        GO TO 190
      ENDIF
      DO WHILE (PLL < P24(IP))
        IP=IP+1
        IF(IP > 24) GO TO 200                 ! deflts for PLL<P24_top
      END DO                                     ! P24(IP)<PLL<P24(IP-1)
      WT = (P24(IP) - PLL) / (P24(IP) - P24(IP-1))
      PRAT        = DPL(L) / (DP24(IP-1)*WT + DP24(IP)*(1-WT))
      XTRU(L,2:4) = 1-PRAT*(1 - (XTU(IP-1,1:3)*WT + XTU(IP,1:3)*(1-WT)))
      XTRD(L,2:4) = 1-PRAT*(1 - (XTD(IP-1,1:3)*WT + XTD(IP,1:3)*(1-WT)))
  190 CONTINUE
      XTRD(NL,2:4)= 1

C**** Find TRGXLK
  200 TRGXLK(L1:NL,1:33)=0.D0
      IPX=2
      DO 600 L=L1,NL
C         Locate model layer pressure between IPX and IPX-1
  280 CONTINUE
      WPB = (PL(L)-PX(IPX))/(PX(IPX-1)-PX(IPX))
      IF(WPB >= 0 .or. IPX >= NPX) GO TO 290
      IPX = IPX+1
      GO TO 280
C         Locate model layer temperature between ITX and ITX+1
  290 CONTINUE
      WTB = (TLM(L)-TLOX)/DTX + 1
      ITX = WTB  ;  IF(ITX < 1) ITX=1  ;  IF(ITX >= NTX) ITX=NTX-1
      WTB = WTB-ITX

      WBB = WPB*WTB
      WBA = WPB-WBB
      WAB = WTB-WBB
      WAA = 1 - (WBB+WBA+WAB)

      DO 500 IGAS=1,21
      IF(MLGAS(IGAS) < 1) GO TO 500
      KK   = IG1X(KGX(IGAS))
      NG   = NGX (KGX(IGAS))
      UGAS = ULGAS(L,IGASX(IGAS))
      IF(IGAS == 17.OR.IGAS == 18) UGAS = UGAS + ULGAS(L,11)

      IF(IGAS < 21) GO TO 375

C     IGAS = 21                   Apply water vapor continuum absorption
C     ---------                   --------------------------------------
C                  KCSELF = ON/FF flag for H2O self broadening continuum
C                  -----------------------------------------------------
      IF(KCSELF <= 0) GO TO 335

      DO 330 IK1=1,2
      if (IK1==1) then
          IK2=1 ;       U = UGAS*1.15d0  ! thermal K-domain 1
      else ! IK1=2
             IK2=33 ;   U = UGAS*XCSELF  ! thermal K-domain 2-33
      end if
      PU2 = PL(L)/DPL(L) * U**2
      IF (PU2 > PDPU2(1)) THEN
        IPU=2
        do while (PU2>PDPU2(IPU) .and. IPU<NPU2) ; IPU=IPU+1 ; end do
        WTPU   = (PU2-PDPU2(IPU-1))/(PDPU2(IPU)-PDPU2(IPU-1))
        DO IK=IK1,IK2
          TAUT1 = WTPU*(H2OCN8(IK,ITX,IPU)-H2OCN8(IK,ITX,IPU-1))+
     +            H2OCN8(IK,ITX,IPU-1)
          TAUT2 = WTPU*(H2OCN8(IK,ITX+1,IPU)-H2OCN8(IK,ITX+1,IPU-1))+
     +            H2OCN8(IK,ITX+1,IPU-1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      ELSE
        WTPU   = PU2/PDPU2(1)
        DO IK=IK1,IK2
          TAUT1 = WTPU*H2OCN8(IK,ITX,1)
          TAUT2 = WTPU*H2OCN8(IK,ITX+1,1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      END IF
  330 CONTINUE

C               KCFORN = ON/FF flag for H2O foreign broadening continuum
C               --------------------------------------------------------
  335 IF(KCFORN < 1) GO TO 500
      KK=IG1X(KGX(IGAS))
      DO 370 IK1=1,2
      if(IK1==1) then
         IK2=1      ;   U = UGAS*1.15d0
      else ! IK1=2
             IK2=33 ;   U = UGAS*XCFORN
      end if
      UP=PL(L)/P0*U
      IF(UP > PU(1)) THEN
        IPU=2
        DO WHILE (UP>PU(IPU) .and. IPU<NPU) ; IPU=IPU+1 ; END DO
        WTPU=(UP-PU(IPU-1))/(PU(IPU)-PU(IPU-1))
        DO IK=IK1,IK2
          TAUT1=WTPU*(H2OCF8(IK,ITX,IPU)-H2OCF8(IK,ITX,IPU-1))+
     +          H2OCF8(IK,ITX,IPU-1)
          TAUT2=WTPU*(H2OCF8(IK,ITX+1,IPU)-H2OCF8(IK,ITX+1,IPU-1))+
     +          H2OCF8(IK,ITX+1,IPU-1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      ELSE
        DO IK=IK1,IK2
          WTPU=UP/PU(1)
          TAUT1=WTPU*H2OCF8(IK,ITX,1)
          TAUT2=WTPU*H2OCF8(IK,ITX+1,1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      END IF
  370 CONTINUE
      GO TO 500

  375 IF(IGAS < 17) GO TO 385
C                               IGAS=17-20       Chloro Fluoro Carbons
C                               ----------       ---------------------
      DO IK=1,NG
        XA=WTB*(XKCFC(IK,ITX+1,IGAS)-XKCFC(IK,ITX,IGAS))+
     +     XKCFC(IK,ITX,IGAS)
        XB=WTB*(XKCFC(IK,ITX+1,IGAS)-XKCFC(IK,ITX,IGAS))+
     +     XKCFC(IK,ITX,IGAS)
        XK=WPB*(XA-XB)+XB
        TAUCF=XK*UGAS
        TRGXLK(L,KK)=TRGXLK(L,KK)+TAUCF
        KK=KK+1
      END DO
      GO TO 500

  385 CONTINUE               !  IGAS=1-16        H2O,CO2,O3,N2O,CH4,SO2
C                               ---------        ----------------------
      NU = NUX(IGAS)
      XUA = (UGAS-ULOX(IPX  ,IGAS)) / DUX(IPX  ,IGAS)
      XUB = (UGAS-ULOX(IPX-1,IGAS)) / DUX(IPX-1,IGAS)
C     IF(NU <= 1) then  ;  XUA = 0  ;  XUB = 0  ;  endif
      IUA = XUA
      IUB = XUB

      QAA = 1
      QAB = 1
      IF(XUA <= 0)  then
         XUA = 0
         IUA = 0
         QAA = UGAS /  ULOX(IPX,IGAS)
         QAB = UGAS / (ULOX(IPX,IGAS)+DUX(IPX,IGAS))
      endif
      IF(XUA >= NU-1)  then
         XUA = NU-1
         IUA = NU-2
         QAA = UGAS / (ULOX(IPX,IGAS)+DUX(IPX,IGAS)*(NU-2))
         QAB = UGAS / (ULOX(IPX,IGAS)+DUX(IPX,IGAS)*(NU-1))
      endif
      QBA = 1
      QBB = 1
      IF(XUB <= 0)  then
         XUB = 0
         IUB = 0
         QBA = UGAS /  ULOX(IPX-1,IGAS)
         QBB = UGAS / (ULOX(IPX-1,IGAS)+DUX(IPX-1,IGAS))
      endif
      IF(XUB >= NU-1)  then
         XUB = NU-1
         IUB = NU-2
         QBA = UGAS / (ULOX(IPX-1,IGAS)+DUX(IPX-1,IGAS)*(NU-2))
         QBB = UGAS / (ULOX(IPX-1,IGAS)+DUX(IPX-1,IGAS)*(NU-1))
      endif
      UAB = XUA-IUA
      UBB = XUB-IUB
      UAA = 1-UAB
      UBA = 1-UBB

      WAAA = WAA*UAA*QAA
      WAAB = WAA*UAB*QAB
      WABA = WAB*UAA*QAA
      WABB = WAB*UAB*QAB
      WBAA = WBA*UBA*QBA
      WBAB = WBA*UBB*QBB
      WBBA = WBB*UBA*QBA
      WBBB = WBB*UBB*QBB

      IH2O0=0
      IF( (IGAS==6.OR.IGAS==8.OR.IGAS==10.OR.IGAS==13.OR.IGAS==15)
     +   .and. IULOW == 1 ) IH2O0=1

      ICO20=0
      IF( (IGAS==4.OR.IGAS==9.OR.IGAS==11) .and. ICDLOW==1 ) ICO20=1

      DO 430 IG=1,NG
      IF(IH2O0 == 0 .and. ICO20 == 0) THEN
      TAUIPG = WAAA*TAUTBL(IG+IGUX(IGAS)+NG* IUA   ,ITX  ,IPX)
     +       + WAAB*TAUTBL(IG+IGUX(IGAS)+NG*(IUA+1),ITX  ,IPX)
     +       + WABA*TAUTBL(IG+IGUX(IGAS)+NG* IUA   ,ITX+1,IPX)
     +       + WABB*TAUTBL(IG+IGUX(IGAS)+NG*(IUA+1),ITX+1,IPX)
     +       + WBAA*TAUTBL(IG+IGUX(IGAS)+NG* IUB   ,ITX  ,IPX-1)
     +       + WBAB*TAUTBL(IG+IGUX(IGAS)+NG*(IUB+1),ITX  ,IPX-1)
     +       + WBBA*TAUTBL(IG+IGUX(IGAS)+NG* IUB   ,ITX+1,IPX-1)
     +       + WBBB*TAUTBL(IG+IGUX(IGAS)+NG*(IUB+1),ITX+1,IPX-1)
      ELSE IF (ICO20 == 1) THEN
      TAUIPG = WAAA*TAUCD0(IG+IGUX(IGAS)+NG* IUA   ,ITX  ,IPX) ! low CO2
     +       + WAAB*TAUCD0(IG+IGUX(IGAS)+NG*(IUA+1),ITX  ,IPX)
     +       + WABA*TAUCD0(IG+IGUX(IGAS)+NG* IUA   ,ITX+1,IPX)
     +       + WABB*TAUCD0(IG+IGUX(IGAS)+NG*(IUA+1),ITX+1,IPX)
     +       + WBAA*TAUCD0(IG+IGUX(IGAS)+NG* IUB   ,ITX  ,IPX-1)
     +       + WBAB*TAUCD0(IG+IGUX(IGAS)+NG*(IUB+1),ITX  ,IPX-1)
     +       + WBBA*TAUCD0(IG+IGUX(IGAS)+NG* IUB   ,ITX+1,IPX-1)
     +       + WBBB*TAUCD0(IG+IGUX(IGAS)+NG*(IUB+1),ITX+1,IPX-1)
      ELSE   !! if (ICO20 == 0 .and. IH2O0 == 1)
      TAUIPG = WAAA*TAUWV0(IG+IGUX(IGAS)+NG* IUA   ,ITX  ,IPX)  ! low WV
     +       + WAAB*TAUWV0(IG+IGUX(IGAS)+NG*(IUA+1),ITX  ,IPX)
     +       + WABA*TAUWV0(IG+IGUX(IGAS)+NG* IUA   ,ITX+1,IPX)
     +       + WABB*TAUWV0(IG+IGUX(IGAS)+NG*(IUA+1),ITX+1,IPX)
     +       + WBAA*TAUWV0(IG+IGUX(IGAS)+NG* IUB   ,ITX  ,IPX-1)
     +       + WBAB*TAUWV0(IG+IGUX(IGAS)+NG*(IUB+1),ITX  ,IPX-1)
     +       + WBBA*TAUWV0(IG+IGUX(IGAS)+NG* IUB   ,ITX+1,IPX-1)
     +       + WBBB*TAUWV0(IG+IGUX(IGAS)+NG*(IUB+1),ITX+1,IPX-1)
      ENDIF

      TAUSUM=TRGXLK(L,KK)+TAUIPG
      IF(TAUSUM > 0) TRGXLK(L,KK)=TAUSUM
      KK=KK+1
  430 CONTINUE
  500 CONTINUE
C                               CFC11 and CFC12 Window Absorption (1997)
C                               ----------------------------------------

      IF(MLGAS(17) == 1.OR.MLGAS(18) == 1) THEN
        XK=WTB*(XKCFCW(ITX+1,1)-XKCFCW(ITX,1))+XKCFCW(ITX,1)
        TAU11=XK*(ULGAS(L,8)+ULGAS(L,11))
        TRGXLK(L,1)=TRGXLK(L,1)+TAU11
      ENDIF
      IF(MLGAS(19) == 1.OR.MLGAS(20) == 1) THEN
        XK=WTB*(XKCFCW(ITX+1,2)-XKCFCW(ITX,2))+XKCFCW(ITX,2)
        TAU12=XK*ULGAS(L,9)
        TRGXLK(L,1)=TRGXLK(L,1)+TAU12
      ENDIF
  600 CONTINUE

      RETURN
      END SUBROUTINE TAUGAS


      SUBROUTINE THERML 1
      IMPLICIT NONE
C     ------------------------------------------------------------------
C             Top-cloud Thermal Scattering Correction Control Parameters
C             ----------------------------------------------------------
C
C             ECLTRA = 1.0  Scattering correction is enabled
C             with KCLDEM = 1, Rigorous scattering correction is applied
C             with KCLDEM = 0, Approximate scattering correction is used
C
C             ECLTRA = 0.0  No scattering correction is used
C                                          (Independent of KCLDEM value)
C
C     ------------------------------------------------------------------
C                                   Lower Edge Temperature Interpolation
C                                   ------------------------------------
C     TLGRAD=1.0  (Default)
C                 Layer-mean temperatures (TLM) supplied by GCM are used
C                 to define the layer edge temperature TLT (top) and TLB
C                 (bottom) using overall atmospheric temperature profile
C                 to establish temperature gradient within each layer so
C                 as to minimize the temperature discontinuities between
C                 layer edges and to conserve layer thermal energy.
C
C     TLGRAD=0.0  This results in isothermal layers with TLT = TLB = TLM
C
C     TLGRAD<0.0  TLT and TLB are used as specified, without any further
C                 adjustments.  This is mainly for off-line use when the
C                 temperature profile (TLM,TLT,TLB) can be fully defined
C                 from a continuous temperature profile.
C
C     NOTE:       TLGRAD can also accommodate values between 0.0 and 1.0
C
C     PTLISO      (Default PTLISO=2.5mb)
C                 Pressure level above which model layers are defined to
C                 be isothermal.  This is appropriate for optically thin
C                 layers where emitted flux depends on mean temperature.
C     ------------------------------------------------------------------
      REAL*8 :: PX(9)=(/1001.,973.,934.,865.,752.,603.,439.,283.,156./)
      REAL*8 :: ALG2=.30103d0, TAUMNL=-2.20412d0

      REAL*8, PARAMETER :: R6=.16666667D0, R24=4.1666667D-02
      REAL*8, PARAMETER :: A=0.3825D0,B=0.5742D0,C=0.0433D0

      REAL*8 TA,TB,TC,P1,P2,P3,P4,DT1CPT,DTHALF,CLTAUX,CLTAUS,CLCOSB
     *     ,CTX,DT2,DT1,CTG,DG2,DG1,WT1,WT2,WT3,WT4,WT5,WT6,WT7
     *     ,WT8,BG,DNACUM,DNBCUM,DNCCUM,TAUAG,TAUAP,TAUBP,TAUCP,TAUAX
     *     ,TAUBX,TAUCX,XTRDL,BTOP,BBOT,BBAR,TX,PLBN,F,TAUA,TAUB,TAUC
     *     ,BDIF,BBTA,BBTB,BBTC,TRANA,TRANB,TRANC,DEC
     *     ,DEB,DEA,COALB1,COALB2,COALB3,FDNABC,UNA,UNB,UNC,FUNABC
     *     ,PFW,DPF,CTP,DP1,DP2,TAUBG,TAUCG,DDFLUX,XTRUL
     *     ,FSUM,XFSUM,PLL,DTAU0,TAUPLG,AP1,AP2,XTF,XTFACN
      REAL*8 ENA(LX),ENB(LX),ENC(LX), TRA(LX),TRB(LX),TRC(LX)
      REAL*8 DNA(LX),DNB(LX),DNC(LX), WTLB(LX),WTLT(LX)
      REAL*8 RIJTCK(6,33), FDXTCK(3,33),FEMTCK(3,33),ALBTCK(3,33)
      REAL*8 CLPI0(33),CLPI0K
      INTEGER K,L,LL,II,ITL,ICT,IT1,IT2,IP1,IP2,ICG,IG1,IG2,IMOL
     *     ,IPF,ICP,ITLT(LX),ITLB(LX),IP,IPX0,ITAU1,ITAU2,LTOPA
     *     ,LCL(LX),ia,iaa,ic,iu,lvlo,lvhi,lskip,lcbot,nclds,icomb

C-----------------------------------------------------------------------
C                                   Layer edge temperature interpolation
C-----------------------------------------------------------------------
      if (TLGRAD < 0.D0) GO TO 130
      TA = TLM(L1)
      TB = TLM(L1+1)
      P1 = PLB(L1)
      P2 = PLB(L1+1)
      P3 = PLB(L1+2)
      DT1CPT = .5*TA*(P1**.286d0-P2**.286d0) / PL(L1)**.286d0
      DTHALF = (TA-TB)*(P1-P2)/(P1-P3)
      if (DTHALF > DT1CPT) DTHALF = DT1CPT
      TLB(L1) = TA+DTHALF*TLGRAD
      TLT(L1) = TA-DTHALF*TLGRAD
      DO L = L1+1,NL-1
        TC = TLM(L+1)
        P4 = PLB(L+2)
        DTHALF = .5*((TA-TB)/(P1-P3)+(TB-TC)/(P2-P4))*(P2-P3)*TLGRAD
        TLB(L) = TB+DTHALF
        TLT(L) = TB-DTHALF
        TA = TB
        TB = TC
        P1 = P2
        P2 = P3
        P3 = P4
      END DO
      DTHALF = (TA-TB)*(P2-P3)/(P1-P3)*TLGRAD
      TLB(NL) = TC+DTHALF
      TLT(NL) = TC-DTHALF
      DO L = NL,L1,-1
        if (PLB(L) > PTLISO) GO TO 130
        TLT(L) = TLM(L)
        TLB(L) = TLM(L)
      END DO
  130 CONTINUE
      TLB(NL+1) = TLT(NL)

C     ------------------------------------------------------------------
C                   weight assignments for Planck function interpolation
C                    (Effective range is from TK = 124 K to TK = 373 K)
C     ------------------------------------------------------------------

      DO 140 L=L1,NL
      ITLB(L) = TLB(L)
      WTLB(L) = TLB(L)-ITLB(L)
      if (ITLB(L) < 124) ITLB(L) = 124
      if (ITLB(L) > 372) ITLB(L) = 372
      ITLT(L) = TLT(L)
      WTLT(L) = TLT(L)-ITLT(L)
      if (ITLT(L) < 124) ITLT(L) = 124
      if (ITLT(L) > 372) ITLT(L) = 372
  140 CONTINUE

      if (LTOPCL==0) GO TO 180

      DO 170 K=1,33
      CLTAUX=TXCTPG(K)+TRGXLK(LTOPCL,K)+1d-10
      CLTAUS=TSCTPG(K)
      CLCOSB=TGCTPG(K)
      CLPI0K=CLTAUS*ECLTRA/CLTAUX
      CLPI0(K)=CLPI0K
      CTX=CLTAUX*10.D0
      if (CLTAUX >= 3.D0) then
        CTX=CLTAUX*2 + 24
        if (CTX > 47.999999D0) CTX=47.999999D0
      end if
      ICT=CTX
      DT2=CTX-ICT
      DT1=1.D0-DT2
      IT1=ICT+1
      IT2=ICT+2
      CTP=CLPI0K*20.D0
      ICP=CTP
      DP2=CTP-ICP
      DP1=1.D0-DP2
      IP1=ICP+1
      IP2=ICP+2
      CTG=CLCOSB*20.D0
      ICG=CTG
      DG2=CTG-ICG
      DG1=1.D0-DG2
      IG1=ICG+1
      IG2=ICG+2
      WT1=DT1*DP1*DG1
      WT2=DT2*DP1*DG1
      WT3=DT2*DP2*DG1
      WT4=DT1*DP2*DG1
      WT5=DT1*DP1*DG2
      WT6=DT2*DP1*DG2
      WT7=DT2*DP2*DG2
      WT8=DT1*DP2*DG2
      RIJTCK(:,K)=WT1*RIJTPG(:,IT1,IP1,IG1)+WT2*RIJTPG(:,IT2,IP1,IG1) ! 1:6
     +           +WT3*RIJTPG(:,IT2,IP2,IG1)+WT4*RIJTPG(:,IT1,IP2,IG1)
     +           +WT5*RIJTPG(:,IT1,IP1,IG2)+WT6*RIJTPG(:,IT2,IP1,IG2)
     +           +WT7*RIJTPG(:,IT2,IP2,IG2)+WT8*RIJTPG(:,IT1,IP2,IG2)
      FEMTCK(:,K)=WT1*FEMTPG(:,IT1,IP1,IG1)+WT2*FEMTPG(:,IT2,IP1,IG1) ! 1:3
     +           +WT3*FEMTPG(:,IT2,IP2,IG1)+WT4*FEMTPG(:,IT1,IP2,IG1)
     +           +WT5*FEMTPG(:,IT1,IP1,IG2)+WT6*FEMTPG(:,IT2,IP1,IG2)
     +           +WT7*FEMTPG(:,IT2,IP2,IG2)+WT8*FEMTPG(:,IT1,IP2,IG2)
      FDXTCK(:,K)=WT1*FDXTPG(:,IT1,IP1,IG1)+WT2*FDXTPG(:,IT2,IP1,IG1)
     +           +WT3*FDXTPG(:,IT2,IP2,IG1)+WT4*FDXTPG(:,IT1,IP2,IG1)
     +           +WT5*FDXTPG(:,IT1,IP1,IG2)+WT6*FDXTPG(:,IT2,IP1,IG2)
     +           +WT7*FDXTPG(:,IT2,IP2,IG2)+WT8*FDXTPG(:,IT1,IP2,IG2)
  170 CONTINUE

  180 CONTINUE
      TRDFLB(:)=0.D0
      TRUFLB(:)=0.D0

      BG=BGFEMT(1)
      TOTLZF(1:3)=0.D0
!sl   TRSLTS=0.D0
!sl   TRSLTG=0.D0
!sl   TRSLBS=0.D0

C     ------------------------------------------------------------------
C                                                      LOOP OVER K-BANDS
C     ------------------------------------------------------------------
      K=0
      IMOL=0
  200 CONTINUE
      K=K+1
      if (K > 33) GO TO 300
      BG=BGFEMT(K)
      if (K > 1 .and. K < 14) IMOL=1
      if (K > 13 .and. K < 26) IMOL=2
      if (K > 25) IMOL=3
      DFLB(NL+1,K)=0.D0
      DNACUM=0.D0
      DNBCUM=0.D0
      DNCCUM=0.D0
C**** Find top layer with absorbers: LtopA
      DO 210 L=NL,L1,-1
      LTOPA=L
      TAUAG=TRGXLK(L,K)
      TAUAP=TRCALK(L,K)+TRAALK(L,K)+TRBALK(L,K)+TRDALK(L,K)+TRVALK(L,K)
      TAUAX=TAUAG+TAUAP
      if (TAUAX > 1.D-06) GO TO 211
      DFLB(L,K)=0.D0
      ENA(L)=0.D0
      DNA(L)=0.D0
      TRA(L)=1.D0
      ENB(L)=0.D0
      DNB(L)=0.D0
      TRB(L)=1.D0
      ENC(L)=0.D0
      DNC(L)=0.D0
      TRC(L)=1.D0
  210 CONTINUE
      UFLB(L1:NL+1,K)=BG                 ! no absorbers in whole column
      TRUFLB(L1:NL+1)=TRUFLB(L1:NL+1)+BG
      TOTLZF(1)=TOTLZF(1)+BG
      TOTLZF(2)=TOTLZF(2)+BG
      TOTLZF(3)=TOTLZF(3)+BG
      GO TO 200                        ! next K

  211 CONTINUE
      FSUM=0.
      XFSUM=0.
      XTFACN=0.
      IPX0=9
C     ------------------------------------------------------------------
C                                              DOWNWARD FLUX COMPUTATION
C     ------------------------------------------------------------------
      DO 250 L=LTOPA,L1,-1
      BTOP = PLANCK(ITLT(L),K)-
     -      (PLANCK(ITLT(L),K)-PLANCK(ITLT(L)+1,K))*WTLT(L)
      BBOT = PLANCK(ITLB(L),K)-
     -      (PLANCK(ITLB(L),K)-PLANCK(ITLB(L)+1,K))*WTLB(L)
      TAUAG=TRGXLK(L,K)
      TAUAP=TRCALK(L,K)+TRAALK(L,K)+TRBALK(L,K)+TRDALK(L,K)+TRVALK(L,K)
      TAUAX=TAUAG+TAUAP
      IF(TAUAP.LT..003) GO TO 219
      PLL=PL(L)
      DO 217 IP=IPX0,1,-1
      IP1=IP
      IF(PLL.LT.PX(IP)) GO TO 218
  217 CONTINUE
  218 CONTINUE
      IF(IP1.EQ.9) IP1=8
      IP2=IP1+1
      IPX0=IP2
      TAUPLG=DLOG10(TAUAP)
      DTAU0=TAUPLG-TAUMNL
C     IF(DTAU0.LT.0.) DTAU0=0.
      ITAU1=DTAU0/ALG2+1
      IF(ITAU1.LT.1) ITAU1=1
      IF(ITAU1.GT.10) ITAU1=10
      ITAU2=ITAU1+1
      DT1=DTAU0-(ITAU1-1)*ALG2
      DT2=ALG2-DT1
      AP1=(XTFAC(ITAU2,IP1)*DT1+XTFAC(ITAU1,IP1)*DT2)/ALG2
      AP2=(XTFAC(ITAU2,IP2)*DT1+XTFAC(ITAU1,IP2)*DT2)/ALG2
      XTF=(AP2*(PLL-PX(IP1))+AP1*(PX(IP2)-PLL))/(PX(IP2)-PX(IP1))
      FSUM=FSUM+XTF/(1.+1.75*XFSUM**2)**2
      XTFACN=FSUM
      IF(XTFACN.GT.1.) XTFACN=1.
      IF(XTFACN.LT.0.) XTFACN=0.
      XFSUM=XFSUM+XTF
  219 CONTINUE

      XTRDL=XTRD(L,IMOL+1)
      XTRDL=XTRDL+XTFACN*(1.-XTRDL)

C               Optically thin limit emission/transmission approximation
C               --------------------------------------------------------

      IF (TAUAX >= 1.D-04) GO TO 220
      TAUBX=TAUAX+TAUAX
      TAUCX=10.D0*TAUAX
      BBAR=0.5D0*(BTOP+BBOT)
      TRA(L)=1.D0-TAUAX
      ENA(L)=BBAR*TAUAX
      DNA(L)=ENA(L)
      TX=TRA(L)*XTRDL ! ; if(TX > 1) TX=1
      DNACUM=DNACUM*TX+DNA(L)
      TRB(L)=1.D0-TAUBX
      ENB(L)=BBAR*TAUBX
      DNB(L)=ENB(L)
      TX=TRB(L)*XTRDL ! ; if(TX > 1) TX=1
      DNBCUM=DNBCUM*TX+DNB(L)
      TRC(L)=1.D0-TAUCX
      ENC(L)=BBAR*TAUCX
      DNC(L)=ENC(L)
      TX=TRC(L)*XTRDL ! ; if(TX > 1) TX=1
      DNCCUM=DNCCUM*TX+DNC(L)
      GO TO 230

C                     TAUB absorber-dependent extinction path adjustment
C                     --------------------------------------------------

  220 PLBN=PLB(L)
      ICOMB=0
      IF (TAUAG > TAUAP) THEN
        ICOMB=1
        TAUAG=TAUAX
      END IF
      TAUBG=TAUAG+TAUAG
      TAUCG=10.D0*TAUAG

      F=1
      if (IMOL==3 .and. PLBN>500 .and. TAUAG>.05d0 .and. TAUAG<.25) then
        F=23.71D0*TAUAG**2-7.113D0*TAUAG+1.296D0
        GO TO 221
      end if

      if (TAUAG > .1D0) then
        if      (IMOL==1) then
          if (PLBN > 250.D0) then
            F=.761D0
            if (TAUAG < 3.D0) F=.92D0-.053D0*TAUAG
            if (TAUAG < .2D0) F=1.091D0-.906D0*TAUAG
          else
            F=.718D0
            if (TAUAG < 2.5D0) F=.90D0-.073D0*TAUAG
            if (TAUAG < .2D0) F=1.115D0-1.146D0*TAUAG
          end if
        else if (IMOL==2) then
          if (PLBN > 250.D0) then
            F=.590D0
            if (TAUAG < 3.5D0) F=.93D0-.097D0*TAUAG
            if (TAUAG < .2D0) F=1.089D0-.894D0*TAUAG
          else
            F=.703D0
            if (TAUAG < 3.5D0) F=.92D0-.062D0*TAUAG
            if (TAUAG < .2D0) F=1.092D0-.924D0*TAUAG
          end if
        else if (IMOL==3) then
          if (PLBN > 250.D0) then
            F=.982D0
            if (TAUAG < .5D0) F=.99D0-.016D0*TAUAG
            if (TAUAG < .2D0) F=1.013D0-.132D0*TAUAG
          else
            F=.748D0
            if (TAUAG < 3.7D0) F=.97D0-.060D0*TAUAG
            if (TAUAG < .2D0) F=1.042D0-.420D0*TAUAG
          end if
        end if
      end if
  221 TAUBG=TAUBG*F

C                     TAUC absorber-dependent extinction path adjustment
C                     --------------------------------------------------
      F=1
      if (IMOL==3 .and. PLBN>500 .and. TAUAG>.01d0 .and. TAUAG<.25) then
        F=26.14D0*TAUAG**2-6.796D0*TAUAG+1.065D0
        GO TO 222
      end if

      if (TAUAG > .01D0) then
        if      (IMOL==1) then
          if (PLBN > 250.D0) then
            F=.712D0
            if (TAUAG < .37D0) F=.96D0-.67D0*TAUAG
            if (TAUAG < .02D0) F=1.053D0-5.34D0*TAUAG
          else
            F=.536D0
            if (TAUAG < .47D0) F=.87D0-.71D0*TAUAG
            if (TAUAG < .02D0) F=1.144D0-14.42D0*TAUAG
          end if
        else if (IMOL==2) then
          if (PLBN > 250.D0) then
            F=.710D0
            if (TAUAG < .75D0) F=.95D0-.32D0*TAUAG
            if (TAUAG < .02D0) F=1.056D0-5.64D0*TAUAG
          else
            F=.487D0
            if (TAUAG < .70D0) F=.90D0-.59D0*TAUAG
            if (TAUAG < .02D0) F=1.112D0-11.18D0*TAUAG
          end if
        else if (IMOL==3) then
          if (PLBN > 250.D0) then
            F=.961D0
            if (TAUAG < .5D0) F=.98D0-.039D0*TAUAG
            if (TAUAG < .02D0) F=1.021D0-2.08D0*TAUAG
          else
            F=.777D0
            if (TAUAG < .70D0) F=.98D0-.29D0*TAUAG
            if (TAUAG < .02D0) F=1.026D0-2.58D0*TAUAG
          end if
        end if
      end if
  222 TAUCG=TAUCG*F

      IF (ICOMB==0) THEN
        TAUBP=TAUAP+TAUAP
        TAUCP=10.D0*TAUAP
        TAUA=TAUAG+TAUAP
        TAUB=TAUBG+TAUBP
        TAUC=TAUCG+TAUCP
      ELSE
        TAUA=TAUAG
        TAUB=TAUBG
        TAUC=TAUCG
      END IF

      if (L==LTOPCL .and. KCLDEM==1) GO TO 225

      BDIF=BBOT-BTOP
      BBTA=BDIF/TAUA
      BBTB=BDIF/TAUB
      BBTC=BDIF/TAUC

C            Optically thick limit non-scattering emission approximation
C            -----------------------------------------------------------

      if (TAUA > 9.D0) then
        TRA(L)=0.D0
        TRB(L)=0.D0
        TRC(L)=0.D0
        ENA(L)=BTOP+BBTA
        ENB(L)=BTOP+BBTB
        ENC(L)=BTOP+BBTC
        DNA(L)=BBOT-BBTA
        DNB(L)=BBOT-BBTB
        DNC(L)=BBOT-BBTC
        DNACUM=BBOT-BBTA
        DNBCUM=BBOT-BBTB
        DNCCUM=BBOT-BBTC
        GO TO 230
      end if

      if (TAUA < 0.5D0) then
        TRANA = 1 - TAUA + (.5 - R6*TAUA + R24*(TAUA*TAUA))*(TAUA*TAUA)
      else
        TRANA = EXP(-TAUA)
      end if
      if (TAUB < 0.5D0) then
        TRANB = 1 - TAUB + (.5 - R6*TAUB + R24*(TAUB*TAUB))*(TAUB*TAUB)
      else
        TRANB = EXP(-TAUB)
      end if
      if (TAUC < 0.5D0) then
        TRANC = 1 - TAUC + (.5 - R6*TAUC + R24*(TAUC*TAUC))*(TAUC*TAUC)
      else
        TRANC = EXP(-TAUC)
      end if

      TRA(L)=TRANA
      ENA(L)=BTOP+BBTA-(BBOT+BBTA)*TRANA
      DNA(L)=BBOT-BBTA-(BTOP-BBTA)*TRANA
      TX=TRANA*XTRDL ! ; if(TX > 1) TX=1
      DNACUM=DNACUM*TX+DNA(L)
      TRB(L)=TRANB
      ENB(L)=BTOP+BBTB-(BBOT+BBTB)*TRANB
      DNB(L)=BBOT-BBTB-(BTOP-BBTB)*TRANB
      TX=TRANB*XTRDL ! ; if(TX > 1) TX=1
      DNBCUM=DNBCUM*TX+DNB(L)
      TRC(L)=TRANC
      ENC(L)=BTOP+BBTC-(BBOT+BBTC)*TRANC
      DNC(L)=BBOT-BBTC-(BTOP-BBTC)*TRANC
      TX=TRANC*XTRDL ! ; if(TX > 1) TX=1
      DNCCUM=DNCCUM*TX+DNC(L)
      GO TO 230

C                          ---------------------------------------------
C                          Top-cloud multiple scattering corrections for
C                          emitted, transmitted, and reflected radiances
C                          and fluxes at the top-cloud (L=LTOPCL) level.
C                          ---------------------------------------------

  225 CONTINUE
      IF (ICOMB==1) THEN
        TAUBP=TAUAP*(TAUBG/TAUAG)
        TAUCP=TAUAP*(TAUCG/TAUAG)
        TAUBG=TRGXLK(L,K)*(TAUBG/TAUAG)
        TAUCG=TRGXLK(L,K)*(TAUCG/TAUAG)
        TAUAG=TAUAG-TAUAP
      END IF
      TRA(L)=EXP(-TAUAG-TAUAP*FDXTCK(3,K))
      TRB(L)=EXP(-TAUBG-TAUBP*FDXTCK(2,K))
      TRC(L)=EXP(-TAUCG-TAUCP*FDXTCK(1,K))
      DEC=C*DNCCUM*RIJTCK(1,K)+B*DNBCUM*RIJTCK(2,K)+A*DNACUM*RIJTCK(3,K)
      DEB=C*DNCCUM*RIJTCK(2,K)+B*DNBCUM*RIJTCK(4,K)+A*DNACUM*RIJTCK(5,K)
      DEA=C*DNCCUM*RIJTCK(3,K)+B*DNBCUM*RIJTCK(5,K)+A*DNACUM*RIJTCK(6,K)
      ALBTCK(1,K)=C*RIJTCK(1,K)+B*RIJTCK(2,K)+A*RIJTCK(3,K)
      ALBTCK(2,K)=C*RIJTCK(2,K)+B*RIJTCK(4,K)+A*RIJTCK(5,K)
      ALBTCK(3,K)=C*RIJTCK(3,K)+B*RIJTCK(5,K)+A*RIJTCK(6,K)
      COALB1=1.D0-ALBTCK(1,K)
      COALB2=1.D0-ALBTCK(2,K)
      COALB3=1.D0-ALBTCK(3,K)
      TAUA=TAUAG+TAUAP*FEMTCK(3,K)
      TAUB=TAUBG+TAUBP*FEMTCK(2,K)
      TAUC=TAUCG+TAUCP*FEMTCK(1,K)
      TRANA=EXP(-TAUA)
      TRANB=EXP(-TAUB)
      TRANC=EXP(-TAUC)
      BDIF=BBOT-BTOP
      BBTA=BDIF/TAUA
      BBTB=BDIF/TAUB
      BBTC=BDIF/TAUC
      ENA(L)=(BTOP+BBTA-(BBOT+BBTA)*TRANA)*COALB3
      DNA(L)=(BBOT-BBTA-(BTOP-BBTA)*TRANA)*COALB3
      TX=TRA(L)*XTRDL ! ; if(TX > 1) TX=1
      DNACUM=DNACUM*TX+DNA(L)
      ENB(L)=(BTOP+BBTB-(BBOT+BBTB)*TRANB)*COALB2
      DNB(L)=(BBOT-BBTB-(BTOP-BBTB)*TRANB)*COALB2
      TX=TRB(L)*XTRDL ! ; if(TX > 1) TX=1
      DNBCUM=DNBCUM*TX+DNB(L)
      ENC(L)=(BTOP+BBTC-(BBOT+BBTC)*TRANC)*COALB1
      DNC(L)=(BBOT-BBTC-(BTOP-BBTC)*TRANC)*COALB1
      TX=TRC(L)*XTRDL ! ; if(TX > 1) TX=1
      DNCCUM=DNCCUM*TX+DNC(L)
      ENC(L)=ENC(L)+DEC
      ENB(L)=ENB(L)+DEB
      ENA(L)=ENA(L)+DEA
  230 CONTINUE
      FDNABC=A*DNACUM+B*DNBCUM+C*DNCCUM
      TRDFLB(L)=TRDFLB(L)+FDNABC
      DFLB(L,K)=FDNABC
  250 CONTINUE

C             Old form of scattering correction is skipped when KCLDEM=1
C             ----------------------------------------------------------

      if (KCLDEM==0 .and. LTOPCL > 0) then
        ENA(LTOPCL)=ENA(LTOPCL)*(1-TRCTCA(K))+TRCTCA(K)*DFLB(LTOPCL+1,K)
        ENB(LTOPCL)=ENB(LTOPCL)*(1-TRCTCA(K))+TRCTCA(K)*DFLB(LTOPCL+1,K)
        ENC(LTOPCL)=ENC(LTOPCL)*(1-TRCTCA(K))+TRCTCA(K)*DFLB(LTOPCL+1,K)
      end if

!sl   ------------------------------------------------------------------
!sl                                       SURFACE LAYER FLUX COMPUTATION
!sl   with TAUSL,FTAUSL=0 defaults, surface layer calculation is skipped
!sl   ------------------------------------------------------------------

      DFSL(K)=FDNABC
!sl   TAUA=TAUSL(K)+FTAUSL(K)
!sl   if (TAUA > 1.D-06) GO TO 24
      BG=BG+FDNABC*TRGALB(K)
      UNA=BG
      UNB=BG
      UNC=BG
      FUNABC=BG
!sl   GO TO 245
!sl24 CONTINUE
!sl   ITS=TSL
!sl   WTS=TSL-ITS
!sl   WTS1=1-WTS
!sl   BS = PLANCK(ITS,K)*WTS1 + PLANCK(ITS+1,K)*WTS
!sl   TA=EXP(-TAUA)
!sl   TB=TA*TA
!sl   TC=(TB*TB*TA)**2
!sl   DNA(1)=(DNA(1)-BS)*TA+BS
!sl   DNB(1)=(DNB(1)-BS)*TB+BS
!sl   DNC(1)=(DNC(1)-BS)*TC+BS
!sl   FDNABC=A*DNA(1)+B*DNB(1)+C*DNC(1)
!sl   BG=BGFEMT(K)+FDNABC*TRGALB(K)
!sl   UNA=(BG-BS)*TA+BS
!sl   UNB=(BG-BS)*TB+BS
!sl   UNC=(BG-BS)*TC+BS
!sl   FUNABC=A*UNA+B*UNB+C*UNC
!sl   BSP = PLANCK(ITS+1,K)*WTS1 + PLANCK(ITS+2,K)*WTS
!sl   BSM = PLANCK(ITS-1,K)*WTS1 + PLANCK(ITS  ,K)*WTS
!sl   SLABS=1.D0-A*TA-B*TB-C*TC
!sl   TRSLTS=TRSLTS+(BSP-BSM)*SLABS
!sl   TRSLTG=TRSLTG+BGFEMD(K)*SLABS
!sl   TRSLBS=TRSLBS+BS*SLABS

C     ------------------------------------------------------------------
C                                                UPWARD FLUX COMPUTATION
C     ------------------------------------------------------------------

  245 DO 260 L=L1,NL
      TRUFLB(L)=TRUFLB(L)+FUNABC
      UFLB(L,K)=FUNABC

C       ----------------------------------------------------------------
C       At top-cloud level, find  component of  upwelling flux reflected
C       downward by cloud bottom and add to downwelling flux below cloud
C       ----------------------------------------------------------------

      if (L==LTOPCL .and. KCLDEM==1) then
        DEC=C*UNC*RIJTCK(1,K)+B*UNB*RIJTCK(2,K)+A*UNA*RIJTCK(3,K)
        DEB=C*UNC*RIJTCK(2,K)+B*UNB*RIJTCK(4,K)+A*UNA*RIJTCK(5,K)
        DEA=C*UNC*RIJTCK(3,K)+B*UNB*RIJTCK(5,K)+A*UNA*RIJTCK(6,K)
        DO LL=L,L1,-1
          DNA(LL)=DNA(LL)+DEA
          DNB(LL)=DNB(LL)+DEB
          DNC(LL)=DNC(LL)+DEC
          DDFLUX=A*DEA+B*DEB+C*DEC
          TRDFLB(LL)=TRDFLB(LL)+DDFLUX
          DFLB(LL,K)=DFLB(LL,K)+DDFLUX
          if (LL == L1) exit ! LL-loop
          DEA=DEA*TRA(LL-1)
          DEB=DEB*TRB(LL-1)
          DEC=DEC*TRC(LL-1)
        END DO
      end if
      XTRUL=XTRU(L,IMOL+1)
      TX=TRA(L)*XTRUL ! ; if(TX > 1) TX=1
      UNA=UNA*TX+ENA(L)
      TX=TRB(L)*XTRUL ! ; if(TX > 1) TX=1
      UNB=UNB*TX+ENB(L)
      TX=TRC(L)*XTRUL ! ; if(TX > 1) TX=1
      UNC=UNC*TX+ENC(L)
      FUNABC=A*UNA+B*UNB+C*UNC
  260 CONTINUE

      if (K==1) then
        TRUFTW=FUNABC
        TRDFGW=TRDFLB(1)
        TRUFGW=BG
        WINDZF(1)=UNA
        WINDZF(2)=UNB
        WINDZF(3)=UNC
      end if

      TRUFLB(NL+1)=TRUFLB(NL+1)+FUNABC
      UFLB(NL+1,K)=FUNABC
      UFSL(K)=UFLB(1,K)
      TOTLZF(1)=TOTLZF(1)+UNA
      TOTLZF(2)=TOTLZF(2)+UNB
      TOTLZF(3)=TOTLZF(3)+UNC

      GO TO 200  !  next K
  300 CONTINUE

      TRNFLB(L1:NL+1) = TRUFLB(L1:NL+1) - TRDFLB(L1:NL+1)
      TRFCRL(L1:NL)   = TRNFLB(L1+1:NL+1) - TRNFLB(L1:NL)

C**** Window region and spectr. integrated total flux diagnostics
      DO 390 II=0,3
      if (II > 0) then
        PFW = TOTLZF(II) ; IF (PFW < 1) PFW=1
        if (PFW > 899.999d0) PFW=899.999d0
        IPF=PFW
        TOTLZT(II) = TKPFT(IPF) + (PFW-IPF)*(TKPFT(IPF+1)-TKPFT(IPF))

        PFW = 10*WINDZF(II)
      else
        PFW = 10*TRUFTW
      end if
        IF (PFW < 1.0001d-2) PFW=1.0001d-2
        IF (PFW > 719.999d0) PFW=719.999d0
        IPF=PFW
        IF (PFW < 1) THEN
          PFW = 100.*PFW
          IPF = PFW ; DPF = PFW-IPF         ! IPF=  1- 99
        ELSE IF (PFW < 10) THEN
          PFW = 10.*PFW
          IPF = PFW ; DPF = PFW-IPF
          IPF = IPF + 90                    ! IPF=100-189
        ELSE
          IPF = PFW ; DPF = PFW-IPF
          IPF = IPF + 180                   ! IPF=190-899
        END IF
      if (II > 0) then
        WINDZT(II) = TKPFW(IPF) + DPF*(TKPFW(IPF+1)-TKPFW(IPF))
      else
        BTEMPW     = TKPFW(IPF) + DPF*(TKPFW(IPF+1)-TKPFW(IPF))
      end if
  390 CONTINUE

      RETURN
      END SUBROUTINE THERML
#else
!     old version of TAUGAS and THERML

      SUBROUTINE TAUGAS 1
      IMPLICIT NONE
C     ----------------------------------------------------------
C     TAUGAS INPUT REQUIRES:  L1,NL,PL,DPL,TLM,ULGAS
C                             TAUTBL,TAUWV0,XKCFC,H2OCN8,H2OCF8
C                             XUCH4,XUCH40,XUN2O,XUN2O0,ULOX,DUX
C                             XTRUP,XTU0,XTRDN,XTD0,CXUCO2,CXUO3
C                             DXTRUA,DXTRDA
C     TAUGAS OUTPUT DATA IS:  TRGXLK,XTRU/D,DXAERU/D,IP24C9
C     ----------------------------------------------------------

C     To achieve a particular amount of forcing, the amounts of
C     CO2,CH4,CFC11,CFC12,CFC.. are scaled by XXGAS: H2O    CO2   O3
      REAL*8, PARAMETER ::     XXGAS(13)        = (/ 1d0, .75d0, 1d0,
C        O2  NO2  N2O    CH4     F11     F12  N2C    F11+  F12+  SO2
     *  1d0, 1d0, 1d0, .65d0,  1.5d0,  1.1d0, 1d0, 1.5d0,  1d0,  1d0/)

      INTEGER, PARAMETER :: NPU2=14, NPU=5
      REAL*8, PARAMETER :: TLOX=181.d0, DTX=23.d0, P0=1013.25d0

      REAL*8, PARAMETER :: PX(NPX)= (/1000d0, 750d0, 500d0, 300d0,
     *        200d0, 100d0, 50d0, 20d0, 10d0,   5d0,   2d0,   1d0,
     *         .5d0,  .2d0, .1d0,.03d0,.01d0,.003d0,.001d0/)

      INTEGER, PARAMETER :: NGX(4) = (/12,12, 8,33/),
     *                     IG1X(4) = (/ 2,14,26, 1/)
      REAL*8, PARAMETER :: PDPU2(NPU2) = (/1.d4, 1.d5,2.d5,5.d5,
     *           1.d6,2.d6,5.d6, 1.d7,2.d7,5.d7, 1.d8,2.d8,5.d8, 1.d9/)
      REAL*8, PARAMETER ::  PU(NPU) = (/  50.,200.,800.,3200.,12800./)
      INTEGER, PARAMETER :: IGASX(20) = (/ 1, 2, 3, 1, 1, 2, 2, 3, 3, 6,
     *     6, 6, 7,13,13, 8, 8, 9, 9, 1/)
      INTEGER, PARAMETER :: KGX(20) =   (/ 1, 2, 3, 2, 3, 1, 3, 1, 2, 1,
     *     2, 3, 1, 1, 3, 2, 3, 2, 3, 4/)
      INTEGER, PARAMETER :: NUX(15) = (/25, 9, 9, 9, 9, 5, 5, 5, 5, 2, 2
     *     , 2, 2, 2,2/)
      INTEGER, PARAMETER :: IGUX(15) = (/ 0,300,408,480,588,660,720,760
     *     ,820,880,904,928,944,968,992/)

      REAL*8, PARAMETER ::  XKCFCW(8,2) = RESHAPE( (/
     + 12.4414,11.7842,11.3630,10.8109,10.3200, 9.8900, 9.3916, 8.8933,
     +  5.3994, 5.6429, 5.8793, 6.1687, 6.2300, 6.5200, 6.8650, 7.2100/)
     *     , (/8,2/) )

      REAL*8, PARAMETER ::  P24(24) = (/
     $ .100D+04,.973D+03,.934D+03,.865D+03,.752D+03,.603D+03,
     $ .439D+03,.283D+03,.156D+03,.754D+02,.350D+02,.162D+02,
     $ .754D+01,.350D+01,.162D+01,.743D+00,.340D+00,.152D+00,
     $ .701D-01,.347D-01,.159D-01,.750D-02,.350D-02,.100D-02/)
      REAL*8, PARAMETER ::  DP24(24) = (/
     $     24.4,32.0,46.6,89.8,136.8,162.0,165.4,146.9,106.5,55.2,25.6
     *     ,11.9,5.52,2.56,1.20,.551,.256,.119,.0452,.0256,.0119,.005,
     *     .003,.002/)
      REAL*8, PARAMETER ::  DLSQ2 =.1505d0,  ULMNH2=2.060d0,
     *     ULMNCH=-1.028d0, ULMNN2=-1.530d0, DLOG2 =.3010d0,
     *     ULMNO3=-1.393d0, ULMNCO= 1.529d0
      REAL*8 XTU(24,3),XTD(24,3),XUCH(9),XUN2(9),CXUO(7),CXUC(7)
      INTEGER MLGAS(20)
      INTEGER I,L,LL,IP,IULOW,IU,IPX,IAA,ITX
     *     ,IGAS,NG,KK,IK1,IK2,IPU,IK,NU,IUA
     *     ,IUB,IH2O0,IG
     *     ,IA,I24,IPP,ISKIPU,ISKIPD,IP24C(LX)
      REAL*8 UH2OL,UCO2L,UO3LL,UCH4L,UN2OL, CXCO2,CXO3,XCH4,XN2O
     *     ,TAUT1,TAUT2,TAUHFB,TAUCF,TAUIPG,TAUSUM,TAU11,TAU12
     *     ,QAA,QAB,QBA,QBB, PLL,FPL,PRAT,PRATT,PU2, U,UP,UGAS, FNU1
     *     ,UAA,UAB,UBA,UBB, WPB, WT,WTB,WTPU, XA,XB,XK,XUA,XUB, DU
     *     ,WAA,WAB,WBA,WBB,WAAA,WAAB,WABA,WABB,WBAA,WBAB,WBBA,WBBB

C                          MLGAS DEF.
C                          ----------
C     H2O: 1,4,5   CO2: 2,6,7   O3: 3,8,9   N2O: 10,11,12   CH4: 13
C     SO2: 14,15   CFC: 16-19   WVCON: 20

      MLGAS(:)=1  !  1:20

C              KWVCON = ON/OFF flag for water vapor continuum absorption
C              ---------------------------------------------------------
      IF(KWVCON < 1) MLGAS(20)=0

      UH2OL = LOG10 (1d-10 + XXGAS(1) * SUM(ULGAS(L1:NL,1)))
      UCO2L = LOG10 (1d-10 + XXGAS(2) * SUM(ULGAS(L1:NL,2)))
      UO3LL = LOG10 (1d-10 + XXGAS(3) * SUM(ULGAS(L1:NL,3)))
      UCH4L = LOG10 (1d-10 + XXGAS(7) * SUM(ULGAS(L1:NL,7)))
      UN2OL = LOG10 (1d-10 + XXGAS(6) * SUM(ULGAS(L1:NL,6)))

      IF (UH2OL < -9.958607315d0) THEN  !  if UH2O<1.1d-10 (low wtr vpr)
        IULOW=1
        XTU(:,:)=XTU0(:,:)                                    ! 1:24,1:3
        XTD(:,:)=XTD0(:,:)                                    ! 1:24,1:3
        XUCH(:)=XUCH40(:)                                     ! 1:9
        XUN2(:)=XUN2O0(:)                                     ! 1:9
        CXCO2=0.D0
        CXO3=0.D0
      ELSE
        IULOW=0
           du = UH2OL-ULMNH2 ; if (du<0) du=0
           I  = 1 + du/DLSQ2 ; if (I>14) I=14
           WT = I - du/DLSQ2
        XTU(:,:) = XTRUP(:,:,I+1)*(1-WT) + XTRUP(:,:,I)*WT    ! 1:24,1:3
        XTD(:,:) = XTRDN(:,:,I+1)*(1-WT) + XTRDN(:,:,I)*WT    ! 1:24,1:3
        XUCH(:)  = XUCH4(:,I+1)*(1-WT) + XUCH4(:,I)*WT        ! 1:9
        XUN2(:)  = XUN2O(:,I+1)*(1-WT) + XUN2O(:,I)*WT        ! 1:9
           cxuc(:)  = CXUCO2(:,I+1)*(1-WT) + CXUCO2(:,I)*WT   ! 1:7
           cxuo(:)  = CXUO3 (:,I+1)*(1-WT) + CXUO3 (:,I)*WT   ! 1:7
           du = UCO2L-ULMNCO ; if (du<0) du=0
           I  = 1 + du/DLOG2 ; if (I>6) I=6
           WT = I - du/DLOG2
        CXCO2 = CXUC(I+1)*(1-WT) + CXUC(I)*WT
           du = UO3LL-ULMNO3 ; if (du<0) du=0
           I  = 1 + du/DLOG2 ; if (I>6) I=6
           WT = I - du/DLOG2
        CXO3  = CXUO(I+1)*(1-WT) + CXUO(I)*WT
      END IF
           du = UCH4L-ULMNCH ; if (du<0) du=0
           I  = 1 + du/DLOG2 ; if (I>8) I=8
           WT = I - du/DLOG2
      XCH4 = XUCH(I+1)*(1-WT) + XUCH(I)*WT
           du = UN2OL-ULMNN2 ; if (du<0) du=0
           I  = 1 + du/DLOG2 ; if (I>8) I=8
           WT = I - du/DLOG2
      XN2O = XUN2(I+1)*(1-WT) + XUN2(I)*WT

C**** Find XTRU and XTRD from XTU and XTD
      XTRU(L1:NL,1:4)=1. ; XTRD(L1:NL,1:4)=1.            ! defaults
      IP=2
      DO 100 L=L1,NL
      PLL=PL(L)
      IF(PLL >= P24(1)) THEN                             ! PLL>P24_bot
        PRAT = DPL(L)/DP24(1)
        XTRU(L,2:4)=1-PRAT*(1 - XTU(1,1:3))
        XTRD(L,2:4)=1-PRAT*(1 - XTD(1,1:3))
        GO TO 100
      ENDIF
      DO WHILE (PLL < P24(IP))
        IP=IP+1
        IF(IP > 24) GO TO 200                 ! deflts for PLL<P24_top
      END DO                                     ! P24(IP)<PLL<P24(IP-1)
      WT = (P24(IP) - PLL) / (P24(IP) - P24(IP-1))
      PRAT        = DPL(L) / (DP24(IP-1)*WT + DP24(IP)*(1-WT))
      XTRU(L,2:4) = 1-PRAT*(1 - (XTU(IP-1,1:3)*WT + XTU(IP,1:3)*(1-WT)))
      XTRD(L,2:4) = 1-PRAT*(1 - (XTD(IP-1,1:3)*WT + XTD(IP,1:3)*(1-WT)))
  100 CONTINUE
      XTRD(NL,2:4)= 1

C**** Find IP24C s.t. P24(IP24C(L)) is closest to PL(L)
  200 I24=1
      DO L=L1,NL
        do while (P24(I24)>=PL(L) .and. I24<24) ; I24=I24+1 ; end do
        IP24C(L)=I24  ; if (I24 == 1) go to 270
        if (P24(I24-1)-PL(L) <= PL(L)-P24(I24)) IP24C(L)=I24-1
  270   IP24C9(L) = MIN( IP24C(L) , 9 )
      END DO

C**** Compute the correction terms DXAERU, DXAERD
      DXAERU(L1:NL,1:4,1:4,1:NL+4)=0.
      DXAERD(L1:NL,1:4,1:4,1:NL+4)=0.

      DO 275 L=L1,NL
      IP=IP24C(L)
      PRAT=DPL(L)/DP24(IP)
C**** For each L, collect terms from all cloud levels and 4 aerosols
      DO 275 IAA=1,NL+4
      ISKIPU=0
      ISKIPD=0
      IPP=IP
      PRATT=PRAT
      IF (IAA > NL ) THEN
        IA = IAA-NL+9                    ! IA=10-13 for aerosols
      ELSE
        IA = IP24C9(IAA)                 ! IA= 1- 9 for clouds
        IF (L < IAA) ISKIPU=1
        IF (L > IAA) ISKIPD=1
        IF (L > IAA .AND. IPP == IA) IPP=MIN(IPP+1,24)
        IF (L < IAA .AND. IPP == IA) IPP=MAX(IPP-1, 1)
        PRATT = DPL(L)/DP24(IPP)
      END IF

      IF (ISKIPU==1) GO TO 274
      DO IU=1,4
        DXAERU(L,2:4,IU,IAA) = 1 - XTRU(L,2:4) -
     -   ( 1 - (XTU(IPP,1:3) + DXTRUA(IPP,1:3,IU,IA)) )*PRATT
      END DO
      IF (ISKIPD==1) GO TO 275
  274 DO IU=1,4
        DXAERD(L,2:4,IU,IAA) = MAX(0.D0, 1 - XTRD(L,2:4) -
     -   ( 1 - (XTD(IPP,1:3) + MIN(1.,DXTRDA(IPP,1:3,IU,IA))) )*PRATT)
      END DO
  275 CONTINUE

C**** Find TRGXLK
      TRGXLK(L1:NL,1:33)=0.D0
      IPX=2
      DO 600 L=L1,NL
C**** Locate model layer pressure between IPX and IPX-1
  280 CONTINUE
      WPB = (PL(L)-PX(IPX))/(PX(IPX-1)-PX(IPX))
      IF(WPB >= 0 .or. IPX >= NPX) GO TO 290
      IPX = IPX+1
      GO TO 280
C**** Locate model layer temperature between ITX and ITX+1
  290 CONTINUE
      WTB = (TLM(L)-TLOX)/DTX + 1
      ITX = WTB  ;  IF(ITX < 1) ITX=1  ;  IF(ITX >= NTX) ITX=NTX-1
      WTB = WTB-ITX

      WBB = WPB*WTB
      WBA = WPB-WBB
      WAB = WTB-WBB
      WAA = 1 - (WBB+WBA+WAB)

      DO 500 IGAS=1,20
      IF(MLGAS(IGAS) < 1) GO TO 500
      KK   = IG1X(KGX(IGAS))
      NG   = NGX (KGX(IGAS))
      UGAS = ULGAS(L,IGASX(IGAS))*XXGAS(IGASX(IGAS))
      IF(IGAS == 16.OR.IGAS == 17) UGAS = UGAS + ULGAS(L,11)*XXGAS(11)

C                       Apply absorber scaling for H2O in CO2 & O3 bands
C                       ------------------------------------------------
      IF (IGAS == 4 .and. PL(L) > 350)
     *  UGAS = UGAS * MAX( 0.d0 , 1 + CXCO2*(PL(L)-350) )
      IF (IGAS == 5 .and. PL(L) > 350)
     *  UGAS = UGAS * MAX( 0.d0 , 1 + CXO3*(PL(L)-350) )

C                                         Modified scaling for CH4 & N2O
C                                         ------------------------------
      IF(PL(L) > 100) THEN
        FPL=MIN( (PL(L)-100)/300 , 1.D0)
        IF (IGAS==13)             UGAS=UGAS*(1+FPL*(XCH4-1))
        IF (IGAS>9 .AND. IGAS<13) UGAS=UGAS*(1+FPL*(XN2O-1))
      ENDIF

C                                               Absorber scaling for SO2
C                                               ------------------------
      IF(IGAS==14.AND.IULOW==0) UGAS=UGAS*3.
      IF(IGAS==14.AND.IULOW==1) UGAS=UGAS*2.
      IF(IGAS==15) UGAS=UGAS*1.3

      IF(IGAS < 20) GO TO 375

C     IGAS = 20                   Apply water vapor continuum absorption
C     ---------                   --------------------------------------
C                  KCSELF = ON/FF flag for H2O self broadening continuum
C                  -----------------------------------------------------
      IF(KCSELF <= 0) GO TO 335

      DO 330 IK1=1,2
      if (IK1==1) then
        U=UGAS*1.15d0 ; IK2=1                 ! thermal K-domain 1(-1)
      else      ! IK1=2
        U=UGAS ;  IK2=33                      ! thermal K-domain 2-33
      end if
      PU2 = PL(L)/DPL(L) * U**2
      IF (PU2 > PDPU2(1)) THEN
        IPU=2
        do while (PU2>PDPU2(IPU) .and. IPU<NPU2) ; IPU=IPU+1 ; end do
        WTPU   = (PU2-PDPU2(IPU-1))/(PDPU2(IPU)-PDPU2(IPU-1))
        DO IK=IK1,IK2
          TAUT1 = WTPU*(H2OCN8(IK,ITX,IPU)-H2OCN8(IK,ITX,IPU-1))+
     +            H2OCN8(IK,ITX,IPU-1)
          TAUT2 = WTPU*(H2OCN8(IK,ITX+1,IPU)-H2OCN8(IK,ITX+1,IPU-1))+
     +            H2OCN8(IK,ITX+1,IPU-1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      ELSE
        WTPU   = PU2/PDPU2(1)
        DO IK=IK1,IK2
          TAUT1 = WTPU*H2OCN8(IK,ITX,1)
          TAUT2 = WTPU*H2OCN8(IK,ITX+1,1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      END IF
  330 CONTINUE

C               KCFORN = ON/FF flag for H2O foreign broadening continuum
C               --------------------------------------------------------
  335 IF(KCFORN < 1) GO TO 500
      KK=IG1X(KGX(IGAS))
      DO 370 IK1=1,2
      if(IK1==1) then
        U=UGAS*1.15d0 ; IK2=1
      else      ! IK1=2
        U=UGAS ;  IK2=33
      end if
      UP=PL(L)/P0*U
      IF(UP > PU(1)) THEN
        IPU=2
        DO WHILE (UP>PU(IPU) .and. IPU<NPU) ; IPU=IPU+1 ; END DO
        WTPU=(UP-PU(IPU-1))/(PU(IPU)-PU(IPU-1))
        DO IK=IK1,IK2
          TAUT1=WTPU*(H2OCF8(IK,ITX,IPU)-H2OCF8(IK,ITX,IPU-1))+
     +          H2OCF8(IK,ITX,IPU-1)
          TAUT2=WTPU*(H2OCF8(IK,ITX+1,IPU)-H2OCF8(IK,ITX+1,IPU-1))+
     +          H2OCF8(IK,ITX+1,IPU-1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      ELSE
        DO IK=IK1,IK2
          WTPU=UP/PU(1)
          TAUT1=WTPU*H2OCF8(IK,ITX,1)
          TAUT2=WTPU*H2OCF8(IK,ITX+1,1)
          TRGXLK(L,KK) = TRGXLK(L,KK) + (WTB*(TAUT2-TAUT1) + TAUT1)
          KK=KK+1
        END DO
      END IF
  370 CONTINUE
      GO TO 500

  375 IF(IGAS < 16) GO TO 385
C                               IGAS=16-19       Chloro Fluoro Carbons
C                               ----------       ---------------------
      UGAS=UGAS*1.85
      DO IK=1,NG
        XA=WTB*(XKCFC(IK,ITX+1,IGAS)-XKCFC(IK,ITX,IGAS))+
     +     XKCFC(IK,ITX,IGAS)
        XB=WTB*(XKCFC(IK,ITX+1,IGAS)-XKCFC(IK,ITX,IGAS))+
     +     XKCFC(IK,ITX,IGAS)
        XK=WPB*(XA-XB)+XB
        TAUCF=XK*UGAS
        TRGXLK(L,KK)=TRGXLK(L,KK)+TAUCF
        KK=KK+1
      END DO
      GO TO 500

  385 CONTINUE               !  IGAS=1-15        H2O,CO2,O3,N2O,CH4,SO2
C                               ---------        ----------------------
      NU = NUX(IGAS)
      XUA = (UGAS-ULOX(IPX  ,IGAS)) / DUX(IPX  ,IGAS)
      XUB = (UGAS-ULOX(IPX-1,IGAS)) / DUX(IPX-1,IGAS)
C     IF(NU <= 1) then  ;  XUA = 0  ;  XUB = 0  ;  endif
      IUA = XUA
      IUB = XUB

      QAA = 1
      QAB = 1
      IF(XUA <= 0)  then
         XUA = 0
         IUA = 0
         QAA = UGAS /  ULOX(IPX,IGAS)
         QAB = UGAS / (ULOX(IPX,IGAS)+DUX(IPX,IGAS))
      endif
      IF(XUA >= NU-1)  then
         XUA = NU-1
         IUA = NU-2
         QAA = UGAS / (ULOX(IPX,IGAS)+DUX(IPX,IGAS)*(NU-2))
         QAB = UGAS / (ULOX(IPX,IGAS)+DUX(IPX,IGAS)*(NU-1))
      endif
      QBA = 1
      QBB = 1
      IF(XUB <= 0)  then
         XUB = 0
         IUB = 0
         QBA = UGAS /  ULOX(IPX-1,IGAS)
         QBB = UGAS / (ULOX(IPX-1,IGAS)+DUX(IPX-1,IGAS))
      endif
      IF(XUB >= NU-1)  then
         XUB = NU-1
         IUB = NU-2
         QBA = UGAS / (ULOX(IPX-1,IGAS)+DUX(IPX-1,IGAS)*(NU-2))
         QBB = UGAS / (ULOX(IPX-1,IGAS)+DUX(IPX-1,IGAS)*(NU-1))
      endif
      UAB = XUA-IUA
      UBB = XUB-IUB
      UAA = 1-UAB
      UBA = 1-UBB

      WAAA = WAA*UAA*QAA
      WAAB = WAA*UAB*QAB
      WABA = WAB*UAA*QAA
      WABB = WAB*UAB*QAB
      WBAA = WBA*UBA*QBA
      WBAB = WBA*UBB*QBB
      WBBA = WBB*UBA*QBA
      WBBB = WBB*UBB*QBB

      IH2O0=0
      IF( (IGAS==6.OR.IGAS==8.OR.IGAS==10.OR.IGAS==13.OR.IGAS==14)
     +   .and. IULOW == 1 ) IH2O0=1

      DO 430 IG=1,NG
      IF(IH2O0 == 0) THEN
      TAUIPG = WAAA*TAUTBL(IG+IGUX(IGAS)+NG* IUA   ,ITX  ,IPX)
     +       + WAAB*TAUTBL(IG+IGUX(IGAS)+NG*(IUA+1),ITX  ,IPX)
     +       + WABA*TAUTBL(IG+IGUX(IGAS)+NG* IUA   ,ITX+1,IPX)
     +       + WABB*TAUTBL(IG+IGUX(IGAS)+NG*(IUA+1),ITX+1,IPX)
     +       + WBAA*TAUTBL(IG+IGUX(IGAS)+NG* IUB   ,ITX  ,IPX-1)
     +       + WBAB*TAUTBL(IG+IGUX(IGAS)+NG*(IUB+1),ITX  ,IPX-1)
     +       + WBBA*TAUTBL(IG+IGUX(IGAS)+NG* IUB   ,ITX+1,IPX-1)
     +       + WBBB*TAUTBL(IG+IGUX(IGAS)+NG*(IUB+1),ITX+1,IPX-1)
      ELSE
      TAUIPG = WAAA*TAUWV0(IG+IGUX(IGAS)+NG* IUA   ,ITX  ,IPX)  ! low WV
     +       + WAAB*TAUWV0(IG+IGUX(IGAS)+NG*(IUA+1),ITX  ,IPX)
     +       + WABA*TAUWV0(IG+IGUX(IGAS)+NG* IUA   ,ITX+1,IPX)
     +       + WABB*TAUWV0(IG+IGUX(IGAS)+NG*(IUA+1),ITX+1,IPX)
     +       + WBAA*TAUWV0(IG+IGUX(IGAS)+NG* IUB   ,ITX  ,IPX-1)
     +       + WBAB*TAUWV0(IG+IGUX(IGAS)+NG*(IUB+1),ITX  ,IPX-1)
     +       + WBBA*TAUWV0(IG+IGUX(IGAS)+NG* IUB   ,ITX+1,IPX-1)
     +       + WBBB*TAUWV0(IG+IGUX(IGAS)+NG*(IUB+1),ITX+1,IPX-1)
      ENDIF

      TAUSUM=TRGXLK(L,KK)+TAUIPG
      IF(TAUSUM > 0) TRGXLK(L,KK)=TAUSUM
      KK=KK+1
  430 CONTINUE
  500 CONTINUE
C                               CFC11 and CFC12 Window Absorption (1997)
C                               ----------------------------------------

      IF(MLGAS(16) == 1.OR.MLGAS(17) == 1) THEN
        XK=WTB*(XKCFCW(ITX+1,1)-XKCFCW(ITX,1))+XKCFCW(ITX,1)
        TAU11=XK*(ULGAS(L,8)*XXGAS(8)+ULGAS(L,11)*XXGAS(11))
        TRGXLK(L,1)=TRGXLK(L,1)+TAU11
      ENDIF
      IF(MLGAS(18) == 1.OR.MLGAS(19) == 1) THEN
        XK=WTB*(XKCFCW(ITX+1,2)-XKCFCW(ITX,2))+XKCFCW(ITX,2)
        TAU12=XK*ULGAS(L,9)*XXGAS(9)
        TRGXLK(L,1)=TRGXLK(L,1)+TAU12
      ENDIF
  600 CONTINUE

      RETURN
      END SUBROUTINE TAUGAS


      SUBROUTINE THERML 1
      IMPLICIT NONE
C     ------------------------------------------------------------------
C             Top-cloud Thermal Scattering Correction Control Parameters
C             ----------------------------------------------------------
C
C             ECLTRA = 1.0  Scattering correction is enabled
C             with KCLDEM = 1, Rigorous scattering correction is applied
C             with KCLDEM = 0, Approximate scattering correction is used
C
C             ECLTRA = 0.0  No scattering correction is used
C                                          (Independent of KCLDEM value)
C
C     ------------------------------------------------------------------
C                                   Lower Edge Temperature Interpolation
C                                   ------------------------------------
C     TLGRAD=1.0  (Default)
C                 Layer-mean temperatures (TLM) supplied by GCM are used
C                 to define the layer edge temperature TLT (top) and TLB
C                 (bottom) using overall atmospheric temperature profile
C                 to establish temperature gradient within each layer so
C                 as to minimize the temperature discontinuities between
C                 layer edges and to conserve layer thermal energy.
C
C     TLGRAD=0.0  This results in isothermal layers with TLT = TLB = TLM
C
C     TLGRAD<0.0  TLT and TLB are used as specified, without any further
C                 adjustments.  This is mainly for off-line use when the
C                 temperature profile (TLM,TLT,TLB) can be fully defined
C                 from a continuous temperature profile.
C
C     NOTE:       TLGRAD can also accommodate values between 0.0 and 1.0
C
C     PTLISO      (Default PTLISO=2.5mb)
C                 Pressure level above which model layers are defined to
C                 be isothermal.  This is appropriate for optically thin
C                 layers where emitted flux depends on mean temperature.
C     ------------------------------------------------------------------
      REAL*8, PARAMETER :: R6=.16666667D0, R24=4.1666667D-02
      REAL*8, PARAMETER :: A=0.3825D0,B=0.5742D0,C=0.0433D0

      REAL*8 TA,TB,TC,P1,P2,P3,P4,DT1CPT,DTHALF,CLTAUX,CLTAUS,CLCOSB
     *     ,CTX,DT2,DT1,CTG,DG2,DG1,WT1,WT2,WT3,WT4,WT5,WT6,WT7
     *     ,WT8,BG,DNACUM,DNBCUM,DNCCUM,TAUAG,TAUAP,TAUBP,TAUCP,TAUAX
     *     ,TAUBX,TAUCX,XTRDL,BTOP,BBOT,BBAR,TX,PLBN,F,TAUA,TAUB,TAUC
     *     ,BDIF,BBTA,BBTB,BBTC,TRANA,TRANB,TRANC,DEC
     *     ,DEB,DEA,COALB1,COALB2,COALB3,FDNABC,UNA,UNB,UNC,FUNABC
     *     ,PFW,DPF,CTP,DP1,DP2,TAUBG,TAUCG,DDFLUX,XTRUL
      REAL*8 ENA(LX),ENB(LX),ENC(LX), TRA(LX),TRB(LX),TRC(LX)
      REAL*8 DNA(LX),DNB(LX),DNC(LX), WTLB(LX),WTLT(LX)
      REAL*8 RIJTCK(6,33), FDXTCK(3,33),FEMTCK(3,33),ALBTCK(3,33)
      REAL*8 CLPI0(33),CLPI0K
      REAL*8 SUMA(LX+4),DXTUA(LX,4),DXTDA(LX,4),CSUM
      INTEGER K,L,LL,II,ITL,ICT,IT1,IT2,IP1,IP2,ICG,IG1,IG2,IMOL
     *     ,IPF,ICP,ITLT(LX),ITLB(LX)
     *     ,LCL(LX),ia,iaa,ic,iu,lvlo,lvhi,lskip,lcbot,nclds,icomb

C-----------------------------------------------------------------------
C                                   Layer edge temperature interpolation
C-----------------------------------------------------------------------
      if (TLGRAD < 0.D0) GO TO 130
      TA = TLM(L1)
      TB = TLM(L1+1)
      P1 = PLB(L1)
      P2 = PLB(L1+1)
      P3 = PLB(L1+2)
      DT1CPT = .5*TA*(P1**.286d0-P2**.286d0) / PL(L1)**.286d0
      DTHALF = (TA-TB)*(P1-P2)/(P1-P3)
      if (DTHALF > DT1CPT) DTHALF = DT1CPT
      TLB(L1) = TA+DTHALF*TLGRAD
      TLT(L1) = TA-DTHALF*TLGRAD
      DO L = L1+1,NL-1
        TC = TLM(L+1)
        P4 = PLB(L+2)
        DTHALF = .5*((TA-TB)/(P1-P3)+(TB-TC)/(P2-P4))*(P2-P3)*TLGRAD
        TLB(L) = TB+DTHALF
        TLT(L) = TB-DTHALF
        TA = TB
        TB = TC
        P1 = P2
        P2 = P3
        P3 = P4
      END DO
      DTHALF = (TA-TB)*(P2-P3)/(P1-P3)*TLGRAD
      TLB(NL) = TC+DTHALF
      TLT(NL) = TC-DTHALF
      DO L = NL,L1,-1
        if (PLB(L) > PTLISO) GO TO 130
        TLT(L) = TLM(L)
        TLB(L) = TLM(L)
      END DO
  130 CONTINUE
      TLB(NL+1) = TLT(NL)

C     ------------------------------------------------------------------
C                   weight assignments for Planck function interpolation
C                    (Effective range is from TK = 124 K to TK = 373 K)
C     ------------------------------------------------------------------

      DO 140 L=L1,NL
      ITLB(L) = TLB(L)
      WTLB(L) = TLB(L)-ITLB(L)
      if (ITLB(L) < 124) ITLB(L) = 124
      if (ITLB(L) > 372) ITLB(L) = 372
      ITLT(L) = TLT(L)
      WTLT(L) = TLT(L)-ITLT(L)
      if (ITLT(L) < 124) ITLT(L) = 124
      if (ITLT(L) > 372) ITLT(L) = 372
  140 CONTINUE

      if (LTOPCL==0) GO TO 180

      DO 170 K=1,33
      CLTAUX=TXCTPG(K)+TRGXLK(LTOPCL,K)+1d-10
      CLTAUS=TSCTPG(K)
      CLCOSB=TGCTPG(K)
      CLPI0K=CLTAUS*ECLTRA/CLTAUX
      CLPI0(K)=CLPI0K
      CTX=CLTAUX*10.D0
      if (CLTAUX >= 3.D0) then
        CTX=CLTAUX*2 + 24
        if (CTX > 47.999999D0) CTX=47.999999D0
      end if
      ICT=CTX
      DT2=CTX-ICT
      DT1=1.D0-DT2
      IT1=ICT+1
      IT2=ICT+2
      CTP=CLPI0K*20.D0
      ICP=CTP
      DP2=CTP-ICP
      DP1=1.D0-DP2
      IP1=ICP+1
      IP2=ICP+2
      CTG=CLCOSB*20.D0
      ICG=CTG
      DG2=CTG-ICG
      DG1=1.D0-DG2
      IG1=ICG+1
      IG2=ICG+2
      WT1=DT1*DP1*DG1
      WT2=DT2*DP1*DG1
      WT3=DT2*DP2*DG1
      WT4=DT1*DP2*DG1
      WT5=DT1*DP1*DG2
      WT6=DT2*DP1*DG2
      WT7=DT2*DP2*DG2
      WT8=DT1*DP2*DG2
      RIJTCK(:,K)=WT1*RIJTPG(:,IT1,IP1,IG1)+WT2*RIJTPG(:,IT2,IP1,IG1) ! 1:6
     +           +WT3*RIJTPG(:,IT2,IP2,IG1)+WT4*RIJTPG(:,IT1,IP2,IG1)
     +           +WT5*RIJTPG(:,IT1,IP1,IG2)+WT6*RIJTPG(:,IT2,IP1,IG2)
     +           +WT7*RIJTPG(:,IT2,IP2,IG2)+WT8*RIJTPG(:,IT1,IP2,IG2)
      FEMTCK(:,K)=WT1*FEMTPG(:,IT1,IP1,IG1)+WT2*FEMTPG(:,IT2,IP1,IG1) ! 1:3
     +           +WT3*FEMTPG(:,IT2,IP2,IG1)+WT4*FEMTPG(:,IT1,IP2,IG1)
     +           +WT5*FEMTPG(:,IT1,IP1,IG2)+WT6*FEMTPG(:,IT2,IP1,IG2)
     +           +WT7*FEMTPG(:,IT2,IP2,IG2)+WT8*FEMTPG(:,IT1,IP2,IG2)
      FDXTCK(:,K)=WT1*FDXTPG(:,IT1,IP1,IG1)+WT2*FDXTPG(:,IT2,IP1,IG1)
     +           +WT3*FDXTPG(:,IT2,IP2,IG1)+WT4*FDXTPG(:,IT1,IP2,IG1)
     +           +WT5*FDXTPG(:,IT1,IP1,IG2)+WT6*FDXTPG(:,IT2,IP1,IG2)
     +           +WT7*FDXTPG(:,IT2,IP2,IG2)+WT8*FDXTPG(:,IT1,IP2,IG2)
  170 CONTINUE

  180 CONTINUE
      TRDFLB(:)=0.D0
      TRUFLB(:)=0.D0

      BG=BGFEMT(1)
      TOTLZF(1:3)=0.D0
!sl   TRSLTS=0.D0
!sl   TRSLTG=0.D0
!sl   TRSLBS=0.D0

C**** Collect cloud and aerosol LW-absorption and cloud levels
      LSKIP=0
      SUMA(:)=0.         ! LW-abs. from aeros and cloud layers
      LVLO=0 ; LVHI=0    ! range of layers with volc. aerosols
      CSUM=0             ! cloud LW-absorption - column amount
      NCLDS=0            ! number of layers containing clouds
      LCL(:)=0           ! cloud levels top->bottom

C**** Modify XTRD if clouds are present
      LCBOT=0
      if (NCLDS > 0) then
        LCBOT=LCL(NCLDS)                   ! LCTOP=LCL(1)
        XTRD(LCBOT/2 + 1:LSKIP,2:4) = 1
      end if

C**** Find flux corrections DXTUA,DXTDA  from DXAERU,DXAERD
      DXTUA(:,:)=0. ; DXTDA(:,:)=0.
      IC=0
      DO 195 IAA=NL+4,L1,-1
      IF (IAA <= NL) then                  ! Clouds
        IF (SUMA(IAA) < 1.E-2) GO TO 195
        IA=IP24C9(IAA)                     ! IA=1-9
        IC=IC+1
      ELSE                                 ! aerosols
        if (SUMA(IAA) < 1.E-4) GO TO 195
        IA=IAA-NL+9                        ! IA=10-13 (13=volc.aeros)
      ENDIF
!         Try for SAX(IU-1)<SUMA<SAX(IU) IU=2 or 3(or 4 if volc.aeros)
      IU=3
      IF (IA==13 .and. SUMA(IAA) > SAX(3,IA)) IU=4
      IF (SUMA(IAA) <= SAX(2,IA)) IU=2
      WT1=(SUMA(IAA)-SAX(IU-1,IA))/(SAX(IU,IA)-SAX(IU-1,IA))

      if (WT1 > 1) WT1=1            ! no extrapolation for large taus
      WT2=1-WT1
      WT3=WT1 ; WT4=WT2             ! 2 extrapolations for small taus
      IF (WT1 < 0) THEN
        WT1=0        ; WT2 = SUMA(IAA)/SAX(1,IA)  ! up
        WT3=.5*WT3   ; WT4 = .5*(WT4 + WT2)       ! down
      END IF

      DO 194 L=L1,NL
      IF (IA==13 .and. L<LVLO) GO TO 193
      DXTUA(L,2:4) = DXTUA(L,2:4) +
     +  (DXAERU(L,2:4,IU,IAA)*WT1 + DXAERU(L,2:4,IU-1,IAA)*WT2)
      IF (IA==13 .and. L>LVHI) GO TO 194
  193 CONTINUE
      IF (L <= LCL(IC+1) .and. IC .ne. NCLDS) GO TO 194
      IF (L <= LSKIP .and. L > LCBOT/2) GO TO 194
      DXTDA(L,2:4) = DXTDA(L,2:4) +
     +  (DXAERD(L,2:4,IU,IAA)*WT3 + DXAERD(L,2:4,IU-1,IAA)*WT4)
  194 CONTINUE
  195 CONTINUE

C     ------------------------------------------------------------------
C                                                      LOOP OVER K-BANDS
C     ------------------------------------------------------------------
      K=0
      IMOL=0
  200 CONTINUE
      K=K+1
      if (K > 33) GO TO 300
      BG=BGFEMT(K)
      if (K > 1 .and. K < 14) IMOL=1
      if (K > 13 .and. K < 26) IMOL=2
      if (K > 25) IMOL=3
      DFLB(NL+1,K)=0.D0
      DNACUM=0.D0
      DNBCUM=0.D0
      DNCCUM=0.D0
C**** Find top layer with absorbers: L=Ltop
      DO 210 L=NL,L1,-1
      TAUAG=TRGXLK(L,K)
      TAUAP=TRCALK(L,K)+TRAALK(L,K)+TRBALK(L,K)+TRDALK(L,K)+TRVALK(L,K)
      TAUAX=TAUAG+TAUAP
      if (TAUAX > 1.D-06) GO TO 216
      DFLB(L,K)=0.D0
      ENA(L)=0.D0
      DNA(L)=0.D0
      TRA(L)=1.D0
      ENB(L)=0.D0
      DNB(L)=0.D0
      TRB(L)=1.D0
      ENC(L)=0.D0
      DNC(L)=0.D0
      TRC(L)=1.D0
  210 CONTINUE
      UFLB(L1:NL+1,K)=BG                 ! no absorbers in whole column
      TRUFLB(L1:NL+1)=TRUFLB(L1:NL+1)+BG
      TOTLZF(1)=TOTLZF(1)+BG
      TOTLZF(2)=TOTLZF(2)+BG
      TOTLZF(3)=TOTLZF(3)+BG
      GO TO 200                        ! next K

C     ------------------------------------------------------------------
C                                              DOWNWARD FLUX COMPUTATION
C     ------------------------------------------------------------------
  215 CONTINUE                   ! loop over layers L=Ltop,Ltop-1,...,L1
      TAUAG=TRGXLK(L,K)
      TAUAP=TRCALK(L,K)+TRAALK(L,K)+TRBALK(L,K)+TRDALK(L,K)+TRVALK(L,K)
      TAUAX=TAUAG+TAUAP

  216 XTRDL=XTRD(L,IMOL+1)+DXTDA(L,IMOL+1)
      BTOP = PLANCK(ITLT(L),K)-
     -      (PLANCK(ITLT(L),K)-PLANCK(ITLT(L)+1,K))*WTLT(L)
      BBOT = PLANCK(ITLB(L),K)-
     -      (PLANCK(ITLB(L),K)-PLANCK(ITLB(L)+1,K))*WTLB(L)

C               Optically thin limit emission/transmission approximation
C               --------------------------------------------------------

      IF (TAUAX >= 1.D-04) GO TO 220
      TAUBX=TAUAX+TAUAX
      TAUCX=10.D0*TAUAX
      BBAR=0.5D0*(BTOP+BBOT)
      TRA(L)=1.D0-TAUAX
      ENA(L)=BBAR*TAUAX
      DNA(L)=ENA(L)
      TX=TRA(L)*XTRDL ; if (TX > 1) TX=1
      DNACUM=DNACUM*TX+DNA(L)
      TRB(L)=1.D0-TAUBX
      ENB(L)=BBAR*TAUBX
      DNB(L)=ENB(L)
      TX=TRB(L)*XTRDL ; if (TX > 1) TX=1
      DNBCUM=DNBCUM*TX+DNB(L)
      TRC(L)=1.D0-TAUCX
      ENC(L)=BBAR*TAUCX
      DNC(L)=ENC(L)
      TX=TRC(L)*XTRDL ; if (TX > 1) TX=1
      DNCCUM=DNCCUM*TX+DNC(L)
      GO TO 230

C                     TAUB absorber-dependent extinction path adjustment
C                     --------------------------------------------------

  220 PLBN=PLB(L)
      ICOMB=0
      TAUBG=TAUAG+TAUAG
      TAUCG=10.D0*TAUAG

      F=1
      if (IMOL==3 .and. PLBN>500 .and. TAUAG>.05d0 .and. TAUAG<.25) then
        F=23.71D0*TAUAG**2-7.113D0*TAUAG+1.296D0
        GO TO 221
      end if

      if (TAUAG > .1D0) then
        if      (IMOL==1) then
          if (PLBN > 250.D0) then
            F=.761D0
            if (TAUAG < 3.D0) F=.92D0-.053D0*TAUAG
            if (TAUAG < .2D0) F=1.091D0-.906D0*TAUAG
          else
            F=.718D0
            if (TAUAG < 2.5D0) F=.90D0-.073D0*TAUAG
            if (TAUAG < .2D0) F=1.115D0-1.146D0*TAUAG
          end if
        else if (IMOL==2) then
          if (PLBN > 250.D0) then
            F=.590D0
            if (TAUAG < 3.5D0) F=.93D0-.097D0*TAUAG
            if (TAUAG < .2D0) F=1.089D0-.894D0*TAUAG
          else
            F=.703D0
            if (TAUAG < 3.5D0) F=.92D0-.062D0*TAUAG
            if (TAUAG < .2D0) F=1.092D0-.924D0*TAUAG
          end if
        else if (IMOL==3) then
          if (PLBN > 250.D0) then
            F=.982D0
            if (TAUAG < .5D0) F=.99D0-.016D0*TAUAG
            if (TAUAG < .2D0) F=1.013D0-.132D0*TAUAG
          else
            F=.748D0
            if (TAUAG < 3.7D0) F=.97D0-.060D0*TAUAG
            if (TAUAG < .2D0) F=1.042D0-.420D0*TAUAG
          end if
        end if
      end if
  221 TAUBG=TAUBG*F

C                     TAUC absorber-dependent extinction path adjustment
C                     --------------------------------------------------
      F=1
      if (IMOL==3 .and. PLBN>500 .and. TAUAG>.01d0 .and. TAUAG<.25) then
        F=26.14D0*TAUAG**2-6.796D0*TAUAG+1.065D0
        GO TO 222
      end if

      if (TAUAG > .01D0) then
        if      (IMOL==1) then
          if (PLBN > 250.D0) then
            F=.712D0
            if (TAUAG < .37D0) F=.96D0-.67D0*TAUAG
            if (TAUAG < .02D0) F=1.053D0-5.34D0*TAUAG
          else
            F=.536D0
            if (TAUAG < .47D0) F=.87D0-.71D0*TAUAG
            if (TAUAG < .02D0) F=1.144D0-14.42D0*TAUAG
          end if
        else if (IMOL==2) then
          if (PLBN > 250.D0) then
            F=.710D0
            if (TAUAG < .75D0) F=.95D0-.32D0*TAUAG
            if (TAUAG < .02D0) F=1.056D0-5.64D0*TAUAG
          else
            F=.487D0
            if (TAUAG < .70D0) F=.90D0-.59D0*TAUAG
            if (TAUAG < .02D0) F=1.112D0-11.18D0*TAUAG
          end if
        else if (IMOL==3) then
          if (PLBN > 250.D0) then
            F=.961D0
            if (TAUAG < .5D0) F=.98D0-.039D0*TAUAG
            if (TAUAG < .02D0) F=1.021D0-2.08D0*TAUAG
          else
            F=.777D0
            if (TAUAG < .70D0) F=.98D0-.29D0*TAUAG
            if (TAUAG < .02D0) F=1.026D0-2.58D0*TAUAG
          end if
        end if
      end if
  222 TAUCG=TAUCG*F

      IF (ICOMB==0) THEN
        TAUBP=TAUAP+TAUAP
        TAUCP=10.D0*TAUAP
        TAUA=TAUAG+TAUAP
        TAUB=TAUBG+TAUBP
        TAUC=TAUCG+TAUCP
      ELSE
        TAUA=TAUAG
        TAUB=TAUBG
        TAUC=TAUCG
      END IF

      if (L==LTOPCL .and. KCLDEM==1) GO TO 225

      BDIF=BBOT-BTOP
      BBTA=BDIF/TAUA
      BBTB=BDIF/TAUB
      BBTC=BDIF/TAUC

C            Optically thick limit non-scattering emission approximation
C            -----------------------------------------------------------

      if (TAUA > 9.D0) then
        TRA(L)=0.D0
        TRB(L)=0.D0
        TRC(L)=0.D0
        ENA(L)=BTOP+BBTA
        ENB(L)=BTOP+BBTB
        ENC(L)=BTOP+BBTC
        DNA(L)=BBOT-BBTA
        DNB(L)=BBOT-BBTB
        DNC(L)=BBOT-BBTC
        DNACUM=BBOT-BBTA
        DNBCUM=BBOT-BBTB
        DNCCUM=BBOT-BBTC
        GO TO 230
      end if

      if (TAUA < 0.5D0) then
        TRANA = 1 - TAUA + (.5 - R6*TAUA + R24*(TAUA*TAUA))*(TAUA*TAUA)
      else
        TRANA = EXP(-TAUA)
      end if
      if (TAUB < 0.5D0) then
        TRANB = 1 - TAUB + (.5 - R6*TAUB + R24*(TAUB*TAUB))*(TAUB*TAUB)
      else
        TRANB = EXP(-TAUB)
      end if
      if (TAUC < 0.5D0) then
        TRANC = 1 - TAUC + (.5 - R6*TAUC + R24*(TAUC*TAUC))*(TAUC*TAUC)
      else
        TRANC = EXP(-TAUC)
      end if

      TRA(L)=TRANA
      ENA(L)=BTOP+BBTA-(BBOT+BBTA)*TRANA
      DNA(L)=BBOT-BBTA-(BTOP-BBTA)*TRANA
      TX=TRANA*XTRDL ; if (TX > 1) TX=1
      DNACUM=DNACUM*TX+DNA(L)
      TRB(L)=TRANB
      ENB(L)=BTOP+BBTB-(BBOT+BBTB)*TRANB
      DNB(L)=BBOT-BBTB-(BTOP-BBTB)*TRANB
      TX=TRANB*XTRDL ; if (TX > 1) TX=1
      DNBCUM=DNBCUM*TX+DNB(L)
      TRC(L)=TRANC
      ENC(L)=BTOP+BBTC-(BBOT+BBTC)*TRANC
      DNC(L)=BBOT-BBTC-(BTOP-BBTC)*TRANC
      TX=TRANC*XTRDL ; if (TX > 1) TX=1
      DNCCUM=DNCCUM*TX+DNC(L)
      GO TO 230

C                          ---------------------------------------------
C                          Top-cloud multiple scattering corrections for
C                          emitted, transmitted, and reflected radiances
C                          and fluxes at the top-cloud (L=LTOPCL) level.
C                          ---------------------------------------------

  225 CONTINUE
      IF (ICOMB==1) THEN
        TAUBP=TAUAP*(TAUBG/TAUAG)
        TAUCP=TAUAP*(TAUCG/TAUAG)
        TAUBG=TRGXLK(L,K)*(TAUBG/TAUAG)
        TAUCG=TRGXLK(L,K)*(TAUCG/TAUAG)
        TAUAG=TAUAG-TAUAP
      END IF
      TRA(L)=EXP(-TAUAG-TAUAP*FDXTCK(3,K))
      TRB(L)=EXP(-TAUBG-TAUBP*FDXTCK(2,K))
      TRC(L)=EXP(-TAUCG-TAUCP*FDXTCK(1,K))
      DEC=C*DNCCUM*RIJTCK(1,K)+B*DNBCUM*RIJTCK(2,K)+A*DNACUM*RIJTCK(3,K)
      DEB=C*DNCCUM*RIJTCK(2,K)+B*DNBCUM*RIJTCK(4,K)+A*DNACUM*RIJTCK(5,K)
      DEA=C*DNCCUM*RIJTCK(3,K)+B*DNBCUM*RIJTCK(5,K)+A*DNACUM*RIJTCK(6,K)
      ALBTCK(1,K)=C*RIJTCK(1,K)+B*RIJTCK(2,K)+A*RIJTCK(3,K)
      ALBTCK(2,K)=C*RIJTCK(2,K)+B*RIJTCK(4,K)+A*RIJTCK(5,K)
      ALBTCK(3,K)=C*RIJTCK(3,K)+B*RIJTCK(5,K)+A*RIJTCK(6,K)
      COALB1=1.D0-ALBTCK(1,K)
      COALB2=1.D0-ALBTCK(2,K)
      COALB3=1.D0-ALBTCK(3,K)
      TAUA=TAUAG+TAUAP*FEMTCK(3,K)
      TAUB=TAUBG+TAUBP*FEMTCK(2,K)
      TAUC=TAUCG+TAUCP*FEMTCK(1,K)
      TRANA=EXP(-TAUA)
      TRANB=EXP(-TAUB)
      TRANC=EXP(-TAUC)
      BDIF=BBOT-BTOP
      BBTA=BDIF/TAUA
      BBTB=BDIF/TAUB
      BBTC=BDIF/TAUC
      ENA(L)=(BTOP+BBTA-(BBOT+BBTA)*TRANA)*COALB3
      DNA(L)=(BBOT-BBTA-(BTOP-BBTA)*TRANA)*COALB3
      TX=TRA(L)*XTRDL ; if (TX > 1) TX=1
      DNACUM=DNACUM*TX+DNA(L)
      ENB(L)=(BTOP+BBTB-(BBOT+BBTB)*TRANB)*COALB2
      DNB(L)=(BBOT-BBTB-(BTOP-BBTB)*TRANB)*COALB2
      TX=TRB(L)*XTRDL ; if (TX > 1) TX=1
      DNBCUM=DNBCUM*TX+DNB(L)
      ENC(L)=(BTOP+BBTC-(BBOT+BBTC)*TRANC)*COALB1
      DNC(L)=(BBOT-BBTC-(BTOP-BBTC)*TRANC)*COALB1
      TX=TRC(L)*XTRDL ; if (TX > 1) TX=1
      DNCCUM=DNCCUM*TX+DNC(L)
      ENC(L)=ENC(L)+DEC
      ENB(L)=ENB(L)+DEB
      ENA(L)=ENA(L)+DEA
  230 CONTINUE
      FDNABC=A*DNACUM+B*DNBCUM+C*DNCCUM
      TRDFLB(L)=TRDFLB(L)+FDNABC
      DFLB(L,K)=FDNABC
      L=L-1
      if (L >= L1) GO TO 215

C             Old form of scattering correction is skipped when KCLDEM=1
C             ----------------------------------------------------------

      if (KCLDEM==0 .and. LTOPCL > 0) then
        ENA(LTOPCL)=ENA(LTOPCL)*(1-TRCTCA(K))+TRCTCA(K)*DFLB(LTOPCL+1,K)
        ENB(LTOPCL)=ENB(LTOPCL)*(1-TRCTCA(K))+TRCTCA(K)*DFLB(LTOPCL+1,K)
        ENC(LTOPCL)=ENC(LTOPCL)*(1-TRCTCA(K))+TRCTCA(K)*DFLB(LTOPCL+1,K)
      end if

!sl   ------------------------------------------------------------------
!sl                                       SURFACE LAYER FLUX COMPUTATION
!sl   with TAUSL,FTAUSL=0 defaults, surface layer calculation is skipped
!sl   ------------------------------------------------------------------

      DFSL(K)=FDNABC
!sl   TAUA=TAUSL(K)+FTAUSL(K)
!sl   if (TAUA > 1.D-06) GO TO 24
      BG=BG+FDNABC*TRGALB(K)
      UNA=BG
      UNB=BG
      UNC=BG
      FUNABC=BG
!sl   GO TO 245
!sl24 CONTINUE
!sl   ITS=TSL
!sl   WTS=TSL-ITS
!sl   WTS1=1-WTS
!sl   BS = PLANCK(ITS,K)*WTS1 + PLANCK(ITS+1,K)*WTS
!sl   TA=EXP(-TAUA)
!sl   TB=TA*TA
!sl   TC=(TB*TB*TA)**2
!sl   DNA(1)=(DNA(1)-BS)*TA+BS
!sl   DNB(1)=(DNB(1)-BS)*TB+BS
!sl   DNC(1)=(DNC(1)-BS)*TC+BS
!sl   FDNABC=A*DNA(1)+B*DNB(1)+C*DNC(1)
!sl   BG=BGFEMT(K)+FDNABC*TRGALB(K)
!sl   UNA=(BG-BS)*TA+BS
!sl   UNB=(BG-BS)*TB+BS
!sl   UNC=(BG-BS)*TC+BS
!sl   FUNABC=A*UNA+B*UNB+C*UNC
!sl   BSP = PLANCK(ITS+1,K)*WTS1 + PLANCK(ITS+2,K)*WTS
!sl   BSM = PLANCK(ITS-1,K)*WTS1 + PLANCK(ITS  ,K)*WTS
!sl   SLABS=1.D0-A*TA-B*TB-C*TC
!sl   TRSLTS=TRSLTS+(BSP-BSM)*SLABS
!sl   TRSLTG=TRSLTG+BGFEMD(K)*SLABS
!sl   TRSLBS=TRSLBS+BS*SLABS

C     ------------------------------------------------------------------
C                                                UPWARD FLUX COMPUTATION
C     ------------------------------------------------------------------

  245 DO 260 L=L1,NL
      TRUFLB(L)=TRUFLB(L)+FUNABC
      UFLB(L,K)=FUNABC

C       ----------------------------------------------------------------
C       At top-cloud level, find  component of  upwelling flux reflected
C       downward by cloud bottom and add to downwelling flux below cloud
C       ----------------------------------------------------------------

      if (L==LTOPCL .and. KCLDEM==1) then
        DEC=C*UNC*RIJTCK(1,K)+B*UNB*RIJTCK(2,K)+A*UNA*RIJTCK(3,K)
        DEB=C*UNC*RIJTCK(2,K)+B*UNB*RIJTCK(4,K)+A*UNA*RIJTCK(5,K)
        DEA=C*UNC*RIJTCK(3,K)+B*UNB*RIJTCK(5,K)+A*UNA*RIJTCK(6,K)
        DO LL=L,L1,-1
          DNA(LL)=DNA(LL)+DEA
          DNB(LL)=DNB(LL)+DEB
          DNC(LL)=DNC(LL)+DEC
          DDFLUX=A*DEA+B*DEB+C*DEC
          TRDFLB(LL)=TRDFLB(LL)+DDFLUX
          DFLB(LL,K)=DFLB(LL,K)+DDFLUX
          if (LL == L1) exit ! LL-loop
          DEA=DEA*TRA(LL-1)
          DEB=DEB*TRB(LL-1)
          DEC=DEC*TRC(LL-1)
        END DO
      end if
      XTRUL=XTRU(L,IMOL+1)+DXTUA(L,IMOL+1)
      TX=TRA(L)*XTRUL ; if (TX > 1) TX=1
      UNA=UNA*TX+ENA(L)
      TX=TRB(L)*XTRUL ; if (TX > 1) TX=1
      UNB=UNB*TX+ENB(L)
      TX=TRC(L)*XTRUL ; if (TX > 1) TX=1
      UNC=UNC*TX+ENC(L)
      FUNABC=A*UNA+B*UNB+C*UNC
  260 CONTINUE

      if (K==1) then
        TRUFTW=FUNABC
        TRDFGW=TRDFLB(1)
        TRUFGW=BG
        WINDZF(1)=UNA
        WINDZF(2)=UNB
        WINDZF(3)=UNC
      end if

      TRUFLB(NL+1)=TRUFLB(NL+1)+FUNABC
      UFLB(NL+1,K)=FUNABC
      UFSL(K)=UFLB(1,K)
      TOTLZF(1)=TOTLZF(1)+UNA
      TOTLZF(2)=TOTLZF(2)+UNB
      TOTLZF(3)=TOTLZF(3)+UNC

      GO TO 200  !  next K
  300 CONTINUE

      TRNFLB(L1:NL+1) = TRUFLB(L1:NL+1) - TRDFLB(L1:NL+1)
      TRFCRL(L1:NL)   = TRNFLB(L1+1:NL+1) - TRNFLB(L1:NL)

C**** Window region and spectr. integrated total flux diagnostics
      DO 390 II=0,3
      if (II > 0) then
        PFW = TOTLZF(II) ; IF (PFW < 1) PFW=1
        if (PFW > 899.999d0) PFW=899.999d0
        IPF=PFW
        TOTLZT(II) = TKPFT(IPF) + (PFW-IPF)*(TKPFT(IPF+1)-TKPFT(IPF))

        PFW = 10*WINDZF(II)
      else
        PFW = 10*TRUFTW
      end if
        IF (PFW < 1.0001d-2) PFW=1.0001d-2
        IF (PFW > 719.999d0) PFW=719.999d0
        IPF=PFW
        IF (PFW < 1) THEN
          PFW = 100.*PFW
          IPF = PFW ; DPF = PFW-IPF         ! IPF=  1- 99
        ELSE IF (PFW < 10) THEN
          PFW = 10.*PFW
          IPF = PFW ; DPF = PFW-IPF
          IPF = IPF + 90                    ! IPF=100-189
        ELSE
          IPF = PFW ; DPF = PFW-IPF
          IPF = IPF + 180                   ! IPF=190-899
        END IF
      if (II > 0) then
        WINDZT(II) = TKPFW(IPF) + DPF*(TKPFW(IPF+1)-TKPFW(IPF))
      else
        BTEMPW     = TKPFW(IPF) + DPF*(TKPFW(IPF+1)-TKPFW(IPF))
      end if
  390 CONTINUE

      RETURN
      END SUBROUTINE THERML
#endif

      SUBROUTINE SOLAR0 1
      IMPLICIT NONE

      INTEGER, PARAMETER, DIMENSION(17) :: NMKWAV = (/ 200, 360, 770,
     *     795, 805, 810, 860,1250,1500,1740,2200,3000,3400,3600,3800
     *     ,4000,9999/)
      INTEGER, PARAMETER, DIMENSION(16) :: LORDER = (/15,14, 8, 7, 6, 5,
     *     13, 12, 4, 3, 2, 1, 11, 10, 9,16/)
      INTEGER N2,I

      DO I=1,30
        DBLN(I) = 2**I
      END DO

      NORDER(1:16)=LORDER(1:16)
      NMWAVA(1:16)=NMKWAV(1:16)
      NMWAVB(1:16)=NMKWAV(2:17)

      TCLMIN=MIN(TAUIC0,TAUWC0)

      RETURN
      END SUBROUTINE SOLAR0


      SUBROUTINE SOLARM 1,9
      IMPLICIT NONE
C     ------------------------------------------------------------------
C     SOLARM Returns:
C                      SRDFLB   Solar downward flux at layer bottom edge
C                      SRUFLB   Solar  upward  flux at layer bottom edge
C                      SRNFLB   Solar net downward flux  (in Watts/m**2)
C                      SRFHRL   Solar heating rate/layer (in Watts/m**2)
C                      FSRNFG   Solar flux abs at ground by surface-type
C                               (see explanatory note at end of SOLARM)
C               Also:
C                      TOA:   SRIVIS SROVIS PLAVIS  SRINIR SRONIR PLANIR
C                      BOA:   SRDVIS SRUVIS ALBVIS  SRDNIR SRUNIR ALBNIR
C                      ATM:   SRTVIS SRRVIS SRAVIS  SRTNIR SRRNIR SRANIR
C                             SRXVIS SRXNIR (Direct beam only at ground)
C
C           Spectral:  (by k-distribution/pseudo-spectral) breakdown:
C                      SKDFLB   Solar downward flux at layer bottom edge
C                      SKUFLB   Solar  upward  flux at layer bottom edge
C                      SKNFLB   Solar net downward flux  (in Watts/m**2)
C                      SKFHRL   Solar heating rate/layer (in Watts/m**2)
C
C                      SRKALB   Planetary albedo (by spectral breakdown)
C                      SRKINC   Incident fluxedo (by spectral breakdown)
C                      SRKGAX   Direct  k-d flux absorbed by ground-type
C                      SRKGAD   Diffuse k-d flux absorbed by ground-type
C     ------------------------------------------------------------------
C     Remarks:
C              NORMS0=1 Incident (TOA) Solar flux normalized to equal S0
C                       (COSZ dependence included in calculated results)
C                        The returned solar fluxes have to be multiplied
C                       by COSZ to yield actual atmospheric heating rate
C
C              NMKWAV   Spectral/k-distribution subdivisions are nominal
C                       (due to spectral trading of absorption features)
C
C                 VIS   Designates solar visible wavelengths (   <770nm)
C                 NIR   Designates solar near-IR wavelengths (770>   nm)
C                       VIS comprises .53 of S0, NIR comprises .47 of S0
C     ------------------------------------------------------------------
C
C     ------------------------------------------------------------------
C         Fractional solar flux k-distribution/pseudo-spectral intervals
C
C         KSLAM=    1     1     2     2     5     5     5     5
C             K=    1     2     3     4     5     6     7     8
C     DATA DKS0/ .010, .030, .040, .040, .040, .002, .004, .013,
C         KSLAM=    1     1     1     3     4     6     6     1
C             K=    9    10    11    12    13    14    15    16
C    +           .002, .003, .003, .072, .200, .480, .050, .011/
C
C     ------------------------------------------------------------------
C     The nominal spectral order for k-dist/pseudo-spectral intervals is
C     (WavA and WavB designate approximate spectral interval boundaries)
C
C             L=   12    11    10     9     6     5     4     3
C     WavA (nm)= 3000  2200  1740  1500   810   805   795   770
C     WavB (nm)= 3400  3000  2200  1740   860   810   805   795
C             K=    1     2     3     4     5     6     7     8
C     DATA DKS0/ .010, .030, .040, .040, .040, .002, .004, .013,
C
C             L=   15    14    13     8     7     2     1    16
C     WavA (nm)= 3800  3500  3400  1250   860   360   200  4000
C     WavB (nm)= 4000  3800  3600  1500  1250   770   360  9999
C             K=    9    10    11    12    13    14    15    16
C    +           .002, .003, .003, .072, .200, .480, .050, .011/
C
C     ------------------------------------------------------------------
C     6 spectral intervals overlap the 16 solar k-distribution intervals
C
C     Cloud and aerosol Mie scattering parameters (also surface albedos)
C     are averaged over these spectral intervals. These intervals are in
C     reverse spectral order. Thus spectral interval 6 refers to visible
C     (VIS) wavelengths, intervals 1-5 refer to nearIR (NIR) wavelengths
C     KSLAM designates the spectral interval of first 14 k-distributions
C     (K=15 for UV ozone absorption refers to (VIS) spectral interval 6)
C     (K=16 represents strong absorbing spectral regions via interval 1)
C
C     The nominal Mie scattering spectral band subdivisions are:
C
C                         -------------NIR------------      VIS
C                     L=    1     2     3     4     5        6
C             WavA (nm)=  2200  1500  1250   860   770      300
C             WavB (nm)=  4000  2200  1500  1250   860      770
C
C     ------------------------------------------------------------------

      REAL*8 COLEXT(6),COLSCT(6),COLGCB(6)   ! ,ALLGCB(6)

C                            -------------------------------------------
C                            NO2, O3 Chappuis Band, Rayleigh, parameters
C                            -------------------------------------------
      REAL*8, PARAMETER :: XCMNO2=5.465d0, XCMO3=.0399623d0,
     *     TOTRAY=0.000155d0
      REAL*8 RNB(LX),RNX(LX), TNB(LX),TNX(LX), XNB(LX),XNX(LX)
      REAL*8 SRB(LX),SRX(LX), VRU(LX+1),VRD(LX+1),FAC(LX+1)
      REAL*8 AO3D(LX),AO3U(LX),AO3X(LX)
      REAL*8 S0COSZ,COSMAG,SECZ,TAURAY,RTAU,SUMEXT,SUMCST,SUMCGB,COLPFG
     *     ,SURFBB,TAUSBB,ALLTAU,TAULAY,GCBLAY,RTAUL,DKS0X,RBNB,RBNX
     *     ,RCNB,RCNX,TLN,PLN,ULN,TERMA,TERMB,TAU1,TAU,PIZERO,PR,PT,DBLS
     *     ,XANB,XANX,TANB,TANX,XXT,RASB,RASX,BNORM,XNORM,RARB,RARX,XATB
     *     ,DENOM,DB,DX,UB,UX,RBXTOA,ATOPX,ATOPD,O3CMX,O3CMD
     *     ,SUMSCT,SUMGCB,XXG,SURX,PFF,XATC,XBNB,XBNX,TBNB,TBNX,XBTB
     *     ,ABOTX,ABOTD,AO3UXN,AO3UDN,SRKA16,DKS0XX,TRNC,CLX,TRNU,TRN1
     *     ,TRN2,TRN3,TAUG,TAU2,TAU3,S0VIS,S0NIR,SUMX,SUMD,SUMU,SUMN
     *     ,SUMH,SGPG
      INTEGER I,K,KK,L,M,N,NN,KLAM,NDBLS

      S0COSZ=S0 ; IF (NORMS0==0) S0COSZ=S0*COSZ

      SRDFLB(L1:NL+1)=0    ; SRUFLB(L1:NL+1)=0  ;  SRNFLB(L1:NL+1)=0
      SRFHRL(L1:NL )=0

      SKDFLB(L1:NL+1,16)=0 ; SKUFLB(L1:NL+1,16)=0

      SRKALB(1:16)=0.D0                             ! for WRITER only
      dblext=0. ; dblsct=0. ; dblgcb=0. ; dblpi0=0. ! for writer only
      skdflb=0. ; sknflb=0. ; skuflb=0.             ! for writer only
      skfhrl=0. ; srkgax=0. ; srkgad=0.             ! for writer only

C                     TOA solar flux VIS/NIR subdivision
C                     (incident, outgoing, plane albedo)
C                     ----------------------------------
      SRIVIS=0.D0
      SROVIS=0.D0
      PLAVIS=1.D0
      SRINIR=0.D0
      SRONIR=0.D0
      PLANIR=1.D0
C                     BOA solar flux VIS/NIR subdivision
C                     (incident, upward, surface albedo)
C                     ----------------------------------
      SRDVIS=0.D0
      SRUVIS=0.D0
      ALBVIS=1.D0
      SRDNIR=0.D0
      SRUNIR=0.D0
      ALBNIR=1.D0
C                     Fractional atmos only flux VIS/NIR subdivision
C                     (fractions reflected, transmitted, & absorbed)
C                     ----------------------------------------------
      SRRVIS=1.D0
      SRTVIS=0.D0
      SRAVIS=0.D0
      SRRNIR=0.D0
      SRTNIR=0.D0
      SRANIR=0.D0
C                     Direct beam, fractional S0 VIS/NIR subdivision
C                     ----------------------------------------------
      SRXVIS=0.D0
      SRXNIR=0.D0
C                     Ground surface absorbed solar flux subdivision
C                     according to 4 fractional surface-type albedos
C                     ----------------------------------------------
      FSRNFG(1:4)=0

      IF(COSZ < 0.001D0) RETURN
      COSMAG=35.D0/SQRT(1224.D0*COSZ*COSZ+1.D0)
      SECZ=1.D0/COSZ

      TAURAY=TOTRAY*FRAYLE

      DO 90 K=1,6
      RTAU=1.D-10
      IF(K==6) RTAU=TAURAY
      COLEXT(K)=0.D0
      COLSCT(K)=0.D0
      COLGCB(K)=0.D0
      DO 30 L=L1,NL
      RTAUL=RTAU*(PLB(L)-PLB(L+1))
      SUMEXT=RTAUL+SRCEXT(L,K)+SRAEXT(L,K)+SRBEXT(L,K)
     +                        +SRDEXT(L,K)+SRVEXT(L,K)
      SUMSCT=RTAUL+SRCSCT(L,K)+SRASCT(L,K)+SRBSCT(L,K)
     +                        +SRDSCT(L,K)+SRVSCT(L,K)
      SUMGCB=      SRCSCT(L,K)*SRCGCB(L,K)+SRASCT(L,K)*SRAGCB(L,K)
     +            +SRBSCT(L,K)*SRBGCB(L,K)+SRDSCT(L,K)*SRDGCB(L,K)
     +            +SRVSCT(L,K)*SRVGCB(L,K)
      DBLEXT(L,K)=SUMEXT
      DBLSCT(L,K)=SUMSCT
      DBLGCB(L,K)=SUMGCB/(SUMSCT+1.D-10)
      DBLPI0(L,K)=SUMSCT/(SUMEXT+1.D-10)
      COLEXT(K)=COLEXT(K)+DBLEXT(L,K)
      COLSCT(K)=COLSCT(K)+DBLSCT(L,K)
      COLGCB(K)=COLGCB(K)+DBLSCT(L,K)*DBLGCB(L,K)
   30 CONTINUE
      COLGCB(K)=COLGCB(K)/(COLSCT(K)+1.D-10)

      IF(KANORM > 0) THEN
C     -----------------------------------------------------------------
C     KANORM (default = 0)  Option to renormalize aerosol column albedo
C                           to make column albedo less dependent on the
C                           number of model layers due to SGP treatment
C
C                           KANORM=1  aerosol column only is normalized
C
C                           KANORM=2  aerosol plus ground is normalized
C                                     with Tau equivalent ground albedo
C                                     ---------------------------------
      COLPFG=COLGCB(K)
      SURFBB=SRBALB(K)
      TAUSBB=0.D0
      IF(KANORM > 1) CALL GTSALB(XXG,XXT,SURX,SURFBB,COLPFG,TAUSBB,2)
      DBLEXT(NL+1,K)=TAUSBB
      ALLTAU=TAUSBB+COLEXT(K)
      CALL SGPGXG(COSZ,ALLTAU,COLPFG,SGPG)
cc    ALLGCB(K)=SGPG
      DBLGCB(L1:NL,K)=SGPG
      ELSE

      DO 50 L=L1,NL
      TAULAY=DBLEXT(L,K)
      GCBLAY=DBLGCB(L,K)
      CALL SGPGXG(COSZ,TAULAY,GCBLAY,SGPG)
      DBLGCB(L,K)=SGPG
   50 CONTINUE
      ENDIF

      IF(LTOPCL == 0) GO TO 90
      RTAU=1.D-10
      IF(K==6) RTAU=TAURAY
      COLEXT(K)=0.D0
      COLSCT(K)=0.D0
      COLGCB(K)=0.D0
      DO 60 L=L1,NL
      IF(SRCEXT(L,K) < TCLMIN) GO TO 60
      RTAUL=RTAU*(PLB(L)-PLB(L+1))
      SUMEXT=RTAUL+SRCEXT(L,K)+SRAEXT(L,K)+SRBEXT(L,K)
     +                        +SRDEXT(L,K)+SRVEXT(L,K)
      SUMSCT=RTAUL+SRCSCT(L,K)+SRASCT(L,K)+SRBSCT(L,K)
     +                        +SRDSCT(L,K)+SRVSCT(L,K)
      SUMGCB=      SRCSCT(L,K)*SRCGCB(L,K)+SRASCT(L,K)*SRAGCB(L,K)
     +            +SRBSCT(L,K)*SRBGCB(L,K)+SRDSCT(L,K)*SRDGCB(L,K)
     +            +SRVSCT(L,K)*SRVGCB(L,K)
      DBLEXT(L,K)=SUMEXT
      DBLSCT(L,K)=SUMSCT
      DBLGCB(L,K)=SUMGCB/(SUMSCT+1.D-10)
      DBLPI0(L,K)=SUMSCT/(SUMEXT+1.D-10)
      COLEXT(K)=COLEXT(K)+DBLEXT(L,K)
      COLSCT(K)=COLSCT(K)+DBLSCT(L,K)
      COLGCB(K)=COLGCB(K)+DBLSCT(L,K)*DBLGCB(L,K)
   60 CONTINUE
      COLGCB(K)=COLGCB(K)/(COLSCT(K)+1.D-10)

C     -----------------------------------------------------------------
C     KCNORM (default = 0)  Option to renormalize  cloud  column albedo
C                           to make column albedo less dependent on the
C                           number of model layers due to SGP treatment
C
C                           KCNORM=1    cloud column only is normalized
C
C                           KCNORM=2    cloud plus ground is normalized
C                                     with Tau equivalent ground albedo
C                                     ---------------------------------
      IF(KCNORM > 0) THEN
        COLPFG=COLGCB(K)
        SURFBB=SRBALB(K)
        TAUSBB=0.D0
        IF(KCNORM > 1) CALL GTSALB(XXG,XXT,SURX,SURFBB,COLPFG,TAUSBB,2)
        DBLEXT(NL+1,K)=TAUSBB
        ALLTAU=TAUSBB+COLEXT(K)
        CALL SGPGXG(COSZ,ALLTAU,COLPFG,SGPG)
cc      ALLGCB(K)=SGPG
        DO 70 L=L1,NL
        IF(SRCEXT(L,K) < TCLMIN) GO TO 70
        DBLGCB(L,K)=SGPG
   70   CONTINUE
      ELSE
        DO 80 L=L1,NL
        IF(SRCEXT(L,K) < TCLMIN) GO TO 80
        TAULAY=DBLEXT(L,K)
        GCBLAY=DBLGCB(L,K)
        CALL SGPGXG(COSZ,TAULAY,GCBLAY,SGPG)
        DBLGCB(L,K)=SGPG
   80   CONTINUE
      ENDIF
   90 CONTINUE

      K = 0
  300 CONTINUE    !   DO K=1,NKSLAM
      K = K+1

      KLAM=KSLAM(K)
      DKS0X=DKS0(K)*S0COSZ
      RBNB=SRBALB(KLAM)
      RBNX=SRXALB(KLAM)
      RCNB=0.D0
      RCNX=0.D0
      SRKINC(K)=DKS0X

      DO 200 N=L1,NL

      SRB(N)=RBNB
      SRX(N)=RBNX
      TLN=TLM(N)
      PLN=PL(N)
      ULN=ULGAS(N,1)

C     Select parameterized k-distribution gas absorption by H2O, O2, CO2
C     ------------------------------------------------------------------

      SELECT CASE (K)
      CASE (1)
C--------K=6-------H2O       DS0=.01
      TERMA=(35.66+TLN*(.0416-.0004622*TLN+.001057*PLN))*(1.+.04286*PLN)
      TERMB=(1.+.00171*ULN)*(1.+PLN*(189.088+.1316*PLN))
      TAU1 =TERMA/TERMB
      IF(TAU1 > 0.02343) TAU1=0.02343
      TAU=TAU1*ULN

      CASE (2)
C--------K=5-------H2O       DS0=.03
      TERMA=(2.792+TLN*(.0914-.0002848*TLN+.0003395*PLN))
     +     *(1.+.02964*PLN)
      TERMB=(1.0+.000657*ULN)*(1.+PLN*(240.70+.13847*PLN))
      TAU1 =TERMA/TERMB
      IF(TAU1 > 0.00520) TAU1=0.00520
      TAU=TAU1*ULN

      CASE (3)
C--------K=4-------H2O       DS0=.04
      TERMA=(.4768+.467E-04*PLN*TLN)*(1.+TLN*(.00191-.719E-05*TLN))
      TERMB=(1.+.717E-04*ULN)*(1.+PLN*(130.56+.0876*PLN))/(1.+.0266*PLN)
      TAU1 =TERMA/TERMB
      IF(TAU1 > 0.00150) TAU1=0.0015
      TAU=TAU1*ULN

      CASE (4)
C--------K=3-------H2O       DS0=.04
      TERMA=(.000247*TLN-.091+PLN*(.00035+.78E-06*TLN))*(1.+.2847*PLN)
      TERMB=(1.+.2066E-04*ULN)*(1.+PLN*(137.17+.16132*PLN))
      TAU  =(TERMA/TERMB)*ULN

      CASE (5)
C--------K=2-------H2O       DS0=.04
      TERMA=(PLN*(1.974/TLN+.0001117*TLN)-10.713)*(1.+.005788*TLN)
     +     *(1.+.001517*PLN)
      TERMB=(1.+.3218E-04*ULN)*(1.+PLN*(863.44+.2048*PLN))
      TAU  =(TERMA/TERMB)*ULN

      CASE (6)
C--------K=4-------O2        DS0=.002
      ULN=ULGAS(N,4)
      TERMA=(.2236E-05-.1181E-09*TLN)*(1.+PLN*(.6364E-05*PLN+.001168))
      TERMB=1.+.1521E-05*ULN
      TAU  =(TERMA/TERMB)*ULN

      CASE (7)
C--------K=3-------O2        DS0=.004
      ULN=ULGAS(N,4)
      TERMA=(.3179E-06-.9263E-11*TLN)*(1.+PLN*(.8832E-05*PLN+.0005292))
      TERMB=1.+.1968E-06*ULN
      TAU  =(TERMA/TERMB)*ULN

      CASE (8)
C--------K=2-------O2        DS0=.013
      ULN=ULGAS(N,4)
      TERMA=(.2801E-07-.1638E-12*TLN)*(1.+PLN*(.1683E-04*PLN-.001721))
      TERMB=1.+.8097E-07*ULN
      TAU  =(TERMA/TERMB)*ULN

      CASE (9)
C--------K=4-------CO2       DS0=.002
      ULN=ULGAS(N,2)
      TERMA=(50.73-.03155*TLN-PLN*(.5543+.00091*TLN))*(1.-.1004*PLN)
      TERMB=(1.+.006468*ULN)*(1.+PLN*(49.51+.8285*PLN))
      TAU  =(TERMA/TERMB)*ULN
      IF(PLN < 175.0) TAU=(.00018*PLN+0.00001)*ULN

      CASE (10)
C--------K=3-------CO2       DS0=.003
      ULN=ULGAS(N,2)
      TERMA=(1.+.01319*TLN)*(PLN*(.008001*ULN+.4589E-03)-.8396*ULN)
      TERMB=ULN*(PLN+295.7+1.967*ULN)+.15126*PLN
      TAU  =(TERMA/TERMB)*ULN

      CASE (11)
C--------K=2-------CO2       DS0=.003
      ULN=ULGAS(N,2)
      TERMA=(1.+.02257*TLN)*(PLN*(.002295*ULN-.5489E-04)-.7571*ULN)
      TERMB=ULN*(PLN+803.9+2.477*ULN)-.09899*PLN
      TAU  =(TERMA/TERMB)*ULN

      CASE (12,13)
        TAU=0.D0

      CASE (14)
        TAU=XCMNO2*ULGAS(N,5)+XCMO3*ULGAS(N,3)
      END SELECT

C     With 10 doublings to get to Tau=1.0, maximum seed tau is < 1/1024.
C     ------------------------------------------------------------------

      IF(TAU < 0.D0) TAU=0.D0

      TAU=TAU+DBLEXT(N,KLAM)
      IF(TAU < 1.D-06) GO TO 180
      PIZERO=DBLSCT(N,KLAM)/TAU
      IF(PIZERO < 0.001D0) GO TO 180

      PFF=DBLGCB(N,KLAM)

      NDBLS=0
      PR=1.D0-PFF
      PT=1.D0+PFF
      IF(TAU > 0.0019531D0) THEN
        DBLS=10.D0+1.44269D0*LOG(TAU)
        NDBLS=DBLS
        TAU=TAU/DBLN(NDBLS)
      ENDIF

C     Set optically thin limit values of R,T,X using PI0 renormalization
C     ------------------------------------------------------------------

      XANB=EXP(-TAU-TAU)
      XANX=EXP(-TAU*SECZ)
      TANB=PT*XANB
      XXT=(SECZ-2.D0)*TAU
      TANX=PT*SECZ
     +    *(.5D0+XXT*(.25D0+XXT*(.0833333D0+XXT*(.0208333D0+XXT))))*XANX
      RASB=PR*(1.D0-TAU*(2.D0-2.66667D0*TAU*(1.D0-TAU)))
      XXT=(SECZ+2.D0)*TAU
      RASX=PR*SECZ
     +    *(.5D0-XXT*(.25D0-XXT*(.0833333D0-XXT*(.0208333D0-XXT))))
      BNORM=(1.D0-XANB)/(RASB+TANB)*PIZERO
      XNORM=(1.D0-XANX)/(RASX+TANX)*PIZERO
      RASB=RASB*BNORM
      RASX=RASX*XNORM
      TANB=TANB*BNORM
      TANX=TANX*XNORM

C     Compute and record R,T,X atmospheric layer doubling/adding results
C     ------------------------------------------------------------------

      IF(NDBLS < 1) GO TO 170
      DO 160 NN=1,NDBLS
      RARB=RASB*RASB
      RARX=XANX*RASX
      XATB=XANB+TANB
      DENOM=1.D0-RARB
      DB=(TANB+XANB*RARB)/DENOM
      DX=(TANX+RARX*RASB)/DENOM
      UB=RASB*(XANB+DB)
      UX=RARX+RASB*DX
      RASB=RASB+XATB*UB
      RASX=RASX+XATB*UX
      TANB=XANB*TANB+XATB*DB
      TANX=XANX*TANX+XATB*DX
      XANB=XANB*XANB
      XANX=XANX*XANX
  160 CONTINUE
  170 CONTINUE
      RARB=RASB*RBNB
      RARX=RASB*RBNX
      XATB=XANB+TANB
      DENOM=1.D0-RARB
      DB=(TANB+XANB*RARB)/DENOM
      DX=(TANX+XANX*RARX)/DENOM
      UB=RBNB*(XANB+DB)
      UX=RBNX*XANX+RBNB*DX
      RBNB=RASB+XATB*UB
      RBNX=RASX+XATB*UX
      XATC=XATB/(1.D0-RASB*RCNB)
      RCNX=RASX+(XANX*RCNX+TANX*RCNB)*XATC
      RCNB=RASB+RCNB*XATB*XATC
      GO TO 190
  180 CONTINUE
      RASB=0.D0
      RASX=0.D0
      TANB=0.D0
      TANX=0.D0
      XANB=EXP(-TAU-TAU)
      XANX=EXP(-TAU*SECZ)
      DX=0.D0
      UX=RBNX*XANX
      RBNB=RBNB*XANB*XANB
      RBNX=UX*XANB
      RCNB=RCNB*XANB*XANB
      RCNX=RCNX*XANX*XANB
  190 CONTINUE
      RNB(N)=RASB
      RNX(N)=RASX
      TNB(N)=TANB
      TNX(N)=TANX
      XNB(N)=XANB
      XNX(N)=XANX
  200 CONTINUE

C     Record fluxes, spectral components at TOA, & top-layer bottom edge
C     ------------------------------------------------------------------

      SRDFLB(NL+1)=SRDFLB(NL+1)+DKS0X
      SRUFLB(NL+1)=SRUFLB(NL+1)+DKS0X*RBNX
      SRDFLB(NL)=SRDFLB(NL)+DKS0X*(XANX+DX)
      SRUFLB(NL)=SRUFLB(NL)+DKS0X*UX
      SKDFLB(NL+1,K)=DKS0X
      SKUFLB(NL+1,K)=DKS0X*RBNX
      SKDFLB(NL,K)=DKS0X*(XANX+DX)
      SKUFLB(NL,K)=DKS0X*UX
      RBXTOA=RBNX
      SRKALB(K)=RBNX

C     Add successively layer N (at bottom) to form upper composite layer
C     ------------------------------------------------------------------

      DO 230 N=NL-1,L1,-1
      XBNB=XNB(N)
      XBNX=XNX(N)
      RBNX=RNX(N)
      IF(RBNX > 1.D-05) GO TO 210
      RASB=RASB*XBNB*XBNB
      TANX=TANX*XBNB
      GO TO 220
  210 CONTINUE
      RBNB=RNB(N)
      TBNB=TNB(N)
      TBNX=TNX(N)
      RARB=RASB*RBNB
      XBTB=XBNB+TBNB
      DENOM=1.D0-RARB
      TANX=TBNX*XANX+XBTB*(TANX+XANX*RBNX*RASB)/DENOM
      RASB=RBNB+XBTB*XBTB*RASB/DENOM
  220 CONTINUE
      XANX=XANX*XBNX
      RBNB=SRB(N)
      RBNX=SRX(N)
      DX=(TANX+XANX*RBNX*RASB)/(1.D0-RASB*RBNB)
      UX=RBNX*XANX+RBNB*DX
      SRUFLB(N)=SRUFLB(N)+DKS0X*UX
      SRDFLB(N)=SRDFLB(N)+DKS0X*(XANX+DX)
      SKUFLB(N,K)=DKS0X*UX
      SKDFLB(N,K)=DKS0X*(XANX+DX)
  230 CONTINUE

C     Record absorbed spectral flux at ground for surface type fractions
C     ------------------------------------------------------------------

      SRKGAX(K,1:4)=DKS0X*XANX*(1.D0-PRNX(KLAM,1:4))
      SRKGAD(K,1:4)=DKS0X*  DX*(1.D0-PRNB(KLAM,1:4))

      IF(K==NKSLAM) GO TO 301
      SRINIR=SRINIR+DKS0X
      SRONIR=SRONIR+DKS0X*RBXTOA
      SRDNIR=SRDNIR+SKDFLB(1,K)
      SRUNIR=SRUNIR+SKUFLB(1,K)
      SRRNIR=SRRNIR+DKS0X*RCNX
      SRTNIR=SRTNIR+DKS0X*(TANX+XANX)
      SRXNIR=SRXNIR+DKS0X*XANX
      GO TO 300

  301 CONTINUE
      SRIVIS=DKS0X
      SROVIS=DKS0X*RBXTOA
      SRDVIS=SKDFLB(1,K)
      SRUVIS=SKUFLB(1,K)
      SRRVIS=DKS0X*RCNX
      SRTVIS=DKS0X*(TANX+XANX)
      SRXVIS=SRXVIS+DKS0X*XANX

C     ------------------------------------------------------------------
C     UV absorption by O3 and O2 within solar spectral band DKS0(15)=.05
C     ------------------------------------------------------------------

      K=15
      DKS0X=DKS0(K)*S0COSZ
      SRKINC(K)=DKS0X

      N=NL+1
      ATOPX=0.D0
      ATOPD=0.D0
      O3CMX=0.D0
      O3CMD=0.D0
  302 CONTINUE
      N=N-1
      O3CMX=O3CMX+COSMAG*ULGAS(N,3)
      O3CMD=O3CMD+1.90D0*ULGAS(N,3)
      CALL AO3ABS(O3CMX,ABOTX)
      CALL AO3ABS(O3CMD,ABOTD)
      AO3X(N)=(ABOTX-ATOPX)/DKS0(15)
      AO3D(N)=(ABOTD-ATOPD)/DKS0(15)
      ATOPX=ABOTX
      ATOPD=ABOTD
      IF(N > L1) GO TO 302
  303 CONTINUE
      O3CMX=O3CMX+1.90D0*ULGAS(N,3)
      O3CMD=O3CMD+1.90D0*ULGAS(N,3)
      CALL AO3ABS(O3CMX,ATOPX)
      CALL AO3ABS(O3CMD,ATOPD)
      AO3UXN=(ATOPX-ABOTX)/DKS0(15)
      AO3UDN=(ATOPD-ABOTD)/DKS0(15)
      AO3U(N)=XNX(N)*AO3UXN+(1.D0-XNX(N))*AO3UDN
      ABOTX=ATOPX
      ABOTD=ATOPD
      N=N+1
      IF(N < NL+1) GO TO 303
      RBNB=SRBALB(KLAM)
      RBNX=SRXALB(KLAM)
      RCNB=0.D0
      RCNX=0.D0
C                                  -------------------------------------
C                                  Get Oxygen UV absorption contribution
C                                  -------------------------------------
C----------------
      CALL GETO2A
C----------------
C                 ------------------------------------------------------
C                 Add Layers from Ground up. Retain Composite RBNB, RBNX
C             R,T,X of "A" (above) layer are corrected for O3 absorption
C             ----------------------------------------------------------

      DO 304 N=L1,NL
      O2FHRL(N)=O2FHRL(N)/DKS0(15)*FULGAS(4)
      O2FHRB(N)=O2FHRB(N)/DKS0(15)*FULGAS(4)
      SRB(N)=RBNB
      SRX(N)=RBNX
      XANX=XNX(N)*(1.D0-AO3X(N)-O2FHRL(N))
      XANB=XNB(N)*(1.D0-AO3D(N)-O2FHRB(N))
      RASX=RNX(N)*(1.D0-AO3U(N))
      RASB=RNB(N)*(1.D0-AO3U(N))
      TANX=TNX(N)*(1.D0-AO3D(N))
      TANB=TNB(N)*(1.D0-AO3D(N))
!nu      ABSRTX=1.D0-XANX-TANX-RASX
!nu      ABSRTB=1.D0-XANB-TANB-RASB
      RARB=RASB*RBNB
      RARX=RASB*RBNX
      XATB=XANB+TANB
      DENOM=1.D0-RARB
      DB=(TANB+XANB*RARB)/DENOM
      DX=(TANX+XANX*RARX)/DENOM
      UB=RBNB*(XANB+DB)
      UX=RBNX*XANX+RBNB*DX
      RBNB=RASB+XATB*UB
      RBNX=RASX+XATB*UX
      XATC=XATB/(1.D0-RASB*RCNB)
      RCNX=RASX+(XANX*RCNX+TANX*RCNB)*XATC
      RCNB=RASB+RCNB*XATB*XATC
  304 CONTINUE
      VRD(NL+1)=1.D0
      VRU(NL+1)=RBNX
      SRKALB(15)=RBNX
      N=NL
      VRD(N)=XANX+DX
      VRU(N)=UX
  310 CONTINUE
      N=N-1
      XBNX=XNX(N)*(1.D0-AO3X(N)-O2FHRL(N))
      XBNB=XNB(N)*(1.D0-AO3D(N)-O2FHRB(N))
      RBNX=RNX(N)*(1.D0-AO3U(N))
      RBNB=RNB(N)*(1.D0-AO3U(N))
      TBNX=TNX(N)*(1.D0-AO3D(N))
      TBNB=TNB(N)*(1.D0-AO3D(N))

C     Add successively layer N (at bottom) to form upper composite layer
C     ------------------------------------------------------------------

      RARB=RASB*RBNB
      XBTB=XBNB+TBNB
      DENOM=1.D0/(1.D0-RARB)
      TANX=TBNX*XANX+XBTB*(TANX+XANX*RBNX*RASB)*DENOM
      RASB=RBNB+XBTB*XBTB*RASB*DENOM
      XANX=XANX*XBNX

C     Add upper & bottom composite layers to get flux at layer interface
C     ------------------------------------------------------------------

      RBNB=SRB(N)
      RBNX=SRX(N)
      DX=(TANX+XANX*RBNX*RASB)/(1.D0-RASB*RBNB)
      UX=RBNX*XANX+RBNB*DX
      VRD(N)=XANX+DX
      VRU(N)=UX
      IF(N > 1) GO TO 310
      SRKGAX(15,1:4)=DKS0X*XANX*(1-PRNX(6,1:4))
      SRKGAD(15,1:4)=DKS0X*  DX*(1-PRNB(6,1:4))

      DO 325 N=L1,NL+1
      VRD(N)=VRD(N)*DKS0X
      VRU(N)=VRU(N)*DKS0X
      SKDFLB(N,K)=VRD(N)
      SKUFLB(N,K)=VRU(N)
  325 CONTINUE
      SRIVIS=SRIVIS+VRD(NL+1)
      SROVIS=SROVIS+VRU(NL+1)
      PLAVIS=SROVIS/SRIVIS
      SRDVIS=SRDVIS+VRD(L1)
      SRUVIS=SRUVIS+VRU(L1)
      ALBVIS=SRUVIS/(SRDVIS+1.D-10)
      SRRVIS=SRRVIS+DKS0X*RCNX
      SRTVIS=SRTVIS+DKS0X*(TANX+XANX)
      SRXVIS=SRXVIS+DKS0X*XANX
      SRAVIS=1.D0-SRRVIS-SRTVIS

C     K16 strong absorbing contributions are computed without scattering
C     ------------------------------------------------------------------

      K=16
      DKS0X=DKS0(16)*S0COSZ
      SRKINC(16)=DKS0X
      SRKA16=0.D0
      SRKGAX(16,1:4)=0.D0
      SRKGAD(16,1:4)=0.D0
      DO 345 KK=1,3
      IF(KK==1) DKS0XX=DKS0X*0.002D0/0.011D0
      IF(KK==2) DKS0XX=DKS0X*0.008D0/0.011D0
      IF(KK==3) DKS0XX=DKS0X*0.001D0/0.011D0
      TRNC=1.D0
      DO 330 N=NL,L1,-1
      PLN=PL(N)
      CLX=DBLEXT(N,1)-DBLSCT(N,1)

C--------K=5-------CO2       DS0=.002
      IF(KK==1) THEN
      TRN1=0.D0
      ULN=ULGAS(N,2)*SECZ
      IF(ULN > 7.D0) ULN=7.D0
      TERMA=.003488*PLN*(1.+39.59*EXP(-8.769*ULN/(1.+4.419*ULN)))
     +     *(1.+ULN*(.001938*PLN-.00503*ULN))
      TERMB=(1.+.04712*PLN*(1.+.4877*ULN))
      TAUG=TERMA/TERMB*ULN
      TAU1=TAUG+CLX*SECZ
      IF(TAU1 < 10.0) TRN1=EXP(-TAU1)
      FAC(N)=TRN1
      ENDIF

C--------K=7-------H2O       DS0=.008
      IF(KK==2) THEN
      TRN2=0.D0
      ULN=ULGAS(N,1)*SECZ
      TERMA=.001582*PLN*(1.+6.769*EXP(-9.59*ULN/(1.+5.026*ULN)))
     +     *(1.+ULN*(.2757E-03*PLN+.001429*ULN))
      TERMB=(1.+.003683*PLN*(1.+1.187*ULN))
      TAUG=TERMA/TERMB*ULN
      TAU2=TAUG+CLX*SECZ
      IF(TAU2 < 10.0) TRN2=EXP(-TAU2)
      FAC(N)=TRN2
      ENDIF

C--------K=5-------O2        DS0=.001
      IF(KK==3) THEN
      TRN3=0.D0
      ULN=ULGAS(N,4)*SECZ
      TERMA=(.1366E-03-.2203E-07*TLN)*(1.+PLN*(.1497E-06*ULN+.001261))
      TERMB=(1.+.3867E-03*ULN)/(1.+.2075E-04*ULN)
      TAUG=TERMA/TERMB*ULN
      TAU3=TAUG+CLX*SECZ
      IF(TAU3 < 10.0) TRN3=EXP(-TAU3)
      FAC(N)=TRN3
      ENDIF

      TRNC=TRNC*FAC(N)
      SRDFLB(N)=SRDFLB(N)+DKS0XX*TRNC
      SKDFLB(N,K)=SKDFLB(N,K)+DKS0XX*TRNC
  330 CONTINUE
      SRDFLB(NL+1)=SRDFLB(NL+1)+DKS0XX
      SRUFLB(L1)=SRUFLB(L1)+DKS0XX*TRNC*SRXALB(1)
      SKDFLB(NL+1,K)=SKDFLB(NL+1,K)+DKS0XX
      SKUFLB(L1,K)=SKUFLB(L1,K)+DKS0XX*TRNC*SRXALB(1)

C     For completeness, any incident flux at ground is relflected upward
C     ------------------------------------------------------------------

      TRNU=TRNC
      DO 340 N=L1+1,NL+1
      TRNU=TRNU*FAC(N-1)
      SRUFLB(N)=SRUFLB(N)+DKS0XX*TRNC*SRXALB(1)*TRNU
      SKUFLB(N,K)=SKUFLB(N,K)+DKS0XX*TRNC*SRXALB(1)*TRNU
  340 CONTINUE
      SRKGAX(16,1:4)=SRKGAX(16,1:4)+DKS0XX*TRNC*(1-PRNX(1,1:4))
      SRKA16=SRKA16+TRNU*SRXALB(1)

      SRINIR=SRINIR+DKS0XX
      SRONIR=SRONIR+DKS0XX*TRNU*SRXALB(1)
      SRDNIR=SRDNIR+SKDFLB(L1,K)
      SRUNIR=SRUNIR+SKUFLB(L1,K)
  345 CONTINUE
      PLANIR=SRONIR/SRINIR
      ALBNIR=SRUNIR/(SRDNIR+1.D-10)
      SRKALB(16)=SRKA16/DKS0X

      SRDFLB(L1:NL+1) = SRDFLB(L1:NL+1) + VRD(L1:NL+1)
      SRUFLB(L1:NL+1) = SRUFLB(L1:NL+1) + VRU(L1:NL+1)
      SRNFLB(L1:NL+1) = SRDFLB(L1:NL+1) - SRUFLB(L1:NL+1)
      SRFHRL(L1:NL)   = SRNFLB(L1+1:NL+1) - SRNFLB(L1:NL)
      SRRNIR=SRRNIR+DKS0X*RCNX
      SRTNIR=SRTNIR+DKS0X*(TANX+XANX)
      SRXNIR=SRXNIR+DKS0X*XANX

      S0VIS=0.53D0*S0
      SRTVIS=SRTVIS/S0VIS
      SRRVIS=SRRVIS/S0VIS
      SRXVIS=SRXVIS/S0VIS
      SRAVIS=1.D0-SRTVIS-SRRVIS

      S0NIR=0.47D0*S0
      SRTNIR=SRTNIR/S0NIR
      SRRNIR=SRRNIR/S0NIR
      SRXNIR=SRXNIR/S0NIR
      SRANIR=1.D0-SRTNIR-SRRNIR


C     ------------------------------------------------------------------
C     FSRNFG defines the total solar flux absorbed at the ground surface
C              taking into account the albedo of different surface types
C     Thus:
C              SRNFLB(1)=POCEAN*FSRNFG(1)+PEARTH*FSRNFG(2)
C                       + POICE*FSRNFG(3)+ PLICE*FSRNFG(4)
C
C     NOTE:    If any surface type POCEAN, PEARTH, POICE, PLICE are Zero
C              the corresponding FSRNFG(I) absorbed solar flux at ground
C              is computed with that surface-type albedo set equal to 0.
C              ---------------------------------------------------------

      DO 420 I=1,4
      FSRNFG(I) = sum(SRKGAX(1:16,I)) + sum(SRKGAD(1:16,I))
  420 CONTINUE


      DO 510 K=1,16
      SKNFLB(L1:NL+1,K)=SKDFLB(L1:NL+1,K)-SKUFLB(L1:NL+1,K)
  510 CONTINUE

      DO 530 K=1,16
      SKFHRL(L1:NL,K)=SKNFLB(L1+1:NL+1,K)-SKNFLB(L1:NL,K)
  530 CONTINUE

      DO 560 L=L1,NL+1
      SKDFLB(L,17) = sum (SKDFLB(L,1:16))
      SKUFLB(L,17) = sum (SKUFLB(L,1:16))
      SKNFLB(L,17) = sum (SKNFLB(L,1:16))
      SKFHRL(L,17) = sum (SKFHRL(L,1:16))
  560 CONTINUE

      RETURN
      END SUBROUTINE SOLARM




      SUBROUTINE BCTAUW(XJYEAR,IDEC,JDEC,BCWTID,BCWTJD)
      IMPLICIT NONE
C-------------------------------------------------------------------
C     Black Carbon interdecadal TAU interpolation is based on linear
C     TAU trend (between decadal global TAUmaps) with a superimposed
C     intra-decadal time dependence scaled to the Black Carbon Total
C     emission rate.
C
C        INPUT:  XJYEAR  (Fractional Julian year)
C                                                 by 25     by 10
C       OUTPUT:  IDEC    (Map Index: I= -3,4-7  (0) -1925,1950-1980)
C                JDEC    (Map Index: J=1-4,5-8  1875-1950,1960-1990)
C
C              BCWTID    (Multiplicative Weight for BC TAU-Map IDEC)
C              BCWTJD    (Multiplicative Weight for BC TAU-Map JDEC)
C
C-------------------------------------------------------------------

      REAL*8, DIMENSION(50) :: EYEAR,BCEHC,BCEBC,BCEDI,BCTOT

      REAL*8 BCE(5,45)

C    Global Annual Emissions of BC U   Emission (Mt/yr)

      DATA BCE/
C      Year    Hard_Coal    Brown_Coal      Diesel        Total
     A 50.0, 2.280581713, 0.4449132979, 0.1599090248, 2.885536671,
     B 51.0, 2.443193913, 0.4855868816, 0.1884280443, 3.117194653,
     C 52.0, 2.473641872, 0.5115299225, 0.2027695477, 3.187930107,
     D 53.0, 2.481340885, 0.5448409319, 0.2149295360, 3.241089582,
     E 54.0, 2.505670071, 0.5780177116, 0.2343477309, 3.317960978,
     F 55.0, 2.698692560, 0.6238067150, 0.2733324766, 3.595800638,
     G 56.0, 2.855226278, 0.6531309485, 0.3043369055, 3.812692404,
     H 57.0, 2.975781679, 0.6821750998, 0.3207367063, 3.978575468,
     I 58.0, 3.341105223, 0.7035279870, 0.3370627165, 4.381746292,
     J 59.0, 3.638528824, 0.7075053453, 0.3695519567, 4.715488434,
     K 60.0, 3.770926714, 0.7416650057, 0.3832504749, 4.896034241,
     L 61.0, 3.392980337, 0.7805693150, 0.4217525721, 4.595387459,
     M 62.0, 3.288835049, 0.8179932237, 0.4603823125, 4.567360401,
     N 63.0, 3.359177589, 0.8604368567, 0.5090782642, 4.728550911,
     O 64.0, 3.432664871, 0.8952696323, 0.5388473868, 4.866865158,
     P 65.0, 3.529418945, 0.8819132447, 0.5785927773, 4.989773750,
     Q 66.0, 3.577459812, 0.8817394972, 0.6323299408, 5.091631413,
     R 67.0, 3.418204546, 0.8635972142, 0.6592246890, 4.941041946,
     S 68.0, 3.452457905, 0.8943673372, 0.7338049412, 5.080585003,

ceq   DATA BCE2/
     A 69.0, 3.626069546, 0.9298774004, 0.7889106274, 5.344810009,
     B 70.0, 3.264039755, 0.9229136109, 0.8880128860, 5.074741840,
     C 71.0, 3.437611580, 0.9374827743, 0.9531223178, 5.328329086,
     D 72.0, 3.473345757, 0.7836616039, 1.0180075170, 5.274850368,
     E 54.0, 2.505670071, 0.5780177116, 0.2343477309, 3.317960978,
     F 74.0, 3.506143808, 0.8251076341, 1.0828053950, 5.413989067,
     G 75.0, 3.906814098, 0.8527192473, 1.0454736950, 5.804963112,
     H 76.0, 4.005736828, 0.8900613785, 1.1400985720, 6.035901546,
     I 77.0, 4.236912251, 0.9103702307, 1.2190728190, 6.366260529,
     J 78.0, 4.459666252, 0.9303293228, 1.2408012150, 6.630728722,
     K 79.0, 4.697422504, 0.9856286645, 1.3019220830, 6.984815121,
     L 80.0, 4.796229839, 0.9959300756, 1.2336660620, 7.026207924,
     M 81.0, 4.789204121, 1.0459070210, 1.1664049630, 7.001126766,
     N 82.0, 4.872739315, 1.0975246430, 1.1601715090, 7.130136490,
     O 83.0, 4.983223438, 1.1424025300, 1.1732926370, 7.298912525,
     P 84.0, 5.265352249, 1.2178678510, 1.2251536850, 7.708741188,
     Q 85.0, 5.763637543, 1.2965050940, 1.2428865430, 8.303324699,
     R 86.0, 5.924767494, 1.3386499880, 1.2930148840, 8.556744576,
     S 87.0, 6.155550480, 1.3738890890, 1.3162037130, 8.845513344,

ceq   DATA BCE3/
     A 88.0, 6.379704475, 1.3670797350, 1.3813229800, 9.127896309,
     B 89.0, 6.594299316, 1.4169263840, 1.4029121400, 9.414231300,
     C 90.0, 6.566919804, 1.4685817960, 1.4224120380, 9.458042145,
     D 91.0, 6.661097050, 1.2067918780, 1.4163945910, 9.284657478,
     E 92.0, 7.737902641, 1.3509917260, 1.4471185210, 10.53625107,
     F 93.0, 7.393332005, 1.2448183300, 1.4543261530, 10.09271908,
     G 94.0, 7.515841007, 1.2333894970, 1.4780857560, 10.22745800/

C     REAL*8, PARAMETER :: POST90=50.D0
C     REAL*8, PARAMETER :: PRE50 =50.D0
      REAL*8, PARAMETER :: POST90=-250.D0
      INTEGER, SAVE :: IFIRST=1
      INTEGER, INTENT(OUT) :: IDEC,JDEC
      REAL*8, INTENT(OUT) :: BCWTID,BCWTJD
      REAL*8, INTENT(IN) :: XJYEAR
      INTEGER I,IYDI,IYDJ,IYEAR,IYYI,IYYJ
      REAL*8 XDEC,DYEAR,DDEC,DELTAY,DELDEC,BCED,BCEY,RATYD
      SAVE EYEAR,BCEHC,BCEBC,BCEDI,BCTOT,BCE

      IF(IFIRST==1) THEN
        EYEAR(1:45)=BCE(1,1:45)+1900.D0
        BCEHC(1:45)=BCE(2,1:45)
        BCEBC(1:45)=BCE(3,1:45)
        BCEDI(1:45)=BCE(4,1:45)
        BCTOT(1:45)=BCE(5,1:45)
      IFIRST=0
      ENDIF

      IF(XJYEAR < 1950.D0) THEN
C**** 0 until 1850, then lin. interpolate obs. data (every 25 years)
        XDEC=(XJYEAR-1850.d0)/25.d0
        IF (XDEC < 0.) Xdec=0.
        IDEC=XDEC
        DDEC=XDEC-IDEC
        BCWTID=1.-DDEC
        JDEC=IDEC+1
        BCWTJD=DDEC
        IF(IDEC < 1) THEN
          IDEC=1
          JDEC=1
          BCWTID=XDEC
          BCWTJD=0.
        END IF
      ELSE IF(XJYEAR >= 1990.D0) THEN
C**** Slow reduction after 1990 (POST90=-250 years e-folding time)
C**** Actually we will use no reduction after 1990
        DYEAR=XJYEAR-1990.D0
        BCWTID=0.D0
        BCWTJD=1.D0 !  BCWTJD=1.D0*EXP(DYEAR/POST90)
        IDEC=8
        JDEC=8
      ELSE
C**** lin. interpolate obs. data (every 10 years) 1950-1990
        DYEAR=XJYEAR-1950.D0
        IYEAR=DYEAR
        DELTAY=DYEAR-IYEAR
        DELDEC=DYEAR/10.D0-IYEAR/10
        IDEC=(IYEAR+10)/10
        JDEC=IDEC+1
        IYDI=1+(IDEC-1)*10
        IYDJ=IYDI+10
        IYYI=IYEAR+1
        IYYJ=IYYI+1
        BCED=BCTOT(IYDI)+DELDEC*(BCTOT(IYDJ)-BCTOT(IYDI))
        BCEY=BCTOT(IYYI)+DELTAY*(BCTOT(IYYJ)-BCTOT(IYYI))
        RATYD=BCEY/BCED
        BCWTID=RATYD*(1.D0-DELDEC)
        BCWTJD=RATYD*DELDEC
        IDEC=IDEC+3
        JDEC=JDEC+3
      END IF

      RETURN
      END SUBROUTINE BCTAUW


      SUBROUTINE SUTAUW(XJYEAR,IDEC,JDEC,SUWTID,SUWTJD)
      IMPLICIT NONE
C-------------------------------------------------------------------
C     Anthropogenic Sulfate inter-decadal TAU interpolation is based
C     on a linear TAU trend (between decadal global TAU-maps) with a
C     superimposed intradecadal time dependence scaled in proportion
C     to the Anthropogenic Sulfate global emission rate.
C
C        INPUT:  XJYEAR  (Fractional Julian year)
C                                                 by 25     by 10
C       OUTPUT:  IDEC    (Map Index: I= -3,4-7  (0) -1925,1950-1980)
C                JDEC    (Map Index: J=1-4,5-8  1875-1950,1960-1990)
C
C              SUWTID    (Multiplicative Weight for SU TAU-Map IDEC)
C              SUWTJD    (Multiplicative Weight for SU TAU-Map JDEC)
C
C-------------------------------------------------------------------

      REAL*8, DIMENSION(50) :: EYEAR,SUANT,SUNAT

      REAL*8 SUE(3,41)

C     Global Emission of Sulfate

C     Emission (Mt/yr)
C               year      Anthropogenic_Sulfate Natural_Sulfate
      DATA SUE/
     A          1950.0,     30.46669769,           14.4,
     B          1951.0,     32.38347244,           14.4,
     C          1952.0,     32.18632889,           14.4,
     D          1953.0,     32.83379745,           14.4,
     E          1954.0,     32.79270935,           14.4,
     F          1955.0,     35.79611969,           14.4,
     G          1956.0,     39.93603897,           14.4,
     H          1957.0,     38.68806839,           14.4,
     I          1958.0,     39.35904312,           14.4,
     J          1959.0,     41.06065369,           14.4,
     K          1960.0,     42.67050934,           14.4,
     L          1961.0,     41.32410431,           14.4,
     M          1962.0,     41.80470276,           14.4,
     N          1963.0,     43.26312637,           14.4,
     O          1964.0,     44.68368530,           14.4,
     P          1965.0,     45.81701660,           14.4,
     Q          1966.0,     46.61584091,           14.4,
     R          1967.0,     46.42276001,           14.4,
     S          1968.0,     47.77438354,           14.4,
ceq   DATA SUE2/
     A          1969.0,     49.30817032,           14.4,
     B          1970.0,     52.81050873,           14.4,
     C          1971.0,     52.95043945,           14.4,
     D          1972.0,     54.10167694,           14.4,
     E          1973.0,     55.93037415,           14.4,
     F          1974.0,     57.31056213,           14.4,
     G          1975.0,     58.52788162,           14.4,
     H          1976.0,     59.71361542,           14.4,
     I          1977.0,     62.59599304,           14.4,
     J          1978.0,     61.98198318,           14.4,
     K          1979.0,     64.71042633,           14.4,
     L          1980.0,     65.28986359,           14.4,
     M          1981.0,     63.23768234,           14.4,
     N          1982.0,     62.88000488,           14.4,
     O          1983.0,     61.45023346,           14.4,
     P          1984.0,     63.85008621,           14.4,
     Q          1985.0,     66.47412872,           14.4,
     R          1986.0,     68.00902557,           14.4,
     S          1987.0,     69.87956238,           14.4,
ceq   DATA SUE3/
     A          1988.0,     70.52937317,           14.4,
     B          1989.0,     72.06355286,           14.4,
     C          1990.0,     71.29174805,           14.4/

C     REAL*8, PARAMETER :: POST90=100.D0
C     REAL*8, PARAMETER :: PRE50=50.D0
      REAL*8, PARAMETER :: POST90=-250.D0
      INTEGER, SAVE :: IFIRST=1
      SAVE  EYEAR,SUANT,SUNAT,SUE
      REAL*8, INTENT(IN) :: XJYEAR
      REAL*8, INTENT(OUT) :: SUWTID,SUWTJD
      INTEGER, INTENT(OUT) :: IDEC,JDEC
      REAL*8 XDEC,DDEC,DYEAR,SUED,SUEY,RATYD,DELDEC,DELTAY
      INTEGER I,IYEAR,IYDI,IYDJ,IYYI,IYYJ

      IF(IFIRST==1) THEN
        EYEAR(1:41)=SUE(1,1:41)
        SUANT(1:41)=SUE(2,1:41)
        SUNAT(1:41)=SUE(3,1:41)
        IFIRST=0
      ENDIF

      IF(XJYEAR < 1950.D0) THEN
C**** 0 until 1850, then lin. interpolate obs. data (every 25 years)
        XDEC=(XJYEAR-1850.d0)/25.d0
        IF (XDEC < 0.) Xdec=0.
        IDEC=XDEC
        DDEC=XDEC-IDEC
        SUWTID=1.-DDEC
        JDEC=IDEC+1
        SUWTJD=DDEC
        IF(IDEC < 1) THEN
          IDEC=1
          JDEC=1
          SUWTID=XDEC
          SUWTJD=0.
        END IF
      ELSE IF(XJYEAR >= 1990.D0) THEN
C**** Slow reduction after 1990 (POST90=-250 years e-folding time)
C**** Actually we will use no reduction after 1990
        DYEAR=XJYEAR-1990.D0
        SUWTID=0.D0
        SUWTJD=1.D0  !  SUWTJD=1.D0*EXP(DYEAR/POST90)
        IDEC=8
        JDEC=8
      ELSE
C**** lin. interpolate obs. data (every 10 years) 1950-1990
        DYEAR=XJYEAR-1950.D0
        IYEAR=DYEAR
        DELTAY=DYEAR-IYEAR
        DELDEC=DYEAR/10.D0-IYEAR/10
        IDEC=(IYEAR+10)/10
        JDEC=IDEC+1
        IYDI=1+(IDEC-1)*10
        IYDJ=IYDI+10
        IYYI=IYEAR+1
        IYYJ=IYYI+1
        SUED=SUANT(IYDI)+DELDEC*(SUANT(IYDJ)-SUANT(IYDI))
        SUEY=SUANT(IYYI)+DELTAY*(SUANT(IYYJ)-SUANT(IYYI))
        RATYD=SUEY/SUED
        SUWTID=RATYD*(1.D0-DELDEC)
        SUWTJD=RATYD*DELDEC
        IDEC=IDEC+3
        JDEC=JDEC+3
      END IF

      RETURN
      END SUBROUTINE SUTAUW


      SUBROUTINE GETMIE(NA,AREFF,SQEX,SQSC,SQCB,TQAB,Q55) 4,19

c     INCLUDE 'rad00def.radCOMMON.f'

      INTEGER, INTENT(IN) :: NA
      REAL*8,  intent(in) :: areff
      REAL*8   SQEX(6),SQSC(6),SQCB(6),TQEX(33),TQSC(33),TQAB(33),Q55
      REAL*8   QXAERN(25),QSAERN(25),QGAERN(25),Q55AER(25)

      REAL*8 wts,wta,QGAERX,pi,vreff
      INTEGER n0,k,n,nn
                         !                               1   2   3   4
      IF(NA < 5) THEN    !    NA : Aerosol compositions SO4,SEA,ANT,OCX
        N0=0
        IF(NA==2) N0=22
        IF(NA==3) N0=44
        IF(NA==4) N0=88
        DO 112 K=1,6
        DO 111 N=1,22
        NN=N0+N
        WTS=FRSULF(NA)
        WTA=1.D0-WTS
        QXAERN(N)=SRUQEX(K,NN)*WTA+SRUQEX(K,N)*WTS
        QSAERN(N)=SRUQSC(K,NN)*WTA+SRUQSC(K,N)*WTS
        QGAERX=SRUQCB(K,NN)*SRUQSC(K,NN)*WTA+SRUQCB(K,N)*SRUQSC(K,N)*WTS
        QGAERN(N)=QGAERX/QSAERN(N)
  111   CONTINUE
        CALL SPLINE(REFU22,QXAERN,22,AREFF,SQEX(K),1.D0,1.D0,1)
        CALL SPLINE(REFU22,QSAERN,22,AREFF,SQSC(K),1.D0,1.D0,1)
        CALL SPLINE(REFU22,QGAERN,22,AREFF,SQCB(K),1.D0,1.D0,1)

        PI=SQSC(K)/SQEX(K)
        IF(PI > PI0MAX(NA)) SQSC(K)=SQSC(K)*PI0MAX(NA)/PI
  112   CONTINUE
        DO 114 K=1,33
        DO 113 N=1,22
        NN=N0+N
        WTS=FRSULF(NA)
        WTA=1.D0-WTS
        QXAERN(N)=TRUQEX(K,NN)*WTA+TRUQEX(K,N)*WTS
        QSAERN(N)=TRUQSC(K,NN)*WTA+TRUQSC(K,N)*WTS
        QGAERX=TRUQCB(K,NN)*TRUQSC(K,NN)*WTA+TRUQCB(K,N)*TRUQSC(K,N)*WTS
        QGAERN(N)=QGAERX/(QSAERN(N)+1.d-20)
  113   CONTINUE
        CALL SPLINE(REFU22,QXAERN,22,AREFF,TQEX(K),1.D0,1.D0,1)
        CALL SPLINE(REFU22,QSAERN,22,AREFF,TQSC(K),1.D0,1.D0,1)
        TQAB(K)=TQEX(K)-TQSC(K)
  114   CONTINUE
        DO 115 N=1,22
        NN=N0+N
        WTS=FRSULF(NA)
        WTA=1.D0-WTS
        Q55AER(N)=Q55U22(NN)*WTA+Q55U22(N)*WTS
  115   CONTINUE
        CALL SPLINE(REFU22,Q55U22,22,AREFF,Q55,1.D0,1.D0,1)
      ENDIF

                               !                              5   6
      IF(NA==5.OR.NA==6) THEN  !   NA : Aerosol compositions BIC,BCB
cc      AREFF=REFDRY(NA)
        DO 122 K=1,6
        QXAERN(:)=SRSQEX(K,:)    ! 1:25
        QSAERN(:)=SRSQSC(K,:)    ! 1:25
        QGAERN(:)=SRSQCB(K,:)    ! 1:25
        CALL SPLINE(REFS25,QXAERN,25,AREFF,SQEX(K),1.D0,1.D0,1)
        CALL SPLINE(REFS25,QSAERN,25,AREFF,SQSC(K),1.D0,1.D0,1)
        CALL SPLINE(REFS25,QGAERN,25,AREFF,SQCB(K),1.D0,1.D0,1)
  122   CONTINUE
        DO 124 K=1,33
        QXAERN(:)=TRSQEX(K,:)    ! 1:25
        QSAERN(:)=TRSQSC(K,:)    ! 1:25
        QGAERN(:)=TRSQCB(K,:)    ! 1:25
        CALL SPLINE(REFS25,QXAERN,25,AREFF,TQEX(K),1.D0,1.D0,1)
        CALL SPLINE(REFS25,QSAERN,25,AREFF,TQSC(K),1.D0,1.D0,1)
        TQAB(K)=TQEX(K)-TQSC(K)
  124   CONTINUE
        CALL SPLINE(REFS25,Q55S25,25,AREFF,Q55,1.D0,1.D0,1)
      ENDIF

                                      !                             7
      IF(NA==7) THEN                  !   NA : Aerosol composition DST
cc      AREFF=REFDRY(NA)
        DO 132 K=1,6
        QXAERN(:)=SRDQEX(K,:)    ! 1:25
        QSAERN(:)=SRDQSC(K,:)    ! 1:25
        QGAERN(:)=SRDQCB(K,:)    ! 1:25
        CALL SPLINE(REFD25,QXAERN,25,AREFF,SQEX(K),1.D0,1.D0,1)
        CALL SPLINE(REFD25,QSAERN,25,AREFF,SQSC(K),1.D0,1.D0,1)
        CALL SPLINE(REFD25,QGAERN,25,AREFF,SQCB(K),1.D0,1.D0,1)
  132   CONTINUE
        DO 134 K=1,33
        QXAERN(:)=TRDQEX(K,:)    ! 1:25
        QSAERN(:)=TRDQSC(K,:)    ! 1:25
        QGAERN(:)=TRDQCB(K,:)    ! 1:25
        CALL SPLINE(REFD25,QXAERN,25,AREFF,TQEX(K),1.D0,1.D0,1)
        CALL SPLINE(REFD25,QSAERN,25,AREFF,TQSC(K),1.D0,1.D0,1)
        TQAB(K)=TQEX(K)-TQSC(K)
  134   CONTINUE
        CALL SPLINE(REFD25,Q55D25,25,AREFF,Q55,1.D0,1.D0,1)
      ENDIF

                             !                                      8
      IF(NA==8) THEN         !     NA : Aerosol composition(H2SO4) VOL
        VREFF=AREFF
        IF(VREFF < 0.1D0) VREFF=0.1D0
        IF(VREFF > 2.0D0) VREFF=2.0D0
        CALL GETQVA(VREFF)
        SQEX(:)=QVH2S(:)       ! 1:6
        SQSC(:)=SVH2S(:)       ! 1:6
        SQCB(:)=GVH2S(:)       ! 1:6
        TQAB(:)=AVH2S(:)       ! 1:33
        Q55=Q55H2S
      ENDIF
      RETURN
      END SUBROUTINE GETMIE


      SUBROUTINE AO3ABS(OCM,O3ABS) 4
      IMPLICIT NONE
C              ---------------------------------------------------------
C              UV absorption by Ozone  is expressed as a fraction of the
C              total solar flux S0. Hence O3ABS (fraction of total solar
C              flux absored by OCM cm ofozone) must be normalized within
C              SOLARM by dividing O3ABS by the corresponding fraction of
C              the solar flux within the spectral interval DKS0(15)=0.05
C              ---------------------------------------------------------
      REAL*8, INTENT(IN) :: OCM
      REAL*8, INTENT(OUT) :: O3ABS
      REAL*8 XX,DX
      INTEGER IP,IX

      O3ABS=AO3(460)
      IP=0
      XX=OCM*1.D+04
      IX=XX
      IF(IX > 99) GO TO 110
      IF(IX < 1 ) GO TO 130
      GO TO 120
  110 CONTINUE
      IP=IP+90
      XX=XX*0.1D0
      IX=XX
      IF(IX > 99) GO TO 110
  120 CONTINUE
      DX=XX-IX
      IX=IX+IP
      IF(IX > 459) GO TO 140
      O3ABS=AO3(IX)+DX*(AO3(IX+1)-AO3(IX))
      GO TO 140
  130 CONTINUE
      O3ABS=XX*AO3(1)
  140 CONTINUE

      RETURN
      END SUBROUTINE AO3ABS


      SUBROUTINE WRITER(KWRU,INDEX) 3,4
C
c      USE SURF_ALBEDO, only : AVSCAT, ANSCAT, AVFOAM, ANFOAM,
c     *     WETTRA, WETSRA, ZOCSRA, ZSNSRA, ZICSRA, ZDSSRA, ZVGSRA,
c     *     EOCTRA, ESNTRA, EICTRA, EDSTRA, EVGTRA, AGEXPF, ALBDIF
      USE SURF_ALBEDO, only : get_albedo_data
      USE DOMAIN_DECOMP, only: AM_I_ROOT
      IMPLICIT NONE
C
C     ------------------------------------------------------------------
C     WRITER Radiative Input/Output Cloud/Aerosol Data/Conrol Parameters
C
C         INDEX
C           0     control parameter defaults in RADPAR
C           1     RADPAR Radiative control/scaling param's; GHG defaults
C           2     RADPAR Atmospheric composition P,H,T,Cld,Aer  profiles
C           3     RADPAR Computed LW SW fluxes cooling and heating rates
C           4     Aerosol and Cloud: Mie scattering radiative parameters
C                 A  SW aerosol Mie scattering Qx,Qs,g in use parameters
C                 B  SW  cloud  Mie scattering Qx,Qs,g in use parameters
C                 C  SW cld+aer Mie scattering Qx,Qs,g in use parameters
C                 D  SW LW aerosol 11-compositon  Mie Qx,Qs,g parameters
C                 E  SW LW aerosol  6-compositon  Mie Qx,Qs,g parameters
C                 F  SW LW aerosol 8-size D dust  Mie Qx,Qs,g parameters
C                 G  SW LW  cloud  15-size/phase  Mie Qx,Qs,g parameters
C           5     LW cld,aer,gas total optical k-distribution extinction
C           6     LW gas absorb: total optical k-distribution extinction
C           7     A  LW cloud   TRCALK optical k-distribution extinction
C                 B  LW aerosol TRAALK optical k-distribution extinction
C           8     SW Spectral/k-dist flux, albedo, absorption components
C                 A  Spectral components of downward & upward solar flux
C                 B  Spectral components of net solar flux, heating rate
C           9     LW flux contribution from each k-distribution interval
C                 1  Downward LW flux  from each k-distribution interval
C                 2  Upward   LW flux  from each k-distribution interval
C                 3  Net (Up) LW flux  from each k-distribution interval
C                 4  Flux cooling rate from each k-distribution interval
C                 5  Fraction coolrate from each k-distribution interval
C        NOTE:
C                 KWTRAB sets LW Mie parameters in 4-D,E,F,G
C                        KWTRAB=0 (default) sets LW output to be Mie Qab
C                        KWTRAB=1           sets LW output to be Mie Qex
C                        KWTRAB=2           sets LW output to be Mie Qsc
C                        KWTRAB=3           sets LW output to be Mie Qcb
C                        KWTRAB=4           sets LW output to be Mie Pi0
C
C                 INDEX  0-9 : show item 'INDEX' only
C                 INDEX 11-19: show items 1->last digit of 'INDEX'
C                 INDEX 21-29: show items 0->last digit of 'INDEX'
C                 KWRU directs the output to selected (KWRU) file number
C     ------------------------------------------------------------------
C
      INTEGER, INTENT(IN) :: INDEX
      REAL*8 AVSCAT, ANSCAT, AVFOAM, ANFOAM,
     *     WETTRA, WETSRA, ZOCSRA, ZSNSRA, ZICSRA, ZDSSRA, ZVGSRA,
     *     EOCTRA, ESNTRA, EICTRA, EDSTRA, EVGTRA,
     &     AGEXPF(3,2), ALBDIF(3,2)
      REAL*8, dimension(10) ::       ! no longer needed except in writer
C!nu               TROPOSPHERIC AEROSOL effective radius
C!nu               BCI  OCI  SUI  SEA  SUN    ANT  OCN  OCB  BCB  SSB
     *   REAERO=(/ 0.1, 0.3, 0.3, 2.0, 0.3,   1.0, 0.3, 0.3, 0.2, 0.5/)
      CHARACTER*8, PARAMETER :: FTYPE(5) =
     *     (/'DOWNWARD','  UPWARD','UPWD NET','COOLRATE','FRACTION'/)
      CHARACTER*6, PARAMETER :: GHG(12) =
     *     (/'   H2O','   CO2','    O3','    O2','   NO2','   N2O'
     +      ,'   CH4','CCL3P1','CCL2P2','    N2',' CFC-Y',' CFC-Z'/)
      CHARACTER*3 TRABCD(5),TRAXSG(5),snotyp
      DATA TRABCD/'TRA','TRB','TRC','TRD','TRE'/
      DATA TRAXSG/'QAB','QEX','QSC','QCB','PI0'/

      REAL*8 TKEFF(3),TRPI0K(25)
      REAL*8 WFLB(LX,33),WFSL(33),UXGAS(LX,9)
      REAL*8 BGFLUX(33),BGFRAC(33),TAUSUM(33)
      REAL*8 SUM0(20),SUM1(LX+1),SUM2(LX+1),SUM3(LX+1)
      REAL*8, DIMENSION(LX,6) :: WSREXT,WSRSCT,WSRGCB,WSRPI0
      REAL*8 FSR1(17),FSR2(17)
      INTEGER :: ISR1(16), KWRU
      INTEGER, PARAMETER ::
     *  KSLAMW(16) = (/ 1, 1, 2, 2, 5, 5, 5, 5, 1, 1, 1, 3, 4, 6, 6, 1/)
     * ,IORDER(16) = (/12,11,10, 9, 6, 5, 4, 3,15,14,13, 8, 7, 2, 1,16/)

      character*1,parameter :: AUXGAS(4) = (/'0','L','X','X'/)
      REAL*8, PARAMETER :: P0=1013.25,SIGMA=5.6697D-08
      REAL*8 ACOLX,BCOLX,DCOLX,VCOLX,TCOLX,FACTOR,PPMCO2,PPMO2
     *     ,PPMN2O,PPMCH4,PPMF11,PPMF12,PPMY11,PPMZ12,EPS,TAER,HLM,TLAPS
     *     ,TAU55,TGMEAN,PSUM,SRALB,STNFLB,CRHRF,STFHR,TRDCR,SRDHR,STDHR
     *     ,PFW,DPF,FRACSL,SIGT4,WTG,SUMK,SUMT,SUMK1,SUMK2
     *     ,ASUM1,BSUM1,CSUM1,DSUM1,ESUM1,FSUM1,ASUM2,BSUM2,CSUM2,DSUM2
     *     ,ESUM2,FSUM2,ASUM3,BSUM3,CSUM3,DSUM3,ESUM3,FSUM3,SUML,SUMA
     *     ,SUMB,SUMC,SUMD,SUME,SUMF
      INTEGER I,J,K,L,KW,INDJ,INDI,INDX,KPAGE,NPAGE,LUXGAS,LGS,IPI0,IRHL
     *     ,N,II,IPF,ITG,LK,KK,NW,LINFIL

      call get_albedo_data( AVSCAT, ANSCAT, AVFOAM, ANFOAM,
     *     WETTRA, WETSRA, ZOCSRA, ZSNSRA, ZICSRA, ZDSSRA, ZVGSRA,
     *     EOCTRA, ESNTRA, EICTRA, EDSTRA, EVGTRA, AGEXPF, ALBDIF )

      KW=KWRU
      INDJ=MOD(INDEX,10)
      IF(INDJ < 1.and.INDEX > 0) INDJ=10
      INDI=1
      IF(INDEX > 20.or.INDEX==0) INDI=0
      IF(INDEX < 11) INDI=INDJ

      if (INDJ > 0) then
        DO K=1,6
        DO L=L1,NL
          WSREXT(L,K)=SRAEXT(L,K)+SRBEXT(L,K)
     +               +SRDEXT(L,K)+SRVEXT(L,K)
          WSRSCT(L,K)=SRASCT(L,K)+SRBSCT(L,K)
     +               +SRDSCT(L,K)+SRVSCT(L,K)
          WSRGCB(L,K)=SRASCT(L,K)*SRAGCB(L,K)+SRBSCT(L,K)*SRBGCB(L,K)
     +               +SRDSCT(L,K)*SRDGCB(L,K)+SRVSCT(L,K)*SRVGCB(L,K)
          WSRPI0(L,K)=WSRSCT(L,K)/(WSREXT(L,K)+1.E-10)
          WSRGCB(L,K)=WSRGCB(L,K)/(WSRSCT(L,K)+1.D-10)
        END DO
        END DO
C
        ACOLX = sum (SRAEXT(L1:NL,6))
        BCOLX = sum (SRBEXT(L1:NL,6))
        DCOLX = sum (SRDEXT(L1:NL,6))
        VCOLX = sum (SRVEXT(L1:NL,6))
        TCOLX = ACOLX+BCOLX+DCOLX+VCOLX
      end if

      DO 9999 INDX=INDI,INDJ

      KPAGE=1
      IF(INDX==0) GO TO 90

      GO TO (100,200,300,400,500,600,700,800,900,1000),INDX
C
C-------------
   90 CONTINUE
C-------------
      IF (AM_I_ROOT()) THEN
        WRITE(KW,6000)
 6000 FORMAT(' CALL WRITER(KW,0) :',2X,'PAGE 1/2  '
     +          ,'CONTROL PARAMS   DEFINITIONS'/
     +      /' CONTROL PARAMTER      DEFAULT  PARAMETER DESCRIPTION')

       WRITE(KW,6001)                              KUVFAC,KSNORM
     + ,KWTRAB,KGGVDF,KPGRAD,KLATZ0,KCLDEM,KANORM,KPFCO2,KPFOZO,KSIALB
     + ,KORDER,KUFH2O,KUFCO2,KCSELF,KCFORN
 6001 FORMAT( ! 7X,'   KVRAER = ',I1,'     1      Repartition Aer VDist'
!nu  2    ! /7X,'   MEANAC = ',I1,'     0      Use Ann-Mean Aer Clim'
!nu  3    ! /7X,'   MEANDD = ',I1,'     0      Use Ann-Mean Des Dust'
!nu  4    ! /7X,'   MEANVA = ',I1,'     0      Use Ann-Mean Volc Aer'
!nu  5      /7X,'   NCARO3 = ',I1,'     0      NCAR London 1976 Ozon'/
     6       7X,'   KUVFAC = ',I1,'     0      ON/OFF UV Mult Factor'
     7      /7X,'   KSNORM = ',I1,'     0      Norm S0 when KUVFAC=1'
     8      /7X,'   KWTRAB = ',I1,'     0      WRITER: Qab,Qex,Qsc,g'
     9      /7X,'   KGGVDF = ',I1,'     0      Use GHG VertProf Grad'
     A      /7X,'   KPGRAD = ',I1,'     1      Pole-to-Pole GHG Grad'
     1      /7X,'   KLATZ0 = ',I1,'     1      Use GHG VDist Lat Dep'
     2      /7X,'   KCLDEM = ',I1,'     1      Use TopCloud Scat Cor'
     3      /7X,'   KANORM = ',I1,'     0      Use SGP Atmo Col Norm'
     4      /7X,'   KPFCO2 = ',I1,'     0      1=MOD CO2PROF: FPXCO2'
     5      /7X,'   KPFOZO = ',I1,'     0      1=MOD O3 PROF: FPXOZO'
     6      /7X,'   KSIALB = ',I1,'     0      Schramm"s ocn ice alb'
     7      /7X,'   KORDER = ',I1,'     0      WRITER k-d spec order'
     8      /7X,'   KUFH2O = ',I1,'     1      Col Absorber Scal H2O'
     +      /7X,'   KUFCO2 = ',I1,'     1      Col Absorber Scal CO2'
     1      /7X,'   KCSELF = ',I1,'     1      H2O Cont Self-Broaden'
     2      /7X,'   KCFORN = ',I1,'     1      H2O Con Foreign-Broad'
     R      )
C
      WRITE(KW,6004)
 6004 FORMAT(/' CONTROL PARAMTER    DEFAULT       SNOW/ICE FACTORS')

      WRITE(KW,6005) agexpf,albdif
 6005 FORMAT(7X   ,'   AGEXPF = ',F7.3,'      SNOWAGE XPFACTOR SH EARTH'
     A      /7X   ,'    SH O  = ',F7.3,'         "       "     "  OCICE'
     B      /7X   ,'    SH L  = ',F7.3,'         "       "     "  LDICE'
     C      /7X   ,'    NH E  = ',F7.3,'         "       "     NH EARTH'
     D      /7X   ,'    NH O  = ',F7.3,'         "       "     "  OCICE'
     E      /7X   ,'    NH L  = ',F7.3,'         "       "     "  LDICE'
     F      /7X   ,'   ALBDIF = ',F7.3,'      SNOW/ICE ALBDIF  SH EARTH'
     G      /7X   ,'    SH O  = ',F7.3,'         "       "     "  OCICE'
     H      /7X   ,'    SH L  = ',F7.3,'         "       "     "  LDICE'
     I      /7X   ,'    NH E  = ',F7.3,'         "       "     NH EARTH'
     J      /7X   ,'    NH O  = ',F7.3,'         "       "     "  OCICE'
     K      /7X   ,'    NH L  = ',F7.3,'         "       "     "  LDICE'
     L      )
C
      WRITE(KW,6006)
 6006 FORMAT('0CONTROL PARAMTER    VALUE',16X,' DEFAULT')
      WRITE(KW,6007) REFF0,VEFF0, AVSCAT,ANSCAT,AVFOAM,ANFOAM
 6007 FORMAT(7X,'   REFF0  = ',F7.3,'                 0.300         '
     B      /7X,'   VEFF0  = ',F7.3,'                 0.350         '
     H      /7X,'   AVSCAT = ',F7.5,'                 0.01560       '
     I      /7X,'   ANSCAT = ',F7.5,'                 0.00020       '
     J      /7X,'   AVFOAM = ',F7.5,'                 0.21970       '
     K      /7X,'   ANFOAM = ',F7.5,'                 0.15140       '
     X      )
      WRITE(KW,6008)
 6008 FORMAT(/10X,'UV Solar Flux Spectral Partitions and Factors')
      WRITE(KW,6009) UVWAVL,UVFACT
 6009 FORMAT(10X,'UVWAVL = ',F7.5,2F8.5/10X,'UVFACT = ',F7.5,2F8.5)
C
!nu   WRITE(KW,6013)
 6013 FORMAT(/' CONTROL PARAMETER  PI0VIS     PI0TRA      DEFAULT')
!nu   WRITE(KW,6014) PI0VIS,PI0TRA
 6014 FORMAT(7X,'   ACID1 = ',F8.6,F11.6,'     1.0                 '
     A      /7X,'   SSALT = ',F8.6,F11.6,'     1.0                 '
     B      /7X,'   SLFT1 = ',F8.6,F11.6,'     1.0                 '
     C      /7X,'   SLFT2 = ',F8.6,F11.6,'     1.0                 '
     D      /7X,'   BSLT1 = ',F8.6,F11.6,'      .98929             '
     E      /7X,'   BSLT2 = ',F8.6,F11.6,'      .95609             '
     F      /7X,'   DUST1 = ',F8.6,F11.6,'      .91995             '
     G      /7X,'   DUST2 = ',F8.6,F11.6,'      .78495             '
     H      /7X,'   DUST3 = ',F8.6,F11.6,'      .63576             '
     I      /7X,'   CARB1 = ',F8.6,F11.6,'      .31482             '
     J      /7X,'   CARB2 = ',F8.6,F11.6,'      .47513             '
     K      )

      WRITE(KW,6019)
 6019 FORMAT(/'  GHGAS',9X,'PPMVK0    PPMVDF    PPGRAD')
      WRITE(KW,6020) (ghg(I),PPMVK0(I),PPMVDF(I),PPGRAD(I),I=1,12)
 6020 FORMAT(1X,a6,' ',F15.7,F10.5,F10.5)
      END IF
      GO TO 9999
C
C-------------
  100 CONTINUE
C-------------
C
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6101)
      WRITE(KW,6102)
      FACTOR=P0/(PLB(L1)-PLB(L1+1))*1.25
      PPMCO2=ULGAS(L1,2)*FACTOR
      PPMO2 =ULGAS(L1,4)*FACTOR
      PPMN2O=ULGAS(L1,6)*FACTOR
      PPMCH4=ULGAS(L1,7)*FACTOR
      PPMF11=ULGAS(L1,8)*FACTOR
      PPMF12=ULGAS(L1,9)*FACTOR
      PPMY11=ULGAS(L1,11)*FACTOR
      PPMZ12=ULGAS(L1,12)*FACTOR
      WRITE(KW,6103) (FULGAS(I),I=1,3),(FULGAS(I),I=6,9)
     +              ,FULGAS(11),FULGAS(12),    (FGOLDH(I),I=1,5)
C     IF(KGASSR > 0)
C    +WRITE(KW,6104) (FULGAS(I+9),I=1,2),(FULGAS(I+9),I=4,9)
C    +              ,FULGAS(11),FULGAS(12),   (FGOLDH(I+9),I=1,5)
      WRITE(KW,6105) PPMCO2,PPMN2O,PPMCH4,PPMF11,PPMF12,PPMY11,PPMZ12
     +             ,(FSTOPX(I),I=1,4),PPMV80(2),(PPMV80(I),I=6,9)
     +             ,(PPMV80(I),I=11,12),KTREND,JYEAR,JDAY,LASTVC
      WRITE(KW,6106) TAUWC0,FCLDTR,EOCTRA,ZOCSRA,KZSNOW,KCLDEM,NTRACE
     +             ,FSAAER,FTTAER,MADO3M,KCLDEP,L1
      WRITE(KW,6107) TAUIC0,FCLDSR,ESNTRA,ZSNSRA,WETTRA,KSIALB,ITR(1)
     +             ,ITR(5),FSBAER,FTBAER,MADO3M,KEEPAL,NL
      WRITE(KW,6108)       FRAYLE,EICTRA,ZICSRA,WETSRA,KCNORM,ITR(2)
     +             ,ITR(6),FSAAER,FTAAER,       KEEP10,MLAT46
      WRITE(KW,6109) TLGRAD,ECLTRA,EDSTRA,ZDSSRA,KANORM,KPGRAD,ITR(3)
     +             ,ITR(7),FSDAER,FTDAER,KWVCON,ICE012,MLON72
      WRITE(KW,6110) PTLISO       ,EVGTRA,ZVGSRA,KEEPRH,KLATZ0,ITR(4)
     +             ,ITR(8),FSVAER,FTVAER,KSOLAR,NORMS0
C
 6101 FORMAT(' (1)FUL:  1',7X,'2',8X,'3',7X,'6',7X,'7',8X,'8',8X,'9'
     +      ,8X,'11',7X,'12',4X,'RADPAR 1/F: (Control/Default'
     +      ,'/Scaling Parameters)')
 6102 FORMAT(4X,'GAS: ','H2O',5X,'CO2',7X,'O3'
     +      ,5X,'N2O',5X,'CH4',5X,'CFC-11',3X,'CFC-12'
     +      ,3X,'CFY-11',3X,'CFZ-12'
     +      ,2X,'Aerosol Global    Ocean     Land  Desert    Haze')
 6103 FORMAT(1X,'FULGAS=',F5.3,F10.5,F7.3,F9.5,F8.5,4F9.5
     +      ,2X,'FGOLDH=',F7.5,2F9.6,2F8.5)
C6104 FORMAT('+',T84,'T'
C    +      /1X,'FULGAS=',1P,1E7.1,1P,2E8.1,1P,2E8.1,1P,4E9.1
C    +      ,' S','FGOLDH=',1P,1E7.1,1P,2E9.2,1P,2E8.1)
 6105 FORMAT(1X,'PPM(1)=(now)',2X,F8.3,8X,F8.5,F8.5,4(1X,F8.7)
     +      ,2X,'TRACER=',F7.5,2F9.6,F8.5
     +      /' PPMV80=(ref)=',0P,F9.3,8X,2F8.5,4(1X,F8.7),2X
     +      ,'KTREND=',I1,2X,'JYEAR=',I4,' JDAY=',I3,5X,'LASTVC=',I7)
 6106 FORMAT(1X,'TAUWC0=',1P,E6.0,' FCLDTR=',0P,F4.2,' EOCTRA=',F3.1
     +      ,1X,'ZOCSRA=',   F3.1,' KZSNOW=',     I4,' KCLDEM=',  I3
     +      ,1X,'NTRACE=',    I3,2X,'FSTAER=',  F3.1,' FTTAER=',F3.1
     +      ,1X,'MADO3M=',    I1,1X,'KCLDEP=',    I1,'    L1=',  I3)
 6107 FORMAT(1X,'TAUIC0=',1P,E6.0,' FCLDSR=',0P,F4.2,' ESNTRA=',F3.1
     +      ,1X,'ZSNSRA=',  F3.1,1X,'WETTRA=',  F4.2,' KSIALB=',  I3
     +      ,1X,'ITR(1)=',    2I2,1X,'FSBAER=', F3.1,' FTBAER=',F3.1
     +      ,1X,'K03LON=',    I1,1X,'KEEPAL=',    I1,'    NL=',  I3)
 6108 FORMAT(1X,'       ',  6X ,  ' FRAYLE=',0P,F4.1,' EICTRA=',F3.1
     +      ,1X,'ZICSRA=',  F3.1,1X,'WETSRA=',  F4.2,' KCNORM=',  I3
     +      ,1X,'ITR(2)=',    2I2,1X,'FSAAER=', F3.1,' FTAAER=',F3.1
     +      ,1X,'       ',   ' ',1X,'KEEP10=',    I1,' MLAT46=',  I2)
 6109 FORMAT(1X,'TLGRAD=',   F6.2,' ECLTRA=',0P,F4.2,' EDSTRA=',F3.1
     +      ,1X,'ZDSSRA=',  F3.1,1X,'KANORM=',  I4  ,' KPGRAD=',  I3
     +      ,1X,'ITR(3)=',    2I2,1X,'FSDAER=', F3.1,' FTDAER=',F3.1
     +      ,1X,'KWVCON=',    I1,1X,'ICE012=',    I1,' MLON72=',  I2)
 6110 FORMAT(1X,'PTLISO=',  F6.1,1X,'           '   ,' EVGTRA=',F3.1
     +      ,1X,'ZVGSRA=',  F3.1,1X,'KEEPRH=',  I4  ,' KLATZ0=',  I3
     +      ,1X,'ITR(4)=',    2I2,1X,'FSVAER=', F3.1,' FTVAER=',F3.1
     +      ,1X,'KSOLAR=',    I1,1X,'NORMS0=',    I1,'        ')
      GO TO 9999
C
C-------------
  200 CONTINUE
C-------------
C
      NPAGE=0
      LUXGAS=0
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6201) AUXGAS(LUXGAS+1),S00WM2,S0,COSZ
      DO 202 K=1,9
      DO 201 L=L1,NL
      UXGAS(L,K)=ULGAS(L,K)
  201 CONTINUE
  202 CONTINUE
      IF(LUXGAS < 2) GO TO 205
      LGS=(LUXGAS-2)*9
      DO 203 L=L1,NL
      UXGAS(L,1)=U0GAS(L,1)*FULGAS(1+LGS)
      UXGAS(L,3)=U0GAS(L,3)*FULGAS(3+LGS)
  203 UXGAS(L,5)=U0GAS(L,5)*FULGAS(5+LGS)
C
      DO 204 L=L1,NL
      UXGAS(L,2)=U0GAS(L,2)*FULGAS(2+LGS)
      UXGAS(L,4)=U0GAS(L,4)*FULGAS(4+LGS)
      UXGAS(L,6)=U0GAS(L,6)*FULGAS(6+LGS)
      UXGAS(L,7)=U0GAS(L,7)*FULGAS(7+LGS)
      UXGAS(L,8)=U0GAS(L,8)*FULGAS(8+LGS)
  204 UXGAS(L,9)=U0GAS(L,9)*FULGAS(9+LGS)
  205 CONTINUE
      DO 206 L=NL,L1,-1
      EPS=CLDEPS(L)
      TAER=WSREXT(L,6)
      IPI0=WSRPI0(L,6)*1000.D0+1.D-05
      HLM=0.5D0*(HLB0(L+1)+HLB0(L))
      TLAPS=(TLT(L)-TLB(L))/(HLB0(L+1)-HLB0(L))
      IRHL=RHL(L)*100.0
      IF(PL(L) < 1.D0) THEN
      WRITE(KW,6212) L,PL(L),HLM,TLM(L),TLAPS,SHL(L),IRHL
     +       ,(UXGAS(L,K),K=1,3),(UXGAS(L,K),K=6,9),UXGAS(L,5)
     +       ,SIZEWC(L),SIZEIC(L),FTAUC*TAUWC(L),FTAUC*TAUIC(L),EPS,TAER
     *       ,IPI0
      ELSE
      IF(UXGAS(L,1) >= 1.D0) THEN
      WRITE(KW,6202) L,PL(L),HLM,TLM(L),TLAPS,SHL(L),IRHL
     +       ,(UXGAS(L,K),K=1,3),(UXGAS(L,K),K=6,9),UXGAS(L,5)
     +       ,SIZEWC(L),SIZEIC(L),FTAUC*TAUWC(L),FTAUC*TAUIC(L),EPS,TAER
     *       ,IPI0
      ELSE
      WRITE(KW,6211) L,PL(L),HLM,TLM(L),TLAPS,SHL(L),IRHL
     +       ,(UXGAS(L,K),K=1,3),(UXGAS(L,K),K=6,9),UXGAS(L,5)
     +       ,SIZEWC(L),SIZEIC(L),FTAUC*TAUWC(L),FTAUC*TAUIC(L),EPS,TAER
     *       ,IPI0
      ENDIF
      ENDIF
  206 CONTINUE
      DO 207 I=1,16
  207 SUM0(I)=0.
      DO 210 L=L1,NL
      DO 208 I=1,9
      SUM0(I)=SUM0(I)+ULGAS(L,I)
  208 CONTINUE
      DO 209 I=1,4
      SUM0(12+I)=SUM0(12+I)+TRACER(L,I)*
     *  1d3*.75d0/DENAER(ITR(I))*Q55DRY(ITR(I))/TRRDRY(I)
  209 CONTINUE
      SUM0(10)=SUM0(10)+FTAUC*TAUWC(L)
      SUM0(11)=SUM0(11)+FTAUC*TAUIC(L)
  210 CONTINUE
      TAU55=0.0
      DO 211 L=L1,NL
      TAU55=TAU55+WSREXT(L,6)
  211 CONTINUE
      SUM0(12)=TAU55
      TGMEAN=POCEAN*TGO**4+PEARTH*TGE**4+PLICE*TGLI**4+POICE*TGOI**4
      TGMEAN=SQRT(TGMEAN)
      TGMEAN=SQRT(TGMEAN)
      WRITE(KW,6203) (SUM0(I),I=1,3),(SUM0(I),I=6,9),SUM0(5)
     +               ,SUM0(10),SUM0(11),SUM0(12)
      WRITE(KW,6204) POCEAN,TGO,PLAKE,zlake,SUM0(13),JYEAR
     +             ,BXA(4:5),LASTVC
      WRITE(KW,6205) PEARTH,TGE,SNOWE,ZSNWOI,SUM0(14),JDAY,BXA(6:7)
      WRITE(KW,6206) POICE,TGOI,SNOWOI,ZOICE,SUM0(15),JLAT
     +             ,(SRBALB(I),I=1,6)
      WRITE(KW,6207) PLICE,TGLI,SNOWLI,zmp,SUM0(16),ILON
     +             ,(SRXALB(I),I=1,6)
      PSUM=POCEAN+PEARTH+POICE+PLICE
      snotyp='DRY' ; if(flags) snotyp='WET'
      WRITE(KW,6208) TGMEAN,snotyp,fmp
     +               ,PSUM,TSL,WMAG,LS1_loc,(PVT(I),I=1,11)
      write(kw,6213) snow_frac(1),snow_frac(2),agesn(1),
     +  agesn(2),agesn(3),wearth,fulgas(4),fulgas(5),fulgas(10)
 6213 FORMAT(1X,'FSNWds=',F6.4,' FSNWvg=',F6.4,'  AGESN=[EA:',F6.3,
     +      ' OI:',F6.3,' LI:',F6.3,'] WEARTH=',F6.4,1X,
     +      ' FULGAS[ 4=O2:',F3.1,' 5=NO2:',F3.1,' 10=N2C:',F3.1,']')
      WRITE(KW,6209) (PRNB(1:2,I),PRNX(1:2,I),I=1,4),BXA(1:3)
      WRITE(KW,6210)
 6201 FORMAT(' (2) RADPAR G/L: (Input Data)'
     +      ,2X,'Absorber Amount per Layer:'
     +      ,'  U',1A1,'GAS(L,K) in cm**3(STP)/cm**2',2X,'S00WM2=',F9.4
     +      ,1X,'S0=',F9.4,2X,'COSZ=',F6.4
     +      /' LN     PL  HLM   TLM  TLAP   SHL  .RH     '
     +      ,'H2O   CO2    O3    N2O    CH4  CFC-11'
     +      ,'  CFC-12   NO2   WC.SIZ.IC  WC.TAU.IC CLEP  A TAU PI0')
 6202 FORMAT(1X,I2,F7.2,F5.1,F7.2,F5.1,1X,F7.6,I3
     +      ,F8.2,F6.2,1X,F6.5,1X,F5.4
     +      ,F7.4,1P,3E8.1,0P,2F5.1,F6.2,F5.2,1X,F4.3,F6.3,I5)
 6203 FORMAT(24X,' Column Amount',F7.1,F7.2,1X,F6.5
     +       ,1X,F5.4,F7.4,1P,3E8.1,0P,10X,F6.2,F5.2,5X,F6.3)
 6204 FORMAT( 1X,'PWATER=',F6.4,'    TGO=' ,F6.2,1X,' PLAKE=',F6.3
     +      , 1X,' ZLAKE=',F6.3,' TRACER 1=',F5.3,' JYEAR=',I4
     +      , 3X,'BSNVIS=',F6.4,' BSNNIR=' ,F6.4,7X,'LASTVC=',I7)
 6205 FORMAT(    ' PEARTH=',F6.4,'    TGE=',F6.2,'  SNOWE=',F6.3
     +      ,    '  ZSNOW=',F6.3,'  Sums: 2=',F5.3
     +      ,     '  JDAY=',I4  ,2X,' XSNVIS=',F6.4,' XSNNIR=',F6.4
     +      , 8X,'NIRALB VISALB')
 6206 FORMAT(    '  POICE=',F6.4,'   TGOI=',F6.2,' SNOWOI=',F6.3
     +      ,    '  ZOICE=',F6.3,'        3=',F5.3
     +      ,     '  JLAT=',I4,  2X,' SRBALB=',F6.4
     +      ,4F7.4,F7.4)
 6207 FORMAT(    '  PLICE=',F6.4,'   TGLI=',F6.2,' SNOWLI=',F6.3
     +      ,    '  ZMLTP=',F6.3,'        4=',F5.3
     +      ,     '  ILON=',I4,  2X,' SRXALB=',F6.4
     +      ,4F7.4,F7.4)
 6208 FORMAT(8X,6('-'),' TGMEAN=',F6.2,'    SNOW : ',a3,'  FMLTP='
     +      ,F6.3,'  BSAND TUNDRA GRASSL SHRUBS  TREES DECIDF'
     +       ,' EVERGF','  RAINF','  CROPS','  BDIRT','  ALGAE'
     +      /    '   PSUM=',F6.4,'    TSL=',F6.2,' WINDSP=',F6.3
     +       ,'  LS1L=',I2,T54,'PVT=',F6.4,10F7.4)
 6209 FORMAT(' BOCVIS BOCNIR XOCVIS XOCNIR BEAVIS BEANIR XEAVIS XEANIR'
     +      ,' BOIVIS BOINIR XOIVIS XOINIR BLIVIS BLINIR XLIVIS XLINIR'
     +      ,' EXPSNE EXPSNO EXPSNL'/1X,F6.4,18F7.4)
 6210 FORMAT(' ')
 6211 FORMAT(1X,I2,F7.2,F5.1,F7.2,F5.1,1X,F7.6,I3
     +      ,F8.5,F6.2,1X,F6.5,1X,F5.4
     +      ,F7.4,1P,3E8.1,0P,2F5.1,F6.2,F5.2,1X,F4.3,F6.3,I5)
 6212 FORMAT(1X,I2,F7.4,F5.1,F7.2,F5.1,1X,F7.6,I3
     +      ,F8.5,F6.2,1X,F6.5,1X,F5.4
     +      ,F7.4,1P,3E8.1,0P,2F5.1,F6.2,F5.2,1X,F4.3,F6.3,I5)
C
      GO TO 9999
C
C-------------
  300 CONTINUE
C-------------
C
      NPAGE=0
      IF(INDEX < 11) NPAGE=KPAGE
      IF(NL > 13) NPAGE=1
      L=NL+1
      SRALB =SRUFLB(L)/(SRDFLB(L)+1.E-10)
      STNFLB=SRNFLB(L)-TRNFLB(L)
      WRITE(KW,6301) NORMS0
      WRITE(KW,6302) L,PLB(L),HLB0(L),TLT(L-1) ! TLB(LN+1) unused/set
     +             ,TRDFLB(L),TRUFLB(L),TRNFLB(L)
     +             ,SRDFLB(L),SRUFLB(L),SRNFLB(L),STNFLB,SRALB
      DO 301 L=NL,L1,-1
      CRHRF=8.4167/(PLB(L)-PLB(L+1))
      STNFLB=SRNFLB(L)-TRNFLB(L)
      STFHR =SRFHRL(L)-TRFCRL(L)
      TRDCR =TRFCRL(L)*CRHRF
      SRDHR =SRFHRL(L)*CRHRF
      STDHR=STFHR*CRHRF
      SRALB =SRUFLB(L)/(SRDFLB(L)+1.E-10)
!eq   SRXVIS=SRXATM(1)
!eq   SRXNIR=SRXATM(2)
      IF(PLB(L) < 1.D0) THEN
      WRITE(KW,6313) L,PLB(L),HLB0(L),TLB(L),TLT(L)
     +             ,TRDFLB(L),TRUFLB(L),TRNFLB(L),TRFCRL(L)
     +             ,SRDFLB(L),SRUFLB(L),SRNFLB(L),SRFHRL(L)
     +             ,STNFLB,STFHR,STDHR,TRDCR,SRDHR,SRALB
      ELSE
      WRITE(KW,6303) L,PLB(L),HLB0(L),TLB(L),TLT(L)
     +             ,TRDFLB(L),TRUFLB(L),TRNFLB(L),TRFCRL(L)
     +             ,SRDFLB(L),SRUFLB(L),SRNFLB(L),SRFHRL(L)
     +             ,STNFLB,STFHR,STDHR,TRDCR,SRDHR,SRALB
      ENDIF
  301 CONTINUE
C
      DO 302 II=1,3
      PFW=TRDFLB(L1)
      IF(II==2) PFW=TRUFLB(L1)
      IF(II==3) PFW=TRUFLB(NL+1)
      IPF=PFW
      DPF=PFW-IPF
      IF(IPF < 1) IPF=1
      IF(IPF > 899) IPF=899
  302 TKEFF(II)=TKPFT(IPF)+DPF*(TKPFT(IPF+1)-TKPFT(IPF))
C
      WRITE(KW,6304) WINDZF(1),WINDZT(1),TOTLZF(1),TOTLZT(1),
     +              (FSRNFG(I),I=1,4),LTOPCL,JLAT,JYEAR
      WRITE(KW,6305) WINDZF(2),WINDZT(2),TOTLZF(2),TOTLZT(2),
     +              (FTRUFG(I),I=1,4),LBOTCL,ILON,JDAY
      IF(KORDER==0) WRITE(KW,6306) WINDZF(3),WINDZT(3),TOTLZF(3)
     +              ,TOTLZT(3),(I,I=1,16)
      IF(KORDER==1) WRITE(KW,6307) WINDZF(3),WINDZT(3),TOTLZF(3)
     +              ,TOTLZT(3),(I,I=1,16)
      FRACSL=0.D0
      IF(KORDER==0) WRITE(KW,6308) TKEFF(1),TKEFF(2),TKEFF(3)
     +               ,(SRKALB(NORDER(I)),I=1,16),BTEMPW,TRUFTW,SRIVIS
     +               ,SROVIS,PLAVIS,SRINIR,SRONIR,PLANIR
      IF(KORDER==1) WRITE(KW,6308) TKEFF(1),TKEFF(2),TKEFF(3)
     +               ,(SRKALB(I),I=1,16),BTEMPW,TRUFTW,SRIVIS
     +               ,SROVIS,PLAVIS,SRINIR,SRONIR,PLANIR
      WRITE(KW,6309) TRDFGW,TRUFGW,SRDVIS,SRUVIS,ALBVIS,SRDNIR,SRUNIR
     +             ,ALBNIR
      WRITE(KW,6310) SRXVIS,SRXNIR,SRTVIS,SRRVIS,SRAVIS,SRTNIR,SRRNIR
     +             ,SRANIR
C
C
 6301 FORMAT(/' (3) RADPAR M/S: (Output Data)'
     +      ,T37,'Thermal Fluxes (W/M**2)',4X,'Solar Fluxes (W/M**2)'
     +      ,1X,'NORMS0=',I1,'  Energy  Input  Heat/Cool Deg/Day Alb'
     +      ,'do'/' LN     PLB   HLB    TLB    TLT '
     +      ,'  TRDFLB TRUFLB TRNFLB TRFCRL   SRDFLB  SRUFLB  SRNFLB'
     +      ,' SRFHRL  STNFLB  STFHR  SR-TR TR=CR SR=HR SRALB')
 6302 FORMAT(1X,I2,F9.3,F6.2,1X,F6.2,8X,3F7.2,8X,3F8.2,7X,F8.2,26X,F6.4)
 6303 FORMAT(1X,I2,F9.3,F6.2,2F7.2,1X,3F7.2,F7.2,1X,3F8.2,F7.2,1X,F7.2
     +      ,1X,F6.2,1X,3F6.2,1X,F5.4)
 6304 FORMAT( 1X,'XMU  WINDZF WINDZT   TOTLZF TOTLZT'/
     +        1X,'1.0',1X,F7.3,F7.2,2X,F7.3,F7.2,2X,'FR.SRNLB1'
     +      ,' OCEAN=',F7.2,' EARTH=',F7.2,'  OICE=',F7.2,'   LICE='
     +      ,F7.2,1X,' LTOPCL=',I2,' JLAT=',I2,' JYEAR=',I4)
 6305 FORMAT( 1X,'0.5',1X,F7.3,F7.2,2X,F7.3,F7.2,2X,'FR.TRULB1'
     +      ,' OCEAN=',F7.4,' EARTH=',F7.4,'  OICE=',F7.4,'   LICE='
     +      ,F7.4,1X,' LBOTCL=',I2,' ILON=',I2,'  JDAY=',I4)
 6306 FORMAT( 1X,'0.1',1X,F7.3,F7.2,2X,F7.3,F7.2,2X,'L=',I3,15I6)
 6307 FORMAT( 1X,'0.1',1X,F7.3,F7.2,2X,F7.3,F7.2,2X,'K=',I3,15I6)
 6308 FORMAT(' TKeff= ',F6.2,2F7.2,'  SRKALB=',16F6.4/
     +        1X,'At Top of Atm: ',' BTEMPW=',F6.2,1X,' TRUFTW=',F6.3
     +      , 2X,' SRIVIS=',F6.2,' SROVIS=',F6.2,   ' PLAVIS=',F6.4
     +      , 2X,' SRINIR=',F6.2,' SRONIR=',F6.2,   ' PLANIR=',F6.4)
 6309 FORMAT( 1X,'At Bot of Atm: ',' TRDFGW=',F6.3,1X,' TRUFGW=',F6.3
     +      , 2X,' SRDVIS=',F6.2,' SRUVIS=',F6.2,   ' ALBVIS=',F6.4
     +      , 2X,' SRDNIR=',F6.2,' SRUNIR=',F6.2,   ' ALBNIR=',F6.4)
 6310 FORMAT( 1X,'In Atmosphere: ',' SRXVIS=',F6.4,1X,' SRXNIR=',F6.4
     +      , 2X,' SRTVIS=',F6.4,' SRRVIS=',F6.4,   ' SRAVIS=',F6.4
     +      , 2X,' SRTNIR=',F6.4,' SRRNIR=',F6.4,   ' SRANIR=',F6.4)
 6311 FORMAT(' ')
 6313 FORMAT(1X,I2,F9.5,F6.2,2F7.2,1X,F7.4,2F7.2,F7.4,1X,3F8.2,F7.4
     +      ,1X,F7.2,F7.4,1X,3F6.2,1X,F5.4)
      GO TO 9999
C
C-------------
  400 CONTINUE
C-------------
C
C                                (4A)  Total Aerosol Qx, Qs, g, Pi0
C                                ----------------------------------
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6401)
      DO 402 K=1,6
      SUM1(K)=0.
      SUM2(K)=0.
      SUM3(K)=0.
      DO 401 L=L1,NL
      SUM1(K)=SUM1(K)+WSREXT(L,K)
      SUM2(K)=SUM2(K)+WSRSCT(L,K)
      SUM3(K)=SUM3(K)+WSRSCT(L,K)*WSRGCB(L,K)
  401 CONTINUE
      SUM3(K)=SUM3(K)/(SUM2(K)+1.D-10)
      SUM0(K)=SUM2(K)/(SUM1(K)+1.D-10)
  402 CONTINUE
      WRITE(KW,6402) (K,K=1,6),(K,K=1,6)
      DO 403 L=NL,L1,-1
      WRITE(KW,6403) L,PLB(L),HLB0(L)
     +              ,(WSREXT(L,J),J=1,6),(WSRSCT(L,J),J=1,6)
  403 CONTINUE
      WRITE(KW,6404) (SUM1(K),K=1,6),(SUM2(K),K=1,6)
      NPAGE=0
      IF(NL > 13) NPAGE=1
      WRITE(KW,6405) KANORM
      WRITE(KW,6406) (K,K=1,6),(K,K=1,6)
      DO 404 L=NL,L1,-1
      WRITE(KW,6407) L,PL(L),DPL(L)
     +              ,(WSRGCB(L,J),J=1,6),(WSRPI0(L,J),J=1,6)
  404 CONTINUE
      WRITE(KW,6408) (SUM3(K),K=1,6),(SUM0(K),K=1,6)
C     WRITE(KW,6420) (SRBALB(K),K=1,6)
C     WRITE(KW,6421) (SRXALB(K),K=1,6)
C     WRITE(KW,6422)
      SUMT=0.
      DO 406 J=1,5
      TAU55=0.
      DO 405 I=1,11  !  NAERO
  405 TAU55=TAU55+AGOLDH(I,J)*FGOLDH(J)
      WRITE(KW,6423) J,FGOLDH(J),TAU55
  406 SUMT=SUMT+TAU55
      WRITE(KW,6438) SUMT
      WRITE(KW,6424) BCOLX,ACOLX,DCOLX,VCOLX,TCOLX
      DO 407 I=1,8
      WRITE(KW,6425)
  407 CONTINUE
C
C                                (4B)  Water/Ice Cloud Qx, Qs, g, Pi0
C                                ------------------------------------
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6411)
      DO 412 K=1,6
      SUM1(K)=0.
      SUM2(K)=0.
      SUM3(K)=0.
      DO 411 L=L1,NL
      SUM1(K)=SUM1(K)+SRCEXT(L,K)
      SUM2(K)=SUM2(K)+SRCSCT(L,K)
      SUM3(K)=SUM3(K)+SRCSCT(L,K)*SRCGCB(L,K)
  411 SRCPI0(L,K)=SRCSCT(L,K)/(SRCEXT(L,K)+1.D-10)
      SUM3(K)=SUM3(K)/(SUM2(K)+1.D-10)
      SUM0(K)=SUM2(K)/(SUM1(K)+1.D-10)
  412 CONTINUE
      WRITE(KW,6412) (K,K=1,6),(K,K=1,6)
      DO 413 L=NL,L1,-1
      WRITE(KW,6413) L,PLB(L),HLB0(L)
     +              ,(SRCEXT(L,J),J=1,6),(SRCSCT(L,J),J=1,6)
  413 CONTINUE
      WRITE(KW,6414) (SUM1(K),K=1,6),(SUM2(K),K=1,6)
      NPAGE=0
      IF(NL > 13) NPAGE=1
      WRITE(KW,6415) KANORM
      WRITE(KW,6416) (K,K=1,6),(K,K=1,6)
      DO 414 L=NL,L1,-1
      WRITE(KW,6417) L,PL(L),DPL(L)
     +              ,(SRCGCB(L,J),J=1,6),(SRCPI0(L,J),J=1,6)
  414 CONTINUE
      WRITE(KW,6418) (SUM3(K),K=1,6),(SUM0(K),K=1,6)
      WRITE(KW,6420) (SRBALB(K),K=1,6)
      WRITE(KW,6421) (SRXALB(K),K=1,6)
      WRITE(KW,6422)
      SUMT=0.
      DO 416 J=1,5
      TAU55=0.
      DO 415 I=1,11  !  NAERO
  415 TAU55=TAU55+AGOLDH(I,J)*FGOLDH(J)
      WRITE(KW,6423) J,FGOLDH(J),TAU55
  416 SUMT=SUMT+TAU55
      WRITE(KW,6438) SUMT
      DO 417 I=1,2
      WRITE(KW,6425)
  417 CONTINUE
C
C                                (4C)  Aerosol + Cloud Qx, Qs, g, Pi0
C                                ------------------------------------
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6426)
      DO 419 K=1,6
      SUM1(K)=0.
      SUM2(K)=0.
      SUM3(K)=0.
      DO 418 L=L1,NL
      SUM1(K)=SUM1(K)+DBLEXT(L,K)
      SUM2(K)=SUM2(K)+DBLSCT(L,K)
      SUM3(K)=SUM3(K)+DBLSCT(L,K)*DBLGCB(L,K)
  418 DBLPI0(L,K)=DBLSCT(L,K)/(DBLEXT(L,K)+1.E-10)
      SUM3(K)=SUM3(K)/(SUM2(K)+1.E-10)
      SUM0(K)=SUM2(K)/(SUM1(K)+1.E-10)
  419 CONTINUE
      WRITE(KW,6427) (K,K=1,6),(K,K=1,6)
      DO 420 L=NL,L1,-1
      WRITE(KW,6428) L,PLB(L),HLB0(L)
     +              ,(DBLEXT(L,J),J=1,6),(DBLSCT(L,J),J=1,6)
  420 CONTINUE
      WRITE(KW,6429) (SUM1(K),K=1,6),(SUM2(K),K=1,6)
      NPAGE=0
      IF(NL > 13) NPAGE=1
      WRITE(KW,6430) KANORM
      WRITE(KW,6431) (K,K=1,6),(K,K=1,6)
      DO 421 L=NL,L1,-1
      WRITE(KW,6432) L,PL(L),DPL(L)
     +              ,(DBLGCB(L,J),J=1,6),(DBLPI0(L,J),J=1,6)
  421 CONTINUE
      WRITE(KW,6433) (SUM3(K),K=1,6),(SUM0(K),K=1,6)
      WRITE(KW,6434) (SRBALB(K),K=1,6)
      WRITE(KW,6435) (SRXALB(K),K=1,6)
      WRITE(KW,6436)
      SUMT=0.
      DO 423 J=1,5
      TAU55=0.
      DO 422 I=1,11  !  NAERO
  422 TAU55=TAU55+AGOLDH(I,J)*FGOLDH(J)
      WRITE(KW,6437) J,FGOLDH(J),TAU55
  423 SUMT=SUMT+TAU55
      WRITE(KW,6438) SUMT
      DO 424 I=1,2
      WRITE(KW,6439)
  424 CONTINUE
C
C                                (4D)  11-Comp Aerosol Qx, Qs, g, Pi0
C                                ------------------------------------
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6440)  KWTRAB,(N,N=1,11)
      WRITE(KW,6441)
      DO 425 K=1,6
      WRITE(KW,6442) K,(SRAQEX(K,N),N=1,11)
  425 CONTINUE
      WRITE(KW,6443)
      DO 426 K=1,6
      WRITE(KW,6442) K,(SRAQSC(K,N),N=1,11)
  426 CONTINUE
      WRITE(KW,6444)
      DO 427 K=1,6
      WRITE(KW,6442) K,(SRAQCB(K,N),N=1,11)
  427 CONTINUE
      WRITE(KW,6445) TRABCD(1),TRAXSG(KWTRAB+1)
      DO 428 K=1,33
      IF(KWTRAB==0) WRITE(KW,6442) K,(TRAQAB(K,N),N=1,11)
      IF(KWTRAB==1) WRITE(KW,6442) K,(TRAQEX(K,N),N=1,11)
      IF(KWTRAB==2) WRITE(KW,6442) K,(TRAQSC(K,N),N=1,11)
      IF(KWTRAB==3) WRITE(KW,6442) K,(TRAQCB(K,N),N=1,11)
      IF(KWTRAB==4) THEN
      DO N=1,11
      TRPI0K(N)=TRAQSC(K,N)/(1.D-10+TRAQEX(K,N))
      END DO
      WRITE(KW,6442) K,(TRPI0K(N),N=1,11)
      ENDIF
  428 CONTINUE
      DO 429 I=1,1
      WRITE(KW,6446)
  429 CONTINUE
C
C
C                                (4E)  10-Comp Aerosol Qx, Qs, g, Pi0
C                                ------------------------------------
      WRITE(KW,6450) KWTRAB,(N,N=1, 6),(REFDRY(N)*ref_mult,N=1, 6)
      WRITE(KW,6451)
      DO 435 K=1,6
      WRITE(KW,6452) K,(SRHQEX(K,1,N),N=1, 4),(SRBQEX(K,N),N=5, 6)
  435 CONTINUE
      WRITE(KW,6453)
      DO 436 K=1,6
      WRITE(KW,6452) K,(SRHQSC(K,1,N),N=1, 4),(SRBQSC(K,N),N=5, 6)
  436 CONTINUE
      WRITE(KW,6454)
      DO 437 K=1,6
      WRITE(KW,6452) K,(SRHQCB(K,1,N),N=1, 4),(SRBQCB(K,N),N=5, 6)
  437 CONTINUE
      WRITE(KW,6455) TRABCD(2),TRAXSG(1) !obs TRAXSG(KWTRAB+1)
      DO 438 K=1,33
      IF(KWTRAB==0) WRITE(KW,6442) K,(TRHQAB(K,1,N),N=1, 4),
     *                                 (TRBQAB(K,N),N=5, 6)
!obs  IF(KWTRAB==1) WRITE(KW,6442) K,(TRHQEX(K,1,N),N=1, 4),
!obs *                                 (TRBQEX(K,N),N=5, 6)
!obs  IF(KWTRAB==2) WRITE(KW,6442) K,(TRHQSC(K,1,N),N=1, 4),
!obs *                                 (TRBQSC(K,N),N=5, 6)
!obs  IF(KWTRAB==3) WRITE(KW,6442) K,(TRHQCB(K,1,N),N=1, 4),
!obs *                                 (TRBQCB(K,N),N=5, 6)
!obs  IF(KWTRAB==4) THEN
!obs  DO N=1,4
!obs  TRPI0K(N)=TRHQCB(K,1,N)/(1.D-10+TRHQEX(K,1,N))
!obs  END DO
!obs  DO N=5,6 ! 10
!obs  TRPI0K(N)=TRBQSC(K,N)/(1.D-10+TRBQEX(K,N))
!obs  END DO
!obs  WRITE(KW,6442) K,(TRPI0K(N),N=1, 6)
!obs  ENDIF
  438 CONTINUE
      DO 439 I=1,1
      WRITE(KW,6456)
  439 CONTINUE
C
C                             (4F  8-size Dust Aerosol Qx, Qs, g, Pi0
C                             ---------------------------------------
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6460) KWTRAB,(N,N=1,8),(REDUST(N),N=1,8)
      WRITE(KW,6461)
      DO 445 K=1,6
      WRITE(KW,6462) K,(SRAQEX(K,N),N=1,8)
  445 CONTINUE
      WRITE(KW,6463)
      DO 446 K=1,6
      WRITE(KW,6462) K,(SRAQSC(K,N),N=1,8)
  446 CONTINUE
      WRITE(KW,6464)
      DO 447 K=1,6
      WRITE(KW,6462) K,(SRAQCB(K,N),N=1,8)
  447 CONTINUE
      WRITE(KW,6465) TRABCD(4),TRAXSG(KWTRAB+1)
      DO 448 K=1,33
      IF(KWTRAB==0) WRITE(KW,6442) K,(TRDQAB(K,N),N=1,8)
      IF(KWTRAB==1) WRITE(KW,6442) K,(TRDQEX(K,N),N=1,8)
      IF(KWTRAB==2) WRITE(KW,6442) K,(TRDQSC(K,N),N=1,8)
      IF(KWTRAB==3) WRITE(KW,6442) K,(TRDQCB(K,N),N=1,8)
      IF(KWTRAB==4) THEN
      DO N=1,8
      TRPI0K(N)=TRDQSC(K,N)/(1.D-10+TRDQEX(K,N))
      END DO
      WRITE(KW,6442) K,(TRPI0K(N),N=1,8)
      ENDIF
  448 CONTINUE
      DO 449 I=1,1
      WRITE(KW,6466)
  449 CONTINUE
C
C                           (4G  15-Size/phase Cloud Qx, Qs, g, Pi0
C                           ---------------------------------------
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
      WRITE(KW,6470) KWTRAB,(N,N=1,15)
      WRITE(KW,6471)
      DO 430 K=1,6
      WRITE(KW,6472) K,(SRCQEX(K,N),N=1,15)
  430 CONTINUE
      WRITE(KW,6473)
      DO 431 K=1,6
      WRITE(KW,6472) K,(SRCQSC(K,N),N=1,15)
  431 CONTINUE
      WRITE(KW,6474)
      DO 432 K=1,6
      WRITE(KW,6472) K,(SRCQCB(K,N),N=1,15)
  432 CONTINUE
      WRITE(KW,6475) TRABCD(3),TRAXSG(KWTRAB+1)
      DO 433 K=1,33
      IF(KWTRAB==0) WRITE(KW,6472) K,(TRCQAB(K,N),N=1,15)
      IF(KWTRAB==1) WRITE(KW,6472) K,(TRCQEX(K,N),N=1,15)
      IF(KWTRAB==2) WRITE(KW,6472) K,(TRCQSC(K,N),N=1,15)
      IF(KWTRAB==3) WRITE(KW,6472) K,(TRCQCB(K,N),N=1,15)
      IF(KWTRAB==4) THEN
      DO N=1,15
      TRPI0K(N)=TRCQSC(K,N)/(1.D-10+TRCQEX(K,N))
      END DO
      WRITE(KW,6442) K,(TRPI0K(N),N=1,15)
      ENDIF
  433 CONTINUE
      DO 434 I=1,2
      WRITE(KW,6476)
  434 CONTINUE
C
 6401 FORMAT(' (4A) Aerosol Input for Solar Radiation:'
     +      ,' Aerosol Radiative Parameters'
     +      ,T81,'LIST: SRAEXT(L,K),SRASCT(L,K),SRAGCB(L,K),SRAPI0(L,K)'
     +      //T42,'TAU -- EXTINCTION',T99,'TAU -- SCATTERING'
     +      ,/T24,53('-'),4X,53('-'))
 6402 FORMAT(' LN    PLB     HLB     K=',I3,5I9,7X,'K=',I3,5I9)
 6403 FORMAT(1X,I2,2F8.3,3X,6F9.6,3X,6F9.6)
 6404 FORMAT(/1X,T7,'COLUMN AMOUNT=',2X,6F9.6,3X,6F9.6)
 6405 FORMAT(6X,'KANORM=',1I1/T48,'COSBAR',T105,'PIZERO'
     +      ,/T24,53('-'),4X,53('-'))
 6406 FORMAT(' LN     PL     DPL     K=',I3,5I9,7X,'K=',I3,5I9)
 6407 FORMAT(1X,I2,2F8.3,3X,6F9.6,3X,6F9.6)
 6408 FORMAT(/1X,T7,'COLUMN   MEAN=',2X,6F9.6,3X,6F9.6)
C
 6411 FORMAT(' (4B) Cloud Input for Solar Radiation:'
     +      ,'   Cloud Radiative Parameters'
     +      ,T81,'LIST: SRCEXT(L,K),SRCSCT(L,K),SRCGCB(L,K),SRCPI0(L,K)'
     +      //T42,'TAU -- EXTINCTION',T99,'TAU -- SCATTERING'
     +      ,/T24,53('-'),4X,53('-'))
 6412 FORMAT(' LN    PLB     HLB     K=',I3,5I9,7X,'K=',I3,5I9)
 6413 FORMAT(1X,I2,2F8.3,3X,6F9.6,3X,6F9.6)
 6414 FORMAT(/1X,T7,'COLUMN AMOUNT=',2X,6F9.6,3X,6F9.6)
 6415 FORMAT(6X,'KANORM=',1I1/T48,'COSBAR',T105,'PIZERO'
     +      ,/T24,53('-'),4X,53('-'))
 6416 FORMAT(' LN     PL     DPL     K=',I3,5I9,7X,'K=',I3,5I9)
 6417 FORMAT(1X,I2,2F8.3,3X,6F9.6,3X,6F9.6)
 6418 FORMAT(/1X,T7,'COLUMN   MEAN=',2X,6F9.6,3X,6F9.6)
C
 6420 FORMAT(/1X,T7,'ALBEDO RSURFB=',2X,6F9.6,3X,6F9.6)
 6421 FORMAT( 1X,T7,'ALBEDO RSURFX=',2X,6F9.6,3X,6F9.6)
 6422 FORMAT(///T44,'AEROSOL COMPOSITION AND TYPE MIX:'
     +      ,T81,'FACTOR',6X,'VALUE',T107,'TAU(0.55)'/)
 6423 FORMAT(T81,'FGOLDH(',I1,') =',1P,E9.2,5X,0P,F7.4)
 6424 FORMAT(/T11,'SUM COLUMN TAU(0.55) =    BkGrnd    ClimAer   D Dust'
     +       ,'    VolAer    TotAer'/T33,5F10.5)
 6425 FORMAT(' ')
C
 6426 FORMAT(' (4C) Cloud+Aerosol  Output from SOLARM/SGPGXG:'
     +      ,'   Cloud+Aerosol Rad Parameters'
     +      ,T81,'LIST: DBLEXT(L,K),DBLSCT(L,K),DBLGCB(L,K),DBLPI0(L,K)'
     +      //T42,'TAU -- EXTINCTION',T99,'TAU -- SCATTERING'
     +      ,/T24,53('-'),4X,53('-'))
 6427 FORMAT(' LN    PLB     HLB     K=',I3,5I9,7X,'K=',I3,5I9)
 6428 FORMAT(1X,I2,2F8.3,3X,6F9.6,3X,6F9.6)
 6429 FORMAT(/1X,T7,'COLUMN AMOUNT=',2X,6F9.6,3X,6F9.6)
 6430 FORMAT(6X,'KANORM=',1I1/T48,'COSBAR',T105,'PIZERO'
     +      ,/T24,53('-'),4X,53('-'))
 6431 FORMAT(' LN     PL     DPL     K=',I3,5I9,7X,'K=',I3,5I9)
 6432 FORMAT(1X,I2,2F8.3,3X,6F9.6,3X,6F9.6)
 6433 FORMAT(/1X,T7,'COLUMN   MEAN=',2X,6F9.6,3X,6F9.6)
 6434 FORMAT(/1X,T7,'ALBEDO RSURFB=',2X,6F9.6,3X,6F9.6)
 6435 FORMAT( 1X,T7,'ALBEDO RSURFX=',2X,6F9.6,3X,6F9.6)
 6436 FORMAT(///T44,'AEROSOL COMPOSITION AND TYPE MIX:'
     +      ,T81,'FACTOR',6X,'VALUE',T107,'TAU(0.55)'/)
 6437 FORMAT(T81,'FGOLDH(',I1,') =',1P,E9.2,5X,0P,F7.4)
 6438 FORMAT(/T81,'SUM COLUMN TAU(0.55) =',F10.4)
 6439 FORMAT(' ')
C
 6440 FORMAT(' (4D) Background Aerosol Solar and Thermal Mie '
     +      ,'Scattering Parameters:'
     +      ,T81,'List: SRAQEX(L,K),SRAQST(L,K),SRAQCB(L,K), TRAB Q S G'
     +      /'      KWTRAB=',I1/7X,11I8/
     +        '   AEROSOL  ACID1   SSALT   SLFT1   SLFT2   BSLT1'
     +        ,'   BSLT2   DUST1   DUST2   DUST3   CARB1   CARB2'/
     +        '   SIZE      0.5     2.0     0.3     1.0     0.5 '
     +        ,'    2.0     0.5     2.0     8.0     0.1     0.5 ')
 6441 FORMAT('  K  SRAQEX')
 6442 FORMAT(I3,6X,15F8.5)
 6443 FORMAT('  K  SRAQSC')
 6444 FORMAT('  K  SRAQCB')
 6445 FORMAT('  K  ',2A3)
 6446 FORMAT(' ')
C
 6450 FORMAT(' (4E) Climatology Aerosol Solar and Thermal Mie '
     +      ,'Scattering Parameters:'
     +      ,T81,'List: SRBQEX(L,K),SRBQST(L,K),SRBQCB(L,K), TRAB Q S G'
     +      /'      KWTRAB=',I1/7X, 6I8/
     +        '   AEROSOL   SO4     SEA     ANT     OCX     BCI '
     +        ,'    BCB'/ ! OCN     OCB     BCB     SSB         '/
     +        '   SIZE ', 6F8.1)
 6451 FORMAT('  K  SRBQEX - DRY')
 6452 FORMAT(I3,6X,15F8.5)
 6453 FORMAT('  K  SRBQSC - DRY')
 6454 FORMAT('  K  SRBQCB - DRY')
 6455 FORMAT('  K  ',2A3,' - DRY')
 6456 FORMAT(' ')
C
 6460 FORMAT(' (4F) Desert Dust Aerosol Solar and Thermal Mie '
     +      ,'Scattering Parameters:'
     +      ,T81,'List: SRDQEX(L,K),SRDQST(L,K),SRDQCB(L,K), TRAB Q S G'
     +      /'      KWTRAB=',I1/7X,8I8/
     +        '   AEROSOL  CLAY1   CLAY2   CLAY3   CLAY4   SILT1'
     +        ,'   SILT2   SILT3   SILT4                        '/
     +        '   SIZE ',8F8.1)
 6461 FORMAT('  K  SRDQEX')
 6462 FORMAT(I3,6X,15F8.5)
 6463 FORMAT('  K  SRDQSC')
 6464 FORMAT('  K  SRDQCB')
 6465 FORMAT('  K  ',2A3)
 6466 FORMAT(' ')
C
 6470 FORMAT(' (4G) Cloud Input for Solar, Thermal Radiation:'
     +      ,'  Mie Cloud Radiative Properties'
     +      ,T81,'List: SRCQEX(L,K),SRCQST(L,K),SRCQCB(L,K), TRAB Q S G'
     +      /'      KWTRAB=',I1/7X,15I8/
     +        ' WIM CLOUD  WAT05   WAT10   WAT15   WAT20   WAT25'
     +                ,'   ICE05   ICE15   ICE25   ICE50   ICE75'
     +                ,'   MIC05   MIC15   MIC25   MIC50   MIC75')
 6471 FORMAT('  K  SRCQEX')
 6472 FORMAT(I3,6X,15F8.5)
 6473 FORMAT('  K SRCQSC')
 6474 FORMAT('  K SRCQCB')
 6475 FORMAT('  K ',2A3)
 6476 FORMAT(' ')
      GO TO 9999
C
C-------------
  500 CONTINUE
C-------------
C
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
c      SIGMA=5.6697D-08
      TGMEAN=POCEAN*TGO**4+PEARTH*TGE**4+PLICE*TGLI**4+POICE*TGOI**4
      TGMEAN=SQRT(TGMEAN)
      TGMEAN=SQRT(TGMEAN)
      SIGT4=SIGMA*TGMEAN**4
      ITG=TGMEAN
      WTG=TGMEAN-ITG
      SUMK=0.0
      DO 501 K=1,33
      BGFLUX(K) = PLANCK(ITG,K) - (PLANCK(ITG,K)-PLANCK(ITG+1,K))*WTG
      BGFRAC(K)=BGFLUX(K)/SIGT4
      SUMK=SUMK+BGFLUX(K)
  501 CONTINUE
      LK=0
      DO 503 K=1,33
      TAUSUM(K)=0. !!sl TAUSL(K)
      DO 502 L=L1,NL
      TRTAUK(L,K)=TRGXLK(L,K)+TRCALK(L,K)+TRAALK(L,K)
      TAUSUM(K)=TAUSUM(K)+TRGXLK(L,K)+TRCALK(L,K)+TRAALK(L,K)
  502 CONTINUE
  503 CONTINUE
      WRITE(KW,6501)
      WRITE(KW,6502) (K,K=1,13)
      DO 504 L=NL,L1,-1
      WRITE(KW,6503) L,PL(L),TLM(L),(TRTAUK(L,K),K=1,13)
  504 CONTINUE
!sl   WRITE(KW,6504) (TAUSL(K),K=1,13)
      WRITE(KW,6505) (TAUSUM(K),K=1,13)
      WRITE(KW,6506) SUMK,(BGFLUX(K),K=1,13)
      WRITE(KW,6507) TGMEAN,SIGT4,(BGFRAC(K),K=1,13)
      NPAGE=0
      IF(NL > 13)  NPAGE=1
      WRITE(KW,6508) NPAGE
      WRITE(KW,6509) (K,K=14,33)
      DO 505 L=NL,L1,-1
      WRITE(KW,6510) L,(TRTAUK(L,K),K=14,33)
  505 CONTINUE
!sl   WRITE(KW,6511) ( TAUSL(K),K=14,33)
      WRITE(KW,6512) (TAUSUM(K),K=14,33)
      WRITE(KW,6513) (BGFLUX(K),K=14,33)
      WRITE(KW,6514) (BGFRAC(K),K=14,33)
      DO 506 I=1,10
      WRITE(KW,6515)
  506 CONTINUE
C
 6501 FORMAT(' (5) TAU TABLE FOR THERMAL RADIATION: CONTAINS'
     +      ,' TOTAL SPECIFIED GAS, CLOUD & AEROSOL ABSORPTION'
     +      ,T99,'TRGXLK(L,K),TRCALK(L,K),TRCAAK(L,K)'/
     +      ,/1X,'K-DIST BREAKDOWN:',T23,'WINDOW'
     +      ,3X,'WATER VAPOR:',T71,'PRINCIPAL ABSORBER REGION'
     +      ,/T23,6('-'),3X,101('-'))
 6502 FORMAT(' LN     PL     TLM      K=',I1,4X,'K=',I2,9I9,3I8)
 6503 FORMAT(1X,I2,F8.3,F7.2,1X,10F9.4,3F8.3)
!sl6504 FORMAT(/4X,'SURFACE LAYER= ',10F9.4,3F8.3)
 6505 FORMAT( 4X,'COLUMN AMOUNT= ',10F9.4,3F8.3)
 6506 FORMAT(/1X,'PF W/M**2= '  ,F6.2,1X,10F9.3,3F8.3)
 6507 FORMAT( 1X,'TG=',F6.2,'= ',F6.2,1X,10F9.4,3F8.3)
 6508 FORMAT(1I1/4X,'CARBON DIOXIDE:',T36,'PRINCIPAL ABSORBER REGION'
     +      ,T83,'OZONE:',T100,'PRINCIPAL ABSORBER REGION'
     +      /4X,76('-'),2X,50('-'))
 6509 FORMAT(1X,'LN  K=',I2,5I7,6I6,3X,'K=',I2,3I7,6I6)
 6510 FORMAT( 1X,  I2,6F7.4,2F6.3,3F6.2,1F6.1,4F7.4,3F6.3,F6.2)
!sl6511 FORMAT(/1X,'SL',6F7.4,2F6.3,3F6.2,1F6.1,4F7.4,3F6.3,F6.2)
 6512 FORMAT( 1X,'CA',5F7.4,1F7.3,3F6.2,2F6.1,1F6.0,4F7.4,2F6.3,2F6.2)
 6513 FORMAT(/1X,'PF',1F7.4,5F7.3,1F6.2,3F6.3,2F6.3,2F7.3,2F7.4,4F6.3)
 6514 FORMAT( 1X,'FR',6F7.4,2F6.3,3F6.3,1F6.3,4F7.4,3F6.3,F6.3)
 6515 FORMAT(' ')
      GO TO 9999
C
C-------------
  600 CONTINUE
C-------------
C
      NPAGE=1
      IF(INDEX < 11) NPAGE=KPAGE
c      SIGMA=5.6697D-08
      TGMEAN=POCEAN*TGO**4+PEARTH*TGE**4+PLICE*TGLI**4+POICE*TGOI**4
      TGMEAN=SQRT(TGMEAN)
      TGMEAN=SQRT(TGMEAN)
      SIGT4=SIGMA*TGMEAN**4
      ITG=TGMEAN
      WTG=TGMEAN-ITG
      SUMK=0.0
      DO 601 K=1,33
      BGFLUX(K) = PLANCK(ITG,K) - (PLANCK(ITG,K)-PLANCK(ITG+1,K))*WTG
      BGFRAC(K)=BGFLUX(K)/SIGT4
      SUMK=SUMK+BGFLUX(K)
  601 CONTINUE
      WRITE(KW,6601)
      WRITE(KW,6602) (K,K=1,13)
      DO 602 L=NL,L1,-1
      WRITE(KW,6603) L,PL(L),TLM(L),(TRGXLK(L,K),K=1,13)
  602 CONTINUE
      LK=0
      DO 604 K=1,33
      TAUSUM(K)=0. !!sl  TAUSL(K)
      DO 603 L=L1,NL
  603 TAUSUM(K)=TAUSUM(K)+TRGXLK(L,K)
  604 CONTINUE
!sl   WRITE(KW,6604) (TAUSL(K),K=1,13)
      WRITE(KW,6605) (TAUSUM(K),K=1,13)
      WRITE(KW,6606) SUMK,(BGFLUX(K),K=1,13)
      WRITE(KW,6607) TGMEAN,SIGT4,(BGFRAC(K),K=1,13)
      NPAGE=0
      IF(NL > 13)  NPAGE=1
      WRITE(KW,6608)
      WRITE(KW,6609) (K,K=14,33)
      DO 605 L=NL,L1,-1
      WRITE(KW,6610) L,(TRGXLK(L,K),K=14,33)
  605 CONTINUE
!sl   WRITE(KW,6611) ( TAUSL(K),K=14,33)
      WRITE(KW,6612) (TAUSUM(K),K=14,33)
      WRITE(KW,6613) (BGFLUX(K),K=14,33)
      WRITE(KW,6614) (BGFRAC(K),K=14,33)
      DO 606 I=1,10
      WRITE(KW,6615)
  606 CONTINUE
C
 6601 FORMAT(' (6) TAU TABLE FOR THERMAL RADIATION: INCLUDES ANY'
     +      ,' SPECIFIED OVERLAP, CLOUD & AEROSOL ABSORPTION'
     +      ,T114,'TRGXLK(L,K),TAUSL(L)'/
     +      ,/1X,'K-DIST BREAKDOWN:',T23,'WINDOW'
     +      ,3X,'WATER VAPOR:',T71,'PRINCIPAL ABSORBER REGION'
     +      ,/T23,6('-'),3X,101('-'))
 6602 FORMAT(' LN     PL     TLM      K=',I1,4X,'K=',I2,9I9,3I8)
 6603 FORMAT(1X,I2,F8.3,F7.2,1X,10F9.4,3F8.3)
 6604 FORMAT(/4X,'SURFACE LAYER= ',10F9.4,3F8.3)
 6605 FORMAT( 4X,'COLUMN AMOUNT= ',10F9.4,3F8.3)
 6606 FORMAT(/1X,'PF W/M**2= '  ,F6.2,1X,10F9.3,3F8.3)
 6607 FORMAT( 1X,'TG=',F6.2,'= ',F6.2,1X,10F9.4,3F8.3)
 6608 FORMAT(/4X,'CARBON DIOXIDE:',T36,'PRINCIPAL ABSORBER REGION'
     +      ,T83,'OZONE:',T100,'PRINCIPAL ABSORBER REGION'
     +      /4X,76('-'),2X,50('-'))
 6609 FORMAT(1X,'LN  K=',I2,5I7,6I6,3X,'K=',I2,3I7,6I6)
 6610 FORMAT( 1X,  I2,6F7.4,2F6.3,3F6.2,1F6.1,4F7.4,3F6.3,F6.2)
!sl6611 FORMAT(/1X,'SL',6F7.4,2F6.3,3F6.2,1F6.1,4F7.4,3F6.3,F6.2)
 6612 FORMAT( 1X,'CA',5F7.4,1F7.3,3F6.2,2F6.1,1F6.0,4F7.4,2F6.3,2F6.2)
 6613 FORMAT(/1X,'PF',1F7.4,5F7.3,1F6.2,3F6.3,2F6.3,2F7.3,2F7.4,4F6.3)
 6614 FORMAT( 1X,'FR',6F7.4,2F6.3,3F6.3,1F6.3,4F7.4,3F6.3,F6.3)
 6615 FORMAT(' ')
      GO TO 9999
C
C-------------
  700 CONTINUE
C-------------
C
c      SIGMA=5.6697D-08
      TGMEAN=POCEAN*TGO**4+PEARTH*TGE**4+PLICE*TGLI**4+POICE*TGOI**4
      TGMEAN=SQRT(TGMEAN)
      TGMEAN=SQRT(TGMEAN)
      SIGT4=SIGMA*TGMEAN**4
      ITG=TGMEAN
      WTG=TGMEAN-ITG
      SUMK=0.0
      DO 701 K=1,33
      BGFLUX(K) = PLANCK(ITG,K) - (PLANCK(ITG,K)-PLANCK(ITG+1,K))*WTG
      BGFRAC(K)=BGFLUX(K)/SIGT4
      SUMK=SUMK+BGFLUX(K)
  701 CONTINUE
      WRITE(KW,6701)
      WRITE(KW,6702) (K,K=1,13)
      DO 702 L=NL,L1,-1
      WRITE(KW,6703) L,PL(L),TLM(L),(TRCALK(L,K),K=1,13)
  702 CONTINUE
      LK=0
      DO 704 K=1,33
      TAUSUM(K)=0.0
      DO 703 L=L1,NL
      LK=LK+1
  703 TAUSUM(K)=TAUSUM(K)+TRCALK(L,K)
  704 CONTINUE
      WRITE(KW,6704) (TAUSUM(K),K=1,13),(TRCTCA(K),K=1,13)
      WRITE(KW,6705)
      WRITE(KW,6706)  SUMK,(BGFLUX(K),K=1,13)
      WRITE(KW,6707) TGMEAN,SIGT4,(BGFRAC(K),K=1,13)
C
      WRITE(KW,6708)
      WRITE(KW,6709) (K,K=14,33)
      DO 705 L=NL,L1,-1
      WRITE(KW,6710) L,(TRCALK(L,K),K=14,33)
  705 CONTINUE
      WRITE(KW,6711) (TAUSUM(K),K=14,33),(TRCTCA(K),K=14,33)
      WRITE(KW,6712) (BGFLUX(K),K=14,33)
      WRITE(KW,6713) (BGFRAC(K),K=14,33)
      DO 706 I=1,8
      WRITE(KW,6714)
  706 CONTINUE
C
c      SIGMA=5.6697D-08
      TGMEAN=POCEAN*TGO**4+PEARTH*TGE**4+PLICE*TGLI**4+POICE*TGOI**4
      TGMEAN=SQRT(TGMEAN)
      TGMEAN=SQRT(TGMEAN)
      SIGT4=SIGMA*TGMEAN**4
      ITG=TGMEAN
      WTG=TGMEAN-ITG
      SUMK=0.0
      DO 711 K=1,33
      BGFLUX(K) = PLANCK(ITG,K) - (PLANCK(ITG,K)-PLANCK(ITG+1,K))*WTG
      BGFRAC(K)=BGFLUX(K)/SIGT4
      SUMK=SUMK+BGFLUX(K)
  711 CONTINUE
      WRITE(KW,6721)
      WRITE(KW,6722) (K,K=1,13)
      DO 712 L=NL,L1,-1
      WRITE(KW,6723) L,PL(L),TLM(L),(TRAALK(L,K),K=1,13)
  712 CONTINUE
      DO 714 K=1,33
      TAUSUM(K)=0.0
      DO 713 L=L1,NL
  713 TAUSUM(K)=TAUSUM(K)+TRAALK(L,K)
  714 CONTINUE
      WRITE(KW,6724) (TAUSUM(K),K=1,13)
      WRITE(KW,6725)
      WRITE(KW,6726)         SUMK,(BGFLUX(K),K=1,13)
      WRITE(KW,6727) TGMEAN,SIGT4,(BGFRAC(K),K=1,13)
      NPAGE=0
      IF(NL > 13)  NPAGE=1
      WRITE(KW,6728) NPAGE
      WRITE(KW,6729) (K,K=14,33)
      DO 715 L=NL,L1,-1
      WRITE(KW,6730) L,(TRAALK(L,K),K=14,33)
  715 CONTINUE
      WRITE(KW,6731) (TAUSUM(K),K=14,33)
      WRITE(KW,6732) (BGFLUX(K),K=14,33)
      WRITE(KW,6733) (BGFRAC(K),K=14,33)
      DO 716 I=1,12
      WRITE(KW,6734)
  716 CONTINUE
C
 6701 FORMAT(' (7A) TRCALK TABLE FOR THERMAL RADIATION: CONTAINS'
     +      ,' 33 KD CLOUD ABSORPTION OPTICAL DEPTHS AT'
     +      ,' THERMAL WAVELENGTHS ',T117,'LIST: TRCALK(L,K)'/
     +      ,/1X,'K-DIST BREAKDOWN:',T23,'WINDOW'
     +      ,3X,'WATER VAPOR:',T71,'PRINCIPAL ABSORBER REGION'
     +      ,/T23,6('-'),3X,101('-'))
 6702 FORMAT(' LN     PL     TLM      K=',I1,6X,I2,9I9,3I8)
 6703 FORMAT(1X,I2,F8.3,F7.2,1X,9F9.5,4F8.5)
 6704 FORMAT(/4X,'COLUMN AMOUNT= ',9F9.4,4F8.5
     +       /4X,'TOPCLD ALBEDO= ',9F9.4,4F8.5)
 6705 FORMAT(/' K-INTERVAL CONTRIBUTIONS:'/' COMPARE WITH GROUND FLUX:')
 6706 FORMAT( 1X,'PF W/M**2= '  ,F6.2,1X,10F9.3,3F8.3)
 6707 FORMAT( 1X,'TG=',F6.2,'= ',F6.2,1X,10F9.4,3F8.3)
 6708 FORMAT(/T25,'CARBON DIOXIDE:   PRINCIPAL ABSORBER REGION'
     +      ,T93,'OZONE:   PRINCIPAL ABSORBER REGION'
     +      /4X,77('-'),1X,51('-'))
 6709 FORMAT(1X,'LN  K=',I2,5I7,6I6,3X,'K=',I2,3I7,6I6)
 6710 FORMAT( 1X,  I2,6F7.4,5F6.4,F6.4,4F7.4,3F6.4,F6.4)
 6711 FORMAT(/1X,'CA',5F7.4,1F7.3,3F6.2,2F6.1,1F6.0,4F7.4,2F6.3,2F6.2
     +       /1X,'TA',5F7.4,1F7.4,3F6.3,2F6.3,1F6.3,4F7.4,2F6.3,2F6.3)
 6712 FORMAT(/1X,'PF',1F7.4,5F7.3,1F6.2,3F6.3,2F6.3,2F7.3,2F7.4,4F6.3)
 6713 FORMAT( 1X,'FR',6F7.4,2F6.3,3F6.3,1F6.3,4F7.4,3F6.3,F6.3)
 6714 FORMAT(' ')
C
 6721 FORMAT(' (7B) AEROSOL TAU TABLE FOR THERMAL RADIATION:'
     +      ,'  AEROSOL ABSORPTION OPTICAL DEPTH AT THERMAL WAVELENGTHS'
     +      ,T116,'LIST:  TRAALK(L,K)'/
     +      ,/1X,'K-DIST BREAKDOWN:',T23,'WINDOW'
     +      ,3X,'WATER VAPOR:',T71,'PRINCIPAL ABSORBER REGION'
     +      ,/T23,6('-'),3X,101('-'))
 6722 FORMAT(' LN     PL     TLM      K=',I1,6X,I2,9I9,3I8)
 6723 FORMAT(1X,I2,F8.3,F7.2,1X,10F9.5,3F8.5)
 6724 FORMAT(/4X,'COLUMN AMOUNT= ',10F9.5,3F8.5)
 6725 FORMAT(' K-INTERVAL CONTRIBUTIONS:'/' COMPARE WITH GROUND FLUX:')
 6726 FORMAT( 1X,'PF W/M**2= '  ,F6.2,1X,10F9.3,3F8.3)
 6727 FORMAT( 1X,'TG=',F6.2,'= ',F6.2,1X,10F9.4,3F8.3)
 6728 FORMAT(1I1/4X,'CARBON DIOXIDE:',T36,'PRINCIPAL ABSORBER REGION'
     +      ,T83,'OZONE:',T100,'PRINCIPAL ABSORBER REGION'
     +      /4X,76('-'),2X,50('-'))
 6729 FORMAT(1X,'LN  K=',I2,5I7,6I6,3X,'K=',I2,3I7,6I6)
 6730 FORMAT( 1X,  I2,6F7.5,2F6.4,3F6.4,F6.4,4F7.4,3F6.4,F6.4)
 6731 FORMAT( 1X,'CA',5F7.5,1F7.5,3F6.4,2F6.4,1F6.4,4F7.4,2F6.4,2F6.4)
 6732 FORMAT(/1X,'PF',1F7.4,5F7.3,1F6.2,3F6.3,2F6.3,2F7.3,2F7.4,4F6.3)
 6733 FORMAT( 1X,'FR',6F7.4,2F6.3,3F6.3,1F6.3,4F7.4,3F6.3,F6.3)
 6734 FORMAT(' ')
      GO TO 9999
C
C-------------
  800 CONTINUE
C-------------
C
      WRITE(KW,6800)
      DO 801 K=1,16
      ISR1(K)=NORDER(K)
      IF(KORDER==1) ISR1(K)=K
  801 CONTINUE
      WRITE(KW,6801) (ISR1(K),K=1,16)
      SUMK=0.0
      DO 802 K=1,16
      FSR1(K)=DKS0(NORDER(K))
      IF(KORDER==1) FSR1(K)=DKS0(K)
      SUMK=SUMK+FSR1(K)
  802 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6802) (FSR1(K),K=1,17)
      DO 803 K=1,16
      ISR1(K)=NMWAVA(K)
      IF(KORDER==1) ISR1(K)=NMWAVA(IORDER(K))
  803 CONTINUE
      WRITE(KW,6803) (ISR1(K),K=1,16)
      DO 804 K=1,16
      ISR1(K)=NMWAVB(K)
      IF(KORDER==1) ISR1(K)=NMWAVB(IORDER(K))
  804 CONTINUE
      WRITE(KW,6804) (ISR1(K),K=1,16)
      IF(KORDER==0) WRITE(KW,6805)
      IF(KORDER==1) WRITE(KW,6806)
      DO 805 K=1,16
      ISR1(K)=K
      IF(KORDER==1)ISR1(K)=IORDER(K)
  805 CONTINUE
      WRITE(KW,6807) (ISR1(K),K=1,16)
      DO 807 L=NL+1,L1,-1
      SUMK=0.0
      DO 806 K=1,16
      FSR1(K)=SKDFLB(L,NORDER(K))
      IF(KORDER==1) FSR1(K)=SKDFLB(L,K)
      SUMK=SUMK+FSR1(K)
  806 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6808) L,(FSR1(K),K=1,17)
  807 CONTINUE
      DO 808 K=1,16
      ISR1(K)=K
      IF(KORDER==1) ISR1(K)=IORDER(K)
  808 CONTINUE
      WRITE(KW,6809) (ISR1(K),K=1,16)
      DO 810 L=NL+1,L1,-1
      SUMK=0.0
      DO 809 K=1,16
      FSR1(K)=SKUFLB(L,NORDER(K))
      IF(KORDER==1) FSR1(K)=SKUFLB(L,K)
      SUMK=SUMK+FSR1(K)
  809 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6810) L,(FSR1(K),K=1,17)
  810 CONTINUE
      DO 811 K=1,16
      ISR1(K)=K
      IF(KORDER==1) ISR1(K)=IORDER(K)
  811 CONTINUE
      WRITE(KW,6811) (ISR1(K),K=1,16)
      SUMT=0.D0
      SUMK=0.D0
      DO 812 K=1,16
      FSR1(K)=SRKALB(NORDER(K))
      FSR2(K)=DKS0(NORDER(K))
      IF(KORDER==1) FSR1(K)=SRKALB(K)
      IF(KORDER==1) FSR2(K)=DKS0(K)
      SUMK=SUMK+FSR1(K)*FSR2(K)
  812 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6812) (FSR1(K),K=1,17)
      SUMT=SUMT+FSR1(17)
      SUMK1=0.D0
      SUMK2=0.D0
      DO 813 K=1,16
      FSR1(K)=SKNFLB(NL+1,NORDER(K))-SKNFLB(L1,NORDER(K))
      FSR2(K)=SKDFLB(NL+1,NORDER(K))
      IF(KORDER==1) FSR1(K)=SKNFLB(NL+1,K)-SKNFLB(L1,K)
      IF(KORDER==1) FSR2(K)=SKDFLB(NL+1,K)
      SUMK1=SUMK1+FSR1(K)
      SUMK2=SUMK2+FSR2(K)
      FSR1(K)=FSR1(K)/(FSR2(K)+1.d-20)
  813 CONTINUE
      FSR1(17)=SUMK1/(SUMK2+1.d-20)
      WRITE(KW,6813) (FSR1(K),K=1,17)
      SUMT=SUMT+FSR1(17)
      SUMK1=0.D0
      SUMK2=0.D0
      DO 814 K=1,16
      FSR1(K)=SKNFLB(L1,NORDER(K))
      FSR2(K)=SKDFLB(NL+1,NORDER(K))
      IF(KORDER==1) FSR1(K)=SKNFLB(L1,K)
      IF(KORDER==1) FSR2(K)=SKDFLB(NL+1,K)
      SUMK1=SUMK1+FSR1(K)
      SUMK2=SUMK2+FSR2(K)
      FSR1(K)=FSR1(K)/(FSR2(K)+1.d-20)
  814 CONTINUE
      FSR1(17)=SUMK1/(SUMK2+1.d-20)
      WRITE(KW,6814) (FSR1(K),K=1,17)
      SUMT=SUMT+FSR1(17)
      DO 815 K=1,16
      ISR1(K)=KSLAMW(NORDER(K))
      IF(KORDER==1) ISR1(K)=KSLAMW(K)
  815 CONTINUE
      WRITE(KW,6815) SUMT,(ISR1(K),K=1,16)
      SUMK=0.D0
      DO 816 K=1,16
      KK=KSLAMW(NORDER(K))
      IF(KORDER==1) KK=KSLAMW(K)
      FSR1(K)=SRBALB(KK)
      FSR2(K)=SRXALB(KK)
  816 CONTINUE
      WRITE(KW,6816) (FSR1(K),K=1,16)
      WRITE(KW,6817) (FSR2(K),K=1,16)
      WRITE(KW,6818)   COSZ,SRIVIS,SROVIS,PLAVIS,SRINIR,SRONIR,PLANIR
      WRITE(KW,6819) SRXVIS,SRXNIR,SRDVIS,SRUVIS,ALBVIS,SRDNIR
     +                            ,SRUNIR,ALBNIR
      WRITE(KW,6820) SRTVIS,SRRVIS,SRAVIS,SRTNIR,SRRNIR,SRANIR
      DO 817 I=1,1
      IF(KORDER==1) WRITE(KW,6821)
  817 CONTINUE
C
      WRITE(KW,6840)
      DO 821 K=1,16
      ISR1(K)=NORDER(K)
      IF(KORDER==1) ISR1(K)=K
  821 CONTINUE
      WRITE(KW,6841) (ISR1(K),K=1,16)
      SUMK=0.0
      DO 822 K=1,16
      FSR1(K)=DKS0(NORDER(K))
      IF(KORDER==1) FSR1(K)=DKS0(K)
      SUMK=SUMK+FSR1(K)
  822 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6842) (FSR1(K),K=1,17)
      IF(KORDER==0) WRITE(KW,6843)
      IF(KORDER==1) WRITE(KW,6844)
      DO 825 K=1,16
      ISR1(K)=K
      IF(KORDER==1)ISR1(K)=IORDER(K)
  825 CONTINUE
      WRITE(KW,6845) (ISR1(K),K=1,16)
      DO 827 L=NL+1,L1,-1
      SUMK=0.0
      DO 826 K=1,16
      FSR1(K)=SKNFLB(L,NORDER(K))
      IF(KORDER==1) FSR1(K)=SKNFLB(L,K)
      SUMK=SUMK+FSR1(K)
  826 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6846) L,(FSR1(K),K=1,17)
  827 CONTINUE
      DO 828 K=1,16
      ISR1(K)=K
      IF(KORDER==1) ISR1(K)=IORDER(K)
  828 CONTINUE
      WRITE(KW,6847) (ISR1(K),K=1,16)
      DO 830 L=NL,L1,-1
      SUMK=0.0
      DO 829 K=1,16
      FSR1(K)=SKFHRL(L,NORDER(K))
      IF(KORDER==1) FSR1(K)=SKFHRL(L,K)
      SUMK=SUMK+FSR1(K)
  829 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6848) L,(FSR1(K),K=1,17)
  830 CONTINUE
      DO 831 K=1,16
      ISR1(K)=K
      IF(KORDER==1)ISR1(K)=IORDER(K)
  831 CONTINUE
      WRITE(KW,6849) (ISR1(K),K=1,16)
      DO 833 N=1,4
      SUMK=0.0
      DO 832 K=1,16
      FSR1(K)=SRKGAX(NORDER(K),N)
      IF(KORDER==1) FSR1(K)=SRKGAX(K,N)
      SUMK=SUMK+FSR1(K)
  832 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6850) 0,(FSR1(K),K=1,17)
  833 CONTINUE
      DO 834 K=1,16
      ISR1(K)=K
      IF(KORDER==1)ISR1(K)=IORDER(K)
  834 CONTINUE
      WRITE(KW,6851)
      DO 836 N=1,4
      SUMK=0.0
      DO 835 K=1,16
      FSR1(K)=SRKGAD(NORDER(K),N)
      IF(KORDER==1) FSR1(K)=SRKGAD(K,N)
      SUMK=SUMK+FSR1(K)
  835 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6852) N,(FSR1(K),K=1,17)
  836 CONTINUE
      WRITE(KW,6853)
      DO 838 N=1,4
      SUMK=0.0
      DO 837 K=1,16
      FSR1(K)=SRKGAX(NORDER(K),N)
      FSR2(K)=SRKGAD(NORDER(K),N)
      IF(KORDER==1) FSR1(K)=SRKGAX(K,N)
      IF(KORDER==1) FSR2(K)=SRKGAD(K,N)
      FSR1(K)=FSR1(K)+FSR2(K)
      SUMK=SUMK+FSR1(K)
  837 CONTINUE
      FSR1(17)=SUMK
      WRITE(KW,6854) N,(FSR1(K),K=1,17)
  838 CONTINUE
      WRITE(KW,6855)SRNFLB(L1),POCEAN,FSRNFG(1),PEARTH,FSRNFG(2)
     +                        ,POICE ,FSRNFG(3),PLICE ,FSRNFG(4)
C
 6800 FORMAT(' (8A)     SPECTRAL/k-DISTRIBUTION COMPONENT BREAKDOWN'
     +      ,' FOR DOWNWARD AND UPWARD SOLAR RADIATIVE FLUXES'
     +      ,T108,'SKDFLB(L,K)  SKUFLB(L,K)  SRKALB(K)'/)
 6801 FORMAT('     K=',I5,2I8,2I7,I8,I9,7I8,I7,I8,'       Total')
 6802 FORMAT('  DKS0=',F6.3,2F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6803 FORMAT(' NMWAVA=',I6,2I8,2I7,I8,I9,7I8,I7,I8)
 6804 FORMAT(' NMWAVB=',I6,2I8,2I7,I8,I9,7I8,I7,I8)
 6805 FORMAT(' ABSORB'/'   GAS= O3,O2  O3,NO2      O2     O2     O2'
     +        ,'     H2O',22X,'H2O     H2O     H2O     H2O     CO2'
     +        ,'     CO2    CO2  CO2,H2O,O2'
     +        /' SKDFLB (Downward Spectral Flux)'
     +        /6X,6('-'),'VIS',6('-'),2X,46('-'),'NIR',59('-'))
 6806 FORMAT(' ABSORB'/'   GAS=   H2O     H2O     H2O    H2O    H2O'
     +        ,'      O2       O2      O2     CO2     CO2     CO2',18X
     +        ,'O3,NO2  O3,O2 CO2,H2O,O2'/'SKDFLB  (Downard Spectral'
     +        ,' Flux)',T110,6('-'),'VIS',5('-'))
 6807 FORMAT('  N  L=',I4,I9,I8,2I7,I8,I9,7I8,I7,I8,'       Total')
 6808 FORMAT(I3,2F9.3,F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6809 FORMAT(/' SKUFLB (Upward Spectral Flux)'/'  N  L='
     +         ,I4,I9,I8,2I7,I8,I9,7I8,I7,I8,'       Total')
 6810 FORMAT(I3,2F9.3,F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6811 FORMAT(/' SRKALB '
     +         ,I4,I9,I8,2I7,I8,I9,7I8,I7,I8,'       Total')
 6812 FORMAT('   TOA='
     +       ,F5.4,F9.4,F8.4,2F7.4,F8.4,F9.4,7F8.4,F7.4,F8.4,F11.4)
 6813 FORMAT(' ABSORB'/'  ATMO='
     +       ,F5.4,F9.4,F8.4,2F7.4,F8.4,F9.4,7F8.4,F7.4,F8.4,F11.4)
 6814 FORMAT(' ABSORB'/'  SURF='
     +       ,F5.4,F9.4,F8.4,2F7.4,F8.4,F9.4,7F8.4,F7.4,F8.4,F11.4)
 6815 FORMAT(' ALSURF',T133,'Sum=',F6.4
     +       /' KSLAM= ',I3,I9,I8,2I7,I8,I9,7I8,I7,I8)
 6816 FORMAT('   SRX='
     +       ,F5.4,F9.4,F8.4,2F7.4,F8.4,F9.4,7F8.4,F7.4,F8.4,F11.4)
 6817 FORMAT('   SRB='
     +       ,F5.4,F9.4,F8.4,2F7.4,F8.4,F9.4,7F8.4,F7.4,F8.4,F11.4)
 6818 FORMAT(/' At Top of Atm:  ',' COSZ  =',F6.4,14X
     +      , 2X,' SRIVIS=',F7.3,'  SROVIS=',F7.3,   '   PLAVIS=',F6.4
     +      , 2X,' SRINIR=',F7.3,'  SRONIR=',F7.3,   '   PLANIR=',F6.4)
 6819 FORMAT( ' At Bot of Atm:  ',' SRXVIS=',F6.4,1X,' SRXNIR=',F6.4
     +      , 1X,' SRDVIS=',F7.3,'  SRUVIS=',F7.3,   '   ALBVIS=',F6.4
     +      , 2X,' SRDNIR=',F7.3,'  SRUNIR=',F7.3,   '   ALBNIR=',F6.4)
 6820 FORMAT( ' In Atmosphere:  ',' (VIS=0.53*S0)',2X,'(NIR=0.47*S0)'
     +      , 1X,' SRTVIS=',F7.5,'  SRRVIS=',F7.5,   '   SRAVIS=',F6.4
     +      , 2X,' SRTNIR=',F7.5,'  SRRNIR=',F7.5,   '   SRANIR=',F6.4)
 6821 FORMAT(' ')

 6840 FORMAT(' (8B)  SPECTRAL/k-DISTRIBUTION COMPONENT BREAKDOWN'
     +      ,' FOR NET DOWNWARD SOLAR FLUX & HEATING RATE'
     +      ,T106,'SKNFLB(L,K)  SKFHRL(L,K)  SRKGAX(L,I)'/)
 6841 FORMAT('     K=',I5,2I8,2I7,I8,I9,7I8,I7,I8,'       Total')
 6842 FORMAT('  DKS0=',F6.3,2F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6843 FORMAT('   GAS= O3,O2  O3,NO2      O2     O2     O2'
     +        ,'     H2O',22X,'H2O     H2O     H2O     H2O     CO2',5X
     +        ,'CO2    CO2  CO3,H2O,O2'/' SKNFLB (Spectral Net Flux)')
 6844 FORMAT('   GAS=   H2O     H2O     H2O    H2O    H2O'
     +        ,'      O2       O2      O2     CO2     CO2     CO2',18X
     +        ,'O3,NO2  O3,O2 CO2,H2O,O2'
     +        /' SKDFLB (Spectral Net Flux)',T110,6('-'),'VIS',5('-'))
 6845 FORMAT('  N  L=',I4,I9,I8,2I7,I8,I9,7I8,I7,I8,'       Total')
 6846 FORMAT(I3,2F9.3,F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6847 FORMAT(/' SKFHRL (Spectral Heating Rate)'/'  N  L='
     +       ,I4,I9,I8,2I7,I8,I9,7I8,I7,I8,'       Total')
 6848 FORMAT(I3,2F9.3,F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6849 FORMAT(/' SRKGAX (Direct Beam Spectral Absorption at Ground)'
     +       /' N   L=',I4,8I8,I9,4I8,I7,I8,'      Total')
 6850 FORMAT(I2,1X,2F9.3,F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6851 FORMAT( ' SRKGAD (Diffuse Spectral Absorption at Ground)')
 6852 FORMAT(I2,1X,2F9.3,F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6853 FORMAT( ' SRKGAD (Total Spectral Absorption at Ground)')
 6854 FORMAT(I2,1X,2F9.3,F8.3,2F7.3,F8.3,F9.3,7F8.3,F7.3,F8.3,F11.3)
 6855 FORMAT(/' Absorption at Ground by Surface-type'
     +       ,T39,'SRNFLB(1) = POCEAN * FSRNFG(1) + PEARTH * FSRNFG(2) '
     +                     ,'+  POICE * FSRNFG(3) +  PLICE * FSRNFG(4) '
     +       /T39,F7.3,'   = ',F6.4,' *',F8.3,'   + ',F6.4,' *',F8.3
     +                ,'   + ',F6.4,' *',F8.3,'   + ',F6.4,' *',F8.3)
      GO TO 9999
C-------------
  900 CONTINUE
C-------------
C
c      SIGMA=5.6697D-08
      TGMEAN=POCEAN*TGO**4+PEARTH*TGE**4+PLICE*TGLI**4+POICE*TGOI**4
      TGMEAN=SQRT(TGMEAN)
      TGMEAN=SQRT(TGMEAN)
      SIGT4=SIGMA*TGMEAN**4
      ITG=TGMEAN
      WTG=TGMEAN-ITG
      DO 901 K=1,33
      BGFLUX(K) = PLANCK(ITG,K) - (PLANCK(ITG,K)-PLANCK(ITG+1,K))*WTG
      BGFRAC(K)=BGFLUX(K)/SIGT4
  901 CONTINUE
      DO 910 NW=1,5
      DO 903 K=1,33
      DO 902 L=L1,NL+1
      IF(NW==1) WFLB(L,K)=DFLB(L,K)
      IF(NW==2) WFLB(L,K)=UFLB(L,K)
      IF(NW==3) WFLB(L,K)=UFLB(L,K)-DFLB(L,K)
      IF(NW > 3.and.L > NL) GO TO 902
      IF(NW==4) WFLB(L,K)=WFLB(L+1,K)-WFLB(L,K)
      IF(NW==5.and.ABS(TRFCRL(L)) < 1.E-10) WFLB(L,K)=1.E-30
      IF(NW==5) WFLB(L,K)=WFLB(L,K)/(ABS(TRFCRL(L))+1.E-10)
  902 CONTINUE
      IF(NW==1) WFSL(K)=DFSL(K)
      IF(NW==2) WFSL(K)=UFSL(K)
      IF(NW==3) WFSL(K)=UFSL(K)-DFSL(K)
      IF(NW==4) WFSL(K)=WFSL(K)-UFLB(L1,K)+DFLB(L1,K)
!sl   IF(NW==5.and.ABS(TRSLCR) < 1.E-10) WFSL(K)=1.E-30
      IF(NW==5) WFSL(K)=0.   !nu =WFSL(K)/(ABS(TRSLCR)+1.E-10)
  903 CONTINUE
      DO 907 L=L1,NL+1
      IF(L > NL .and. NW > 3) GO TO 907
      ASUM1=0.
      BSUM1=0.
      CSUM1=0.
      DSUM1=0.
      ESUM1=0.
      FSUM1=0.
      SUMF=0.
      DO 904 K=2,13
      ASUM1=ASUM1+  WFSL(K)
      BSUM1=BSUM1+BGFEMT(K)
      CSUM1=CSUM1+BGFLUX(K)
      DSUM1=DSUM1+BGFRAC(K)
      ESUM1=ESUM1+TRCTCA(K)
      FSUM1=FSUM1+TRGALB(K)
  904 SUMF=SUMF+WFLB(L,K)
      SUM1(L)=SUMF
      ASUM2=0.
      BSUM2=0.
      CSUM2=0.
      DSUM2=0.
      ESUM2=0.
      FSUM2=0.
      SUMF=0.
      DO 905 K=14,25
      ASUM2=ASUM2+  WFSL(K)
      BSUM2=BSUM2+BGFEMT(K)
      CSUM2=CSUM2+BGFLUX(K)
      DSUM2=DSUM2+BGFRAC(K)
      ESUM2=ESUM2+TRCTCA(K)
      FSUM2=FSUM2+TRGALB(K)
  905 SUMF=SUMF+WFLB(L,K)
      SUM2(L)=SUMF
      ASUM3=0.
      BSUM3=0.
      CSUM3=0.
      DSUM3=0.
      ESUM3=0.
      FSUM3=0.
      SUMF=0.
      DO 906 K=26,33
      ASUM3=ASUM3+  WFSL(K)
      BSUM3=BSUM3+BGFEMT(K)
      CSUM3=CSUM3+BGFLUX(K)
      DSUM3=DSUM3+BGFRAC(K)
      ESUM3=ESUM3+TRCTCA(K)
      FSUM3=FSUM3+TRGALB(K)
  906 SUMF=SUMF+WFLB(L,K)
      SUM3(L)=SUMF
  907 CONTINUE
C
      NPAGE=1
      WRITE(KW,6901) NW,FTYPE(NW)
      WRITE(KW,6902) (K,K=1,13)
      DO 908 L=NL+1,L1,-1
      IF(L > NL .and. NW > 3) GO TO 908
      SUML=SUM1(L)+SUM2(L)+SUM3(L)+WFLB(L,1)
      WRITE(KW,6903) L,PL(L),SUML,SUM1(L),SUM2(L),SUM3(L)
     +               ,(WFLB(L,K),K=1,13)
  908 CONTINUE
      SUMA=ASUM1+ASUM2+ASUM3+  WFSL(1)
      SUMB=BSUM1+BSUM2+BSUM3+BGFEMT(1)
      SUMC=CSUM1+CSUM2+CSUM3+BGFLUX(1)
      SUMD=DSUM1+DSUM2+DSUM3+BGFRAC(1)
      SUME=ESUM1+ESUM2+ESUM3+TRCTCA(1)
      SUMF=FSUM1+FSUM2+FSUM3+TRGALB(1)
      WRITE(KW,6904) SUMA,ASUM1,ASUM2,ASUM3,(  WFSL(K),K=1,13)
      WRITE(KW,6905) SUMB,BSUM1,BSUM2,BSUM3,(BGFEMT(K),K=1,13)
      WRITE(KW,6906) SUMC,CSUM1,CSUM2,CSUM3,(BGFLUX(K),K=1,13)
      WRITE(KW,6907) SUMD,DSUM1,DSUM2,DSUM3,(BGFRAC(K),K=1,13)
      WRITE(KW,6908) SUME,ESUM1,ESUM2,ESUM3,(TRCTCA(K),K=1,13)
      WRITE(KW,6909) SUMF,FSUM1,FSUM2,FSUM3,(TRGALB(K),K=1,13)
      NPAGE=0
      WRITE(KW,6910) NPAGE
      WRITE(KW,6911) (K,K=14,33)
      DO 909 L=NL+1,L1,-1
      IF(L > NL.and.NW > 3) GO TO 909
      WRITE(KW,6912) L,(WFLB(L,K),K=14,33)
  909 CONTINUE
      WRITE(KW,6913) (  WFSL(K),K=14,33)
      WRITE(KW,6914) (BGFEMT(K),K=14,33)
      WRITE(KW,6915) (BGFLUX(K),K=14,33)
      WRITE(KW,6916) (BGFRAC(K),K=14,33)
      WRITE(KW,6917) (TRCTCA(K),K=14,33)
      WRITE(KW,6918) (TRGALB(K),K=14,33)
      LINFIL=2
      IF(NW > 3) LINFIL=4
      DO 911 I=1,LINFIL
      WRITE(KW,6919)
  911 CONTINUE
  910 CONTINUE
C
 6901 FORMAT(' (9.',I1,') THERMAL RADIATION: K-DISTRIBUTION'
     +       ,' BREAKDOWN FOR  ',1A8,' FLUX'/
     +       /T21,'PRINCIPAL REGION SUM',2X,'WINDOW'
     +       ,T52,'WATER VAPOR:',T76,'PRINCIPAL ABSORBER REGION'
     +       /20X,20('-'),2X,6('-'),3X,81('-'))
 6902 FORMAT(1X,'LN     PL    TOTAL    H2O   CO2    O3     K='
     +       ,I2,4X,'K=',I2,12I7)
 6903 FORMAT(1X,I2,2F8.2,3F7.2,F8.3,1X,12F7.3)
 6904 FORMAT(/' SL',  9X,4F7.2,F8.3,1X,12F7.3)
 6905 FORMAT(/' BG',  9X,4F7.2,F8.3,1X,12F7.3)
 6906 FORMAT( ' PF',  9X,4F7.2,F8.3,1X,12F7.3)
 6907 FORMAT( ' FR',  9X,4F7.2,F8.3,1X,12F7.3)
 6908 FORMAT(/' AC',  9X,4F7.2,F8.3,1X,12F7.3)
 6909 FORMAT( ' AG',  9X,4F7.2,F8.3,1X,12F7.3)
 6910 FORMAT(1I1/5X,'CARBON DIOXIDE:',T36,'PRINCIPAL ABSORBER REGION'
     +       ,T85,'OZONE:',T101,'PRINCIPAL ABSORBER REGION'
     +       /5X,76('-'),3X,48('-'))
 6911 FORMAT(1X,'LN  K=',I2,6I7,5I6,4X,'K=',I2,1I7,6I6)
 6912 FORMAT( 1X,I2,7F7.3,5F6.3,1X,2F7.3,6F6.3)
 6913 FORMAT(/' SL',7F7.3,5F6.3,1X,2F7.3,6F6.3)
 6914 FORMAT(/' BG',7F7.3,5F6.3,1X,2F7.3,6F6.3)
 6915 FORMAT( ' PF',7F7.3,5F6.3,1X,2F7.3,6F6.3)
 6916 FORMAT( ' FR',7F7.3,5F6.3,1X,2F7.3,6F6.3)
 6917 FORMAT(/' AC',7F7.3,5F6.3,1X,2F7.3,6F6.3)
 6918 FORMAT( ' AG',7F7.3,5F6.3,1X,2F7.3,6F6.3)
 6919 FORMAT(' ')
      RETURN
C-------------
 1000 CONTINUE
C-------------
C
 9999 CONTINUE
      RETURN
      END SUBROUTINE WRITER


      SUBROUTINE WRITET(KWRU,INDEX,JYRREF,JYRNOW,JMONTH,KLIMIT) 1,42
      IMPLICIT NONE
C
C
C     ------------------------------------------------------------------
C     WRITET  GHG, Solar UV, Ozone, Aerosol Trend Diagnostic Information
C
C         INDEX
C           1     GHG DT0 Trends / FULGAS Ratios for CO2,NO2,CH4,F11,F12
C           2     GHG DF  Change / Ann Increase Rate CO2,NO2,CH4,F11,F12
C           3     Lean Solar Constant, UV Spectral Variation Time Trends
C           4     Ozone Zonal-mean (Latitude and Vertical) Distributions
C           5     Ozone Surface-150mb, 150mb-TOA, Column Longitude Distr
C                 A  O3 (Wang-Jacobs) Relative Longitudinal Distribution
C                 B  O3 (London-NCAR) Relative Longitudinal Distribution
C                 C  O3 (W-J, London) Relative Longitudinal Distribution
C           6     Tropospheric Climatology Aerosol Latitude/Height Distr
C                 A  Zonal-mean Extinction Optical Depth
C                 B  Zonal-mean Single Scattering Albedo
C                 C  Zonal-mean Asymmetry Parameter
C           7     Tropospheric Desert Dust Aerosol Latitude/Height Distr
C                 A  Zonal-mean Extinction Optical Depth
C                 B  Zonal-mean Single Scattering Albedo
C                 C  Zonal-mean Asymmetry Parameter
C           8     Stratospheric (Volcanic) Aerosol Latitude/Height Distr
C                 A  Zonal-mean Extinction Optical Depth
C                 B  Zonal-mean Single Scattering Albedo
C                 C  Zonal-mean Asymmetry Parameter
C           9     Total Column Atmospheric Aerosol Latitude/Height Distr
C                 A  Zonal-mean Extinction Optical Depth
C                 B  Zonal-mean Single Scattering Albedo
C                 C  Zonal-mean Asymmetry Parameter
C        NOTE:
C                 Time Trend (year) Specification is by JYRREF to JYRNOW
C                 Time Specification (O3,Aerosol) is by JYRREF to JMONTH
C                      (If JMONTH = 0, JDAY is used)
C
C                 INDEX < 10 is selective, INDEX > 10 is digit inclusive
C                 KLIMIT = 0 full output,  KLIMIT > 0 abbreviated output
C                 KWRU directs the output to selected (KWRU) file number
C     ------------------------------------------------------------------
C
      INTEGER, INTENT(IN) :: KWRU,INDEX,JYRREF,JYRNOW,JMONTH,KLIMIT

      REAL*8 WREF(7),WDAT(7),WPPM(7),XRAT(5)
      REAL*8, DIMENSION(49,LX) :: QX,QS,QG,QP,O3
      REAL*8, DIMENSION(49) :: QXCOL,QSCOL,QGCOL,QPCOL,O3COL
      REAL*8 SFL0(5),SFLX(5),DFLX(5),RFLX(5),O3L(46,72)
      INTEGER :: LO3(36)
C
      INTEGER, PARAMETER :: NSW1=24, NSW2=32, NSW3=40, NSW4=48
C
      CHARACTER*32, PARAMETER :: CHAER(4) = (/
     *     'Tropospheric Climatology Aerosol',
     +     'Tropospheric Desert Dust Aerosol',
     +     'Stratospheric (Volcanic) Aerosol',
     +     'Total Column Atmospheric Aerosol'/)

      REAL*8 YREF11,ZREF12,SUMO3,QOSH,QONH,QOGL
     *     ,SUMXL,SUMGL,SUMSL,QXSH,QXNH,QXGL,QSSH,QSNH,QSGL,QPSH,QPNH
     *     ,QPGL,QGSH,QGNH,QGGL
      INTEGER KW,INDJ,INDI,INDX,KINDEX,I,JJDAYG,JYEARG,KWSKIP,J,IYEAR
     *     ,NSPACE,LMO,K,mavg,iyr1,lmax,icyc,JYEARS,M,JJDAYO,L,JJ,N,N1
     *     ,N2,II,KAEROS,LL1,KA,JJDAY
C
      KW=KWRU
      INDJ=MOD(INDEX,10)
      IF(INDJ < 1) INDJ=10
      INDI=1
      IF(INDEX==0)  INDJ=1
      IF(INDEX < 11) INDI=INDJ
      DO 9999 INDX=INDI,INDJ
C
      GO TO (100,100,300,400,500,600,600,600,600,1000),INDX
C
C-------------
  100 CONTINUE
C-------------
C
      KINDEX=INDX
      DO 110 I=1,5
      WREF(I)=XREF(I)
      WPPM(I)=PPMV80(I+4)
  110 CONTINUE
      WREF(6)=PPMV80(11)*1000.D0
      WREF(7)=PPMV80(12)*1000.D0
      WPPM(1)=PPMV80(2)
      WPPM(6)=PPMV80(11)
      WPPM(7)=PPMV80(12)
C
      YREF11=PPMV80(11)
      ZREF12=PPMV80(12)
C
      JJDAYG=184
C
      IF(KINDEX==1) THEN
      WRITE(KW,6101) JJDAYG
 6101 FORMAT(/1X,'(1)=INDEX'
     +      ,T12,'JDAY=',I3,'   RCM RAD EQUIL NO-FEEDBACK DT0'
     +      ,T55,'PRESENT TREND UPDGHG INPUT DATA TO GCM'
     +      ,T96,'FULGAS FACTOR RELATIVE TO 1980 AMOUNTS')
       WRITE(KW,6102) KTREND
 6102 FORMAT(1X,'KTREND=',I2,1X,40('-'),3X,38('-'),3X,38('-')
     +      /1X,'YEAR DTSUM  *DTCO2   DTN2O   DTCH4   DTF11   DTF12'
     +         ,         '   PPMCO2  PPMN20  PPMCH4  PPBF11  PPBF12'
     +         ,         '   FULCO2  FULN2O  FULCH4  FULF11  FULF12')
      ENDIF
C
      IF(KINDEX==2) THEN
      WRITE(KW,6201) JJDAYG
 6201 FORMAT(/1X,'(2)=INDEX'
     +      ,T12,'JDAY=',I3,'   RCM EQ NO-FEEDBACK DFLUX W/M2'
     +      ,T55,'PRESENT TREND UPDGHG INPUT DATA TO GCM'
     +      ,T96,'ANNUAL CHANGE RATE OF TRACE GAS AMOUNT')
      WRITE(KW,6202) KTREND
 6202 FORMAT(1X,'KTREND=',I2,1X,40('-'),3X,38('-'),3X,38('-')
     +      /1X,'YEAR DTSUM  *DTCO2   DTN2O   DTCH4   DTF11   DTF12'
     +         ,         '   PPMCO2  PPMN20  PPMCH4  PPBF11  PPBF12'
     +         ,         '   RATCO2  RATN2O  RATCH4  RATF11  RATF12')
       ENDIF
C
      JYEARG=JYRREF-1
      CALL UPDGHG(JYEARG,JJDAYG)
C
      DO 120 I=1,5
      WDAT(I)=XNOW(I)
  120 CONTINUE
C
      DO 230 J=JYRREF,JYRNOW
      KWSKIP=0
      IF(J > JYRREF) KWSKIP=KLIMIT
      IF(J==1980)   KWSKIP=0
      IF(J==JYRNOW) KWSKIP=0
      JYEARG=J
      CALL UPDGHG(JYEARG,JJDAYG)
      DO 220 I=1,5
      XRAT(I)=(XNOW(I)-WDAT(I))/(1.D-10+WDAT(I))
      IF(XRAT(I) > 9.9999) XRAT(I)=9.9999
      WDAT(I)=XNOW(I)
  220 CONTINUE
      IYEAR=JYEARG
      IF(KINDEX==1) THEN
      IF(KWSKIP==0)
     +WRITE(KW,6103) IYEAR,(XNOW(I),I=1,5),FULGAS(2),(FULGAS(I),I=6,9)
 6103 FORMAT(1X,I4,1X,F8.2,4F8.4,1X,5F8.4)
      ENDIF
      IF(KINDEX==2) THEN
      IF(KWSKIP==0)
     +WRITE(KW,6203) IYEAR,(XNOW(I),I=1,5),(XRAT(I),I=1,5)
 6203 FORMAT(1X,I4,1X,F8.2,4F8.4,1X,5F8.4)
      ENDIF
      NSPACE=IYEAR-(IYEAR/10)*10
      IF(KLIMIT > 0) GO TO 230
      IF(NSPACE==0) WRITE(KW,6104)
 6104 FORMAT(' ')
  230 CONTINUE
      GO TO 9999
C
C-------------
  300 CONTINUE
C-------------
C
      if(ksolar < 0) go to 9999
      LMO=(1950-iy1S0)*12+1
      if(ksolar > 1) LMO=nint(1950 - yr1s0 + 1.5)
      DO 310 I=1,5
      SFL0(I)=0.D0
  310 CONTINUE
      DO 320 K=1,190
      IF(K <= NSW1)              SFL0(1)=SFL0(1)+UVLEAN(LMO,K)*DSLEAN(K)
      IF(K > NSW1.and.K <= NSW2)SFL0(2)=SFL0(2)+UVLEAN(LMO,K)*DSLEAN(K)
      IF(K > NSW2.and.K <= NSW3)SFL0(3)=SFL0(3)+UVLEAN(LMO,K)*DSLEAN(K)
      IF(K > NSW3.and.K <= NSW4)SFL0(4)=SFL0(4)+UVLEAN(LMO,K)*DSLEAN(K)
                                 SFL0(5)=SFL0(5)+UVLEAN(LMO,K)*DSLEAN(K)
  320 CONTINUE
C
      if(ksolar==2.or.ksolar==9)
     *   WRITE(KW,6299) int(yr1s0),int(yr2s0),JYRREF,JYRNOW,SFL0(5)
      if(ksolar < 2) WRITE(KW,6300) JYRREF,JYRNOW,SFL0(5)
 6299 FORMAT(/' (3)=INDEX  Annual-mean Solar flux (from J.Lean annual'
     +      ,I6,'-',I4,' data) for JYRREF=',I4,' to JYRNOW=',I4,'  mid'
     +      ,' 1950 Ref S00WM2=',F9.4/12X,'Solar UV Spectral Flux W/m2'
     +      ,T57,'Delta Solar UV Spectral Flux W/m2'
     +      ,T97,'Solar UV Spectral Flux Ratios'
     +      /'  YEAR    0-280 280-320 320-360 360-400   Total '
     +      ,6X,'0-280 280-320 320-360 360-400   Total '
     +      ,4X,'0-280 280-320 320-360 360-400   Total ')
 6300 FORMAT(/' (3)=INDEX  Annual-mean Solar flux (from J.Lean monthly'
     +      ,' 1882-1998 data) for JYRREF=',I4,' to JYRNOW=',I4,'  Jan'
     +      ,' 1950 Ref S00WM2=',F9.4/12X,'Solar UV Spectral Flux W/m2'
     +      ,T57,'Delta Solar UV Spectral Flux W/m2'
     +      ,T97,'Solar UV Spectral Flux Ratios'
     +      /'  YEAR    0-280 280-320 320-360 360-400   Total '
     +      ,6X,'0-280 280-320 320-360 360-400   Total '
     +      ,4X,'0-280 280-320 320-360 360-400   Total ')
C
      if(ksolar < 2) then
        mavg = 12
        iyr1 = iy1s0
        lmax = ms0x
        icyc = mcycs0
      else
        mavg = 1
        iyr1 = yr1s0
        lmax = nint( yr2s0-yr1s0+1 )
        icyc = icycs0
      end if
      DO 370 J=JYRREF,JYRNOW
      KWSKIP=0
      IF(J > JYRREF) KWSKIP=KLIMIT
      IF(J==JYRNOW) KWSKIP=0
      JYEARS=J
      DO 330 I=1,5
      SFLX(I)=0.D0
  330 CONTINUE
      LMO=(JYEARS-iyr1)*mavg
      DO 350 M=1,mavg
      LMO=LMO+1
      IF(LMO > lmax) LMO=LMO-icyc*((LMO-lmax+icyc-1)/icyc)
      IF(LMO < 1) LMO=LMO+icyc*((icyc-LMO)/icyc)
      DO 340 K=1,190
      IF(K <= NSW1)              SFLX(1)=SFLX(1)+UVLEAN(LMO,K)*DSLEAN(K)
      IF(K > NSW1.and.K <= NSW2)SFLX(2)=SFLX(2)+UVLEAN(LMO,K)*DSLEAN(K)
      IF(K > NSW2.and.K <= NSW3)SFLX(3)=SFLX(3)+UVLEAN(LMO,K)*DSLEAN(K)
      IF(K > NSW3.and.K <= NSW4)SFLX(4)=SFLX(4)+UVLEAN(LMO,K)*DSLEAN(K)
                                 SFLX(5)=SFLX(5)+UVLEAN(LMO,K)*DSLEAN(K)
  340 CONTINUE
  350 CONTINUE
      DO 360 I=1,5
      SFLX(I)=SFLX(I)/mavg
      DFLX(I)=SFLX(I)-SFL0(I)
      RFLX(I)=SFLX(I)/SFL0(I)
  360 CONTINUE
      IF(KWSKIP==0)
     +WRITE(KW,6301) JYEARS,(SFLX(I),I=1,5),(DFLX(I),I=1,5)
     +                     ,(RFLX(I),I=1,5)
 6301 FORMAT(2X,I4,1X,4F8.4,F10.4,2X,5F8.4,2X,5F8.5)
      NSPACE=JYEARS-(JYEARS/10)*10
      IF(KLIMIT > 0) GO TO 370
      IF(NSPACE==0) WRITE(KW,6302)
 6302 FORMAT(' ')
  370 CONTINUE
      GO TO 9999
C
C-------------
  400 CONTINUE
C-------------
C
      JJDAYO=JMONTH*30-15
      IF(JMONTH < 1) JJDAYO=JDAY
      CALL UPDO3D(JYRREF,JJDAYO)
      DO 450 J=1,46
      DO 410 L=1,NL
      O3(J,L)=0.D0
  410 CONTINUE
      JLAT=J
      DO 430 I=1,72
      ILON=I
!!!   CALL GETO3D(ILON,JLAT)
      CALL REPART(O3JDAY(1,ILON,JLAT),PLBO3,NLO3+1,U0GAS(1,3),PLB0,NL+1)
      DO 420 L=1,NL
      O3(J,L)=O3(J,L)+U0GAS(L,3)/72.D0
  420 CONTINUE
  430 CONTINUE
      SUMO3=0.D0
      DO 440 L=1,NL
      SUMO3=SUMO3+O3(J,L)
  440 CONTINUE
      O3COL(J)=SUMO3
  450 CONTINUE
      CALL BOXAV1(DLAT46,O3COL,46, 1,23,QOSH)
      CALL BOXAV1(DLAT46,O3COL,46,24,46,QONH)
      CALL BOXAV1(DLAT46,O3COL,46, 1,46,QOGL)
      O3COL(47)=QOSH
      O3COL(48)=QONH
      O3COL(49)=QOGL
      DO 460 L=1,NL
      CALL BOXAV1(DLAT46,O3(1,L),46, 1,23,QOSH)
      CALL BOXAV1(DLAT46,O3(1,L),46,24,46,QONH)
      CALL BOXAV1(DLAT46,O3(1,L),46, 1,46,QOGL)
      O3(47,L)=QOSH
      O3(48,L)=QONH
      O3(49,L)=QOGL
  460 CONTINUE
C
      IF(KLIMIT > 0)
     +WRITE(KW,6400) JYRREF,JJDAYO,JMONTH,MADO3M,(L,L=2,NL)
 6400 FORMAT(/' (4)=INDEX  JYRREF=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' Ozone: Zonal-mean Vertical Distribution (cmSTP)'
     +      ,T126,'MADO3=',I2/'  JLAT DLAT46   COLUMN  L =   1',14I7/
     +    I31,14I7)
      IF(KLIMIT < 1)
     +WRITE(KW,7400) JYRREF,JJDAYO,JMONTH,MADO3M
     +      ,(PLB0(I),I=1,15),(L,L=2,15)
      IF(KLIMIT < 1.and.nl > 15) then
        write(KW,'(F33.2,14F7.2)') (PLB0(I),I=16,NL)
        write(KW,'(I31,14I7)') (L,L=16,NL)
      END IF
 7400 FORMAT(/' (4)=INDEX  JYRREF=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' Ozone: Zonal-mean Vertical Distribution (cmSTP)'
     +      ,T126,'MADO3=',I2//21X,'PLB0 =',F6.1,9F7.1,5F7.2
     +      /'  JLAT DLAT46   COLUMN  L =   1',14I7)
C
      DO 470 JJ=1,46
      J=47-JJ
      IF(KLIMIT > 0) GO TO 470
      WRITE(KW,6401) J,DLAT46(J),O3COL(J),(O3(J,L),L=1,NL)
 6401 FORMAT(I5,F8.2,F9.5,4X,15(1x,F6.5)/26X,15(1x,F6.5))
  470 CONTINUE
      IF(KLIMIT < 1) WRITE(KW,6402)
 6402 FORMAT(' ')
      WRITE(KW,6403) O3COL(48),(O3(48,L),L=1,NL)
 6403 FORMAT(11X,'NH',F9.5,4X,15(1x,F6.5)/26X,15(1x,F6.5))
      IF(KLIMIT < 1) WRITE(KW,6402)
      WRITE(KW,6404) O3COL(47),(O3(47,L),L=1,NL)
 6404 FORMAT(11X,'SH',F9.5,4X,15(1x,F6.5)/26X,15(1x,F6.5))
      IF(KLIMIT < 1) WRITE(KW,6402)
      WRITE(KW,6405) O3COL(49),(O3(49,L),L=1,NL)
 6405 FORMAT( 7X,'GLOBAL',F9.5,4X,15(1x,F6.5)/26X,15(1x,F6.5))
      GO TO 9999
C
C
C-------------
  500 CONTINUE
C-------------
C
      JJDAYO=JMONTH*30-15
      IF(JMONTH < 1) JJDAYO=JDAY
      CALL UPDO3D(JYRREF,JJDAYO)
      DO 590 N=1,3
      N1=1
      N2=8
      IF(N==2) N1=9
      IF(N > 1) N2=NL
      DO 530 J=1,46
      JLAT=J
      DO 520 I=1,72
      ILON=I
!!!   CALL GETO3D(ILON,JLAT)
      CALL REPART(O3JDAY(1,ILON,JLAT),PLBO3,NLO3+1,U0GAS(1,3),PLB0,NL+1)
      SUMO3=0.D0
      DO 510 L=N1,N2
      SUMO3=SUMO3+U0GAS(L,3)
  510 CONTINUE
      O3L(J,I)=SUMO3
  520 CONTINUE
  530 CONTINUE
      DO 560 J=1,46
      SUMO3=0.D0
      DO 540 I=1,72
      SUMO3=SUMO3+O3L(J,I)/72.D0
  540 CONTINUE
      DO 550 I=1,72
      O3L(J,I)=O3L(J,I)/SUMO3
  550 CONTINUE
  560 CONTINUE
C
      IF(N==1)
     +WRITE(KW,6510) JYRREF,JJDAYO,JMONTH,MADO3M,(I,I=10,310,10)
 6510 FORMAT(/'  5A=INDEX  JYEAR=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' Ozone Longitudinal Variation:  Troposphere'
     +      ,' (Wang-Jacobs) Surf to 150 mb',T126,'MADO3=',I2
     +      /'  J LON=0',31I4)
      IF(N==2)
     +WRITE(KW,6520) JYRREF,JJDAYO,JMONTH,MADO3M,(I,I=10,310,10)
 6520 FORMAT(/'  5B=INDEX  JYEAR=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' Ozone Longitudinal Variation:  Stratosphere'
     +      ,' (London-NCAR) 150 mb to TOA',T126,'MADO3=',I2
     +      /'  J LON=0',31I4)
      IF(N==3.and.KLIMIT < 1)
     +WRITE(KW,6530) JYRREF,JJDAYO,JMONTH,MADO3M,(I,I=10,310,10)
 6530 FORMAT(/'  5C=INDEX  JYEAR=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' Ozone Longitudinal Variation:  Total Column'
     +      ,' (W-J/London) Surface to TOA',T126,'MADO3=',I2
     +      /'  J LON=0',31I4)
      IF(KLIMIT < 1) WRITE(KW,6540)
 6540 FORMAT(' ')
C
      IF(N==3.and.KLIMIT > 0) GO TO 590
      DO 580 JJ=1,46
      J=47-JJ
      KWSKIP=KLIMIT
      IF(J==36) KWSKIP=0
      IF(J==24) KWSKIP=0
      IF(J==12) KWSKIP=0
      DO 570 I=1,36
      II=I*2-1
      LO3(I)=O3L(J,II)*100.D0+0.5D0
  570 CONTINUE
      IF(KWSKIP==0)
     +WRITE(KW,6501) J,(LO3(I),I=1,32)
 6501 FORMAT(I4,1X,36I4)
  580 CONTINUE
  590 CONTINUE
C
      GO TO 9999
C
C-------------
  600 CONTINUE
C-------------
C
      KAEROS=4
      IF(INDX==6) KAEROS=1
      IF(INDX==7) KAEROS=2
      IF(INDX==8) KAEROS=3
      LL1=1
      IF(INDX==8 .and. NL > 15) LL1=NL-14
      JJDAY=JMONTH*30-15
      IF(JMONTH < 1) JJDAY=JDAY
      K=6
      IF(KAEROS==1.OR.KAEROS > 3) CALL UPDAER(JYRREF,JJDAY)
      IF(KAEROS==2.OR.KAEROS > 3) CALL UPDDST(JYRREF,JJDAY)
      IF(KAEROS==3.OR.KAEROS > 3) CALL UPDVOL(JYRREF,JJDAY)
C
      DO 650 J=1,46
      DO 610 L=1,NL
      QX(J,L)=0.D0
      QS(J,L)=0.D0
      QG(J,L)=0.D0
  610 CONTINUE
      JLAT=J
      DO 630 I=1,72
      ILON=I
      IF(KAEROS==1.OR.KAEROS > 3) CALL GETAER
      IF(KAEROS==2.OR.KAEROS > 3) CALL GETDST
      IF(KAEROS==3.OR.KAEROS > 3) CALL GETVOL
      DO 620 L=1,NL
      IF(KAEROS==1.OR.KAEROS > 3) QX(J,L)=QX(J,L)+SRAEXT(L,K)/72.D0
      IF(KAEROS==2.OR.KAEROS > 3) QX(J,L)=QX(J,L)+SRDEXT(L,K)/72.D0
      IF(KAEROS==3.OR.KAEROS > 3) QX(J,L)=QX(J,L)+SRVEXT(L,K)/72.D0
      IF(KAEROS==1.OR.KAEROS > 3) QS(J,L)=QS(J,L)+SRASCT(L,K)/72.D0
      IF(KAEROS==2.OR.KAEROS > 3) QS(J,L)=QS(J,L)+SRDSCT(L,K)/72.D0
      IF(KAEROS==3.OR.KAEROS > 3) QS(J,L)=QS(J,L)+SRVSCT(L,K)/72.D0
      IF(KAEROS==1.OR.KAEROS > 3) QG(J,L)=QG(J,L)+SRAGCB(L,K)
     +                                              *SRASCT(L,K)/72.D0
      IF(KAEROS==2.OR.KAEROS > 3) QG(J,L)=QG(J,L)+SRDGCB(L,K)
     +                                              *SRDSCT(L,K)/72.D0
      IF(KAEROS==3.OR.KAEROS > 3) QG(J,L)=QG(J,L)+SRVGCB(L,K)
     +                                              *SRVSCT(L,K)/72.D0
  620 CONTINUE
  630 CONTINUE
      SUMXL=1.D-10
      SUMSL=1.D-20
      SUMGL=1.D-20
      DO 640 L=1,NL
      SUMXL=SUMXL+QX(J,L)
      SUMSL=SUMSL+QS(J,L)
      SUMGL=SUMGL+QG(J,L)
      QG(J,L)=(1.D-20+QG(J,L))/(1.D-10+QS(J,L))
      QP(J,L)=(1.D-20+QS(J,L))/(1.D-10+QX(J,L))
      IF(QP(J,L) > 0.99999D0) QP(J,L)=0.99999D0
  640 CONTINUE
      QXCOL(J)=SUMXL
      QSCOL(J)=SUMSL
      QGCOL(J)=(1.D-15+SUMGL)/(1.D-05+SUMSL)
      QPCOL(J)=(1.D-20+SUMSL)/(1.D-10+SUMXL)
  650 CONTINUE
      CALL BOXAV1(DLAT46,QXCOL,46, 1,23,QXSH)
      CALL BOXAV1(DLAT46,QXCOL,46,24,46,QXNH)
      CALL BOXAV1(DLAT46,QXCOL,46, 1,46,QXGL)
      QXCOL(47)=QXSH
      QXCOL(48)=QXNH
      QXCOL(49)=QXGL
      CALL BOXAV1(DLAT46,QSCOL,46, 1,23,QSSH)
      CALL BOXAV1(DLAT46,QSCOL,46,24,46,QSNH)
      CALL BOXAV1(DLAT46,QSCOL,46, 1,46,QSGL)
      QSCOL(47)=QSSH
      QSCOL(48)=QSNH
      QSCOL(49)=QSGL
      CALL BOXAV2(DLAT46,QXCOL,QPCOL,46, 1,23,QPSH)
      CALL BOXAV2(DLAT46,QXCOL,QPCOL,46,24,46,QPNH)
      CALL BOXAV2(DLAT46,QXCOL,QPCOL,46, 1,46,QPGL)
      QPCOL(47)=QPSH
      QPCOL(48)=QPNH
      QPCOL(49)=QPGL
      CALL BOXAV2(DLAT46,QSCOL,QGCOL,46, 1,23,QGSH)
      CALL BOXAV2(DLAT46,QSCOL,QGCOL,46,24,46,QGNH)
      CALL BOXAV2(DLAT46,QSCOL,QGCOL,46, 1,46,QGGL)
      QGCOL(47)=QGSH
      QGCOL(48)=QGNH
      QGCOL(49)=QGGL
      DO 660 L=1,NL
      CALL BOXAV1(DLAT46,QX(1,L),46, 1,23,QXSH)
      CALL BOXAV1(DLAT46,QX(1,L),46,24,46,QXNH)
      CALL BOXAV1(DLAT46,QX(1,L),46, 1,46,QXGL)
      QX(47,L)=QXSH
      QX(48,L)=QXNH
      QX(49,L)=QXGL
      CALL BOXAV1(DLAT46,QS(1,L),46, 1,23,QSSH)
      CALL BOXAV1(DLAT46,QS(1,L),46,24,46,QSNH)
      CALL BOXAV1(DLAT46,QS(1,L),46, 1,46,QSGL)
      QS(47,L)=QSSH
      QS(48,L)=QSNH
      QS(49,L)=QSGL
      CALL BOXAV2(DLAT46,QX(1,L),QP(1,L),46, 1,23,QPSH)
      CALL BOXAV2(DLAT46,QX(1,L),QP(1,L),46,24,46,QPNH)
      CALL BOXAV2(DLAT46,QX(1,L),QP(1,L),46, 1,46,QPGL)
      QP(47,L)=QPSH
      QP(48,L)=QPNH
      QP(49,L)=QPGL
      CALL BOXAV2(DLAT46,QS(1,L),QG(1,L),46, 1,23,QGSH)
      CALL BOXAV2(DLAT46,QS(1,L),QG(1,L),46,24,46,QGNH)
      CALL BOXAV2(DLAT46,QS(1,L),QG(1,L),46, 1,46,QGGL)
      QG(47,L)=QGSH
      QG(48,L)=QGNH
      QG(49,L)=QGGL
  660 CONTINUE
C
      KA=KAEROS
      IF(KLIMIT > 0)
     +WRITE(KW,6600) INDX,JYRREF,JJDAY,JMONTH,CHAER(KA),(L,L=LL1,LL1+14)
 6600 FORMAT(/I3,'A=INDEX JYEAR=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' ZONAL MEAN AEROSOL OPTICAL DEPTH',T100,A32
     +      /'  JLAT DLAT46   COLUMN  L =',I4,14I7)
      IF(KLIMIT < 1)
     +WRITE(KW,7600) INDX,JYRREF,JJDAY,JMONTH,CHAER(KA)
     +              ,(PLB0(I),I=LL1,LL1+14),(L,L=LL1,LL1+14)
 7600 FORMAT(/I3,'A=INDEX JYEAR=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' ZONAL MEAN AEROSOL OPTICAL DEPTH',T100,A32
     +      //21X,'PLB0 =',F6.1,9F7.1,5F7.2
     +      /'  JLAT DLAT46   COLUMN  L =',I4,14I7)
C
      IF(KLIMIT < 1) THEN
      DO 670 JJ=1,46
      J=47-JJ
      WRITE(KW,6601) J,DLAT46(J),QXCOL(J),(QX(J,L),L=LL1,LL1+14)
 6601 FORMAT(I5,F8.2,F9.5,4X,15F7.5)
  670 CONTINUE
      WRITE(KW,6602) QXCOL(48),(QX(48,L),L=LL1,LL1+14)
 6602 FORMAT(/11X,'NH',F9.5,4X,15F7.5)
      WRITE(KW,6603) QXCOL(47),(QX(47,L),L=LL1,LL1+14)
 6603 FORMAT(/11X,'SH',F9.5,4X,15F7.5)
      WRITE(KW,6604) QXCOL(49),(QX(49,L),L=LL1,LL1+14)
 6604 FORMAT(/7X,'GLOBAL',F9.5,4X,15F7.5)
      ENDIF
      IF(KLIMIT > 0) THEN
      WRITE(KW,6605) QXCOL(48),(QX(48,L),L=LL1,LL1+14)
 6605 FORMAT( 11X,'NH',F9.5,4X,15F7.5)
      WRITE(KW,6606) QXCOL(47),(QX(47,L),L=LL1,LL1+14)
 6606 FORMAT( 11X,'SH',F9.5,4X,15F7.5)
      WRITE(KW,6607) QXCOL(49),(QX(49,L),L=LL1,LL1+14)
 6607 FORMAT( 7X,'GLOBAL',F9.5,4X,15F7.5)
      ENDIF
C
      IF(KLIMIT > 0) GO TO 699
      WRITE(KW,6610) INDX,JYRREF,JJDAY,JMONTH,CHAER(KA)
     +              ,(PLB0(I),I=LL1,LL1+14),(L,L=LL1,LL1+14)
 6610 FORMAT(/I3,'B=INDEX JYEAR=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' ZONAL MEAN AEROSOL SINGLE SCATTERING ALBEDO'
     +      ,T100,A32//21X,'PLB0 =',F6.1,9F7.1,5F7.2
     +      /'  JLAT DLAT46   COLUMN  L =',I4,14I7)
C
      DO 680 JJ=1,46
      J=47-JJ
      WRITE(KW,6611) J,DLAT46(J),QPCOL(J),(QP(J,L),L=LL1,LL1+14)
 6611 FORMAT(I5,F8.2,F9.5,4X,15F7.5)
  680 CONTINUE
      WRITE(KW,6612) QPCOL(48),(QP(48,L),L=LL1,LL1+14)
 6612 FORMAT(/11X,'NH',F9.5,4X,15F7.5)
      WRITE(KW,6613) QPCOL(47),(QP(47,L),L=LL1,LL1+14)
 6613 FORMAT(/11X,'SH',F9.5,4X,15F7.5)
      WRITE(KW,6614) QPCOL(49),(QP(49,L),L=LL1,LL1+14)
 6614 FORMAT(/7X,'GLOBAL',F9.5,4X,15F7.5)
C
      WRITE(KW,6620) INDX,JYRREF,JJDAY,JMONTH,CHAER(KA)
     +              ,(PLB0(I),I=LL1,LL1+14),(L,L=LL1,LL1+14)
 6620 FORMAT(/I3,'C=INDEX JYEAR=',I5,'  JDAY=',I3,'   JMONTH=',I2
     +      ,T50,' ZONAL MEAN AEROSOL ASYMMETRY PARAMETER'
     +      ,T100,A32//21X,'PLB0 =',F6.1,9F7.1,5F7.2
     +      /'  JLAT DLAT46   COLUMN  L =',I4,14I7)
C
      DO 690 JJ=1,46
      J=47-JJ
      WRITE(KW,6621) J,DLAT46(J),QGCOL(J),(QG(J,L),L=LL1,LL1+14)
 6621 FORMAT(I5,F8.2,F9.5,4X,15F7.5)
  690 CONTINUE
      WRITE(KW,6622) QGCOL(48),(QG(48,L),L=LL1,LL1+14)
 6622 FORMAT(/11X,'NH',F9.5,4X,15F7.5)
      WRITE(KW,6623) QGCOL(47),(QG(47,L),L=LL1,LL1+14)
 6623 FORMAT(/11X,'SH',F9.5,4X,15F7.5)
      WRITE(KW,6624) QGCOL(49),(QG(49,L),L=LL1,LL1+14)
 6624 FORMAT(/7X,'GLOBAL',F9.5,4X,15F7.5)
  699 CONTINUE
      GO TO 9999
C
 1000 CONTINUE
C
 9999 CONTINUE
C
      RETURN
      END SUBROUTINE WRITET
      END MODULE RADPAR



      SUBROUTINE GTREND(XNOW,TNOW) 5,1
C
      USE RADPAR, only: nghg,ghgyr1,ghgyr2,ghgam
      IMPLICIT NONE
      REAL*8 xnow(nghg),tnow,year,dy,frac
      INTEGER iy,n
C
C-------------------------------------------------------------
C        Makiko's GHG Trend Compilation  GHG.1850-2050.Dec1999
C
C        Annual-Mean      Greenhouse Gas Mixing Ratios
C-------------------------------------------------------------
C                 CO2     N2O     CH4   CFC-11  CFC-12  others
C        Year     ppm     ppm     ppm     ppb     ppb     ppb
C-------------------------------------------------------------
C     Read from external file - outside table: use value from
C                                      years ghgyr1 or ghgyr2
      YEAR=TNOW
      IF(TNOW <= ghgyr1+.5D0) YEAR=ghgyr1+.5D0
      IF(TNOW >= ghgyr2+.49999D0) YEAR=ghgyr2+.49999D0
      DY=YEAR-(ghgyr1+.5D0)
      IY=DY
      frac=DY-IY
      IY=IY+1
C
C     CO2 N2O CH4 CFC-11 CFC-12 other_GHG  SCENARIO
C--------------------------------------------------
C
      do n=1,nghg
        XNOW(N)=GHGAM(N,IY)+frac*(GHGAM(N,IY+1)-GHGAM(N,IY))
      end do
C
      RETURN
      END SUBROUTINE GTREND