⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radclwmx.f90

📁 CCSM Research Tools: Community Atmosphere Model (CAM)
💻 F90
📖 第 1 页 / 共 3 页
字号:
#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 + -