📄 radclwmx.f90
字号:
#include <misc.h>#include <params.h>subroutine radclwmx(lchnk ,ncol , & lwupcgs ,tnm ,qnm ,o3vmr , & pmid ,pint ,pmln ,piln , & n2o ,ch4 ,cfc11 ,cfc12 , & cld ,emis ,pmxrgn ,nmxrgn ,qrl , & flns ,flnt ,flnsc ,flntc ,flwds , & flut ,flutc )!----------------------------------------------------------------------- ! ! Purpose: ! Compute longwave radiation heating rates and boundary fluxes! ! Method: ! Uses broad band absorptivity/emissivity method to compute clear sky;! assumes randomly overlapped clouds with variable cloud emissivity to! include effects of clouds.!! Computes clear sky absorptivity/emissivity at lower frequency (in! general) than the model radiation frequency; uses previously computed! and stored values for efficiency!! Note: This subroutine contains vertical indexing which proceeds! from bottom to top rather than the top to bottom indexing! used in the rest of the model.! ! Author: B. Collins! !----------------------------------------------------------------------- use precision use ppgrid use radae, only: nbands, radems, radabs, radtpl, abstot_3d, absnxt_3d, emstot_3d implicit none integer pverp2,pverp3,pverp4 parameter (pverp2=pver+2,pverp3=pver+3,pverp4=pver+4) real(r8) cldmin parameter (cldmin = 1.0d-80)!------------------------------Commons----------------------------------#include <comctl.h>!-----------------------------------------------------------------------#include <crdcon.h>!------------------------------Arguments--------------------------------!! Input arguments! integer, intent(in) :: lchnk ! chunk identifier integer, intent(in) :: ncol ! number of atmospheric columns! maximally overlapped region.! 0->pmxrgn(i,1) is range of pmid for! 1st region, pmxrgn(i,1)->pmxrgn(i,2) for! 2nd region, etc integer, intent(in) :: nmxrgn(pcols) ! Number of maximally overlapped regions real(r8), intent(in) :: pmxrgn(pcols,pverp) ! Maximum values of pmid for each real(r8), intent(in) :: lwupcgs(pcols) ! Longwave up flux in CGS units!! Input arguments which are only passed to other routines! real(r8), intent(in) :: tnm(pcols,pver) ! Level temperature real(r8), intent(in) :: qnm(pcols,pver) ! Level moisture field real(r8), intent(in) :: o3vmr(pcols,pver) ! ozone volume mixing ratio real(r8), intent(in) :: pmid(pcols,pver) ! Level pressure real(r8), intent(in) :: pint(pcols,pverp) ! Model interface pressure real(r8), intent(in) :: pmln(pcols,pver) ! Ln(pmid) real(r8), intent(in) :: piln(pcols,pverp) ! Ln(pint) real(r8), intent(in) :: n2o(pcols,pver) ! nitrous oxide mass mixing ratio real(r8), intent(in) :: ch4(pcols,pver) ! methane mass mixing ratio real(r8), intent(in) :: cfc11(pcols,pver) ! cfc11 mass mixing ratio real(r8), intent(in) :: cfc12(pcols,pver) ! cfc12 mass mixing ratio real(r8), intent(in) :: cld(pcols,pver) ! Cloud cover real(r8), intent(in) :: emis(pcols,pver) ! Cloud emissivity!! Output arguments! real(r8), intent(out) :: qrl(pcols,pver) ! Longwave heating rate real(r8), intent(out) :: flns(pcols) ! Surface cooling flux real(r8), intent(out) :: flnt(pcols) ! Net outgoing flux real(r8), intent(out) :: flut(pcols) ! Upward flux at top of model real(r8), intent(out) :: flnsc(pcols) ! Clear sky surface cooing real(r8), intent(out) :: flntc(pcols) ! Net clear sky outgoing flux real(r8), intent(out) :: flutc(pcols) ! Upward clear-sky flux at top of model real(r8), intent(out) :: flwds(pcols) ! Down longwave flux at surface!!---------------------------Local variables-----------------------------! integer i ! Longitude index integer ilon ! Longitude index integer ii ! Longitude index integer iimx ! Longitude index (max overlap) integer k ! Level index integer k1 ! Level index integer k2 ! Level index integer k3 ! Level index integer km ! Level index integer km1 ! Level index integer km3 ! Level index integer km4 ! Level index integer irgn ! Index for max-overlap regions integer l ! Index for clouds to overlap integer l1 ! Index for clouds to overlap integer n ! Counter! real(r8) :: plco2(pcols,pverp) ! Path length co2 real(r8) :: plh2o(pcols,pverp) ! Path length h2o real(r8) tmp(pcols) ! Temporary workspace real(r8) tmp2(pcols) ! Temporary workspace real(r8) absbt(pcols) ! Downward emission at model top real(r8) plol(pcols,pverp) ! O3 pressure wghted path length real(r8) plos(pcols,pverp) ! O3 path length real(r8) co2em(pcols,pverp) ! Layer co2 normalized planck funct. derivative real(r8) co2eml(pcols,pver) ! Interface co2 normalized planck funct. deriv. real(r8) delt(pcols) ! Diff t**4 mid layer to top interface real(r8) delt1(pcols) ! Diff t**4 lower intrfc to mid layer real(r8) bk1(pcols) ! Absrptvty for vertical quadrature real(r8) bk2(pcols) ! Absrptvty for vertical quadrature real(r8) cldp(pcols,pverp) ! Cloud cover with extra layer real(r8) ful(pcols,pverp) ! Total upwards longwave flux real(r8) fsul(pcols,pverp) ! Clear sky upwards longwave flux real(r8) fdl(pcols,pverp) ! Total downwards longwave flux real(r8) fsdl(pcols,pverp) ! Clear sky downwards longwv flux real(r8) fclb4(pcols,-1:pver) ! Sig t**4 for cld bottom interfc real(r8) fclt4(pcols,0:pver) ! Sig t**4 for cloud top interfc real(r8) s(pcols,pverp,pverp) ! Flx integral sum real(r8) tplnka(pcols,pverp) ! Planck fnctn temperature real(r8) s2c(pcols,pverp) ! H2o cont amount real(r8) tcg(pcols,pverp) ! H2o-mass-wgted temp. (Curtis-Godson approx.) real(r8) w(pcols,pverp) ! H2o path real(r8) tplnke(pcols) ! Planck fnctn temperature real(r8) h2otr(pcols,pverp) ! H2o trnmsn for o3 overlap real(r8) co2t(pcols,pverp) ! Prs wghted temperature path real(r8) tint(pcols,pverp) ! Interface temperature real(r8) tint4(pcols,pverp) ! Interface temperature**4 real(r8) tlayr(pcols,pverp) ! Level temperature real(r8) tlayr4(pcols,pverp) ! Level temperature**4 real(r8) plh2ob(nbands,pcols,pverp)! Pressure weighted h2o path with ! Hulst-Curtis-Godson temp. factor ! for H2O bands real(r8) wb(nbands,pcols,pverp) ! H2o path length with ! Hulst-Curtis-Godson temp. factor ! for H2O bands real(r8) cld0 ! previous cloud amt (for max overlap) real(r8) cld1 ! next cloud amt (for max overlap) real(r8) emx(0:pverp) ! Emissivity factors (max overlap) real(r8) emx0 ! Emissivity factors for BCs (max overlap) real(r8) trans ! 1 - emis real(r8) asort(pver) ! 1 - cloud amounts to be sorted for max ovrlp. real(r8) atmp ! Temporary storage for sort when nxs = 2 real(r8) maxcld(pcols) ! Maximum cloud at any layer integer indx(pcols) ! index vector of gathered array values!!$ integer indxmx(pcols+1,pverp)! index vector of gathered array values integer indxmx(pcols,pverp)! index vector of gathered array values! (max overlap) integer nrgn(pcols) ! Number of max overlap regions at longitude integer npts ! number of values satisfying some criterion integer ncolmx(pverp) ! number of columns with clds in region integer kx1(pcols,pverp) ! Level index for top of max-overlap region integer kx2(pcols,0:pverp)! Level index for bottom of max-overlap region integer kxs(0:pverp,pcols,pverp)! Level indices for cld layers sorted by cld()! in descending order integer nxs(pcols,pverp) ! Number of cloudy layers between kx1 and kx2 integer nxsk ! Number of cloudy layers between (kx1/kx2)&k integer ksort(0:pverp) ! Level indices of cloud amounts to be sorted! for max ovrlp. calculation integer ktmp ! Temporary storage for sort when nxs = 2!! Pointer variables to 3d structures! real(r8), pointer :: abstot(:,:,:) real(r8), pointer :: absnxt(:,:,:) real(r8), pointer :: emstot(:,:)!! Trace gas variables! real(r8) ucfc11(pcols,pverp) ! CFC11 path length real(r8) ucfc12(pcols,pverp) ! CFC12 path length real(r8) un2o0(pcols,pverp) ! N2O path length real(r8) un2o1(pcols,pverp) ! N2O path length (hot band) real(r8) uch4(pcols,pverp) ! CH4 path length real(r8) uco211(pcols,pverp) ! CO2 9.4 micron band path length real(r8) uco212(pcols,pverp) ! CO2 9.4 micron band path length real(r8) uco213(pcols,pverp) ! CO2 9.4 micron band path length real(r8) uco221(pcols,pverp) ! CO2 10.4 micron band path length real(r8) uco222(pcols,pverp) ! CO2 10.4 micron band path length real(r8) uco223(pcols,pverp) ! CO2 10.4 micron band path length real(r8) bn2o0(pcols,pverp) ! pressure factor for n2o real(r8) bn2o1(pcols,pverp) ! pressure factor for n2o real(r8) bch4(pcols,pverp) ! pressure factor for ch4 real(r8) uptype(pcols,pverp) ! p-type continuum path length real(r8) abplnk1(14,pcols,pverp) ! non-nearest layer Plack factor real(r8) abplnk2(14,pcols,pverp) ! nearest layer factor!!!-----------------------------------------------------------------------!!! Set pointer variables! abstot => abstot_3d(:,:,:,lchnk) absnxt => absnxt_3d(:,:,:,lchnk) emstot => emstot_3d(:,:,lchnk)!! Calculate some temperatures needed to derive absorptivity and! emissivity, as well as some h2o path lengths! call radtpl(lchnk ,ncol , & tnm ,lwupcgs ,qnm ,pint ,plco2 ,plh2o , & tplnka ,s2c ,tcg ,w ,tplnke , & tint ,tint4 ,tlayr ,tlayr4 ,pmln , & piln ,plh2ob ,wb ) if (doabsems) then!! Compute ozone path lengths at frequency of a/e calculation.! call radoz2(lchnk ,ncol ,o3vmr ,pint ,plol ,plos, ntoplw )!! Compute trace gas path lengths! call trcpth(lchnk ,ncol , & tnm ,pint ,cfc11 ,cfc12 ,n2o , & ch4 ,qnm ,ucfc11 ,ucfc12 ,un2o0 , & un2o1 ,uch4 ,uco211 ,uco212 ,uco213 , & uco221 ,uco222 ,uco223 ,bn2o0 ,bn2o1 , & bch4 ,uptype )!!! Compute total emissivity:! call radems(lchnk ,ncol , & s2c ,tcg ,w ,tplnke ,plh2o , & pint ,plco2 ,tint ,tint4 ,tlayr , & tlayr4 ,plol ,plos ,ucfc11 ,ucfc12 , & un2o0 ,un2o1 ,uch4 ,uco211 ,uco212 , & uco213 ,uco221 ,uco222 ,uco223 ,uptype , & bn2o0 ,bn2o1 ,bch4 ,co2em ,co2eml , & co2t ,h2otr ,abplnk1 ,abplnk2 ,emstot , & plh2ob ,wb )!! Compute total absorptivity:! call radabs(lchnk ,ncol , & pmid ,pint ,co2em ,co2eml ,tplnka , & s2c ,tcg ,w ,h2otr ,plco2 , & plh2o ,co2t ,tint ,tlayr ,plol , & plos ,pmln ,piln ,ucfc11 ,ucfc12 , & un2o0 ,un2o1 ,uch4 ,uco211 ,uco212 , & uco213 ,uco221 ,uco222 ,uco223 ,uptype , & bn2o0 ,bn2o1 ,bch4 ,abplnk1 ,abplnk2 , & abstot ,absnxt ,plh2ob ,wb ) end if!! Compute sums used in integrals (all longitude points)!! Definition of bk1 & bk2 depends on finite differencing. for! trapezoidal rule bk1=bk2. trapezoidal rule applied for nonadjacent! layers only.!! delt=t**4 in layer above current sigma level km.! delt1=t**4 in layer below current sigma level km.! do i=1,ncol delt(i) = tint4(i,pver) - tlayr4(i,pverp) delt1(i) = tlayr4(i,pverp) - tint4(i,pverp) s(i,pverp,pverp) = stebol*(delt1(i)*absnxt(i,pver,1) + delt (i)*absnxt(i,pver,4)) s(i,pver,pverp) = stebol*(delt (i)*absnxt(i,pver,2) + delt1(i)*absnxt(i,pver,3)) end do do k=ntoplw,pver-1 do i=1,ncol bk2(i) = (abstot(i,k,pver) + abstot(i,k,pverp))*0.5 bk1(i) = bk2(i) s(i,k,pverp) = stebol*(bk2(i)*delt(i) + bk1(i)*delt1(i)) end do end do!! All k, km>1! do km=pver,ntoplw+1,-1 do i=1,ncol delt(i) = tint4(i,km-1) - tlayr4(i,km) delt1(i) = tlayr4(i,km) - tint4(i,km) end do do k=pverp,ntoplw,-1 if (k == km) then do i=1,ncol bk2(i) = absnxt(i,km-1,4) bk1(i) = absnxt(i,km-1,1) end do else if (k == km-1) then do i=1,ncol bk2(i) = absnxt(i,km-1,2) bk1(i) = absnxt(i,km-1,3) end do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -