LCOV - code coverage report
Current view: top level - physics/rrtmg/aer_src - rrtmg_lw_taumol.f90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1832 1920 95.4 %
Date: 2025-04-28 18:57:11 Functions: 17 17 100.0 %

          Line data    Source code
       1             : !     path:      $Source: /storm/rc1/cvsroot/rc/rrtmg_lw/src/rrtmg_lw_taumol.f90,v $
       2             : !     author:    $Author: mike $
       3             : !     revision:  $Revision: 1.7 $
       4             : !     created:   $Date: 2009/10/20 15:08:37 $
       5             : !
       6             :       module rrtmg_lw_taumol
       7             : 
       8             : !  --------------------------------------------------------------------------
       9             : ! |                                                                          |
      10             : ! |  Copyright 2002-2009, 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: nbndlw, maxxsec, ngptlw
      23             :       use rrlw_con, only: oneminus
      24             :       use rrlw_wvn, only: nspa, nspb
      25             : 
      26             :       implicit none
      27             : 
      28             :       contains
      29             : 
      30             : !----------------------------------------------------------------------------
      31      486000 :       subroutine taumol(nlayers, pavel, wx, coldry, &
      32      486000 :                         laytrop, jp, jt, jt1, planklay, planklev, plankbnd, &
      33      486000 :                         colh2o, colco2, colo3, coln2o, colco, colch4, colo2, &
      34      486000 :                         colbrd, fac00, fac01, fac10, fac11, &
      35      486000 :                         rat_h2oco2, rat_h2oco2_1, rat_h2oo3, rat_h2oo3_1, &
      36      486000 :                         rat_h2on2o, rat_h2on2o_1, rat_h2och4, rat_h2och4_1, &
      37      486000 :                         rat_n2oco2, rat_n2oco2_1, rat_o3co2, rat_o3co2_1, &
      38      486000 :                         selffac, selffrac, indself, forfac, forfrac, indfor, &
      39      486000 :                         minorfrac, scaleminor, scaleminorn2, indminor, &
      40      486000 :                         fracs, taug)
      41             : !----------------------------------------------------------------------------
      42             : 
      43             : ! *******************************************************************************
      44             : ! *                                                                             *
      45             : ! *                  Optical depths developed for the                           *
      46             : ! *                                                                             *
      47             : ! *                RAPID RADIATIVE TRANSFER MODEL (RRTM)                        *
      48             : ! *                                                                             *
      49             : ! *                                                                             *
      50             : ! *            ATMOSPHERIC AND ENVIRONMENTAL RESEARCH, INC.                     *
      51             : ! *                        131 HARTWELL AVENUE                                  *
      52             : ! *                        LEXINGTON, MA 02421                                  *
      53             : ! *                                                                             *
      54             : ! *                                                                             *
      55             : ! *                           ELI J. MLAWER                                     * 
      56             : ! *                         JENNIFER DELAMERE                                   * 
      57             : ! *                         STEVEN J. TAUBMAN                                   *
      58             : ! *                         SHEPARD A. CLOUGH                                   *
      59             : ! *                                                                             *
      60             : ! *                                                                             *
      61             : ! *                                                                             *
      62             : ! *                                                                             *
      63             : ! *                       email:  mlawer@aer.com                                *
      64             : ! *                       email:  jdelamer@aer.com                              *
      65             : ! *                                                                             *
      66             : ! *        The authors wish to acknowledge the contributions of the             *
      67             : ! *        following people:  Karen Cady-Pereira, Patrick D. Brown,             *  
      68             : ! *        Michael J. Iacono, Ronald E. Farren, Luke Chen, Robert Bergstrom.    *
      69             : ! *                                                                             *
      70             : ! *******************************************************************************
      71             : ! *                                                                             *
      72             : ! *  Revision for g-point reduction: Michael J. Iacono, AER, Inc.               *
      73             : ! *                                                                             *
      74             : ! *******************************************************************************
      75             : ! *     TAUMOL                                                                  *
      76             : ! *                                                                             *
      77             : ! *     This file contains the subroutines TAUGBn (where n goes from            *
      78             : ! *     1 to 16).  TAUGBn calculates the optical depths and Planck fractions    *
      79             : ! *     per g-value and layer for band n.                                       *
      80             : ! *                                                                             *
      81             : ! *  Output:  optical depths (unitless)                                         *
      82             : ! *           fractions needed to compute Planck functions at every layer       *
      83             : ! *               and g-value                                                   *
      84             : ! *                                                                             *
      85             : ! *     COMMON /TAUGCOM/  TAUG(MXLAY,MG)                                        *
      86             : ! *     COMMON /PLANKG/   FRACS(MXLAY,MG)                                       *
      87             : ! *                                                                             *
      88             : ! *  Input                                                                      *
      89             : ! *                                                                             *
      90             : ! *     COMMON /FEATURES/ NG(NBANDS),NSPA(NBANDS),NSPB(NBANDS)                  *
      91             : ! *     COMMON /PRECISE/  ONEMINUS                                              *
      92             : ! *     COMMON /PROFILE/  NLAYERS,PAVEL(MXLAY),TAVEL(MXLAY),                    *
      93             : ! *     &                 PZ(0:MXLAY),TZ(0:MXLAY)                               *
      94             : ! *     COMMON /PROFDATA/ LAYTROP,                                              *
      95             : ! *    &                  COLH2O(MXLAY),COLCO2(MXLAY),COLO3(MXLAY),             *
      96             : ! *    &                  COLN2O(MXLAY),COLCO(MXLAY),COLCH4(MXLAY),             *
      97             : ! *    &                  COLO2(MXLAY)
      98             : ! *     COMMON /INTFAC/   FAC00(MXLAY),FAC01(MXLAY),                            *
      99             : ! *    &                  FAC10(MXLAY),FAC11(MXLAY)                             *
     100             : ! *     COMMON /INTIND/   JP(MXLAY),JT(MXLAY),JT1(MXLAY)                        *
     101             : ! *     COMMON /SELF/     SELFFAC(MXLAY), SELFFRAC(MXLAY), INDSELF(MXLAY)       *
     102             : ! *                                                                             *
     103             : ! *     Description:                                                            *
     104             : ! *     NG(IBAND) - number of g-values in band IBAND                            *
     105             : ! *     NSPA(IBAND) - for the lower atmosphere, the number of reference         *
     106             : ! *                   atmospheres that are stored for band IBAND per            *
     107             : ! *                   pressure level and temperature.  Each of these            *
     108             : ! *                   atmospheres has different relative amounts of the         *
     109             : ! *                   key species for the band (i.e. different binary           *
     110             : ! *                   species parameters).                                      *
     111             : ! *     NSPB(IBAND) - same for upper atmosphere                                 *
     112             : ! *     ONEMINUS - since problems are caused in some cases by interpolation     *
     113             : ! *                parameters equal to or greater than 1, for these cases       *
     114             : ! *                these parameters are set to this value, slightly < 1.        *
     115             : ! *     PAVEL - layer pressures (mb)                                            *
     116             : ! *     TAVEL - layer temperatures (degrees K)                                  *
     117             : ! *     PZ - level pressures (mb)                                               *
     118             : ! *     TZ - level temperatures (degrees K)                                     *
     119             : ! *     LAYTROP - layer at which switch is made from one combination of         *
     120             : ! *               key species to another                                        *
     121             : ! *     COLH2O, COLCO2, COLO3, COLN2O, COLCH4 - column amounts of water         *
     122             : ! *               vapor,carbon dioxide, ozone, nitrous ozide, methane,          *
     123             : ! *               respectively (molecules/cm**2)                                *
     124             : ! *     FACij(LAY) - for layer LAY, these are factors that are needed to        *
     125             : ! *                  compute the interpolation factors that multiply the        *
     126             : ! *                  appropriate reference k-values.  A value of 0 (1) for      *
     127             : ! *                  i,j indicates that the corresponding factor multiplies     *
     128             : ! *                  reference k-value for the lower (higher) of the two        *
     129             : ! *                  appropriate temperatures, and altitudes, respectively.     *
     130             : ! *     JP - the index of the lower (in altitude) of the two appropriate        *
     131             : ! *          reference pressure levels needed for interpolation                 *
     132             : ! *     JT, JT1 - the indices of the lower of the two appropriate reference     *
     133             : ! *               temperatures needed for interpolation (for pressure           *
     134             : ! *               levels JP and JP+1, respectively)                             *
     135             : ! *     SELFFAC - scale factor needed for water vapor self-continuum, equals    *
     136             : ! *               (water vapor density)/(atmospheric density at 296K and        *
     137             : ! *               1013 mb)                                                      *
     138             : ! *     SELFFRAC - factor needed for temperature interpolation of reference     *
     139             : ! *                water vapor self-continuum data                              *
     140             : ! *     INDSELF - index of the lower of the two appropriate reference           *
     141             : ! *               temperatures needed for the self-continuum interpolation      *
     142             : ! *     FORFAC  - scale factor needed for water vapor foreign-continuum.        *
     143             : ! *     FORFRAC - factor needed for temperature interpolation of reference      *
     144             : ! *                water vapor foreign-continuum data                           *
     145             : ! *     INDFOR  - index of the lower of the two appropriate reference           *
     146             : ! *               temperatures needed for the foreign-continuum interpolation   *
     147             : ! *                                                                             *
     148             : ! *  Data input                                                                 *
     149             : ! *     COMMON /Kn/ KA(NSPA(n),5,13,MG), KB(NSPB(n),5,13:59,MG), SELFREF(10,MG),*
     150             : ! *                 FORREF(4,MG), KA_M'MGAS', KB_M'MGAS'                        *
     151             : ! *        (note:  n is the band number,'MGAS' is the species name of the minor *
     152             : ! *         gas)                                                                *
     153             : ! *                                                                             *
     154             : ! *     Description:                                                            *
     155             : ! *     KA - k-values for low reference atmospheres (key-species only)          *
     156             : ! *          (units: cm**2/molecule)                                            *
     157             : ! *     KB - k-values for high reference atmospheres (key-species only)         *
     158             : ! *          (units: cm**2/molecule)                                            *
     159             : ! *     KA_M'MGAS' - k-values for low reference atmosphere minor species        *
     160             : ! *          (units: cm**2/molecule)                                            *
     161             : ! *     KB_M'MGAS' - k-values for high reference atmosphere minor species       *
     162             : ! *          (units: cm**2/molecule)                                            *
     163             : ! *     SELFREF - k-values for water vapor self-continuum for reference         *
     164             : ! *               atmospheres (used below LAYTROP)                              *
     165             : ! *               (units: cm**2/molecule)                                       *
     166             : ! *     FORREF  - k-values for water vapor foreign-continuum for reference      *
     167             : ! *               atmospheres (used below/above LAYTROP)                        *
     168             : ! *               (units: cm**2/molecule)                                       *
     169             : ! *                                                                             *
     170             : ! *     DIMENSION ABSA(65*NSPA(n),MG), ABSB(235*NSPB(n),MG)                     *
     171             : ! *     EQUIVALENCE (KA,ABSA),(KB,ABSB)                                         *
     172             : ! *                                                                             *
     173             : !*******************************************************************************
     174             : 
     175             : ! ------- Declarations -------
     176             : 
     177             : ! ----- Input -----
     178             :       integer, intent(in) :: nlayers         ! total number of layers
     179             :       real(kind=r8), intent(in) :: pavel(nlayers)           ! layer pressures (mb) 
     180             :                                                       !    Dimensions: (nlayers)
     181             :       real(kind=r8), intent(in) :: wx(maxxsec,nlayers)            ! cross-section amounts (mol/cm2)
     182             :                                                       !    Dimensions: (maxxsec,nlayers)
     183             :       real(kind=r8), intent(in) :: coldry(nlayers)          ! column amount (dry air)
     184             :                                                       !    Dimensions: (nlayers)
     185             : 
     186             :       integer, intent(in) :: laytrop         ! tropopause layer index
     187             :       integer, intent(in) :: jp(nlayers)           ! 
     188             :                                                       !    Dimensions: (nlayers)
     189             :       integer, intent(in) :: jt(nlayers)           !
     190             :                                                       !    Dimensions: (nlayers)
     191             :       integer, intent(in) :: jt1(nlayers)          !
     192             :                                                       !    Dimensions: (nlayers)
     193             :       real(kind=r8), intent(in) :: planklay(nlayers,nbndlw)      ! 
     194             :                                                       !    Dimensions: (nlayers,nbndlw)
     195             :       real(kind=r8), intent(in) :: planklev(0:nlayers,nbndlw)     ! 
     196             :                                                       !    Dimensions: (nlayers,nbndlw)
     197             :       real(kind=r8), intent(in) :: plankbnd(nbndlw)        ! 
     198             :                                                       !    Dimensions: (nbndlw)
     199             : 
     200             :       real(kind=r8), intent(in) :: colh2o(nlayers)          ! column amount (h2o)
     201             :                                                       !    Dimensions: (nlayers)
     202             :       real(kind=r8), intent(in) :: colco2(nlayers)          ! column amount (co2)
     203             :                                                       !    Dimensions: (nlayers)
     204             :       real(kind=r8), intent(in) :: colo3(nlayers)           ! column amount (o3)
     205             :                                                       !    Dimensions: (nlayers)
     206             :       real(kind=r8), intent(in) :: coln2o(nlayers)          ! column amount (n2o)
     207             :                                                       !    Dimensions: (nlayers)
     208             :       real(kind=r8), intent(in) :: colco(nlayers)           ! column amount (co)
     209             :                                                       !    Dimensions: (nlayers)
     210             :       real(kind=r8), intent(in) :: colch4(nlayers)          ! column amount (ch4)
     211             :                                                       !    Dimensions: (nlayers)
     212             :       real(kind=r8), intent(in) :: colo2(nlayers)           ! column amount (o2)
     213             :                                                       !    Dimensions: (nlayers)
     214             :       real(kind=r8), intent(in) :: colbrd(nlayers)          ! column amount (broadening gases)
     215             :                                                       !    Dimensions: (nlayers)
     216             : 
     217             :       integer, intent(in) :: indself(nlayers)
     218             :                                                       !    Dimensions: (nlayers)
     219             :       integer, intent(in) :: indfor(nlayers)
     220             :                                                       !    Dimensions: (nlayers)
     221             :       real(kind=r8), intent(in) :: selffac(nlayers)
     222             :                                                       !    Dimensions: (nlayers)
     223             :       real(kind=r8), intent(in) :: selffrac(nlayers)
     224             :                                                       !    Dimensions: (nlayers)
     225             :       real(kind=r8), intent(in) :: forfac(nlayers)
     226             :                                                       !    Dimensions: (nlayers)
     227             :       real(kind=r8), intent(in) :: forfrac(nlayers)
     228             :                                                       !    Dimensions: (nlayers)
     229             : 
     230             :       integer, intent(in) :: indminor(nlayers)
     231             :                                                       !    Dimensions: (nlayers)
     232             :       real(kind=r8), intent(in) :: minorfrac(nlayers)
     233             :                                                       !    Dimensions: (nlayers)
     234             :       real(kind=r8), intent(in) :: scaleminor(nlayers)
     235             :                                                       !    Dimensions: (nlayers)
     236             :       real(kind=r8), intent(in) :: scaleminorn2(nlayers)
     237             :                                                       !    Dimensions: (nlayers)
     238             : 
     239             :       real(kind=r8), dimension(nlayers), intent(in) :: &                  !
     240             :                        fac00, fac01, &          !    Dimensions: (nlayers)
     241             :                        fac10, fac11 
     242             :       real(kind=r8), dimension(nlayers), intent(in) :: &                  !
     243             :                        rat_h2oco2,rat_h2oco2_1, &
     244             :                        rat_h2oo3,rat_h2oo3_1, & !    Dimensions: (nlayers)
     245             :                        rat_h2on2o,rat_h2on2o_1, &
     246             :                        rat_h2och4,rat_h2och4_1, &
     247             :                        rat_n2oco2,rat_n2oco2_1, &
     248             :                        rat_o3co2,rat_o3co2_1
     249             : 
     250             : ! ----- Output -----
     251             :       real(kind=r8), intent(out) :: fracs(nlayers,ngptlw)        ! planck fractions
     252             :                                                       !    Dimensions: (nlayers,ngptlw)
     253             :       real(kind=r8), intent(out) :: taug(nlayers,ngptlw)         ! gaseous optical depth 
     254             :                                                       !    Dimensions: (nlayers,ngptlw)
     255             : 
     256             : ! Calculate gaseous optical depth and planck fractions for each spectral band.
     257             : 
     258      486000 :       call taugb1
     259      486000 :       call taugb2
     260      486000 :       call taugb3
     261      486000 :       call taugb4
     262      486000 :       call taugb5
     263      486000 :       call taugb6
     264      486000 :       call taugb7
     265      486000 :       call taugb8
     266      486000 :       call taugb9
     267      486000 :       call taugb10
     268      486000 :       call taugb11
     269      486000 :       call taugb12
     270      486000 :       call taugb13
     271      486000 :       call taugb14
     272      486000 :       call taugb15
     273      486000 :       call taugb16
     274             : 
     275             :       contains
     276             : 
     277             : !----------------------------------------------------------------------------
     278      486000 :       subroutine taugb1
     279             : !----------------------------------------------------------------------------
     280             : 
     281             : ! ------- Modifications -------
     282             : !  Written by Eli J. Mlawer, Atmospheric & Environmental Research.
     283             : !  Revised by Michael J. Iacono, Atmospheric & Environmental Research.
     284             : !
     285             : !     band 1:  10-350 cm-1 (low key - h2o; low minor - n2)
     286             : !                          (high key - h2o; high minor - n2)
     287             : !
     288             : !     note: previous versions of rrtm band 1: 
     289             : !           10-250 cm-1 (low - h2o; high - h2o)
     290             : !----------------------------------------------------------------------------
     291             : 
     292             : ! ------- Modules -------
     293             : 
     294             :       use parrrtm, only : ng1
     295             :       use rrlw_kg01, only : fracrefa, fracrefb, absa, absb, &
     296             :                             ka_mn2, kb_mn2, selfref, forref
     297             : 
     298             : ! ------- Declarations -------
     299             : 
     300             : ! Local 
     301      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
     302      972000 :       real(kind=r8) ::  corradj(nlayers), scalen2(nlayers), tauself, taufor, taun2
     303             : 
     304             : 
     305             : ! Minor gas mapping levels:
     306             : !     lower - n2, p = 142.5490 mbar, t = 215.70 k
     307             : !     upper - n2, p = 142.5490 mbar, t = 215.70 k
     308             : 
     309             : ! Compute the optical depth by interpolating in ln(pressure) and 
     310             : ! temperature.  Below laytrop, the water vapor self-continuum and
     311             : ! foreign continuum is interpolated (in temperature) separately.
     312             : 
     313             : ! Lower atmosphere loop
     314     9219976 :       do lay = 1, laytrop
     315             : 
     316     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(1) + 1
     317     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(1) + 1
     318             :          !inds = indself(lay)
     319             :          !indf = indfor(lay)
     320             :          !indm = indminor(lay)
     321             :          !pp = pavel(lay)
     322     8733976 :          corradj(lay) =  1.
     323     9219976 :          scalen2(lay) = colbrd(lay) * scaleminorn2(lay)
     324             :       enddo
     325     9219976 :       do lay = 1, laytrop
     326     9219976 :          if (pavel(lay) .lt. 250._r8) then
     327     2960573 :             corradj(lay) = 1._r8 - 0.15_r8 * (250._r8-pavel(lay)) / 154.4_r8
     328             :          endif
     329             :       enddo
     330     9219976 :       do lay = 1, laytrop
     331    96559736 :          do ig = 1, ng1
     332   436698800 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
     333   524038560 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     334   436698800 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     335   524038560 :                  (forref(indfor(lay)+1,ig) -  forref(indfor(lay),ig))) 
     336   349359040 :             taun2 = scalen2(lay)*(ka_mn2(indminor(lay),ig) + & 
     337   436698800 :                  minorfrac(lay) * (ka_mn2(indminor(lay)+1,ig) - ka_mn2(indminor(lay),ig)))
     338   349359040 :             taug(lay,ig) = corradj(lay) * (colh2o(lay) * &
     339   349359040 :                 (fac00(lay) * absa(ind0(lay),ig) + &
     340   349359040 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
     341   349359040 :                  fac01(lay) * absa(ind1(lay),ig) + &
     342   349359040 :                  fac11(lay) * absa(ind1(lay)+1,ig)) & 
     343  1746795200 :                  + tauself + taufor + taun2)
     344    96073736 :              fracs(lay,ig) = fracrefa(ig)
     345             :          enddo
     346             :       enddo
     347             : 
     348             : ! Upper atmosphere loop
     349     4874024 :       do lay = laytrop+1, nlayers
     350             : 
     351     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(1) + 1
     352     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(1) + 1
     353             :          !indf = indfor(lay)
     354             :          !indm = indminor(lay)
     355             :          !pp = pavel(lay)
     356     4388024 :          corradj(lay) =  1._r8 - 0.15_r8 * (pavel(lay) / 95.6_r8)
     357             : 
     358     4874024 :          scalen2(lay) = colbrd(lay) * scaleminorn2(lay)
     359             :       enddo
     360     4874024 :       do lay = laytrop+1, nlayers
     361    48754264 :          do ig = 1, ng1
     362   175520960 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + &
     363   219401200 :                  forfrac(lay) * (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     364   175520960 :             taun2 = scalen2(lay)*(kb_mn2(indminor(lay),ig) + & 
     365   219401200 :                  minorfrac(lay) * (kb_mn2(indminor(lay)+1,ig) - kb_mn2(indminor(lay),ig)))
     366   175520960 :             taug(lay,ig) = corradj(lay) * (colh2o(lay) * &
     367   175520960 :                 (fac00(lay) * absb(ind0(lay),ig) + &
     368   175520960 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
     369   175520960 :                  fac01(lay) * absb(ind1(lay),ig) + &
     370   175520960 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &  
     371   877604800 :                  + taufor + taun2)
     372    48268264 :             fracs(lay,ig) = fracrefb(ig)
     373             :          enddo
     374             :       enddo
     375             : 
     376      486000 :       end subroutine taugb1
     377             : 
     378             : !----------------------------------------------------------------------------
     379      486000 :       subroutine taugb2
     380             : !----------------------------------------------------------------------------
     381             : !
     382             : !     band 2:  350-500 cm-1 (low key - h2o; high key - h2o)
     383             : !
     384             : !     note: previous version of rrtm band 2: 
     385             : !           250 - 500 cm-1 (low - h2o; high - h2o)
     386             : !----------------------------------------------------------------------------
     387             : 
     388             : ! ------- Modules -------
     389             : 
     390             :       use parrrtm, only : ng2, ngs1
     391             :       use rrlw_kg02, only : fracrefa, fracrefb, absa, absb, &
     392             :                             selfref, forref
     393             : 
     394             : ! ------- Declarations -------
     395             : 
     396             : ! Local 
     397      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
     398      972000 :       real(kind=r8) :: corradj(nlayers), tauself, taufor
     399             : 
     400             : 
     401             : ! Compute the optical depth by interpolating in ln(pressure) and 
     402             : ! temperature.  Below laytrop, the water vapor self-continuum and
     403             : ! foreign continuum is interpolated (in temperature) separately.
     404             : 
     405             : ! Lower atmosphere loop
     406     9219976 :       do lay = 1, laytrop
     407             : 
     408     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(2) + 1
     409     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(2) + 1
     410             :          !inds = indself(lay)
     411             :          !indf = indfor(lay)
     412             :          !pp = pavel(lay)
     413     9219976 :          corradj(lay) = 1._r8 - .05_r8 * (pavel(lay) - 100._r8) / 900._r8
     414             :       enddo
     415     9219976 :       do lay = 1, laytrop
     416   114027688 :          do ig = 1, ng2
     417   524038560 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
     418   628846272 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     419   524038560 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     420   628846272 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     421   419230848 :             taug(lay,ngs1+ig) = corradj(lay) * (colh2o(lay) * &
     422   419230848 :                 (fac00(lay) * absa(ind0(lay),ig) + &
     423   419230848 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
     424   419230848 :                  fac01(lay) * absa(ind1(lay),ig) + &
     425   419230848 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
     426  2096154240 :                  + tauself + taufor)
     427   113541688 :             fracs(lay,ngs1+ig) = fracrefa(ig)
     428             :          enddo
     429             :       enddo
     430             : 
     431             : ! Upper atmosphere loop
     432     4874024 :       do lay = laytrop+1, nlayers
     433             : 
     434     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(2) + 1
     435     4874024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(2) + 1
     436             :          !indf = indfor(lay)
     437             :       enddo
     438     4874024 :       do lay = laytrop+1, nlayers
     439    57530312 :          do ig = 1, ng2
     440   210625152 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + &
     441   263281440 :                  forfrac(lay) * (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     442   157968864 :             taug(lay,ngs1+ig) = colh2o(lay) * &
     443   210625152 :                 (fac00(lay) * absb(ind0(lay),ig) + &
     444   210625152 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
     445   210625152 :                  fac01(lay) * absb(ind1(lay),ig) + &
     446   210625152 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
     447  1000469472 :                  + taufor
     448    57044312 :             fracs(lay,ngs1+ig) = fracrefb(ig)
     449             :          enddo
     450             :       enddo
     451             : 
     452      486000 :       end subroutine taugb2
     453             : 
     454             : !----------------------------------------------------------------------------
     455      486000 :       subroutine taugb3
     456             : !----------------------------------------------------------------------------
     457             : !
     458             : !     band 3:  500-630 cm-1 (low key - h2o,co2; low minor - n2o)
     459             : !                           (high key - h2o,co2; high minor - n2o)
     460             : !----------------------------------------------------------------------------
     461             : 
     462             : ! ------- Modules -------
     463             : 
     464             :       use parrrtm, only : ng3, ngs2
     465             :       use rrlw_ref, only : chi_mls
     466             :       use rrlw_kg03, only : fracrefa, fracrefb, absa, absb,&
     467             :                             ka_mn2o, kb_mn2o, selfref, forref
     468             : 
     469             : ! ------- Declarations -------
     470             : 
     471             : ! Local 
     472      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers),  ig
     473      972000 :       integer, dimension(nlayers) :: js, js1, jmn2o, jpl
     474      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
     475      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
     476      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_mn2o, specparm_mn2o, specmult_mn2o, &
     477      972000 :                        fmn2o, fmn2omf, chi_n2o, ratn2o, adjfac, adjcoln2o
     478      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
     479             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
     480      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
     481      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
     482             :       real(kind=r8) :: tauself, taufor, n2om1, n2om2, absn2o
     483             :       real(kind=r8) :: refrat_planck_a, refrat_planck_b, refrat_m_a, refrat_m_b
     484             :       real(kind=r8) :: tau_major, tau_major1
     485             : 
     486             : 
     487             : ! Minor gas mapping levels:
     488             : !     lower - n2o, p = 706.272 mbar, t = 278.94 k
     489             : !     upper - n2o, p = 95.58 mbar, t = 215.7 k
     490             : 
     491             : !  P = 212.725 mb
     492      486000 :       refrat_planck_a = chi_mls(1,9)/chi_mls(2,9)
     493             : 
     494             : !  P = 95.58 mb
     495      486000 :       refrat_planck_b = chi_mls(1,13)/chi_mls(2,13)
     496             : 
     497             : !  P = 706.270mb
     498      486000 :       refrat_m_a = chi_mls(1,3)/chi_mls(2,3)
     499             : 
     500             : !  P = 95.58 mb 
     501      486000 :       refrat_m_b = chi_mls(1,13)/chi_mls(2,13)
     502             : 
     503             : ! Compute the optical depth by interpolating in ln(pressure) and 
     504             : ! temperature, and appropriate species.  Below laytrop, the water vapor 
     505             : ! self-continuum and foreign continuum is interpolated (in temperature) 
     506             : ! separately.
     507             : 
     508             : ! Lower atmosphere loop
     509     9219976 :       do lay = 1, laytrop
     510             : 
     511     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
     512     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
     513     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     514     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
     515     8733976 :          js(lay) = 1 + int(specmult(lay))
     516     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)        
     517             : 
     518     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
     519     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
     520     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     521     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
     522     8733976 :          js1(lay) = 1 + int(specmult1(lay))
     523     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     524             : 
     525     8733976 :          speccomb_mn2o(lay) = colh2o(lay) + refrat_m_a*colco2(lay)
     526     8733976 :          specparm_mn2o(lay) = colh2o(lay)/speccomb_mn2o(lay)
     527     8733976 :          if (specparm_mn2o(lay) .ge. oneminus) specparm_mn2o(lay) = oneminus
     528     8733976 :          specmult_mn2o(lay) = 8._r8*specparm_mn2o(lay)
     529     8733976 :          jmn2o(lay) = 1 + int(specmult_mn2o(lay))
     530     8733976 :          fmn2o(lay) = mod(specmult_mn2o(lay),1.0_r8)
     531     8733976 :          fmn2omf(lay) = minorfrac(lay)*fmn2o(lay)
     532             : !  In atmospheres where the amount of N2O is too great to be considered
     533             : !  a minor species, adjust the column amount of N2O by an empirical factor 
     534             : !  to obtain the proper contribution.
     535     8733976 :          chi_n2o(lay) = coln2o(lay)/coldry(lay)
     536     9219976 :          ratn2o(lay) = 1.e20_r8*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
     537             :       enddo
     538     9219976 :       do lay = 1, laytrop
     539     9219976 :          if (ratn2o(lay) .gt. 1.5_r8) then
     540           0 :             adjfac(lay) = 0.5_r8+(ratn2o(lay)-0.5_r8)**0.65_r8
     541           0 :             adjcoln2o(lay) = adjfac(lay)*chi_mls(4,jp(lay)+1)*coldry(lay)*1.e-20_r8
     542             :          else
     543     8733976 :             adjcoln2o(lay) = coln2o(lay)
     544             :          endif
     545             :       enddo
     546     9219976 :       do lay = 1, laytrop
     547             : 
     548     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
     549     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
     550     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
     551     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
     552     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
     553     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
     554             : 
     555     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(3) + js(lay)
     556     9219976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(3) + js1(lay)
     557             :       enddo
     558     9219976 :       do lay = 1, laytrop
     559             : 
     560     8733976 :          if (specparm(lay) .lt. 0.125_r8) then
     561      770299 :             p = fs(lay) - 1
     562      770299 :             p4 = p**4
     563      770299 :             fk0 = p4
     564      770299 :             fk1 = 1 - p - 2.0_r8*p4
     565      770299 :             fk2 = p + p4
     566      770299 :             fac000(lay) = fk0*fac00(lay)
     567      770299 :             fac100(lay) = fk1*fac00(lay)
     568      770299 :             fac200(lay) = fk2*fac00(lay)
     569      770299 :             fac010(lay) = fk0*fac10(lay)
     570      770299 :             fac110(lay) = fk1*fac10(lay)
     571      770299 :             fac210(lay) = fk2*fac10(lay)
     572     7963677 :          else if (specparm(lay) .gt. 0.875_r8) then
     573       17165 :             p = -fs(lay) 
     574       17165 :             p4 = p**4
     575       17165 :             fk0 = p4
     576       17165 :             fk1 = 1 - p - 2.0_r8*p4
     577       17165 :             fk2 = p + p4
     578       17165 :             fac000(lay) = fk0*fac00(lay)
     579       17165 :             fac100(lay) = fk1*fac00(lay)
     580       17165 :             fac200(lay) = fk2*fac00(lay)
     581       17165 :             fac010(lay) = fk0*fac10(lay)
     582       17165 :             fac110(lay) = fk1*fac10(lay)
     583       17165 :             fac210(lay) = fk2*fac10(lay)
     584             :          else
     585     7946512 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     586     7946512 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     587     7946512 :             fac100(lay) = fs(lay) * fac00(lay)
     588     7946512 :             fac110(lay) = fs(lay) * fac10(lay)
     589             :          endif
     590     9219976 :          if (specparm1(lay) .lt. 0.125_r8) then
     591      152313 :             p = fs1(lay) - 1
     592      152313 :             p4 = p**4
     593      152313 :             fk0 = p4
     594      152313 :             fk1 = 1 - p - 2.0_r8*p4
     595      152313 :             fk2 = p + p4
     596      152313 :             fac001(lay) = fk0*fac01(lay)
     597      152313 :             fac101(lay) = fk1*fac01(lay)
     598      152313 :             fac201(lay) = fk2*fac01(lay)
     599      152313 :             fac011(lay) = fk0*fac11(lay)
     600      152313 :             fac111(lay) = fk1*fac11(lay)
     601      152313 :             fac211(lay) = fk2*fac11(lay)
     602     8581663 :          else if (specparm1(lay) .gt. 0.875_r8) then
     603      351185 :             p = -fs1(lay) 
     604      351185 :             p4 = p**4
     605      351185 :             fk0 = p4
     606      351185 :             fk1 = 1 - p - 2.0_r8*p4
     607      351185 :             fk2 = p + p4
     608      351185 :             fac001(lay) = fk0*fac01(lay)
     609      351185 :             fac101(lay) = fk1*fac01(lay)
     610      351185 :             fac201(lay) = fk2*fac01(lay)
     611      351185 :             fac011(lay) = fk0*fac11(lay)
     612      351185 :             fac111(lay) = fk1*fac11(lay)
     613      351185 :             fac211(lay) = fk2*fac11(lay)
     614             :          else
     615     8230478 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     616     8230478 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     617     8230478 :             fac101(lay) = fs1(lay) * fac01(lay)
     618     8230478 :             fac111(lay) = fs1(lay) * fac11(lay)
     619             :          endif
     620             :       enddo
     621     9219976 :       do lay = 1, laytrop
     622             : 
     623   148963592 :          do ig = 1, ng3
     624   698718080 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
     625   838461696 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     626   698718080 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     627   838461696 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     628   838461696 :             n2om1 = ka_mn2o(jmn2o(lay),indminor(lay),ig) + fmn2o(lay) * &
     629   978205312 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay),ig) - ka_mn2o(jmn2o(lay),indminor(lay),ig))
     630   838461696 :             n2om2 = ka_mn2o(jmn2o(lay),indminor(lay)+1,ig) + fmn2o(lay) * &
     631   978205312 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay)+1,ig) - ka_mn2o(jmn2o(lay),indminor(lay)+1,ig))
     632   139743616 :             absn2o = n2om1 + minorfrac(lay) * (n2om2 - n2om1)
     633             : 
     634   139743616 :             if (specparm(lay) .lt. 0.125_r8) then
     635    12324784 :                tau_major = speccomb(lay) * &
     636    49299136 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     637    49299136 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     638    49299136 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
     639    49299136 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     640    49299136 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
     641   271145248 :                     fac210(lay) * absa(ind0(lay)+11,ig))
     642   127418832 :             else if (specparm(lay) .gt. 0.875_r8) then
     643      274640 :                tau_major = speccomb(lay) * &
     644     1098560 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
     645     1098560 :                     fac100(lay) * absa(ind0(lay),ig) + &
     646     1098560 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
     647     1098560 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
     648     1098560 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
     649     6042080 :                     fac010(lay) * absa(ind0(lay)+10,ig))
     650             :             else
     651   127144192 :                tau_major = speccomb(lay) * &
     652   508576768 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     653   508576768 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     654   508576768 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     655  1780018688 :                     fac110(lay) * absa(ind0(lay)+10,ig))
     656             :             endif
     657             : 
     658   139743616 :             if (specparm1(lay) .lt. 0.125_r8) then
     659     2437008 :                tau_major1 = speccomb1(lay) * &
     660     9748032 :                     (fac001(lay) * absa(ind1(lay),ig) + &
     661     9748032 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     662     9748032 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
     663     9748032 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     664     9748032 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
     665    53614176 :                     fac211(lay) * absa(ind1(lay)+11,ig))
     666   137306608 :             else if (specparm1(lay) .gt. 0.875_r8) then
     667     5618960 :                tau_major1 = speccomb1(lay) * &
     668    22475840 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
     669    22475840 :                     fac101(lay) * absa(ind1(lay),ig) + &
     670    22475840 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
     671    22475840 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
     672    22475840 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
     673   123617120 :                     fac011(lay) * absa(ind1(lay)+10,ig))
     674             :             else
     675   131687648 :                tau_major1 = speccomb1(lay) * &
     676   526750592 :                     (fac001(lay) * absa(ind1(lay),ig) +  &
     677   526750592 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     678   526750592 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     679  1843627072 :                     fac111(lay) * absa(ind1(lay)+10,ig))
     680             :             endif
     681             : 
     682   279487232 :             taug(lay,ngs2+ig) = tau_major + tau_major1 &
     683             :                  + tauself + taufor &
     684   419230848 :                  + adjcoln2o(lay)*absn2o
     685   838461696 :             fracs(lay,ngs2+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
     686   986939288 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
     687             :          enddo
     688             :       enddo
     689             : 
     690             : ! Upper atmosphere loop
     691     4874024 :       do lay = laytrop+1, nlayers
     692             : 
     693     4388024 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
     694     4388024 :          specparm(lay) = colh2o(lay)/speccomb(lay)
     695     4388024 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     696     4388024 :          specmult(lay) = 4._r8*(specparm(lay))
     697     4388024 :          js(lay) = 1 + int(specmult(lay))
     698     4388024 :          fs(lay) = mod(specmult(lay),1.0_r8)
     699             : 
     700     4388024 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
     701     4388024 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
     702     4388024 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     703     4388024 :          specmult1(lay) = 4._r8*(specparm1(lay))
     704     4388024 :          js1(lay) = 1 + int(specmult1(lay))
     705     4388024 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     706             : 
     707     4388024 :          fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     708     4388024 :          fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     709     4388024 :          fac100(lay) = fs(lay) * fac00(lay)
     710     4388024 :          fac110(lay) = fs(lay) * fac10(lay)
     711     4388024 :          fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     712     4388024 :          fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     713     4388024 :          fac101(lay) = fs1(lay) * fac01(lay)
     714     4388024 :          fac111(lay) = fs1(lay) * fac11(lay)
     715             : 
     716     4388024 :          speccomb_mn2o(lay) = colh2o(lay) + refrat_m_b*colco2(lay)
     717     4388024 :          specparm_mn2o(lay) = colh2o(lay)/speccomb_mn2o(lay)
     718     4388024 :          if (specparm_mn2o(lay) .ge. oneminus) specparm_mn2o(lay) = oneminus
     719     4388024 :          specmult_mn2o(lay) = 4._r8*specparm_mn2o(lay)
     720     4388024 :          jmn2o(lay) = 1 + int(specmult_mn2o(lay))
     721     4388024 :          fmn2o(lay) = mod(specmult_mn2o(lay),1.0_r8)
     722     4388024 :          fmn2omf(lay) = minorfrac(lay)*fmn2o(lay)
     723             : !  In atmospheres where the amount of N2O is too great to be considered
     724             : !  a minor species, adjust the column amount of N2O by an empirical factor 
     725             : !  to obtain the proper contribution.
     726     4388024 :          chi_n2o(lay) = coln2o(lay)/coldry(lay)
     727     4874024 :          ratn2o(lay) = 1.e20*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
     728             :       enddo
     729     4874024 :       do lay = laytrop+1, nlayers
     730     4874024 :          if (ratn2o(lay) .gt. 1.5_r8) then
     731     2441520 :             adjfac(lay) = 0.5_r8+(ratn2o(lay)-0.5_r8)**0.65_r8
     732     2441520 :             adjcoln2o(lay) = adjfac(lay)*chi_mls(4,jp(lay)+1)*coldry(lay)*1.e-20_r8
     733             :          else
     734     1946504 :             adjcoln2o(lay) = coln2o(lay)
     735             :          endif
     736             :       enddo
     737     4874024 :       do lay = laytrop+1, nlayers
     738             : 
     739     4388024 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_b*colco2(lay)
     740     4388024 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
     741     4388024 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
     742     4388024 :          specmult_planck(lay) = 4._r8*specparm_planck(lay)
     743     4388024 :          jpl(lay)= 1 + int(specmult_planck(lay))
     744     4388024 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
     745             : 
     746     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(3) + js(lay)
     747     4874024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(3) + js1(lay)
     748             :       enddo
     749     4874024 :       do lay = laytrop+1, nlayers
     750             : 
     751    75082408 :          do ig = 1, ng3
     752   280833536 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + &
     753   351041920 :                  forfrac(lay) * (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     754   421250304 :             n2om1 = kb_mn2o(jmn2o(lay),indminor(lay),ig) + fmn2o(lay) * &
     755   491458688 :                  (kb_mn2o(jmn2o(lay)+1,indminor(lay),ig)-kb_mn2o(jmn2o(lay),indminor(lay),ig))
     756   421250304 :             n2om2 = kb_mn2o(jmn2o(lay),indminor(lay)+1,ig) + fmn2o(lay) * &
     757   491458688 :                  (kb_mn2o(jmn2o(lay)+1,indminor(lay)+1,ig)-kb_mn2o(jmn2o(lay),indminor(lay)+1,ig))
     758    70208384 :             absn2o = n2om1 + minorfrac(lay) * (n2om2 - n2om1)
     759   210625152 :             taug(lay,ngs2+ig) = speccomb(lay) * &
     760   280833536 :                 (fac000(lay) * absb(ind0(lay),ig) + &
     761   280833536 :                 fac100(lay) * absb(ind0(lay)+1,ig) + &
     762   280833536 :                 fac010(lay) * absb(ind0(lay)+5,ig) + &
     763   280833536 :                 fac110(lay) * absb(ind0(lay)+6,ig)) &
     764    70208384 :                 + speccomb1(lay) * &
     765   280833536 :                 (fac001(lay) * absb(ind1(lay),ig) +  &
     766   280833536 :                 fac101(lay) * absb(ind1(lay)+1,ig) + &
     767   280833536 :                 fac011(lay) * absb(ind1(lay)+5,ig) + &
     768   280833536 :                 fac111(lay) * absb(ind1(lay)+6,ig))  &
     769             :                 + taufor &
     770  2597710208 :                 + adjcoln2o(lay)*absn2o
     771   421250304 :             fracs(lay,ngs2+ig) = fracrefb(ig,jpl(lay)) + fpl(lay) * &
     772   495846712 :                 (fracrefb(ig,jpl(lay)+1)-fracrefb(ig,jpl(lay)))
     773             :          enddo
     774             :       enddo
     775             : 
     776      486000 :       end subroutine taugb3
     777             : 
     778             : !----------------------------------------------------------------------------
     779      486000 :       subroutine taugb4
     780             : !----------------------------------------------------------------------------
     781             : !
     782             : !     band 4:  630-700 cm-1 (low key - h2o,co2; high key - o3,co2)
     783             : !----------------------------------------------------------------------------
     784             : 
     785             : ! ------- Modules -------
     786             : 
     787             :       use parrrtm, only : ng4, ngs3
     788             :       use rrlw_ref, only : chi_mls
     789             :       use rrlw_kg04, only : fracrefa, fracrefb, absa, absb, &
     790             :                             selfref, forref
     791             : 
     792             : ! ------- Declarations -------
     793             : 
     794             : ! Local 
     795      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
     796      972000 :       integer, dimension(nlayers) :: js, js1, jpl
     797      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
     798      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
     799      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
     800             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
     801      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
     802      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
     803             :       real(kind=r8) :: tauself, taufor
     804             :       real(kind=r8) :: refrat_planck_a, refrat_planck_b
     805             :       real(kind=r8) :: tau_major, tau_major1
     806             : 
     807             : 
     808             : ! P =   142.5940 mb
     809      486000 :       refrat_planck_a = chi_mls(1,11)/chi_mls(2,11)
     810             : 
     811             : ! P = 95.58350 mb
     812      486000 :       refrat_planck_b = chi_mls(3,13)/chi_mls(2,13)
     813             : 
     814             : ! Compute the optical depth by interpolating in ln(pressure) and 
     815             : ! temperature, and appropriate species.  Below laytrop, the water 
     816             : ! vapor self-continuum and foreign continuum is interpolated (in temperature) 
     817             : ! separately.
     818             : 
     819             : ! Lower atmosphere loop
     820     9219976 :       do lay = 1, laytrop
     821             : 
     822     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
     823     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
     824     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     825     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
     826     8733976 :          js(lay) = 1 + int(specmult(lay))
     827     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
     828             : 
     829     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
     830     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
     831     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     832     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
     833     8733976 :          js1(lay) = 1 + int(specmult1(lay))
     834     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     835             : 
     836     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
     837     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
     838     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
     839     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
     840     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
     841     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
     842             : 
     843     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(4) + js(lay)
     844     9219976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(4) + js1(lay)
     845             :       enddo
     846     9219976 :       do lay = 1, laytrop
     847     8733976 :          if (specparm(lay) .lt. 0.125_r8) then
     848      770299 :             p = fs(lay) - 1
     849      770299 :             p4 = p**4
     850      770299 :             fk0 = p4
     851      770299 :             fk1 = 1 - p - 2.0_r8*p4
     852      770299 :             fk2 = p + p4
     853      770299 :             fac000(lay) = fk0*fac00(lay)
     854      770299 :             fac100(lay) = fk1*fac00(lay)
     855      770299 :             fac200(lay) = fk2*fac00(lay)
     856      770299 :             fac010(lay) = fk0*fac10(lay)
     857      770299 :             fac110(lay) = fk1*fac10(lay)
     858      770299 :             fac210(lay) = fk2*fac10(lay)
     859     7963677 :          else if (specparm(lay) .gt. 0.875_r8) then
     860       17165 :             p = -fs(lay) 
     861       17165 :             p4 = p**4
     862       17165 :             fk0 = p4
     863       17165 :             fk1 = 1 - p - 2.0_r8*p4
     864       17165 :             fk2 = p + p4
     865       17165 :             fac000(lay) = fk0*fac00(lay)
     866       17165 :             fac100(lay) = fk1*fac00(lay)
     867       17165 :             fac200(lay) = fk2*fac00(lay)
     868       17165 :             fac010(lay) = fk0*fac10(lay)
     869       17165 :             fac110(lay) = fk1*fac10(lay)
     870       17165 :             fac210(lay) = fk2*fac10(lay)
     871             :          else
     872     7946512 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     873     7946512 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     874     7946512 :             fac100(lay) = fs(lay) * fac00(lay)
     875     7946512 :             fac110(lay) = fs(lay) * fac10(lay)
     876             :          endif
     877             : 
     878     9219976 :          if (specparm1(lay) .lt. 0.125_r8) then
     879      152313 :             p = fs1(lay) - 1
     880      152313 :             p4 = p**4
     881      152313 :             fk0 = p4
     882      152313 :             fk1 = 1 - p - 2.0_r8*p4
     883      152313 :             fk2 = p + p4
     884      152313 :             fac001(lay) = fk0*fac01(lay)
     885      152313 :             fac101(lay) = fk1*fac01(lay)
     886      152313 :             fac201(lay) = fk2*fac01(lay)
     887      152313 :             fac011(lay) = fk0*fac11(lay)
     888      152313 :             fac111(lay) = fk1*fac11(lay)
     889      152313 :             fac211(lay) = fk2*fac11(lay)
     890     8581663 :          else if (specparm1(lay) .gt. 0.875_r8) then
     891      351185 :             p = -fs1(lay) 
     892      351185 :             p4 = p**4
     893      351185 :             fk0 = p4
     894      351185 :             fk1 = 1 - p - 2.0_r8*p4
     895      351185 :             fk2 = p + p4
     896      351185 :             fac001(lay) = fk0*fac01(lay)
     897      351185 :             fac101(lay) = fk1*fac01(lay)
     898      351185 :             fac201(lay) = fk2*fac01(lay)
     899      351185 :             fac011(lay) = fk0*fac11(lay)
     900      351185 :             fac111(lay) = fk1*fac11(lay)
     901      351185 :             fac211(lay) = fk2*fac11(lay)
     902             :          else
     903     8230478 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     904     8230478 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     905     8230478 :             fac101(lay) = fs1(lay) * fac01(lay)
     906     8230478 :             fac111(lay) = fs1(lay) * fac11(lay)
     907             :          endif
     908             :       enddo
     909     9219976 :       do lay = 1, laytrop
     910             : 
     911   131495640 :          do ig = 1, ng4
     912   611378320 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
     913   733653984 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     914   611378320 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     915   733653984 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     916             : 
     917   122275664 :             if (specparm(lay) .lt. 0.125_r8) then
     918    10784186 :                tau_major = speccomb(lay) * &
     919    43136744 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     920    43136744 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     921    43136744 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
     922    43136744 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     923    43136744 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
     924   237252092 :                     fac210(lay) * absa(ind0(lay)+11,ig))
     925   111491478 :             else if (specparm(lay) .gt. 0.875_r8) then
     926      240310 :                tau_major = speccomb(lay) * &
     927      961240 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
     928      961240 :                     fac100(lay) * absa(ind0(lay),ig) + &
     929      961240 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
     930      961240 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
     931      961240 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
     932     5286820 :                     fac010(lay) * absa(ind0(lay)+10,ig))
     933             :             else
     934   111251168 :                tau_major = speccomb(lay) * &
     935   445004672 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     936   445004672 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     937   445004672 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     938  1557516352 :                     fac110(lay) * absa(ind0(lay)+10,ig))
     939             :             endif
     940             : 
     941   122275664 :             if (specparm1(lay) .lt. 0.125_r8) then
     942     2132382 :                tau_major1 = speccomb1(lay) * &
     943     8529528 :                     (fac001(lay) * absa(ind1(lay),ig) +  &
     944     8529528 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     945     8529528 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
     946     8529528 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     947     8529528 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
     948    46912404 :                     fac211(lay) * absa(ind1(lay)+11,ig))
     949   120143282 :             else if (specparm1(lay) .gt. 0.875_r8) then
     950     4916590 :                tau_major1 = speccomb1(lay) * &
     951    19666360 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
     952    19666360 :                     fac101(lay) * absa(ind1(lay),ig) + &
     953    19666360 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
     954    19666360 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
     955    19666360 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
     956   108164980 :                     fac011(lay) * absa(ind1(lay)+10,ig))
     957             :             else
     958   115226692 :                tau_major1 = speccomb1(lay) * &
     959   460906768 :                     (fac001(lay) * absa(ind1(lay),ig) + &
     960   460906768 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     961   460906768 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     962  1613173688 :                     fac111(lay) * absa(ind1(lay)+10,ig))
     963             :             endif
     964             : 
     965   244551328 :             taug(lay,ngs3+ig) = tau_major + tau_major1 &
     966   244551328 :                  + tauself + taufor
     967   733653984 :             fracs(lay,ngs3+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
     968   864663624 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
     969             :          enddo
     970             :       enddo
     971             : 
     972             : ! Upper atmosphere loop
     973     4874024 :       do lay = laytrop+1, nlayers
     974             : 
     975     4388024 :          speccomb(lay) = colo3(lay) + rat_o3co2(lay)*colco2(lay)
     976     4388024 :          specparm(lay) = colo3(lay)/speccomb(lay)
     977     4388024 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     978     4388024 :          specmult(lay) = 4._r8*(specparm(lay))
     979     4388024 :          js(lay) = 1 + int(specmult(lay))
     980     4388024 :          fs(lay) = mod(specmult(lay),1.0_r8)
     981             : 
     982     4388024 :          speccomb1(lay) = colo3(lay) + rat_o3co2_1(lay)*colco2(lay)
     983     4388024 :          specparm1(lay) = colo3(lay)/speccomb1(lay)
     984     4388024 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     985     4388024 :          specmult1(lay) = 4._r8*(specparm1(lay))
     986     4388024 :          js1(lay) = 1 + int(specmult1(lay))
     987     4388024 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     988             : 
     989     4388024 :          fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     990     4388024 :          fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     991     4388024 :          fac100(lay) = fs(lay) * fac00(lay)
     992     4388024 :          fac110(lay) = fs(lay) * fac10(lay)
     993     4388024 :          fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     994     4388024 :          fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     995     4388024 :          fac101(lay) = fs1(lay) * fac01(lay)
     996     4388024 :          fac111(lay) = fs1(lay) * fac11(lay)
     997             : 
     998     4388024 :          speccomb_planck(lay) = colo3(lay)+refrat_planck_b*colco2(lay)
     999     4388024 :          specparm_planck(lay) = colo3(lay)/speccomb_planck(lay)
    1000     4388024 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1001     4388024 :          specmult_planck(lay) = 4._r8*specparm_planck(lay)
    1002     4388024 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1003     4388024 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1004             : 
    1005     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(4) + js(lay)
    1006     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(4) + js1(lay)
    1007    65820360 :          do ig = 1, ng4
    1008   184297008 :             taug(lay,ngs3+ig) =  speccomb(lay) * &
    1009   245729344 :                 (fac000(lay) * absb(ind0(lay),ig) + &
    1010   245729344 :                 fac100(lay) * absb(ind0(lay)+1,ig) + &
    1011   245729344 :                 fac010(lay) * absb(ind0(lay)+5,ig) + &
    1012   245729344 :                 fac110(lay) * absb(ind0(lay)+6,ig)) &
    1013    61432336 :                 + speccomb1(lay) * &
    1014   245729344 :                 (fac001(lay) * absb(ind1(lay),ig) +  &
    1015   245729344 :                 fac101(lay) * absb(ind1(lay)+1,ig) + &
    1016   245729344 :                 fac011(lay) * absb(ind1(lay)+5,ig) + &
    1017  2027267088 :                 fac111(lay) * absb(ind1(lay)+6,ig))
    1018   368594016 :             fracs(lay,ngs3+ig) = fracrefb(ig,jpl(lay)) + fpl(lay) * &
    1019   434414376 :                 (fracrefb(ig,jpl(lay)+1)-fracrefb(ig,jpl(lay)))
    1020             :          enddo
    1021             : 
    1022             : ! Empirical modification to code to improve stratospheric cooling rates
    1023             : ! for co2.  Revised to apply weighting for g-point reduction in this band.
    1024             : 
    1025     4388024 :          taug(lay,ngs3+8)=taug(lay,ngs3+8)*0.92
    1026     4388024 :          taug(lay,ngs3+9)=taug(lay,ngs3+9)*0.88
    1027     4388024 :          taug(lay,ngs3+10)=taug(lay,ngs3+10)*1.07
    1028     4388024 :          taug(lay,ngs3+11)=taug(lay,ngs3+11)*1.1
    1029     4388024 :          taug(lay,ngs3+12)=taug(lay,ngs3+12)*0.99
    1030     4388024 :          taug(lay,ngs3+13)=taug(lay,ngs3+13)*0.88
    1031     4874024 :          taug(lay,ngs3+14)=taug(lay,ngs3+14)*0.943
    1032             : 
    1033             :       enddo
    1034             : 
    1035      486000 :       end subroutine taugb4
    1036             : 
    1037             : !----------------------------------------------------------------------------
    1038      486000 :       subroutine taugb5
    1039             : !----------------------------------------------------------------------------
    1040             : !
    1041             : !     band 5:  700-820 cm-1 (low key - h2o,co2; low minor - o3, ccl4)
    1042             : !                           (high key - o3,co2)
    1043             : !----------------------------------------------------------------------------
    1044             : 
    1045             : ! ------- Modules -------
    1046             : 
    1047             :       use parrrtm, only : ng5, ngs4
    1048             :       use rrlw_ref, only : chi_mls
    1049             :       use rrlw_kg05, only : fracrefa, fracrefb, absa, absb, &
    1050             :                             ka_mo3, selfref, forref, ccl4
    1051             : 
    1052             : ! ------- Declarations -------
    1053             : 
    1054             : ! Local 
    1055      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers),  ig
    1056      972000 :       integer, dimension(nlayers) :: js, js1, jmo3, jpl
    1057      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    1058      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    1059      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_mo3, specparm_mo3, specmult_mo3, fmo3
    1060      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    1061             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    1062      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    1063      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    1064             :       real(kind=r8) :: tauself, taufor, o3m1, o3m2, abso3
    1065             :       real(kind=r8) :: refrat_planck_a, refrat_planck_b, refrat_m_a
    1066             :       real(kind=r8) :: tau_major, tau_major1
    1067             : 
    1068             : 
    1069             : ! Minor gas mapping level :
    1070             : !     lower - o3, p = 317.34 mbar, t = 240.77 k
    1071             : !     lower - ccl4
    1072             : 
    1073             : ! Calculate reference ratio to be used in calculation of Planck
    1074             : ! fraction in lower/upper atmosphere.
    1075             : 
    1076             : ! P = 473.420 mb
    1077      486000 :       refrat_planck_a = chi_mls(1,5)/chi_mls(2,5)
    1078             : 
    1079             : ! P = 0.2369 mb
    1080      486000 :       refrat_planck_b = chi_mls(3,43)/chi_mls(2,43)
    1081             : 
    1082             : ! P = 317.3480
    1083      486000 :       refrat_m_a = chi_mls(1,7)/chi_mls(2,7)
    1084             : 
    1085             : ! Compute the optical depth by interpolating in ln(pressure) and 
    1086             : ! temperature, and appropriate species.  Below laytrop, the 
    1087             : ! water vapor self-continuum and foreign continuum is 
    1088             : ! interpolated (in temperature) separately.
    1089             : 
    1090             : ! Lower atmosphere loop
    1091     9219976 :       do lay = 1, laytrop
    1092             : 
    1093     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
    1094     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    1095     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1096     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
    1097     8733976 :          js(lay) = 1 + int(specmult(lay))
    1098     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1099             : 
    1100     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
    1101     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    1102     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1103     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
    1104     8733976 :          js1(lay) = 1 + int(specmult1(lay))
    1105     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1106             : 
    1107     8733976 :          speccomb_mo3(lay) = colh2o(lay) + refrat_m_a*colco2(lay)
    1108     8733976 :          specparm_mo3(lay) = colh2o(lay)/speccomb_mo3(lay)
    1109     8733976 :          if (specparm_mo3(lay) .ge. oneminus) specparm_mo3(lay) = oneminus
    1110     8733976 :          specmult_mo3(lay) = 8._r8*specparm_mo3(lay)
    1111     8733976 :          jmo3(lay) = 1 + int(specmult_mo3(lay))
    1112     8733976 :          fmo3(lay) = mod(specmult_mo3(lay),1.0_r8)
    1113             : 
    1114     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
    1115     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    1116     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1117     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    1118     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1119     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1120             : 
    1121     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(5) + js(lay)
    1122     9219976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(5) + js1(lay)
    1123             :       enddo
    1124     9219976 :       do lay = 1, laytrop
    1125     8733976 :          if (specparm(lay) .lt. 0.125_r8) then
    1126      770299 :             p = fs(lay) - 1
    1127      770299 :             p4 = p**4
    1128      770299 :             fk0 = p4
    1129      770299 :             fk1 = 1 - p - 2.0_r8*p4
    1130      770299 :             fk2 = p + p4
    1131      770299 :             fac000(lay) = fk0*fac00(lay)
    1132      770299 :             fac100(lay) = fk1*fac00(lay)
    1133      770299 :             fac200(lay) = fk2*fac00(lay)
    1134      770299 :             fac010(lay) = fk0*fac10(lay)
    1135      770299 :             fac110(lay) = fk1*fac10(lay)
    1136      770299 :             fac210(lay) = fk2*fac10(lay)
    1137     7963677 :          else if (specparm(lay) .gt. 0.875_r8) then
    1138       17165 :             p = -fs(lay) 
    1139       17165 :             p4 = p**4
    1140       17165 :             fk0 = p4
    1141       17165 :             fk1 = 1 - p - 2.0_r8*p4
    1142       17165 :             fk2 = p + p4
    1143       17165 :             fac000(lay) = fk0*fac00(lay)
    1144       17165 :             fac100(lay) = fk1*fac00(lay)
    1145       17165 :             fac200(lay) = fk2*fac00(lay)
    1146       17165 :             fac010(lay) = fk0*fac10(lay)
    1147       17165 :             fac110(lay) = fk1*fac10(lay)
    1148       17165 :             fac210(lay) = fk2*fac10(lay)
    1149             :          else
    1150     7946512 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1151     7946512 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1152     7946512 :             fac100(lay) = fs(lay) * fac00(lay)
    1153     7946512 :             fac110(lay) = fs(lay) * fac10(lay)
    1154             :          endif
    1155             : 
    1156     9219976 :          if (specparm1(lay) .lt. 0.125_r8) then
    1157      152313 :             p = fs1(lay) - 1
    1158      152313 :             p4 = p**4
    1159      152313 :             fk0 = p4
    1160      152313 :             fk1 = 1 - p - 2.0_r8*p4
    1161      152313 :             fk2 = p + p4
    1162      152313 :             fac001(lay) = fk0*fac01(lay)
    1163      152313 :             fac101(lay) = fk1*fac01(lay)
    1164      152313 :             fac201(lay) = fk2*fac01(lay)
    1165      152313 :             fac011(lay) = fk0*fac11(lay)
    1166      152313 :             fac111(lay) = fk1*fac11(lay)
    1167      152313 :             fac211(lay) = fk2*fac11(lay)
    1168     8581663 :          else if (specparm1(lay) .gt. 0.875_r8) then
    1169      351185 :             p = -fs1(lay) 
    1170      351185 :             p4 = p**4
    1171      351185 :             fk0 = p4
    1172      351185 :             fk1 = 1 - p - 2.0_r8*p4
    1173      351185 :             fk2 = p + p4
    1174      351185 :             fac001(lay) = fk0*fac01(lay)
    1175      351185 :             fac101(lay) = fk1*fac01(lay)
    1176      351185 :             fac201(lay) = fk2*fac01(lay)
    1177      351185 :             fac011(lay) = fk0*fac11(lay)
    1178      351185 :             fac111(lay) = fk1*fac11(lay)
    1179      351185 :             fac211(lay) = fk2*fac11(lay)
    1180             :          else
    1181     8230478 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1182     8230478 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1183     8230478 :             fac101(lay) = fs1(lay) * fac01(lay)
    1184     8230478 :             fac111(lay) = fs1(lay) * fac11(lay)
    1185             :          endif
    1186             :       enddo
    1187     9219976 :       do lay = 1, laytrop
    1188             : 
    1189   148963592 :          do ig = 1, ng5
    1190   698718080 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    1191   838461696 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1192   698718080 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1193   838461696 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    1194   838461696 :             o3m1 = ka_mo3(jmo3(lay),indminor(lay),ig) + fmo3(lay) * &
    1195   978205312 :                  (ka_mo3(jmo3(lay)+1,indminor(lay),ig)-ka_mo3(jmo3(lay),indminor(lay),ig))
    1196   838461696 :             o3m2 = ka_mo3(jmo3(lay),indminor(lay)+1,ig) + fmo3(lay) * &
    1197   978205312 :                  (ka_mo3(jmo3(lay)+1,indminor(lay)+1,ig)-ka_mo3(jmo3(lay),indminor(lay)+1,ig))
    1198   139743616 :             abso3 = o3m1 + minorfrac(lay)*(o3m2-o3m1)
    1199             : 
    1200   139743616 :             if (specparm(lay) .lt. 0.125_r8) then
    1201    12324784 :                tau_major = speccomb(lay) * &
    1202    49299136 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1203    49299136 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1204    49299136 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    1205    49299136 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1206    49299136 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    1207   271145248 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    1208   127418832 :             else if (specparm(lay) .gt. 0.875_r8) then
    1209      274640 :                tau_major = speccomb(lay) * &
    1210     1098560 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    1211     1098560 :                     fac100(lay) * absa(ind0(lay),ig) + &
    1212     1098560 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    1213     1098560 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    1214     1098560 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    1215     6042080 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    1216             :             else
    1217   127144192 :                tau_major = speccomb(lay) * &
    1218   508576768 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1219   508576768 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1220   508576768 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1221  1780018688 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    1222             :             endif
    1223             : 
    1224   139743616 :             if (specparm1(lay) .lt. 0.125_r8) then
    1225     2437008 :                tau_major1 = speccomb1(lay) * &
    1226     9748032 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    1227     9748032 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1228     9748032 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    1229     9748032 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1230     9748032 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    1231    53614176 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    1232   137306608 :             else if (specparm1(lay) .gt. 0.875_r8) then
    1233     5618960 :                tau_major1 = speccomb1(lay) * & 
    1234    22475840 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    1235    22475840 :                     fac101(lay) * absa(ind1(lay),ig) + &
    1236    22475840 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    1237    22475840 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    1238    22475840 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    1239   123617120 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    1240             :             else
    1241   131687648 :                tau_major1 = speccomb1(lay) * &
    1242   526750592 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    1243   526750592 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1244   526750592 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1245  1843627072 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    1246             :             endif
    1247             : 
    1248   279487232 :             taug(lay,ngs4+ig) = tau_major + tau_major1 &
    1249             :                  + tauself + taufor &
    1250   139743616 :                  + abso3*colo3(lay) &
    1251   558974464 :                  + wx(1,lay) * ccl4(ig)
    1252   838461696 :             fracs(lay,ngs4+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    1253   986939288 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    1254             :          enddo
    1255             :       enddo
    1256             : 
    1257             : ! Upper atmosphere loop
    1258     4874024 :       do lay = laytrop+1, nlayers
    1259             : 
    1260     4388024 :          speccomb(lay) = colo3(lay) + rat_o3co2(lay)*colco2(lay)
    1261     4388024 :          specparm(lay) = colo3(lay)/speccomb(lay)
    1262     4388024 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1263     4388024 :          specmult(lay) = 4._r8*(specparm(lay))
    1264     4388024 :          js(lay) = 1 + int(specmult(lay))
    1265     4388024 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1266             : 
    1267     4388024 :          speccomb1(lay) = colo3(lay) + rat_o3co2_1(lay)*colco2(lay)
    1268     4388024 :          specparm1(lay) = colo3(lay)/speccomb1(lay)
    1269     4388024 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1270     4388024 :          specmult1(lay) = 4._r8*(specparm1(lay))
    1271     4388024 :          js1(lay) = 1 + int(specmult1(lay))
    1272     4388024 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1273             : 
    1274     4388024 :          fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1275     4388024 :          fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1276     4388024 :          fac100(lay) = fs(lay) * fac00(lay)
    1277     4388024 :          fac110(lay) = fs(lay) * fac10(lay)
    1278     4388024 :          fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1279     4388024 :          fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1280     4388024 :          fac101(lay) = fs1(lay) * fac01(lay)
    1281     4388024 :          fac111(lay) = fs1(lay) * fac11(lay)
    1282             : 
    1283     4388024 :          speccomb_planck(lay) = colo3(lay)+refrat_planck_b*colco2(lay)
    1284     4388024 :          specparm_planck(lay) = colo3(lay)/speccomb_planck(lay)
    1285     4388024 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1286     4388024 :          specmult_planck(lay) = 4._r8*specparm_planck(lay)
    1287     4388024 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1288     4388024 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1289             : 
    1290     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(5) + js(lay)
    1291     4874024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(5) + js1(lay)
    1292             :       enddo
    1293     4874024 :       do lay = laytrop+1, nlayers
    1294    75082408 :          do ig = 1, ng5
    1295   210625152 :             taug(lay,ngs4+ig) = speccomb(lay) * &
    1296   280833536 :                 (fac000(lay) * absb(ind0(lay),ig) + &
    1297   280833536 :                 fac100(lay) * absb(ind0(lay)+1,ig) + &
    1298   280833536 :                 fac010(lay) * absb(ind0(lay)+5,ig) + &
    1299   280833536 :                 fac110(lay) * absb(ind0(lay)+6,ig)) &
    1300    70208384 :                 + speccomb1(lay) * &
    1301   280833536 :                 (fac001(lay) * absb(ind1(lay),ig) + &
    1302   280833536 :                 fac101(lay) * absb(ind1(lay)+1,ig) + &
    1303   280833536 :                 fac011(lay) * absb(ind1(lay)+5,ig) + &
    1304   280833536 :                 fac111(lay) * absb(ind1(lay)+6,ig))  &
    1305  2597710208 :                 + wx(1,lay) * ccl4(ig)
    1306   421250304 :             fracs(lay,ngs4+ig) = fracrefb(ig,jpl(lay)) + fpl(lay) * &
    1307   495846712 :                 (fracrefb(ig,jpl(lay)+1)-fracrefb(ig,jpl(lay)))
    1308             :          enddo
    1309             :       enddo
    1310             : 
    1311      486000 :       end subroutine taugb5
    1312             : 
    1313             : !----------------------------------------------------------------------------
    1314      486000 :       subroutine taugb6
    1315             : !----------------------------------------------------------------------------
    1316             : !
    1317             : !     band 6:  820-980 cm-1 (low key - h2o; low minor - co2)
    1318             : !                           (high key - nothing; high minor - cfc11, cfc12)
    1319             : !----------------------------------------------------------------------------
    1320             : 
    1321             : ! ------- Modules -------
    1322             : 
    1323             :       use parrrtm, only : ng6, ngs5
    1324             :       use rrlw_ref, only : chi_mls
    1325             :       use rrlw_kg06, only : fracrefa, absa, ka_mco2, &
    1326             :                             selfref, forref, cfc11adj, cfc12
    1327             : 
    1328             : ! ------- Declarations -------
    1329             : 
    1330             : ! Local 
    1331      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1332      972000 :       real(kind=r8), dimension(nlayers) :: chi_co2, ratco2, adjfac, adjcolco2
    1333             :       real(kind=r8) :: tauself, taufor, absco2
    1334             : 
    1335             : 
    1336             : ! Minor gas mapping level:
    1337             : !     lower - co2, p = 706.2720 mb, t = 294.2 k
    1338             : !     upper - cfc11, cfc12
    1339             : 
    1340             : ! Compute the optical depth by interpolating in ln(pressure) and
    1341             : ! temperature. The water vapor self-continuum and foreign continuum
    1342             : ! is interpolated (in temperature) separately.  
    1343             : 
    1344             : ! Lower atmosphere loop
    1345     9219976 :       do lay = 1, laytrop
    1346             : 
    1347             : ! In atmospheres where the amount of CO2 is too great to be considered
    1348             : ! a minor species, adjust the column amount of CO2 by an empirical factor 
    1349             : ! to obtain the proper contribution.
    1350     8733976 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1351     9219976 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1352             :       enddo
    1353     9219976 :       do lay = 1, laytrop
    1354     9219976 :          if (ratco2(lay) .gt. 3.0_r8) then
    1355           0 :             adjfac(lay) = 2.0_r8+(ratco2(lay)-2.0_r8)**0.77_r8
    1356           0 :             adjcolco2(lay) = adjfac(lay)*chi_mls(2,jp(lay)+1)*coldry(lay)*1.e-20_r8
    1357             :          else
    1358     8733976 :             adjcolco2(lay) = colco2(lay)
    1359             :          endif
    1360             :       enddo
    1361     9219976 :       do lay = 1, laytrop
    1362             : 
    1363     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(6) + 1
    1364     9219976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(6) + 1
    1365             :       enddo
    1366     9219976 :       do lay = 1, laytrop
    1367             : 
    1368    79091784 :          do ig = 1, ng6
    1369   349359040 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    1370   419230848 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1371   349359040 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1372   419230848 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig)))
    1373   279487232 :             absco2 =  (ka_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1374   349359040 :                  (ka_mco2(indminor(lay)+1,ig) - ka_mco2(indminor(lay),ig)))
    1375   209615424 :             taug(lay,ngs5+ig) = colh2o(lay) * &
    1376   279487232 :                 (fac00(lay) * absa(ind0(lay),ig) + &
    1377   279487232 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    1378   279487232 :                  fac01(lay) * absa(ind1(lay),ig) +  &
    1379   279487232 :                  fac11(lay) * absa(ind1(lay)+1,ig))  &
    1380             :                  + tauself + taufor &
    1381    69871808 :                  + adjcolco2(lay) * absco2 &
    1382   139743616 :                  + wx(2,lay) * cfc11adj(ig) &
    1383  1607051584 :                  + wx(3,lay) * cfc12(ig)
    1384    78605784 :             fracs(lay,ngs5+ig) = fracrefa(ig)
    1385             :          enddo
    1386             :       enddo
    1387             : 
    1388             : ! Upper atmosphere loop
    1389             : ! Nothing important goes on above laytrop in this band.
    1390     4874024 :       do lay = laytrop+1, nlayers
    1391             : 
    1392    39978216 :          do ig = 1, ng6
    1393    70208384 :             taug(lay,ngs5+ig) = 0.0_r8 &
    1394    70208384 :                  + wx(2,lay) * cfc11adj(ig) &
    1395   175520960 :                  + wx(3,lay) * cfc12(ig)
    1396    39492216 :             fracs(lay,ngs5+ig) = fracrefa(ig)
    1397             :          enddo
    1398             :       enddo
    1399             : 
    1400      486000 :       end subroutine taugb6
    1401             : 
    1402             : !----------------------------------------------------------------------------
    1403      486000 :       subroutine taugb7
    1404             : !----------------------------------------------------------------------------
    1405             : !
    1406             : !     band 7:  980-1080 cm-1 (low key - h2o,o3; low minor - co2)
    1407             : !                            (high key - o3; high minor - co2)
    1408             : !----------------------------------------------------------------------------
    1409             : 
    1410             : ! ------- Modules -------
    1411             : 
    1412             :       use parrrtm, only : ng7, ngs6
    1413             :       use rrlw_ref, only : chi_mls
    1414             :       use rrlw_kg07, only : fracrefa, fracrefb, absa, absb, &
    1415             :                             ka_mco2, kb_mco2, selfref, forref
    1416             : 
    1417             : ! ------- Declarations -------
    1418             : 
    1419             : ! Local 
    1420      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1421      972000 :       integer, dimension(nlayers) :: js, js1, jmco2, jpl
    1422      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    1423      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    1424      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_mco2, specparm_mco2, specmult_mco2, fmco2
    1425      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    1426             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    1427      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    1428      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    1429             :       real(kind=r8) :: tauself, taufor, co2m1, co2m2, absco2
    1430      972000 :       real(kind=r8), dimension(nlayers) :: chi_co2, ratco2, adjfac, adjcolco2
    1431             :       real(kind=r8) :: refrat_planck_a, refrat_m_a
    1432             :       real(kind=r8) :: tau_major, tau_major1
    1433             : 
    1434             : 
    1435             : ! Minor gas mapping level :
    1436             : !     lower - co2, p = 706.2620 mbar, t= 278.94 k
    1437             : !     upper - co2, p = 12.9350 mbar, t = 234.01 k
    1438             : 
    1439             : ! Calculate reference ratio to be used in calculation of Planck
    1440             : ! fraction in lower atmosphere.
    1441             : 
    1442             : ! P = 706.2620 mb
    1443      486000 :       refrat_planck_a = chi_mls(1,3)/chi_mls(3,3)
    1444             : 
    1445             : ! P = 706.2720 mb
    1446      486000 :       refrat_m_a = chi_mls(1,3)/chi_mls(3,3)
    1447             : 
    1448             : ! Compute the optical depth by interpolating in ln(pressure), 
    1449             : ! temperature, and appropriate species.  Below laytrop, the water
    1450             : ! vapor self-continuum and foreign continuum is interpolated 
    1451             : ! (in temperature) separately. 
    1452             : 
    1453             : ! Lower atmosphere loop
    1454     9219976 :       do lay = 1, laytrop
    1455             : 
    1456     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2oo3(lay)*colo3(lay)
    1457     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    1458     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1459     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
    1460     8733976 :          js(lay) = 1 + int(specmult(lay))
    1461     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1462             : 
    1463     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2oo3_1(lay)*colo3(lay)
    1464     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    1465     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1466     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
    1467     8733976 :          js1(lay) = 1 + int(specmult1(lay))
    1468     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1469             : 
    1470     8733976 :          speccomb_mco2(lay) = colh2o(lay) + refrat_m_a*colo3(lay)
    1471     8733976 :          specparm_mco2(lay) = colh2o(lay)/speccomb_mco2(lay)
    1472     8733976 :          if (specparm_mco2(lay) .ge. oneminus) specparm_mco2(lay) = oneminus
    1473     8733976 :          specmult_mco2(lay) = 8._r8*specparm_mco2(lay)
    1474             : 
    1475     8733976 :          jmco2(lay) = 1 + int(specmult_mco2(lay))
    1476     8733976 :          fmco2(lay) = mod(specmult_mco2(lay),1.0_r8)
    1477             : 
    1478             : !  In atmospheres where the amount of CO2 is too great to be considered
    1479             : !  a minor species, adjust the column amount of CO2 by an empirical factor 
    1480             : !  to obtain the proper contribution.
    1481     8733976 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1482     8733976 :          ratco2(lay) = 1.e20*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1483     8733976 :          if (ratco2(lay) .gt. 3.0_r8) then
    1484           0 :             adjfac(lay) = 3.0_r8+(ratco2(lay)-3.0_r8)**0.79_r8
    1485           0 :             adjcolco2(lay) = adjfac(lay)*chi_mls(2,jp(lay)+1)*coldry(lay)*1.e-20_r8
    1486             :          else
    1487     8733976 :             adjcolco2(lay) = colco2(lay)
    1488             :          endif
    1489             : 
    1490     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colo3(lay)
    1491     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    1492     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1493     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    1494     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1495     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1496             : 
    1497     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(7) + js(lay)
    1498     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(7) + js1(lay)
    1499             : 
    1500     8733976 :          if (specparm(lay) .lt. 0.125_r8) then
    1501      567864 :             p = fs(lay) - 1
    1502      567864 :             p4 = p**4
    1503      567864 :             fk0 = p4
    1504      567864 :             fk1 = 1 - p - 2.0_r8*p4
    1505      567864 :             fk2 = p + p4
    1506      567864 :             fac000(lay) = fk0*fac00(lay)
    1507      567864 :             fac100(lay) = fk1*fac00(lay)
    1508      567864 :             fac200(lay) = fk2*fac00(lay)
    1509      567864 :             fac010(lay) = fk0*fac10(lay)
    1510      567864 :             fac110(lay) = fk1*fac10(lay)
    1511      567864 :             fac210(lay) = fk2*fac10(lay)
    1512     8166112 :          else if (specparm(lay) .gt. 0.875_r8) then
    1513     1359267 :             p = -fs(lay) 
    1514     1359267 :             p4 = p**4
    1515     1359267 :             fk0 = p4
    1516     1359267 :             fk1 = 1 - p - 2.0_r8*p4
    1517     1359267 :             fk2 = p + p4
    1518     1359267 :             fac000(lay) = fk0*fac00(lay)
    1519     1359267 :             fac100(lay) = fk1*fac00(lay)
    1520     1359267 :             fac200(lay) = fk2*fac00(lay)
    1521     1359267 :             fac010(lay) = fk0*fac10(lay)
    1522     1359267 :             fac110(lay) = fk1*fac10(lay)
    1523     1359267 :             fac210(lay) = fk2*fac10(lay)
    1524             :          else
    1525     6806845 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1526     6806845 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1527     6806845 :             fac100(lay) = fs(lay) * fac00(lay)
    1528     6806845 :             fac110(lay) = fs(lay) * fac10(lay)
    1529             :          endif
    1530     8733976 :          if (specparm(lay) .lt. 0.125_r8) then
    1531      567864 :             p = fs1(lay) - 1
    1532      567864 :             p4 = p**4
    1533      567864 :             fk0 = p4
    1534      567864 :             fk1 = 1 - p - 2.0_r8*p4
    1535      567864 :             fk2 = p + p4
    1536      567864 :             fac001(lay) = fk0*fac01(lay)
    1537      567864 :             fac101(lay) = fk1*fac01(lay)
    1538      567864 :             fac201(lay) = fk2*fac01(lay)
    1539      567864 :             fac011(lay) = fk0*fac11(lay)
    1540      567864 :             fac111(lay) = fk1*fac11(lay)
    1541      567864 :             fac211(lay) = fk2*fac11(lay)
    1542     8166112 :          else if (specparm1(lay) .gt. 0.875_r8) then
    1543     2645821 :             p = -fs1(lay) 
    1544     2645821 :             p4 = p**4
    1545     2645821 :             fk0 = p4
    1546     2645821 :             fk1 = 1 - p - 2.0_r8*p4
    1547     2645821 :             fk2 = p + p4
    1548     2645821 :             fac001(lay) = fk0*fac01(lay)
    1549     2645821 :             fac101(lay) = fk1*fac01(lay)
    1550     2645821 :             fac201(lay) = fk2*fac01(lay)
    1551     2645821 :             fac011(lay) = fk0*fac11(lay)
    1552     2645821 :             fac111(lay) = fk1*fac11(lay)
    1553     2645821 :             fac211(lay) = fk2*fac11(lay)
    1554             :          else
    1555     5520291 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1556     5520291 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1557     5520291 :             fac101(lay) = fs1(lay) * fac01(lay)
    1558     5520291 :             fac111(lay) = fs1(lay) * fac11(lay)
    1559             :          endif
    1560             : 
    1561   114027688 :          do ig = 1, ng7
    1562   524038560 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    1563   628846272 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1564   524038560 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1565   628846272 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    1566   628846272 :             co2m1 = ka_mco2(jmco2(lay),indminor(lay),ig) + fmco2(lay) * &
    1567   733653984 :                  (ka_mco2(jmco2(lay)+1,indminor(lay),ig) - ka_mco2(jmco2(lay),indminor(lay),ig))
    1568   628846272 :             co2m2 = ka_mco2(jmco2(lay),indminor(lay)+1,ig) + fmco2(lay) * &
    1569   733653984 :                  (ka_mco2(jmco2(lay)+1,indminor(lay)+1,ig) - ka_mco2(jmco2(lay),indminor(lay)+1,ig))
    1570   104807712 :             absco2 = co2m1 + minorfrac(lay) * (co2m2 - co2m1)
    1571             : 
    1572   104807712 :             if (specparm(lay) .lt. 0.125_r8) then
    1573     6814368 :                tau_major = speccomb(lay) * &
    1574    27257472 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1575    27257472 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1576    27257472 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    1577    27257472 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1578    27257472 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    1579   149916096 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    1580    97993344 :             else if (specparm(lay) .gt. 0.875_r8) then
    1581    16311204 :                tau_major = speccomb(lay) * &
    1582    65244816 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    1583    65244816 :                     fac100(lay) * absa(ind0(lay),ig) + &
    1584    65244816 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    1585    65244816 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    1586    65244816 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    1587   358846488 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    1588             :             else
    1589    81682140 :                tau_major = speccomb(lay) * &
    1590   326728560 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1591   326728560 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1592   326728560 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1593  1143549960 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    1594             :             endif
    1595             : 
    1596   104807712 :             if (specparm1(lay) .lt. 0.125_r8) then
    1597      643848 :                tau_major1 = speccomb1(lay) * &
    1598     2575392 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    1599     2575392 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1600     2575392 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    1601     2575392 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1602     2575392 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    1603    14164656 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    1604   104163864 :             else if (specparm1(lay) .gt. 0.875_r8) then
    1605    31749852 :                tau_major1 = speccomb1(lay) * &
    1606   126999408 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    1607   126999408 :                     fac101(lay) * absa(ind1(lay),ig) + &
    1608   126999408 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    1609   126999408 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    1610   126999408 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    1611   698496744 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    1612             :             else
    1613    72414012 :                tau_major1 = speccomb1(lay) * &
    1614   289656048 :                     (fac001(lay) * absa(ind1(lay),ig) +  &
    1615   289656048 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1616   289656048 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1617  1013796168 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    1618             :             endif
    1619             : 
    1620   209615424 :             taug(lay,ngs6+ig) = tau_major + tau_major1 &
    1621             :                  + tauself + taufor &
    1622   314423136 :                  + adjcolco2(lay)*absco2
    1623   628846272 :             fracs(lay,ngs6+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    1624   742387960 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    1625             :          enddo
    1626             :       enddo
    1627             : 
    1628             : ! Upper atmosphere loop
    1629     4874024 :       do lay = laytrop+1, nlayers
    1630             : 
    1631             : !  In atmospheres where the amount of CO2 is too great to be considered
    1632             : !  a minor species, adjust the column amount of CO2 by an empirical factor 
    1633             : !  to obtain the proper contribution.
    1634     4388024 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1635     4388024 :          ratco2(lay) = 1.e20*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1636     4388024 :          if (ratco2(lay) .gt. 3.0_r8) then
    1637           0 :             adjfac(lay) = 2.0_r8+(ratco2(lay)-2.0_r8)**0.79_r8
    1638           0 :             adjcolco2(lay) = adjfac(lay)*chi_mls(2,jp(lay)+1)*coldry(lay)*1.e-20_r8
    1639             :          else
    1640     4388024 :             adjcolco2(lay) = colco2(lay)
    1641             :          endif
    1642             : 
    1643     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(7) + 1
    1644     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(7) + 1
    1645             : 
    1646    57044312 :          do ig = 1, ng7
    1647   210625152 :             absco2 = kb_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1648   263281440 :                  (kb_mco2(indminor(lay)+1,ig) - kb_mco2(indminor(lay),ig))
    1649   157968864 :             taug(lay,ngs6+ig) = colo3(lay) * &
    1650   210625152 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    1651   210625152 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    1652   210625152 :                  fac01(lay) * absb(ind1(lay),ig) + &
    1653   210625152 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    1654  1053125760 :                  + adjcolco2(lay) * absco2
    1655    57044312 :             fracs(lay,ngs6+ig) = fracrefb(ig)
    1656             :          enddo
    1657             : 
    1658             : ! Empirical modification to code to improve stratospheric cooling rates
    1659             : ! for o3.  Revised to apply weighting for g-point reduction in this band.
    1660             : 
    1661     4388024 :          taug(lay,ngs6+6)=taug(lay,ngs6+6)*0.92_r8
    1662     4388024 :          taug(lay,ngs6+7)=taug(lay,ngs6+7)*0.88_r8
    1663     4388024 :          taug(lay,ngs6+8)=taug(lay,ngs6+8)*1.07_r8
    1664     4388024 :          taug(lay,ngs6+9)=taug(lay,ngs6+9)*1.1_r8
    1665     4388024 :          taug(lay,ngs6+10)=taug(lay,ngs6+10)*0.99_r8
    1666     4874024 :          taug(lay,ngs6+11)=taug(lay,ngs6+11)*0.855_r8
    1667             : 
    1668             :       enddo
    1669             : 
    1670      486000 :       end subroutine taugb7
    1671             : 
    1672             : !----------------------------------------------------------------------------
    1673      486000 :       subroutine taugb8
    1674             : !----------------------------------------------------------------------------
    1675             : !
    1676             : !     band 8:  1080-1180 cm-1 (low key - h2o; low minor - co2,o3,n2o)
    1677             : !                             (high key - o3; high minor - co2, n2o)
    1678             : !----------------------------------------------------------------------------
    1679             : 
    1680             : ! ------- Modules -------
    1681             : 
    1682             :       use parrrtm, only : ng8, ngs7
    1683             :       use rrlw_ref, only : chi_mls
    1684             :       use rrlw_kg08, only : fracrefa, fracrefb, absa, absb, &
    1685             :                             ka_mco2, ka_mn2o, ka_mo3, kb_mco2, kb_mn2o, &
    1686             :                             selfref, forref, cfc12, cfc22adj
    1687             : 
    1688             : ! ------- Declarations -------
    1689             : 
    1690             : ! Local 
    1691      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1692             :       real(kind=r8) :: tauself, taufor, absco2, abso3, absn2o
    1693      972000 :       real(kind=r8), dimension(nlayers) :: chi_co2, ratco2, adjfac, adjcolco2
    1694             : 
    1695             : 
    1696             : ! Minor gas mapping level:
    1697             : !     lower - co2, p = 1053.63 mb, t = 294.2 k
    1698             : !     lower - o3,  p = 317.348 mb, t = 240.77 k
    1699             : !     lower - n2o, p = 706.2720 mb, t= 278.94 k
    1700             : !     lower - cfc12,cfc11
    1701             : !     upper - co2, p = 35.1632 mb, t = 223.28 k
    1702             : !     upper - n2o, p = 8.716e-2 mb, t = 226.03 k
    1703             : 
    1704             : ! Compute the optical depth by interpolating in ln(pressure) and 
    1705             : ! temperature, and appropriate species.  Below laytrop, the water vapor 
    1706             : ! self-continuum and foreign continuum is interpolated (in temperature) 
    1707             : ! separately.
    1708             : 
    1709             : ! Lower atmosphere loop
    1710     9219976 :       do lay = 1, laytrop
    1711             : 
    1712             : !  In atmospheres where the amount of CO2 is too great to be considered
    1713             : !  a minor species, adjust the column amount of CO2 by an empirical factor 
    1714             : !  to obtain the proper contribution.
    1715     8733976 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1716     8733976 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1717     8733976 :          if (ratco2(lay) .gt. 3.0_r8) then
    1718           0 :             adjfac(lay) = 2.0_r8+(ratco2(lay)-2.0_r8)**0.65_r8
    1719           0 :             adjcolco2(lay) = adjfac(lay)*chi_mls(2,jp(lay)+1)*coldry(lay)*1.e-20_r8
    1720             :          else
    1721     8733976 :             adjcolco2(lay) = colco2(lay)
    1722             :          endif
    1723             : 
    1724     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(8) + 1
    1725     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(8) + 1
    1726             : 
    1727    79091784 :          do ig = 1, ng8
    1728   349359040 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    1729   419230848 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1730   349359040 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1731   419230848 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig)))
    1732   279487232 :             absco2 =  (ka_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1733   349359040 :                  (ka_mco2(indminor(lay)+1,ig) - ka_mco2(indminor(lay),ig)))
    1734   279487232 :             abso3 =  (ka_mo3(indminor(lay),ig) + minorfrac(lay) * &
    1735   349359040 :                  (ka_mo3(indminor(lay)+1,ig) - ka_mo3(indminor(lay),ig)))
    1736   279487232 :             absn2o =  (ka_mn2o(indminor(lay),ig) + minorfrac(lay) * &
    1737   349359040 :                  (ka_mn2o(indminor(lay)+1,ig) - ka_mn2o(indminor(lay),ig)))
    1738   209615424 :             taug(lay,ngs7+ig) = colh2o(lay) * &
    1739   279487232 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    1740   279487232 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    1741   279487232 :                  fac01(lay) * absa(ind1(lay),ig) +  &
    1742   279487232 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
    1743             :                  + tauself + taufor &
    1744    69871808 :                  + adjcolco2(lay)*absco2 &
    1745    69871808 :                  + colo3(lay) * abso3 &
    1746    69871808 :                  + coln2o(lay) * absn2o &
    1747   139743616 :                  + wx(3,lay) * cfc12(ig) &
    1748  1746795200 :                  + wx(4,lay) * cfc22adj(ig)
    1749    78605784 :             fracs(lay,ngs7+ig) = fracrefa(ig)
    1750             :          enddo
    1751             :       enddo
    1752             : 
    1753             : ! Upper atmosphere loop
    1754     4874024 :       do lay = laytrop+1, nlayers
    1755             : 
    1756             : !  In atmospheres where the amount of CO2 is too great to be considered
    1757             : !  a minor species, adjust the column amount of CO2 by an empirical factor 
    1758             : !  to obtain the proper contribution.
    1759     4388024 :          chi_co2(lay) = colco2(lay)/coldry(lay)
    1760     4388024 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1761     4388024 :          if (ratco2(lay) .gt. 3.0_r8) then
    1762           0 :             adjfac(lay) = 2.0_r8+(ratco2(lay)-2.0_r8)**0.65_r8
    1763           0 :             adjcolco2(lay) = adjfac(lay)*chi_mls(2,jp(lay)+1) * coldry(lay)*1.e-20_r8
    1764             :          else
    1765     4388024 :             adjcolco2(lay) = colco2(lay)
    1766             :          endif
    1767             : 
    1768     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(8) + 1
    1769     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(8) + 1
    1770             : 
    1771    39978216 :          do ig = 1, ng8
    1772   140416768 :             absco2 =  (kb_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1773   175520960 :                  (kb_mco2(indminor(lay)+1,ig) - kb_mco2(indminor(lay),ig)))
    1774   140416768 :             absn2o =  (kb_mn2o(indminor(lay),ig) + minorfrac(lay) * &
    1775   175520960 :                  (kb_mn2o(indminor(lay)+1,ig) - kb_mn2o(indminor(lay),ig)))
    1776   105312576 :             taug(lay,ngs7+ig) = colo3(lay) * &
    1777   140416768 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    1778   140416768 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    1779   140416768 :                  fac01(lay) * absb(ind1(lay),ig) + &
    1780   140416768 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    1781    35104192 :                  + adjcolco2(lay)*absco2 &
    1782    35104192 :                  + coln2o(lay)*absn2o & 
    1783    70208384 :                  + wx(3,lay) * cfc12(ig) &
    1784   842500608 :                  + wx(4,lay) * cfc22adj(ig)
    1785    39492216 :             fracs(lay,ngs7+ig) = fracrefb(ig)
    1786             :          enddo
    1787             :       enddo
    1788             : 
    1789      486000 :       end subroutine taugb8
    1790             : 
    1791             : !----------------------------------------------------------------------------
    1792      486000 :       subroutine taugb9
    1793             : !----------------------------------------------------------------------------
    1794             : !
    1795             : !     band 9:  1180-1390 cm-1 (low key - h2o,ch4; low minor - n2o)
    1796             : !                             (high key - ch4; high minor - n2o)
    1797             : !----------------------------------------------------------------------------
    1798             : 
    1799             : ! ------- Modules -------
    1800             : 
    1801             :       use parrrtm, only : ng9, ngs8
    1802             :       use rrlw_ref, only : chi_mls
    1803             :       use rrlw_kg09, only : fracrefa, fracrefb, absa, absb, &
    1804             :                             ka_mn2o, kb_mn2o, selfref, forref
    1805             : 
    1806             : ! ------- Declarations -------
    1807             : 
    1808             : ! Local 
    1809      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1810      972000 :       integer, dimension(nlayers) :: js, js1, jmn2o, jpl
    1811      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    1812      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    1813      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_mn2o, specparm_mn2o, specmult_mn2o, fmn2o
    1814      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    1815             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    1816      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    1817      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    1818             :       real(kind=r8) :: tauself, taufor, n2om1, n2om2, absn2o
    1819      972000 :       real(kind=r8), dimension(nlayers) :: chi_n2o, ratn2o, adjfac, adjcoln2o
    1820             :       real(kind=r8) :: refrat_planck_a, refrat_m_a
    1821             :       real(kind=r8) :: tau_major, tau_major1
    1822             : 
    1823             : 
    1824             : ! Minor gas mapping level :
    1825             : !     lower - n2o, p = 706.272 mbar, t = 278.94 k
    1826             : !     upper - n2o, p = 95.58 mbar, t = 215.7 k
    1827             : 
    1828             : ! Calculate reference ratio to be used in calculation of Planck
    1829             : ! fraction in lower/upper atmosphere.
    1830             : 
    1831             : ! P = 212 mb
    1832      486000 :       refrat_planck_a = chi_mls(1,9)/chi_mls(6,9)
    1833             : 
    1834             : ! P = 706.272 mb 
    1835      486000 :       refrat_m_a = chi_mls(1,3)/chi_mls(6,3)
    1836             : 
    1837             : ! Compute the optical depth by interpolating in ln(pressure), 
    1838             : ! temperature, and appropriate species.  Below laytrop, the water
    1839             : ! vapor self-continuum and foreign continuum is interpolated 
    1840             : ! (in temperature) separately.  
    1841             : 
    1842             : ! Lower atmosphere loop
    1843     9219976 :       do lay = 1, laytrop
    1844             : 
    1845     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2och4(lay)*colch4(lay)
    1846     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    1847     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1848     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
    1849     8733976 :          js(lay) = 1 + int(specmult(lay))
    1850     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1851             : 
    1852     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2och4_1(lay)*colch4(lay)
    1853     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    1854     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1855     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
    1856     8733976 :          js1(lay) = 1 + int(specmult1(lay))
    1857     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1858             : 
    1859     8733976 :          speccomb_mn2o(lay) = colh2o(lay) + refrat_m_a*colch4(lay)
    1860     8733976 :          specparm_mn2o(lay) = colh2o(lay)/speccomb_mn2o(lay)
    1861     8733976 :          if (specparm_mn2o(lay) .ge. oneminus) specparm_mn2o(lay) = oneminus
    1862     8733976 :          specmult_mn2o(lay) = 8._r8*specparm_mn2o(lay)
    1863     8733976 :          jmn2o(lay) = 1 + int(specmult_mn2o(lay))
    1864     8733976 :          fmn2o(lay) = mod(specmult_mn2o(lay),1.0_r8)
    1865             : 
    1866             : !  In atmospheres where the amount of N2O is too great to be considered
    1867             : !  a minor species, adjust the column amount of N2O by an empirical factor 
    1868             : !  to obtain the proper contribution.
    1869     8733976 :          chi_n2o(lay) = coln2o(lay)/(coldry(lay))
    1870     8733976 :          ratn2o(lay) = 1.e20_r8*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
    1871     8733976 :          if (ratn2o(lay) .gt. 1.5_r8) then
    1872           0 :             adjfac(lay) = 0.5_r8+(ratn2o(lay)-0.5_r8)**0.65_r8
    1873           0 :             adjcoln2o(lay) = adjfac(lay)*chi_mls(4,jp(lay)+1)*coldry(lay)*1.e-20_r8
    1874             :          else
    1875     8733976 :             adjcoln2o(lay) = coln2o(lay)
    1876             :          endif
    1877             : 
    1878     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colch4(lay)
    1879     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    1880     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1881     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    1882     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1883     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1884             : 
    1885     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(9) + js(lay)
    1886     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(9) + js1(lay)
    1887             : 
    1888     8733976 :          if (specparm(lay) .lt. 0.125_r8) then
    1889      292858 :             p = fs(lay) - 1
    1890      292858 :             p4 = p**4
    1891      292858 :             fk0 = p4
    1892      292858 :             fk1 = 1 - p - 2.0_r8*p4
    1893      292858 :             fk2 = p + p4
    1894      292858 :             fac000(lay) = fk0*fac00(lay)
    1895      292858 :             fac100(lay) = fk1*fac00(lay)
    1896      292858 :             fac200(lay) = fk2*fac00(lay)
    1897      292858 :             fac010(lay) = fk0*fac10(lay)
    1898      292858 :             fac110(lay) = fk1*fac10(lay)
    1899      292858 :             fac210(lay) = fk2*fac10(lay)
    1900     8441118 :          else if (specparm(lay) .gt. 0.875_r8) then
    1901      115205 :             p = -fs(lay) 
    1902      115205 :             p4 = p**4
    1903      115205 :             fk0 = p4
    1904      115205 :             fk1 = 1 - p - 2.0_r8*p4
    1905      115205 :             fk2 = p + p4
    1906      115205 :             fac000(lay) = fk0*fac00(lay)
    1907      115205 :             fac100(lay) = fk1*fac00(lay)
    1908      115205 :             fac200(lay) = fk2*fac00(lay)
    1909      115205 :             fac010(lay) = fk0*fac10(lay)
    1910      115205 :             fac110(lay) = fk1*fac10(lay)
    1911      115205 :             fac210(lay) = fk2*fac10(lay)
    1912             :          else
    1913     8325913 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1914     8325913 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1915     8325913 :             fac100(lay) = fs(lay) * fac00(lay)
    1916     8325913 :             fac110(lay) = fs(lay) * fac10(lay)
    1917             :          endif
    1918             : 
    1919     8733976 :          if (specparm1(lay) .lt. 0.125_r8) then
    1920       26723 :             p = fs1(lay) - 1
    1921       26723 :             p4 = p**4
    1922       26723 :             fk0 = p4
    1923       26723 :             fk1 = 1 - p - 2.0_r8*p4
    1924       26723 :             fk2 = p + p4
    1925       26723 :             fac001(lay) = fk0*fac01(lay)
    1926       26723 :             fac101(lay) = fk1*fac01(lay)
    1927       26723 :             fac201(lay) = fk2*fac01(lay)
    1928       26723 :             fac011(lay) = fk0*fac11(lay)
    1929       26723 :             fac111(lay) = fk1*fac11(lay)
    1930       26723 :             fac211(lay) = fk2*fac11(lay)
    1931     8707253 :          else if (specparm1(lay) .gt. 0.875_r8) then
    1932     1046819 :             p = -fs1(lay) 
    1933     1046819 :             p4 = p**4
    1934     1046819 :             fk0 = p4
    1935     1046819 :             fk1 = 1 - p - 2.0_r8*p4
    1936     1046819 :             fk2 = p + p4
    1937     1046819 :             fac001(lay) = fk0*fac01(lay)
    1938     1046819 :             fac101(lay) = fk1*fac01(lay)
    1939     1046819 :             fac201(lay) = fk2*fac01(lay)
    1940     1046819 :             fac011(lay) = fk0*fac11(lay)
    1941     1046819 :             fac111(lay) = fk1*fac11(lay)
    1942     1046819 :             fac211(lay) = fk2*fac11(lay)
    1943             :          else
    1944     7660434 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1945     7660434 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1946     7660434 :             fac101(lay) = fs1(lay) * fac01(lay)
    1947     7660434 :             fac111(lay) = fs1(lay) * fac11(lay)
    1948             :          endif
    1949             : 
    1950   114027688 :          do ig = 1, ng9
    1951   524038560 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    1952   628846272 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1953   524038560 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1954   628846272 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    1955   628846272 :             n2om1 = ka_mn2o(jmn2o(lay),indminor(lay),ig) + fmn2o(lay) * &
    1956   733653984 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay),ig) - ka_mn2o(jmn2o(lay),indminor(lay),ig))
    1957   628846272 :             n2om2 = ka_mn2o(jmn2o(lay),indminor(lay)+1,ig) + fmn2o(lay) * &
    1958   733653984 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay)+1,ig) - ka_mn2o(jmn2o(lay),indminor(lay)+1,ig))
    1959   104807712 :             absn2o = n2om1 + minorfrac(lay) * (n2om2 - n2om1)
    1960             : 
    1961   104807712 :             if (specparm(lay) .lt. 0.125_r8) then
    1962     3514296 :                tau_major = speccomb(lay) * &
    1963    14057184 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1964    14057184 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1965    14057184 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    1966    14057184 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1967    14057184 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    1968    77314512 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    1969   101293416 :             else if (specparm(lay) .gt. 0.875_r8) then
    1970     1382460 :                tau_major = speccomb(lay) * &
    1971     5529840 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    1972     5529840 :                     fac100(lay) * absa(ind0(lay),ig) + &
    1973     5529840 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    1974     5529840 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    1975     5529840 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    1976    30414120 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    1977             :             else
    1978    99910956 :                tau_major = speccomb(lay) * &
    1979   399643824 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1980   399643824 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1981   399643824 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1982  1398753384 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    1983             :             endif
    1984             : 
    1985   104807712 :             if (specparm1(lay) .lt. 0.125_r8) then
    1986      320676 :                tau_major1 = speccomb1(lay) * &
    1987     1282704 :                     (fac001(lay) * absa(ind1(lay),ig) + & 
    1988     1282704 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1989     1282704 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    1990     1282704 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1991     1282704 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    1992     7054872 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    1993   104487036 :             else if (specparm1(lay) .gt. 0.875_r8) then
    1994    12561828 :                tau_major1 = speccomb1(lay) * &
    1995    50247312 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    1996    50247312 :                     fac101(lay) * absa(ind1(lay),ig) + &
    1997    50247312 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    1998    50247312 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    1999    50247312 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    2000   276360216 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    2001             :             else
    2002    91925208 :                tau_major1 = speccomb1(lay) * &
    2003   367700832 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2004   367700832 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2005   367700832 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2006  1286952912 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2007             :             endif
    2008             : 
    2009   209615424 :             taug(lay,ngs8+ig) = tau_major + tau_major1 &
    2010             :                  + tauself + taufor &
    2011   314423136 :                  + adjcoln2o(lay)*absn2o
    2012   628846272 :             fracs(lay,ngs8+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2013   742387960 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2014             :          enddo
    2015             :       enddo
    2016             : 
    2017             : ! Upper atmosphere loop
    2018     4874024 :       do lay = laytrop+1, nlayers
    2019             : 
    2020             : !  In atmospheres where the amount of N2O is too great to be considered
    2021             : !  a minor species, adjust the column amount of N2O by an empirical factor 
    2022             : !  to obtain the proper contribution.
    2023     4388024 :          chi_n2o(lay) = coln2o(lay)/(coldry(lay))
    2024     4388024 :          ratn2o(lay) = 1.e20_r8*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
    2025     4388024 :          if (ratn2o(lay) .gt. 1.5_r8) then
    2026     2441520 :             adjfac(lay) = 0.5_r8+(ratn2o(lay)-0.5_r8)**0.65_r8
    2027     2441520 :             adjcoln2o(lay) = adjfac(lay)*chi_mls(4,jp(lay)+1)*coldry(lay)*1.e-20_r8
    2028             :          else
    2029     1946504 :             adjcoln2o(lay) = coln2o(lay)
    2030             :          endif
    2031             : 
    2032     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(9) + 1
    2033     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(9) + 1
    2034             : 
    2035    57530312 :          do ig = 1, ng9
    2036   210625152 :             absn2o = kb_mn2o(indminor(lay),ig) + minorfrac(lay) * &
    2037   263281440 :                 (kb_mn2o(indminor(lay)+1,ig) - kb_mn2o(indminor(lay),ig))
    2038   157968864 :             taug(lay,ngs8+ig) = colch4(lay) * &
    2039   210625152 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2040   210625152 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2041   210625152 :                  fac01(lay) * absb(ind1(lay),ig) +  &
    2042   210625152 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    2043  1053125760 :                  + adjcoln2o(lay)*absn2o
    2044    57044312 :             fracs(lay,ngs8+ig) = fracrefb(ig)
    2045             :          enddo
    2046             :       enddo
    2047             : 
    2048      486000 :       end subroutine taugb9
    2049             : 
    2050             : !----------------------------------------------------------------------------
    2051      486000 :       subroutine taugb10
    2052             : !----------------------------------------------------------------------------
    2053             : !
    2054             : !     band 10:  1390-1480 cm-1 (low key - h2o; high key - h2o)
    2055             : !----------------------------------------------------------------------------
    2056             : 
    2057             : ! ------- Modules -------
    2058             : 
    2059             :       use parrrtm, only : ng10, ngs9
    2060             :       use rrlw_kg10, only : fracrefa, fracrefb, absa, absb, &
    2061             :                             selfref, forref
    2062             : 
    2063             : ! ------- Declarations -------
    2064             : 
    2065             : ! Local 
    2066      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2067             :       real(kind=r8) :: tauself, taufor
    2068             : 
    2069             : 
    2070             : ! Compute the optical depth by interpolating in ln(pressure) and 
    2071             : ! temperature.  Below laytrop, the water vapor self-continuum and
    2072             : ! foreign continuum is interpolated (in temperature) separately.
    2073             : 
    2074             : ! Lower atmosphere loop
    2075     9219976 :       do lay = 1, laytrop
    2076     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(10) + 1
    2077     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(10) + 1
    2078             : 
    2079    61623832 :          do ig = 1, ng10
    2080   262019280 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    2081   314423136 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2082   262019280 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2083   314423136 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2084   157211568 :             taug(lay,ngs9+ig) = colh2o(lay) * &
    2085   209615424 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    2086   209615424 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    2087   209615424 :                  fac01(lay) * absa(ind1(lay),ig) + &
    2088   209615424 :                  fac11(lay) * absa(ind1(lay)+1,ig))  &
    2089   995673264 :                  + tauself + taufor
    2090    61137832 :             fracs(lay,ngs9+ig) = fracrefa(ig)
    2091             :          enddo
    2092             :       enddo
    2093             : 
    2094             : ! Upper atmosphere loop
    2095     4874024 :       do lay = laytrop+1, nlayers
    2096     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(10) + 1
    2097     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(10) + 1
    2098             : 
    2099    31202168 :          do ig = 1, ng10
    2100   131640720 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2101   157968864 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2102    78984432 :             taug(lay,ngs9+ig) = colh2o(lay) * &
    2103   105312576 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2104   105312576 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2105   105312576 :                  fac01(lay) * absb(ind1(lay),ig) +  &
    2106   105312576 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    2107   500234736 :                  + taufor
    2108    30716168 :             fracs(lay,ngs9+ig) = fracrefb(ig)
    2109             :          enddo
    2110             :       enddo
    2111             : 
    2112      486000 :       end subroutine taugb10
    2113             : 
    2114             : !----------------------------------------------------------------------------
    2115      486000 :       subroutine taugb11
    2116             : !----------------------------------------------------------------------------
    2117             : !
    2118             : !     band 11:  1480-1800 cm-1 (low - h2o; low minor - o2)
    2119             : !                              (high key - h2o; high minor - o2)
    2120             : !----------------------------------------------------------------------------
    2121             : 
    2122             : ! ------- Modules -------
    2123             : 
    2124             :       use parrrtm, only : ng11, ngs10
    2125             :       use rrlw_kg11, only : fracrefa, fracrefb, absa, absb, &
    2126             :                             ka_mo2, kb_mo2, selfref, forref
    2127             : 
    2128             : ! ------- Declarations -------
    2129             : 
    2130             : ! Local 
    2131      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2132      972000 :       real(kind=r8) :: scaleo2(nlayers), tauself, taufor, tauo2
    2133             : 
    2134             : 
    2135             : ! Minor gas mapping level :
    2136             : !     lower - o2, p = 706.2720 mbar, t = 278.94 k
    2137             : !     upper - o2, p = 4.758820 mbarm t = 250.85 k
    2138             : 
    2139             : ! Compute the optical depth by interpolating in ln(pressure) and 
    2140             : ! temperature.  Below laytrop, the water vapor self-continuum and
    2141             : ! foreign continuum is interpolated (in temperature) separately.
    2142             : 
    2143             : ! Lower atmosphere loop
    2144     9219976 :       do lay = 1, laytrop
    2145     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(11) + 1
    2146     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(11) + 1
    2147     8733976 :          scaleo2(lay) = colo2(lay)*scaleminor(lay)
    2148    79091784 :          do ig = 1, ng11
    2149   349359040 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    2150   419230848 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2151   349359040 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2152   419230848 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig)))
    2153   349359040 :             tauo2 =  scaleo2(lay) * (ka_mo2(indminor(lay),ig) + minorfrac(lay) * &
    2154   419230848 :                  (ka_mo2(indminor(lay)+1,ig) - ka_mo2(indminor(lay),ig)))
    2155   209615424 :             taug(lay,ngs10+ig) = colh2o(lay) * &
    2156   279487232 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    2157   279487232 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    2158   279487232 :                  fac01(lay) * absa(ind1(lay),ig) + &
    2159   279487232 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
    2160             :                  + tauself + taufor &
    2161  1327564352 :                  + tauo2
    2162    78605784 :             fracs(lay,ngs10+ig) = fracrefa(ig)
    2163             :          enddo
    2164             :       enddo
    2165             : 
    2166             : ! Upper atmosphere loop
    2167     4874024 :       do lay = laytrop+1, nlayers
    2168     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(11) + 1
    2169     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(11) + 1
    2170     4388024 :          scaleo2(lay) = colo2(lay)*scaleminor(lay)
    2171    39978216 :          do ig = 1, ng11
    2172   175520960 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2173   210625152 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2174   175520960 :             tauo2 =  scaleo2(lay) * (kb_mo2(indminor(lay),ig) + minorfrac(lay) * &
    2175   210625152 :                  (kb_mo2(indminor(lay)+1,ig) - kb_mo2(indminor(lay),ig)))
    2176   105312576 :             taug(lay,ngs10+ig) = colh2o(lay) * &
    2177   140416768 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2178   140416768 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2179   140416768 :                  fac01(lay) * absb(ind1(lay),ig) + &
    2180   140416768 :                  fac11(lay) * absb(ind1(lay)+1,ig))  &
    2181             :                  + taufor &
    2182   666979648 :                  + tauo2
    2183    39492216 :             fracs(lay,ngs10+ig) = fracrefb(ig)
    2184             :          enddo
    2185             :       enddo
    2186             : 
    2187      486000 :       end subroutine taugb11
    2188             : 
    2189             : !----------------------------------------------------------------------------
    2190      486000 :       subroutine taugb12
    2191             : !----------------------------------------------------------------------------
    2192             : !
    2193             : !     band 12:  1800-2080 cm-1 (low - h2o,co2; high - nothing)
    2194             : !----------------------------------------------------------------------------
    2195             : 
    2196             : ! ------- Modules -------
    2197             : 
    2198             :       use parrrtm, only : ng12, ngs11
    2199             :       use rrlw_ref, only : chi_mls
    2200             :       use rrlw_kg12, only : fracrefa, absa, &
    2201             :                             selfref, forref
    2202             : 
    2203             : ! ------- Declarations -------
    2204             : 
    2205             : ! Local 
    2206      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2207      972000 :       integer, dimension(nlayers) :: js, js1, jpl
    2208      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2209      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2210      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2211             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2212      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2213      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    2214             :       real(kind=r8) :: tauself, taufor
    2215             :       real(kind=r8) :: refrat_planck_a
    2216             :       real(kind=r8) :: tau_major, tau_major1
    2217             : 
    2218             : 
    2219             : ! Calculate reference ratio to be used in calculation of Planck
    2220             : ! fraction in lower/upper atmosphere.
    2221             : 
    2222             : ! P =   174.164 mb 
    2223      486000 :       refrat_planck_a = chi_mls(1,10)/chi_mls(2,10)
    2224             : 
    2225             : ! Compute the optical depth by interpolating in ln(pressure), 
    2226             : ! temperature, and appropriate species.  Below laytrop, the water
    2227             : ! vapor self-continuum adn foreign continuum is interpolated 
    2228             : ! (in temperature) separately.  
    2229             : 
    2230             : ! Lower atmosphere loop
    2231     9219976 :       do lay = 1, laytrop
    2232             : 
    2233     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
    2234     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    2235     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2236     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
    2237     8733976 :          js(lay) = 1 + int(specmult(lay))
    2238     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2239             : 
    2240     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
    2241     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    2242     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    2243     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
    2244     8733976 :          js1(lay) = 1 + int(specmult1(lay))
    2245     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    2246             : 
    2247     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
    2248     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    2249     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    2250     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    2251     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
    2252     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    2253             : 
    2254     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(12) + js(lay)
    2255     9219976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(12) + js1(lay)
    2256             :       enddo
    2257     9219976 :       do lay = 1, laytrop
    2258     9219976 :          if (specparm(lay) .lt. 0.125_r8) then
    2259      770299 :             p = fs(lay) - 1
    2260      770299 :             p4 = p**4
    2261      770299 :             fk0 = p4
    2262      770299 :             fk1 = 1 - p - 2.0_r8*p4
    2263      770299 :             fk2 = p + p4
    2264      770299 :             fac000(lay) = fk0*fac00(lay)
    2265      770299 :             fac100(lay) = fk1*fac00(lay)
    2266      770299 :             fac200(lay) = fk2*fac00(lay)
    2267      770299 :             fac010(lay) = fk0*fac10(lay)
    2268      770299 :             fac110(lay) = fk1*fac10(lay)
    2269      770299 :             fac210(lay) = fk2*fac10(lay)
    2270     7963677 :          else if (specparm(lay) .gt. 0.875_r8) then
    2271       17165 :             p = -fs(lay) 
    2272       17165 :             p4 = p**4
    2273       17165 :             fk0 = p4
    2274       17165 :             fk1 = 1 - p - 2.0_r8*p4
    2275       17165 :             fk2 = p + p4
    2276       17165 :             fac000(lay) = fk0*fac00(lay)
    2277       17165 :             fac100(lay) = fk1*fac00(lay)
    2278       17165 :             fac200(lay) = fk2*fac00(lay)
    2279       17165 :             fac010(lay) = fk0*fac10(lay)
    2280       17165 :             fac110(lay) = fk1*fac10(lay)
    2281       17165 :             fac210(lay) = fk2*fac10(lay)
    2282             :          else
    2283     7946512 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    2284     7946512 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    2285     7946512 :             fac100(lay) = fs(lay) * fac00(lay)
    2286     7946512 :             fac110(lay) = fs(lay) * fac10(lay)
    2287             :          endif
    2288             : 
    2289             :       enddo
    2290     9219976 :       do lay = 1, laytrop
    2291     9219976 :          if (specparm1(lay) .lt. 0.125_r8) then
    2292      152313 :             p = fs1(lay) - 1
    2293      152313 :             p4 = p**4
    2294      152313 :             fk0 = p4
    2295      152313 :             fk1 = 1 - p - 2.0_r8*p4
    2296      152313 :             fk2 = p + p4
    2297      152313 :             fac001(lay) = fk0*fac01(lay)
    2298      152313 :             fac101(lay) = fk1*fac01(lay)
    2299      152313 :             fac201(lay) = fk2*fac01(lay)
    2300      152313 :             fac011(lay) = fk0*fac11(lay)
    2301      152313 :             fac111(lay) = fk1*fac11(lay)
    2302      152313 :             fac211(lay) = fk2*fac11(lay)
    2303     8581663 :          else if (specparm1(lay) .gt. 0.875_r8) then
    2304      351185 :             p = -fs1(lay) 
    2305      351185 :             p4 = p**4
    2306      351185 :             fk0 = p4
    2307      351185 :             fk1 = 1 - p - 2.0_r8*p4
    2308      351185 :             fk2 = p + p4
    2309      351185 :             fac001(lay) = fk0*fac01(lay)
    2310      351185 :             fac101(lay) = fk1*fac01(lay)
    2311      351185 :             fac201(lay) = fk2*fac01(lay)
    2312      351185 :             fac011(lay) = fk0*fac11(lay)
    2313      351185 :             fac111(lay) = fk1*fac11(lay)
    2314      351185 :             fac211(lay) = fk2*fac11(lay)
    2315             :          else
    2316     8230478 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    2317     8230478 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    2318     8230478 :             fac101(lay) = fs1(lay) * fac01(lay)
    2319     8230478 :             fac111(lay) = fs1(lay) * fac11(lay)
    2320             :          endif
    2321             :       enddo
    2322     9219976 :       do lay = 1, laytrop
    2323             : 
    2324    79091784 :          do ig = 1, ng12
    2325   349359040 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    2326   419230848 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2327   349359040 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2328   419230848 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2329             : 
    2330    69871808 :             if (specparm(lay) .lt. 0.125_r8) then
    2331     6162392 :                tau_major = speccomb(lay) * &
    2332    24649568 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2333    24649568 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2334    24649568 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    2335    24649568 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2336    24649568 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    2337   135572624 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    2338    63709416 :             else if (specparm(lay) .gt. 0.875_r8) then
    2339      137320 :                tau_major = speccomb(lay) * &
    2340      549280 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    2341      549280 :                     fac100(lay) * absa(ind0(lay),ig) + &
    2342      549280 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    2343      549280 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    2344      549280 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    2345     3021040 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    2346             :             else
    2347    63572096 :                tau_major = speccomb(lay) * &
    2348   254288384 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2349   254288384 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2350   254288384 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2351   890009344 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    2352             :             endif
    2353             : 
    2354    69871808 :             if (specparm1(lay) .lt. 0.125_r8) then
    2355     1218504 :                tau_major1 = speccomb1(lay) * &
    2356     4874016 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2357     4874016 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2358     4874016 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    2359     4874016 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2360     4874016 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    2361    26807088 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    2362    68653304 :             else if (specparm1(lay) .gt. 0.875_r8) then
    2363     2809480 :                tau_major1 = speccomb1(lay) * &
    2364    11237920 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    2365    11237920 :                     fac101(lay) * absa(ind1(lay),ig) + &
    2366    11237920 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    2367    11237920 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    2368    11237920 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    2369    61808560 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    2370             :             else
    2371    65843824 :                tau_major1 = speccomb1(lay) * &
    2372   263375296 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2373   263375296 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2374   263375296 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2375   921813536 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2376             :             endif
    2377             : 
    2378   139743616 :             taug(lay,ngs11+ig) = tau_major + tau_major1 &
    2379   139743616 :                  + tauself + taufor
    2380   419230848 :             fracs(lay,ngs11+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2381   497836632 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2382             :          enddo
    2383             :       enddo
    2384             : 
    2385             : ! Upper atmosphere loop
    2386     4874024 :       do lay = laytrop+1, nlayers
    2387    39978216 :          do ig = 1, ng12
    2388    35104192 :             taug(lay,ngs11+ig) = 0.0_r8
    2389    39492216 :             fracs(lay,ngs11+ig) = 0.0_r8
    2390             :          enddo
    2391             :       enddo
    2392             : 
    2393      486000 :       end subroutine taugb12
    2394             : 
    2395             : !----------------------------------------------------------------------------
    2396      486000 :       subroutine taugb13
    2397             : !----------------------------------------------------------------------------
    2398             : !
    2399             : !     band 13:  2080-2250 cm-1 (low key - h2o,n2o; high minor - o3 minor)
    2400             : !----------------------------------------------------------------------------
    2401             : 
    2402             : ! ------- Modules -------
    2403             : 
    2404             :       use parrrtm, only : ng13, ngs12
    2405             :       use rrlw_ref, only : chi_mls
    2406             :       use rrlw_kg13, only : fracrefa, fracrefb, absa, &
    2407             :                             ka_mco2, ka_mco, kb_mo3, selfref, forref
    2408             : 
    2409             : ! ------- Declarations -------
    2410             : 
    2411             : ! Local 
    2412      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2413      972000 :       integer, dimension(nlayers) :: js, js1, jmco2, jmco, jpl
    2414      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2415      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2416      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_mco2, specparm_mco2, specmult_mco2, fmco2
    2417      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_mco, specparm_mco, specmult_mco, fmco
    2418      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2419             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2420      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2421      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    2422             :       real(kind=r8) :: tauself, taufor, co2m1, co2m2, absco2 
    2423             :       real(kind=r8) :: com1, com2, absco, abso3
    2424      972000 :       real(kind=r8), dimension(nlayers) :: chi_co2, ratco2, adjfac, adjcolco2
    2425             :       real(kind=r8) :: refrat_planck_a, refrat_m_a, refrat_m_a3
    2426             :       real(kind=r8) :: tau_major, tau_major1
    2427             : 
    2428             : 
    2429             : ! Minor gas mapping levels :
    2430             : !     lower - co2, p = 1053.63 mb, t = 294.2 k
    2431             : !     lower - co, p = 706 mb, t = 278.94 k
    2432             : !     upper - o3, p = 95.5835 mb, t = 215.7 k
    2433             : 
    2434             : ! Calculate reference ratio to be used in calculation of Planck
    2435             : ! fraction in lower/upper atmosphere.
    2436             : 
    2437             : ! P = 473.420 mb (Level 5)
    2438      486000 :       refrat_planck_a = chi_mls(1,5)/chi_mls(4,5)
    2439             : 
    2440             : ! P = 1053. (Level 1)
    2441      486000 :       refrat_m_a = chi_mls(1,1)/chi_mls(4,1)
    2442             : 
    2443             : ! P = 706. (Level 3)
    2444      486000 :       refrat_m_a3 = chi_mls(1,3)/chi_mls(4,3)
    2445             : 
    2446             : ! Compute the optical depth by interpolating in ln(pressure), 
    2447             : ! temperature, and appropriate species.  Below laytrop, the water
    2448             : ! vapor self-continuum and foreign continuum is interpolated 
    2449             : ! (in temperature) separately.  
    2450             : 
    2451             : ! Lower atmosphere loop
    2452     9219976 :       do lay = 1, laytrop
    2453             : 
    2454     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2on2o(lay)*coln2o(lay)
    2455     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    2456     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2457     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
    2458     8733976 :          js(lay) = 1 + int(specmult(lay))
    2459     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2460             : 
    2461     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2on2o_1(lay)*coln2o(lay)
    2462     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    2463     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    2464     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
    2465     8733976 :          js1(lay) = 1 + int(specmult1(lay))
    2466     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    2467             : 
    2468     8733976 :          speccomb_mco2(lay) = colh2o(lay) + refrat_m_a*coln2o(lay)
    2469     8733976 :          specparm_mco2(lay) = colh2o(lay)/speccomb_mco2(lay)
    2470     8733976 :          if (specparm_mco2(lay) .ge. oneminus) specparm_mco2(lay) = oneminus
    2471     8733976 :          specmult_mco2(lay) = 8._r8*specparm_mco2(lay)
    2472     8733976 :          jmco2(lay) = 1 + int(specmult_mco2(lay))
    2473     8733976 :          fmco2(lay) = mod(specmult_mco2(lay),1.0_r8)
    2474             : 
    2475             : !  In atmospheres where the amount of CO2 is too great to be considered
    2476             : !  a minor species, adjust the column amount of CO2 by an empirical factor 
    2477             : !  to obtain the proper contribution.
    2478     8733976 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    2479     9219976 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/3.55e-4_r8
    2480             :       enddo
    2481     9219976 :       do lay = 1, laytrop
    2482     9219976 :          if (ratco2(lay) .gt. 3.0_r8) then
    2483           0 :             adjfac(lay) = 2.0_r8+(ratco2(lay)-2.0_r8)**0.68_r8
    2484           0 :             adjcolco2(lay) = adjfac(lay)*3.55e-4*coldry(lay)*1.e-20_r8
    2485             :          else
    2486     8733976 :             adjcolco2(lay) = colco2(lay)
    2487             :          endif
    2488             : 
    2489             :       enddo
    2490     9219976 :       do lay = 1, laytrop
    2491     8733976 :          speccomb_mco(lay) = colh2o(lay) + refrat_m_a3*coln2o(lay)
    2492     8733976 :          specparm_mco(lay) = colh2o(lay)/speccomb_mco(lay)
    2493     8733976 :          if (specparm_mco(lay) .ge. oneminus) specparm_mco(lay) = oneminus
    2494     8733976 :          specmult_mco(lay) = 8._r8*specparm_mco(lay)
    2495     8733976 :          jmco(lay) = 1 + int(specmult_mco(lay))
    2496     8733976 :          fmco(lay) = mod(specmult_mco(lay),1.0_r8)
    2497             : 
    2498     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*coln2o(lay)
    2499     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    2500     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    2501     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    2502     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
    2503     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    2504             : 
    2505     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(13) + js(lay)
    2506     9219976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(13) + js1(lay)
    2507             :       enddo
    2508     9219976 :       do lay = 1, laytrop
    2509             : 
    2510     9219976 :          if (specparm(lay) .lt. 0.125_r8) then
    2511      858585 :             p = fs(lay) - 1
    2512      858585 :             p4 = p**4
    2513      858585 :             fk0 = p4
    2514      858585 :             fk1 = 1 - p - 2.0_r8*p4
    2515      858585 :             fk2 = p + p4
    2516      858585 :             fac000(lay) = fk0*fac00(lay)
    2517      858585 :             fac100(lay) = fk1*fac00(lay)
    2518      858585 :             fac200(lay) = fk2*fac00(lay)
    2519      858585 :             fac010(lay) = fk0*fac10(lay)
    2520      858585 :             fac110(lay) = fk1*fac10(lay)
    2521      858585 :             fac210(lay) = fk2*fac10(lay)
    2522     7875391 :          else if (specparm(lay) .gt. 0.875_r8) then
    2523        6119 :             p = -fs(lay) 
    2524        6119 :             p4 = p**4
    2525        6119 :             fk0 = p4
    2526        6119 :             fk1 = 1 - p - 2.0_r8*p4
    2527        6119 :             fk2 = p + p4
    2528        6119 :             fac000(lay) = fk0*fac00(lay)
    2529        6119 :             fac100(lay) = fk1*fac00(lay)
    2530        6119 :             fac200(lay) = fk2*fac00(lay)
    2531        6119 :             fac010(lay) = fk0*fac10(lay)
    2532        6119 :             fac110(lay) = fk1*fac10(lay)
    2533        6119 :             fac210(lay) = fk2*fac10(lay)
    2534             :          else
    2535     7869272 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    2536     7869272 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    2537     7869272 :             fac100(lay) = fs(lay) * fac00(lay)
    2538     7869272 :             fac110(lay) = fs(lay) * fac10(lay)
    2539             :          endif
    2540             : 
    2541             :       enddo
    2542     9219976 :       do lay = 1, laytrop
    2543     9219976 :          if (specparm1(lay) .lt. 0.125_r8) then
    2544      197310 :             p = fs1(lay) - 1
    2545      197310 :             p4 = p**4
    2546      197310 :             fk0 = p4
    2547      197310 :             fk1 = 1 - p - 2.0_r8*p4
    2548      197310 :             fk2 = p + p4
    2549      197310 :             fac001(lay) = fk0*fac01(lay)
    2550      197310 :             fac101(lay) = fk1*fac01(lay)
    2551      197310 :             fac201(lay) = fk2*fac01(lay)
    2552      197310 :             fac011(lay) = fk0*fac11(lay)
    2553      197310 :             fac111(lay) = fk1*fac11(lay)
    2554      197310 :             fac211(lay) = fk2*fac11(lay)
    2555     8536666 :          else if (specparm1(lay) .gt. 0.875_r8) then
    2556      226059 :             p = -fs1(lay) 
    2557      226059 :             p4 = p**4
    2558      226059 :             fk0 = p4
    2559      226059 :             fk1 = 1 - p - 2.0_r8*p4
    2560      226059 :             fk2 = p + p4
    2561      226059 :             fac001(lay) = fk0*fac01(lay)
    2562      226059 :             fac101(lay) = fk1*fac01(lay)
    2563      226059 :             fac201(lay) = fk2*fac01(lay)
    2564      226059 :             fac011(lay) = fk0*fac11(lay)
    2565      226059 :             fac111(lay) = fk1*fac11(lay)
    2566      226059 :             fac211(lay) = fk2*fac11(lay)
    2567             :          else
    2568     8310607 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    2569     8310607 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    2570     8310607 :             fac101(lay) = fs1(lay) * fac01(lay)
    2571     8310607 :             fac111(lay) = fs1(lay) * fac11(lay)
    2572             :          endif
    2573             :       enddo
    2574     9219976 :       do lay = 1, laytrop
    2575             : 
    2576    44155880 :          do ig = 1, ng13
    2577   174679520 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    2578   209615424 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2579   174679520 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2580   209615424 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2581   209615424 :             co2m1 = ka_mco2(jmco2(lay),indminor(lay),ig) + fmco2(lay) * &
    2582   244551328 :                  (ka_mco2(jmco2(lay)+1,indminor(lay),ig) - ka_mco2(jmco2(lay),indminor(lay),ig))
    2583   209615424 :             co2m2 = ka_mco2(jmco2(lay),indminor(lay)+1,ig) + fmco2(lay) * &
    2584   244551328 :                  (ka_mco2(jmco2(lay)+1,indminor(lay)+1,ig) - ka_mco2(jmco2(lay),indminor(lay)+1,ig))
    2585    34935904 :             absco2 = co2m1 + minorfrac(lay) * (co2m2 - co2m1)
    2586   209615424 :             com1 = ka_mco(jmco(lay),indminor(lay),ig) + fmco(lay) * &
    2587   244551328 :                  (ka_mco(jmco(lay)+1,indminor(lay),ig) - ka_mco(jmco(lay),indminor(lay),ig))
    2588   209615424 :             com2 = ka_mco(jmco(lay),indminor(lay)+1,ig) + fmco(lay) * &
    2589   244551328 :                  (ka_mco(jmco(lay)+1,indminor(lay)+1,ig) - ka_mco(jmco(lay),indminor(lay)+1,ig))
    2590    34935904 :             absco = com1 + minorfrac(lay) * (com2 - com1)
    2591             : 
    2592    34935904 :             if (specparm(lay) .lt. 0.125_r8) then
    2593     3434340 :                tau_major = speccomb(lay) * &
    2594    13737360 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2595    13737360 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2596    13737360 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    2597    13737360 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2598    13737360 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    2599    75555480 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    2600    31501564 :             else if (specparm(lay) .gt. 0.875_r8) then
    2601       24476 :                tau_major = speccomb(lay) * &
    2602       97904 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    2603       97904 :                     fac100(lay) * absa(ind0(lay),ig) + &
    2604       97904 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    2605       97904 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    2606       97904 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    2607      538472 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    2608             :             else
    2609    31477088 :                tau_major = speccomb(lay) * &
    2610   125908352 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2611   125908352 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2612   125908352 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2613   440679232 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    2614             :             endif
    2615             : 
    2616    34935904 :             if (specparm1(lay) .lt. 0.125_r8) then
    2617      789240 :                tau_major1 = speccomb1(lay) * &
    2618     3156960 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2619     3156960 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2620     3156960 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    2621     3156960 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2622     3156960 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    2623    17363280 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    2624    34146664 :             else if (specparm1(lay) .gt. 0.875_r8) then
    2625      904236 :                tau_major1 = speccomb1(lay) * &
    2626     3616944 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    2627     3616944 :                     fac101(lay) * absa(ind1(lay),ig) + &
    2628     3616944 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    2629     3616944 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    2630     3616944 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    2631    19893192 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    2632             :             else
    2633    33242428 :                tau_major1 = speccomb1(lay) * &
    2634   132969712 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2635   132969712 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2636   132969712 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2637   465393992 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2638             :             endif
    2639             : 
    2640    69871808 :             taug(lay,ngs12+ig) = tau_major + tau_major1 &
    2641             :                  + tauself + taufor &
    2642    34935904 :                  + adjcolco2(lay)*absco2 &
    2643   139743616 :                  + colco(lay)*absco
    2644   209615424 :             fracs(lay,ngs12+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2645   253285304 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2646             :          enddo
    2647             :       enddo
    2648             : 
    2649             : ! Upper atmosphere loop
    2650     4874024 :       do lay = laytrop+1, nlayers
    2651    22426120 :          do ig = 1, ng13
    2652    70208384 :             abso3 = kb_mo3(indminor(lay),ig) + minorfrac(lay) * &
    2653    87760480 :                  (kb_mo3(indminor(lay)+1,ig) - kb_mo3(indminor(lay),ig))
    2654    17552096 :             taug(lay,ngs12+ig) = colo3(lay)*abso3
    2655    21940120 :             fracs(lay,ngs12+ig) =  fracrefb(ig)
    2656             :          enddo
    2657             :       enddo
    2658             : 
    2659      486000 :       end subroutine taugb13
    2660             : 
    2661             : !----------------------------------------------------------------------------
    2662      486000 :       subroutine taugb14
    2663             : !----------------------------------------------------------------------------
    2664             : !
    2665             : !     band 14:  2250-2380 cm-1 (low - co2; high - co2)
    2666             : !----------------------------------------------------------------------------
    2667             : 
    2668             : ! ------- Modules -------
    2669             : 
    2670             :       use parrrtm, only : ng14, ngs13
    2671             :       use rrlw_kg14, only : fracrefa, fracrefb, absa, absb, &
    2672             :                             selfref, forref
    2673             : 
    2674             : ! ------- Declarations -------
    2675             : 
    2676             : ! Local 
    2677      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2678             :       real(kind=r8) :: tauself, taufor
    2679             : 
    2680             : 
    2681             : ! Compute the optical depth by interpolating in ln(pressure) and 
    2682             : ! temperature.  Below laytrop, the water vapor self-continuum 
    2683             : ! and foreign continuum is interpolated (in temperature) separately.  
    2684             : 
    2685             : ! Lower atmosphere loop
    2686     9219976 :       do lay = 1, laytrop
    2687     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(14) + 1
    2688     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(14) + 1
    2689    26687928 :          do ig = 1, ng14
    2690    87339760 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    2691   104807712 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2692    87339760 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2693   104807712 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2694    52403856 :             taug(lay,ngs13+ig) = colco2(lay) * &
    2695    69871808 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    2696    69871808 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    2697    69871808 :                  fac01(lay) * absa(ind1(lay),ig) + &
    2698    69871808 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
    2699   331891088 :                  + tauself + taufor
    2700    26201928 :             fracs(lay,ngs13+ig) = fracrefa(ig)
    2701             :          enddo
    2702             :       enddo
    2703             : 
    2704             : ! Upper atmosphere loop
    2705     4874024 :       do lay = laytrop+1, nlayers
    2706     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(14) + 1
    2707     4388024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(14) + 1
    2708    13650072 :          do ig = 1, ng14
    2709    26328144 :             taug(lay,ngs13+ig) = colco2(lay) * &
    2710    35104192 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2711    35104192 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2712    35104192 :                  fac01(lay) * absb(ind1(lay),ig) + &
    2713   140416768 :                  fac11(lay) * absb(ind1(lay)+1,ig))
    2714    13164072 :             fracs(lay,ngs13+ig) = fracrefb(ig)
    2715             :          enddo
    2716             :       enddo
    2717             : 
    2718      486000 :       end subroutine taugb14
    2719             : 
    2720             : !----------------------------------------------------------------------------
    2721      486000 :       subroutine taugb15
    2722             : !----------------------------------------------------------------------------
    2723             : !
    2724             : !     band 15:  2380-2600 cm-1 (low - n2o,co2; low minor - n2)
    2725             : !                              (high - nothing)
    2726             : !----------------------------------------------------------------------------
    2727             : 
    2728             : ! ------- Modules -------
    2729             : 
    2730             :       use parrrtm, only : ng15, ngs14
    2731             :       use rrlw_ref, only : chi_mls
    2732             :       use rrlw_kg15, only : fracrefa, absa, &
    2733             :                             ka_mn2, selfref, forref
    2734             : 
    2735             : ! ------- Declarations -------
    2736             : 
    2737             : ! Local 
    2738      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2739      972000 :       integer, dimension(nlayers) :: js, js1, jmn2, jpl
    2740      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2741      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2742      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_mn2, specparm_mn2, specmult_mn2, fmn2
    2743      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2744             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2745      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2746      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    2747      972000 :       real(kind=r8) :: scalen2(nlayers), tauself, taufor, n2m1, n2m2, taun2 
    2748             :       real(kind=r8) :: refrat_planck_a, refrat_m_a
    2749             :       real(kind=r8) :: tau_major, tau_major1
    2750             : 
    2751             : 
    2752             : ! Minor gas mapping level : 
    2753             : !     Lower - Nitrogen Continuum, P = 1053., T = 294.
    2754             : 
    2755             : ! Calculate reference ratio to be used in calculation of Planck
    2756             : ! fraction in lower atmosphere.
    2757             : ! P = 1053. mb (Level 1)
    2758      486000 :       refrat_planck_a = chi_mls(4,1)/chi_mls(2,1)
    2759             : 
    2760             : ! P = 1053.
    2761      486000 :       refrat_m_a = chi_mls(4,1)/chi_mls(2,1)
    2762             : 
    2763             : ! Compute the optical depth by interpolating in ln(pressure), 
    2764             : ! temperature, and appropriate species.  Below laytrop, the water
    2765             : ! vapor self-continuum and foreign continuum is interpolated 
    2766             : ! (in temperature) separately.  
    2767             : 
    2768             : ! Lower atmosphere loop
    2769     9219976 :       do lay = 1, laytrop
    2770             : 
    2771     8733976 :          speccomb(lay) = coln2o(lay) + rat_n2oco2(lay)*colco2(lay)
    2772     8733976 :          specparm(lay) = coln2o(lay)/speccomb(lay)
    2773     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2774     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
    2775     8733976 :          js(lay) = 1 + int(specmult(lay))
    2776     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2777             : 
    2778     8733976 :          speccomb1(lay) = coln2o(lay) + rat_n2oco2_1(lay)*colco2(lay)
    2779     8733976 :          specparm1(lay) = coln2o(lay)/speccomb1(lay)
    2780     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    2781     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
    2782     8733976 :          js1(lay) = 1 + int(specmult1(lay))
    2783     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    2784             : 
    2785     8733976 :          speccomb_mn2(lay) = coln2o(lay) + refrat_m_a*colco2(lay)
    2786     8733976 :          specparm_mn2(lay) = coln2o(lay)/speccomb_mn2(lay)
    2787     8733976 :          if (specparm_mn2(lay) .ge. oneminus) specparm_mn2(lay) = oneminus
    2788     8733976 :          specmult_mn2(lay) = 8._r8*specparm_mn2(lay)
    2789     8733976 :          jmn2(lay) = 1 + int(specmult_mn2(lay))
    2790     8733976 :          fmn2(lay) = mod(specmult_mn2(lay),1.0_r8)
    2791             : 
    2792     8733976 :          speccomb_planck(lay) = coln2o(lay)+refrat_planck_a*colco2(lay)
    2793     8733976 :          specparm_planck(lay) = coln2o(lay)/speccomb_planck(lay)
    2794     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    2795     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    2796     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
    2797     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    2798             : 
    2799     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(15) + js(lay)
    2800     8733976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(15) + js1(lay)
    2801             :          
    2802     9219976 :          scalen2(lay) = colbrd(lay)*scaleminor(lay)
    2803             :       enddo
    2804     9219976 :       do lay = 1, laytrop
    2805     9219976 :          if (specparm(lay) .lt. 0.125_r8) then
    2806           0 :             p = fs(lay) - 1
    2807           0 :             p4 = p**4
    2808           0 :             fk0 = p4
    2809           0 :             fk1 = 1 - p - 2.0_r8*p4
    2810           0 :             fk2 = p + p4
    2811           0 :             fac000(lay) = fk0*fac00(lay)
    2812           0 :             fac100(lay) = fk1*fac00(lay)
    2813           0 :             fac200(lay) = fk2*fac00(lay)
    2814           0 :             fac010(lay) = fk0*fac10(lay)
    2815           0 :             fac110(lay) = fk1*fac10(lay)
    2816           0 :             fac210(lay) = fk2*fac10(lay)
    2817     8733976 :          else if (specparm(lay) .gt. 0.875_r8) then
    2818           0 :             p = -fs(lay) 
    2819           0 :             p4 = p**4
    2820           0 :             fk0 = p4
    2821           0 :             fk1 = 1 - p - 2.0_r8*p4
    2822           0 :             fk2 = p + p4
    2823           0 :             fac000(lay) = fk0*fac00(lay)
    2824           0 :             fac100(lay) = fk1*fac00(lay)
    2825           0 :             fac200(lay) = fk2*fac00(lay)
    2826           0 :             fac010(lay) = fk0*fac10(lay)
    2827           0 :             fac110(lay) = fk1*fac10(lay)
    2828           0 :             fac210(lay) = fk2*fac10(lay)
    2829             :          else
    2830     8733976 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    2831     8733976 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    2832     8733976 :             fac100(lay) = fs(lay) * fac00(lay)
    2833     8733976 :             fac110(lay) = fs(lay) * fac10(lay)
    2834             :          endif
    2835             :       enddo
    2836     9219976 :       do lay = 1, laytrop
    2837     9219976 :          if (specparm1(lay) .lt. 0.125_r8) then
    2838           0 :             p = fs1(lay) - 1
    2839           0 :             p4 = p**4
    2840           0 :             fk0 = p4
    2841           0 :             fk1 = 1 - p - 2.0_r8*p4
    2842           0 :             fk2 = p + p4
    2843           0 :             fac001(lay) = fk0*fac01(lay)
    2844           0 :             fac101(lay) = fk1*fac01(lay)
    2845           0 :             fac201(lay) = fk2*fac01(lay)
    2846           0 :             fac011(lay) = fk0*fac11(lay)
    2847           0 :             fac111(lay) = fk1*fac11(lay)
    2848           0 :             fac211(lay) = fk2*fac11(lay)
    2849     8733976 :          else if (specparm1(lay) .gt. 0.875_r8) then
    2850           0 :             p = -fs1(lay) 
    2851           0 :             p4 = p**4
    2852           0 :             fk0 = p4
    2853           0 :             fk1 = 1 - p - 2.0_r8*p4
    2854           0 :             fk2 = p + p4
    2855           0 :             fac001(lay) = fk0*fac01(lay)
    2856           0 :             fac101(lay) = fk1*fac01(lay)
    2857           0 :             fac201(lay) = fk2*fac01(lay)
    2858           0 :             fac011(lay) = fk0*fac11(lay)
    2859           0 :             fac111(lay) = fk1*fac11(lay)
    2860           0 :             fac211(lay) = fk2*fac11(lay)
    2861             :          else
    2862     8733976 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    2863     8733976 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    2864     8733976 :             fac101(lay) = fs1(lay) * fac01(lay)
    2865     8733976 :             fac111(lay) = fs1(lay) * fac11(lay)
    2866             :          endif
    2867             : 
    2868             :       enddo
    2869     9219976 :       do lay = 1, laytrop
    2870    26687928 :          do ig = 1, ng15
    2871    87339760 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    2872   104807712 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2873    87339760 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2874   104807712 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2875   104807712 :             n2m1 = ka_mn2(jmn2(lay),indminor(lay),ig) + fmn2(lay) * &
    2876   122275664 :                  (ka_mn2(jmn2(lay)+1,indminor(lay),ig) - ka_mn2(jmn2(lay),indminor(lay),ig))
    2877   104807712 :             n2m2 = ka_mn2(jmn2(lay),indminor(lay)+1,ig) + fmn2(lay) * &
    2878   122275664 :                  (ka_mn2(jmn2(lay)+1,indminor(lay)+1,ig) - ka_mn2(jmn2(lay),indminor(lay)+1,ig))
    2879    17467952 :             taun2 = scalen2(lay) * (n2m1 + minorfrac(lay) * (n2m2 - n2m1))
    2880             : 
    2881    17467952 :             if (specparm(lay) .lt. 0.125_r8) then
    2882           0 :                tau_major = speccomb(lay) * &
    2883           0 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2884           0 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2885           0 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    2886           0 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2887           0 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    2888           0 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    2889    17467952 :             else if (specparm(lay) .gt. 0.875_r8) then
    2890           0 :                tau_major = speccomb(lay) * &
    2891           0 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    2892           0 :                     fac100(lay) * absa(ind0(lay),ig) + &
    2893           0 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    2894           0 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    2895           0 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    2896           0 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    2897             :             else
    2898    17467952 :                tau_major = speccomb(lay) * &
    2899    69871808 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2900    69871808 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2901    69871808 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2902   244551328 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    2903             :             endif 
    2904             : 
    2905    17467952 :             if (specparm1(lay) .lt. 0.125_r8) then
    2906           0 :                tau_major1 = speccomb1(lay) * &
    2907           0 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2908           0 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2909           0 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    2910           0 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2911           0 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    2912           0 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    2913    17467952 :             else if (specparm1(lay) .gt. 0.875_r8) then
    2914           0 :                tau_major1 = speccomb1(lay) * &
    2915           0 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    2916           0 :                     fac101(lay) * absa(ind1(lay),ig) + &
    2917           0 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    2918           0 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    2919           0 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    2920           0 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    2921             :             else
    2922    17467952 :                tau_major1 = speccomb1(lay) * &
    2923    69871808 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2924    69871808 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2925    69871808 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2926   244551328 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2927             :             endif
    2928             : 
    2929    34935904 :             taug(lay,ngs14+ig) = tau_major + tau_major1 &
    2930             :                  + tauself + taufor &
    2931    34935904 :                  + taun2
    2932   104807712 :             fracs(lay,ngs14+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2933   131009640 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2934             :          enddo
    2935             :       enddo
    2936             : 
    2937             : ! Upper atmosphere loop
    2938     4874024 :       do lay = laytrop+1, nlayers
    2939    13650072 :          do ig = 1, ng15
    2940     8776048 :             taug(lay,ngs14+ig) = 0.0_r8
    2941    13164072 :             fracs(lay,ngs14+ig) = 0.0_r8
    2942             :          enddo
    2943             :       enddo
    2944             : 
    2945      486000 :       end subroutine taugb15
    2946             : 
    2947             : !----------------------------------------------------------------------------
    2948      486000 :       subroutine taugb16
    2949             : !----------------------------------------------------------------------------
    2950             : !
    2951             : !     band 16:  2600-3250 cm-1 (low key- h2o,ch4; high key - ch4)
    2952             : !----------------------------------------------------------------------------
    2953             : 
    2954             : ! ------- Modules -------
    2955             : 
    2956             :       use parrrtm, only : ng16, ngs15
    2957             :       use rrlw_ref, only : chi_mls
    2958             :       use rrlw_kg16, only : fracrefa, fracrefb, absa, absb, &
    2959             :                             selfref, forref
    2960             : 
    2961             : ! ------- Declarations -------
    2962             : 
    2963             : ! Local 
    2964      972000 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2965      972000 :       integer, dimension(nlayers) :: js, js1, jpl
    2966      972000 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2967      972000 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2968      972000 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2969             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2970      972000 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2971      972000 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    2972             :       real(kind=r8) :: tauself, taufor
    2973             :       real(kind=r8) :: refrat_planck_a
    2974             :       real(kind=r8) :: tau_major, tau_major1
    2975             : 
    2976             : 
    2977             : ! Calculate reference ratio to be used in calculation of Planck
    2978             : ! fraction in lower atmosphere.
    2979             : 
    2980             : ! P = 387. mb (Level 6)
    2981      486000 :       refrat_planck_a = chi_mls(1,6)/chi_mls(6,6)
    2982             : 
    2983             : ! Compute the optical depth by interpolating in ln(pressure), 
    2984             : ! temperature,and appropriate species.  Below laytrop, the water
    2985             : ! vapor self-continuum and foreign continuum is interpolated 
    2986             : ! (in temperature) separately.  
    2987             : 
    2988             : ! Lower atmosphere loop
    2989     9219976 :       do lay = 1, laytrop
    2990             : 
    2991     8733976 :          speccomb(lay) = colh2o(lay) + rat_h2och4(lay)*colch4(lay)
    2992     8733976 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    2993     8733976 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2994     8733976 :          specmult(lay) = 8._r8*(specparm(lay))
    2995     8733976 :          js(lay) = 1 + int(specmult(lay))
    2996     8733976 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2997             : 
    2998     8733976 :          speccomb1(lay) = colh2o(lay) + rat_h2och4_1(lay)*colch4(lay)
    2999     8733976 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    3000     8733976 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    3001     8733976 :          specmult1(lay) = 8._r8*(specparm1(lay))
    3002     8733976 :          js1(lay) = 1 + int(specmult1(lay))
    3003     8733976 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    3004             : 
    3005     8733976 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colch4(lay)
    3006     8733976 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    3007     8733976 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    3008     8733976 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    3009     8733976 :          jpl(lay)= 1 + int(specmult_planck(lay))
    3010     8733976 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    3011             : 
    3012     8733976 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(16) + js(lay)
    3013     9219976 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(16) + js1(lay)
    3014             :       enddo
    3015     9219976 :       do lay = 1, laytrop
    3016     9219976 :          if (specparm(lay) .lt. 0.125_r8) then
    3017      292858 :             p = fs(lay) - 1
    3018      292858 :             p4 = p**4
    3019      292858 :             fk0 = p4
    3020      292858 :             fk1 = 1 - p - 2.0_r8*p4
    3021      292858 :             fk2 = p + p4
    3022      292858 :             fac000(lay) = fk0*fac00(lay)
    3023      292858 :             fac100(lay) = fk1*fac00(lay)
    3024      292858 :             fac200(lay) = fk2*fac00(lay)
    3025      292858 :             fac010(lay) = fk0*fac10(lay)
    3026      292858 :             fac110(lay) = fk1*fac10(lay)
    3027      292858 :             fac210(lay) = fk2*fac10(lay)
    3028     8441118 :          else if (specparm(lay) .gt. 0.875_r8) then
    3029      115205 :             p = -fs(lay) 
    3030      115205 :             p4 = p**4
    3031      115205 :             fk0 = p4
    3032      115205 :             fk1 = 1 - p - 2.0_r8*p4
    3033      115205 :             fk2 = p + p4
    3034      115205 :             fac000(lay) = fk0*fac00(lay)
    3035      115205 :             fac100(lay) = fk1*fac00(lay)
    3036      115205 :             fac200(lay) = fk2*fac00(lay)
    3037      115205 :             fac010(lay) = fk0*fac10(lay)
    3038      115205 :             fac110(lay) = fk1*fac10(lay)
    3039      115205 :             fac210(lay) = fk2*fac10(lay)
    3040             :          else
    3041     8325913 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    3042     8325913 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    3043     8325913 :             fac100(lay) = fs(lay) * fac00(lay)
    3044     8325913 :             fac110(lay) = fs(lay) * fac10(lay)
    3045             :          endif
    3046             :       enddo
    3047     9219976 :       do lay = 1, laytrop
    3048             : 
    3049     9219976 :          if (specparm1(lay) .lt. 0.125_r8) then
    3050       26723 :             p = fs1(lay) - 1
    3051       26723 :             p4 = p**4
    3052       26723 :             fk0 = p4
    3053       26723 :             fk1 = 1 - p - 2.0_r8*p4
    3054       26723 :             fk2 = p + p4
    3055       26723 :             fac001(lay) = fk0*fac01(lay)
    3056       26723 :             fac101(lay) = fk1*fac01(lay)
    3057       26723 :             fac201(lay) = fk2*fac01(lay)
    3058       26723 :             fac011(lay) = fk0*fac11(lay)
    3059       26723 :             fac111(lay) = fk1*fac11(lay)
    3060       26723 :             fac211(lay) = fk2*fac11(lay)
    3061     8707253 :          else if (specparm1(lay) .gt. 0.875_r8) then
    3062     1046819 :             p = -fs1(lay) 
    3063     1046819 :             p4 = p**4
    3064     1046819 :             fk0 = p4
    3065     1046819 :             fk1 = 1 - p - 2.0_r8*p4
    3066     1046819 :             fk2 = p + p4
    3067     1046819 :             fac001(lay) = fk0*fac01(lay)
    3068     1046819 :             fac101(lay) = fk1*fac01(lay)
    3069     1046819 :             fac201(lay) = fk2*fac01(lay)
    3070     1046819 :             fac011(lay) = fk0*fac11(lay)
    3071     1046819 :             fac111(lay) = fk1*fac11(lay)
    3072     1046819 :             fac211(lay) = fk2*fac11(lay)
    3073             :          else
    3074     7660434 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    3075     7660434 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    3076     7660434 :             fac101(lay) = fs1(lay) * fac01(lay)
    3077     7660434 :             fac111(lay) = fs1(lay) * fac11(lay)
    3078             :          endif
    3079             :       enddo
    3080     9219976 :       do lay = 1, laytrop
    3081             : 
    3082    26687928 :          do ig = 1, ng16
    3083    87339760 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    3084   104807712 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    3085    87339760 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    3086   104807712 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    3087             : 
    3088    17467952 :             if (specparm(lay) .lt. 0.125_r8) then
    3089      585716 :                tau_major = speccomb(lay) * &
    3090     2342864 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    3091     2342864 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    3092     2342864 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    3093     2342864 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    3094     2342864 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    3095    12885752 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    3096    16882236 :             else if (specparm(lay) .gt. 0.875_r8) then
    3097      230410 :                tau_major = speccomb(lay) * &
    3098      921640 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    3099      921640 :                     fac100(lay) * absa(ind0(lay),ig) + &
    3100      921640 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    3101      921640 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    3102      921640 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    3103     5069020 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    3104             :             else
    3105    16651826 :                tau_major = speccomb(lay) * &
    3106    66607304 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    3107    66607304 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    3108    66607304 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    3109   233125564 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    3110             :             endif
    3111             : 
    3112    17467952 :             if (specparm1(lay) .lt. 0.125_r8) then
    3113       53446 :                tau_major1 = speccomb1(lay) * &
    3114      213784 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    3115      213784 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    3116      213784 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    3117      213784 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    3118      213784 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    3119     1175812 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    3120    17414506 :             else if (specparm1(lay) .gt. 0.875_r8) then
    3121     2093638 :                tau_major1 = speccomb1(lay) * &
    3122     8374552 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    3123     8374552 :                     fac101(lay) * absa(ind1(lay),ig) + &
    3124     8374552 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    3125     8374552 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    3126     8374552 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    3127    46060036 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    3128             :             else
    3129    15320868 :                tau_major1 = speccomb1(lay) * &
    3130    61283472 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    3131    61283472 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    3132    61283472 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    3133   214492152 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    3134             :             endif
    3135             : 
    3136    34935904 :             taug(lay,ngs15+ig) = tau_major + tau_major1 &
    3137    34935904 :                  + tauself + taufor
    3138   104807712 :             fracs(lay,ngs15+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    3139   131009640 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    3140             :          enddo
    3141             :       enddo
    3142             : 
    3143             : ! Upper atmosphere loop
    3144     4874024 :       do lay = laytrop+1, nlayers
    3145     4388024 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(16) + 1
    3146     4874024 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(16) + 1
    3147             :       enddo
    3148     4874024 :       do lay = laytrop+1, nlayers
    3149    13650072 :          do ig = 1, ng16
    3150    26328144 :             taug(lay,ngs15+ig) = colch4(lay) * &
    3151    35104192 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    3152    35104192 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    3153    35104192 :                  fac01(lay) * absb(ind1(lay),ig) + &
    3154   140416768 :                  fac11(lay) * absb(ind1(lay)+1,ig))
    3155    13164072 :             fracs(lay,ngs15+ig) = fracrefb(ig)
    3156             :          enddo
    3157             :       enddo
    3158             : 
    3159      486000 :       end subroutine taugb16
    3160             : 
    3161             :       end subroutine taumol
    3162             : 
    3163             :       end module rrtmg_lw_taumol
    3164             : 

Generated by: LCOV version 1.14