LCOV - code coverage report
Current view: top level - physics/rrtmg/aer_src - rrtmg_lw_rtrnmc.f90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 195 195 100.0 %
Date: 2025-03-13 18:55:17 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !     path:      $Source: /storm/rc1/cvsroot/rc/rrtmg_lw/src/rrtmg_lw_rtrnmc.f90,v $
       2             : !     author:    $Author: mike $
       3             : !     revision:  $Revision: 1.3 $
       4             : !     created:   $Date: 2008/04/24 16:17:28 $
       5             : !
       6             :       module rrtmg_lw_rtrnmc
       7             : 
       8             : !  --------------------------------------------------------------------------
       9             : ! |                                                                          |
      10             : ! |  Copyright 2002-2007, Atmospheric & Environmental Research, Inc. (AER).  |
      11             : ! |  This software may be used, copied, or redistributed as long as it is    |
      12             : ! |  not sold and this copyright notice is reproduced on each copy made.     |
      13             : ! |  This model is provided as is without any express or implied warranties. |
      14             : ! |                       (http://www.rtweb.aer.com/)                        |
      15             : ! |                                                                          |
      16             : !  --------------------------------------------------------------------------
      17             : 
      18             : ! --------- Modules ----------
      19             : 
      20             :       use shr_kind_mod, only: r8 => shr_kind_r8
      21             : 
      22             :       use parrrtm,      only: mg, nbndlw, ngptlw
      23             :       use rrlw_con,     only: fluxfac, heatfac
      24             :       use rrlw_wvn,     only: delwave, ngb, ngs
      25             :       use rrlw_tbl,     only: tblint, bpade, tau_tbl, exp_tbl, tfn_tbl
      26             : 
      27             :       implicit none
      28             : 
      29             :       contains
      30             : 
      31             : !-----------------------------------------------------------------------------
      32      972000 :       subroutine rtrnmc(nlayers, istart, iend, iout, pz, semiss, &
      33      486000 :                         cldfmc, taucmc, planklay, planklev, plankbnd, &
      34      486000 :                         pwvcm, fracs, taut, &
      35      486000 :                         totuflux, totdflux, fnet, htr, &
      36      486000 :                         totuclfl, totdclfl, fnetc, htrc, totufluxs, totdfluxs ) 
      37             : !-----------------------------------------------------------------------------
      38             : !
      39             : !  Original version:   E. J. Mlawer, et al. RRTM_V3.0
      40             : !  Revision for GCMs:  Michael J. Iacono; October, 2002
      41             : !  Revision for F90:  Michael J. Iacono; June, 2006
      42             : !
      43             : !  This program calculates the upward fluxes, downward fluxes, and
      44             : !  heating rates for an arbitrary clear or cloudy atmosphere.  The input
      45             : !  to this program is the atmospheric profile, all Planck function
      46             : !  information, and the cloud fraction by layer.  A variable diffusivity 
      47             : !  angle (SECDIFF) is used for the angle integration.  Bands 2-3 and 5-9 
      48             : !  use a value for SECDIFF that varies from 1.50 to 1.80 as a function of 
      49             : !  the column water vapor, and other bands use a value of 1.66.  The Gaussian 
      50             : !  weight appropriate to this angle (WTDIFF=0.5) is applied here.  Note that 
      51             : !  use of the emissivity angle for the flux integration can cause errors of 
      52             : !  1 to 4 W/m2 within cloudy layers.  
      53             : !  Clouds are treated with the McICA stochastic approach and maximum-random
      54             : !  cloud overlap. 
      55             : !***************************************************************************
      56             : 
      57             : ! ------- Declarations -------
      58             : 
      59             : ! ----- Input -----
      60             :       integer, intent(in) :: nlayers                    ! total number of layers
      61             :       integer, intent(in) :: istart                     ! beginning band of calculation
      62             :       integer, intent(in) :: iend                       ! ending band of calculation
      63             :       integer, intent(in) :: iout                       ! output option flag
      64             : 
      65             : ! Atmosphere
      66             :       real(kind=r8), intent(in) :: pz(0:nlayers)               ! level (interface) pressures (hPa, mb)
      67             :                                                         !    Dimensions: (0:nlayers)
      68             :       real(kind=r8), intent(in) :: pwvcm                ! precipitable water vapor (cm)
      69             :       real(kind=r8), intent(in) :: semiss(nbndlw)            ! lw surface emissivity
      70             :                                                         !    Dimensions: (nbndlw)
      71             :       real(kind=r8), intent(in) :: planklay(nlayers,nbndlw)        ! 
      72             :                                                         !    Dimensions: (nlayers,nbndlw)
      73             :       real(kind=r8), intent(in) :: planklev(0:nlayers,nbndlw)       ! 
      74             :                                                         !    Dimensions: (0:nlayers,nbndlw)
      75             :       real(kind=r8), intent(in) :: plankbnd(nbndlw)          ! 
      76             :                                                         !    Dimensions: (nbndlw)
      77             :       real(kind=r8), intent(in) :: fracs(nlayers,ngptlw)           ! 
      78             :                                                         !    Dimensions: (nlayers,ngptw)
      79             :       real(kind=r8), intent(in) :: taut(nlayers,ngptlw)            ! gaseous + aerosol optical depths
      80             :                                                         !    Dimensions: (nlayers,ngptlw)
      81             : 
      82             : ! Clouds
      83             :       real(kind=r8), intent(in) :: cldfmc(ngptlw,nlayers)          ! layer cloud fraction [mcica]
      84             :                                                         !    Dimensions: (ngptlw,nlayers)
      85             :       real(kind=r8), intent(in) :: taucmc(ngptlw,nlayers)          ! layer cloud optical depth [mcica]
      86             :                                                         !    Dimensions: (ngptlw,nlayers)
      87             : 
      88             : ! ----- Output -----
      89             :       real(kind=r8), intent(out) :: totuflux(0:)        ! upward longwave flux (w/m2)
      90             :                                                         !    Dimensions: (0:nlayers)
      91             :       real(kind=r8), intent(out) :: totdflux(0:)        ! downward longwave flux (w/m2)
      92             :                                                         !    Dimensions: (0:nlayers)
      93             :       real(kind=r8), intent(out) :: fnet(0:)            ! net longwave flux (w/m2)
      94             :                                                         !    Dimensions: (0:nlayers)
      95             :       real(kind=r8), intent(out) :: htr(0:)             ! longwave heating rate (k/day)
      96             :                                                         !    Dimensions: (0:nlayers)
      97             :       real(kind=r8), intent(out) :: totuclfl(0:)        ! clear sky upward longwave flux (w/m2)
      98             :                                                         !    Dimensions: (0:nlayers)
      99             :       real(kind=r8), intent(out) :: totdclfl(0:)        ! clear sky downward longwave flux (w/m2)
     100             :                                                         !    Dimensions: (0:nlayers)
     101             :       real(kind=r8), intent(out) :: fnetc(0:)           ! clear sky net longwave flux (w/m2)
     102             :                                                         !    Dimensions: (0:nlayers)
     103             :       real(kind=r8), intent(out) :: htrc(0:)            ! clear sky longwave heating rate (k/day)
     104             :                                                         !    Dimensions: (0:nlayers)
     105             :       real(kind=r8), intent(out) :: totufluxs(:,0:)     ! upward longwave flux spectral (w/m2)
     106             :                                                         !    Dimensions: (nbndlw, 0:nlayers)
     107             :       real(kind=r8), intent(out) :: totdfluxs(:,0:)     ! downward longwave flux spectral (w/m2)
     108             :                                                         !    Dimensions: (nbndlw, 0:nlayers)
     109             : 
     110             : ! ----- Local -----
     111             : ! Declarations for radiative transfer
     112      972000 :       real(kind=r8) :: abscld(nlayers,ngptlw)
     113      972000 :       real(kind=r8) :: atot(nlayers)
     114      972000 :       real(kind=r8) :: atrans(nlayers)
     115      972000 :       real(kind=r8) :: bbugas(nlayers)
     116      972000 :       real(kind=r8) :: bbutot(nlayers)
     117      972000 :       real(kind=r8) :: clrurad(0:nlayers)
     118      972000 :       real(kind=r8) :: clrdrad(0:nlayers)
     119      972000 :       real(kind=r8) :: efclfrac(nlayers,ngptlw)
     120      972000 :       real(kind=r8) :: uflux(0:nlayers)
     121      972000 :       real(kind=r8) :: dflux(0:nlayers)
     122      972000 :       real(kind=r8) :: urad(0:nlayers)
     123      972000 :       real(kind=r8) :: drad(0:nlayers)
     124      972000 :       real(kind=r8) :: uclfl(0:nlayers)
     125      972000 :       real(kind=r8) :: dclfl(0:nlayers)
     126      972000 :       real(kind=r8) :: odcld(nlayers,ngptlw)
     127             : 
     128             : 
     129             :       real(kind=r8) :: secdiff(nbndlw)                   ! secant of diffusivity angle
     130             :       real(kind=r8) :: a0(nbndlw),a1(nbndlw),a2(nbndlw)  ! diffusivity angle adjustment coefficients
     131             :       real(kind=r8) :: wtdiff, rec_6
     132             :       real(kind=r8) :: transcld, radld, radclrd, plfrac, blay, dplankup, dplankdn
     133             :       real(kind=r8) :: odepth, odtot, odepth_rec, odtot_rec, gassrc
     134             :       real(kind=r8) :: tblind, tfactot, bbd, bbdtot, tfacgas, transc, tausfac
     135             :       real(kind=r8) :: rad0, reflect, radlu, radclru
     136             : 
     137      972000 :       integer :: icldlyr(nlayers)                        ! flag for cloud in layer
     138             :       integer :: ibnd, ib, iband, lay, lev, l, ig        ! loop indices
     139             :       integer :: igc                                     ! g-point interval counter
     140             :       integer :: iclddn                                  ! flag for cloud in down path
     141             :       integer :: ittot, itgas, itr                       ! lookup table indices
     142             : 
     143             : ! ------- Definitions -------
     144             : ! input
     145             : !    nlayers                      ! number of model layers
     146             : !    ngptlw                       ! total number of g-point subintervals
     147             : !    nbndlw                       ! number of longwave spectral bands
     148             : !    secdiff                      ! diffusivity angle
     149             : !    wtdiff                       ! weight for radiance to flux conversion
     150             : !    pavel                        ! layer pressures (mb)
     151             : !    pz                           ! level (interface) pressures (mb)
     152             : !    tavel                        ! layer temperatures (k)
     153             : !    tz                           ! level (interface) temperatures(mb)
     154             : !    tbound                       ! surface temperature (k)
     155             : !    cldfrac                      ! layer cloud fraction
     156             : !    taucloud                     ! layer cloud optical depth
     157             : !    itr                          ! integer look-up table index
     158             : !    icldlyr                      ! flag for cloudy layers
     159             : !    iclddn                       ! flag for cloud in column at any layer
     160             : !    semiss                       ! surface emissivities for each band
     161             : !    reflect                      ! surface reflectance
     162             : !    bpade                        ! 1/(pade constant)
     163             : !    tau_tbl                      ! clear sky optical depth look-up table
     164             : !    exp_tbl                      ! exponential look-up table for transmittance
     165             : !    tfn_tbl                      ! tau transition function look-up table
     166             : 
     167             : ! local
     168             : !    atrans                       ! gaseous absorptivity
     169             : !    abscld                       ! cloud absorptivity
     170             : !    atot                         ! combined gaseous and cloud absorptivity
     171             : !    odclr                        ! clear sky (gaseous) optical depth
     172             : !    odcld                        ! cloud optical depth
     173             : !    odtot                        ! optical depth of gas and cloud
     174             : !    tfacgas                      ! gas-only pade factor, used for planck fn
     175             : !    tfactot                      ! gas and cloud pade factor, used for planck fn
     176             : !    bbdgas                       ! gas-only planck function for downward rt
     177             : !    bbugas                       ! gas-only planck function for upward rt
     178             : !    bbdtot                       ! gas and cloud planck function for downward rt
     179             : !    bbutot                       ! gas and cloud planck function for upward calc.
     180             : !    gassrc                       ! source radiance due to gas only
     181             : !    efclfrac                     ! effective cloud fraction
     182             : !    radlu                        ! spectrally summed upward radiance 
     183             : !    radclru                      ! spectrally summed clear sky upward radiance 
     184             : !    urad                         ! upward radiance by layer
     185             : !    clrurad                      ! clear sky upward radiance by layer
     186             : !    radld                        ! spectrally summed downward radiance 
     187             : !    radclrd                      ! spectrally summed clear sky downward radiance 
     188             : !    drad                         ! downward radiance by layer
     189             : !    clrdrad                      ! clear sky downward radiance by layer
     190             : 
     191             : ! output
     192             : !    totuflux                     ! upward longwave flux (w/m2)
     193             : !    totdflux                     ! downward longwave flux (w/m2)
     194             : !    fnet                         ! net longwave flux (w/m2)
     195             : !    htr                          ! longwave heating rate (k/day)
     196             : !    totuclfl                     ! clear sky upward longwave flux (w/m2)
     197             : !    totdclfl                     ! clear sky downward longwave flux (w/m2)
     198             : !    fnetc                        ! clear sky net longwave flux (w/m2)
     199             : !    htrc                         ! clear sky longwave heating rate (k/day)
     200             : 
     201             : 
     202             : ! This secant and weight corresponds to the standard diffusivity 
     203             : ! angle.  This initial value is redefined below for some bands.
     204             :       data wtdiff /0.5_r8/
     205             :       data rec_6 /0.166667_r8/
     206             : 
     207             : ! Reset diffusivity angle for Bands 2-3 and 5-9 to vary (between 1.50
     208             : ! and 1.80) as a function of total column water vapor.  The function
     209             : ! has been defined to minimize flux and cooling rate errors in these bands
     210             : ! over a wide range of precipitable water values.
     211             :       data a0 / 1.66_r8,  1.55_r8,  1.58_r8,  1.66_r8, &
     212             :                 1.54_r8, 1.454_r8,  1.89_r8,  1.33_r8, &
     213             :                1.668_r8,  1.66_r8,  1.66_r8,  1.66_r8, &
     214             :                 1.66_r8,  1.66_r8,  1.66_r8,  1.66_r8 /
     215             :       data a1 / 0.00_r8,  0.25_r8,  0.22_r8,  0.00_r8, &
     216             :                 0.13_r8, 0.446_r8, -0.10_r8,  0.40_r8, &
     217             :               -0.006_r8,  0.00_r8,  0.00_r8,  0.00_r8, &
     218             :                 0.00_r8,  0.00_r8,  0.00_r8,  0.00_r8 /
     219             :       data a2 / 0.00_r8, -12.0_r8, -11.7_r8,  0.00_r8, &
     220             :                -0.72_r8,-0.243_r8,  0.19_r8,-0.062_r8, &
     221             :                0.414_r8,  0.00_r8,  0.00_r8,  0.00_r8, &
     222             :                 0.00_r8,  0.00_r8,  0.00_r8,  0.00_r8 /
     223             : 
     224     8262000 :       do ibnd = 1,nbndlw
     225     8262000 :          if (ibnd.eq.1 .or. ibnd.eq.4 .or. ibnd.ge.10) then
     226     4374000 :            secdiff(ibnd) = 1.66_r8
     227             :          else
     228     3402000 :            secdiff(ibnd) = a0(ibnd) + a1(ibnd)*exp(a2(ibnd)*pwvcm)
     229     3402000 :            if (secdiff(ibnd) .gt. 1.80_r8) secdiff(ibnd) = 1.80_r8
     230     3402000 :            if (secdiff(ibnd) .lt. 1.50_r8) secdiff(ibnd) = 1.50_r8
     231             :          endif
     232             :       enddo
     233             : 
     234      486000 :       urad(0) = 0.0_r8
     235      486000 :       drad(0) = 0.0_r8
     236      486000 :       totuflux(0) = 0.0_r8
     237      486000 :       totdflux(0) = 0.0_r8
     238      486000 :       clrurad(0) = 0.0_r8
     239      486000 :       clrdrad(0) = 0.0_r8
     240      486000 :       totuclfl(0) = 0.0_r8
     241      486000 :       totdclfl(0) = 0.0_r8
     242             : 
     243    45684000 :       do lay = 1, nlayers
     244    45198000 :          urad(lay) = 0.0_r8
     245    45198000 :          drad(lay) = 0.0_r8
     246    45198000 :          totuflux(lay) = 0.0_r8
     247    45198000 :          totdflux(lay) = 0.0_r8
     248    45198000 :          clrurad(lay) = 0.0_r8
     249    45198000 :          clrdrad(lay) = 0.0_r8
     250    45198000 :          totuclfl(lay) = 0.0_r8
     251    45198000 :          totdclfl(lay) = 0.0_r8
     252    45684000 :          icldlyr(lay) = 0
     253             :       enddo
     254             : ! Change to band loop?
     255    68526000 :       do ig = 1, ngptlw
     256  6396246000 :          do lay = 1, nlayers
     257  6395760000 :             if (cldfmc(ig,lay) .eq. 1._r8) then
     258   485811632 :                ib = ngb(ig)
     259   485811632 :                odcld(lay,ig) = secdiff(ib) * taucmc(ig,lay)
     260   485811632 :                transcld = exp(-odcld(lay,ig))
     261   485811632 :                abscld(lay,ig) = 1._r8 - transcld
     262   485811632 :                efclfrac(lay,ig) = abscld(lay,ig) * cldfmc(ig,lay)
     263   485811632 :                icldlyr(lay) = 1
     264             :             else
     265  5841908368 :                odcld(lay,ig) = 0.0_r8
     266  5841908368 :                abscld(lay,ig) = 0.0_r8
     267  5841908368 :                efclfrac(lay,ig) = 0.0_r8
     268             :             endif
     269             :          enddo
     270             : 
     271             :       enddo
     272             : 
     273      486000 :       igc = 1
     274             : ! Loop over frequency bands.
     275     8262000 :       do iband = istart, iend
     276             : 
     277             : ! Reinitialize g-point counter for each band if output for each band is requested.
     278     7776000 :          if (iout.gt.0.and.iband.ge.2) igc = ngs(iband-1)+1
     279             : 
     280             : ! Loop over g-channels.
     281             :  1000    continue
     282             : 
     283             : ! Radiative transfer starts here.
     284    68040000 :          radld = 0._r8
     285    68040000 :          radclrd = 0._r8
     286    68040000 :          iclddn = 0
     287             : 
     288             : ! Downward radiative transfer loop.  
     289             : 
     290  6395760000 :          do lev = nlayers, 1, -1
     291  6327720000 :                plfrac = fracs(lev,igc)
     292  6327720000 :                blay = planklay(lev,iband)
     293  6327720000 :                dplankup = planklev(lev,iband) - blay
     294  6327720000 :                dplankdn = planklev(lev-1,iband) - blay
     295  6327720000 :                odepth = secdiff(iband) * taut(lev,igc)
     296  6327720000 :                if (odepth .lt. 0.0_r8) odepth = 0.0_r8
     297             : !  Cloudy layer
     298  6327720000 :                if (icldlyr(lev).eq.1) then
     299   872068680 :                   iclddn = 1
     300   872068680 :                   odtot = odepth + odcld(lev,igc)
     301   872068680 :                   if (odtot .lt. 0.06_r8) then
     302   171749977 :                      atrans(lev) = odepth - 0.5_r8*odepth*odepth
     303   171749977 :                      odepth_rec = rec_6*odepth
     304   171749977 :                      gassrc = plfrac*(blay+dplankdn*odepth_rec)*atrans(lev)
     305             : 
     306   171749977 :                      atot(lev) =  odtot - 0.5_r8*odtot*odtot
     307   171749977 :                      odtot_rec = rec_6*odtot
     308   171749977 :                      bbdtot =  plfrac * (blay+dplankdn*odtot_rec)
     309   171749977 :                      bbd = plfrac*(blay+dplankdn*odepth_rec)
     310             :                      radld = radld - radld * (atrans(lev) + &
     311             :                          efclfrac(lev,igc) * (1. - atrans(lev))) + &
     312             :                          gassrc + cldfmc(igc,lev) * &
     313   171749977 :                          (bbdtot * atot(lev) - gassrc)
     314   171749977 :                      drad(lev-1) = drad(lev-1) + radld
     315             :                   
     316   171749977 :                      bbugas(lev) =  plfrac * (blay+dplankup*odepth_rec)
     317   171749977 :                      bbutot(lev) =  plfrac * (blay+dplankup*odtot_rec)
     318             : 
     319   700318703 :                   elseif (odepth .le. 0.06_r8) then
     320    68576597 :                      atrans(lev) = odepth - 0.5_r8*odepth*odepth
     321    68576597 :                      odepth_rec = rec_6*odepth
     322    68576597 :                      gassrc = plfrac*(blay+dplankdn*odepth_rec)*atrans(lev)
     323             : 
     324    68576597 :                      odtot = odepth + odcld(lev,igc)
     325    68576597 :                      tblind = odtot/(bpade+odtot)
     326    68576597 :                      ittot = tblint*tblind + 0.5_r8
     327    68576597 :                      tfactot = tfn_tbl(ittot)
     328    68576597 :                      bbdtot = plfrac * (blay + tfactot*dplankdn)
     329    68576597 :                      bbd = plfrac*(blay+dplankdn*odepth_rec)
     330    68576597 :                      atot(lev) = 1. - exp_tbl(ittot)
     331             : 
     332             :                      radld = radld - radld * (atrans(lev) + &
     333             :                          efclfrac(lev,igc) * (1._r8 - atrans(lev))) + &
     334             :                          gassrc + cldfmc(igc,lev) * &
     335    68576597 :                          (bbdtot * atot(lev) - gassrc)
     336    68576597 :                      drad(lev-1) = drad(lev-1) + radld
     337             : 
     338    68576597 :                      bbugas(lev) = plfrac * (blay + dplankup*odepth_rec)
     339    68576597 :                      bbutot(lev) = plfrac * (blay + tfactot * dplankup)
     340             : 
     341             :                   else
     342             : 
     343   631742106 :                      tblind = odepth/(bpade+odepth)
     344   631742106 :                      itgas = tblint*tblind+0.5_r8
     345   631742106 :                      odepth = tau_tbl(itgas)
     346   631742106 :                      atrans(lev) = 1._r8 - exp_tbl(itgas)
     347   631742106 :                      tfacgas = tfn_tbl(itgas)
     348   631742106 :                      gassrc = atrans(lev) * plfrac * (blay + tfacgas*dplankdn)
     349             : 
     350   631742106 :                      odtot = odepth + odcld(lev,igc)
     351   631742106 :                      tblind = odtot/(bpade+odtot)
     352   631742106 :                      ittot = tblint*tblind + 0.5_r8
     353   631742106 :                      tfactot = tfn_tbl(ittot)
     354   631742106 :                      bbdtot = plfrac * (blay + tfactot*dplankdn)
     355   631742106 :                      bbd = plfrac*(blay+tfacgas*dplankdn)
     356   631742106 :                      atot(lev) = 1._r8 - exp_tbl(ittot)
     357             : 
     358             :                   radld = radld - radld * (atrans(lev) + &
     359             :                     efclfrac(lev,igc) * (1._r8 - atrans(lev))) + &
     360             :                     gassrc + cldfmc(igc,lev) * &
     361   631742106 :                     (bbdtot * atot(lev) - gassrc)
     362   631742106 :                   drad(lev-1) = drad(lev-1) + radld
     363   631742106 :                   bbugas(lev) = plfrac * (blay + tfacgas * dplankup)
     364   631742106 :                   bbutot(lev) = plfrac * (blay + tfactot * dplankup)
     365             :                   endif
     366             : !  Clear layer
     367             :                else
     368  5455651320 :                   if (odepth .le. 0.06_r8) then
     369  3077789662 :                      atrans(lev) = odepth-0.5_r8*odepth*odepth
     370  3077789662 :                      odepth = rec_6*odepth
     371  3077789662 :                      bbd = plfrac*(blay+dplankdn*odepth)
     372  3077789662 :                      bbugas(lev) = plfrac*(blay+dplankup*odepth)
     373             :                   else
     374  2377861658 :                      tblind = odepth/(bpade+odepth)
     375  2377861658 :                      itr = tblint*tblind+0.5_r8
     376  2377861658 :                      transc = exp_tbl(itr)
     377  2377861658 :                      atrans(lev) = 1._r8-transc
     378  2377861658 :                      tausfac = tfn_tbl(itr)
     379  2377861658 :                      bbd = plfrac*(blay+tausfac*dplankdn)
     380  2377861658 :                      bbugas(lev) = plfrac * (blay + tausfac * dplankup)
     381             :                   endif   
     382  5455651320 :                   radld = radld + (bbd-radld)*atrans(lev)
     383  5455651320 :                   drad(lev-1) = drad(lev-1) + radld
     384             :                endif
     385             : !  Set clear sky stream to total sky stream as long as layers
     386             : !  remain clear.  Streams diverge when a cloud is reached (iclddn=1),
     387             : !  and clear sky stream must be computed separately from that point.
     388  6395760000 :                   if (iclddn.eq.1) then
     389  1729017360 :                      radclrd = radclrd + (bbd-radclrd) * atrans(lev) 
     390  1729017360 :                      clrdrad(lev-1) = clrdrad(lev-1) + radclrd
     391             :                   else
     392  4598702640 :                      radclrd = radld
     393  4598702640 :                      clrdrad(lev-1) = drad(lev-1)
     394             :                   endif
     395             :             enddo
     396             : 
     397             : ! Spectral emissivity & reflectance
     398             : !  Include the contribution of spectrally varying longwave emissivity
     399             : !  and reflection from the surface to the upward radiative transfer.
     400             : !  Note: Spectral and Lambertian reflection are identical for the
     401             : !  diffusivity angle flux integration used here.
     402             : 
     403    68040000 :          rad0 = fracs(1,igc) * plankbnd(iband)
     404             : !  Add in specular reflection of surface downward radiance.
     405    68040000 :          reflect = 1._r8 - semiss(iband)
     406    68040000 :          radlu = rad0 + reflect * radld
     407    68040000 :          radclru = rad0 + reflect * radclrd
     408             : 
     409             : 
     410             : ! Upward radiative transfer loop.
     411    68040000 :          urad(0) = urad(0) + radlu
     412    68040000 :          clrurad(0) = clrurad(0) + radclru
     413             : 
     414  6395760000 :          do lev = 1, nlayers
     415             : !  Cloudy layer
     416  6327720000 :             if (icldlyr(lev) .eq. 1) then
     417   872068680 :                gassrc = bbugas(lev) * atrans(lev)
     418             :                radlu = radlu - radlu * (atrans(lev) + &
     419             :                    efclfrac(lev,igc) * (1._r8 - atrans(lev))) + &
     420             :                    gassrc + cldfmc(igc,lev) * &
     421   872068680 :                    (bbutot(lev) * atot(lev) - gassrc)
     422   872068680 :                urad(lev) = urad(lev) + radlu
     423             : !  Clear layer
     424             :             else
     425  5455651320 :                radlu = radlu + (bbugas(lev)-radlu)*atrans(lev)
     426  5455651320 :                urad(lev) = urad(lev) + radlu
     427             :             endif
     428             : !  Set clear sky stream to total sky stream as long as all layers
     429             : !  are clear (iclddn=0).  Streams must be calculated separately at 
     430             : !  all layers when a cloud is present (ICLDDN=1), because surface 
     431             : !  reflectance is different for each stream.
     432  6395760000 :                if (iclddn.eq.1) then
     433  5121312840 :                   radclru = radclru + (bbugas(lev)-radclru)*atrans(lev) 
     434  5121312840 :                   clrurad(lev) = clrurad(lev) + radclru
     435             :                else
     436  1206407160 :                   radclru = radlu
     437  1206407160 :                   clrurad(lev) = urad(lev)
     438             :                endif
     439             :          enddo
     440             : 
     441             : ! Increment g-point counter
     442    68040000 :          igc = igc + 1
     443             : ! Return to continue radiative transfer for all g-channels in present band
     444    68040000 :          if (igc .le. ngs(iband)) go to 1000
     445             : 
     446             : ! Process longwave output from band for total and clear streams.
     447             : ! Calculate upward, downward, and net flux.
     448   738720000 :          do lev = nlayers, 0, -1
     449   730944000 :             uflux(lev) = urad(lev)*wtdiff
     450   730944000 :             dflux(lev) = drad(lev)*wtdiff
     451   730944000 :             urad(lev) = 0.0_r8
     452   730944000 :             drad(lev) = 0.0_r8
     453   730944000 :             uclfl(lev) = clrurad(lev)*wtdiff
     454   730944000 :             dclfl(lev) = clrdrad(lev)*wtdiff
     455   730944000 :             clrurad(lev) = 0.0_r8
     456   738720000 :             clrdrad(lev) = 0.0_r8
     457             :          enddo
     458             : 
     459   739206000 :          do lev = nlayers, 0, -1
     460   730944000 :             totuflux(lev) = totuflux(lev) + uflux(lev) * delwave(iband)
     461   730944000 :             totdflux(lev) = totdflux(lev) + dflux(lev) * delwave(iband)
     462   730944000 :             totuclfl(lev) = totuclfl(lev) + uclfl(lev) * delwave(iband)
     463   730944000 :             totdclfl(lev) = totdclfl(lev) + dclfl(lev) * delwave(iband)
     464   730944000 :             totufluxs(iband,lev) = uflux(lev) * delwave(iband)
     465   738720000 :             totdfluxs(iband,lev) = dflux(lev) * delwave(iband)
     466             :          enddo
     467             : ! End spectral band loop
     468             :       enddo
     469             : 
     470             : ! Calculate fluxes at surface
     471      486000 :       totuflux(0) = totuflux(0) * fluxfac
     472      486000 :       totdflux(0) = totdflux(0) * fluxfac
     473     8262000 :       totufluxs(:,0) = totufluxs(:,0) * fluxfac
     474     8262000 :       totdfluxs(:,0) = totdfluxs(:,0) * fluxfac
     475      486000 :       fnet(0) = totuflux(0) - totdflux(0)
     476      486000 :       totuclfl(0) = totuclfl(0) * fluxfac
     477      486000 :       totdclfl(0) = totdclfl(0) * fluxfac
     478      486000 :       fnetc(0) = totuclfl(0) - totdclfl(0)
     479             : 
     480             : ! Calculate fluxes at model levels
     481    45684000 :       do lev = 1, nlayers
     482    45198000 :          totuflux(lev) = totuflux(lev) * fluxfac
     483    45198000 :          totdflux(lev) = totdflux(lev) * fluxfac
     484   768366000 :          totufluxs(:,lev) = totufluxs(:,lev) * fluxfac
     485   768366000 :          totdfluxs(:,lev) = totdfluxs(:,lev) * fluxfac
     486    45198000 :          fnet(lev) = totuflux(lev) - totdflux(lev)
     487    45198000 :          totuclfl(lev) = totuclfl(lev) * fluxfac
     488    45198000 :          totdclfl(lev) = totdclfl(lev) * fluxfac
     489    45198000 :          fnetc(lev) = totuclfl(lev) - totdclfl(lev)
     490    45198000 :          l = lev - 1
     491             : 
     492             : ! Calculate heating rates at model layers
     493    45198000 :          htr(l)=heatfac*(fnet(l)-fnet(lev))/(pz(l)-pz(lev)) 
     494    45684000 :          htrc(l)=heatfac*(fnetc(l)-fnetc(lev))/(pz(l)-pz(lev)) 
     495             :       enddo
     496             : 
     497             : ! Set heating rate to zero in top layer
     498      486000 :       htr(nlayers) = 0.0_r8
     499      486000 :       htrc(nlayers) = 0.0_r8
     500             : 
     501      486000 :       end subroutine rtrnmc
     502             : 
     503             :       end module rrtmg_lw_rtrnmc
     504             : 

Generated by: LCOV version 1.14