!-------------------------------------- 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 TCONTHL2 - WATER VAPOR CONTINUUM
*
#include "phy_macros_f.h"

      subroutine tconthl2 (taug, coef1, coef2, qq, dp, dip, dir, dt,  1
     1                    inptr, inpt, mcont, il1, il2, ilg, lay)
*
#include "impnone.cdk"
*
      integer ilg, lay, il1, il2, k, i, j, l, lp1, m, mcont, n
      real x1, y1, x2, y2, x11, x21, y21, y11, x12, x22, y12, y22 
      real rr
      real taug(ilg,lay), coef1(5,5,4), coef2(5,5,4)
*
      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. Lazare, 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    J. Li (June 2006) new scheme properly account for the h2o/co2
*                          ratio
* 002    M. Lazare (June 2006) implement rpn fix for inpt use variable
*                              instead of constant in intrinsics such
*        as "max" so that can compile in 32-bit mode with real*8
*
*Object
*
*        Water vapor continuum for 540-800 cm-1. different from tcontl,    
*        variation of mass mixing ratio for h2o and co2 is consider.       
*        lc = 4, but the inptut data are with 6 group, 2 of them are used  
*        for mass mixing ratio changes                                     
*                                                                       
* 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    interpretation factor for mass ratio of h2o / co2 between  
*        two neighboring standard input ratios                      
* dt     layer temperature - 250 k                                  
* inptr  number of the ratio level for the standard 5 ratios
* inpt   number of the level for the standard input data pressures  
* mcont  the highest level for water vapor continuum calculation    
*
*Implicites
*
#include "tracegases.cdk"
*
**
      do 200 k = mcont, lay
       if (inpt(1,k) .lt. 950)                                      then   
        do 100 i = il1, il2
         m =  inpt(i,k) - 14
         n =  m + 1
         if (m .ge. 1)                                              then
          l   =  inptr(i,k)
          if (l .lt. 1)                                             then
            x1  =  coef1(1,1,m) + dt(i,k) * (coef1(2,1,m) + dt(i,k) *
     1            (coef1(3,1,m) + dt(i,k) * (coef1(4,1,m) +
     2             dt(i,k) * coef1(5,1,m))))
            x2  =  coef1(1,1,n) + dt(i,k) * (coef1(2,1,n) + dt(i,k) *
     1            (coef1(3,1,n) + dt(i,k) * (coef1(4,1,n) +
     2             dt(i,k) * coef1(5,1,n))))
c
            y1  =  coef2(1,1,m) + dt(i,k) * (coef2(2,1,m) + dt(i,k) *
     1            (coef2(3,1,m) + dt(i,k) * (coef2(4,1,m) +
     2             dt(i,k) * coef2(5,1,m))))
            y2  =  coef2(1,1,n) + dt(i,k) * (coef2(2,1,n) + dt(i,k) *
     1            (coef2(3,1,n) + dt(i,k) * (coef2(4,1,n) +
     2             dt(i,k) * coef2(5,1,n))))
c
          else if (l .lt. 5)                                        then
            lp1 =  l + 1
            x11 =  coef1(1,l,m) + dt(i,k) * (coef1(2,l,m) + dt(i,k) *
     1            (coef1(3,l,m) + dt(i,k) * (coef1(4,l,m) +
     2             dt(i,k) * coef1(5,l,m))))
            x21 =  coef1(1,l,n) + dt(i,k) * (coef1(2,l,n) + dt(i,k) *
     1            (coef1(3,l,n) + dt(i,k) * (coef1(4,l,n) +
     2             dt(i,k) * coef1(5,l,n))))
c
            y11 =  coef2(1,l,m) + dt(i,k) * (coef2(2,l,m) + dt(i,k) *
     1            (coef2(3,l,m) + dt(i,k) * (coef2(4,l,m) +
     2             dt(i,k) * coef2(5,l,m))))
            y21 =  coef2(1,l,n) + dt(i,k) * (coef2(2,l,n) + dt(i,k) *
     1            (coef2(3,l,n) + dt(i,k) * (coef2(4,l,n) +
     2             dt(i,k) * coef2(5,l,n))))
c
            x12 =  coef1(1,lp1,m) + dt(i,k) * (coef1(2,lp1,m) +
     1                              dt(i,k) * (coef1(3,lp1,m) +
     2                              dt(i,k) * (coef1(4,lp1,m) +
     3                              dt(i,k) * coef1(5,lp1,m))))
            x22 =  coef1(1,lp1,n) + dt(i,k) * (coef1(2,lp1,n) +
     1                              dt(i,k) * (coef1(3,lp1,n) +
     2                              dt(i,k) * (coef1(4,lp1,n) +
     3                              dt(i,k) * coef1(5,lp1,n))))
c
            y12 =  coef2(1,lp1,m) + dt(i,k) * (coef2(2,lp1,m) +
     1                              dt(i,k) * (coef2(3,lp1,m) +
     2                              dt(i,k) * (coef2(4,lp1,m) +
     3                              dt(i,k) * coef2(5,lp1,m))))
            y22 =  coef2(1,lp1,n) + dt(i,k) * (coef2(2,lp1,n) +
     1                              dt(i,k) * (coef2(3,lp1,n) +
     2                              dt(i,k) * (coef2(4,lp1,n) +
     3                              dt(i,k) * coef2(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  =  coef1(1,5,m) + dt(i,k) * (coef1(2,5,m) + dt(i,k) *
     1            (coef1(3,5,m) + dt(i,k) * (coef1(4,5,m) +
     2             dt(i,k) * coef1(5,5,m))))
            x2  =  coef1(1,5,n) + dt(i,k) * (coef1(2,5,n) + dt(i,k) *
     1            (coef1(3,5,n) + dt(i,k) * (coef1(4,5,n) +
     2             dt(i,k) * coef1(5,5,n))))
            y1  =  coef2(1,5,m) + dt(i,k) * (coef2(2,5,m) + dt(i,k) *
     1            (coef2(3,5,m) + dt(i,k) * (coef2(4,5,m) +
     2             dt(i,k) * coef2(5,5,m))))
            y2  =  coef2(1,5,n) + dt(i,k) * (coef2(2,5,n) + dt(i,k) *
     1            (coef2(3,5,n) + dt(i,k) * (coef2(4,5,n) +
     2             dt(i,k) * coef2(5,5,n))))
          endif
c
          taug(i,k) =  taug(i,k) + ((x1 - y1 + (x2 - x1 - y2 + y1) *
     1                 dip(i,k)) * 1.608 * qq(i,k) + y1 + (y2 - y1) *
     2                 dip(i,k)) * qq(i,k) * dp(i,k)
         endif
  100   continue
       else
        j =  inpt(1,k) - 1000
        m =  j - 14
        n =  m + 1
        do 150 i = il1, il2
         if (m .ge. 1)                                              then
          l   =  inptr(i,k)
          if (l .lt. 1)                                             then
            x1  =  coef1(1,1,m) + dt(i,k) * (coef1(2,1,m) + dt(i,k) *
     1            (coef1(3,1,m) + dt(i,k) * (coef1(4,1,m) +
     2             dt(i,k) * coef1(5,1,m))))
            x2  =  coef1(1,1,n) + dt(i,k) * (coef1(2,1,n) + dt(i,k) *
     1            (coef1(3,1,n) + dt(i,k) * (coef1(4,1,n) +
     2             dt(i,k) * coef1(5,1,n))))
c
            y1  =  coef2(1,1,m) + dt(i,k) * (coef2(2,1,m) + dt(i,k) *
     1            (coef2(3,1,m) + dt(i,k) * (coef2(4,1,m) +
     2             dt(i,k) * coef2(5,1,m))))
            y2  =  coef2(1,1,n) + dt(i,k) * (coef2(2,1,n) + dt(i,k) *
     1            (coef2(3,1,n) + dt(i,k) * (coef2(4,1,n) +
     2             dt(i,k) * coef2(5,1,n))))
c
          else if (l .lt. 5)                                        then
            lp1 =  l + 1
            x11 =  coef1(1,l,m) + dt(i,k) * (coef1(2,l,m) + dt(i,k) *
     1            (coef1(3,l,m) + dt(i,k) * (coef1(4,l,m) +
     2             dt(i,k) * coef1(5,l,m))))
            x21 =  coef1(1,l,n) + dt(i,k) * (coef1(2,l,n) + dt(i,k) *
     1            (coef1(3,l,n) + dt(i,k) * (coef1(4,l,n) +
     2             dt(i,k) * coef1(5,l,n))))
c
            y11 =  coef2(1,l,m) + dt(i,k) * (coef2(2,l,m) + dt(i,k) *
     1            (coef2(3,l,m) + dt(i,k) * (coef2(4,l,m) +
     2             dt(i,k) * coef2(5,l,m))))
            y21 =  coef2(1,l,n) + dt(i,k) * (coef2(2,l,n) + dt(i,k) *
     1            (coef2(3,l,n) + dt(i,k) * (coef2(4,l,n) +
     2             dt(i,k) * coef2(5,l,n))))
c
            x12 =  coef1(1,lp1,m) + dt(i,k) * (coef1(2,lp1,m) +
     1                              dt(i,k) * (coef1(3,lp1,m) +
     2                              dt(i,k) * (coef1(4,lp1,m) +
     3                              dt(i,k) * coef1(5,lp1,m))))
            x22 =  coef1(1,lp1,n) + dt(i,k) * (coef1(2,lp1,n) +
     1                              dt(i,k) * (coef1(3,lp1,n) +
     2                              dt(i,k) * (coef1(4,lp1,n) +
     3                              dt(i,k) * coef1(5,lp1,n))))
c
            y12 =  coef2(1,lp1,m) + dt(i,k) * (coef2(2,lp1,m) +
     1                              dt(i,k) * (coef2(3,lp1,m) +
     2                              dt(i,k) * (coef2(4,lp1,m) +
     3                              dt(i,k) * coef2(5,lp1,m))))
            y22 =  coef2(1,lp1,n) + dt(i,k) * (coef2(2,lp1,n) +
     1                              dt(i,k) * (coef2(3,lp1,n) +
     2                              dt(i,k) * (coef2(4,lp1,n) +
     3                              dt(i,k) * coef2(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  =  coef1(1,5,m) + dt(i,k) * (coef1(2,5,m) + dt(i,k) *
     1            (coef1(3,5,m) + dt(i,k) * (coef1(4,5,m) +
     2             dt(i,k) * coef1(5,5,m))))
            x2  =  coef1(1,5,n) + dt(i,k) * (coef1(2,5,n) + dt(i,k) *
     1            (coef1(3,5,n) + dt(i,k) * (coef1(4,5,n) +
     2             dt(i,k) * coef1(5,5,n))))
            y1  =  coef2(1,5,m) + dt(i,k) * (coef2(2,5,m) + dt(i,k) *
     1            (coef2(3,5,m) + dt(i,k) * (coef2(4,5,m) +
     2             dt(i,k) * coef2(5,5,m))))
            y2  =  coef2(1,5,n) + dt(i,k) * (coef2(2,5,n) + dt(i,k) *
     1            (coef2(3,5,n) + dt(i,k) * (coef2(4,5,n) +
     2             dt(i,k) * coef2(5,5,n))))
          endif
c
          taug(i,k) =  taug(i,k) + ((x1 - y1 + (x2 - x1 - y2 + y1) *
     1                 dip(i,k)) * 1.608 * qq(i,k) + y1 + (y2 - y1) *
     2                 dip(i,k)) * qq(i,k) * dp(i,k)
         endif
  150   continue
       endif
  200 continue
c
      return
      end