!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SORAD ######
!###### ######
!###### Developed by ######
!###### ######
!###### Goddard Cumulus Ensemble Modeling Group, NASA ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE sorad(idim,jdim,m,n,np, & 1,4
pl,ta,wa,oa,co2, &
taucldi,taucldl,reffi,reffl,fcld,ict,icb, &
taual,rsirbm,rsirdf,rsuvbm,rsuvdf,cosz, &
flx,flc,fdirir,fdifir,fdirpar,fdifpar, &
sdf,sclr,csm,cc, &
tauclb,tauclf,dp,wh,oh,scal,swh,so2,df, &
tem2d1, tem2d2, tem2d3, tem2d4, tem2d5, &
tem2d6, tem2d7, tem2d8, tem2d9, tem2d10, &
tem2d11,tem2d12,tem2d13,tem2d14,tem2d15, &
tem2d16,tem2d17,tem2d18,tem2d19, &
tem3d1, tem3d2, tem3d3, tem3d4, tem3d5, &
tem4d1, tem4d2, tem4d3, tem4d4, tem4d5, &
tem5d1, tem5d2, tem5d3, tem5d4, tem5d5)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate solar fluxes due to the absoption by water vapor, ozone,
! co2, o2, clouds, and aerosols and due to the scattering by clouds,
! aerosols, and gases.
!
!-----------------------------------------------------------------------
!
! AUTHOR: (a) Radiative Transfer Model: M.-D. Chou and M. Suarez
! (b) Cloud Optics:Tao, Lang, Simpson, Sui, Ferrier and
! Chou (1996)
!
! MODIFICATION HISTORY:
!
! 03/15/1996 (Yuhe Liu)
! Adopted the original code and formatted it in accordance with the
! ARPS coding standard.
!
!-----------------------------------------------------------------------
!
! ORIGINAL COMMENTS:
!
!**************** charney /silo/z1mhy/new/solar.f ***10/24/95******
!********************************************************************
!
! This routine computes solar fluxes due to the absoption by water
! vapor, ozone, co2, o2, clouds, and aerosols and due to the
! scattering by clouds, aerosols, and gases.
!
! This is a vectorized code. It computes the fluxes simultaneous for
! (m x n) soundings, which is a subset of the (m x ndim) soundings.
! In a global climate model, m and ndim correspond to the numbers of
! grid boxes in the zonal and meridional directions, respectively.
!
! Ice and liquid cloud particles are allowed to co-exist in any of the
! np layers. Two sets of cloud parameters are required as inputs, one
! for ice paticles and the other for liquid particles. These parameters
! are optical thickness (taucld) and effective particle size (reff).
!
! If no information is available for reff, a default value of
! 10 micron for liquid water and 75 micron for ice can be used.
!
! Clouds are grouped into high, middle, and low clouds separated by the
! level indices ict and icb. For detail, see the subroutine cldscale.
!
!----- Input parameters:
! units size
! number of soundings in zonal direction (m) n/d 1
! number of soundings in meridional direction (n) n/d 1
! maximum number of soundings in n/d 1
! meridional direction (ndim)
! number of atmospheric layers (np) n/d 1
! level pressure (pl) mb m*ndim*(np+1)
! layer temperature (ta) k m*ndim*np
! layer specific humidity (wa) gm/gm m*ndim*np
! layer ozone concentration (oa) gm/gm m*ndim*np
! co2 mixing ratio by volumn (co2) parts/part 1
! cloud optical thickness (taucld) n/d m*ndim*np*2
! index 1 for ice particles
! index 2 for liquid drops
! effective cloud-particle size (reff) micrometer m*ndim*np*2
! index 1 for ice particles
! index 2 for liquid drops
!
! ARPS notes: taucld were changed to taucldi and taucldl
! reff were changed to reffi and reffl
!
! cloud amount (fcld) fraction m*ndim*np
! level index separating high and middle n/d 1
! clouds (ict)
! level index separating middle and low clouds n/d 1
! clouds (icb)
! aerosol optical thickness (taual) n/d m*ndim*np
! solar ir surface albedo for beam fraction m*ndim
! radiation (rsirbm)
! solar ir surface albedo for diffuse fraction m*ndim
! radiation (rsirdf)
! uv + par surface albedo for beam fraction m*ndim
! radiation (rsuvbm)
! uv + par surface albedo for diffuse fraction m*ndim
! radiation (rsuvdf)
! cosine of solar zenith angle (cosz) n/d m*ndim
!
!----- Output parameters
!
! all-sky flux (downward minus upward) (flx) fraction m*ndim*(np+1)
! clear-sky flux (downward minus upward) (flc) fraction m*ndim*(np+1)
! all-sky direct downward ir (0.7-10 micron)
! flux at the surface (fdirir) fraction m*ndim
! all-sky diffuse downward ir flux at
! the surface (fdifir) fraction m*ndim
! all-sky direct downward par (0.4-0.7 micron)
! flux at the surface (fdirpar) fraction m*ndim
! all-sky diffuse downward par flux at
! the surface (fdifpar) fraction m*ndim
!
!----- Notes:
!
! (1) The unit of flux is fraction of the incoming solar radiation
! at the top of the atmosphere. Therefore, fluxes should
! be equal to flux multiplied by the extra-terrestrial solar
! flux and the cosine of solar zenith angle.
! (2) Clouds and aerosols can be included in any layers by specifying
! fcld(i,j,k), taucld(i,j,k,*) and taual(i,j,k), k=1,np.
! For an atmosphere without clouds and aerosols,
! set fcld(i,j,k)=taucld(i,j,k,*)=taual(i,j,k)=0.0.
! (3) Aerosol single scattering albedos and asymmetry
! factors are specified in the subroutines solir and soluv.
! (4) pl(i,j,1) is the pressure at the top of the model, and
! pl(i,j,np+1) is the surface pressure.
!
! ARPS note: pl was replaced by pa at scalar points (layers)
!
! (5) the pressure levels ict and icb correspond approximately
! to 400 and 700 mb.
!
!**************************************************************************
!
!fpp$ expand (expmn)
!dir$ inline always expmn
!*$* inline routine (expmn)
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: idim,jdim ! ARPS nx, ny. NX is used in this
! subroutine for other purpose
INTEGER :: m,n,np
INTEGER :: ict,icb
REAL :: pl(idim,jdim,np+1) ! pressure at scalar points (layers)
REAL :: ta(idim,jdim,np)
REAL :: wa(idim,jdim,np)
REAL :: oa(idim,jdim,np)
REAL :: taucldi(idim,jdim,np)
REAL :: taucldl(idim,jdim,np)
REAL :: reffi(idim,jdim,np)
REAL :: reffl(idim,jdim,np)
REAL :: fcld(idim,jdim,np)
REAL :: taual(idim,jdim,np)
REAL :: rsirbm(idim,jdim)
REAL :: rsirdf(idim,jdim)
REAL :: rsuvbm(idim,jdim)
REAL :: rsuvdf(idim,jdim)
REAL :: cosz(idim,jdim)
REAL :: co2
REAL :: flx(idim,jdim,np+1)
REAL :: flc(idim,jdim,np+1)
REAL :: fdirir(idim,jdim)
REAL :: fdifir(idim,jdim)
REAL :: fdirpar(idim,jdim)
REAL :: fdifpar(idim,jdim)
!
!-----------------------------------------------------------------------
!
! Local temporary arrays
!
!-----------------------------------------------------------------------
!
REAL :: sdf(m,n)
REAL :: sclr(m,n)
REAL :: csm(m,n)
REAL :: cc(m,n,3)
REAL :: tauclb(m,n,np)
REAL :: tauclf(m,n,np)
REAL :: dp(m,n,np)
REAL :: wh(m,n,np)
REAL :: oh(m,n,np)
REAL :: scal(m,n,np)
REAL :: swh(m,n,np+1)
REAL :: so2(m,n,np+1)
REAL :: df(m,n,np+1)
!-----temporary arrays used in subroutine cldflx
REAL :: tem2d1 (m,n)
REAL :: tem2d2 (m,n)
REAL :: tem2d3 (m,n)
REAL :: tem2d4 (m,n)
REAL :: tem2d5 (m,n)
REAL :: tem2d6 (m,n)
REAL :: tem2d7 (m,n)
REAL :: tem2d8 (m,n)
REAL :: tem2d9 (m,n)
REAL :: tem2d10(m,n)
REAL :: tem2d11(m,n)
REAL :: tem2d12(m,n)
REAL :: tem2d13(m,n)
REAL :: tem2d14(m,n)
REAL :: tem2d15(m,n)
REAL :: tem2d16(m,n)
REAL :: tem2d17(m,n)
REAL :: tem2d18(m,n)
REAL :: tem2d19(m,n)
REAL :: tem3d1(m,n,np)
REAL :: tem3d2(m,n,np)
REAL :: tem3d3(m,n,np+1)
REAL :: tem3d4(m,n,np+1)
REAL :: tem3d5(m,n,np+1)
REAL :: tem4d1(m,n,np+1,2)
REAL :: tem4d2(m,n,np+1,2)
REAL :: tem4d3(m,n,np+1,2)
REAL :: tem4d4(m,n,np+1,2)
REAL :: tem4d5(m,n,np+1,2)
REAL :: tem5d1(m,n,np+1,2,2)
REAL :: tem5d2(m,n,np+1,2,2)
REAL :: tem5d3(m,n,np+1,2,2)
REAL :: tem5d4(m,n,np+1,2,2)
REAL :: tem5d5(m,n,np+1,2,2)
!-----temporary variables
INTEGER :: i,j,k
REAL :: x
!
!-----------------------------------------------------------------------
!
! Functions:
!
!-----------------------------------------------------------------------
!
REAL :: expmn
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO j=1,n
DO i=1,m
swh(i,j,1)=0.
so2(i,j,1)=0.
!-----csm is the effective secant of the solar zenith angle
! see equation (12) of Lacis and Hansen (1974, JAS)
csm(i,j)=35./SQRT(1224.*cosz(i,j)*cosz(i,j)+1.)
END DO
END DO
DO k=1,np
DO j=1,n
DO i=1,m
!-----compute layer thickness and pressure-scaling function.
! indices for the surface level and surface layer
! are np+1 and np, respectively.
dp(i,j,k)=pl(i,j,k+1)-pl(i,j,k)
scal(i,j,k)=dp(i,j,k)*(.5*(pl(i,j,k)+pl(i,j,k+1))/300.)**.8
!-----compute scaled water vapor amount, unit is g/cm**2
wh(i,j,k)=1.02*wa(i,j,k)*scal(i,j,k)* &
(1.-0.00135*(ta(i,j,k)-240.))
swh(i,j,k+1)=swh(i,j,k)+wh(i,j,k)
!-----compute ozone amount, unit is (cm-atm)stp.
oh(i,j,k)=1.02*oa(i,j,k)*dp(i,j,k)*466.7
END DO
END DO
END DO
!-----scale cloud optical thickness in each layer from taucld (with
! cloud amount fcld) to tauclb and tauclf (with cloud amount cc).
! tauclb is the scaled optical thickness for beam radiation and
! tauclf is for diffuse radiation.
CALL cldscale
(idim,jdim, &
m,n,np,cosz,fcld,taucldi,taucldl,ict,icb, &
cc,tauclb,tauclf)
!-----initialize fluxes for all-sky (flx), clear-sky (flc), and
! flux reduction (df)
DO k=1,np+1
DO j=1,n
DO i=1,m
flx(i,j,k)=0.
flc(i,j,k)=0.
df(i,j,k)=0.
END DO
END DO
END DO
!-----compute solar ir fluxes
CALL solir
(idim,jdim, &
m,n,np,wh,taucldi,taucldl,tauclb,tauclf, &
reffi,reffl,ict,icb, &
fcld,cc,taual,csm,rsirbm,rsirdf, &
flx,flc,fdirir,fdifir, &
tem2d1, tem2d2, tem2d3, tem2d4, &
tem2d5, tem2d6, tem2d7, tem2d8, tem2d9, &
tem2d10,tem2d11,tem2d12,tem2d13,tem2d14, &
tem3d1, tem3d2, tem3d3, tem3d4, &
tem4d1, tem4d2, tem4d3, tem4d4, tem4d5, &
tem2d15,tem2d16,tem2d17,tem2d18,tem2d19, &
tem3d5, &
tem5d1,tem5d2,tem5d3,tem5d4,tem5d5)
! DO k=1,np
! write (6,'(a,i2,a,i2,a,e20.10)')
! : 'IR: flx(2,2,',k+1,')-flx(2,2,',k,')=',
! : flx(2,2,k+1)-flx(2,2,k)
! ENDDO
!-----compute and update uv and par fluxes
CALL soluv
(idim,jdim, &
m,n,np,oh,dp,taucldi,taucldl,tauclb,tauclf, &
reffi,reffl,ict,icb, &
fcld,cc,taual,csm,rsuvbm,rsuvdf, &
flx,flc,fdirpar,fdifpar, &
tem2d1, tem2d2, tem2d3, &
tem2d5, tem2d6, tem2d7, tem2d8, tem2d9, &
tem2d10,tem2d11,tem2d12,tem2d13,tem2d14, &
tem3d1, tem3d3, tem3d4, &
tem4d1, tem4d2, tem4d3, tem4d4, tem4d5, &
tem2d15,tem2d16,tem2d17,tem2d18,tem2d19, &
tem3d5, &
tem5d1,tem5d2,tem5d3,tem5d4,tem5d5)
! write (6,'(a/a3,2a15)') 'Total flux for PAR',
! : 'k','dflxPAR','flxPAR'
! DO k=1,np
! write (6,'(i3,2e15.7)')
! : k,flx(2,2,k+1)-flx(2,2,k),flx(2,2,k)
! ENDDO
!-----compute scaled amount of o2 (so2), unit is (cm-atm)stp.
DO k=1,np
DO j=1,n
DO i=1,m
so2(i,j,k+1)=so2(i,j,k)+165.22*scal(i,j,k)
END DO
END DO
END DO
!-----compute flux reduction due to oxygen following
! chou (J. climate, 1990). The fraction 0.0287 is the
! extraterrestrial solar flux in the o2 bands.
DO k=2,np+1
DO j=1,n
DO i=1,m
x=so2(i,j,k)*csm(i,j)
df(i,j,k)=df(i,j,k)+0.0287*(1.-expmn(-0.00027*SQRT(x)))
END DO
END DO
END DO
! write (6,'(a/a3,3a15)')
! : 'Flux reduction due to oxygen, i=j=3',
! : 'k','ddf','df','so2'
! DO k=2,np+1
! write (6,'(i3,3e15.7)')
! : k,df(3,3,k)-df(3,3,k-1),df(3,3,k),so2(3,3,k)
! ENDDO
!-----compute scaled amounts for co2 (so2). unit is (cm-atm)stp.
DO k=1,np
DO j=1,n
DO i=1,m
so2(i,j,k+1)=so2(i,j,k)+co2*789.*scal(i,j,k)
END DO
END DO
END DO
!-----compute and update flux reduction due to co2 following
! chou (J. Climate, 1990)
CALL flxco2
(m,n,np,so2,swh,csm,df)
!-----adjust for the effect of o2 cnd co2 on clear-sky fluxes.
DO k=2,np+1
DO j=1,n
DO i=1,m
flc(i,j,k)=flc(i,j,k)-df(i,j,k)
END DO
END DO
END DO
!-----adjust for the all-sky fluxes due to o2 and co2. It is
! assumed that o2 and co2 have no effects on solar radiation
! below clouds. clouds are assumed randomly overlapped.
DO j=1,n
DO i=1,m
sdf(i,j)=0.0
sclr(i,j)=1.0
END DO
END DO
DO k=1,np
DO j=1,n
DO i=1,m
!-----sclr is the fraction of clear sky.
! sdf is the flux reduction below clouds.
IF(fcld(i,j,k) > 0.01) THEN
sdf(i,j)=sdf(i,j)+df(i,j,k)*sclr(i,j)*fcld(i,j,k)
sclr(i,j)=sclr(i,j)*(1.-fcld(i,j,k))
END IF
flx(i,j,k+1)=flx(i,j,k+1)-sdf(i,j)-df(i,j,k+1)*sclr(i,j)
END DO
END DO
END DO
!-----adjust for the direct downward ir flux.
DO j=1,n
DO i=1,m
fdirir(i,j)=fdirir(i,j)-sdf(i,j)-df(i,j,np+1)*sclr(i,j)
END DO
END DO
! write (6,'(a3,2a15)') 'k','flx','flc'
! DO k=1,np
! write (6,'(i3,2e15.8)') k,flx(1,1,k),flc(1,1,k)
! ENDDO
!
! write (6,'(4a15)')
! : 'fdirir','fdifir','fdirpar','fdifpar'
!
! write (6,'(4e15.8)')
! : fdirir(1,1),fdifir(1,1),fdirpar(1,1),fdifpar(1,1)
RETURN
END SUBROUTINE sorad
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SOLIR ######
!###### ######
!###### Developed by ######
!###### ######
!###### Goddard Cumulus Ensemble Modeling Group, NASA ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE solir(idim,jdim, & 1,5
m,n,np,wh,taucldi,taucldl,tauclb,tauclf,reffi,reffl, &
ict,icb,fcld,cc,taual,csm,rsirbm,rsirdf, &
flx,flc,fdirir,fdifir, &
fsdir,fsdif, ssaclt,asyclt, &
rr1t,tt1t,td1t,rs1t,ts1t, &
rr2t,tt2t,td2t,rs2t,ts2t, &
ssacl,asycl,fall,fclr, &
rr,tt,td,rs,ts, &
tem2d1,tem2d2,tem2d3,tem2d4,tem2d5, &
tem3d, &
tem5d1,tem5d2,tem5d3,tem5d4,tem5d5)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate solar flux in the infrared region. The spectrum is
! divided into three bands. (See original comments.)
!
!-----------------------------------------------------------------------
!
! AUTHOR: (a) Radiative Transfer Model: M.-D. Chou and M. Suarez
! (b) Cloud Optics:Tao, Lang, Simpson, Sui, Ferrier and
! Chou (1996)
!
! MODIFICATION:
!
! 03/11/1996 (Yuhe Liu)
! Modified the original code from 1-D to 3-D
!
! 12/14/1998 (Keith Brewster)
! Modified values of ssaal and asymal in data statement.
!
!-----------------------------------------------------------------------
!
! ORIGINAL COMMENTS:
!
!************************************************************************
! compute solar flux in the infrared region. The spectrum is divided
! into three bands:
!
! band wavenumber(/cm) wavelength (micron)
! 1 1000-4400 2.27-10.0
! 2 4400-8200 1.22-2.27
! 3 8200-14300 0.70-1.22
!
!----- Input parameters: units size
!
! number of soundings in zonal direction (m) n/d 1
! number of soundings in meridional direction (n) n/d 1
! maximum number of soundings in n/d 1
! meridional direction (ndim)
! number of atmospheric layers (np) n/d 1
! layer water vapor content (wh) gm/cm^2 m*n*np
! cloud optical thickness (taucld) n/d m*ndim*np*2
! index 1 for ice paticles
! index 2 for liquid particles
! scaled cloud optical thickness n/d m*n*np
! for beam radiation (tauclb)
! scaled cloud optical thickness n/d m*n*np
! for diffuse radiation (tauclf)
! effective cloud-particle size (reff) micrometer m*ndim*np*2
! index 1 for ice paticles
! index 2 for liquid particles
! level index separating high and n/d m*n
! middle clouds (ict)
! level index separating middle and n/d m*n
! low clouds (icb)
! cloud amount (fcld) fraction m*ndim*np
! cloud amount of high, middle, and n/d m*n*3
! low clouds (cc)
! aerosol optical thickness (taual) n/d m*ndim*np
! cosecant of the solar zenith angle (csm) n/d m*n
! near ir surface albedo for beam fraction m*ndim
! radiation (rsirbm)
! near ir surface albedo for diffuse fraction m*ndim
! radiation (rsirdf)
!
!----- output (updated) parameters:
!
! all-sky flux (downward-upward) (flx) fraction m*ndim*(np+1)
! clear-sky flux (downward-upward) (flc) fraction m*ndim*(np+1)
! all-sky direct downward ir flux at
! the surface (fdirir) fraction m*ndim
! all-sky diffuse downward ir flux at
! the surface (fdifir) fraction m*ndim
!
!----- note: the following parameters must be specified by users:
! aerosol single scattering albedo (ssaal) n/d nband
! aerosol asymmetry factor (asyal) n/d nband
!
!*************************************************************************
!
!fpp$ expand (expmn)
!fpp$ expand (deledd)
!fpp$ expand (sagpol)
!dir$ inline always expmn,deledd,sagpol
!*$* inline routine (expmn,deledd,sagpol)
!
!-----------------------------------------------------------------------
!
! Variable declarations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!-----input parameters
INTEGER :: idim,jdim
INTEGER :: m,n,np,ict,icb
REAL :: taucldi(idim,jdim,np)
REAL :: taucldl(idim,jdim,np)
REAL :: reffi(idim,jdim,np)
REAL :: reffl(idim,jdim,np)
REAL :: fcld(idim,jdim,np)
REAL :: rsirbm(idim,jdim)
REAL :: rsirdf(idim,jdim)
REAL :: taual(idim,jdim,np)
REAL :: tauclb(m,n,np)
REAL :: tauclf(m,n,np)
REAL :: cc(m,n,3)
REAL :: wh(m,n,np)
REAL :: csm(m,n)
!-----output (updated) parameters
REAL :: flx(idim,jdim,np+1)
REAL :: flc(idim,jdim,np+1)
REAL :: fdirir(idim,jdim)
REAL :: fdifir(idim,jdim)
!-----static parameters
INTEGER :: nk,nband
PARAMETER (nk=10,nband=3)
REAL :: xk(nk),hk(nband,nk),ssaal(nband),asyal(nband)
REAL :: aia(nband,3),awa(nband,3),aig(nband,3),awg(nband,3)
!-----temporary array
REAL :: fsdir(m,n)
REAL :: fsdif(m,n)
REAL :: ssaclt(m,n)
REAL :: asyclt(m,n)
REAL :: rr1t(m,n)
REAL :: tt1t(m,n)
REAL :: td1t(m,n)
REAL :: rs1t(m,n)
REAL :: ts1t(m,n)
REAL :: rr2t(m,n)
REAL :: tt2t(m,n)
REAL :: td2t(m,n)
REAL :: rs2t(m,n)
REAL :: ts2t(m,n)
REAL :: ssacl(m,n,np)
REAL :: asycl(m,n,np)
REAL :: fall(m,n,np+1)
REAL :: fclr(m,n,np+1)
REAL :: rr(m,n,np+1,2)
REAL :: tt(m,n,np+1,2)
REAL :: td(m,n,np+1,2)
REAL :: rs(m,n,np+1,2)
REAL :: ts(m,n,np+1,2)
!-----temporary arrays used in subroutine cldflx
REAL :: tem2d1(m,n)
REAL :: tem2d2(m,n)
REAL :: tem2d3(m,n)
REAL :: tem2d4(m,n)
REAL :: tem2d5(m,n)
REAL :: tem3d (m,n,np+1)
REAL :: tem5d1(m,n,np+1,2,2)
REAL :: tem5d2(m,n,np+1,2,2)
REAL :: tem5d3(m,n,np+1,2,2)
REAL :: tem5d4(m,n,np+1,2,2)
REAL :: tem5d5(m,n,np+1,2,2)
!-----temporary variables
INTEGER :: ib,ik,i,j,k
REAL :: tauwv,tausto,ssatau,asysto,tauto,ssato,asyto
REAL :: taux,reff1,reff2,w1,w2,g1,g2
!-----function
REAL :: expmn
!-----water vapor absorption coefficient for 10 k-intervals.
! unit: cm^2/gm
DATA xk/ &
0.0010, 0.0133, 0.0422, 0.1334, 0.4217, &
1.334, 5.623, 31.62, 177.8, 1000.0/
!-----water vapor k-distribution function,
! the sum of hk is 0.52926. unit: fraction
DATA hk/ &
.01074,.08236,.20673, .00360,.01157,.03497, &
.00411,.01133,.03011, .00421,.01143,.02260, &
.00389,.01240,.01336, .00326,.01258,.00696, &
.00499,.01381,.00441, .00465,.00650,.00115, &
.00245,.00244,.00026, .00145,.00094,.00000/
!-----aerosol single-scattering albedo and asymmetry factor
! data ssaal,asyal/nband*0.999,nband*0.850/
DATA ssaal/0.75,0.55,0.90/
DATA asyal/0.40,0.50,0.60/
! data ssaal,asyal/nband*0.400,nband*0.500/
!-----coefficients for computing the single scattering albedo of
! ice clouds from ssa=1-(aia(*,1)+aia(*,2)*reff+aia(*,3)*reff**2)
DATA aia/ &
.08938331, .00215346,-.00000260, &
.00299387, .00073709, .00000746, &
-.00001038,-.00000134, .00000000/
!-----coefficients for computing the single scattering albedo of
! liquid clouds from ssa=1-(awa(*,1)+awa(*,2)*reff+awa(*,3)*reff**2)
DATA awa/ &
.01209318,-.00019934, .00000007, &
.01784739, .00088757, .00000845, &
-.00036910,-.00000650,-.00000004/
!-----coefficients for computing the asymmetry factor of ice clouds
! from asycl=aig(*,1)+aig(*,2)*reff+aig(*,3)*reff**2
DATA aig/ &
.84090400, .76098937, .74935228, &
.00126222, .00141864, .00119715, &
-.00000385,-.00000396,-.00000367/
!-----coefficients for computing the asymmetry factor of liquid clouds
! from asycl=awg(*,1)+awg(*,2)*reff+awg(*,3)*reff**2
DATA awg/ &
.83530748, .74513197, .79375035, &
.00257181, .01370071, .00832441, &
.00005519,-.00038203,-.00023263/
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----initialize surface fluxes, reflectances, and transmittances
DO j= 1, n
DO i= 1, m
fdirir(i,j)=0.0
fdifir(i,j)=0.0
rr(i,j,np+1,1)=rsirbm(i,j)
rr(i,j,np+1,2)=rsirdf(i,j)
rs(i,j,np+1,1)=rsirbm(i,j)
rs(i,j,np+1,2)=rsirdf(i,j)
td(i,j,np+1,1)=0.0
td(i,j,np+1,2)=0.0
tt(i,j,np+1,1)=0.0
tt(i,j,np+1,2)=0.0
ts(i,j,np+1,1)=0.0
ts(i,j,np+1,2)=0.0
END DO
END DO
!-----integration over spectral bands
DO ib=1,nband
!-----compute cloud single scattering albedo and asymmetry factor
! for a mixture of ice and liquid particles.
DO k= 1, np
DO j= 1, n
DO i= 1, m
ssaclt(i,j)=1.0
asyclt(i,j)=1.0
taux=taucldi(i,j,k)+taucldl(i,j,k)
IF (taux > 0.05 .AND. fcld(i,j,k) > 0.01) THEN
reff1=MIN(reffi(i,j,k),130.)
reff2=MIN(reffl(i,j,k),20.0)
w1=(1.-(aia(ib,1)+(aia(ib,2)+ &
aia(ib,3)*reff1)*reff1))*taucldi(i,j,k)
w2=(1.-(awa(ib,1)+(awa(ib,2)+ &
awa(ib,3)*reff2)*reff2))*taucldl(i,j,k)
ssaclt(i,j)=(w1+w2)/taux
g1=(aig(ib,1)+(aig(ib,2)+aig(ib,3)*reff1)*reff1)*w1
g2=(awg(ib,1)+(awg(ib,2)+awg(ib,3)*reff2)*reff2)*w2
asyclt(i,j)=(g1+g2)/(w1+w2)
END IF
END DO
END DO
DO j=1,n
DO i=1,m
ssacl(i,j,k)=ssaclt(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
asycl(i,j,k)=asyclt(i,j)
END DO
END DO
END DO
!-----integration over the k-distribution function
DO ik=1,nk
DO k= 1, np
DO j= 1, n
DO i= 1, m
tauwv=xk(ik)*wh(i,j,k)
!-----compute total optical thickness, single scattering albedo,
! and asymmetry factor.
tausto=tauwv+taual(i,j,k)+1.0E-8
ssatau=ssaal(ib)*taual(i,j,k)
asysto=asyal(ib)*ssaal(ib)*taual(i,j,k)
!-----compute reflectance and transmittance for cloudless layers
tauto=tausto
ssato=ssatau/tauto+1.0E-8
IF (ssato > 0.001) THEN
ssato=MIN(ssato,0.999999)
asyto=asysto/(ssato*tauto)
CALL deledd
(tauto,ssato,asyto,csm(i,j), &
rr1t(i,j),tt1t(i,j),td1t(i,j))
CALL sagpol
(tauto,ssato,asyto,rs1t(i,j),ts1t(i,j))
ELSE
td1t(i,j)=expmn(-tauto*csm(i,j))
ts1t(i,j)=expmn(-1.66*tauto)
tt1t(i,j)=0.0
rr1t(i,j)=0.0
rs1t(i,j)=0.0
END IF
!-----compute reflectance and transmittance for cloud layers
IF (tauclb(i,j,k) < 0.01) THEN
rr2t(i,j)=rr1t(i,j)
tt2t(i,j)=tt1t(i,j)
td2t(i,j)=td1t(i,j)
rs2t(i,j)=rs1t(i,j)
ts2t(i,j)=ts1t(i,j)
ELSE
tauto=tausto+tauclb(i,j,k)
ssato=(ssatau+ssacl(i,j,k)*tauclb(i,j,k))/tauto+1.0E-8
ssato=MIN(ssato,0.999999)
asyto=(asysto+asycl(i,j,k)*ssacl(i,j,k)*tauclb(i,j,k))/ &
(ssato*tauto)
CALL deledd
(tauto,ssato,asyto,csm(i,j), &
rr2t(i,j),tt2t(i,j),td2t(i,j))
tauto=tausto+tauclf(i,j,k)
ssato=(ssatau+ssacl(i,j,k)*tauclf(i,j,k))/tauto+1.0E-8
ssato=MIN(ssato,0.999999)
asyto=(asysto+asycl(i,j,k)*ssacl(i,j,k)*tauclf(i,j,k))/ &
(ssato*tauto)
CALL sagpol
(tauto,ssato,asyto,rs2t(i,j),ts2t(i,j))
END IF
END DO
END DO
DO j=1,n
DO i=1,m
rr(i,j,k,1)=rr1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
tt(i,j,k,1)=tt1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
td(i,j,k,1)=td1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
rs(i,j,k,1)=rs1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
ts(i,j,k,1)=ts1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
rr(i,j,k,2)=rr2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
tt(i,j,k,2)=tt2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
td(i,j,k,2)=td2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
rs(i,j,k,2)=rs2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
ts(i,j,k,2)=ts2t(i,j)
END DO
END DO
END DO
!-----flux calculations
CALL cldflx
(m,n,np,ict,icb,cc,rr,tt,td,rs,ts, &
fclr,fall,fsdir,fsdif, &
tem2d1,tem2d2,tem2d3,tem2d4,tem2d5, &
tem3d, tem5d1,tem5d2,tem5d3,tem5d4,tem5d5)
DO k= 1, np+1
DO j= 1, n
DO i= 1, m
flx(i,j,k) = flx(i,j,k)+fall(i,j,k)*hk(ib,ik)
END DO
END DO
DO j= 1, n
DO i= 1, m
flc(i,j,k) = flc(i,j,k)+fclr(i,j,k)*hk(ib,ik)
END DO
END DO
END DO
! write (6,'(a/2a3,2a15)') 'Flux for IR',
! : 'ib','k','dflxIR','flxIR'
! DO k=1,np
! write (6,'(2i3,2e15.7)')
! : ib,k,fall(2,2,k+1)-fall(2,2,k),fall(2,2,k)
! ENDDO
DO j= 1, n
DO i= 1, m
fdirir(i,j) = fdirir(i,j)+fsdir(i,j)*hk(ib,ik)
fdifir(i,j) = fdifir(i,j)+fsdif(i,j)*hk(ib,ik)
END DO
END DO
END DO
END DO
RETURN
END SUBROUTINE solir
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SOLUV ######
!###### ######
!###### Developed by ######
!###### ######
!###### Goddard Cumulus Ensemble Modeling Group, NASA ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE soluv(idim,jdim, & 1,5
m,n,np,oh,dp,taucldi,taucldl,tauclb,tauclf,reffi,reffl, &
ict,icb,fcld,cc,taual,csm,rsuvbm,rsuvdf, &
flx,flc,fdirpar,fdifpar, &
fsdir,fsdif,asyclt, &
rr1t,tt1t,td1t,rs1t,ts1t, &
rr2t,tt2t,td2t,rs2t,ts2t, &
asycl,fall,fclr, &
td,rr,tt,rs,ts, &
tem2d1,tem2d2,tem2d3,tem2d4,tem2d5, &
tem3d, &
tem5d1,tem5d2,tem5d3,tem5d4,tem5d5)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate solar fluxes in the uv+visible region. the spectrum is
! grouped into 8 bands. (See original comments.)
!
!-----------------------------------------------------------------------
!
! AUTHOR: (a) Radiative Transfer Model: M.-D. Chou and M. Suarez
! (b) Cloud Optics:Tao, Lang, Simpson, Sui, Ferrier and
! Chou (1996)
!
! MODIFICATION HISTORY:
!
! 03/15/1996 (Yuhe Liu)
! Adapted the original code and formatted it in accordance with the
! ARPS coding standard.
!
! 12/07/1998 (Keith Brewster)
! Modified values of ssaal and asymal in data statement.
!
!-----------------------------------------------------------------------
!
! ORIGINAL COMMENTS:
!
!************************************************************************
! compute solar fluxes in the uv+visible region. the spectrum is
! grouped into 8 bands:
!
! Band Micrometer
!
! UV-C 1. .175 - .225
! 2. .225 - .245
! .260 - .280
! 3. .245 - .260
!
! UV-B 4. .280 - .295
! 5. .295 - .310
! 6. .310 - .320
!
! UV-A 7. .320 - .400
!
! PAR 8. .400 - .700
!
!----- Input parameters: units size
!
! number of soundings in zonal direction (m) n/d 1
! number of soundings in meridional direction (n) n/d 1
! maximum number of soundings in n/d 1
! meridional direction (ndim)
! number of atmospheric layers (np) n/d 1
! layer ozone content (oh) (cm-atm)stp m*n*np
! layer pressure thickness (dp) mb m*n*np
! cloud optical thickness (taucld) n/d m*ndim*np*2
! index 1 for ice paticles
! index 2 for liquid particles
! scaled cloud optical thickness n/d m*n*np
! for beam radiation (tauclb)
! scaled cloud optical thickness n/d m*n*np
! for diffuse radiation (tauclf)
! effective cloud-particle size (reff) micrometer m*ndim*np*2
! index 1 for ice paticles
! index 2 for liquid particles
! level indiex separating high and n/d m*n
! middle clouds (ict)
! level indiex separating middle and n/d m*n
! low clouds (icb)
! cloud amount (fcld) fraction m*ndim*np
! cloud amounts of high, middle, and n/d m*n*3
! low clouds (cc)
! aerosol optical thickness (taual) n/d m*ndim*np
! cosecant of the solar zenith angle (csm) n/d m*n
! uv+par surface albedo for beam fraction m*ndim
! radiation (rsuvbm)
! uv+par surface albedo for diffuse fraction m*ndim
! radiation (rsuvdf)
!
!----- output (updated) parameters:
!
! all-sky net downward flux (flx) fraction m*ndim*(np+1)
! clear-sky net downward flux (flc) fraction m*ndim*(np+1)
! all-sky direct downward par flux at
! the surface (fdirpar) fraction m*ndim
! all-sky diffuse downward par flux at
! the surface (fdifpar) fraction m*ndim
!
!----- note: the following parameters must be specified by users:
!
! aerosol single scattering albedo (ssaal) n/d 1
! aerosol asymmetry factor (asyal) n/d 1
!
!
!***********************************************************************
!
!fpp$ expand (deledd)
!fpp$ expand (sagpol)
!dir$ inline always deledd,sagpol
!*$* inline routine (deledd,sagpol)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!-----input parameters
INTEGER :: idim,jdim
INTEGER :: m,n,np,ict,icb
REAL :: taucldi(idim,jdim,np)
REAL :: taucldl(idim,jdim,np)
REAL :: reffi(idim,jdim,np)
REAL :: reffl(idim,jdim,np)
REAL :: fcld(idim,jdim,np)
REAL :: taual(idim,jdim,np)
REAL :: rsuvbm(idim,jdim)
REAL :: rsuvdf(idim,jdim)
REAL :: tauclb(m,n,np)
REAL :: tauclf(m,n,np)
REAL :: cc(m,n,3)
REAL :: oh(m,n,np)
REAL :: dp(m,n,np)
REAL :: csm(m,n)
!-----output (updated) parameter
REAL :: flx(idim,jdim,np+1)
REAL :: flc(idim,jdim,np+1)
REAL :: fdirpar(idim,jdim)
REAL :: fdifpar(idim,jdim)
!-----static parameters
INTEGER :: nband
PARAMETER (nband=8)
REAL :: hk(nband)
REAL :: xk(nband)
REAL :: ry(nband)
REAL :: asyal(nband)
REAL :: ssaal(nband)
REAL :: aig(3)
REAL :: awg(3)
!-----temporary array
REAL :: fsdir(m,n)
REAL :: fsdif(m,n)
REAL :: asyclt(m,n)
REAL :: rr1t(m,n)
REAL :: tt1t(m,n)
REAL :: td1t(m,n)
REAL :: rs1t(m,n)
REAL :: ts1t(m,n)
REAL :: rr2t(m,n)
REAL :: tt2t(m,n)
REAL :: td2t(m,n)
REAL :: rs2t(m,n)
REAL :: ts2t(m,n)
REAL :: asycl(m,n,np)
REAL :: fall(m,n,np+1)
REAL :: fclr(m,n,np+1)
REAL :: td(m,n,np+1,2)
REAL :: rr(m,n,np+1,2)
REAL :: tt(m,n,np+1,2)
REAL :: rs(m,n,np+1,2)
REAL :: ts(m,n,np+1,2)
!-----temporary arrays used in subroutine cldflx
REAL :: tem2d1(m,n)
REAL :: tem2d2(m,n)
REAL :: tem2d3(m,n)
REAL :: tem2d4(m,n)
REAL :: tem2d5(m,n)
REAL :: tem3d (m,n,np+1)
REAL :: tem5d1(m,n,np+1,2,2)
REAL :: tem5d2(m,n,np+1,2,2)
REAL :: tem5d3(m,n,np+1,2,2)
REAL :: tem5d4(m,n,np+1,2,2)
REAL :: tem5d5(m,n,np+1,2,2)
!-----temporary variables
INTEGER :: i,j,k,ib
REAL :: taurs,tauoz,tausto,ssatau,asysto,tauto,ssato,asyto
REAL :: taux,reff1,reff2,g1,g2
!-----hk is the fractional extra-terrestrial solar flux.
! the sum of hk is 0.47074.
DATA hk/.00057, .00367, .00083, .00417, &
.00600, .00556, .05913, .39081/
!-----xk is the ozone absorption coefficient. unit: /(cm-atm)stp
DATA xk /30.47, 187.2, 301.9, 42.83, &
7.09, 1.25, 0.0345, 0.0539/
!-----ry is the extinction coefficient for Rayleigh scattering.
! unit: /mb.
DATA ry /.00604, .00170, .00222, .00132, &
.00107, .00091, .00055, .00012/
!-----aerosol single-scattering albedo and asymmetry factor
! data ssaal,asyal/nband*0.999,nband*0.850/
DATA ssaal,asyal/nband*0.960,nband*0.700/
!-----coefficients for computing the asymmetry factor of ice clouds
! from asycl=aig(*,1)+aig(*,2)*reff+aig(*,3)*reff**2
DATA aig/.74625000,.00105410,-.00000264/
!-----coefficients for computing the asymmetry factor of liquid
! clouds from asycl=awg(*,1)+awg(*,2)*reff+awg(*,3)*reff**2
DATA awg/.82562000,.00529000,-.00014866/
!-----initialize surface reflectances and transmittances
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO j= 1, n
DO i= 1, m
rr(i,j,np+1,1)=rsuvbm(i,j)
rr(i,j,np+1,2)=rsuvdf(i,j)
rs(i,j,np+1,1)=rsuvbm(i,j)
rs(i,j,np+1,2)=rsuvdf(i,j)
td(i,j,np+1,1)=0.0
td(i,j,np+1,2)=0.0
tt(i,j,np+1,1)=0.0
tt(i,j,np+1,2)=0.0
ts(i,j,np+1,1)=0.0
ts(i,j,np+1,2)=0.0
END DO
END DO
!-----compute cloud asymmetry factor for a mixture of
! liquid and ice particles. unit of reff is micrometers.
DO k= 1, np
DO j= 1, n
DO i= 1, m
asyclt(i,j)=1.0
taux=taucldi(i,j,k)+taucldl(i,j,k)
IF (taux > 0.05 .AND. fcld(i,j,k) > 0.01) THEN
reff1=MIN(reffi(i,j,k),130.)
reff2=MIN(reffl(i,j,k),20.0)
g1=(aig(1)+(aig(2)+aig(3)*reff1)*reff1)*taucldi(i,j,k)
g2=(awg(1)+(awg(2)+awg(3)*reff2)*reff2)*taucldl(i,j,k)
asyclt(i,j)=(g1+g2)/taux
END IF
END DO
END DO
DO j=1,n
DO i=1,m
asycl(i,j,k)=asyclt(i,j)
END DO
END DO
END DO
!-----integration over spectral bands
DO ib=1,nband
DO k= 1, np
DO j= 1, n
DO i= 1, m
!-----compute ozone and rayleigh optical thicknesses
taurs=ry(ib)*dp(i,j,k)
tauoz=xk(ib)*oh(i,j,k)
!-----compute total optical thickness, single scattering albedo,
! and asymmetry factor
tausto=taurs+tauoz+taual(i,j,k)+1.0E-8
ssatau=ssaal(ib)*taual(i,j,k)+taurs
asysto=asyal(ib)*ssaal(ib)*taual(i,j,k)
!-----compute reflectance and transmittance for cloudless layers
tauto=tausto
ssato=ssatau/tauto+1.0E-8
ssato=MIN(ssato,0.999999)
asyto=asysto/(ssato*tauto)
CALL deledd
(tauto,ssato,asyto,csm(i,j), &
rr1t(i,j),tt1t(i,j),td1t(i,j))
CALL sagpol
(tauto,ssato,asyto,rs1t(i,j),ts1t(i,j))
!-----compute reflectance and transmittance for cloud layers
IF (tauclb(i,j,k) < 0.01) THEN
rr2t(i,j)=rr1t(i,j)
tt2t(i,j)=tt1t(i,j)
td2t(i,j)=td1t(i,j)
rs2t(i,j)=rs1t(i,j)
ts2t(i,j)=ts1t(i,j)
ELSE
tauto=tausto+tauclb(i,j,k)
ssato=(ssatau+tauclb(i,j,k))/tauto+1.0E-8
ssato=MIN(ssato,0.999999)
asyto=(asysto+asycl(i,j,k)*tauclb(i,j,k))/(ssato*tauto)
CALL deledd
(tauto,ssato,asyto,csm(i,j), &
rr2t(i,j),tt2t(i,j),td2t(i,j))
tauto=tausto+tauclf(i,j,k)
ssato=(ssatau+tauclf(i,j,k))/tauto+1.0E-8
ssato=MIN(ssato,0.999999)
asyto=(asysto+asycl(i,j,k)*tauclf(i,j,k))/(ssato*tauto)
CALL sagpol
(tauto,ssato,asyto,rs2t(i,j),ts2t(i,j))
END IF
END DO
END DO
DO j=1,n
DO i=1,m
rr(i,j,k,1)=rr1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
tt(i,j,k,1)=tt1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
td(i,j,k,1)=td1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
rs(i,j,k,1)=rs1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
ts(i,j,k,1)=ts1t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
rr(i,j,k,2)=rr2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
tt(i,j,k,2)=tt2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
td(i,j,k,2)=td2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
rs(i,j,k,2)=rs2t(i,j)
END DO
END DO
DO j=1,n
DO i=1,m
ts(i,j,k,2)=ts2t(i,j)
END DO
END DO
END DO
!-----flux calculations
CALL cldflx
(m,n,np,ict,icb,cc,rr,tt,td,rs,ts, &
fclr,fall,fsdir,fsdif, &
tem2d1,tem2d2,tem2d3,tem2d4,tem2d5, &
tem3d, tem5d1,tem5d2,tem5d3,tem5d4,tem5d5)
DO k= 1, np+1
DO j= 1, n
DO i= 1, m
flx(i,j,k)=flx(i,j,k)+fall(i,j,k)*hk(ib)
END DO
END DO
DO j= 1, n
DO i= 1, m
flc(i,j,k)=flc(i,j,k)+fclr(i,j,k)*hk(ib)
END DO
END DO
END DO
! write (6,'(a/2a3,2a15)') 'Flux for PAR',
! : 'ib','k','dflxpa','flxpa'
! DO k=1,np
! write (6,'(2i3,2e15.7)')
! : ib,k,fall(2,2,k+1)-fall(2,2,k),fall(2,2,k)
! ENDDO
IF(ib == 8) THEN
DO j=1,n
DO i=1,m
fdirpar(i,j)=fsdir(i,j)*hk(ib)
fdifpar(i,j)=fsdif(i,j)*hk(ib)
END DO
END DO
END IF
END DO
RETURN
END SUBROUTINE soluv
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CLDSCALE ######
!###### ######
!###### Developed by ######
!###### ######
!###### Goddard Cumulus Ensemble Modeling Group, NASA ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE cldscale(idim,jdim, & 1
m,n,np,cosz,fcld,taucldi,taucldl,ict,icb, &
cc,tauclb,tauclf)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the covers of high, middle, and low clouds and scales
! the cloud optical thickness.
!
!-----------------------------------------------------------------------
!
! AUTHOR: (a) Radiative Transfer Model: M.-D. Chou and M. Suarez
! (b) Cloud Optics:Tao, Lang, Simpson, Sui, Ferrier and
! Chou (1996)
!
! MODIFICATION:
!
! 03/11/1996 (Yuhe Liu)
! Formatted code to ARPS standard format
!
!-----------------------------------------------------------------------
!
! ORIGINAL COMMENTS:
!
!********************************************************************
!
! This subroutine computes the covers of high, middle, and
! low clouds and scales the cloud optical thickness.
!
! To simplify calculations in a cloudy atmosphere, clouds are
! grouped into high, middle and low clouds separated by the levels
! ict and icb (level 1 is the top of the atmosphere).
!
! Within each of the three groups, clouds are assumed maximally
! overlapped, and the cloud cover (cc) of a group is the maximum
! cloud cover of all the layers in the group. The optical thickness
! (taucld) of a given layer is then scaled to new values (tauclb and
! tauclf) so that the layer reflectance corresponding to the cloud
! cover cc is the same as the original reflectance with optical
! thickness taucld and cloud cover fcld.
!
!---input parameters
!
! number of grid intervals in zonal direction (m)
! number of grid intervals in meridional direction (n)
! maximum number of grid intervals in meridional direction (ndim)
! number of atmospheric layers (np)
! cosine of the solar zenith angle (cosz)
! fractional cloud cover (fcld)
! cloud optical thickness (taucld)
! index separating high and middle clouds (ict)
! index separating middle and low clouds (icb)
!
!---output parameters
!
! fractional cover of high, middle, and low clouds (cc)
! scaled cloud optical thickness for beam radiation (tauclb)
! scaled cloud optical thickness for diffuse radiation (tauclf)
!
!********************************************************************
!
!-----------------------------------------------------------------------
!
! Variable declarations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!-----input parameters
INTEGER :: idim,jdim
INTEGER :: m,n,np,ict,icb
REAL :: cosz(idim,jdim)
REAL :: fcld(idim,jdim,np)
REAL :: taucldi(idim,jdim,np)
REAL :: taucldl(idim,jdim,np)
!-----output parameters
REAL :: cc(m,n,3)
REAL :: tauclb(m,n,np)
REAL :: tauclf(m,n,np)
!-----temporary variables
INTEGER :: i,j,k,im,it,ia,kk
REAL :: fm,ft,fa,xai,taux
!-----pre-computed table
INTEGER :: nm,nt,na
PARAMETER (nm=11,nt=9,na=11)
REAL :: dm,dt,da,t1,caib(nm,nt,na),caif(nt,na)
PARAMETER (dm=0.1,dt=0.30103,da=0.1,t1=-0.9031)
!-----include the pre-computed table for cai
! include "cai.dat"
! save caib,caif
COMMON /radtab004/ caib,caif
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----clouds within each of the high, middle, and low clouds are
! assumed maximally overlapped, and the cloud cover (cc)
! for a group is the maximum cloud cover of all the layers
! in the group
DO j=1,n
DO i=1,m
cc(i,j,1)=0.0
cc(i,j,2)=0.0
cc(i,j,3)=0.0
END DO
END DO
DO k=1,ict-1
DO j=1,n
DO i=1,m
cc(i,j,1)=MAX(cc(i,j,1),fcld(i,j,k))
END DO
END DO
END DO
DO k=ict,icb-1
DO j=1,n
DO i=1,m
cc(i,j,2)=MAX(cc(i,j,2),fcld(i,j,k))
END DO
END DO
END DO
DO k=icb,np
DO j=1,n
DO i=1,m
cc(i,j,3)=MAX(cc(i,j,3),fcld(i,j,k))
END DO
END DO
END DO
!-----scale the cloud optical thickness.
! taucldi(i,j,k) is the optical thickness for ice particles, and
! taucldl(i,j,k) is the optical thickness for liquid particles.
DO k=1,np
IF(k < ict) THEN
kk=1
ELSE IF(k >= ict .AND. k < icb) THEN
kk=2
ELSE
kk=3
END IF
DO j=1,n
DO i=1,m
tauclb(i,j,k) = 0.0
tauclf(i,j,k) = 0.0
taux=taucldi(i,j,k)+taucldl(i,j,k)
IF (taux > 0.05 .AND. fcld(i,j,k) > 0.01) THEN
!-----normalize cloud cover
fa=fcld(i,j,k)/cc(i,j,kk)
!-----table look-up
taux=MIN(taux,32.)
fm=cosz(i,j)/dm
ft=(LOG10(taux)-t1)/dt
fa=fa/da
im=INT(fm+1.5)
it=INT(ft+1.5)
ia=INT(fa+1.5)
im=MAX(im,2)
it=MAX(it,2)
ia=MAX(ia,2)
im=MIN(im,nm-1)
it=MIN(it,nt-1)
ia=MIN(ia,na-1)
fm=fm-FLOAT(im-1)
ft=ft-FLOAT(it-1)
fa=fa-FLOAT(ia-1)
!-----scale cloud optical thickness for beam radiation.
! the scaling factor, xai, is a function of the solar zenith
! angle, optical thickness, and cloud cover.
xai= (-caib(im-1,it,ia)*(1.-fm)+ &
caib(im+1,it,ia)*(1.+fm))*fm*.5+caib(im,it,ia)*(1.-fm*fm)
xai=xai+(-caib(im,it-1,ia)*(1.-ft)+ &
caib(im,it+1,ia)*(1.+ft))*ft*.5+caib(im,it,ia)*(1.-ft*ft)
xai=xai+(-caib(im,it,ia-1)*(1.-fa)+ &
caib(im,it,ia+1)*(1.+fa))*fa*.5+caib(im,it,ia)*(1.-fa*fa)
xai= xai-2.*caib(im,it,ia)
xai=MAX(xai,0.0)
tauclb(i,j,k) = taux*xai
!-----scale cloud optical thickness for diffuse radiation.
! the scaling factor, xai, is a function of the cloud optical
! thickness and cover but not the solar zenith angle.
xai= (-caif(it-1,ia)*(1.-ft)+ &
caif(it+1,ia)*(1.+ft))*ft*.5+caif(it,ia)*(1.-ft*ft)
xai=xai+(-caif(it,ia-1)*(1.-fa)+ &
caif(it,ia+1)*(1.+fa))*fa*.5+caif(it,ia)*(1.-fa*fa)
xai= xai-caif(it,ia)
xai=MAX(xai,0.0)
tauclf(i,j,k) = taux*xai
END IF
END DO
END DO
END DO
RETURN
END SUBROUTINE cldscale
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE FLXCO2 ######
!###### ######
!###### Developed by ######
!###### ######
!###### Goddard Cumulus Ensemble Modeling Group, NASA ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE flxco2(m,n,np,swc,swh,csm,df) 1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the reduction of clear-sky downward solar flux
! due to co2 absorption.
!
!-----------------------------------------------------------------------
!
! AUTHOR: (a) Radiative Transfer Model: M.-D. Chou and M. Suarez
! (b) Cloud Optics:Tao, Lang, Simpson, Sui, Ferrier and
! Chou (1996)
!
! MODIFICATION HISTORY:
!
! 03/15/1996 (Yuhe Liu)
! Adopted the original code and formatted it in accordance with the
! ARPS coding standard.
!
!-----------------------------------------------------------------------
!
! ORIGINAL COMMENTS:
!
!*****************************************************************
!
!-----compute the reduction of clear-sky downward solar flux
! due to co2 absorption.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!-----input parameters
INTEGER :: m,n,np
REAL :: csm(m,n)
REAL :: swc(m,n,np+1)
REAL :: swh(m,n,np+1)
REAL :: cah(22,19)
!-----output (undated) parameter
REAL :: df(m,n,np+1)
!-----temporary variables
INTEGER :: i,j,k,ic,iw
REAL :: xx,CLOG,wlog,dc,dw,x1,x2,y2
!********************************************************************
!-----include co2 look-up table
!
! include "cah.dat"
! save cah
COMMON /radtab005/ cah
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!********************************************************************
!-----table look-up for the reduction of clear-sky solar
! radiation due to co2. The fraction 0.0343 is the
! extraterrestrial solar flux in the co2 bands.
! write (6,'(a/3a3,7a10)') 'Flux reduction due to co2, i=j=3',
! :'k','ic','iw','x1','y2','x1-y2','ddf','df','swc','swh'
DO k= 2, np+1
DO j= 1, n
DO i= 1, m
xx=1./.3
CLOG=LOG10(swc(i,j,k)*csm(i,j))
wlog=LOG10(swh(i,j,k)*csm(i,j))
ic=INT( (CLOG+3.15)*xx+1.)
iw=INT( (wlog+4.15)*xx+1.)
IF(ic < 2)ic=2
IF(iw < 2)iw=2
IF(ic > 22)ic=22
IF(iw > 19)iw=19
dc=CLOG-FLOAT(ic-2)*.3+3.
dw=wlog-FLOAT(iw-2)*.3+4.
x1=cah(1,iw-1)+(cah(1,iw)-cah(1,iw-1))*xx*dw
x2=cah(ic-1,iw-1)+(cah(ic-1,iw)-cah(ic-1,iw-1))*xx*dw
y2=x2+(cah(ic,iw-1)-cah(ic-1,iw-1))*xx*dc
IF (x1 < y2) x1=y2
df(i,j,k)=df(i,j,k)+0.0343*(x1-y2)
END DO
END DO
! write (6,'(3i3,7f10.5)')
! : k,ic,iw,x1,y2,x1-y2,
! : df(3,3,k)-df(3,3,k-1),df (3,3,k),swc(3,3,k),swh(3,3,k)
END DO
RETURN
END SUBROUTINE flxco2
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CLDFLX ######
!###### ######
!###### Developed by ######
!###### ######
!###### Goddard Cumulus Ensemble Modeling Group, NASA ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE cldflx(m,n,np,ict,icb,cc,rr,tt,td,rs,ts, & 2
fclr,fall,fsdir,fsdif, &
ch,cm,ct,fdndir,fdndif, &
flxdn, &
rra,tta,tda,rsa,rxa)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate upward and downward fluxes using a two-stream adding
! method.
!
!-----------------------------------------------------------------------
!
! AUTHOR: (a) Radiative Transfer Model: M.-D. Chou and M. Suarez
! (b) Cloud Optics:Tao, Lang, Simpson, Sui, Ferrier and
! Chou (1996)
!
! MODIFICATION HISTORY:
!
! 03/15/1996 (Yuhe Liu)
! Adopted the original code and formatted it in accordance with the
! ARPS coding standard.
!
!-----------------------------------------------------------------------
!
! ORIGINAL COMMENTS:
!
!*******************************************************************
! compute upward and downward fluxes using a two-stream adding method
! following equations (3)-(5) of Chou (1992, JAS).
!
! clouds are grouped into high, middle, and low clouds which are
! assumed randomly overlapped. It involves eight sets of calculations.
! In each set of calculations, each atmospheric layer is homogeneous,
! either with clouds or without clouds.
! input parameters:
! m: number of soundings in zonal direction
! n: number of soundings in meridional direction
! np: number of atmospheric layers
! ict: the level separating high and middle clouds
! icb: the level separating middle and low clouds
! cc: effective cloud covers for high, middle and low clouds
! tt: diffuse transmission of a layer illuminated by beam radiation
! td: direct beam tranmssion
! ts: transmission of a layer illuminated by diffuse radiation
! rr: reflection of a layer illuminated by beam radiation
! rs: reflection of a layer illuminated by diffuse radiation
!
! output parameters:
! fclr: clear-sky flux (downward minus upward)
! fall: all-sky flux (downward minus upward)
! fdndir: surface direct downward flux
! fdndif: surface diffuse downward flux
!*********************************************************************c
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!-----input parameters
INTEGER :: m,n,np,ict,icb
REAL :: rr(m,n,np+1,2)
REAL :: tt(m,n,np+1,2)
REAL :: td(m,n,np+1,2)
REAL :: rs(m,n,np+1,2)
REAL :: ts(m,n,np+1,2)
REAL :: cc(m,n,3)
!-----output parameters
REAL :: fclr(m,n,np+1)
REAL :: fall(m,n,np+1)
REAL :: fsdir(m,n)
REAL :: fsdif(m,n)
!-----temporary array
REAL :: ch(m,n)
REAL :: cm(m,n)
REAL :: ct(m,n)
REAL :: fdndir(m,n)
REAL :: fdndif(m,n)
REAL :: flxdn(m,n,np+1)
REAL :: rra(m,n,np+1,2,2)
REAL :: tta(m,n,np+1,2,2)
REAL :: tda(m,n,np+1,2,2)
REAL :: rsa(m,n,np+1,2,2)
REAL :: rxa(m,n,np+1,2,2)
!-----temporary variables
INTEGER :: i,j,k,ih,im,is
REAL :: fupdif
REAL :: denm,xx
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----initialize all-sky flux (fall) and surface downward fluxes
DO k=1,np+1
DO j=1,n
DO i=1,m
fall(i,j,k)=0.0
END DO
END DO
END DO
DO j=1,n
DO i=1,m
fsdir(i,j)=0.0
fsdif(i,j)=0.0
END DO
END DO
!-----compute transmittances and reflectances for a composite of
! layers. layers are added one at a time, going down from the top.
! tda is the composite transmittance illuminated by beam radiation
! tta is the composite diffuse transmittance illuminated by
! beam radiation
! rsa is the composite reflectance illuminated from below
! by diffuse radiation
! tta and rsa are computed from eqs. (4b) and (3b) of Chou
!-----for high clouds. indices 1 and 2 denote clear and cloudy
! situations, respectively.
DO ih=1,2
DO j= 1, n
DO i= 1, m
tda(i,j,1,ih,1)=td(i,j,1,ih)
tta(i,j,1,ih,1)=tt(i,j,1,ih)
rsa(i,j,1,ih,1)=rs(i,j,1,ih)
tda(i,j,1,ih,2)=td(i,j,1,ih)
tta(i,j,1,ih,2)=tt(i,j,1,ih)
rsa(i,j,1,ih,2)=rs(i,j,1,ih)
END DO
END DO
DO k= 2, ict-1
DO j= 1, n
DO i= 1, m
denm = ts(i,j,k,ih)/( 1.-rsa(i,j,k-1,ih,1)*rs(i,j,k,ih))
tda(i,j,k,ih,1)= tda(i,j,k-1,ih,1)*td(i,j,k,ih)
tta(i,j,k,ih,1)= tda(i,j,k-1,ih,1)*tt(i,j,k,ih) &
+(tda(i,j,k-1,ih,1)*rr(i,j,k,ih) &
*rsa(i,j,k-1,ih,1)+tta(i,j,k-1,ih,1))*denm
rsa(i,j,k,ih,1)= rs(i,j,k,ih)+ts(i,j,k,ih) &
*rsa(i,j,k-1,ih,1)*denm
tda(i,j,k,ih,2)= tda(i,j,k,ih,1)
tta(i,j,k,ih,2)= tta(i,j,k,ih,1)
rsa(i,j,k,ih,2)= rsa(i,j,k,ih,1)
END DO
END DO
END DO
!-----for middle clouds
DO im=1,2
DO k= ict, icb-1
DO j= 1, n
DO i= 1, m
denm = ts(i,j,k,im)/( 1.-rsa(i,j,k-1,ih,im)*rs(i,j,k,im))
tda(i,j,k,ih,im)= tda(i,j,k-1,ih,im)*td(i,j,k,im)
tta(i,j,k,ih,im)= tda(i,j,k-1,ih,im)*tt(i,j,k,im) &
+(tda(i,j,k-1,ih,im)*rr(i,j,k,im) &
*rsa(i,j,k-1,ih,im)+tta(i,j,k-1,ih,im))*denm
rsa(i,j,k,ih,im)= rs(i,j,k,im)+ts(i,j,k,im) &
*rsa(i,j,k-1,ih,im)*denm
END DO
END DO
END DO
END DO
END DO
!-----layers are added one at a time, going up from the surface.
! rra is the composite reflectance illuminated by beam radiation
! rxa is the composite reflectance illuminated from above
! by diffuse radiation
! rra and rxa are computed from eqs. (4a) and (3a) of Chou
!-----for the low clouds
DO is=1,2
DO j= 1, n
DO i= 1, m
rra(i,j,np+1,1,is)=rr(i,j,np+1,is)
rxa(i,j,np+1,1,is)=rs(i,j,np+1,is)
rra(i,j,np+1,2,is)=rr(i,j,np+1,is)
rxa(i,j,np+1,2,is)=rs(i,j,np+1,is)
END DO
END DO
DO k=np,icb,-1
DO j= 1, n
DO i= 1, m
denm=ts(i,j,k,is)/( 1.-rs(i,j,k,is)*rxa(i,j,k+1,1,is) )
rra(i,j,k,1,is)=rr(i,j,k,is)+(td(i,j,k,is) &
*rra(i,j,k+1,1,is)+tt(i,j,k,is)*rxa(i,j,k+1,1,is))*denm
rxa(i,j,k,1,is)= rs(i,j,k,is)+ts(i,j,k,is) &
*rxa(i,j,k+1,1,is)*denm
rra(i,j,k,2,is)=rra(i,j,k,1,is)
rxa(i,j,k,2,is)=rxa(i,j,k,1,is)
END DO
END DO
END DO
!-----for middle clouds
DO im=1,2
DO k= icb-1,ict,-1
DO j= 1, n
DO i= 1, m
denm=ts(i,j,k,im)/( 1.-rs(i,j,k,im)*rxa(i,j,k+1,im,is) )
rra(i,j,k,im,is)= rr(i,j,k,im)+(td(i,j,k,im) &
*rra(i,j,k+1,im,is)+tt(i,j,k,im)*rxa(i,j,k+1,im,is))*denm
rxa(i,j,k,im,is)= rs(i,j,k,im)+ts(i,j,k,im) &
*rxa(i,j,k+1,im,is)*denm
END DO
END DO
END DO
END DO
END DO
!-----integration over eight sky situations.
! ih, im, is denotes high, middle and low cloud groups.
DO ih=1,2
!-----clear portion
IF(ih == 1) THEN
DO j=1,n
DO i=1,m
ch(i,j)=1.0-cc(i,j,1)
END DO
END DO
ELSE
!-----cloudy portion
DO j=1,n
DO i=1,m
ch(i,j)=cc(i,j,1)
END DO
END DO
END IF
DO im=1,2
!-----clear portion
IF(im == 1) THEN
DO j=1,n
DO i=1,m
cm(i,j)=ch(i,j)*(1.0-cc(i,j,2))
END DO
END DO
ELSE
!-----cloudy portion
DO j=1,n
DO i=1,m
cm(i,j)=ch(i,j)*cc(i,j,2)
END DO
END DO
END IF
DO is=1,2
!-----clear portion
IF(is == 1) THEN
DO j=1,n
DO i=1,m
ct(i,j)=cm(i,j)*(1.0-cc(i,j,3))
END DO
END DO
ELSE
!-----cloudy portion
DO j=1,n
DO i=1,m
ct(i,j)=cm(i,j)*cc(i,j,3)
END DO
END DO
END IF
!-----add one layer at a time, going down.
DO k= icb, np
DO j= 1, n
DO i= 1, m
denm = ts(i,j,k,is)/( 1.-rsa(i,j,k-1,ih,im)*rs(i,j,k,is) )
tda(i,j,k,ih,im)= tda(i,j,k-1,ih,im)*td(i,j,k,is)
tta(i,j,k,ih,im)= tda(i,j,k-1,ih,im)*tt(i,j,k,is) &
+(tda(i,j,k-1,ih,im)*rr(i,j,k,is) &
*rsa(i,j,k-1,ih,im)+tta(i,j,k-1,ih,im))*denm
rsa(i,j,k,ih,im)= rs(i,j,k,is)+ts(i,j,k,is) &
*rsa(i,j,k-1,ih,im)*denm
END DO
END DO
END DO
!-----add one layer at a time, going up.
DO k= ict-1,1,-1
DO j= 1, n
DO i= 1, m
denm =ts(i,j,k,ih)/(1.-rs(i,j,k,ih)*rxa(i,j,k+1,im,is))
rra(i,j,k,im,is)= rr(i,j,k,ih)+(td(i,j,k,ih) &
*rra(i,j,k+1,im,is)+tt(i,j,k,ih)*rxa(i,j,k+1,im,is))*denm
rxa(i,j,k,im,is)= rs(i,j,k,ih)+ts(i,j,k,ih) &
*rxa(i,j,k+1,im,is)*denm
END DO
END DO
END DO
!-----compute fluxes following eq (5) of Chou (1992)
! fdndir is the direct downward flux
! fdndif is the diffuse downward flux
! fupdif is the diffuse upward flux
DO k=2,np+1
DO j=1, n
DO i=1, m
denm= 1./(1.- rxa(i,j,k,im,is)*rsa(i,j,k-1,ih,im))
fdndir(i,j)= tda(i,j,k-1,ih,im)
xx = tda(i,j,k-1,ih,im)*rra(i,j,k,im,is)
fdndif(i,j)= (xx*rsa(i,j,k-1,ih,im)+tta(i,j,k-1,ih,im))*denm
fupdif= (xx+tta(i,j,k-1,ih,im)*rxa(i,j,k,im,is))*denm
flxdn(i,j,k)=fdndir(i,j)+fdndif(i,j)-fupdif
END DO
END DO
END DO
DO j=1, n
DO i=1, m
flxdn(i,j,1)=1.0-rra(i,j,1,im,is)
END DO
END DO
!-----summation of fluxes over all (eight) sky situations.
DO k=1,np+1
DO j=1,n
DO i=1,m
IF(ih == 1 .AND. im == 1 .AND. is == 1) THEN
fclr(i,j,k)=flxdn(i,j,k)
END IF
fall(i,j,k)=fall(i,j,k)+flxdn(i,j,k)*ct(i,j)
END DO
END DO
END DO
DO j=1,n
DO i=1,m
fsdir(i,j)=fsdir(i,j)+fdndir(i,j)*ct(i,j)
fsdif(i,j)=fsdif(i,j)+fdndif(i,j)*ct(i,j)
END DO
END DO
END DO
END DO
END DO
RETURN
END SUBROUTINE cldflx