!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***S/P TLINEHC - OPTICAL DEPTH FOR H2O AND CO2
*
#include "phy_macros_f.h"

      subroutine tlinehc (taug, coef1u, coef1d,  1
     1                    coef2u, coef2d, qq, dp, dip, dir,
     2                    dt, inptr, inpt, lev1, il1, il2, ilg, lay)
*
#include "impnone.cdk"
*
      integer ilg, lay, lev1, il1, il2, k, i, m, n, l, lp1, r
      real x1, y1, x2, y2, x11, x21, y21, y11, x12, x22, y12, y22 
      real taug(ilg,lay), coef1u(5,11), coef1d(5,5,7), 
     1                    coef2u(5,11), coef2d(5,5,7)
      real qq(ilg,lay), dp(ilg,lay), dip(ilg,lay), dir(ilg,lay), 
     1     dt(ilg,lay)
      integer inptr(ilg,lay), inpt(ilg,lay)
*
*Authors
*
*        J. Li, M. Lazarre, CCCMA, rt code for gcm4
*        (Ref: J. Li, H. W. Barker, 2005:
*         JAS Vol. 62, no. 2, pp. 286\226309)
*        P. Vaillancourt, D. Talbot, RPN/CMC;
*        adapted for CMC/RPN physics (May 2006)
*
*Revisions
*
* 001
*
*Object
*
*        This subroutine determines the optical depth for h2o and co2 in   
*        the region of 540-800 cm^-1                                       
*                                                                       
*Arguments
*
* taug   gaseous optical depth                                       
* qq     input h2o mixing ratio for each layer                       
* dp     air mass path for a model layer (explained in raddriv)
* dip    interpolation factor for pressure between two neighboring  
*        standard input data pressure levels                         
* dir    interpolation factor for mass ratio of h2o / co2 between   
*        two neighboring standard input ratios                       
* dt     layer temperature - 250 k                                   
* inpr   number of the ratio level for the standard 5 ratios         
* inpt   number of the level for the standard input data pressures   
*
*Implicites
*
#include "tracegases.cdk"
*
**
      do 200 k = lev1, lay
      if (inpt(1,k) .lt. 950)                                       then
      do 101 i = il1, il2
        m       =  inpt(i,k)
        if (m .le. 11)                                              then
          n     =  m + 1
          if (m .gt. 0)                                             then
            x1  =  coef1u(1,m) + dt(i,k) * (coef1u(2,m) + dt(i,k) * 
     1            (coef1u(3,m) + dt(i,k) * (coef1u(4,m) +
     2             dt(i,k) * coef1u(5,m))))
            y1  =  coef2u(1,m) + dt(i,k) * (coef2u(2,m) + dt(i,k) * 
     1            (coef2u(3,m) + dt(i,k) * (coef2u(4,m) +
     2             dt(i,k) * coef2u(5,m))))
          else
            x1  =  0.0
            y1  =  0.0
          endif
          if (m .lt. 11)                                            then
            x2  =  coef1u(1,n) + dt(i,k) * (coef1u(2,n) + dt(i,k) * 
     1            (coef1u(3,n) + dt(i,k) * (coef1u(4,n) +
     2             dt(i,k) * coef1u(5,n))))
            y2  =  coef2u(1,n) + dt(i,k) * (coef2u(2,n) + dt(i,k) * 
     1            (coef2u(3,n) + dt(i,k) * (coef2u(4,n) +
     2             dt(i,k) * coef2u(5,n))))
          else
            x2  =  coef1d(1,1,1) + dt(i,k) * (coef1d(2,1,1) + dt(i,k) *
     1            (coef1d(3,1,1) + dt(i,k) * (coef1d(4,1,1) +
     2             dt(i,k) * coef1d(5,1,1))))
            y2  =  coef2d(1,1,1) + dt(i,k) * (coef2d(2,1,1) + dt(i,k) *
     1            (coef2d(3,1,1) + dt(i,k) * (coef2d(4,1,1) +
     2             dt(i,k) * coef2d(5,1,1))))
          endif
        else
          m     =  m - 11
          n     =  m + 1
          l     =  inptr(i,k)
          if (l .lt. 1)                                             then
            x1  =  coef1d(1,1,m) + dt(i,k) * (coef1d(2,1,m) + dt(i,k) * 
     1            (coef1d(3,1,m) + dt(i,k) * (coef1d(4,1,m) +
     2             dt(i,k) * coef1d(5,1,m))))
            x2  =  coef1d(1,1,n) + dt(i,k) * (coef1d(2,1,n) + dt(i,k) * 
     1            (coef1d(3,1,n) + dt(i,k) * (coef1d(4,1,n) +
     2             dt(i,k) * coef1d(5,1,n))))
c
            y1  =  coef2d(1,1,m) + dt(i,k) * (coef2d(2,1,m) + dt(i,k) * 
     1            (coef2d(3,1,m) + dt(i,k) * (coef2d(4,1,m) +
     2             dt(i,k) * coef2d(5,1,m))))
            y2  =  coef2d(1,1,n) + dt(i,k) * (coef2d(2,1,n) + dt(i,k) * 
     1            (coef2d(3,1,n) + dt(i,k) * (coef2d(4,1,n) +
     2             dt(i,k) * coef2d(5,1,n))))
c
          else if (l .lt. 5)                                        then
            lp1 =  l + 1
            x11 =  coef1d(1,l,m) + dt(i,k) * (coef1d(2,l,m) + dt(i,k) * 
     1            (coef1d(3,l,m) + dt(i,k) * (coef1d(4,l,m) +
     2             dt(i,k) * coef1d(5,l,m))))
            x21 =  coef1d(1,l,n) + dt(i,k) * (coef1d(2,l,n) + dt(i,k) * 
     1            (coef1d(3,l,n) + dt(i,k) * (coef1d(4,l,n) +
     2             dt(i,k) * coef1d(5,l,n))))
c
            y11 =  coef2d(1,l,m) + dt(i,k) * (coef2d(2,l,m) + dt(i,k) * 
     1            (coef2d(3,l,m) + dt(i,k) * (coef2d(4,l,m) +
     2             dt(i,k) * coef2d(5,l,m))))
            y21 =  coef2d(1,l,n) + dt(i,k) * (coef2d(2,l,n) + dt(i,k) * 
     1            (coef2d(3,l,n) + dt(i,k) * (coef2d(4,l,n) +
     2             dt(i,k) * coef2d(5,l,n))))
c
            x12 =  coef1d(1,lp1,m) + dt(i,k) * (coef1d(2,lp1,m) +
     1                               dt(i,k) * (coef1d(3,lp1,m) + 
     2                               dt(i,k) * (coef1d(4,lp1,m) + 
     3                               dt(i,k) * coef1d(5,lp1,m))))
            x22 =  coef1d(1,lp1,n) + dt(i,k) * (coef1d(2,lp1,n) +
     1                               dt(i,k) * (coef1d(3,lp1,n) + 
     2                               dt(i,k) * (coef1d(4,lp1,n) + 
     3                               dt(i,k) * coef1d(5,lp1,n))))
c
            y12 =  coef2d(1,lp1,m) + dt(i,k) * (coef2d(2,lp1,m) +
     1                               dt(i,k) * (coef2d(3,lp1,m) + 
     2                               dt(i,k) * (coef2d(4,lp1,m) + 
     3                               dt(i,k) * coef2d(5,lp1,m))))
            y22 =  coef2d(1,lp1,n) + dt(i,k) * (coef2d(2,lp1,n) +
     1                               dt(i,k) * (coef2d(3,lp1,n) + 
     2                               dt(i,k) * (coef2d(4,lp1,n) + 
     3                               dt(i,k) * coef2d(5,lp1,n))))
c
            x1  =  x11 + (x12 - x11) * dir(i,k)
            x2  =  x21 + (x22 - x21) * dir(i,k)
            y1  =  y11 + (y12 - y11) * dir(i,k)
            y2  =  y21 + (y22 - y21) * dir(i,k)
          else
            x1  =  coef1d(1,5,m) + dt(i,k) * (coef1d(2,5,m) + dt(i,k) * 
     1            (coef1d(3,5,m) + dt(i,k) * (coef1d(4,5,m) +
     2             dt(i,k) * coef1d(5,5,m))))
            x2  =  coef1d(1,5,n) + dt(i,k) * (coef1d(2,5,n) + dt(i,k) * 
     1            (coef1d(3,5,n) + dt(i,k) * (coef1d(4,5,n) +
     2             dt(i,k) * coef1d(5,5,n))))
            y1  =  coef2d(1,5,m) + dt(i,k) * (coef2d(2,5,m) + dt(i,k) * 
     1            (coef2d(3,5,m) + dt(i,k) * (coef2d(4,5,m) +
     2             dt(i,k) * coef2d(5,5,m))))
            y2  =  coef2d(1,5,n) + dt(i,k) * (coef2d(2,5,n) + dt(i,k) *
     1            (coef2d(3,5,n) + dt(i,k) * (coef2d(4,5,n) +
     2             dt(i,k) * coef2d(5,5,n))))
          endif
        endif
c
        taug(i,k) = ( (x1 + (x2 - x1) * dip(i,k)) * qq(i,k) +
     1                (y1 + (y2 - y1) * dip(i,k)) * rmco2 ) * dp(i,k)
 101  continue
      else
      m       =  inpt(1,k) - 1000
      do 102 i = il1, il2
        if (m .le. 11)                                              then
          n     =  m + 1
          if (m .gt. 0)                                             then
            x1  =  coef1u(1,m) + dt(i,k) * (coef1u(2,m) + dt(i,k) * 
     1            (coef1u(3,m) + dt(i,k) * (coef1u(4,m) +
     2             dt(i,k) * coef1u(5,m))))
            y1  =  coef2u(1,m) + dt(i,k) * (coef2u(2,m) + dt(i,k) * 
     1            (coef2u(3,m) + dt(i,k) * (coef2u(4,m) +
     2             dt(i,k) * coef2u(5,m))))
          else
            x1  =  0.0
            y1  =  0.0
          endif
          if (m .lt. 11)                                            then
            x2  =  coef1u(1,n) + dt(i,k) * (coef1u(2,n) + dt(i,k) * 
     1            (coef1u(3,n) + dt(i,k) * (coef1u(4,n) +
     2             dt(i,k) * coef1u(5,n))))
            y2  =  coef2u(1,n) + dt(i,k) * (coef2u(2,n) + dt(i,k) * 
     1            (coef2u(3,n) + dt(i,k) * (coef2u(4,n) +
     2             dt(i,k) * coef2u(5,n))))
          else
            x2  =  coef1d(1,1,1) + dt(i,k) * (coef1d(2,1,1) + dt(i,k) *
     1            (coef1d(3,1,1) + dt(i,k) * (coef1d(4,1,1) +
     2             dt(i,k) * coef1d(5,1,1))))
            y2  =  coef2d(1,1,1) + dt(i,k) * (coef2d(2,1,1) + dt(i,k) *
     1            (coef2d(3,1,1) + dt(i,k) * (coef2d(4,1,1) +
     2             dt(i,k) * coef2d(5,1,1))))
          endif
        else
          r     =  m - 11
          n     =  r + 1
          l     =  inptr(i,k)
          if (l .lt. 1)                                             then
            x1  =  coef1d(1,1,r) + dt(i,k) * (coef1d(2,1,r) + dt(i,k) * 
     1            (coef1d(3,1,r) + dt(i,k) * (coef1d(4,1,r) +
     2             dt(i,k) * coef1d(5,1,r))))
            x2  =  coef1d(1,1,n) + dt(i,k) * (coef1d(2,1,n) + dt(i,k) * 
     1            (coef1d(3,1,n) + dt(i,k) * (coef1d(4,1,n) +
     2             dt(i,k) * coef1d(5,1,n))))
c
            y1  =  coef2d(1,1,r) + dt(i,k) * (coef2d(2,1,r) + dt(i,k) * 
     1            (coef2d(3,1,r) + dt(i,k) * (coef2d(4,1,r) +
     2             dt(i,k) * coef2d(5,1,r))))
            y2  =  coef2d(1,1,n) + dt(i,k) * (coef2d(2,1,n) + dt(i,k) * 
     1            (coef2d(3,1,n) + dt(i,k) * (coef2d(4,1,n) +
     2             dt(i,k) * coef2d(5,1,n))))
c
          else if (l .lt. 5)                                        then
            lp1 =  l + 1
            x11 =  coef1d(1,l,r) + dt(i,k) * (coef1d(2,l,r) + dt(i,k) * 
     1            (coef1d(3,l,r) + dt(i,k) * (coef1d(4,l,r) +
     2             dt(i,k) * coef1d(5,l,r))))
            x21 =  coef1d(1,l,n) + dt(i,k) * (coef1d(2,l,n) + dt(i,k) * 
     1            (coef1d(3,l,n) + dt(i,k) * (coef1d(4,l,n) +
     2             dt(i,k) * coef1d(5,l,n))))
c
            y11 =  coef2d(1,l,r) + dt(i,k) * (coef2d(2,l,r) + dt(i,k) * 
     1            (coef2d(3,l,r) + dt(i,k) * (coef2d(4,l,r) +
     2             dt(i,k) * coef2d(5,l,r))))
            y21 =  coef2d(1,l,n) + dt(i,k) * (coef2d(2,l,n) + dt(i,k) * 
     1            (coef2d(3,l,n) + dt(i,k) * (coef2d(4,l,n) +
     2             dt(i,k) * coef2d(5,l,n))))
c
            x12 =  coef1d(1,lp1,r) + dt(i,k) * (coef1d(2,lp1,r) +
     1                               dt(i,k) * (coef1d(3,lp1,r) + 
     2                               dt(i,k) * (coef1d(4,lp1,r) + 
     3                               dt(i,k) * coef1d(5,lp1,r))))
            x22 =  coef1d(1,lp1,n) + dt(i,k) * (coef1d(2,lp1,n) +
     1                               dt(i,k) * (coef1d(3,lp1,n) + 
     2                               dt(i,k) * (coef1d(4,lp1,n) + 
     3                               dt(i,k) * coef1d(5,lp1,n))))
c
            y12 =  coef2d(1,lp1,r) + dt(i,k) * (coef2d(2,lp1,r) +
     1                               dt(i,k) * (coef2d(3,lp1,r) + 
     2                               dt(i,k) * (coef2d(4,lp1,r) + 
     3                               dt(i,k) * coef2d(5,lp1,r))))
            y22 =  coef2d(1,lp1,n) + dt(i,k) * (coef2d(2,lp1,n) +
     1                               dt(i,k) * (coef2d(3,lp1,n) + 
     2                               dt(i,k) * (coef2d(4,lp1,n) + 
     3                               dt(i,k) * coef2d(5,lp1,n))))
c
            x1  =  x11 + (x12 - x11) * dir(i,k)
            x2  =  x21 + (x22 - x21) * dir(i,k)
            y1  =  y11 + (y12 - y11) * dir(i,k)
            y2  =  y21 + (y22 - y21) * dir(i,k)
          else
            x1  =  coef1d(1,5,r) + dt(i,k) * (coef1d(2,5,r) + dt(i,k) * 
     1            (coef1d(3,5,r) + dt(i,k) * (coef1d(4,5,r) +
     2             dt(i,k) * coef1d(5,5,r))))
            x2  =  coef1d(1,5,n) + dt(i,k) * (coef1d(2,5,n) + dt(i,k) * 
     1            (coef1d(3,5,n) + dt(i,k) * (coef1d(4,5,n) +
     2             dt(i,k) * coef1d(5,5,n))))
            y1  =  coef2d(1,5,r) + dt(i,k) * (coef2d(2,5,r) + dt(i,k) * 
     1            (coef2d(3,5,r) + dt(i,k) * (coef2d(4,5,r) +
     2             dt(i,k) * coef2d(5,5,r))))
            y2  =  coef2d(1,5,n) + dt(i,k) * (coef2d(2,5,n) + dt(i,k) *
     1            (coef2d(3,5,n) + dt(i,k) * (coef2d(4,5,n) +
     2             dt(i,k) * coef2d(5,5,n))))
          endif
        endif
c
        taug(i,k) = ( (x1 + (x2 - x1) * dip(i,k)) * qq(i,k) +
     1                (y1 + (y2 - y1) * dip(i,k)) * rmco2 ) * dp(i,k)
 102  continue
      endif
 200  continue
c
      return
      end