!-------------------------------------- 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/r e_setintuv - computes (u,v) interpolation coefficients
*
#include "model_macros_f.h"

      subroutine e_setintuv 1,19
#include "impnone.cdk"
*
*author jean cote - rpn - sept 95
*
*revision
* v0_16 - michel roch            - add abort condition for glfipol=.t. with
* v0_16                            cubic interpolation of the winds and
* v0_16                            associated RHS
* v0_18	- jean cote/andre methot - introduces setinuvl for efficient cubic
* v0_18                            lagrange interpolation
* v0_19 - jean cote              - remove the option glstslag = false
* v1_00 - jean cote              - real*8 version
* v1_96 - V. Lee                 - comdeck cleanup and revision for gempp
* v1_97 - V. Lee                 - added prefix "e_" to GEFNTR comdecks,
* v1_97                            eliminated mvr8tor, modified e_intuv.cdk
*
*language
*	fortran 77
*
*object
*	see above ID
*	
*arguments
*	none
*
*implicits
#include "e_schm.cdk"
#include "e_grids.cdk"
#include "e_geomg.cdk"
#include "e_intuv.cdk"
#include "dcst.cdk"
*
**
      real*8 zero, half, one, two, three
      parameter( zero  = 0.0 )
      parameter( half  = 0.5 )
      parameter( one   = 1.0 )
      parameter( two   = 2.0 )
      parameter( three = 3.0 )
*
      integer  i, j, pnerr
      real*8   pdhx(0:*), pdhxu(0:*), pdhy(0:*)
      pointer (p_pdhx,pdhx), (p_pdhxu,pdhxu), (p_pdhy,pdhy)
*     ---------------------------------------------------------------
*
      write(6, 1001 )
      call hpalloc(p_pdhx ,(pni+1)*2, pnerr,1)
      call hpalloc(p_pdhxu,(pni+1)*2, pnerr,1)
      call hpalloc(p_pdhy ,(pnj+1)*2, pnerr,1)
*
      if ( .not. e_Schm_stlag ) then
         write(6, 1300)
         call e_arret( 'e_setintuv' )
      endif
*
*
      if ( e_Schm_adcub .and.(.not. e_Schm_stlag)) then
         write(6, 1200)
         call e_arret( 'e_setintuv' )
      endif
*
*
*C       0.    extend hx, hxu, hy
*              ------------------
*
*
        do i = 1, pni
          pdhx(i)    = xdhx(i)
          pdhxu(i-1) = xdhxu(i-1)
        enddo
        pdhx(0)      = pdhx(pni)
        pdhxu(pni)   = pdhxu(0)
        do j = 1, pnj
          pdhy(j) = xdhy(j)
        enddo
        pdhy(0)    = xdy(1) + half * Dcst_pi_8
        pdhy(pnj)  = half * Dcst_pi_8 - xdy(pnj)
*
*C       1.    compute interpolation polynomials at interpolation points
*              ---------------------------------------------------------
*
*     x-interpolation from PHI-gdid to U-gdid ( xdx to xdxu )
      do i = 1, pni - 1
        call e_intpoly( xdc0xxu(i), xdc1xxu(i), xdc2xxu(i),
     %                 xdxu(i) - xdx(i),
     %                 pdhx(i), pdhx(i-1), pdhx(i+1), e_Schm_stlag )
      enddo
      i = pni
      call e_intpoly( xdc0xxu(i), xdc1xxu(i), xdc2xxu(i),
     %               xdxu(i) - xdx(i),
     %               pdhx(i), pdhx(i-1), pdhx(1), e_Schm_stlag )
*     x-interpolation from U-gdid to PHI-gdid ( xdxu to xdx )
      do i = 1, pni - 1
        call e_intpoly( xdc0xux(i), xdc1xux(i), xdc2xux(i),
     %                 xdx(i+1) - xdxu(i),
     %                 pdhxu(i), pdhxu(i-1),  pdhxu(i+1), e_Schm_stlag )
      enddo
      i = pni
      call e_intpoly( xdc0xux(i), xdc1xux(i), xdc2xux(i),
     %               two * Dcst_pi_8 + xdx(1) - xdxu(i),
     %               pdhxu(i), pdhxu(i-1), pdhxu(1), e_Schm_stlag )
*     y-interpolation from PHI-gdid to V-gdid ( xdy to xdyv )
      do j = 1, pnj-1
        call e_intpoly( xdc0yyv(j), xdc1yyv(j), xdc2yyv(j),
     %                 xdyv(j) - xdy(j),
     %                 pdhy(j), pdhy(j-1), pdhy(j+1), e_Schm_stlag )
      enddo
*     y-interpolation from V-gdid to PHI-gdid ( xdyv to xdy )
      j = 0
      if ( e_Schm_stlag ) then
          xdc0yvy(j) = ( xdy(j+1) + half * Dcst_pi_8 ) / xdhyv(j)
          xdc1yvy(j) = zero
          xdc2yvy(j) = xdc0yvy(j) * ( xdc0yvy(j) - one ) * xdhyv(j) ** 2
      else
          call e_intpoly( xdc0yvy(j), xdc1yvy(j), xdc2yvy(j),
     %                   xdy(j+1) + half * Dcst_pi_8,
     %                   xdhyv(j), xdhyv(j), xdhyv(j), e_Schm_stlag )
      endif
      do j = 1, pnjv - 1
        call e_intpoly( xdc0yvy(j), xdc1yvy(j), xdc2yvy(j),
     %                 xdy(j+1) - xdyv(j),
     %                 xdhyv(j), xdhyv(j-1), xdhyv(j+1), e_Schm_stlag )
      enddo
      j = pnjv
      if ( e_Schm_stlag ) then
          xdc0yvy(j) = ( xdy(j+1) - xdyv(j) ) / xdhyv(j)
          xdc1yvy(j) = xdc0yvy(j) * ( xdc0yvy(j) - one ) * xdhyv(j) ** 2
          xdc2yvy(j) = zero
      else
          call e_intpoly( xdc0yvy(j), xdc1yvy(j), xdc2yvy(j),
     %                   xdy(j+1) - xdyv(j),
     %                   xdhyv(j), xdhyv(j), xdhyv(j), e_Schm_stlag )
      endif
*
*
*C       2.    compute second derivative/difference operators
*              ----------------------------------------------
*
        call set_ops8( xdq2x, pdhx(1),  two, .true.,  pni,  pni, 1 )
        call set_ops8( xdq2u, pdhxu(1), two, .true.,  pni,  pni, 1 )
        call set_ops8( xdq2y, pdhy(1),  two, .false., pnj,  pnj, 1 )
        call set_ops8( xdq2v, xdhyv(1), two, .false., pnjv, pnj, 1 )
        xdq2y(1,2)    = xdq2y(1,2)    - one / pdhy(0)
        xdq2y(pnj,2)  = xdq2y(pnj,2)  - one / pdhy(pnj)
        xdq2v(1,2)    = xdq2v(1,2)    - one / xdhyv(0)
        xdq2v(pnjv,2) = xdq2v(pnjv,2) - one / xdhyv(pnjv)
        if ( e_Schm_stlag ) then
          do i = 1, pni
            xdqix(i,1) = one/( pdhx(i-1) + pdhx(i) )
            xdqiu(i,1) = one/( pdhxu(i-1) + pdhxu(i) )
          enddo
          do j = 1, pnj
            xdqiy(j,1) = one/( pdhy(j-1) + pdhy(j) )
          enddo
          do j = 1, pnjv
            xdqiv(j,1) = one/( xdhyv(j-1) + xdhyv(j) )
          enddo
        else
          call set_ops8 ( xdqix, pdhx(1), two, .true., pni, pni, 2 )
          call set_trig21( xdqix(1,1), xdqix(1,2), xdqix(1,3), xdqix(1,4),
     %                   xdqix(1,1), xdqix(1,2), xdqix(1,3),
     %                   1,1, pni, 1, .true. )
          call set_ops8 ( xdqiu, pdhxu(1), two, .true., pni, pni, 2 )
          call set_trig21( xdqiu(1,1), xdqiu(1,2), xdqiu(1,3), xdqiu(1,4),
     %                   xdqiu(1,1), xdqiu(1,2), xdqiu(1,3),
     %                   1,1, pni, 1, .true. )
C       THIS CODE NEEDS FURTHER CONSIDERATION DUE TO NEW SET_OPS8
C
C         call set_ops8 ( xdqiy, pdhy(1), two, .false., pnj, pnj, 2 )
C         xdqiy(1,2)    = xdqiy(1,2)   + pdhy(0) / three
C         xdqiy(pnj,2)  = xdqiy(pnj,2) + pdhy(pnj) / three
C         call set_trig21( xdqiy(1,1), xdqiy(1,2), xdqiy(1,3), xdqiy(1,4),
C    %                   xdqiy(1,1), xdqiy(1,2), xdqiy(1,3),
C    %                   1, 1, pnj, 1, .false. )
C         call set_ops8 ( xdqiv, xdhyv(1), two, .false., pnjv, pnj, 2 )
C         xdqiv(1,2)     = xdqiv(1,2)    + xdhyv(0) / three
C         xdqiv(pnjv,2)  = xdqiv(pnjv,2) + xdhyv(pnjv) / three
C         call set_trig21( xdqiv(1,1), xdqiv(1,2), xdqiv(1,3), xdqiv(1,4),
C    %                   xdqiv(1,1), xdqiv(1,2), xdqiv(1,3),
C    %                   1, 1, pnjv, 1, .false. )
        endif
*
*
*
*C       3.    e_setinuvl for efficient cubic lagrange interpolation
*              ---------------------------------------------------
*
        if ( e_Schm_stlag ) then
          call e_setinuvl
        endif
      call hpdeallc(p_pdhx, pnerr,1)
      call hpdeallc(p_pdhxu, pnerr,1)
      call hpdeallc(p_pdhy, pnerr,1)
*
*
 1001 format(
     %/'COMPUTE (U,V) INTERPOLATION COEFFICIENTS (S/R E_SETINTUV)',
     % /'======================================================='/)
 1200 format(
     %/'CUBIC SPLINES FOR COMPUTATION OF CORIOLIS TERMS OR RHU AND RHV
     % ARE NOT ALLOWED: ONLY CUBIC OF LAGRANGE ARE ALLOWED'/)
 1300 format(
     %/'ONLY CUBIC OF LAGRANGE ARE ALLOWED'/)
*
*     ---------------------------------------------------------------
*
      return
      end