#include <misc.h> #include <params.h> subroutine radded(coszrs ,trayoslp,pflx ,abh2o ,abo3 , 1,2 $ abco2 ,abo2 ,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 C Computes layer reflectivities and transmissivities, from the top down C to the surface using the delta-Eddington solutions for each layer; C adds layers from top down to surface as well. C C If total transmission to the interface above a particular layer is C less than trmin, then no further delta-Eddington solutions are C evaluated for layers below C C For more details , see 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---------------------------Code history-------------------------------- C 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 C----------------------------------------------------------------------- c c $Id: radded.F,v 1.1 1998/04/01 07:22:23 ccm Exp $ c #include <implicit.h> C------------------------------Parameters------------------------------- #include <prgrid.h> C----------------------------------------------------------------------- C C Minimum total transmission below which no layer computation are done: C real trmin ! Minimum total transmission allowed real wray ! Rayleigh single scatter albedo real gray ! Rayleigh asymetry parameter real fray ! Rayleigh forward scattered fraction parameter (trmin = 1.e-3) parameter (wray = 0.999999) parameter (gray = 0.0) parameter (fray = 0.1) C------------------------------Arguments-------------------------------- C C Input arguments C real coszrs(plond) ! Cosine zenith angle real trayoslp ! Tray/sslp real pflx(plond,0:plevp) ! Interface pressure real abh2o ! Absorption coefficiant for h2o real abo3 ! Absorption coefficiant for o3 real abco2 ! Absorption coefficiant for co2 real abo2 ! Absorption coefficiant for o2 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 tauxcl(plond,0:plev) ! Cloud extinction optical depth (liquid) real wcl(plond,0:plev) ! Cloud single scattering albedo (liquid) real gcl(plond,0:plev) ! Cloud asymmetry parameter (liquid) real fcl(plond,0:plev) ! Cloud forward scattered fraction (liquid) real tauxci(plond,0:plev) ! Cloud extinction optical depth (ice) real wci(plond,0:plev) ! Cloud single scattering albedo (ice) real gci(plond,0:plev) ! Cloud asymmetry parameter (ice) real fci(plond,0:plev) ! Cloud forward scattered fraction (ice) real tauxar(plond,0:plev) ! Aerosol extinction optical depth real wa(plond,0:plev) ! Aerosol single scattering albedo real ga(plond,0:plev) ! Aerosol asymmetry parameter real fa(plond,0:plev) ! Aerosol forward scattered fraction integer nloop ! Number of loops (1 or 2) integer is(2) ! Starting index for 1 or 2 loops integer ie(2) ! Ending index for 1 or 2 loops C C Input/Output arguments C C Following variables are defined for each layer; 0 refers to extra C layer above top of model: C real rdir(plond,0:plev) ! Layer reflectivity to direct rad real rdif(plond,0:plev) ! Layer refflectivity 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 transm for layer C C (Note that the following variables are defined on interfaces, with the C index k referring to the top interface of the kth layer: C exptdn,rdndif,tottrn; for example, tottrn(k=5) refers to the total C transmission to the top interface of the 5th layer; plevp refers to C the earth surface) C real rdndif(plond,0:plevp) ! Added dif ref 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 C C---------------------------Local variables----------------------------- C integer i,ii ! Longitude indices integer k ! Level index integer nn ! Index of longitude loops (max=nloop) integer nval ! Number of long values satisfying criteria integer index(plond) ! Array of longitude indices real taugab(plond) ! Layer total gas absorption optical depth real tauray(plond) ! Layer rayleigh optical depth real taucsc ! Layer cloud scattering optical depth real tautot ! Total layer optical depth real wtot ! Total layer single scatter albedo real gtot ! Total layer asymmetry parameter real ftot ! Total layer forward scatter fraction real wtau ! rayleigh layer scattering optical depth real wt ! layer total single scattering albedo real ts ! layer scaled extinction optical depth real ws ! layer scaled single scattering albedo real gs ! layer scaled asymmetry parameter real rdenom ! mulitiple scattering term real rdirexp ! layer direct ref times exp transmission real tdnmexp ! total transmission minus exp transmission C C---------------------------Statement functions------------------------- C C Statement functions and other local variables C real alpha ! Term in direct reflect and transmissivity real gamma ! Term in direct reflect and transmissivity real el ! Term in alpha,gamma,n,u real taus ! Scaled extinction optical depth real omgs ! Scaled single particle scattering albedo real asys ! Scaled asymmetry parameter real u ! Term in diffuse reflect and transmissivity real n ! Term in diffuse reflect and transmissivity real lm ! Temporary for el real ne ! Temporary for n real w ! Dummy argument for statement function real uu ! Dummy argument for statement function real g ! Dummy argument for statement function real e ! Dummy argument for statement function real f ! Dummy argument for statement function real t ! Dummy argument for statement function real et ! Dummy argument for statement function C C Intermediate terms for delta-eddington solution C real alp ! Temporary for alpha real gam ! Temporary for gamma real ue ! Temporary for u real arg ! Exponential argument real extins ! Extinction real amg ! Alp - gam real apg ! Alp + gam C alpha(w,uu,g,e) = .75*w*uu*((1. + g*(1-w))/(1. - e*e*uu*uu)) gamma(w,uu,g,e) = .50*w*((3.*g*(1.-w)*uu*uu + 1.)/(1.-e*e*uu*uu)) el(w,g) = sqrt(3.*(1-w)*(1. - w*g)) taus(w,f,t) = (1. - w*f)*t omgs(w,f) = (1. - f)*w/(1. - w*f) asys(g,f) = (g - f)/(1. - f) u(w,g,e) = 1.5*(1. - w*g)/e n(uu,et) = ((uu+1.)*(uu+1.)/et ) - ((uu-1.)*(uu-1.)*et) C C----------------------------------------------------------------------- C C Initialize all total transmission values to 0, so that nighttime C values from previous computations are not used: C call resetr(tottrn,plond*plevp,0.) C C Compute total direct beam transmission, total transmission, and C reflectivity for diffuse radiation (from below) for all layers above C each interface by starting from the top and adding layers down: C C For the extra layer above model top: C do nn=1,nloop do i=is(nn),ie(nn) tauray(i) = trayoslp*(pflx(i,1)-pflx(i,0)) taugab(i) = abh2o*uh2o(i,0) + abo3*uo3(i,0) + $ abco2*uco2(i,0) + abo2*uo2(i,0) tautot = tauxcl(i,0) + tauxci(i,0) + tauray(i) + taugab(i) $ + tauxar(i,0) taucsc = tauxcl(i,0)*wcl(i,0)+tauxci(i,0)*wci(i,0) $ + tauxar(i,0)*wa(i,0) wtau = wray*tauray(i) wt = wtau + taucsc wtot = wt/tautot gtot = (wtau*gray + gcl(i,0)*tauxcl(i,0)*wcl(i,0) + $ gci(i,0)*tauxci(i,0)*wci(i,0) + $ ga(i,0) *tauxar(i,0)*wa(i,0))/wt ftot = (wtau*fray + fcl(i,0)*tauxcl(i,0)*wcl(i,0) + $ fci(i,0)*tauxci(i,0)*wci(i,0) + $ fa(i,0) *tauxar(i,0)*wa(i,0))/wt ts = taus(wtot,ftot,tautot) ws = omgs(wtot,ftot) gs = asys(gtot,ftot) lm = el(ws,gs) alp = alpha(ws,coszrs(i),gs,lm) gam = gamma(ws,coszrs(i),gs,lm) ue = u(ws,gs,lm) C C Limit argument of exponential to 25, in case lm*ts very large: C arg = min(lm*ts,25.) extins = exp(-arg) ne = n(ue,extins) rdif(i,0) = (ue+1.)*(ue-1.)*(1./extins - extins)/ne tdif(i,0) = 4.*ue/ne C C Limit argument of exponential to 25, in case coszrs is very small: C arg = min(ts/coszrs(i),25.) explay(i,0) = exp(-arg) apg = alp + gam amg = alp - gam rdir(i,0) = amg*(tdif(i,0)*explay(i,0) - 1.) + apg*rdif(i,0) tdir(i,0) = apg*tdif(i,0) + $ (amg*rdif(i,0) - (apg-1.))*explay(i,0) C C Under rare conditions, reflectivies and transmissivities can be C negative; zero out any negative values C rdir(i,0) = max(rdir(i,0),0.0) tdir(i,0) = max(tdir(i,0),0.0) rdif(i,0) = max(rdif(i,0),0.0) tdif(i,0) = max(tdif(i,0),0.0) C C Initialize top interface of extra layer: C exptdn(i,0) = 1.0 rdndif(i,0) = 0.0 tottrn(i,0) = 1.0 rdndif(i,1) = rdif(i,0) tottrn(i,1) = tdir(i,0) end do end do C C Now, continue down one layer at a time; if the total transmission to C the interface just above a given layer is less than trmin, then no C delta-eddington computation for that layer is done: C do 400 k=1,plev C C Initialize current layer properties to zero; only if total C transmission to the top interface of the current layer exceeds the C minimum, will these values be computed below: C do nn=1,nloop do i=is(nn),ie(nn) rdir(i,k) = 0.0 rdif(i,k) = 0.0 tdir(i,k) = 0.0 tdif(i,k) = 0.0 explay(i,k) = 0.0 C C Calculates the solar beam transmission, total transmission, and C reflectivity for diffuse radiation from below at the top of the C current layer: C exptdn(i,k) = exptdn(i,k-1)*explay(i,k-1) rdenom = 1./(1. - rdif(i,k-1)*rdndif(i,k-1)) rdirexp = rdir(i,k-1)*exptdn(i,k-1) tdnmexp = tottrn(i,k-1) - exptdn(i,k-1) tottrn(i,k) = exptdn(i,k-1)*tdir(i,k-1) + tdif(i,k-1)* $ (tdnmexp + rdndif(i,k-1)*rdirexp)*rdenom rdndif(i,k) = rdif(i,k-1) + $ (rdndif(i,k-1)*tdif(i,k-1))*(tdif(i,k-1)*rdenom) end do end do C C Compute next layer delta-eddington solution only if total transmission C of radiation to the interface just above the layer exceeds trmin. C call whenfgt(plon,tottrn(1,k),1,trmin,index,nval) if(nval.gt.0) then CDIR$ IVDEP do ii=1,nval i=index(ii) tauray(i) = trayoslp*(pflx(i,k+1)-pflx(i,k)) taugab(i) = abh2o*uh2o(i,k) + abo3*uo3(i,k) + $ abco2*uco2(i,k) + abo2*uo2(i,k) tautot = tauxcl(i,k) + tauxci(i,k) + $ tauray(i) + taugab(i) + tauxar(i,k) taucsc = tauxcl(i,k)*wcl(i,k) + tauxci(i,k)*wci(i,k) $ + tauxar(i,k)*wa(i,k) wtau = wray*tauray(i) wt = wtau + taucsc wtot = wt/tautot gtot = (wtau*gray + gcl(i,k)*wcl(i,k)*tauxcl(i,k) $ + gci(i,k)*wci(i,k)*tauxci(i,k) $ + ga(i,k) *wa(i,k) *tauxar(i,k))/wt ftot = (wtau*fray + fcl(i,k)*wcl(i,k)*tauxcl(i,k) $ + fci(i,k)*wci(i,k)*tauxci(i,k) $ + fa(i,k) *wa(i,k) *tauxar(i,k))/wt ts = taus(wtot,ftot,tautot) ws = omgs(wtot,ftot) gs = asys(gtot,ftot) lm = el(ws,gs) alp = alpha(ws,coszrs(i),gs,lm) gam = gamma(ws,coszrs(i),gs,lm) ue = u(ws,gs,lm) C C Limit argument of exponential to 25, in case lm very large: C arg = min(lm*ts,25.) extins = exp(-arg) ne = n(ue,extins) rdif(i,k) = (ue+1.)*(ue-1.)*(1./extins - extins)/ne tdif(i,k) = 4.*ue/ne C C Limit argument of exponential to 25, in case coszrs is very small: C arg = min(ts/coszrs(i),25.) explay(i,k) = exp(-arg) apg = alp + gam amg = alp - gam rdir(i,k) = amg*(tdif(i,k)*explay(i,k) - 1.) + $ apg*rdif(i,k) tdir(i,k) = apg*tdif(i,k) + $ (amg*rdif(i,k) - (apg-1.))*explay(i,k) C C Under rare conditions, reflectivies and transmissivities can be C negative; zero out any negative values C rdir(i,k) = max(rdir(i,k),0.0) tdir(i,k) = max(tdir(i,k),0.0) rdif(i,k) = max(rdif(i,k),0.0) tdif(i,k) = max(tdif(i,k),0.0) end do end if 400 continue C C Compute total direct beam transmission, total transmission, and C reflectivity for diffuse radiation (from below) for all layers C above the surface: C k = plevp do nn=1,nloop do i=is(nn),ie(nn) exptdn(i,k) = exptdn(i,k-1)*explay(i,k-1) rdenom = 1./(1. - rdif(i,k-1)*rdndif(i,k-1)) rdirexp = rdir(i,k-1)*exptdn(i,k-1) tdnmexp = tottrn(i,k-1) - exptdn(i,k-1) tottrn(i,k) = exptdn(i,k-1)*tdir(i,k-1) + tdif(i,k-1)* $ (tdnmexp + rdndif(i,k-1)*rdirexp)*rdenom rdndif(i,k) = rdif(i,k-1) + $ (rdndif(i,k-1)*tdif(i,k-1))*(tdif(i,k-1)*rdenom) end do end do C return end