#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