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: 1771 1855 95.5 %
Date: 2025-03-14 01:26:08 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       27648 :       subroutine taumol(nlayers, pavel, wx, coldry, &
      32       27648 :                         laytrop, jp, jt, jt1, planklay, planklev, plankbnd, &
      33       27648 :                         colh2o, colco2, colo3, coln2o, colco, colch4, colo2, &
      34       27648 :                         colbrd, fac00, fac01, fac10, fac11, &
      35       27648 :                         rat_h2oco2, rat_h2oco2_1, rat_h2oo3, rat_h2oo3_1, &
      36       27648 :                         rat_h2on2o, rat_h2on2o_1, rat_h2och4, rat_h2och4_1, &
      37       27648 :                         rat_n2oco2, rat_n2oco2_1, rat_o3co2, rat_o3co2_1, &
      38       27648 :                         selffac, selffrac, indself, forfac, forfrac, indfor, &
      39       27648 :                         minorfrac, scaleminor, scaleminorn2, indminor, &
      40       27648 :                         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       27648 :       call taugb1
     259       27648 :       call taugb2
     260       27648 :       call taugb3
     261       27648 :       call taugb4
     262       27648 :       call taugb5
     263       27648 :       call taugb6
     264       27648 :       call taugb7
     265       27648 :       call taugb8
     266       27648 :       call taugb9
     267       27648 :       call taugb10
     268       27648 :       call taugb11
     269       27648 :       call taugb12
     270       27648 :       call taugb13
     271       27648 :       call taugb14
     272       27648 :       call taugb15
     273       27648 :       call taugb16
     274             : 
     275             :       contains
     276             : 
     277             : !----------------------------------------------------------------------------
     278       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
     302       55296 :       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      635904 :       do lay = 1, laytrop
     315             : 
     316      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(1) + 1
     317      608256 :          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      608256 :          corradj(lay) =  1.
     323      635904 :          scalen2(lay) = colbrd(lay) * scaleminorn2(lay)
     324             :       enddo
     325      635904 :       do lay = 1, laytrop
     326      635904 :          if (pavel(lay) .lt. 250._r8) then
     327      168070 :             corradj(lay) = 1._r8 - 0.15_r8 * (250._r8-pavel(lay)) / 154.4_r8
     328             :          endif
     329             :       enddo
     330      635904 :       do lay = 1, laytrop
     331     6718464 :          do ig = 1, ng1
     332    18247680 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
     333    24330240 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     334    12165120 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     335    12165120 :                  (forref(indfor(lay)+1,ig) -  forref(indfor(lay),ig))) 
     336    12165120 :             taun2 = scalen2(lay)*(ka_mn2(indminor(lay),ig) + & 
     337    12165120 :                  minorfrac(lay) * (ka_mn2(indminor(lay)+1,ig) - ka_mn2(indminor(lay),ig)))
     338     6082560 :             taug(lay,ig) = corradj(lay) * (colh2o(lay) * &
     339    12165120 :                 (fac00(lay) * absa(ind0(lay),ig) + &
     340    12165120 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
     341    12165120 :                  fac01(lay) * absa(ind1(lay),ig) + &
     342    12165120 :                  fac11(lay) * absa(ind1(lay)+1,ig)) & 
     343    24330240 :                  + tauself + taufor + taun2)
     344     6690816 :              fracs(lay,ig) = fracrefa(ig)
     345             :          enddo
     346             :       enddo
     347             : 
     348             : ! Upper atmosphere loop
     349     1133568 :       do lay = laytrop+1, nlayers
     350             : 
     351     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(1) + 1
     352     1105920 :          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     1105920 :          corradj(lay) =  1._r8 - 0.15_r8 * (pavel(lay) / 95.6_r8)
     357             : 
     358     1133568 :          scalen2(lay) = colbrd(lay) * scaleminorn2(lay)
     359             :       enddo
     360     1133568 :       do lay = laytrop+1, nlayers
     361    12192768 :          do ig = 1, ng1
     362    33177600 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + &
     363    44236800 :                  forfrac(lay) * (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     364    22118400 :             taun2 = scalen2(lay)*(kb_mn2(indminor(lay),ig) + & 
     365    22118400 :                  minorfrac(lay) * (kb_mn2(indminor(lay)+1,ig) - kb_mn2(indminor(lay),ig)))
     366    11059200 :             taug(lay,ig) = corradj(lay) * (colh2o(lay) * &
     367    22118400 :                 (fac00(lay) * absb(ind0(lay),ig) + &
     368    22118400 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
     369    22118400 :                  fac01(lay) * absb(ind1(lay),ig) + &
     370    22118400 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &  
     371    44236800 :                  + taufor + taun2)
     372    12165120 :             fracs(lay,ig) = fracrefb(ig)
     373             :          enddo
     374             :       enddo
     375             : 
     376       27648 :       end subroutine taugb1
     377             : 
     378             : !----------------------------------------------------------------------------
     379       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
     398       55296 :       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      635904 :       do lay = 1, laytrop
     407             : 
     408      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(2) + 1
     409      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(2) + 1
     410             :          !inds = indself(lay)
     411             :          !indf = indfor(lay)
     412             :          !pp = pavel(lay)
     413      635904 :          corradj(lay) = 1._r8 - .05_r8 * (pavel(lay) - 100._r8) / 900._r8
     414             :       enddo
     415      635904 :       do lay = 1, laytrop
     416     7934976 :          do ig = 1, ng2
     417    21897216 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
     418    29196288 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     419    14598144 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     420    14598144 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     421     7299072 :             taug(lay,ngs1+ig) = corradj(lay) * (colh2o(lay) * &
     422    14598144 :                 (fac00(lay) * absa(ind0(lay),ig) + &
     423    14598144 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
     424    14598144 :                  fac01(lay) * absa(ind1(lay),ig) + &
     425    14598144 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
     426    36495360 :                  + tauself + taufor)
     427     7907328 :             fracs(lay,ngs1+ig) = fracrefa(ig)
     428             :          enddo
     429             :       enddo
     430             : 
     431             : ! Upper atmosphere loop
     432     1133568 :       do lay = laytrop+1, nlayers
     433             : 
     434     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(2) + 1
     435     1133568 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(2) + 1
     436             :          !indf = indfor(lay)
     437             :       enddo
     438     1133568 :       do lay = laytrop+1, nlayers
     439    14404608 :          do ig = 1, ng2
     440    39813120 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + &
     441    53084160 :                  forfrac(lay) * (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     442    13271040 :             taug(lay,ngs1+ig) = colh2o(lay) * &
     443    26542080 :                 (fac00(lay) * absb(ind0(lay),ig) + &
     444    26542080 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
     445    26542080 :                  fac01(lay) * absb(ind1(lay),ig) + &
     446    26542080 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
     447    66355200 :                  + taufor
     448    14376960 :             fracs(lay,ngs1+ig) = fracrefb(ig)
     449             :          enddo
     450             :       enddo
     451             : 
     452       27648 :       end subroutine taugb2
     453             : 
     454             : !----------------------------------------------------------------------------
     455       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers),  ig
     473       55296 :       integer, dimension(nlayers) :: js, js1, jmn2o, jpl
     474       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
     475       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
     476       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_mn2o, specparm_mn2o, specmult_mn2o, &
     477       55296 :                        fmn2o, fmn2omf, chi_n2o, ratn2o, adjfac, adjcoln2o
     478       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
     479             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
     480       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
     481       55296 :       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       27648 :       refrat_planck_a = chi_mls(1,9)/chi_mls(2,9)
     493             : 
     494             : !  P = 95.58 mb
     495       27648 :       refrat_planck_b = chi_mls(1,13)/chi_mls(2,13)
     496             : 
     497             : !  P = 706.270mb
     498       27648 :       refrat_m_a = chi_mls(1,3)/chi_mls(2,3)
     499             : 
     500             : !  P = 95.58 mb 
     501       27648 :       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      635904 :       do lay = 1, laytrop
     510             : 
     511      608256 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
     512      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
     513      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     514      608256 :          specmult(lay) = 8._r8*(specparm(lay))
     515      608256 :          js(lay) = 1 + int(specmult(lay))
     516      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)        
     517             : 
     518      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
     519      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
     520      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     521      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
     522      608256 :          js1(lay) = 1 + int(specmult1(lay))
     523      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     524             : 
     525      608256 :          speccomb_mn2o(lay) = colh2o(lay) + refrat_m_a*colco2(lay)
     526      608256 :          specparm_mn2o(lay) = colh2o(lay)/speccomb_mn2o(lay)
     527      608256 :          if (specparm_mn2o(lay) .ge. oneminus) specparm_mn2o(lay) = oneminus
     528      608256 :          specmult_mn2o(lay) = 8._r8*specparm_mn2o(lay)
     529      608256 :          jmn2o(lay) = 1 + int(specmult_mn2o(lay))
     530      608256 :          fmn2o(lay) = mod(specmult_mn2o(lay),1.0_r8)
     531      608256 :          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      608256 :          chi_n2o(lay) = coln2o(lay)/coldry(lay)
     536      635904 :          ratn2o(lay) = 1.e20_r8*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
     537             :       enddo
     538      635904 :       do lay = 1, laytrop
     539      635904 :          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      608256 :             adjcoln2o(lay) = coln2o(lay)
     544             :          endif
     545             :       enddo
     546      635904 :       do lay = 1, laytrop
     547             : 
     548      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
     549      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
     550      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
     551      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
     552      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
     553      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
     554             : 
     555      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(3) + js(lay)
     556      635904 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(3) + js1(lay)
     557             :       enddo
     558      635904 :       do lay = 1, laytrop
     559             : 
     560      608256 :          if (specparm(lay) .lt. 0.125_r8) then
     561      157862 :             p = fs(lay) - 1
     562      157862 :             p4 = p**4
     563      157862 :             fk0 = p4
     564      157862 :             fk1 = 1 - p - 2.0_r8*p4
     565      157862 :             fk2 = p + p4
     566      157862 :             fac000(lay) = fk0*fac00(lay)
     567      157862 :             fac100(lay) = fk1*fac00(lay)
     568      157862 :             fac200(lay) = fk2*fac00(lay)
     569      157862 :             fac010(lay) = fk0*fac10(lay)
     570      157862 :             fac110(lay) = fk1*fac10(lay)
     571      157862 :             fac210(lay) = fk2*fac10(lay)
     572      450394 :          else if (specparm(lay) .gt. 0.875_r8) then
     573          51 :             p = -fs(lay) 
     574          51 :             p4 = p**4
     575          51 :             fk0 = p4
     576          51 :             fk1 = 1 - p - 2.0_r8*p4
     577          51 :             fk2 = p + p4
     578          51 :             fac000(lay) = fk0*fac00(lay)
     579          51 :             fac100(lay) = fk1*fac00(lay)
     580          51 :             fac200(lay) = fk2*fac00(lay)
     581          51 :             fac010(lay) = fk0*fac10(lay)
     582          51 :             fac110(lay) = fk1*fac10(lay)
     583          51 :             fac210(lay) = fk2*fac10(lay)
     584             :          else
     585      450343 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     586      450343 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     587      450343 :             fac100(lay) = fs(lay) * fac00(lay)
     588      450343 :             fac110(lay) = fs(lay) * fac10(lay)
     589             :          endif
     590      635904 :          if (specparm1(lay) .lt. 0.125_r8) then
     591       76952 :             p = fs1(lay) - 1
     592       76952 :             p4 = p**4
     593       76952 :             fk0 = p4
     594       76952 :             fk1 = 1 - p - 2.0_r8*p4
     595       76952 :             fk2 = p + p4
     596       76952 :             fac001(lay) = fk0*fac01(lay)
     597       76952 :             fac101(lay) = fk1*fac01(lay)
     598       76952 :             fac201(lay) = fk2*fac01(lay)
     599       76952 :             fac011(lay) = fk0*fac11(lay)
     600       76952 :             fac111(lay) = fk1*fac11(lay)
     601       76952 :             fac211(lay) = fk2*fac11(lay)
     602      531304 :          else if (specparm1(lay) .gt. 0.875_r8) then
     603        5417 :             p = -fs1(lay) 
     604        5417 :             p4 = p**4
     605        5417 :             fk0 = p4
     606        5417 :             fk1 = 1 - p - 2.0_r8*p4
     607        5417 :             fk2 = p + p4
     608        5417 :             fac001(lay) = fk0*fac01(lay)
     609        5417 :             fac101(lay) = fk1*fac01(lay)
     610        5417 :             fac201(lay) = fk2*fac01(lay)
     611        5417 :             fac011(lay) = fk0*fac11(lay)
     612        5417 :             fac111(lay) = fk1*fac11(lay)
     613        5417 :             fac211(lay) = fk2*fac11(lay)
     614             :          else
     615      525887 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     616      525887 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     617      525887 :             fac101(lay) = fs1(lay) * fac01(lay)
     618      525887 :             fac111(lay) = fs1(lay) * fac11(lay)
     619             :          endif
     620             :       enddo
     621      635904 :       do lay = 1, laytrop
     622             : 
     623    10368000 :          do ig = 1, ng3
     624    29196288 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
     625    38928384 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     626    19464192 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     627    19464192 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     628    29196288 :             n2om1 = ka_mn2o(jmn2o(lay),indminor(lay),ig) + fmn2o(lay) * &
     629    29196288 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay),ig) - ka_mn2o(jmn2o(lay),indminor(lay),ig))
     630     9732096 :             n2om2 = ka_mn2o(jmn2o(lay),indminor(lay)+1,ig) + fmn2o(lay) * &
     631     9732096 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay)+1,ig) - ka_mn2o(jmn2o(lay),indminor(lay)+1,ig))
     632     9732096 :             absn2o = n2om1 + minorfrac(lay) * (n2om2 - n2om1)
     633             : 
     634     9732096 :             if (specparm(lay) .lt. 0.125_r8) then
     635             :                tau_major = speccomb(lay) * &
     636     2525792 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     637     2525792 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     638     2525792 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
     639     2525792 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     640     2525792 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
     641    15154752 :                     fac210(lay) * absa(ind0(lay)+11,ig))
     642     7206304 :             else if (specparm(lay) .gt. 0.875_r8) then
     643             :                tau_major = speccomb(lay) * &
     644         816 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
     645         816 :                     fac100(lay) * absa(ind0(lay),ig) + &
     646         816 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
     647         816 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
     648         816 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
     649        4896 :                     fac010(lay) * absa(ind0(lay)+10,ig))
     650             :             else
     651             :                tau_major = speccomb(lay) * &
     652     7205488 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     653     7205488 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     654     7205488 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     655    28821952 :                     fac110(lay) * absa(ind0(lay)+10,ig))
     656             :             endif
     657             : 
     658     9732096 :             if (specparm1(lay) .lt. 0.125_r8) then
     659             :                tau_major1 = speccomb1(lay) * &
     660     1231232 :                     (fac001(lay) * absa(ind1(lay),ig) + &
     661     1231232 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     662     1231232 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
     663     1231232 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     664     1231232 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
     665     7387392 :                     fac211(lay) * absa(ind1(lay)+11,ig))
     666     8500864 :             else if (specparm1(lay) .gt. 0.875_r8) then
     667             :                tau_major1 = speccomb1(lay) * &
     668       86672 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
     669       86672 :                     fac101(lay) * absa(ind1(lay),ig) + &
     670       86672 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
     671       86672 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
     672       86672 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
     673      520032 :                     fac011(lay) * absa(ind1(lay)+10,ig))
     674             :             else
     675             :                tau_major1 = speccomb1(lay) * &
     676     8414192 :                     (fac001(lay) * absa(ind1(lay),ig) +  &
     677     8414192 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     678     8414192 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     679    33656768 :                     fac111(lay) * absa(ind1(lay)+10,ig))
     680             :             endif
     681             : 
     682     9732096 :             taug(lay,ngs2+ig) = tau_major + tau_major1 &
     683             :                  + tauself + taufor &
     684     9732096 :                  + adjcoln2o(lay)*absn2o
     685    19464192 :             fracs(lay,ngs2+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
     686    20072448 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
     687             :          enddo
     688             :       enddo
     689             : 
     690             : ! Upper atmosphere loop
     691     1133568 :       do lay = laytrop+1, nlayers
     692             : 
     693     1105920 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
     694     1105920 :          specparm(lay) = colh2o(lay)/speccomb(lay)
     695     1105920 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     696     1105920 :          specmult(lay) = 4._r8*(specparm(lay))
     697     1105920 :          js(lay) = 1 + int(specmult(lay))
     698     1105920 :          fs(lay) = mod(specmult(lay),1.0_r8)
     699             : 
     700     1105920 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
     701     1105920 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
     702     1105920 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     703     1105920 :          specmult1(lay) = 4._r8*(specparm1(lay))
     704     1105920 :          js1(lay) = 1 + int(specmult1(lay))
     705     1105920 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     706             : 
     707     1105920 :          fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     708     1105920 :          fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     709     1105920 :          fac100(lay) = fs(lay) * fac00(lay)
     710     1105920 :          fac110(lay) = fs(lay) * fac10(lay)
     711     1105920 :          fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     712     1105920 :          fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     713     1105920 :          fac101(lay) = fs1(lay) * fac01(lay)
     714     1105920 :          fac111(lay) = fs1(lay) * fac11(lay)
     715             : 
     716     1105920 :          speccomb_mn2o(lay) = colh2o(lay) + refrat_m_b*colco2(lay)
     717     1105920 :          specparm_mn2o(lay) = colh2o(lay)/speccomb_mn2o(lay)
     718     1105920 :          if (specparm_mn2o(lay) .ge. oneminus) specparm_mn2o(lay) = oneminus
     719     1105920 :          specmult_mn2o(lay) = 4._r8*specparm_mn2o(lay)
     720     1105920 :          jmn2o(lay) = 1 + int(specmult_mn2o(lay))
     721     1105920 :          fmn2o(lay) = mod(specmult_mn2o(lay),1.0_r8)
     722     1105920 :          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     1105920 :          chi_n2o(lay) = coln2o(lay)/coldry(lay)
     727     1133568 :          ratn2o(lay) = 1.e20*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
     728             :       enddo
     729     1133568 :       do lay = laytrop+1, nlayers
     730     1133568 :          if (ratn2o(lay) .gt. 1.5_r8) then
     731      268634 :             adjfac(lay) = 0.5_r8+(ratn2o(lay)-0.5_r8)**0.65_r8
     732      268634 :             adjcoln2o(lay) = adjfac(lay)*chi_mls(4,jp(lay)+1)*coldry(lay)*1.e-20_r8
     733             :          else
     734      837286 :             adjcoln2o(lay) = coln2o(lay)
     735             :          endif
     736             :       enddo
     737     1133568 :       do lay = laytrop+1, nlayers
     738             : 
     739     1105920 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_b*colco2(lay)
     740     1105920 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
     741     1105920 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
     742     1105920 :          specmult_planck(lay) = 4._r8*specparm_planck(lay)
     743     1105920 :          jpl(lay)= 1 + int(specmult_planck(lay))
     744     1105920 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
     745             : 
     746     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(3) + js(lay)
     747     1133568 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(3) + js1(lay)
     748             :       enddo
     749     1133568 :       do lay = laytrop+1, nlayers
     750             : 
     751    18828288 :          do ig = 1, ng3
     752    53084160 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + &
     753    70778880 :                  forfrac(lay) * (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     754    53084160 :             n2om1 = kb_mn2o(jmn2o(lay),indminor(lay),ig) + fmn2o(lay) * &
     755    53084160 :                  (kb_mn2o(jmn2o(lay)+1,indminor(lay),ig)-kb_mn2o(jmn2o(lay),indminor(lay),ig))
     756    17694720 :             n2om2 = kb_mn2o(jmn2o(lay),indminor(lay)+1,ig) + fmn2o(lay) * &
     757    17694720 :                  (kb_mn2o(jmn2o(lay)+1,indminor(lay)+1,ig)-kb_mn2o(jmn2o(lay),indminor(lay)+1,ig))
     758    17694720 :             absn2o = n2om1 + minorfrac(lay) * (n2om2 - n2om1)
     759    17694720 :             taug(lay,ngs2+ig) = speccomb(lay) * &
     760    17694720 :                 (fac000(lay) * absb(ind0(lay),ig) + &
     761    17694720 :                 fac100(lay) * absb(ind0(lay)+1,ig) + &
     762    17694720 :                 fac010(lay) * absb(ind0(lay)+5,ig) + &
     763    17694720 :                 fac110(lay) * absb(ind0(lay)+6,ig)) &
     764             :                 + speccomb1(lay) * &
     765    17694720 :                 (fac001(lay) * absb(ind1(lay),ig) +  &
     766    17694720 :                 fac101(lay) * absb(ind1(lay)+1,ig) + &
     767    17694720 :                 fac011(lay) * absb(ind1(lay)+5,ig) + &
     768    17694720 :                 fac111(lay) * absb(ind1(lay)+6,ig))  &
     769             :                 + taufor &
     770   159252480 :                 + adjcoln2o(lay)*absn2o
     771    35389440 :             fracs(lay,ngs2+ig) = fracrefb(ig,jpl(lay)) + fpl(lay) * &
     772    36495360 :                 (fracrefb(ig,jpl(lay)+1)-fracrefb(ig,jpl(lay)))
     773             :          enddo
     774             :       enddo
     775             : 
     776       27648 :       end subroutine taugb3
     777             : 
     778             : !----------------------------------------------------------------------------
     779       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
     796       55296 :       integer, dimension(nlayers) :: js, js1, jpl
     797       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
     798       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
     799       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
     800             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
     801       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
     802       55296 :       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       27648 :       refrat_planck_a = chi_mls(1,11)/chi_mls(2,11)
     810             : 
     811             : ! P = 95.58350 mb
     812       27648 :       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      635904 :       do lay = 1, laytrop
     821             : 
     822      608256 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
     823      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
     824      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     825      608256 :          specmult(lay) = 8._r8*(specparm(lay))
     826      608256 :          js(lay) = 1 + int(specmult(lay))
     827      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
     828             : 
     829      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
     830      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
     831      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     832      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
     833      608256 :          js1(lay) = 1 + int(specmult1(lay))
     834      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     835             : 
     836      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
     837      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
     838      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
     839      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
     840      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
     841      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
     842             : 
     843      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(4) + js(lay)
     844      635904 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(4) + js1(lay)
     845             :       enddo
     846      635904 :       do lay = 1, laytrop
     847      608256 :          if (specparm(lay) .lt. 0.125_r8) then
     848      157862 :             p = fs(lay) - 1
     849      157862 :             p4 = p**4
     850      157862 :             fk0 = p4
     851      157862 :             fk1 = 1 - p - 2.0_r8*p4
     852      157862 :             fk2 = p + p4
     853      157862 :             fac000(lay) = fk0*fac00(lay)
     854      157862 :             fac100(lay) = fk1*fac00(lay)
     855      157862 :             fac200(lay) = fk2*fac00(lay)
     856      157862 :             fac010(lay) = fk0*fac10(lay)
     857      157862 :             fac110(lay) = fk1*fac10(lay)
     858      157862 :             fac210(lay) = fk2*fac10(lay)
     859      450394 :          else if (specparm(lay) .gt. 0.875_r8) then
     860          51 :             p = -fs(lay) 
     861          51 :             p4 = p**4
     862          51 :             fk0 = p4
     863          51 :             fk1 = 1 - p - 2.0_r8*p4
     864          51 :             fk2 = p + p4
     865          51 :             fac000(lay) = fk0*fac00(lay)
     866          51 :             fac100(lay) = fk1*fac00(lay)
     867          51 :             fac200(lay) = fk2*fac00(lay)
     868          51 :             fac010(lay) = fk0*fac10(lay)
     869          51 :             fac110(lay) = fk1*fac10(lay)
     870          51 :             fac210(lay) = fk2*fac10(lay)
     871             :          else
     872      450343 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     873      450343 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     874      450343 :             fac100(lay) = fs(lay) * fac00(lay)
     875      450343 :             fac110(lay) = fs(lay) * fac10(lay)
     876             :          endif
     877             : 
     878      635904 :          if (specparm1(lay) .lt. 0.125_r8) then
     879       76952 :             p = fs1(lay) - 1
     880       76952 :             p4 = p**4
     881       76952 :             fk0 = p4
     882       76952 :             fk1 = 1 - p - 2.0_r8*p4
     883       76952 :             fk2 = p + p4
     884       76952 :             fac001(lay) = fk0*fac01(lay)
     885       76952 :             fac101(lay) = fk1*fac01(lay)
     886       76952 :             fac201(lay) = fk2*fac01(lay)
     887       76952 :             fac011(lay) = fk0*fac11(lay)
     888       76952 :             fac111(lay) = fk1*fac11(lay)
     889       76952 :             fac211(lay) = fk2*fac11(lay)
     890      531304 :          else if (specparm1(lay) .gt. 0.875_r8) then
     891        5417 :             p = -fs1(lay) 
     892        5417 :             p4 = p**4
     893        5417 :             fk0 = p4
     894        5417 :             fk1 = 1 - p - 2.0_r8*p4
     895        5417 :             fk2 = p + p4
     896        5417 :             fac001(lay) = fk0*fac01(lay)
     897        5417 :             fac101(lay) = fk1*fac01(lay)
     898        5417 :             fac201(lay) = fk2*fac01(lay)
     899        5417 :             fac011(lay) = fk0*fac11(lay)
     900        5417 :             fac111(lay) = fk1*fac11(lay)
     901        5417 :             fac211(lay) = fk2*fac11(lay)
     902             :          else
     903      525887 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     904      525887 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     905      525887 :             fac101(lay) = fs1(lay) * fac01(lay)
     906      525887 :             fac111(lay) = fs1(lay) * fac11(lay)
     907             :          endif
     908             :       enddo
     909      635904 :       do lay = 1, laytrop
     910             : 
     911     9151488 :          do ig = 1, ng4
     912    25546752 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
     913    34062336 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
     914    17031168 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
     915    17031168 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
     916             : 
     917     8515584 :             if (specparm(lay) .lt. 0.125_r8) then
     918             :                tau_major = speccomb(lay) * &
     919     2210068 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     920     2210068 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     921     2210068 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
     922     2210068 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     923     2210068 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
     924    13260408 :                     fac210(lay) * absa(ind0(lay)+11,ig))
     925     6305516 :             else if (specparm(lay) .gt. 0.875_r8) then
     926             :                tau_major = speccomb(lay) * &
     927         714 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
     928         714 :                     fac100(lay) * absa(ind0(lay),ig) + &
     929         714 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
     930         714 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
     931         714 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
     932        4284 :                     fac010(lay) * absa(ind0(lay)+10,ig))
     933             :             else
     934             :                tau_major = speccomb(lay) * &
     935     6304802 :                     (fac000(lay) * absa(ind0(lay),ig) + &
     936     6304802 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
     937     6304802 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
     938    25219208 :                     fac110(lay) * absa(ind0(lay)+10,ig))
     939             :             endif
     940             : 
     941     8515584 :             if (specparm1(lay) .lt. 0.125_r8) then
     942             :                tau_major1 = speccomb1(lay) * &
     943     1077328 :                     (fac001(lay) * absa(ind1(lay),ig) +  &
     944     1077328 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     945     1077328 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
     946     1077328 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     947     1077328 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
     948     6463968 :                     fac211(lay) * absa(ind1(lay)+11,ig))
     949     7438256 :             else if (specparm1(lay) .gt. 0.875_r8) then
     950             :                tau_major1 = speccomb1(lay) * &
     951       75838 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
     952       75838 :                     fac101(lay) * absa(ind1(lay),ig) + &
     953       75838 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
     954       75838 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
     955       75838 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
     956      455028 :                     fac011(lay) * absa(ind1(lay)+10,ig))
     957             :             else
     958             :                tau_major1 = speccomb1(lay) * &
     959     7362418 :                     (fac001(lay) * absa(ind1(lay),ig) + &
     960     7362418 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
     961     7362418 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
     962    29449672 :                     fac111(lay) * absa(ind1(lay)+10,ig))
     963             :             endif
     964             : 
     965     8515584 :             taug(lay,ngs3+ig) = tau_major + tau_major1 &
     966     8515584 :                  + tauself + taufor
     967    17031168 :             fracs(lay,ngs3+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
     968    17639424 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
     969             :          enddo
     970             :       enddo
     971             : 
     972             : ! Upper atmosphere loop
     973     1133568 :       do lay = laytrop+1, nlayers
     974             : 
     975     1105920 :          speccomb(lay) = colo3(lay) + rat_o3co2(lay)*colco2(lay)
     976     1105920 :          specparm(lay) = colo3(lay)/speccomb(lay)
     977     1105920 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
     978     1105920 :          specmult(lay) = 4._r8*(specparm(lay))
     979     1105920 :          js(lay) = 1 + int(specmult(lay))
     980     1105920 :          fs(lay) = mod(specmult(lay),1.0_r8)
     981             : 
     982     1105920 :          speccomb1(lay) = colo3(lay) + rat_o3co2_1(lay)*colco2(lay)
     983     1105920 :          specparm1(lay) = colo3(lay)/speccomb1(lay)
     984     1105920 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
     985     1105920 :          specmult1(lay) = 4._r8*(specparm1(lay))
     986     1105920 :          js1(lay) = 1 + int(specmult1(lay))
     987     1105920 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
     988             : 
     989     1105920 :          fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
     990     1105920 :          fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
     991     1105920 :          fac100(lay) = fs(lay) * fac00(lay)
     992     1105920 :          fac110(lay) = fs(lay) * fac10(lay)
     993     1105920 :          fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
     994     1105920 :          fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
     995     1105920 :          fac101(lay) = fs1(lay) * fac01(lay)
     996     1105920 :          fac111(lay) = fs1(lay) * fac11(lay)
     997             : 
     998     1105920 :          speccomb_planck(lay) = colo3(lay)+refrat_planck_b*colco2(lay)
     999     1105920 :          specparm_planck(lay) = colo3(lay)/speccomb_planck(lay)
    1000     1105920 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1001     1105920 :          specmult_planck(lay) = 4._r8*specparm_planck(lay)
    1002     1105920 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1003     1105920 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1004             : 
    1005     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(4) + js(lay)
    1006     1105920 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(4) + js1(lay)
    1007    16588800 :          do ig = 1, ng4
    1008    15482880 :             taug(lay,ngs3+ig) =  speccomb(lay) * &
    1009    30965760 :                 (fac000(lay) * absb(ind0(lay),ig) + &
    1010    15482880 :                 fac100(lay) * absb(ind0(lay)+1,ig) + &
    1011    15482880 :                 fac010(lay) * absb(ind0(lay)+5,ig) + &
    1012    15482880 :                 fac110(lay) * absb(ind0(lay)+6,ig)) &
    1013             :                 + speccomb1(lay) * &
    1014    15482880 :                 (fac001(lay) * absb(ind1(lay),ig) +  &
    1015    15482880 :                 fac101(lay) * absb(ind1(lay)+1,ig) + &
    1016    15482880 :                 fac011(lay) * absb(ind1(lay)+5,ig) + &
    1017   154828800 :                 fac111(lay) * absb(ind1(lay)+6,ig))
    1018    30965760 :             fracs(lay,ngs3+ig) = fracrefb(ig,jpl(lay)) + fpl(lay) * &
    1019    32071680 :                 (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     1105920 :          taug(lay,ngs3+8)=taug(lay,ngs3+8)*0.92
    1026     1105920 :          taug(lay,ngs3+9)=taug(lay,ngs3+9)*0.88
    1027     1105920 :          taug(lay,ngs3+10)=taug(lay,ngs3+10)*1.07
    1028     1105920 :          taug(lay,ngs3+11)=taug(lay,ngs3+11)*1.1
    1029     1105920 :          taug(lay,ngs3+12)=taug(lay,ngs3+12)*0.99
    1030     1105920 :          taug(lay,ngs3+13)=taug(lay,ngs3+13)*0.88
    1031     1133568 :          taug(lay,ngs3+14)=taug(lay,ngs3+14)*0.943
    1032             : 
    1033             :       enddo
    1034             : 
    1035       27648 :       end subroutine taugb4
    1036             : 
    1037             : !----------------------------------------------------------------------------
    1038       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers),  ig
    1056       55296 :       integer, dimension(nlayers) :: js, js1, jmo3, jpl
    1057       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    1058       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    1059       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_mo3, specparm_mo3, specmult_mo3, fmo3
    1060       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    1061             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    1062       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    1063       55296 :       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       27648 :       refrat_planck_a = chi_mls(1,5)/chi_mls(2,5)
    1078             : 
    1079             : ! P = 0.2369 mb
    1080       27648 :       refrat_planck_b = chi_mls(3,43)/chi_mls(2,43)
    1081             : 
    1082             : ! P = 317.3480
    1083       27648 :       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      635904 :       do lay = 1, laytrop
    1092             : 
    1093      608256 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
    1094      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    1095      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1096      608256 :          specmult(lay) = 8._r8*(specparm(lay))
    1097      608256 :          js(lay) = 1 + int(specmult(lay))
    1098      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1099             : 
    1100      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
    1101      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    1102      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1103      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
    1104      608256 :          js1(lay) = 1 + int(specmult1(lay))
    1105      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1106             : 
    1107      608256 :          speccomb_mo3(lay) = colh2o(lay) + refrat_m_a*colco2(lay)
    1108      608256 :          specparm_mo3(lay) = colh2o(lay)/speccomb_mo3(lay)
    1109      608256 :          if (specparm_mo3(lay) .ge. oneminus) specparm_mo3(lay) = oneminus
    1110      608256 :          specmult_mo3(lay) = 8._r8*specparm_mo3(lay)
    1111      608256 :          jmo3(lay) = 1 + int(specmult_mo3(lay))
    1112      608256 :          fmo3(lay) = mod(specmult_mo3(lay),1.0_r8)
    1113             : 
    1114      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
    1115      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    1116      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1117      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    1118      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1119      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1120             : 
    1121      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(5) + js(lay)
    1122      635904 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(5) + js1(lay)
    1123             :       enddo
    1124      635904 :       do lay = 1, laytrop
    1125      608256 :          if (specparm(lay) .lt. 0.125_r8) then
    1126      157862 :             p = fs(lay) - 1
    1127      157862 :             p4 = p**4
    1128      157862 :             fk0 = p4
    1129      157862 :             fk1 = 1 - p - 2.0_r8*p4
    1130      157862 :             fk2 = p + p4
    1131      157862 :             fac000(lay) = fk0*fac00(lay)
    1132      157862 :             fac100(lay) = fk1*fac00(lay)
    1133      157862 :             fac200(lay) = fk2*fac00(lay)
    1134      157862 :             fac010(lay) = fk0*fac10(lay)
    1135      157862 :             fac110(lay) = fk1*fac10(lay)
    1136      157862 :             fac210(lay) = fk2*fac10(lay)
    1137      450394 :          else if (specparm(lay) .gt. 0.875_r8) then
    1138          51 :             p = -fs(lay) 
    1139          51 :             p4 = p**4
    1140          51 :             fk0 = p4
    1141          51 :             fk1 = 1 - p - 2.0_r8*p4
    1142          51 :             fk2 = p + p4
    1143          51 :             fac000(lay) = fk0*fac00(lay)
    1144          51 :             fac100(lay) = fk1*fac00(lay)
    1145          51 :             fac200(lay) = fk2*fac00(lay)
    1146          51 :             fac010(lay) = fk0*fac10(lay)
    1147          51 :             fac110(lay) = fk1*fac10(lay)
    1148          51 :             fac210(lay) = fk2*fac10(lay)
    1149             :          else
    1150      450343 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1151      450343 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1152      450343 :             fac100(lay) = fs(lay) * fac00(lay)
    1153      450343 :             fac110(lay) = fs(lay) * fac10(lay)
    1154             :          endif
    1155             : 
    1156      635904 :          if (specparm1(lay) .lt. 0.125_r8) then
    1157       76952 :             p = fs1(lay) - 1
    1158       76952 :             p4 = p**4
    1159       76952 :             fk0 = p4
    1160       76952 :             fk1 = 1 - p - 2.0_r8*p4
    1161       76952 :             fk2 = p + p4
    1162       76952 :             fac001(lay) = fk0*fac01(lay)
    1163       76952 :             fac101(lay) = fk1*fac01(lay)
    1164       76952 :             fac201(lay) = fk2*fac01(lay)
    1165       76952 :             fac011(lay) = fk0*fac11(lay)
    1166       76952 :             fac111(lay) = fk1*fac11(lay)
    1167       76952 :             fac211(lay) = fk2*fac11(lay)
    1168      531304 :          else if (specparm1(lay) .gt. 0.875_r8) then
    1169        5417 :             p = -fs1(lay) 
    1170        5417 :             p4 = p**4
    1171        5417 :             fk0 = p4
    1172        5417 :             fk1 = 1 - p - 2.0_r8*p4
    1173        5417 :             fk2 = p + p4
    1174        5417 :             fac001(lay) = fk0*fac01(lay)
    1175        5417 :             fac101(lay) = fk1*fac01(lay)
    1176        5417 :             fac201(lay) = fk2*fac01(lay)
    1177        5417 :             fac011(lay) = fk0*fac11(lay)
    1178        5417 :             fac111(lay) = fk1*fac11(lay)
    1179        5417 :             fac211(lay) = fk2*fac11(lay)
    1180             :          else
    1181      525887 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1182      525887 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1183      525887 :             fac101(lay) = fs1(lay) * fac01(lay)
    1184      525887 :             fac111(lay) = fs1(lay) * fac11(lay)
    1185             :          endif
    1186             :       enddo
    1187      635904 :       do lay = 1, laytrop
    1188             : 
    1189    10368000 :          do ig = 1, ng5
    1190    29196288 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    1191    38928384 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1192    19464192 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1193    19464192 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    1194    29196288 :             o3m1 = ka_mo3(jmo3(lay),indminor(lay),ig) + fmo3(lay) * &
    1195    29196288 :                  (ka_mo3(jmo3(lay)+1,indminor(lay),ig)-ka_mo3(jmo3(lay),indminor(lay),ig))
    1196     9732096 :             o3m2 = ka_mo3(jmo3(lay),indminor(lay)+1,ig) + fmo3(lay) * &
    1197     9732096 :                  (ka_mo3(jmo3(lay)+1,indminor(lay)+1,ig)-ka_mo3(jmo3(lay),indminor(lay)+1,ig))
    1198     9732096 :             abso3 = o3m1 + minorfrac(lay)*(o3m2-o3m1)
    1199             : 
    1200     9732096 :             if (specparm(lay) .lt. 0.125_r8) then
    1201             :                tau_major = speccomb(lay) * &
    1202     2525792 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1203     2525792 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1204     2525792 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    1205     2525792 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1206     2525792 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    1207    15154752 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    1208     7206304 :             else if (specparm(lay) .gt. 0.875_r8) then
    1209             :                tau_major = speccomb(lay) * &
    1210         816 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    1211         816 :                     fac100(lay) * absa(ind0(lay),ig) + &
    1212         816 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    1213         816 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    1214         816 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    1215        4896 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    1216             :             else
    1217             :                tau_major = speccomb(lay) * &
    1218     7205488 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1219     7205488 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1220     7205488 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1221    28821952 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    1222             :             endif
    1223             : 
    1224     9732096 :             if (specparm1(lay) .lt. 0.125_r8) then
    1225             :                tau_major1 = speccomb1(lay) * &
    1226     1231232 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    1227     1231232 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1228     1231232 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    1229     1231232 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1230     1231232 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    1231     7387392 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    1232     8500864 :             else if (specparm1(lay) .gt. 0.875_r8) then
    1233             :                tau_major1 = speccomb1(lay) * & 
    1234       86672 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    1235       86672 :                     fac101(lay) * absa(ind1(lay),ig) + &
    1236       86672 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    1237       86672 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    1238       86672 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    1239      520032 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    1240             :             else
    1241             :                tau_major1 = speccomb1(lay) * &
    1242     8414192 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    1243     8414192 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1244     8414192 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1245    33656768 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    1246             :             endif
    1247             : 
    1248     9732096 :             taug(lay,ngs4+ig) = tau_major + tau_major1 &
    1249             :                  + tauself + taufor &
    1250     9732096 :                  + abso3*colo3(lay) &
    1251    19464192 :                  + wx(1,lay) * ccl4(ig)
    1252    19464192 :             fracs(lay,ngs4+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    1253    20072448 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    1254             :          enddo
    1255             :       enddo
    1256             : 
    1257             : ! Upper atmosphere loop
    1258     1133568 :       do lay = laytrop+1, nlayers
    1259             : 
    1260     1105920 :          speccomb(lay) = colo3(lay) + rat_o3co2(lay)*colco2(lay)
    1261     1105920 :          specparm(lay) = colo3(lay)/speccomb(lay)
    1262     1105920 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1263     1105920 :          specmult(lay) = 4._r8*(specparm(lay))
    1264     1105920 :          js(lay) = 1 + int(specmult(lay))
    1265     1105920 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1266             : 
    1267     1105920 :          speccomb1(lay) = colo3(lay) + rat_o3co2_1(lay)*colco2(lay)
    1268     1105920 :          specparm1(lay) = colo3(lay)/speccomb1(lay)
    1269     1105920 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1270     1105920 :          specmult1(lay) = 4._r8*(specparm1(lay))
    1271     1105920 :          js1(lay) = 1 + int(specmult1(lay))
    1272     1105920 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1273             : 
    1274     1105920 :          fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1275     1105920 :          fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1276     1105920 :          fac100(lay) = fs(lay) * fac00(lay)
    1277     1105920 :          fac110(lay) = fs(lay) * fac10(lay)
    1278     1105920 :          fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1279     1105920 :          fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1280     1105920 :          fac101(lay) = fs1(lay) * fac01(lay)
    1281     1105920 :          fac111(lay) = fs1(lay) * fac11(lay)
    1282             : 
    1283     1105920 :          speccomb_planck(lay) = colo3(lay)+refrat_planck_b*colco2(lay)
    1284     1105920 :          specparm_planck(lay) = colo3(lay)/speccomb_planck(lay)
    1285     1105920 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1286     1105920 :          specmult_planck(lay) = 4._r8*specparm_planck(lay)
    1287     1105920 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1288     1105920 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1289             : 
    1290     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(5) + js(lay)
    1291     1133568 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(5) + js1(lay)
    1292             :       enddo
    1293     1133568 :       do lay = laytrop+1, nlayers
    1294    18828288 :          do ig = 1, ng5
    1295    35389440 :             taug(lay,ngs4+ig) = speccomb(lay) * &
    1296    35389440 :                 (fac000(lay) * absb(ind0(lay),ig) + &
    1297    17694720 :                 fac100(lay) * absb(ind0(lay)+1,ig) + &
    1298    17694720 :                 fac010(lay) * absb(ind0(lay)+5,ig) + &
    1299    17694720 :                 fac110(lay) * absb(ind0(lay)+6,ig)) &
    1300             :                 + speccomb1(lay) * &
    1301    17694720 :                 (fac001(lay) * absb(ind1(lay),ig) + &
    1302    17694720 :                 fac101(lay) * absb(ind1(lay)+1,ig) + &
    1303    17694720 :                 fac011(lay) * absb(ind1(lay)+5,ig) + &
    1304    17694720 :                 fac111(lay) * absb(ind1(lay)+6,ig))  &
    1305   212336640 :                 + wx(1,lay) * ccl4(ig)
    1306    35389440 :             fracs(lay,ngs4+ig) = fracrefb(ig,jpl(lay)) + fpl(lay) * &
    1307    36495360 :                 (fracrefb(ig,jpl(lay)+1)-fracrefb(ig,jpl(lay)))
    1308             :          enddo
    1309             :       enddo
    1310             : 
    1311       27648 :       end subroutine taugb5
    1312             : 
    1313             : !----------------------------------------------------------------------------
    1314       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1332       55296 :       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      635904 :       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      608256 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1351      635904 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1352             :       enddo
    1353      635904 :       do lay = 1, laytrop
    1354      635904 :          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      608256 :             adjcolco2(lay) = colco2(lay)
    1359             :          endif
    1360             :       enddo
    1361      635904 :       do lay = 1, laytrop
    1362             : 
    1363      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(6) + 1
    1364      635904 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(6) + 1
    1365             :       enddo
    1366      635904 :       do lay = 1, laytrop
    1367             : 
    1368     5501952 :          do ig = 1, ng6
    1369    14598144 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    1370    19464192 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1371     9732096 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1372     9732096 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig)))
    1373     9732096 :             absco2 =  (ka_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1374     9732096 :                  (ka_mco2(indminor(lay)+1,ig) - ka_mco2(indminor(lay),ig)))
    1375     4866048 :             taug(lay,ngs5+ig) = colh2o(lay) * &
    1376     9732096 :                 (fac00(lay) * absa(ind0(lay),ig) + &
    1377     9732096 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    1378     9732096 :                  fac01(lay) * absa(ind1(lay),ig) +  &
    1379     9732096 :                  fac11(lay) * absa(ind1(lay)+1,ig))  &
    1380             :                  + tauself + taufor &
    1381             :                  + adjcolco2(lay) * absco2 &
    1382     4866048 :                  + wx(2,lay) * cfc11adj(ig) &
    1383    24330240 :                  + wx(3,lay) * cfc12(ig)
    1384     5474304 :             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     1133568 :       do lay = laytrop+1, nlayers
    1391             : 
    1392     9980928 :          do ig = 1, ng6
    1393    17694720 :             taug(lay,ngs5+ig) = 0.0_r8 &
    1394    17694720 :                  + wx(2,lay) * cfc11adj(ig) &
    1395    26542080 :                  + wx(3,lay) * cfc12(ig)
    1396     9953280 :             fracs(lay,ngs5+ig) = fracrefa(ig)
    1397             :          enddo
    1398             :       enddo
    1399             : 
    1400       27648 :       end subroutine taugb6
    1401             : 
    1402             : !----------------------------------------------------------------------------
    1403       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1421       55296 :       integer, dimension(nlayers) :: js, js1, jmco2, jpl
    1422       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    1423       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    1424       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_mco2, specparm_mco2, specmult_mco2, fmco2
    1425       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    1426             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    1427       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    1428       55296 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    1429             :       real(kind=r8) :: tauself, taufor, co2m1, co2m2, absco2
    1430       55296 :       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       27648 :       refrat_planck_a = chi_mls(1,3)/chi_mls(3,3)
    1444             : 
    1445             : ! P = 706.2720 mb
    1446       27648 :       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      635904 :       do lay = 1, laytrop
    1455             : 
    1456      608256 :          speccomb(lay) = colh2o(lay) + rat_h2oo3(lay)*colo3(lay)
    1457      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    1458      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1459      608256 :          specmult(lay) = 8._r8*(specparm(lay))
    1460      608256 :          js(lay) = 1 + int(specmult(lay))
    1461      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1462             : 
    1463      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2oo3_1(lay)*colo3(lay)
    1464      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    1465      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1466      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
    1467      608256 :          js1(lay) = 1 + int(specmult1(lay))
    1468      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1469             : 
    1470      608256 :          speccomb_mco2(lay) = colh2o(lay) + refrat_m_a*colo3(lay)
    1471      608256 :          specparm_mco2(lay) = colh2o(lay)/speccomb_mco2(lay)
    1472      608256 :          if (specparm_mco2(lay) .ge. oneminus) specparm_mco2(lay) = oneminus
    1473      608256 :          specmult_mco2(lay) = 8._r8*specparm_mco2(lay)
    1474             : 
    1475      608256 :          jmco2(lay) = 1 + int(specmult_mco2(lay))
    1476      608256 :          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      608256 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1482      608256 :          ratco2(lay) = 1.e20*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1483      608256 :          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      608256 :             adjcolco2(lay) = colco2(lay)
    1488             :          endif
    1489             : 
    1490      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colo3(lay)
    1491      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    1492      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1493      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    1494      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1495      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1496             : 
    1497      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(7) + js(lay)
    1498      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(7) + js1(lay)
    1499             : 
    1500      608256 :          if (specparm(lay) .lt. 0.125_r8) then
    1501      117260 :             p = fs(lay) - 1
    1502      117260 :             p4 = p**4
    1503      117260 :             fk0 = p4
    1504      117260 :             fk1 = 1 - p - 2.0_r8*p4
    1505      117260 :             fk2 = p + p4
    1506      117260 :             fac000(lay) = fk0*fac00(lay)
    1507      117260 :             fac100(lay) = fk1*fac00(lay)
    1508      117260 :             fac200(lay) = fk2*fac00(lay)
    1509      117260 :             fac010(lay) = fk0*fac10(lay)
    1510      117260 :             fac110(lay) = fk1*fac10(lay)
    1511      117260 :             fac210(lay) = fk2*fac10(lay)
    1512      490996 :          else if (specparm(lay) .gt. 0.875_r8) then
    1513       45067 :             p = -fs(lay) 
    1514       45067 :             p4 = p**4
    1515       45067 :             fk0 = p4
    1516       45067 :             fk1 = 1 - p - 2.0_r8*p4
    1517       45067 :             fk2 = p + p4
    1518       45067 :             fac000(lay) = fk0*fac00(lay)
    1519       45067 :             fac100(lay) = fk1*fac00(lay)
    1520       45067 :             fac200(lay) = fk2*fac00(lay)
    1521       45067 :             fac010(lay) = fk0*fac10(lay)
    1522       45067 :             fac110(lay) = fk1*fac10(lay)
    1523       45067 :             fac210(lay) = fk2*fac10(lay)
    1524             :          else
    1525      445929 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1526      445929 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1527      445929 :             fac100(lay) = fs(lay) * fac00(lay)
    1528      445929 :             fac110(lay) = fs(lay) * fac10(lay)
    1529             :          endif
    1530      608256 :          if (specparm(lay) .lt. 0.125_r8) then
    1531      117260 :             p = fs1(lay) - 1
    1532      117260 :             p4 = p**4
    1533      117260 :             fk0 = p4
    1534      117260 :             fk1 = 1 - p - 2.0_r8*p4
    1535      117260 :             fk2 = p + p4
    1536      117260 :             fac001(lay) = fk0*fac01(lay)
    1537      117260 :             fac101(lay) = fk1*fac01(lay)
    1538      117260 :             fac201(lay) = fk2*fac01(lay)
    1539      117260 :             fac011(lay) = fk0*fac11(lay)
    1540      117260 :             fac111(lay) = fk1*fac11(lay)
    1541      117260 :             fac211(lay) = fk2*fac11(lay)
    1542      490996 :          else if (specparm1(lay) .gt. 0.875_r8) then
    1543      112192 :             p = -fs1(lay) 
    1544      112192 :             p4 = p**4
    1545      112192 :             fk0 = p4
    1546      112192 :             fk1 = 1 - p - 2.0_r8*p4
    1547      112192 :             fk2 = p + p4
    1548      112192 :             fac001(lay) = fk0*fac01(lay)
    1549      112192 :             fac101(lay) = fk1*fac01(lay)
    1550      112192 :             fac201(lay) = fk2*fac01(lay)
    1551      112192 :             fac011(lay) = fk0*fac11(lay)
    1552      112192 :             fac111(lay) = fk1*fac11(lay)
    1553      112192 :             fac211(lay) = fk2*fac11(lay)
    1554             :          else
    1555      378804 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1556      378804 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1557      378804 :             fac101(lay) = fs1(lay) * fac01(lay)
    1558      378804 :             fac111(lay) = fs1(lay) * fac11(lay)
    1559             :          endif
    1560             : 
    1561     7934976 :          do ig = 1, ng7
    1562    21897216 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    1563    21897216 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1564    14598144 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1565    14598144 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    1566    21897216 :             co2m1 = ka_mco2(jmco2(lay),indminor(lay),ig) + fmco2(lay) * &
    1567    21897216 :                  (ka_mco2(jmco2(lay)+1,indminor(lay),ig) - ka_mco2(jmco2(lay),indminor(lay),ig))
    1568     7299072 :             co2m2 = ka_mco2(jmco2(lay),indminor(lay)+1,ig) + fmco2(lay) * &
    1569     7299072 :                  (ka_mco2(jmco2(lay)+1,indminor(lay)+1,ig) - ka_mco2(jmco2(lay),indminor(lay)+1,ig))
    1570     7299072 :             absco2 = co2m1 + minorfrac(lay) * (co2m2 - co2m1)
    1571             : 
    1572     7299072 :             if (specparm(lay) .lt. 0.125_r8) then
    1573             :                tau_major = speccomb(lay) * &
    1574     1407120 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1575     1407120 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1576     1407120 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    1577     1407120 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1578     1407120 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    1579     8442720 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    1580     5891952 :             else if (specparm(lay) .gt. 0.875_r8) then
    1581             :                tau_major = speccomb(lay) * &
    1582      540804 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    1583      540804 :                     fac100(lay) * absa(ind0(lay),ig) + &
    1584      540804 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    1585      540804 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    1586      540804 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    1587     3244824 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    1588             :             else
    1589             :                tau_major = speccomb(lay) * &
    1590     5351148 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1591     5351148 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1592     5351148 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1593    21404592 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    1594             :             endif
    1595             : 
    1596     7299072 :             if (specparm1(lay) .lt. 0.125_r8) then
    1597             :                tau_major1 = speccomb1(lay) * &
    1598      665232 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    1599      665232 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1600      665232 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    1601      665232 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1602      665232 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    1603     3991392 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    1604     6633840 :             else if (specparm1(lay) .gt. 0.875_r8) then
    1605             :                tau_major1 = speccomb1(lay) * &
    1606     1346304 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    1607     1346304 :                     fac101(lay) * absa(ind1(lay),ig) + &
    1608     1346304 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    1609     1346304 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    1610     1346304 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    1611     8077824 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    1612             :             else
    1613             :                tau_major1 = speccomb1(lay) * &
    1614     5287536 :                     (fac001(lay) * absa(ind1(lay),ig) +  &
    1615     5287536 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1616     5287536 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1617    21150144 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    1618             :             endif
    1619             : 
    1620     7299072 :             taug(lay,ngs6+ig) = tau_major + tau_major1 &
    1621             :                  + tauself + taufor &
    1622     7299072 :                  + adjcolco2(lay)*absco2
    1623    14598144 :             fracs(lay,ngs6+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    1624    15206400 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    1625             :          enddo
    1626             :       enddo
    1627             : 
    1628             : ! Upper atmosphere loop
    1629     1133568 :       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     1105920 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1635     1105920 :          ratco2(lay) = 1.e20*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1636     1105920 :          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     1105920 :             adjcolco2(lay) = colco2(lay)
    1641             :          endif
    1642             : 
    1643     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(7) + 1
    1644     1105920 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(7) + 1
    1645             : 
    1646    14376960 :          do ig = 1, ng7
    1647    26542080 :             absco2 = kb_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1648    39813120 :                  (kb_mco2(indminor(lay)+1,ig) - kb_mco2(indminor(lay),ig))
    1649    13271040 :             taug(lay,ngs6+ig) = colo3(lay) * &
    1650    26542080 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    1651    26542080 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    1652    26542080 :                  fac01(lay) * absb(ind1(lay),ig) + &
    1653    26542080 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    1654    66355200 :                  + adjcolco2(lay) * absco2
    1655    14376960 :             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     1105920 :          taug(lay,ngs6+6)=taug(lay,ngs6+6)*0.92_r8
    1662     1105920 :          taug(lay,ngs6+7)=taug(lay,ngs6+7)*0.88_r8
    1663     1105920 :          taug(lay,ngs6+8)=taug(lay,ngs6+8)*1.07_r8
    1664     1105920 :          taug(lay,ngs6+9)=taug(lay,ngs6+9)*1.1_r8
    1665     1105920 :          taug(lay,ngs6+10)=taug(lay,ngs6+10)*0.99_r8
    1666     1133568 :          taug(lay,ngs6+11)=taug(lay,ngs6+11)*0.855_r8
    1667             : 
    1668             :       enddo
    1669             : 
    1670       27648 :       end subroutine taugb7
    1671             : 
    1672             : !----------------------------------------------------------------------------
    1673       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1692             :       real(kind=r8) :: tauself, taufor, absco2, abso3, absn2o
    1693       55296 :       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      635904 :       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      608256 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    1716      608256 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1717      608256 :          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      608256 :             adjcolco2(lay) = colco2(lay)
    1722             :          endif
    1723             : 
    1724      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(8) + 1
    1725      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(8) + 1
    1726             : 
    1727     5501952 :          do ig = 1, ng8
    1728    14598144 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    1729    14598144 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1730     9732096 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1731     9732096 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig)))
    1732     9732096 :             absco2 =  (ka_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1733     9732096 :                  (ka_mco2(indminor(lay)+1,ig) - ka_mco2(indminor(lay),ig)))
    1734             :             abso3 =  (ka_mo3(indminor(lay),ig) + minorfrac(lay) * &
    1735     4866048 :                  (ka_mo3(indminor(lay)+1,ig) - ka_mo3(indminor(lay),ig)))
    1736             :             absn2o =  (ka_mn2o(indminor(lay),ig) + minorfrac(lay) * &
    1737     4866048 :                  (ka_mn2o(indminor(lay)+1,ig) - ka_mn2o(indminor(lay),ig)))
    1738     4866048 :             taug(lay,ngs7+ig) = colh2o(lay) * &
    1739     9732096 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    1740     9732096 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    1741     9732096 :                  fac01(lay) * absa(ind1(lay),ig) +  &
    1742     9732096 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
    1743             :                  + tauself + taufor &
    1744             :                  + adjcolco2(lay)*absco2 &
    1745     4866048 :                  + colo3(lay) * abso3 &
    1746     4866048 :                  + coln2o(lay) * absn2o &
    1747     4866048 :                  + wx(3,lay) * cfc12(ig) &
    1748    24330240 :                  + wx(4,lay) * cfc22adj(ig)
    1749     5474304 :             fracs(lay,ngs7+ig) = fracrefa(ig)
    1750             :          enddo
    1751             :       enddo
    1752             : 
    1753             : ! Upper atmosphere loop
    1754     1133568 :       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     1105920 :          chi_co2(lay) = colco2(lay)/coldry(lay)
    1760     1105920 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/chi_mls(2,jp(lay)+1)
    1761     1105920 :          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     1105920 :             adjcolco2(lay) = colco2(lay)
    1766             :          endif
    1767             : 
    1768     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(8) + 1
    1769     1105920 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(8) + 1
    1770             : 
    1771     9980928 :          do ig = 1, ng8
    1772    17694720 :             absco2 =  (kb_mco2(indminor(lay),ig) + minorfrac(lay) * &
    1773    26542080 :                  (kb_mco2(indminor(lay)+1,ig) - kb_mco2(indminor(lay),ig)))
    1774             :             absn2o =  (kb_mn2o(indminor(lay),ig) + minorfrac(lay) * &
    1775     8847360 :                  (kb_mn2o(indminor(lay)+1,ig) - kb_mn2o(indminor(lay),ig)))
    1776     8847360 :             taug(lay,ngs7+ig) = colo3(lay) * &
    1777    17694720 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    1778    17694720 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    1779    17694720 :                  fac01(lay) * absb(ind1(lay),ig) + &
    1780    17694720 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    1781             :                  + adjcolco2(lay)*absco2 &
    1782     8847360 :                  + coln2o(lay)*absn2o & 
    1783     8847360 :                  + wx(3,lay) * cfc12(ig) &
    1784    44236800 :                  + wx(4,lay) * cfc22adj(ig)
    1785     9953280 :             fracs(lay,ngs7+ig) = fracrefb(ig)
    1786             :          enddo
    1787             :       enddo
    1788             : 
    1789       27648 :       end subroutine taugb8
    1790             : 
    1791             : !----------------------------------------------------------------------------
    1792       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    1810       55296 :       integer, dimension(nlayers) :: js, js1, jmn2o, jpl
    1811       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    1812       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    1813       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_mn2o, specparm_mn2o, specmult_mn2o, fmn2o
    1814       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    1815             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    1816       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    1817       55296 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    1818             :       real(kind=r8) :: tauself, taufor, n2om1, n2om2, absn2o
    1819       55296 :       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       27648 :       refrat_planck_a = chi_mls(1,9)/chi_mls(6,9)
    1833             : 
    1834             : ! P = 706.272 mb 
    1835       27648 :       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      635904 :       do lay = 1, laytrop
    1844             : 
    1845      608256 :          speccomb(lay) = colh2o(lay) + rat_h2och4(lay)*colch4(lay)
    1846      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    1847      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    1848      608256 :          specmult(lay) = 8._r8*(specparm(lay))
    1849      608256 :          js(lay) = 1 + int(specmult(lay))
    1850      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
    1851             : 
    1852      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2och4_1(lay)*colch4(lay)
    1853      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    1854      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    1855      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
    1856      608256 :          js1(lay) = 1 + int(specmult1(lay))
    1857      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    1858             : 
    1859      608256 :          speccomb_mn2o(lay) = colh2o(lay) + refrat_m_a*colch4(lay)
    1860      608256 :          specparm_mn2o(lay) = colh2o(lay)/speccomb_mn2o(lay)
    1861      608256 :          if (specparm_mn2o(lay) .ge. oneminus) specparm_mn2o(lay) = oneminus
    1862      608256 :          specmult_mn2o(lay) = 8._r8*specparm_mn2o(lay)
    1863      608256 :          jmn2o(lay) = 1 + int(specmult_mn2o(lay))
    1864      608256 :          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      608256 :          chi_n2o(lay) = coln2o(lay)/(coldry(lay))
    1870      608256 :          ratn2o(lay) = 1.e20_r8*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
    1871      608256 :          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      608256 :             adjcoln2o(lay) = coln2o(lay)
    1876             :          endif
    1877             : 
    1878      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colch4(lay)
    1879      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    1880      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    1881      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    1882      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
    1883      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    1884             : 
    1885      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(9) + js(lay)
    1886      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(9) + js1(lay)
    1887             : 
    1888      608256 :          if (specparm(lay) .lt. 0.125_r8) then
    1889      155221 :             p = fs(lay) - 1
    1890      155221 :             p4 = p**4
    1891      155221 :             fk0 = p4
    1892      155221 :             fk1 = 1 - p - 2.0_r8*p4
    1893      155221 :             fk2 = p + p4
    1894      155221 :             fac000(lay) = fk0*fac00(lay)
    1895      155221 :             fac100(lay) = fk1*fac00(lay)
    1896      155221 :             fac200(lay) = fk2*fac00(lay)
    1897      155221 :             fac010(lay) = fk0*fac10(lay)
    1898      155221 :             fac110(lay) = fk1*fac10(lay)
    1899      155221 :             fac210(lay) = fk2*fac10(lay)
    1900      453035 :          else if (specparm(lay) .gt. 0.875_r8) then
    1901          45 :             p = -fs(lay) 
    1902          45 :             p4 = p**4
    1903          45 :             fk0 = p4
    1904          45 :             fk1 = 1 - p - 2.0_r8*p4
    1905          45 :             fk2 = p + p4
    1906          45 :             fac000(lay) = fk0*fac00(lay)
    1907          45 :             fac100(lay) = fk1*fac00(lay)
    1908          45 :             fac200(lay) = fk2*fac00(lay)
    1909          45 :             fac010(lay) = fk0*fac10(lay)
    1910          45 :             fac110(lay) = fk1*fac10(lay)
    1911          45 :             fac210(lay) = fk2*fac10(lay)
    1912             :          else
    1913      452990 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    1914      452990 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    1915      452990 :             fac100(lay) = fs(lay) * fac00(lay)
    1916      452990 :             fac110(lay) = fs(lay) * fac10(lay)
    1917             :          endif
    1918             : 
    1919      608256 :          if (specparm1(lay) .lt. 0.125_r8) then
    1920       77388 :             p = fs1(lay) - 1
    1921       77388 :             p4 = p**4
    1922       77388 :             fk0 = p4
    1923       77388 :             fk1 = 1 - p - 2.0_r8*p4
    1924       77388 :             fk2 = p + p4
    1925       77388 :             fac001(lay) = fk0*fac01(lay)
    1926       77388 :             fac101(lay) = fk1*fac01(lay)
    1927       77388 :             fac201(lay) = fk2*fac01(lay)
    1928       77388 :             fac011(lay) = fk0*fac11(lay)
    1929       77388 :             fac111(lay) = fk1*fac11(lay)
    1930       77388 :             fac211(lay) = fk2*fac11(lay)
    1931      530868 :          else if (specparm1(lay) .gt. 0.875_r8) then
    1932        4635 :             p = -fs1(lay) 
    1933        4635 :             p4 = p**4
    1934        4635 :             fk0 = p4
    1935        4635 :             fk1 = 1 - p - 2.0_r8*p4
    1936        4635 :             fk2 = p + p4
    1937        4635 :             fac001(lay) = fk0*fac01(lay)
    1938        4635 :             fac101(lay) = fk1*fac01(lay)
    1939        4635 :             fac201(lay) = fk2*fac01(lay)
    1940        4635 :             fac011(lay) = fk0*fac11(lay)
    1941        4635 :             fac111(lay) = fk1*fac11(lay)
    1942        4635 :             fac211(lay) = fk2*fac11(lay)
    1943             :          else
    1944      526233 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    1945      526233 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    1946      526233 :             fac101(lay) = fs1(lay) * fac01(lay)
    1947      526233 :             fac111(lay) = fs1(lay) * fac11(lay)
    1948             :          endif
    1949             : 
    1950     7934976 :          do ig = 1, ng9
    1951    21897216 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    1952    21897216 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    1953    14598144 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    1954    14598144 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    1955    21897216 :             n2om1 = ka_mn2o(jmn2o(lay),indminor(lay),ig) + fmn2o(lay) * &
    1956    21897216 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay),ig) - ka_mn2o(jmn2o(lay),indminor(lay),ig))
    1957     7299072 :             n2om2 = ka_mn2o(jmn2o(lay),indminor(lay)+1,ig) + fmn2o(lay) * &
    1958     7299072 :                  (ka_mn2o(jmn2o(lay)+1,indminor(lay)+1,ig) - ka_mn2o(jmn2o(lay),indminor(lay)+1,ig))
    1959     7299072 :             absn2o = n2om1 + minorfrac(lay) * (n2om2 - n2om1)
    1960             : 
    1961     7299072 :             if (specparm(lay) .lt. 0.125_r8) then
    1962             :                tau_major = speccomb(lay) * &
    1963     1862652 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1964     1862652 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1965     1862652 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    1966     1862652 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1967     1862652 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    1968    11175912 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    1969     5436420 :             else if (specparm(lay) .gt. 0.875_r8) then
    1970             :                tau_major = speccomb(lay) * &
    1971         540 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    1972         540 :                     fac100(lay) * absa(ind0(lay),ig) + &
    1973         540 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    1974         540 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    1975         540 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    1976        3240 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    1977             :             else
    1978             :                tau_major = speccomb(lay) * &
    1979     5435880 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    1980     5435880 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    1981     5435880 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    1982    21743520 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    1983             :             endif
    1984             : 
    1985     7299072 :             if (specparm1(lay) .lt. 0.125_r8) then
    1986             :                tau_major1 = speccomb1(lay) * &
    1987      928656 :                     (fac001(lay) * absa(ind1(lay),ig) + & 
    1988      928656 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    1989      928656 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    1990      928656 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    1991      928656 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    1992     5571936 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    1993     6370416 :             else if (specparm1(lay) .gt. 0.875_r8) then
    1994             :                tau_major1 = speccomb1(lay) * &
    1995       55620 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    1996       55620 :                     fac101(lay) * absa(ind1(lay),ig) + &
    1997       55620 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    1998       55620 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    1999       55620 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    2000      333720 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    2001             :             else
    2002             :                tau_major1 = speccomb1(lay) * &
    2003     6314796 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2004     6314796 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2005     6314796 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2006    25259184 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2007             :             endif
    2008             : 
    2009     7299072 :             taug(lay,ngs8+ig) = tau_major + tau_major1 &
    2010             :                  + tauself + taufor &
    2011     7299072 :                  + adjcoln2o(lay)*absn2o
    2012    14598144 :             fracs(lay,ngs8+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2013    15206400 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2014             :          enddo
    2015             :       enddo
    2016             : 
    2017             : ! Upper atmosphere loop
    2018     1133568 :       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     1105920 :          chi_n2o(lay) = coln2o(lay)/(coldry(lay))
    2024     1105920 :          ratn2o(lay) = 1.e20_r8*chi_n2o(lay)/chi_mls(4,jp(lay)+1)
    2025     1105920 :          if (ratn2o(lay) .gt. 1.5_r8) then
    2026      268634 :             adjfac(lay) = 0.5_r8+(ratn2o(lay)-0.5_r8)**0.65_r8
    2027      268634 :             adjcoln2o(lay) = adjfac(lay)*chi_mls(4,jp(lay)+1)*coldry(lay)*1.e-20_r8
    2028             :          else
    2029      837286 :             adjcoln2o(lay) = coln2o(lay)
    2030             :          endif
    2031             : 
    2032     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(9) + 1
    2033     1105920 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(9) + 1
    2034             : 
    2035    14404608 :          do ig = 1, ng9
    2036    26542080 :             absn2o = kb_mn2o(indminor(lay),ig) + minorfrac(lay) * &
    2037    39813120 :                 (kb_mn2o(indminor(lay)+1,ig) - kb_mn2o(indminor(lay),ig))
    2038    13271040 :             taug(lay,ngs8+ig) = colch4(lay) * &
    2039    26542080 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2040    26542080 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2041    26542080 :                  fac01(lay) * absb(ind1(lay),ig) +  &
    2042    26542080 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    2043    66355200 :                  + adjcoln2o(lay)*absn2o
    2044    14376960 :             fracs(lay,ngs8+ig) = fracrefb(ig)
    2045             :          enddo
    2046             :       enddo
    2047             : 
    2048       27648 :       end subroutine taugb9
    2049             : 
    2050             : !----------------------------------------------------------------------------
    2051       27648 :       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       55296 :       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      635904 :       do lay = 1, laytrop
    2076      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(10) + 1
    2077      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(10) + 1
    2078             : 
    2079     4285440 :          do ig = 1, ng10
    2080    10948608 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    2081    10948608 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2082     7299072 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2083     7299072 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2084     3649536 :             taug(lay,ngs9+ig) = colh2o(lay) * &
    2085     7299072 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    2086     7299072 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    2087     7299072 :                  fac01(lay) * absa(ind1(lay),ig) + &
    2088     7299072 :                  fac11(lay) * absa(ind1(lay)+1,ig))  &
    2089    18247680 :                  + tauself + taufor
    2090     4257792 :             fracs(lay,ngs9+ig) = fracrefa(ig)
    2091             :          enddo
    2092             :       enddo
    2093             : 
    2094             : ! Upper atmosphere loop
    2095     1133568 :       do lay = laytrop+1, nlayers
    2096     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(10) + 1
    2097     1105920 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(10) + 1
    2098             : 
    2099     7769088 :          do ig = 1, ng10
    2100    19906560 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2101    19906560 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2102     6635520 :             taug(lay,ngs9+ig) = colh2o(lay) * &
    2103    13271040 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2104    13271040 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2105    13271040 :                  fac01(lay) * absb(ind1(lay),ig) +  &
    2106    13271040 :                  fac11(lay) * absb(ind1(lay)+1,ig)) &
    2107    33177600 :                  + taufor
    2108     7741440 :             fracs(lay,ngs9+ig) = fracrefb(ig)
    2109             :          enddo
    2110             :       enddo
    2111             : 
    2112       27648 :       end subroutine taugb10
    2113             : 
    2114             : !----------------------------------------------------------------------------
    2115       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2132       55296 :       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      635904 :       do lay = 1, laytrop
    2145      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(11) + 1
    2146      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(11) + 1
    2147      608256 :          scaleo2(lay) = colo2(lay)*scaleminor(lay)
    2148     5501952 :          do ig = 1, ng11
    2149    14598144 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    2150    14598144 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2151     9732096 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2152     9732096 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig)))
    2153     9732096 :             tauo2 =  scaleo2(lay) * (ka_mo2(indminor(lay),ig) + minorfrac(lay) * &
    2154     9732096 :                  (ka_mo2(indminor(lay)+1,ig) - ka_mo2(indminor(lay),ig)))
    2155     4866048 :             taug(lay,ngs10+ig) = colh2o(lay) * &
    2156     9732096 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    2157     9732096 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    2158     9732096 :                  fac01(lay) * absa(ind1(lay),ig) + &
    2159     9732096 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
    2160             :                  + tauself + taufor &
    2161    24330240 :                  + tauo2
    2162     5474304 :             fracs(lay,ngs10+ig) = fracrefa(ig)
    2163             :          enddo
    2164             :       enddo
    2165             : 
    2166             : ! Upper atmosphere loop
    2167     1133568 :       do lay = laytrop+1, nlayers
    2168     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(11) + 1
    2169     1105920 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(11) + 1
    2170     1105920 :          scaleo2(lay) = colo2(lay)*scaleminor(lay)
    2171     9980928 :          do ig = 1, ng11
    2172    26542080 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2173    26542080 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2174    17694720 :             tauo2 =  scaleo2(lay) * (kb_mo2(indminor(lay),ig) + minorfrac(lay) * &
    2175    17694720 :                  (kb_mo2(indminor(lay)+1,ig) - kb_mo2(indminor(lay),ig)))
    2176     8847360 :             taug(lay,ngs10+ig) = colh2o(lay) * &
    2177    17694720 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2178    17694720 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2179    17694720 :                  fac01(lay) * absb(ind1(lay),ig) + &
    2180    17694720 :                  fac11(lay) * absb(ind1(lay)+1,ig))  &
    2181             :                  + taufor &
    2182    44236800 :                  + tauo2
    2183     9953280 :             fracs(lay,ngs10+ig) = fracrefb(ig)
    2184             :          enddo
    2185             :       enddo
    2186             : 
    2187       27648 :       end subroutine taugb11
    2188             : 
    2189             : !----------------------------------------------------------------------------
    2190       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2207       55296 :       integer, dimension(nlayers) :: js, js1, jpl
    2208       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2209       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2210       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2211             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2212       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2213       55296 :       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       27648 :       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      635904 :       do lay = 1, laytrop
    2232             : 
    2233      608256 :          speccomb(lay) = colh2o(lay) + rat_h2oco2(lay)*colco2(lay)
    2234      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    2235      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2236      608256 :          specmult(lay) = 8._r8*(specparm(lay))
    2237      608256 :          js(lay) = 1 + int(specmult(lay))
    2238      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2239             : 
    2240      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2oco2_1(lay)*colco2(lay)
    2241      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    2242      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    2243      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
    2244      608256 :          js1(lay) = 1 + int(specmult1(lay))
    2245      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    2246             : 
    2247      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colco2(lay)
    2248      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    2249      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    2250      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    2251      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
    2252      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    2253             : 
    2254      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(12) + js(lay)
    2255      635904 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(12) + js1(lay)
    2256             :       enddo
    2257      635904 :       do lay = 1, laytrop
    2258      635904 :          if (specparm(lay) .lt. 0.125_r8) then
    2259      157862 :             p = fs(lay) - 1
    2260      157862 :             p4 = p**4
    2261      157862 :             fk0 = p4
    2262      157862 :             fk1 = 1 - p - 2.0_r8*p4
    2263      157862 :             fk2 = p + p4
    2264      157862 :             fac000(lay) = fk0*fac00(lay)
    2265      157862 :             fac100(lay) = fk1*fac00(lay)
    2266      157862 :             fac200(lay) = fk2*fac00(lay)
    2267      157862 :             fac010(lay) = fk0*fac10(lay)
    2268      157862 :             fac110(lay) = fk1*fac10(lay)
    2269      157862 :             fac210(lay) = fk2*fac10(lay)
    2270      450394 :          else if (specparm(lay) .gt. 0.875_r8) then
    2271          51 :             p = -fs(lay) 
    2272          51 :             p4 = p**4
    2273          51 :             fk0 = p4
    2274          51 :             fk1 = 1 - p - 2.0_r8*p4
    2275          51 :             fk2 = p + p4
    2276          51 :             fac000(lay) = fk0*fac00(lay)
    2277          51 :             fac100(lay) = fk1*fac00(lay)
    2278          51 :             fac200(lay) = fk2*fac00(lay)
    2279          51 :             fac010(lay) = fk0*fac10(lay)
    2280          51 :             fac110(lay) = fk1*fac10(lay)
    2281          51 :             fac210(lay) = fk2*fac10(lay)
    2282             :          else
    2283      450343 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    2284      450343 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    2285      450343 :             fac100(lay) = fs(lay) * fac00(lay)
    2286      450343 :             fac110(lay) = fs(lay) * fac10(lay)
    2287             :          endif
    2288             : 
    2289             :       enddo
    2290      635904 :       do lay = 1, laytrop
    2291      635904 :          if (specparm1(lay) .lt. 0.125_r8) then
    2292       76952 :             p = fs1(lay) - 1
    2293       76952 :             p4 = p**4
    2294       76952 :             fk0 = p4
    2295       76952 :             fk1 = 1 - p - 2.0_r8*p4
    2296       76952 :             fk2 = p + p4
    2297       76952 :             fac001(lay) = fk0*fac01(lay)
    2298       76952 :             fac101(lay) = fk1*fac01(lay)
    2299       76952 :             fac201(lay) = fk2*fac01(lay)
    2300       76952 :             fac011(lay) = fk0*fac11(lay)
    2301       76952 :             fac111(lay) = fk1*fac11(lay)
    2302       76952 :             fac211(lay) = fk2*fac11(lay)
    2303      531304 :          else if (specparm1(lay) .gt. 0.875_r8) then
    2304        5417 :             p = -fs1(lay) 
    2305        5417 :             p4 = p**4
    2306        5417 :             fk0 = p4
    2307        5417 :             fk1 = 1 - p - 2.0_r8*p4
    2308        5417 :             fk2 = p + p4
    2309        5417 :             fac001(lay) = fk0*fac01(lay)
    2310        5417 :             fac101(lay) = fk1*fac01(lay)
    2311        5417 :             fac201(lay) = fk2*fac01(lay)
    2312        5417 :             fac011(lay) = fk0*fac11(lay)
    2313        5417 :             fac111(lay) = fk1*fac11(lay)
    2314        5417 :             fac211(lay) = fk2*fac11(lay)
    2315             :          else
    2316      525887 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    2317      525887 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    2318      525887 :             fac101(lay) = fs1(lay) * fac01(lay)
    2319      525887 :             fac111(lay) = fs1(lay) * fac11(lay)
    2320             :          endif
    2321             :       enddo
    2322      635904 :       do lay = 1, laytrop
    2323             : 
    2324     5501952 :          do ig = 1, ng12
    2325    14598144 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    2326    19464192 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2327     9732096 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2328     9732096 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2329             : 
    2330     4866048 :             if (specparm(lay) .lt. 0.125_r8) then
    2331             :                tau_major = speccomb(lay) * &
    2332     1262896 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2333     1262896 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2334     1262896 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    2335     1262896 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2336     1262896 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    2337     7577376 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    2338     3603152 :             else if (specparm(lay) .gt. 0.875_r8) then
    2339             :                tau_major = speccomb(lay) * &
    2340         408 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    2341         408 :                     fac100(lay) * absa(ind0(lay),ig) + &
    2342         408 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    2343         408 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    2344         408 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    2345        2448 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    2346             :             else
    2347             :                tau_major = speccomb(lay) * &
    2348     3602744 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2349     3602744 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2350     3602744 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2351    14410976 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    2352             :             endif
    2353             : 
    2354     4866048 :             if (specparm1(lay) .lt. 0.125_r8) then
    2355             :                tau_major1 = speccomb1(lay) * &
    2356      615616 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2357      615616 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2358      615616 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    2359      615616 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2360      615616 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    2361     3693696 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    2362     4250432 :             else if (specparm1(lay) .gt. 0.875_r8) then
    2363             :                tau_major1 = speccomb1(lay) * &
    2364       43336 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    2365       43336 :                     fac101(lay) * absa(ind1(lay),ig) + &
    2366       43336 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    2367       43336 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    2368       43336 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    2369      260016 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    2370             :             else
    2371             :                tau_major1 = speccomb1(lay) * &
    2372     4207096 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2373     4207096 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2374     4207096 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2375    16828384 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2376             :             endif
    2377             : 
    2378     4866048 :             taug(lay,ngs11+ig) = tau_major + tau_major1 &
    2379     4866048 :                  + tauself + taufor
    2380     9732096 :             fracs(lay,ngs11+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2381    10340352 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2382             :          enddo
    2383             :       enddo
    2384             : 
    2385             : ! Upper atmosphere loop
    2386     1133568 :       do lay = laytrop+1, nlayers
    2387     9980928 :          do ig = 1, ng12
    2388     8847360 :             taug(lay,ngs11+ig) = 0.0_r8
    2389     9953280 :             fracs(lay,ngs11+ig) = 0.0_r8
    2390             :          enddo
    2391             :       enddo
    2392             : 
    2393       27648 :       end subroutine taugb12
    2394             : 
    2395             : !----------------------------------------------------------------------------
    2396       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2413       55296 :       integer, dimension(nlayers) :: js, js1, jmco2, jmco, jpl
    2414       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2415       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2416       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_mco2, specparm_mco2, specmult_mco2, fmco2
    2417       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_mco, specparm_mco, specmult_mco, fmco
    2418       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2419             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2420       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2421       55296 :       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       55296 :       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       27648 :       refrat_planck_a = chi_mls(1,5)/chi_mls(4,5)
    2439             : 
    2440             : ! P = 1053. (Level 1)
    2441       27648 :       refrat_m_a = chi_mls(1,1)/chi_mls(4,1)
    2442             : 
    2443             : ! P = 706. (Level 3)
    2444       27648 :       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      635904 :       do lay = 1, laytrop
    2453             : 
    2454      608256 :          speccomb(lay) = colh2o(lay) + rat_h2on2o(lay)*coln2o(lay)
    2455      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    2456      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2457      608256 :          specmult(lay) = 8._r8*(specparm(lay))
    2458      608256 :          js(lay) = 1 + int(specmult(lay))
    2459      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2460             : 
    2461      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2on2o_1(lay)*coln2o(lay)
    2462      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    2463      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    2464      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
    2465      608256 :          js1(lay) = 1 + int(specmult1(lay))
    2466      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    2467             : 
    2468      608256 :          speccomb_mco2(lay) = colh2o(lay) + refrat_m_a*coln2o(lay)
    2469      608256 :          specparm_mco2(lay) = colh2o(lay)/speccomb_mco2(lay)
    2470      608256 :          if (specparm_mco2(lay) .ge. oneminus) specparm_mco2(lay) = oneminus
    2471      608256 :          specmult_mco2(lay) = 8._r8*specparm_mco2(lay)
    2472      608256 :          jmco2(lay) = 1 + int(specmult_mco2(lay))
    2473      608256 :          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      608256 :          chi_co2(lay) = colco2(lay)/(coldry(lay))
    2479      635904 :          ratco2(lay) = 1.e20_r8*chi_co2(lay)/3.55e-4_r8
    2480             :       enddo
    2481      635904 :       do lay = 1, laytrop
    2482      635904 :          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      608256 :             adjcolco2(lay) = colco2(lay)
    2487             :          endif
    2488             : 
    2489             :       enddo
    2490      635904 :       do lay = 1, laytrop
    2491      608256 :          speccomb_mco(lay) = colh2o(lay) + refrat_m_a3*coln2o(lay)
    2492      608256 :          specparm_mco(lay) = colh2o(lay)/speccomb_mco(lay)
    2493      608256 :          if (specparm_mco(lay) .ge. oneminus) specparm_mco(lay) = oneminus
    2494      608256 :          specmult_mco(lay) = 8._r8*specparm_mco(lay)
    2495      608256 :          jmco(lay) = 1 + int(specmult_mco(lay))
    2496      608256 :          fmco(lay) = mod(specmult_mco(lay),1.0_r8)
    2497             : 
    2498      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*coln2o(lay)
    2499      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    2500      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    2501      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    2502      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
    2503      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    2504             : 
    2505      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(13) + js(lay)
    2506      635904 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(13) + js1(lay)
    2507             :       enddo
    2508      635904 :       do lay = 1, laytrop
    2509             : 
    2510      635904 :          if (specparm(lay) .lt. 0.125_r8) then
    2511      157720 :             p = fs(lay) - 1
    2512      157720 :             p4 = p**4
    2513      157720 :             fk0 = p4
    2514      157720 :             fk1 = 1 - p - 2.0_r8*p4
    2515      157720 :             fk2 = p + p4
    2516      157720 :             fac000(lay) = fk0*fac00(lay)
    2517      157720 :             fac100(lay) = fk1*fac00(lay)
    2518      157720 :             fac200(lay) = fk2*fac00(lay)
    2519      157720 :             fac010(lay) = fk0*fac10(lay)
    2520      157720 :             fac110(lay) = fk1*fac10(lay)
    2521      157720 :             fac210(lay) = fk2*fac10(lay)
    2522      450536 :          else if (specparm(lay) .gt. 0.875_r8) then
    2523          40 :             p = -fs(lay) 
    2524          40 :             p4 = p**4
    2525          40 :             fk0 = p4
    2526          40 :             fk1 = 1 - p - 2.0_r8*p4
    2527          40 :             fk2 = p + p4
    2528          40 :             fac000(lay) = fk0*fac00(lay)
    2529          40 :             fac100(lay) = fk1*fac00(lay)
    2530          40 :             fac200(lay) = fk2*fac00(lay)
    2531          40 :             fac010(lay) = fk0*fac10(lay)
    2532          40 :             fac110(lay) = fk1*fac10(lay)
    2533          40 :             fac210(lay) = fk2*fac10(lay)
    2534             :          else
    2535      450496 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    2536      450496 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    2537      450496 :             fac100(lay) = fs(lay) * fac00(lay)
    2538      450496 :             fac110(lay) = fs(lay) * fac10(lay)
    2539             :          endif
    2540             : 
    2541             :       enddo
    2542      635904 :       do lay = 1, laytrop
    2543      635904 :          if (specparm1(lay) .lt. 0.125_r8) then
    2544       76917 :             p = fs1(lay) - 1
    2545       76917 :             p4 = p**4
    2546       76917 :             fk0 = p4
    2547       76917 :             fk1 = 1 - p - 2.0_r8*p4
    2548       76917 :             fk2 = p + p4
    2549       76917 :             fac001(lay) = fk0*fac01(lay)
    2550       76917 :             fac101(lay) = fk1*fac01(lay)
    2551       76917 :             fac201(lay) = fk2*fac01(lay)
    2552       76917 :             fac011(lay) = fk0*fac11(lay)
    2553       76917 :             fac111(lay) = fk1*fac11(lay)
    2554       76917 :             fac211(lay) = fk2*fac11(lay)
    2555      531339 :          else if (specparm1(lay) .gt. 0.875_r8) then
    2556        4514 :             p = -fs1(lay) 
    2557        4514 :             p4 = p**4
    2558        4514 :             fk0 = p4
    2559        4514 :             fk1 = 1 - p - 2.0_r8*p4
    2560        4514 :             fk2 = p + p4
    2561        4514 :             fac001(lay) = fk0*fac01(lay)
    2562        4514 :             fac101(lay) = fk1*fac01(lay)
    2563        4514 :             fac201(lay) = fk2*fac01(lay)
    2564        4514 :             fac011(lay) = fk0*fac11(lay)
    2565        4514 :             fac111(lay) = fk1*fac11(lay)
    2566        4514 :             fac211(lay) = fk2*fac11(lay)
    2567             :          else
    2568      526825 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    2569      526825 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    2570      526825 :             fac101(lay) = fs1(lay) * fac01(lay)
    2571      526825 :             fac111(lay) = fs1(lay) * fac11(lay)
    2572             :          endif
    2573             :       enddo
    2574      635904 :       do lay = 1, laytrop
    2575             : 
    2576     3068928 :          do ig = 1, ng13
    2577     7299072 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    2578     9732096 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2579     4866048 :             taufor = forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2580     4866048 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2581     7299072 :             co2m1 = ka_mco2(jmco2(lay),indminor(lay),ig) + fmco2(lay) * &
    2582     7299072 :                  (ka_mco2(jmco2(lay)+1,indminor(lay),ig) - ka_mco2(jmco2(lay),indminor(lay),ig))
    2583     2433024 :             co2m2 = ka_mco2(jmco2(lay),indminor(lay)+1,ig) + fmco2(lay) * &
    2584     2433024 :                  (ka_mco2(jmco2(lay)+1,indminor(lay)+1,ig) - ka_mco2(jmco2(lay),indminor(lay)+1,ig))
    2585     2433024 :             absco2 = co2m1 + minorfrac(lay) * (co2m2 - co2m1)
    2586     2433024 :             com1 = ka_mco(jmco(lay),indminor(lay),ig) + fmco(lay) * &
    2587     4866048 :                  (ka_mco(jmco(lay)+1,indminor(lay),ig) - ka_mco(jmco(lay),indminor(lay),ig))
    2588             :             com2 = ka_mco(jmco(lay),indminor(lay)+1,ig) + fmco(lay) * &
    2589     2433024 :                  (ka_mco(jmco(lay)+1,indminor(lay)+1,ig) - ka_mco(jmco(lay),indminor(lay)+1,ig))
    2590     2433024 :             absco = com1 + minorfrac(lay) * (com2 - com1)
    2591             : 
    2592     2433024 :             if (specparm(lay) .lt. 0.125_r8) then
    2593             :                tau_major = speccomb(lay) * &
    2594      630880 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2595      630880 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2596      630880 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    2597      630880 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2598      630880 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    2599     3785280 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    2600     1802144 :             else if (specparm(lay) .gt. 0.875_r8) then
    2601             :                tau_major = speccomb(lay) * &
    2602         160 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    2603         160 :                     fac100(lay) * absa(ind0(lay),ig) + &
    2604         160 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    2605         160 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    2606         160 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    2607         960 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    2608             :             else
    2609             :                tau_major = speccomb(lay) * &
    2610     1801984 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2611     1801984 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2612     1801984 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2613     7207936 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    2614             :             endif
    2615             : 
    2616     2433024 :             if (specparm1(lay) .lt. 0.125_r8) then
    2617             :                tau_major1 = speccomb1(lay) * &
    2618      307668 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2619      307668 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2620      307668 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    2621      307668 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2622      307668 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    2623     1846008 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    2624     2125356 :             else if (specparm1(lay) .gt. 0.875_r8) then
    2625             :                tau_major1 = speccomb1(lay) * &
    2626       18056 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    2627       18056 :                     fac101(lay) * absa(ind1(lay),ig) + &
    2628       18056 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    2629       18056 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    2630       18056 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    2631      108336 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    2632             :             else
    2633             :                tau_major1 = speccomb1(lay) * &
    2634     2107300 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2635     2107300 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2636     2107300 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2637     8429200 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2638             :             endif
    2639             : 
    2640     2433024 :             taug(lay,ngs12+ig) = tau_major + tau_major1 &
    2641             :                  + tauself + taufor &
    2642             :                  + adjcolco2(lay)*absco2 &
    2643     4866048 :                  + colco(lay)*absco
    2644     4866048 :             fracs(lay,ngs12+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2645     5474304 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2646             :          enddo
    2647             :       enddo
    2648             : 
    2649             : ! Upper atmosphere loop
    2650     1133568 :       do lay = laytrop+1, nlayers
    2651     5557248 :          do ig = 1, ng13
    2652    13271040 :             abso3 = kb_mo3(indminor(lay),ig) + minorfrac(lay) * &
    2653    17694720 :                  (kb_mo3(indminor(lay)+1,ig) - kb_mo3(indminor(lay),ig))
    2654     4423680 :             taug(lay,ngs12+ig) = colo3(lay)*abso3
    2655     5529600 :             fracs(lay,ngs12+ig) =  fracrefb(ig)
    2656             :          enddo
    2657             :       enddo
    2658             : 
    2659       27648 :       end subroutine taugb13
    2660             : 
    2661             : !----------------------------------------------------------------------------
    2662       27648 :       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       55296 :       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      635904 :       do lay = 1, laytrop
    2687      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(14) + 1
    2688      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(14) + 1
    2689     1852416 :          do ig = 1, ng14
    2690     3649536 :             tauself = selffac(lay) * (selfref(indself(lay),ig) + selffrac(lay) * &
    2691     3649536 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2692     2433024 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2693     2433024 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2694     1216512 :             taug(lay,ngs13+ig) = colco2(lay) * &
    2695     2433024 :                  (fac00(lay) * absa(ind0(lay),ig) + &
    2696     2433024 :                  fac10(lay) * absa(ind0(lay)+1,ig) + &
    2697     2433024 :                  fac01(lay) * absa(ind1(lay),ig) + &
    2698     2433024 :                  fac11(lay) * absa(ind1(lay)+1,ig)) &
    2699     6082560 :                  + tauself + taufor
    2700     1824768 :             fracs(lay,ngs13+ig) = fracrefa(ig)
    2701             :          enddo
    2702             :       enddo
    2703             : 
    2704             : ! Upper atmosphere loop
    2705     1133568 :       do lay = laytrop+1, nlayers
    2706     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(14) + 1
    2707     1105920 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(14) + 1
    2708     3345408 :          do ig = 1, ng14
    2709     2211840 :             taug(lay,ngs13+ig) = colco2(lay) * &
    2710     6635520 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    2711     4423680 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    2712     4423680 :                  fac01(lay) * absb(ind1(lay),ig) + &
    2713    13271040 :                  fac11(lay) * absb(ind1(lay)+1,ig))
    2714     3317760 :             fracs(lay,ngs13+ig) = fracrefb(ig)
    2715             :          enddo
    2716             :       enddo
    2717             : 
    2718       27648 :       end subroutine taugb14
    2719             : 
    2720             : !----------------------------------------------------------------------------
    2721       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2739       55296 :       integer, dimension(nlayers) :: js, js1, jmn2, jpl
    2740       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2741       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2742       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_mn2, specparm_mn2, specmult_mn2, fmn2
    2743       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2744             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2745       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2746       55296 :       real(kind=r8), dimension(nlayers) :: fac001, fac101, fac201, fac011, fac111, fac211
    2747       55296 :       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       27648 :       refrat_planck_a = chi_mls(4,1)/chi_mls(2,1)
    2759             : 
    2760             : ! P = 1053.
    2761       27648 :       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      635904 :       do lay = 1, laytrop
    2770             : 
    2771      608256 :          speccomb(lay) = coln2o(lay) + rat_n2oco2(lay)*colco2(lay)
    2772      608256 :          specparm(lay) = coln2o(lay)/speccomb(lay)
    2773      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2774      608256 :          specmult(lay) = 8._r8*(specparm(lay))
    2775      608256 :          js(lay) = 1 + int(specmult(lay))
    2776      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2777             : 
    2778      608256 :          speccomb1(lay) = coln2o(lay) + rat_n2oco2_1(lay)*colco2(lay)
    2779      608256 :          specparm1(lay) = coln2o(lay)/speccomb1(lay)
    2780      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    2781      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
    2782      608256 :          js1(lay) = 1 + int(specmult1(lay))
    2783      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    2784             : 
    2785      608256 :          speccomb_mn2(lay) = coln2o(lay) + refrat_m_a*colco2(lay)
    2786      608256 :          specparm_mn2(lay) = coln2o(lay)/speccomb_mn2(lay)
    2787      608256 :          if (specparm_mn2(lay) .ge. oneminus) specparm_mn2(lay) = oneminus
    2788      608256 :          specmult_mn2(lay) = 8._r8*specparm_mn2(lay)
    2789      608256 :          jmn2(lay) = 1 + int(specmult_mn2(lay))
    2790      608256 :          fmn2(lay) = mod(specmult_mn2(lay),1.0_r8)
    2791             : 
    2792      608256 :          speccomb_planck(lay) = coln2o(lay)+refrat_planck_a*colco2(lay)
    2793      608256 :          specparm_planck(lay) = coln2o(lay)/speccomb_planck(lay)
    2794      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    2795      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    2796      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
    2797      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    2798             : 
    2799      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(15) + js(lay)
    2800      608256 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(15) + js1(lay)
    2801             :          
    2802      635904 :          scalen2(lay) = colbrd(lay)*scaleminor(lay)
    2803             :       enddo
    2804      635904 :       do lay = 1, laytrop
    2805      635904 :          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      608256 :          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      608256 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    2831      608256 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    2832      608256 :             fac100(lay) = fs(lay) * fac00(lay)
    2833      608256 :             fac110(lay) = fs(lay) * fac10(lay)
    2834             :          endif
    2835             :       enddo
    2836      635904 :       do lay = 1, laytrop
    2837      635904 :          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      608256 :          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      608256 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    2863      608256 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    2864      608256 :             fac101(lay) = fs1(lay) * fac01(lay)
    2865      608256 :             fac111(lay) = fs1(lay) * fac11(lay)
    2866             :          endif
    2867             : 
    2868             :       enddo
    2869      635904 :       do lay = 1, laytrop
    2870     1852416 :          do ig = 1, ng15
    2871     3649536 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    2872     4866048 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    2873     2433024 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    2874     2433024 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    2875     3649536 :             n2m1 = ka_mn2(jmn2(lay),indminor(lay),ig) + fmn2(lay) * &
    2876     3649536 :                  (ka_mn2(jmn2(lay)+1,indminor(lay),ig) - ka_mn2(jmn2(lay),indminor(lay),ig))
    2877     1216512 :             n2m2 = ka_mn2(jmn2(lay),indminor(lay)+1,ig) + fmn2(lay) * &
    2878     1216512 :                  (ka_mn2(jmn2(lay)+1,indminor(lay)+1,ig) - ka_mn2(jmn2(lay),indminor(lay)+1,ig))
    2879     1216512 :             taun2 = scalen2(lay) * (n2m1 + minorfrac(lay) * (n2m2 - n2m1))
    2880             : 
    2881     1216512 :             if (specparm(lay) .lt. 0.125_r8) then
    2882             :                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     1216512 :             else if (specparm(lay) .gt. 0.875_r8) then
    2890             :                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             :                tau_major = speccomb(lay) * &
    2899     1216512 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    2900     1216512 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    2901     1216512 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    2902     4866048 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    2903             :             endif 
    2904             : 
    2905     1216512 :             if (specparm1(lay) .lt. 0.125_r8) then
    2906             :                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     1216512 :             else if (specparm1(lay) .gt. 0.875_r8) then
    2914             :                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             :                tau_major1 = speccomb1(lay) * &
    2923     1216512 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    2924     1216512 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    2925     1216512 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    2926     4866048 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    2927             :             endif
    2928             : 
    2929     1216512 :             taug(lay,ngs14+ig) = tau_major + tau_major1 &
    2930             :                  + tauself + taufor &
    2931     1216512 :                  + taun2
    2932     2433024 :             fracs(lay,ngs14+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    2933     3041280 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    2934             :          enddo
    2935             :       enddo
    2936             : 
    2937             : ! Upper atmosphere loop
    2938     1133568 :       do lay = laytrop+1, nlayers
    2939     3345408 :          do ig = 1, ng15
    2940     2211840 :             taug(lay,ngs14+ig) = 0.0_r8
    2941     3317760 :             fracs(lay,ngs14+ig) = 0.0_r8
    2942             :          enddo
    2943             :       enddo
    2944             : 
    2945       27648 :       end subroutine taugb15
    2946             : 
    2947             : !----------------------------------------------------------------------------
    2948       27648 :       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       55296 :       integer :: lay, ind0(nlayers), ind1(nlayers), ig
    2965       55296 :       integer, dimension(nlayers) :: js, js1, jpl
    2966       55296 :       real(kind=r8), dimension(nlayers) :: speccomb, specparm, specmult, fs
    2967       55296 :       real(kind=r8), dimension(nlayers) :: speccomb1, specparm1, specmult1, fs1
    2968       55296 :       real(kind=r8), dimension(nlayers) :: speccomb_planck, specparm_planck, specmult_planck, fpl
    2969             :       real(kind=r8) :: p, p4, fk0, fk1, fk2
    2970       55296 :       real(kind=r8), dimension(nlayers) :: fac000, fac100, fac200, fac010, fac110, fac210
    2971       55296 :       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       27648 :       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      635904 :       do lay = 1, laytrop
    2990             : 
    2991      608256 :          speccomb(lay) = colh2o(lay) + rat_h2och4(lay)*colch4(lay)
    2992      608256 :          specparm(lay) = colh2o(lay)/speccomb(lay)
    2993      608256 :          if (specparm(lay) .ge. oneminus) specparm(lay) = oneminus
    2994      608256 :          specmult(lay) = 8._r8*(specparm(lay))
    2995      608256 :          js(lay) = 1 + int(specmult(lay))
    2996      608256 :          fs(lay) = mod(specmult(lay),1.0_r8)
    2997             : 
    2998      608256 :          speccomb1(lay) = colh2o(lay) + rat_h2och4_1(lay)*colch4(lay)
    2999      608256 :          specparm1(lay) = colh2o(lay)/speccomb1(lay)
    3000      608256 :          if (specparm1(lay) .ge. oneminus) specparm1(lay) = oneminus
    3001      608256 :          specmult1(lay) = 8._r8*(specparm1(lay))
    3002      608256 :          js1(lay) = 1 + int(specmult1(lay))
    3003      608256 :          fs1(lay) = mod(specmult1(lay),1.0_r8)
    3004             : 
    3005      608256 :          speccomb_planck(lay) = colh2o(lay)+refrat_planck_a*colch4(lay)
    3006      608256 :          specparm_planck(lay) = colh2o(lay)/speccomb_planck(lay)
    3007      608256 :          if (specparm_planck(lay) .ge. oneminus) specparm_planck(lay)=oneminus
    3008      608256 :          specmult_planck(lay) = 8._r8*specparm_planck(lay)
    3009      608256 :          jpl(lay)= 1 + int(specmult_planck(lay))
    3010      608256 :          fpl(lay) = mod(specmult_planck(lay),1.0_r8)
    3011             : 
    3012      608256 :          ind0(lay) = ((jp(lay)-1)*5+(jt(lay)-1))*nspa(16) + js(lay)
    3013      635904 :          ind1(lay) = (jp(lay)*5+(jt1(lay)-1))*nspa(16) + js1(lay)
    3014             :       enddo
    3015      635904 :       do lay = 1, laytrop
    3016      635904 :          if (specparm(lay) .lt. 0.125_r8) then
    3017      155221 :             p = fs(lay) - 1
    3018      155221 :             p4 = p**4
    3019      155221 :             fk0 = p4
    3020      155221 :             fk1 = 1 - p - 2.0_r8*p4
    3021      155221 :             fk2 = p + p4
    3022      155221 :             fac000(lay) = fk0*fac00(lay)
    3023      155221 :             fac100(lay) = fk1*fac00(lay)
    3024      155221 :             fac200(lay) = fk2*fac00(lay)
    3025      155221 :             fac010(lay) = fk0*fac10(lay)
    3026      155221 :             fac110(lay) = fk1*fac10(lay)
    3027      155221 :             fac210(lay) = fk2*fac10(lay)
    3028      453035 :          else if (specparm(lay) .gt. 0.875_r8) then
    3029          45 :             p = -fs(lay) 
    3030          45 :             p4 = p**4
    3031          45 :             fk0 = p4
    3032          45 :             fk1 = 1 - p - 2.0_r8*p4
    3033          45 :             fk2 = p + p4
    3034          45 :             fac000(lay) = fk0*fac00(lay)
    3035          45 :             fac100(lay) = fk1*fac00(lay)
    3036          45 :             fac200(lay) = fk2*fac00(lay)
    3037          45 :             fac010(lay) = fk0*fac10(lay)
    3038          45 :             fac110(lay) = fk1*fac10(lay)
    3039          45 :             fac210(lay) = fk2*fac10(lay)
    3040             :          else
    3041      452990 :             fac000(lay) = (1._r8 - fs(lay)) * fac00(lay)
    3042      452990 :             fac010(lay) = (1._r8 - fs(lay)) * fac10(lay)
    3043      452990 :             fac100(lay) = fs(lay) * fac00(lay)
    3044      452990 :             fac110(lay) = fs(lay) * fac10(lay)
    3045             :          endif
    3046             :       enddo
    3047      635904 :       do lay = 1, laytrop
    3048             : 
    3049      635904 :          if (specparm1(lay) .lt. 0.125_r8) then
    3050       77388 :             p = fs1(lay) - 1
    3051       77388 :             p4 = p**4
    3052       77388 :             fk0 = p4
    3053       77388 :             fk1 = 1 - p - 2.0_r8*p4
    3054       77388 :             fk2 = p + p4
    3055       77388 :             fac001(lay) = fk0*fac01(lay)
    3056       77388 :             fac101(lay) = fk1*fac01(lay)
    3057       77388 :             fac201(lay) = fk2*fac01(lay)
    3058       77388 :             fac011(lay) = fk0*fac11(lay)
    3059       77388 :             fac111(lay) = fk1*fac11(lay)
    3060       77388 :             fac211(lay) = fk2*fac11(lay)
    3061      530868 :          else if (specparm1(lay) .gt. 0.875_r8) then
    3062        4635 :             p = -fs1(lay) 
    3063        4635 :             p4 = p**4
    3064        4635 :             fk0 = p4
    3065        4635 :             fk1 = 1 - p - 2.0_r8*p4
    3066        4635 :             fk2 = p + p4
    3067        4635 :             fac001(lay) = fk0*fac01(lay)
    3068        4635 :             fac101(lay) = fk1*fac01(lay)
    3069        4635 :             fac201(lay) = fk2*fac01(lay)
    3070        4635 :             fac011(lay) = fk0*fac11(lay)
    3071        4635 :             fac111(lay) = fk1*fac11(lay)
    3072        4635 :             fac211(lay) = fk2*fac11(lay)
    3073             :          else
    3074      526233 :             fac001(lay) = (1._r8 - fs1(lay)) * fac01(lay)
    3075      526233 :             fac011(lay) = (1._r8 - fs1(lay)) * fac11(lay)
    3076      526233 :             fac101(lay) = fs1(lay) * fac01(lay)
    3077      526233 :             fac111(lay) = fs1(lay) * fac11(lay)
    3078             :          endif
    3079             :       enddo
    3080      635904 :       do lay = 1, laytrop
    3081             : 
    3082     1852416 :          do ig = 1, ng16
    3083     3649536 :             tauself = selffac(lay)* (selfref(indself(lay),ig) + selffrac(lay) * &
    3084     4866048 :                  (selfref(indself(lay)+1,ig) - selfref(indself(lay),ig)))
    3085     2433024 :             taufor =  forfac(lay) * (forref(indfor(lay),ig) + forfrac(lay) * &
    3086     2433024 :                  (forref(indfor(lay)+1,ig) - forref(indfor(lay),ig))) 
    3087             : 
    3088     1216512 :             if (specparm(lay) .lt. 0.125_r8) then
    3089             :                tau_major = speccomb(lay) * &
    3090      310442 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    3091      310442 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    3092      310442 :                     fac200(lay) * absa(ind0(lay)+2,ig) + &
    3093      310442 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    3094      310442 :                     fac110(lay) * absa(ind0(lay)+10,ig) + &
    3095     1862652 :                     fac210(lay) * absa(ind0(lay)+11,ig))
    3096      906070 :             else if (specparm(lay) .gt. 0.875_r8) then
    3097             :                tau_major = speccomb(lay) * &
    3098          90 :                     (fac200(lay) * absa(ind0(lay)-1,ig) + &
    3099          90 :                     fac100(lay) * absa(ind0(lay),ig) + &
    3100          90 :                     fac000(lay) * absa(ind0(lay)+1,ig) + &
    3101          90 :                     fac210(lay) * absa(ind0(lay)+8,ig) + &
    3102          90 :                     fac110(lay) * absa(ind0(lay)+9,ig) + &
    3103         540 :                     fac010(lay) * absa(ind0(lay)+10,ig))
    3104             :             else
    3105             :                tau_major = speccomb(lay) * &
    3106      905980 :                     (fac000(lay) * absa(ind0(lay),ig) + &
    3107      905980 :                     fac100(lay) * absa(ind0(lay)+1,ig) + &
    3108      905980 :                     fac010(lay) * absa(ind0(lay)+9,ig) + &
    3109     3623920 :                     fac110(lay) * absa(ind0(lay)+10,ig))
    3110             :             endif
    3111             : 
    3112     1216512 :             if (specparm1(lay) .lt. 0.125_r8) then
    3113             :                tau_major1 = speccomb1(lay) * &
    3114      154776 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    3115      154776 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    3116      154776 :                     fac201(lay) * absa(ind1(lay)+2,ig) + &
    3117      154776 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    3118      154776 :                     fac111(lay) * absa(ind1(lay)+10,ig) + &
    3119      928656 :                     fac211(lay) * absa(ind1(lay)+11,ig))
    3120     1061736 :             else if (specparm1(lay) .gt. 0.875_r8) then
    3121             :                tau_major1 = speccomb1(lay) * &
    3122        9270 :                     (fac201(lay) * absa(ind1(lay)-1,ig) + &
    3123        9270 :                     fac101(lay) * absa(ind1(lay),ig) + &
    3124        9270 :                     fac001(lay) * absa(ind1(lay)+1,ig) + &
    3125        9270 :                     fac211(lay) * absa(ind1(lay)+8,ig) + &
    3126        9270 :                     fac111(lay) * absa(ind1(lay)+9,ig) + &
    3127       55620 :                     fac011(lay) * absa(ind1(lay)+10,ig))
    3128             :             else
    3129             :                tau_major1 = speccomb1(lay) * &
    3130     1052466 :                     (fac001(lay) * absa(ind1(lay),ig) + &
    3131     1052466 :                     fac101(lay) * absa(ind1(lay)+1,ig) + &
    3132     1052466 :                     fac011(lay) * absa(ind1(lay)+9,ig) + &
    3133     4209864 :                     fac111(lay) * absa(ind1(lay)+10,ig))
    3134             :             endif
    3135             : 
    3136     1216512 :             taug(lay,ngs15+ig) = tau_major + tau_major1 &
    3137     1216512 :                  + tauself + taufor
    3138     2433024 :             fracs(lay,ngs15+ig) = fracrefa(ig,jpl(lay)) + fpl(lay) * &
    3139     3041280 :                  (fracrefa(ig,jpl(lay)+1)-fracrefa(ig,jpl(lay)))
    3140             :          enddo
    3141             :       enddo
    3142             : 
    3143             : ! Upper atmosphere loop
    3144     1133568 :       do lay = laytrop+1, nlayers
    3145     1105920 :          ind0(lay) = ((jp(lay)-13)*5+(jt(lay)-1))*nspb(16) + 1
    3146     1133568 :          ind1(lay) = ((jp(lay)-12)*5+(jt1(lay)-1))*nspb(16) + 1
    3147             :       enddo
    3148     1133568 :       do lay = laytrop+1, nlayers
    3149     3345408 :          do ig = 1, ng16
    3150     4423680 :             taug(lay,ngs15+ig) = colch4(lay) * &
    3151     6635520 :                  (fac00(lay) * absb(ind0(lay),ig) + &
    3152     4423680 :                  fac10(lay) * absb(ind0(lay)+1,ig) + &
    3153     4423680 :                  fac01(lay) * absb(ind1(lay),ig) + &
    3154    15482880 :                  fac11(lay) * absb(ind1(lay)+1,ig))
    3155     3317760 :             fracs(lay,ngs15+ig) = fracrefb(ig)
    3156             :          enddo
    3157             :       enddo
    3158             : 
    3159       27648 :       end subroutine taugb16
    3160             : 
    3161             :       end subroutine taumol
    3162             : 
    3163             :       end module rrtmg_lw_taumol
    3164             : 

Generated by: LCOV version 1.14