#include <misc.h>
#include <params.h>
subroutine radcsw(pint ,h2ommr ,o3mmr ,aermmr ,rh , 1,5
$ cld ,clwp ,rel ,rei ,fice ,
$ eccf ,coszrs ,asdir ,asdif ,aldir ,
$ aldif ,solin ,qrs ,fsns ,fsnt ,
$ fsds ,fsnsc ,fsntc ,sols ,soll ,
$ solsd ,solld ,fsnirt ,fsnrtc ,fsnirtsq,
$ scon)
C-----------------------------------------------------------------------
C
C Solar radiation code
C
C Basic method is Delta-Eddington as described in:
C
C Briegleb, Bruce P., 1992: Delta-Eddington
C Approximation for Solar Radiation in the NCAR Community Climate Model,
C Journal of Geophysical Research, Vol 97, D7, pp7603-7612).
C
C Two changes to the basic method described above are: (1) the distinction
C between liquid and ice particle clouds, and (2) the addition of an
C aerosol with sulfate radiative properties.
C
C Divides solar spectrum into 18 intervals from 0.2-5.0 micro-meters.
C solar flux fractions specified for each interval. allows for
C seasonally and diurnally varying solar input. Includes molecular,
C cloud, aerosol, and surface scattering, along with h2o,o3,co2,o2,cloud,
C and surface absorption. Computes delta-eddington reflections and
C transmissions assuming homogeneously mixed layers. Adds the layers
C assuming scattering between layers to be isotropic, and distinguishes
C direct solar beam from scattered radiation.
C
C Longitude loops are broken into 1 or 2 sections, so that only daylight
C (i.e. coszrs > 0) computations are done.
C
C Note that an extra layer above the model top layer is added.
C
C cgs units are used.
C
C Special diagnostic calculation of the clear sky surface and total column
C absorbed flux is also done for cloud forcing diagnostics.
C
C
C---------------------------Code history--------------------------------
C
C Modified March 1995 to add aerosols
C Original version: B. Briegleb
C Standardized: J. Rosinski, June 1992
C Reviewed: J. Kiehl, B. Briegleb, August 1992
C Reviewed: J. Kiehl, April 1996
C Reviewed: B. Briegleb, May 1996
C 19th Band Added: W. Collins March 1997
C
C-----------------------------------------------------------------------
c
c $Id: radcsw.F,v 1.1.20.7 2000/01/08 19:22:40 zender Exp $
c
#include <implicit.h>
C------------------------------Parameters-------------------------------
#include <prgrid.h>
C-----------------------------------------------------------------------
integer nspint ! Num of spctrl intervals across solar spectrum
parameter ( nspint = 19 )
C-----------------------Constants for new bands--------------------------
real*8
$ V_RAYTAU_35,
$ V_RAYTAU_64,
$ V_ABO3_35,
$ V_ABO3_64,
$ V_KSA_35,
$ V_KSA_64,
$ V_GSA_35,
$ V_GSA_64
parameter(
$ V_RAYTAU_35 = 0.155208,
$ V_RAYTAU_64 = 0.0392,
$ V_ABO3_35 = 2.4058030e+01,
$ V_ABO3_64 = 2.210e+01,
$ V_KSA_35 = 5.64884,
$ V_KSA_64 = 3.6771,
$ V_GSA_35 = .699326,
$ V_GSA_64 = .663642
$ )
C------------------------------Commons----------------------------------
#include <crdcon.h>
c++csz
#ifdef CRM_SRB
#include <crmsrb.h>
c Local variables for SRB computations
c Spectral layer optical depths including layer 0
real odxl0_CO2(plond,0:plev,bnd_nbr_SW) ! [frc] CO2 absorption
real odxl0_H2O(plond,0:plev,bnd_nbr_SW) ! [frc] H2O absorption
real odxl0_O2(plond,0:plev,bnd_nbr_SW) ! [frc] O2 absorption
real odxl0_O3(plond,0:plev,bnd_nbr_SW) ! [frc] O3 absorption
real odxl0_Ray(plond,0:plev,bnd_nbr_SW) ! [frc] Rayleigh scattering
real odxl0_aer(plond,0:plev,bnd_nbr_SW) ! [frc] Aerosol extinction
real odxl0_ice(plond,0:plev,bnd_nbr_SW) ! [frc] Ice cloud extinction
real odxl0_lqd(plond,0:plev,bnd_nbr_SW) ! [frc] Liquid cloud extinction
real odxl0_ttl(plond,0:plev,bnd_nbr_SW) ! [frc] Optical depth extinction column total
real xpn_arg ! Argument to exponential
#endif /* not CRM_SRB */
c--csz
C
C Input arguments
C
real pint(plond,plevp) ! Interface pressure
real h2ommr(plond,plev) ! Specific humidity (h2o mass mix ratio)
real o3mmr(plond,plev) ! Ozone mass mixing ratio
real aermmr(plond,plev) ! Aerosol mass mixing ratio
real rh(plond,plev) ! Relative humidity (fraction)
C
real cld(plond,plevp) ! Fractional cloud cover
real clwp(plond,plev) ! Layer liquid water path
real rel(plond,plev) ! Liquid effective drop size (microns)
real rei(plond,plev) ! Ice effective drop size (microns)
real fice(plond,plev) ! Fractional ice content within cloud
C
real eccf ! Eccentricity factor (1./earth-sun dist ** 2)
real coszrs(plond) ! Cosine solar zenith angle
real asdir(plond) ! 0.2-0.7 micro-meter srfc alb to direct rad
real aldir(plond) ! 0.7-5.0 micro-meter srfc alb to direct rad
real asdif(plond) ! 0.2-0.7 micro-meter srfc alb to diffuse rad
real aldif(plond) ! 0.7-5.0 micro-meter srfc alb to diffuse rad
real scon ! solar constant
C
C Output arguments
C
real solin(plond) ! Incident solar flux
real qrs(plond,plev) ! Solar heating rate
real fsns(plond) ! Surface absorbed solar flux
real fsnt(plond) ! Total column absorbed solar flux
real fsds(plond) ! Flux Shortwave Downwelling Surface
C
real fsnsc(plond) ! Clear sky surface absorbed solar flux
real fsntc(plond) ! Clear sky total column absorbed solar flx
real sols(plond) ! Direct solar rad incident on surface (< 0.7)
real soll(plond) ! Direct solar rad incident on surface (>= 0.7)
real solsd(plond) ! Diffuse solar rad incident on surface (< 0.7)
real solld(plond) ! Diffuse solar rad incident on surface (>= 0.7)
real fsnirt(plond) ! Near-IR flux absorbed at toa
real fsnrtc(plond) ! Clear sky near-IR flux absorbed at toa
real fsnirtsq(plond) ! Near-IR flux absorbed at toa >= 0.7 microns
C
C------------------------------Externals--------------------------------
C
integer isrchfgt ! Search for first array element > 0
integer isrchfle ! Search for first array element < 0
C
C---------------------------Local variables-----------------------------
C
integer ns ! Spectral loop index
integer i ! Longitude loop index
integer k ! Level loop index
integer n ! Loop index for daylight
integer nloop ! Number of daylight loops
integer is(2) ! Daytime start indices
integer ie(2) ! Daytime end indices
integer indxsl ! Index for cloud particle properties
C
C A. Slingo's data for cloud particle radiative properties (from 'A GCM
C Parameterization for the Shortwave Properties of Water Clouds' JAS
C vol. 46 may 1989 pp 1419-1427)
C
real abarl(4) ! A coefficient for extinction optical depth
real bbarl(4) ! B coefficient for extinction optical depth
real cbarl(4) ! C coefficient for single particle scat albedo
real dbarl(4) ! D coefficient for single particle scat albedo
real ebarl(4) ! E coefficient for asymmetry parameter
real fbarl(4) ! F coefficient for asymmetry parameter
save abarl, bbarl, cbarl, dbarl, ebarl, fbarl
data abarl/ 2.817e-02, 2.682e-02,2.264e-02,1.281e-02/
data bbarl/ 1.305 , 1.346 ,1.454 ,1.641 /
data cbarl/-5.62e-08 ,-6.94e-06 ,4.64e-04 ,0.201 /
data dbarl/ 1.63e-07 , 2.35e-05 ,1.24e-03 ,7.56e-03 /
data ebarl/ 0.829 , 0.794 ,0.754 ,0.826 /
data fbarl/ 2.482e-03, 4.226e-03,6.560e-03,4.353e-03/
real abarli ! A coefficient for current spectral interval
real bbarli ! B coefficient for current spectral interval
real cbarli ! C coefficient for current spectral interval
real dbarli ! D coefficient for current spectral interval
real ebarli ! E coefficient for current spectral interval
real fbarli ! F coefficient for current spectral interval
C
C Caution... A. Slingo recommends no less than 4.0 micro-meters nor
C greater than 20 micro-meters
C
c ice water coefficients (Ebert and Curry,1992, JGR, 97, 3831-3836)
c
real abari(4) ! a coefficient for extinction optical depth
real bbari(4) ! b coefficient for extinction optical depth
real cbari(4) ! c coefficient for single particle scat albedo
real dbari(4) ! d coefficient for single particle scat albedo
real ebari(4) ! e coefficient for asymmetry parameter
real fbari(4) ! f coefficient for asymmetry parameter
save abari, bbari, cbari, dbari, ebari, fbari
data abari/ 3.448e-03, 3.448e-03,3.448e-03,3.448e-03/
data bbari/ 2.431 , 2.431 ,2.431 ,2.431 /
data cbari/ 1.00e-05 , 1.10e-04 ,1.861e-02,.46658 /
data dbari/ 0.0 , 1.405e-05,8.328e-04,2.05e-05 /
data ebari/ 0.7661 , 0.7730 ,0.794 ,0.9595 /
data fbari/ 5.851e-04, 5.665e-04,7.267e-04,1.076e-04/
real abarii ! A coefficient for current spectral interval
real bbarii ! B coefficient for current spectral interval
real cbarii ! C coefficient for current spectral interval
real dbarii ! D coefficient for current spectral interval
real ebarii ! E coefficient for current spectral interval
real fbarii ! F coefficient for current spectral interval
C
real delta ! Pressure (atmospheres) for stratos. h2o limit
real o2mmr ! O2 mass mixing ratio:
save delta, o2mmr
data delta / 1.70e-3 /
data o2mmr / .23143 /
real albdir(plond) ! Current spc intrvl srf alb to direct rad
real albdif(plond) ! Current spc intrvl srf alb to diffuse rad
C
C Next series depends on spectral interval
C
real frcsol(nspint) ! Fraction of solar flux in each spectral interval
real wavmin(nspint) ! Min wavelength (micro-meters) of interval
real wavmax(nspint) ! Max wavelength (micro-meters) of interval
real raytau(nspint) ! Rayleigh scattering optical depth
real abh2o(nspint) ! Absorption coefficiant for h2o (cm2/g)
real abo3 (nspint) ! Absorption coefficiant for o3 (cm2/g)
real abco2(nspint) ! Absorption coefficiant for co2 (cm2/g)
real abo2 (nspint) ! Absorption coefficiant for o2 (cm2/g)
real ph2o(nspint) ! Weight of h2o in spectral interval
real pco2(nspint) ! Weight of co2 in spectral interval
real po2 (nspint) ! Weight of o2 in spectral interval
real nirwgt(nspint) ! Weights for intervals to simulate satellite filter
real wgtint ! Weight for specific spectral interval
save frcsol ,wavmin ,wavmax ,raytau ,abh2o ,abo3 ,
$ abco2 ,abo2 ,ph2o ,pco2 ,po2 ,nirwgt
data frcsol / .001488, .001389, .001290, .001686, .002877,
$ .003869, .026336, .360739, .065392, .526861,
$ .526861, .526861, .526861, .526861, .526861,
$ .526861, .006239, .001834, .001834/
C
C weight for 0.64 - 0.7 microns appropriate to clear skies over oceans
C
data nirwgt / 0.0, 0.0, 0.0, 0.0, 0.0,
$ 0.0, 0.0, 0.0, 0.320518, 1.0, 1.0,
$ 1.0, 1.0, 1.0, 1.0, 1.0,
$ 1.0, 1.0, 1.0 /
data wavmin / .200, .245, .265, .275, .285,
$ .295, .305, .350, .640, .700, .701,
$ .701, .701, .701, .702, .702,
$ 2.630, 4.160, 4.160/
data wavmax / .245, .265, .275, .285, .295,
$ .305, .350, .640, .700, 5.000, 5.000,
$ 5.000, 5.000, 5.000, 5.000, 5.000,
$ 2.860, 4.550, 4.550/
data raytau / 4.020, 2.180, 1.700, 1.450, 1.250,
$ 1.085, 0.730, V_RAYTAU_35, V_RAYTAU_64, 0.020,
$ .0001, .0001, .0001, .0001, .0001, .0001,
$ .0001, .0001, .0001/
C
C Absorption coefficients
C
data abh2o / .000, .000, .000, .000, .000,
$ .000, .000, .000, .000, .002,
$ .035, .377, 1.950, 9.400, 44.600,
$ 190.000, .000, .000, .000/
data abo3 /
$ 5.370e+04, 13.080e+04, 9.292e+04, 4.530e+04, 1.616e+04,
$ 4.441e+03, 1.775e+02, V_ABO3_35, V_ABO3_64, .000,
$ .000, .000 , .000 , .000 , .000,
$ .000, .000 , .000 , .000 /
data abco2 / .000, .000, .000, .000, .000,
$ .000, .000, .000, .000, .000,
$ .000, .000, .000, .000, .000,
$ .000, .094, .196, 1.963/
data abo2 / .000, .000, .000, .000, .000,
$ .000, .000, .000,1.11e-05,6.69e-05,
$ .000, .000, .000, .000, .000,
$ .000, .000, .000, .000/
C
C Spectral interval weights
C
data ph2o / .000, .000, .000, .000, .000,
$ .000, .000, .000, .000, .505,
$ .210, .120, .070, .048, .029,
$ .018, .000, .000, .000/
data pco2 / .000, .000, .000, .000, .000,
$ .000, .000, .000, .000, .000,
$ .000, .000, .000, .000, .000,
$ .000, 1.000, .640, .360/
data po2 / .000, .000, .000, .000, .000,
$ .000, .000, .000, 1.000, 1.000,
$ .000, .000, .000, .000, .000,
$ .000, .000, .000, .000/
C
C Diagnostic and accumulation arrays; note that sfltot, fswup, and
C fswdn are not used in the computation,but are retained for future use.
C
real solflx(plond) ! Solar flux in current interval
real sfltot(plond) ! Spectrally summed total solar flux
real totfld(plond,0:plev) ! Spectrally summed flux divergence
real fswup(plond,0:plevp) ! Spectrally summed up flux
real fswdn(plond,0:plevp) ! Spectrally summed down flux
C
C Cloud radiative property arrays
C
real tauxcl(plond,0:plev) ! water cloud extinction optical depth
real tauxci(plond,0:plev) ! ice cloud extinction optical depth
real wcl(plond,0:plev) ! liquid cloud single scattering albedo
real gcl(plond,0:plev) ! liquid cloud asymmetry parameter
real fcl(plond,0:plev) ! liquid cloud forward scattered fraction
real wci(plond,0:plev) ! ice cloud single scattering albedo
real gci(plond,0:plev) ! ice cloud asymmetry parameter
real fci(plond,0:plev) ! ice cloud forward scattered fraction
C
C Aerosol radiative property arrays
C
real tauxar(plond,0:plev) ! aerosol extinction optical depth
real wa(plond,0:plev) ! aerosol single scattering albedo
real ga(plond,0:plev) ! aerosol assymetry parameter
real fa(plond,0:plev) ! aerosol forward scattered fraction
real tauaer(plond) ! total column aerosol extinction
real waer(plond) ! aerosol single scattering albedo
real gaer(plond) ! aerosol asymmetry parameter
real faer(plond) ! aerosol forward scattering fraction
C
C Sulphate aerosol properties taken from:
C
C Kiehl, J.T., B.P.Briegleb, 1993. The Relative Roles of Sulfate Aerosols
C and Greenhouse Gases in Climate Forcing. Science, Vol. 260, pp. 311-314.
C
real ksa(nspint) ! aerosol spectral mass absorption coeff(m2/g)
real wsa(nspint) ! aerosol spectral single scattering albedo
real gsa(nspint) ! aerosol spectral asymmetry parameter
C
data ksa /11.1163, 10.5472, 10.2468, 10.0392, 9.8292,
$ 9.6199, 9.0407, V_KSA_35, V_KSA_64, 1.9169,
$ 0.3780, 0.3780, 0.3780, 0.3780, 0.5704,
$ 0.5704, 0.5704, 0.5704, 0.5704 /
data wsa / .999999, .999999, .999999, .999999, .999999,
$ .999999, .999999, .999999, .999999, .999991,
$ .989772, .989772, .989772, .989772, .847061,
$ .847061, .847061, .847061, .847061 /
data gsa / .719161, .719012, .718453, .717820, .716997,
$ .715974, .712743, V_GSA_35, V_GSA_64, .618115,
$ .485286, .485286, .485286, .485286, .295557,
$ .295557, .295557, .295557, .295557 /
C
C Other variables and arrays needed for aerosol:
C
real rhfac ! multiplication factor for kaer
real rhpc ! level relative humidity in %
real a0 ! constant in rh mult factor
real a1 ! constant in rh mult factor
real a2 ! constant in rh mult factor
real a3 ! constant in rh mult factor
save a0,a1,a2,a3
data a0 / -9.2906106183 /
data a1 / 0.52570211505 /
data a2 / -0.0089285760691 /
data a3 / 5.0877212432e-05/
C
C Various arrays and other constants:
C
real pflx(plond,0:plevp) ! Interface press, including extra layer
real zenfac(plond) ! Square root of cos solar zenith angle
real sqrco2 ! Square root of the co2 mass mixg ratio
real tmp1 ! Temporary constant array
real tmp2 ! Temporary constant array
real pdel ! Pressure difference across layer
real path ! Mass path of layer
real ptop ! Lower interface pressure of extra layer
real ptho2 ! Used to compute mass path of o2
real ptho3 ! Used to compute mass path of o3
real pthco2 ! Used to compute mass path of co2
real pthh2o ! Used to compute mass path of h2o
real h2ostr ! Inverse square root h2o mass mixing ratio
real wavmid ! Spectral interval middle wavelength
real trayoslp ! Rayleigh optical depth/standard pressure
real tmp1l ! Temporary constant array
real tmp2l ! Temporary constant array
real tmp3l ! Temporary constant array
real tmp1i ! Temporary constant array
real tmp2i ! Temporary constant array
real tmp3i ! Temporary constant array
real rdenom ! Multiple scattering term
real psf ! Frac of solar flux in spect interval
real gocp ! Gravity/cp
C
C Layer absorber amounts; note that 0 refers to the extra layer added
C above the top model layer
C
real uh2o(plond,0:plev) ! Layer absorber amount of h2o
real uo3(plond,0:plev) ! Layer absorber amount of o3
real uco2(plond,0:plev) ! Layer absorber amount of co2
real uo2(plond,0:plev) ! Layer absorber amount of o2
real uaer(plond,0:plev) ! Layer aerosol amount
C
C Total column absorber amounts:
C
real uth2o(plond) ! Total column absorber amount of h2o
real uto3(plond) ! Total column absorber amount of o3
real utco2(plond) ! Total column absorber amount of co2
real uto2(plond) ! Total column absorber amount of o2
real utaer(plond) ! Total column aerosol
C
C These arrays are defined for plev model layers; 0 refers to the extra
C layer on top:
C
real rdir(plond,0:plev) ! Layer reflectivity to direct rad
real rdif(plond,0:plev) ! Layer reflectivity to diffuse rad
real tdir(plond,0:plev) ! Layer transmission to direct rad
real tdif(plond,0:plev) ! Layer transmission to diffuse rad
real explay(plond,0:plev) ! Solar beam exp transmission for layer
real flxdiv(plond,0:plev) ! Flux divergence for layer
C
C These arrays are defined at model interfaces; 0 is the top of the
C extra layer above the model top; plevp is the earth surface:
C
real rupdir(plond,0:plevp) ! Ref to dir rad for layers below
real rupdif(plond,0:plevp) ! Ref to dif rad for layers below
real rdndif(plond,0:plevp) ! Ref to dif rad for layers above
real exptdn(plond,0:plevp) ! Solar beam exp down transm from top
real tottrn(plond,0:plevp) ! Total transmission for layers above
real fluxup(plond,0:plevp) ! Up flux at model interface
real fluxdn(plond,0:plevp) ! Down flux at model interface
C
C-----------------------------------------------------------------------
c++csz
#ifdef CRM_SRB
c Sanity check
if (nspint.ne.bnd_nbr_SW) stop 'nspint.ne.bnd_nbr_SW in radcsw()'
do ns=1,nspint
wvl_min(ns)=wavmin(ns)*1.0e-6 ! [um] --> [m]
wvl_max(ns)=wavmax(ns)*1.0e-6 ! [um] --> [m]
wvl_ctr(ns)=0.5*(wvl_min(ns)+wvl_max(ns)) ! [m]
wvl_dlt(ns)=wvl_max(ns)-wvl_min(ns) ! [m]
wvl(ns)=wvl_ctr(ns) ! [m]
bnd(ns)=wvl(ns) ! [m]
wvn_min(ns)=1.0/(100.0*wvl_max(ns)) ! [cm-1]
wvn_max(ns)=1.0/(100.0*wvl_min(ns)) ! [cm-1]
wvn_dlt(ns)=wvn_max(ns)-wvn_min(ns) ! [cm-1]
wvn_ctr(ns)=0.5*(wvn_max(ns)+wvn_min(ns)) ! [cm-1]
wvn(ns)=1.0/(100.0*wvl(ns)) ! [cm-1]
enddo ! end loop over ns, spectral interval
c Initialize diagnostic unscaled column optical depths to zero
odxl0_CO2=0.0 ! [frc] CO2 absorption
odxl0_H2O=0.0 ! [frc] H2O absorption
odxl0_O2=0.0 ! [frc] O2 absorption
odxl0_O3=0.0 ! [frc] O3 absorption
odxl0_Ray=0.0 ! [frc] Rayleigh scattering
odxl0_aer=0.0 ! [frc] Aerosol extinction
odxl0_ice=0.0 ! [frc] Ice cloud extinction
odxl0_lqd=0.0 ! [frc] Liquid cloud extinction
odxl0_ttl=0.0 ! [frc] Total extinction
odxc_CO2=0.0 ! [frc] CO2 absorption
odxc_H2O=0.0 ! [frc] H2O absorption
odxc_O2=0.0 ! [frc] O2 absorption
odxc_O3=0.0 ! [frc] O3 absorption
odxc_Ray=0.0 ! [frc] Rayleigh scattering
odxc_aer=0.0 ! [frc] Aerosol extinction
odxc_ice=0.0 ! [frc] Ice cloud extinction
odxc_lqd=0.0 ! [frc] Liquid cloud extinction
odxc_ttl=0.0 ! [frc] Total extinction
flx_bnd_dwn=0.0 ! [W m-2] Downwelling band flux
flx_bnd_up=0.0 ! [W m-2] Upwelling band flux
#endif /* not CRM_SRB */
c--csz
C
C Initialize output fields:
C
do i=1, plon
fsds(i) = 0.0
fsnirt(i) = 0.0
fsnrtc(i) = 0.0
fsnirtsq(i) = 0.0
fsnt(i) = 0.0
fsns(i) = 0.0
solin(i) = 0.0
fsnsc(i) = 0.0
fsntc(i) = 0.0
sols(i) = 0.0
soll(i) = 0.0
solsd(i) = 0.0
solld(i) = 0.0
end do
do k=1, plev
do i=1, plon
qrs(i,k) = 0.0
end do
end do
C
C Compute starting, ending daytime loop indices:
C
nloop = 0
is(1) = isrchfgt
(plon,coszrs,1,0.0)
C
C If night everywhere, return:
C
if(is(1).gt.plon) return
ie(1) = isrchfle
(plon-is(1),coszrs(is(1)+1),1,0.0) + is(1) - 1
nloop = 1
C
C Possibly 2 daytime loops needed:
C
if (ie(1).ne.plon) then
is(2) = isrchfgt
(plon-ie(1),coszrs(ie(1)+1),1,0.0) + ie(1)
if(is(2).le.plon) then
nloop = 2
ie(2) = plon
end if
end if
C
C Define solar incident radiation and interface pressures:
C
do n=1,nloop
do i=is(n),ie(n)
solin(i) = scon*eccf*coszrs(i)
pflx(i,0) = 0.
end do
end do
do k=1,plevp
do n=1,nloop
do i=is(n),ie(n)
pflx(i,k) = pint(i,k)
end do
end do
end do
C
C Compute optical paths:
C
tmp1 = 0.5/(gravit*sslp)
sqrco2 = sqrt(co2mmr)
do n=1,nloop
do i=is(n),ie(n)
ptop = pflx(i,1)
ptho2 = o2mmr * ptop / gravit
ptho3 = o3mmr(i,1) * ptop / gravit
pthco2 = sqrco2 * (ptop / gravit)
h2ostr = sqrt( 1. / h2ommr(i,1) )
zenfac(i) = sqrt(coszrs(i))
pthh2o = ptop**2*tmp1 + (ptop*rga)*(h2ostr*zenfac(i)*delta)
uh2o(i,0) = h2ommr(i,1)*pthh2o
uco2(i,0) = zenfac(i)*pthco2
uo2 (i,0) = zenfac(i)*ptho2
uo3 (i,0) = ptho3
uaer(i,0) = 0.0
end do
end do
C
tmp2 = delta/gravit
do k=1,plev
do n=1,nloop
do i=is(n),ie(n)
pdel = pflx(i,k+1) - pflx(i,k)
path = pdel / gravit
ptho2 = o2mmr * path
ptho3 = o3mmr(i,k) * path
pthco2 = sqrco2 * path
h2ostr = sqrt(1.0/h2ommr(i,k))
pthh2o = (pflx(i,k+1)**2 - pflx(i,k)**2)*tmp1 +
$ pdel*h2ostr*zenfac(i)*tmp2
uh2o(i,k) = h2ommr(i,k)*pthh2o
uco2(i,k) = zenfac(i)*pthco2
uo2 (i,k) = zenfac(i)*ptho2
uo3 (i,k) = ptho3
C
C Adjust aerosol amount by relative humidity factor:
C
if( rh(i,k) .gt. .90 ) then
rhfac = 2.8
else if (rh(i,k) .lt. .60 ) then
rhfac = 1.0
else
rhpc = 100. * rh(i,k)
rhfac = (a0 + a1*rhpc + a2*rhpc**2 + a3*rhpc**3)
endif
uaer(i,k) = aermmr(i,k)*rhfac*path
end do
end do
end do
C
C Compute column absorber amounts for the clear sky computation:
C
do n=1,nloop
do i=is(n),ie(n)
uth2o(i) = 0.0
uto3(i) = 0.0
utco2(i) = 0.0
uto2(i) = 0.0
utaer(i) = 0.0
end do
end do
do k=1,plev
do n=1,nloop
do i=is(n),ie(n)
uth2o(i) = uth2o(i) + uh2o(i,k)
uto3(i) = uto3(i) + uo3(i,k)
utco2(i) = utco2(i) + uco2(i,k)
uto2(i) = uto2(i) + uo2(i,k)
utaer(i) = utaer(i) + uaer(i,k)
end do
end do
end do
C
C Initialize spectrally integrated totals:
C
do k=0,plev
do i=1,plon
totfld(i,k) = 0.0
fswup (i,k) = 0.0
fswdn (i,k) = 0.0
end do
end do
do i=1,plon
sfltot(i) = 0.0
fswup (i,plevp) = 0.0
fswdn (i,plevp) = 0.0
end do
C
C Set cloud properties for top (0) layer; so long as tauxcl is zero,
C there is no cloud above top of model; the other cloud properties
C are arbitrary:
C
do n=1,nloop
do i=is(n),ie(n)
tauxcl(i,0) = 0.
wcl(i,0) = 0.999999
gcl(i,0) = 0.85
fcl(i,0) = 0.725
tauxci(i,0) = 0.
wci(i,0) = 0.999999
gci(i,0) = 0.85
fci(i,0) = 0.725
C
C Aerosol
C
tauxar(i,0) = 0.
wa(i,0) = 0.925
ga(i,0) = 0.850
fa(i,0) = 0.7225
end do
end do
C
C Begin spectral loop
C
do 100 ns=1,nspint
wgtint = nirwgt(ns)
C
C Set index for cloud particle properties based on the wavelength,
C according to A. Slingo (1989) equations 1-3:
C Use index 1 (0.25 to 0.69 micrometers) for visible
C Use index 2 (0.69 - 1.19 micrometers) for near-infrared
C Use index 3 (1.19 to 2.38 micrometers) for near-infrared
C Use index 4 (2.38 to 4.00 micrometers) for near-infrared
C
C Note that the minimum wavelength is encoded (with .001, .002, .003)
C in order to specify the index appropriate for the near-infrared
C cloud absorption properties
C
if(wavmax(ns) .le. 0.7) then
indxsl = 1
else if(wavmin(ns) .eq. 0.700) then
indxsl = 2
else if(wavmin(ns) .eq. 0.701) then
indxsl = 3
else if(wavmin(ns) .eq. 0.702 .or. wavmin(ns) .gt. 2.38) then
indxsl = 4
end if
C
C Set cloud extinction optical depth, single scatter albedo,
C asymmetry parameter, and forward scattered fraction:
C
abarli = abarl(indxsl)
bbarli = bbarl(indxsl)
cbarli = cbarl(indxsl)
dbarli = dbarl(indxsl)
ebarli = ebarl(indxsl)
fbarli = fbarl(indxsl)
c
abarii = abari(indxsl)
bbarii = bbari(indxsl)
cbarii = cbari(indxsl)
dbarii = dbari(indxsl)
ebarii = ebari(indxsl)
fbarii = fbari(indxsl)
do k=1,plev
do n=1,nloop
do i=is(n),ie(n)
c
c liquid
c
tmp1l = abarli + bbarli/rel(i,k)
tmp2l = 1. - cbarli - dbarli*rel(i,k)
tmp3l = fbarli*rel(i,k)
c
c ice
c
tmp1i = abarii + bbarii/rei(i,k)
tmp2i = 1. - cbarii - dbarii*rei(i,k)
tmp3i = fbarii*rei(i,k)
C
C Cloud fraction incorporated into cloud extinction optical depth
C
tauxcl(i,k) = clwp(i,k)*tmp1l*(1.-fice(i,k))
$ *cld(i,k)*sqrt(cld(i,k))
tauxci(i,k) = clwp(i,k)*tmp1i*fice(i,k)
$ *cld(i,k)*sqrt(cld(i,k))
C
C Do not let single scatter albedo be 1; delta-eddington solution
C for non-conservative case:
C
wcl(i,k) = min(tmp2l,.999999)
gcl(i,k) = ebarli + tmp3l
fcl(i,k) = gcl(i,k)*gcl(i,k)
C
wci(i,k) = min(tmp2i,.999999)
gci(i,k) = ebarii + tmp3i
fci(i,k) = gci(i,k)*gci(i,k)
C
C Set aerosol properties
C Conversion factor to adjust aerosol extinction (m2/g)
C
tauxar(i,k) = 1.e4 * ksa(ns) * uaer(i,k)
C
wa(i,k) = wsa(ns)
ga(i,k) = gsa(ns)
fa(i,k) = gsa(ns)*gsa(ns)
C
waer(i) = wa(i,k)
gaer(i) = ga(i,k)
faer(i) = fa(i,k)
end do
end do
end do
C
C Set reflectivities for surface based on mid-point wavelength
C
wavmid = 0.5*(wavmin(ns) + wavmax(ns))
C
C Wavelength less than 0.7 micro-meter
C
if (wavmid .lt. 0.7 ) then
do n=1,nloop
do i=is(n),ie(n)
albdir(i) = asdir(i)
albdif(i) = asdif(i)
end do
end do
C
C Wavelength greater than 0.7 micro-meter
C
else
do n=1,nloop
do i=is(n),ie(n)
albdir(i) = aldir(i)
albdif(i) = aldif(i)
end do
end do
end if
trayoslp = raytau(ns)/sslp
C
C Layer input properties now completely specified; compute the
C delta-Eddington solution reflectivities and transmissivities
C for each layer, starting from the top and working downwards:
C
c++csz
#ifdef CRM_SRB
c Only gaseous scattering and absorption occurs in extra layer above model top
c Mie scattering and absorption is confined to regular model levels
c (but extinction optical depths for Mie scatterers equal 0.0 in layer zero).
do k=0,plev ! NB: Level starts at 0
do n=1,nloop ! start loop over n, number of sunny lon groups
do i=is(n),ie(n) ! start loop over i, sunny lons in this group
c odxl and odxl0 have plev and plevp vertical levels respectively
c odxl0(plond,0:plev,nspint) can hold optical depths in level zero
c odxl(plond,1:plev,nspint)
odxl0_CO2(i,k,ns)=abco2(ns)*uco2(i,k) ! [frc] CO2 absorption
odxl0_H2O(i,k,ns)=abh2o(ns)*uh2o(i,k) ! [frc] H2O absorption
odxl0_O2(i,k,ns)=abo2(ns)*uo2(i,k) ! [frc] O2 absorption
odxl0_O3(i,k,ns)=abo3(ns)*uo3(i,k) ! [frc] O3 absorption
odxl0_Ray(i,k,ns)=raytau(ns)*(pflx(i,k+1)-pflx(i,k))/sslp ! [frc] Rayleigh scattering
odxl0_aer(i,k,ns)=tauxar(i,k) ! [frc] Aerosol extinction
odxl0_ice(i,k,ns)=tauxci(i,k) ! [frc] Ice cloud extinction
odxl0_lqd(i,k,ns)=tauxcl(i,k) ! [frc] Liquid cloud extinction
odxl0_ttl(i,k,ns)= ! [frc] Total extinction
$ odxl0_CO2(i,k,ns)+ ! [frc] CO2 absorption
$ odxl0_H2O(i,k,ns)+ ! [frc] H2O absorption
$ odxl0_O2(i,k,ns)+ ! [frc] O2 absorption
$ odxl0_O3(i,k,ns)+ ! [frc] O3 absorption
$ odxl0_Ray(i,k,ns)+ ! [frc] Rayleigh scattering
$ odxl0_aer(i,k,ns)+ ! [frc] Aerosol extinction
$ odxl0_ice(i,k,ns)+ ! [frc] Ice cloud extinction
$ odxl0_lqd(i,k,ns) ! [frc] Liquid cloud extinction
c odxc requires information from layer 0 where odxl is not defined
odxc_CO2(i,ns)=odxc_CO2(i,ns)+odxl0_CO2(i,k,ns) ! [frc] CO2 absorption
odxc_H2O(i,ns)=odxc_H2O(i,ns)+odxl0_H2O(i,k,ns) ! [frc] H2O absorption
odxc_O2(i,ns)=odxc_O2(i,ns)+odxl0_O2(i,k,ns) ! [frc] O2 absorption
odxc_O3(i,ns)=odxc_O3(i,ns)+odxl0_O3(i,k,ns) ! [frc] O3 absorption
odxc_Ray(i,ns)=odxc_Ray(i,ns)+odxl0_Ray(i,k,ns) ! [frc] Rayleigh scattering
odxc_aer(i,ns)=odxc_aer(i,ns)+odxl0_aer(i,k,ns) ! [frc] Aerosol extinction
odxc_ice(i,ns)=odxc_ice(i,ns)+odxl0_ice(i,k,ns) ! [frc] Ice cloud extinction
odxc_lqd(i,ns)=odxc_lqd(i,ns)+odxl0_lqd(i,k,ns) ! [frc] Liquid cloud extinction
enddo ! end loop over i, sunny lons in this group
enddo ! end loop over n, number of sunny lon groups
enddo ! end loop over k, lev
#endif /* not CRM_SRB */
c--csz
call radded
(coszrs ,trayoslp,pflx ,abh2o(ns),abo3(ns),
$ abco2(ns),abo2(ns),uh2o ,uo3 ,uco2 ,
$ uo2 ,tauxcl ,wcl ,gcl ,fcl ,
$ tauxci ,wci ,gci ,fci ,tauxar ,
$ wa ,ga ,fa ,nloop ,is ,
$ ie ,rdir ,rdif ,tdir ,tdif ,
$ explay ,exptdn ,rdndif ,tottrn )
C
C Compute reflectivity to direct and diffuse radiation for layers below
C by adding succesive layers starting from the surface and working
C upwards:
C
do n=1,nloop
do i=is(n),ie(n)
rupdir(i,plevp) = albdir(i)
rupdif(i,plevp) = albdif(i)
end do
end do
do k=plev,0,-1
do n=1,nloop
do i=is(n),ie(n)
rdenom = 1./( 1. - rdif(i,k)*rupdif(i,k+1))
rupdir(i,k) = rdir(i,k) + tdif(i,k)*
$ (rupdir(i,k+1)*explay(i,k) +
$ rupdif(i,k+1)*(tdir(i,k)-explay(i,k)))*rdenom
rupdif(i,k) = rdif(i,k) +
$ rupdif(i,k+1)*tdif(i,k)**2*rdenom
end do
end do
end do
C
C Compute up and down fluxes for each interface, using the added
C atmospheric layer properties at each interface:
C
do k=0,plevp
do n=1,nloop
do i=is(n),ie(n)
rdenom = 1./(1. - rdndif(i,k)*rupdif(i,k))
fluxup(i,k) = (exptdn(i,k)*rupdir(i,k) +
$ (tottrn(i,k)-exptdn(i,k))*rupdif(i,k))*rdenom
fluxdn(i,k)=exptdn(i,k) + (tottrn(i,k) - exptdn(i,k) +
$ exptdn(i,k)*rupdir(i,k)*rdndif(i,k))*rdenom
end do
end do
end do
C
C Compute flux divergence in each layer using the interface up and down
C fluxes:
C
do k=0,plev
do n=1,nloop
do i=is(n),ie(n)
flxdiv(i,k) = (fluxdn(i,k ) - fluxdn(i,k+1)) +
$ (fluxup(i,k+1) - fluxup(i,k ))
end do
end do
end do
C
C Monochromatic computation completed; accumulate in totals; adjust
C fraction within spectral interval to allow for the possibility of
C sub-divisions within a particular interval:
C
psf = 1.0
if(ph2o(ns).ne.0.) psf = psf*ph2o(ns)
if(pco2(ns).ne.0.) psf = psf*pco2(ns)
if(po2 (ns).ne.0.) psf = psf*po2 (ns)
do n=1,nloop
do i=is(n),ie(n)
solflx(i) = solin(i)*frcsol(ns)*psf
fsnt(i) = fsnt(i) + solflx(i)*(fluxdn(i,1) - fluxup(i,1))
fsns(i) = fsns(i) + solflx(i)*
$ (fluxdn(i,plevp) - fluxup(i,plevp))
sfltot(i) = sfltot(i) + solflx(i)
fswup(i,0) = fswup(i,0) + solflx(i)*fluxup(i,0)
fswdn(i,0) = fswdn(i,0) + solflx(i)*fluxdn(i,0)
c++csz
#ifdef CRM_SRB
c Archive up and downwelling spectral fluxes at surface and TOA
c fxm: 19990831 These fluxes should be initialized to 0.0 everywhere or will be undefined in non-sunny locations
flx_bnd_dwn_sfc(i,ns)=solflx(i)*fluxdn(i,plevp)*0.001 ! [W m-2]
flx_bnd_up_sfc(i,ns)=solflx(i)*fluxup(i,plevp)*0.001 ! [W m-2]
c Currently, CCM defines up and down and net flux at TOA with a mixture of
c interface level 0 and 1 fluxes. This treatment ignores ozone heating in
c layer 0 (which does not directly affect the model dynamics). It is felt
c that the resulting quantities are better suited for evaluating energy
c conservation and balance in the model. See below for alternate treatment
c which may be better suited for satellite comparisons.
flx_bnd_dwn_TOA(i,ns)=solflx(i)*fluxdn(i,0)*0.001 ! [W m-2] (sums to SOLIN)
flx_bnd_up_TOA(i,ns)=solflx(i)*(fluxdn(i,0)-fluxdn(i,1)+fluxup(i,1))*0.001 ! [W m-2] (sums to numerator of ALBEDO)
c flx_bnd_net_TOA(i,ns)=solflx(i)*(fluxdn(i,1)-fluxup(i,1))*0.001 ! [W m-2] (sums to FSNT)
c NB: Should CRM always use fluxes at interface 0 for Albedo and FSNT?
c Using interface 0 fluxes for all TOA quantities reduces instantaneous
c clear sky albedo (mls_clr.in) by 0.005, and flx_bnd_up_TOA by ~ 3 W m-2.
c CRM currently adopts the CCM definitions in order to avoid confusion
c Following two lines are better suited for satellite comparisons
c flx_bnd_dwn_TOA(i,ns)=solflx(i)*fluxdn(i,lvl_idx_TOA)*0.001 ! [W m-2]
c flx_bnd_up_TOA(i,ns)=solflx(i)*fluxup(i,lvl_idx_TOA)*0.001 ! [W m-2]
c Note that the CCM LW code has a related problem involving emission of layer 0
c being included in flnt but not flntc.
c Any changes should take into account consistent treatment of SW and LW.
#endif /* not CRM_SRB */
c--csz
C
C Down spectral fluxes need to be in mks; thus the .001 conversion factors
C
if (wavmid .lt. 0.7) then
sols(i) = sols(i) + exptdn(i,plevp)*solflx(i)*0.001
solsd(i) = solsd(i) + (fluxdn(i,plevp) -
$ exptdn(i,plevp)) * solflx(i)*0.001
else
soll(i) = soll(i) + exptdn(i,plevp)*solflx(i)*0.001
solld(i) = solld(i) + (fluxdn(i,plevp) -
$ exptdn(i,plevp)) * solflx(i)*0.001
fsnirtsq(i) = fsnirtsq(i) +
$ solflx(i)*(fluxdn(i,0) - fluxup(i,0))
end if
fsnirt(i) = fsnirt(i) +
$ wgtint * solflx(i)*
$ (fluxdn(i,0) - fluxup(i,0))
C
end do
end do
do k=0,plev
do n=1,nloop
do i=is(n),ie(n)
totfld(i,k) = totfld(i,k) + solflx(i)*flxdiv(i,k)
fswup(i,k+1) = fswup(i,k+1) + solflx(i)*fluxup(i,k+1)
fswdn(i,k+1) = fswdn(i,k+1) + solflx(i)*fluxdn(i,k+1)
c++csz
#ifdef CRM_SRB
c Archive the up and downwelling fluxes in each band
flx_bnd_dwn(i,k+1,ns)=solflx(i)*fluxdn(i,k+1)*0.001 ! [W m-2] Downwelling band flux
flx_bnd_up(i,k+1,ns)=solflx(i)*fluxup(i,k+1)*0.001 ! [W m-2] Upwelling band flux
#endif /* not CRM_SRB */
c--csz
end do
end do
end do
C
C
C Following code is the diagnostic clear sky computation:
C
C Compute delta-Eddington solution reflectivities and transmissivities
C for the entire column; note, for convenience, we use the same
C reflectivity and transmissivity arrays as for the full calculation
C above, where 0 for layer quantities refers to the entire atmospheric
C column, and where 0 for interface quantities refers to top of atmos-
C phere, while 1 refers to the surface:
C
C
C Compute total column aerosol optical depth:
C
do n=1,nloop
do i=is(n),ie(n)
C
C Conversion factor to adjust aerosol extinction (m2/g)
C
tauaer(i) = 1.e4 * ksa(ns) * utaer(i)
end do
end do
call radclr
(coszrs ,trayoslp,pflx ,abh2o(ns),abo3(ns) ,
$ abco2(ns),abo2(ns),uth2o ,uto3 ,utco2 ,
$ uto2 ,tauaer ,waer ,gaer ,faer ,
$ nloop ,is ,ie ,rdir ,rdif ,
$ tdir ,tdif ,explay ,exptdn ,rdndif ,
$ tottrn )
C
C Compute reflectivity to direct and diffuse radiation for entire
C column; 0,1 on layer quantities refers to two effective layers
C overlying surface; 0 on interface quantities refers to top of column;
C 2 on interface quantities refers to the surface:
C
do n=1,nloop
do i=is(n),ie(n)
rupdir(i,2) = albdir(i)
rupdif(i,2) = albdif(i)
end do
end do
C
do k=1,0,-1
do n=1,nloop
do i=is(n),ie(n)
rdenom = 1./( 1. - rdif(i,k)*rupdif(i,k+1))
rupdir(i,k) = rdir(i,k) + tdif(i,k)*
$ (rupdir(i,k+1)*explay(i,k) +
$ rupdif(i,k+1)*(tdir(i,k)-explay(i,k)))*rdenom
rupdif(i,k) = rdif(i,k) +
$ rupdif(i,k+1)*tdif(i,k)**2*rdenom
end do
end do
end do
C
C Compute up and down fluxes for each interface, using the added
C atmospheric layer properties at each interface:
C
do k=0,2
do n=1,nloop
do i=is(n),ie(n)
rdenom = 1./(1. - rdndif(i,k)*rupdif(i,k))
fluxup(i,k) = (exptdn(i,k)*rupdir(i,k) +
$ (tottrn(i,k)-exptdn(i,k))*rupdif(i,k))*rdenom
fluxdn(i,k)=exptdn(i,k) + (tottrn(i,k) - exptdn(i,k) +
$ exptdn(i,k)*rupdir(i,k)*rdndif(i,k))*rdenom
end do
end do
end do
C
do n=1,nloop
do i=is(n),ie(n)
fsntc(i) = fsntc(i) + solflx(i)*(fluxdn(i,0)-fluxup(i,0))
fsnsc(i) = fsnsc(i) + solflx(i)*(fluxdn(i,2)-fluxup(i,2))
fsnrtc(i) = fsnrtc(i) +
$ wgtint * solflx(i) *
$ (fluxdn(i,0) - fluxup(i,0))
end do
end do
C
C End of clear sky calculation
C
100 continue ! End of spectral interval loop
C
C Compute solar heating rate (k/s)
C
gocp = gravit/cpair
do k=1,plev
do n=1,nloop
do i=is(n),ie(n)
qrs(i,k) = -gocp*totfld(i,k)/(pint(i,k) - pint(i,k+1))
end do
end do
end do
c
c Set the downwelling flux at the surface
c
do i=1,plon
fsds(i) = fswdn(i,plevp)
end do
C
c++csz
#ifdef CRM_SRB
c Initialize fluxes
do i=1,plon
c Surface Radiation Budget (SRB)
alb_NIR_sfc(i)=-1.0e36 ! [frc]
alb_SW_sfc(i)=-1.0e36 ! [frc]
alb_vsb_sfc(i)=-1.0e36 ! [frc]
dff_drc_NIR_sfc(i)=-1.0e36 ! [frc]
dff_drc_SW_sfc(i)=-1.0e36 ! [frc]
dff_drc_vsb_sfc(i)=-1.0e36 ! [frc]
flx_NIR_dwn_dff_sfc(i)=0.0 ! [W m-2]
flx_NIR_dwn_drc_sfc(i)=0.0 ! [W m-2]
flx_NIR_dwn_sfc(i)=0.0 ! [W m-2]
flx_NIR_up_sfc(i)=0.0 ! [W m-2]
flx_SW_dwn_dff_sfc(i)=0.0 ! [W m-2]
flx_SW_dwn_drc_sfc(i)=0.0 ! [W m-2]
flx_SW_dwn_sfc(i)=0.0 ! [W m-2]
flx_SW_up_sfc(i)=0.0 ! [W m-2]
flx_vsb_dwn_dff_sfc(i)=0.0 ! [W m-2]
flx_vsb_dwn_drc_sfc(i)=0.0 ! [W m-2]
flx_vsb_dwn_sfc(i)=0.0 ! [W m-2]
flx_vsb_up_sfc(i)=0.0 ! [W m-2]
c TOA Radiation Budget (TRB)
alb_NIR_SW_TOA(i)=-1.0e36 ! [frc]
alb_NIR_TOA(i)=-1.0e36 ! [frc]
alb_NIR_vsb_TOA(i)=-1.0e36 ! [frc]
alb_SW_TOA(i)=-1.0e36 ! [frc]
alb_vsb_TOA(i)=-1.0e36 ! [frc]
flx_NIR_dwn_TOA(i)=0.0 ! [W m-2]
flx_NIR_up_TOA(i)=0.0 ! [W m-2]
flx_SW_dwn_TOA(i)=0.0 ! [W m-2]
flx_SW_up_TOA(i)=0.0 ! [W m-2]
flx_vsb_dwn_TOA(i)=0.0 ! [W m-2]
flx_vsb_up_TOA(i)=0.0 ! [W m-2]
enddo ! end loop over i, lon
c Compute column optical depths in each spectral interval
do ns=1,nspint ! start loop over ns, spectral interval
do n=1,nloop ! start loop over n, number of sunny lon groups
do i=is(n),ie(n) ! start loop over i, sunny lons in this group
odxc_ttl(i,ns)=odxc_ttl(i,ns)+ ! [frc]
$ odxc_CO2(i,ns)+ ! [frc] CO2 absorption
$ odxc_H2O(i,ns)+ ! [frc] H2O absorption
$ odxc_O2(i,ns)+ ! [frc] O2 absorption
$ odxc_O3(i,ns)+ ! [frc] O3 absorption
$ odxc_Ray(i,ns)+ ! [frc] Rayleigh scattering
$ odxc_aer(i,ns)+ ! [frc] Aerosol extinction
$ odxc_ice(i,ns)+ ! [frc] Ice cloud extinction
$ odxc_lqd(i,ns) ! [frc] Liquid cloud extinction
enddo ! end loop over i, sunny lons in this group
enddo ! end loop over n, number of sunny lon groups
enddo ! end loop over ns, spectral interval
c Compute spectral and angular (direct and diffuse) radiation budget
do ns=1,nspint ! start loop over ns, spectral interval
psf=1.0
if (ph2o(ns).ne.0.) psf=psf*ph2o(ns)
if (pco2(ns).ne.0.) psf=psf*pco2(ns)
if (po2 (ns).ne.0.) psf=psf*po2(ns)
do n=1,nloop ! start loop over n, number of sunny lon groups
do i=is(n),ie(n) ! start loop over i, sunny lons in this group
c Surface Radiation Budget (SRB)
xpn_arg=min(odxc_ttl(i,ns)/coszrs(i),25.0)
flx_bnd_dwn_drc_sfc(i,ns)=
$ scon*eccf*coszrs(i)* ! (Solar constant)*(AUs)*(cos(SZA))
$ frcsol(ns)* ! Fraction of solar flux in spectral interval
$ psf* ! Weight of interval for overlapping intervals
$ 0.001* ! Convert scon flux CGS --> MKS
$ exp(-xpn_arg) ! Bougher's law
flx_bnd_dwn_dff_sfc(i,ns)=max(0.0,flx_bnd_dwn_sfc(i,ns)-flx_bnd_dwn_drc_sfc(i,ns))
flx_SW_dwn_drc_sfc(i)=flx_SW_dwn_drc_sfc(i)+flx_bnd_dwn_drc_sfc(i,ns)
c Accumulate flx_SW_dwn_sfc, flx_vsb_dwn_sfc, and flx_NIR_dwn_sfc
c (rather than using fswdn(i,plevp), sols(i), solsd(i), soll(i) and solld(i))
c so that flx_XXX_dwn_sfc is consistent with definition of wvl_vsb_NIR_bnd
flx_SW_dwn_sfc(i)=flx_SW_dwn_sfc(i)+flx_bnd_dwn_sfc(i,ns) ! Alternate: flx_SW_dwn_sfc(i)=fswdn(i,plevp)*0.001
if (wvl_ctr(ns).lt.wvl_vsb_NIR_bnd) then ! Visible
flx_vsb_dwn_drc_sfc(i)=flx_vsb_dwn_drc_sfc(i)+flx_bnd_dwn_drc_sfc(i,ns)
flx_vsb_dwn_sfc(i)=flx_vsb_dwn_sfc(i)+flx_bnd_dwn_sfc(i,ns) ! Alternate: sols(i)+solsd(i)
flx_vsb_up_sfc(i)=flx_vsb_up_sfc(i)+flx_bnd_up_sfc(i,ns)
else ! NIR
flx_NIR_dwn_drc_sfc(i)=flx_NIR_dwn_drc_sfc(i)+flx_bnd_dwn_drc_sfc(i,ns)
flx_NIR_dwn_sfc(i)=flx_NIR_dwn_sfc(i)+flx_bnd_dwn_sfc(i,ns) ! Alternate: soll(i)+solld(i)
flx_NIR_up_sfc(i)=flx_NIR_up_sfc(i)+flx_bnd_up_sfc(i,ns)
end if ! NIR
c TOA Radiation Budget (TRB)
c Accumulate, e.g., flx_bnd_dwn_TOA instead of using fswdn(i,1) or fswdn(i,0)
c so that flx_SW_dwn_TOA is consistent with definition of flx_bnd_dwn_TOA
flx_SW_dwn_TOA(i)=flx_SW_dwn_TOA(i)+flx_bnd_dwn_TOA(i,ns)
flx_SW_up_TOA(i)=flx_SW_up_TOA(i)+flx_bnd_up_TOA(i,ns)
if (wvl_ctr(ns).lt.wvl_vsb_NIR_bnd) then ! Visible
flx_vsb_dwn_TOA(i)=flx_vsb_dwn_TOA(i)+flx_bnd_dwn_TOA(i,ns)
flx_vsb_up_TOA(i)=flx_vsb_up_TOA(i)+flx_bnd_up_TOA(i,ns)
else ! NIR
flx_NIR_dwn_TOA(i)=flx_NIR_dwn_TOA(i)+flx_bnd_dwn_TOA(i,ns)
flx_NIR_up_TOA(i)=flx_NIR_up_TOA(i)+flx_bnd_up_TOA(i,ns)
end if ! NIR
enddo ! end loop over i, sunny lons in this group
enddo ! end loop over n, number of sunny lon groups
enddo ! end loop over ns, spectral interval
c Delta-scaled solutions yield scaled direct and diffuse downwelling fluxes
c F_dwn_dff_scl and F_dwn_drc_scl.
c True (unscaled) downwelling fluxes are denoted F_dwn_dff and F_dwn_drc,
c where F_dwn_drc = mu * slr_cst * exp ( -odxc_ttl/mu ) is known.
c Computing delta-scaled fluxes (solving the scaled equation) and then
c "recovering" the true fluxes from the scaled fluxes yields more accurate
c (relative to multi-stream models) true fluxes than solving the unscaled
c RT equation directly.
c To recover the true from the scaled fluxes we use equivalence:
c F_dwn_dff_scl + F_dwn_drc_scl = F_dwn_dff + F_dwn_drc == F_dwn_ttl
c --> F_dwn_dff = F_dwn_dff_scl + F_dwn_drc_scl - F_dwn_drc
c The three quantities on the RHS are known, so we solve for F_dwn_dff:
do n=1,nloop ! start loop over n, number of sunny lon groups
do i=is(n),ie(n) ! start loop over i, sunny lons in this group
c Surface Radiation Budget (SRB)
flx_SW_dwn_sfc(i)=fswdn(i,plevp)*0.001 ! CGS --> MKS
flx_SW_up_sfc(i)=fswup(i,plevp)*0.001 ! CGS --> MKS
flx_vsb_dwn_sfc(i)=sols(i)+solsd(i)
flx_NIR_dwn_sfc(i)=soll(i)+solld(i)
flx_SW_dwn_dff_sfc(i)=max(0.0,flx_SW_dwn_sfc(i)-flx_SW_dwn_drc_sfc(i))
flx_vsb_dwn_dff_sfc(i)=max(0.0,flx_vsb_dwn_sfc(i)-flx_vsb_dwn_drc_sfc(i))
flx_NIR_dwn_dff_sfc(i)=max(0.0,flx_NIR_dwn_sfc(i)-flx_NIR_dwn_drc_sfc(i))
c Surface scattering ratios
if (flx_SW_dwn_drc_sfc(i).gt.0.0) dff_drc_SW_sfc(i)=flx_SW_dwn_dff_sfc(i)/flx_SW_dwn_drc_sfc(i)
if (flx_vsb_dwn_drc_sfc(i).gt.0.0) dff_drc_vsb_sfc(i)=flx_vsb_dwn_dff_sfc(i)/flx_vsb_dwn_drc_sfc(i)
if (flx_NIR_dwn_drc_sfc(i).gt.0.0) dff_drc_NIR_sfc(i)=flx_NIR_dwn_dff_sfc(i)/flx_NIR_dwn_drc_sfc(i)
c Surface albedos
if (flx_SW_dwn_sfc(i).gt.0.0) alb_SW_sfc(i)=flx_SW_up_sfc(i)/flx_SW_dwn_sfc(i)
if (flx_vsb_dwn_sfc(i).gt.0.0) alb_vsb_sfc(i)=flx_vsb_up_sfc(i)/flx_vsb_dwn_sfc(i)
if (flx_NIR_dwn_sfc(i).gt.0.0) alb_NIR_sfc(i)=flx_NIR_up_sfc(i)/flx_NIR_dwn_sfc(i)
c TOA Radiation Budget (TRB)
if (flx_SW_dwn_TOA(i).gt.0.0) alb_SW_TOA(i)=flx_SW_up_TOA(i)/flx_SW_dwn_TOA(i)
if (flx_vsb_dwn_TOA(i).gt.0.0) alb_vsb_TOA(i)=flx_vsb_up_TOA(i)/flx_vsb_dwn_TOA(i)
if (flx_NIR_dwn_TOA(i).gt.0.0) alb_NIR_TOA(i)=flx_NIR_up_TOA(i)/flx_NIR_dwn_TOA(i)
if (alb_SW_TOA(i).gt.0.0) alb_NIR_SW_TOA(i)=alb_NIR_TOA(i)/alb_SW_TOA(i)
if (alb_vsb_TOA(i).gt.0.0) alb_NIR_vsb_TOA(i)=alb_NIR_TOA(i)/alb_vsb_TOA(i)
enddo ! end loop over i, sunny lons in this group
enddo ! end loop over n, number of sunny lon groups
c Obtain odxl arrays by removing level 0 from odxl0 arrays
odxl_CO2=odxl0_CO2(:,1:plev,:) ! [frc] CO2 absorption
odxl_H2O=odxl0_H2O(:,1:plev,:) ! [frc] H2O absorption
odxl_O2=odxl0_O2(:,1:plev,:) ! [frc] O2 absorption
odxl_O3=odxl0_O3(:,1:plev,:) ! [frc] O3 absorption
odxl_Ray=odxl0_Ray(:,1:plev,:) ! [frc] Rayleigh scattering
odxl_aer=odxl0_aer(:,1:plev,:) ! [frc] Aerosol extinction
odxl_ice=odxl0_ice(:,1:plev,:) ! [frc] Ice cloud extinction
odxl_lqd=odxl0_lqd(:,1:plev,:) ! [frc] Liquid cloud extinction
odxl_ttl=odxl0_ttl(:,1:plev,:) ! [frc] Total extinction
c Initialize fluxes
flx_bnd_dwn_drc=0.0 ! [W m-2] Downwelling band flux direct beam
flx_bnd_dwn_dff=0.0 ! [W m-2] Downwelling band flux diffuse field
flx_SW_dwn_drc=0.0 ! [W m-2] Downwelling SW flux direct beam
flx_SW_dwn_dff=0.0 ! [W m-2] Downwelling SW flux diffuse field
dff_drc_SW=-1.0e36 ! [frc] Diffuse to direct SW ratio
do ns=1,nspint ! start loop over ns, spectral interval
psf=1.0
if (ph2o(ns).ne.0.) psf=psf*ph2o(ns)
if (pco2(ns).ne.0.) psf=psf*pco2(ns)
if (po2 (ns).ne.0.) psf=psf*po2(ns)
c Atmospheric Radiation Budget
do n=1,nloop ! start loop over n, number of sunny lon groups
do i=is(n),ie(n) ! start loop over i, sunny lons in this group
do k=1,plevp ! start loop over k, lev NB: plevp not plev
c Vertical profile of direct beam flux
xpn_arg=sum(odxl0_ttl(i,0:k-1,ns)) ! Total optical depth above interface k
xpn_arg=min(xpn_arg/coszrs(i),25.0) ! Argument to exponential
flx_bnd_dwn_drc(i,k,ns)= ! [W m-2] Downwelling band flux direct beam
$ scon*eccf*coszrs(i)* ! (Solar constant)*(AUs)*(cos(SZA))
$ frcsol(ns)* ! Fraction of solar flux in spectral interval
$ psf* ! Weight of interval for overlapping intervals
$ 0.001* ! Convert scon flux CGS --> MKS
$ exp(-xpn_arg) ! Bougher's law
flx_bnd_dwn_dff(i,k,ns)=max(0.0,flx_bnd_dwn(i,k,ns)-flx_bnd_dwn_drc(i,k,ns)) ! [W m-2] Downwelling band flux diffuse field
flx_SW_dwn_drc(i,k)=flx_SW_dwn_drc(i,k)+flx_bnd_dwn_drc(i,k,ns) ! [W m-2] Downwelling SW flux direct beam
enddo ! end loop over k, lev
enddo ! end loop over i, sunny lons in this group
enddo ! end loop over n, number of sunny lon groups
enddo ! end loop over ns, spectral interval
do n=1,nloop ! start loop over n, number of sunny lon groups
do i=is(n),ie(n) ! start loop over i, sunny lons in this group
do k=1,plevp ! start loop over k, lev NB: plevp not plev
c Vertical profile of broadband fluxes
flx_SW_dwn(i,k)=fswdn(i,k)*0.001 ! [W m-2] Downwelling SW flux
flx_SW_up(i,k)=fswup(i,k)*0.001 ! [W m-2] Upwelling SW flux
flx_SW_dwn_dff(i,k)=max(0.0,flx_SW_dwn(i,k)-flx_SW_dwn_drc(i,k)) ! [W m-2] Downwelling SW flux diffuse field
if (flx_SW_dwn_drc(i,k).gt.0.0) dff_drc_SW(i,k)=flx_SW_dwn_dff(i,k)/flx_SW_dwn_drc(i,k)
enddo ! end loop over k, lev
enddo ! end loop over i, sunny lons in this group
enddo ! end loop over n, number of sunny lon groups
#endif /* not CRM_SRB */
c--csz
return
end