!-------------------------------------- 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 v4d_irgdint_3_w - Cubic interpolation with wrap around 
*                        based on EZ_IRGDINT_3_W (Y.Chartier EZSCINT 2001)
*

      subroutine v4d_irgdint_3_w (zo,px,py,npts,ax,ay,cx,cy,zi,ni,j1,j2,nk) 7
*
#include "impnone.cdk"
*
      integer npts,ni,j1,j2,nk
      real zo(nk,npts),zi(ni,j1:j2,nk),
     %     px(npts),py(npts),ax(ni),ay(j1:j2),cx(ni,6),cy(j1:j2,6)
*
*author Tanguay M.
*
*revision
* v3_00 - Tanguay M.        - initial MPI version
*
*object
*  see id section
*
*arguments
* Name         I/O        Description
*----------------------------------------------------------------
* zo            O         Interpolated field at positions px,py
* px            I         Position x in INPUT grid
* py            I         Position y in INPUT grid
* npts          I         Number of positions in zo
* zi            I         Field on INPUT grid
* ax            I         X axe of INPUT grid
* ay            I         Y axe of INPUT grid
* cx            I         AX difference on INPUT grid
* cy            I         AY difference on INPUT grid
* ni            I         Dimension x in INPUT grid
* j1-j2         I         Dimension y in INPUT grid
* nk            I         Dimension z in INPUT grid
*----------------------------------------------------------------
*
      integer i,j,n,k,iplus1,iplus2,imoins1,
     %        tabplus1(ni),tabplus2(ni),tabmoins1(ni)
      real*8 a11_8,a12_8,a13_8,a14_8,a21_8,a22_8,a23_8,a24_8,
     %       a31_8,a32_8,a33_8,a34_8,a41_8,a42_8,a43_8,a44_8,
     %       b11_8,b12_8,b13_8,b14_8
*
      real*8 x1_8,x2_8,x3_8,x4_8,y1_8,y2_8,y3_8,y4_8,
     %       a1_8,a2_8,a3_8,a4_8,b1_8,b2_8,b3_8,b4_8,
     %       c1_8,c2_8,c3_8,c4_8,c5_8,c6_8,
     %       x_8,y_8
*
      real ax_ext(0:ni+2)
*
*     Definition of in-line functions
*     -------------------------------
      real fa,fa2,fa3,fa4
      real*8 z1_8,z2_8,z3_8,z4_8
*
         fa (a1_8,a2_8,a3_8,a4_8,x_8,x1_8,x2_8,x3_8)
     %      =a1_8+(x_8-x1_8)*(a2_8+(x_8-x2_8)*(a3_8+a4_8*(x_8-x3_8)))
*
         fa2(c1_8,a1_8,a2_8)
     %      =c1_8*(a2_8-a1_8)
*
         fa3(c1_8,c2_8,c3_8,a1_8,a2_8,a3_8)
     %      =c2_8*(c3_8*(a3_8-a2_8)-c1_8*(a2_8-a1_8))
*
         fa4(c1_8,c2_8,c3_8,c4_8,c5_8,c6_8,a1_8,a2_8,a3_8,a4_8)
     %      =c4_8*(c5_8*(c6_8*(a4_8-a3_8)
     %      -c3_8*(a3_8-a2_8))-c2_8*(c3_8*(a3_8-a2_8)-c1_8*(a2_8-a1_8)))
*
*     Define tables to restaure vectorization
*     ---------------------------------------
      do i=1,ni
         ax_ext(i) = ax(i)
      enddo
      ax_ext(0   ) = ax(ni)-360.0 
      ax_ext(ni+1) = ax( 1)+360.0
      ax_ext(ni+2) = ax( 2)+360.0
*
      do i=1,ni-1
         tabplus1(i) = i+1
      enddo
      tabplus1(ni) = 1
*
      do i=1,ni-2
         tabplus2(i) = i+2
      enddo
      tabplus2(ni-1) = 1
      tabplus2(ni  ) = 2 
*
      do i=2,ni
         tabmoins1(i) = i-1 
      enddo
      tabmoins1(1) = ni 
*
*     Interpolation
*     -------------
      do n=1,npts
      do k=1,nk
*
         i = min(ni,  max(1,   max(0,ifix(px(n)))))
         j = min(j2-2,max(j1+1,      ifix(py(n))))
*
         imoins1 = tabmoins1(i) 
         iplus1  = tabplus1 (i) 
         iplus2  = tabplus2 (i) 
*
         x1_8=ax_ext(i-1)
         x2_8=ax_ext(i  )
         x3_8=ax_ext(i+1)
         x4_8=ax_ext(i+2)
*
         y1_8=ay(j-1)
         y2_8=ay(j)
         y3_8=ay(j+1)
         y4_8=ay(j+2)
*
         x_8 = x2_8 + (x3_8-x2_8)*(px(n)-i)
         y_8 = ay(j) + (ay(j+1)-ay(j))*(py(n)-j)
*
*     interpolation row 1
*     -------------------
         z1_8=zi(imoins1,j-1,k)
         z2_8=zi(i,      j-1,k)
         z3_8=zi(iplus1, j-1,k)
         z4_8=zi(iplus2, j-1,k)
*
         a11_8 = z1_8
         a12_8 = fa2(dble(cx(i,1)),z1_8,z2_8)
         a13_8 = fa3(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),z1_8,z2_8,z3_8)
         a14_8 = fa4(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),
     %               dble(cx(i,4)),dble(cx(i,5)),dble(cx(i,6)),z1_8,z2_8,z3_8,z4_8)
         b1_8  = fa(a11_8,a12_8,a13_8,a14_8,x_8,x1_8,x2_8,x3_8)
*
*     interpolation row 2
*     -------------------
         z1_8=zi(imoins1,j,k)
         z2_8=zi(i,      j,k)
         z3_8=zi(iplus1, j,k)
         z4_8=zi(iplus2, j,k)
*
         a21_8 = z1_8
         a22_8 = fa2(dble(cx(i,1)),z1_8,z2_8)
         a23_8 = fa3(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),z1_8,z2_8,z3_8)
         a24_8 = fa4(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),
     %               dble(cx(i,4)),dble(cx(i,5)),dble(cx(i,6)),z1_8,z2_8,z3_8,z4_8)
         b2_8  = fa(a21_8,a22_8,a23_8,a24_8,x_8,x1_8,x2_8,x3_8)
*
*     interpolation row 3 
*     -------------------
         z1_8=zi(imoins1,j+1,k)
         z2_8=zi(i      ,j+1,k)
         z3_8=zi(iplus1, j+1,k)
         z4_8=zi(iplus2, j+1,k)
*
         a31_8 = z1_8
         a32_8 = fa2(dble(cx(i,1)),z1_8,z2_8)
         a33_8 = fa3(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),z1_8,z2_8,z3_8)
         a34_8 = fa4(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),dble(cx(i,4)),
     %               dble(cx(i,5)),dble(cx(i,6)),z1_8,z2_8,z3_8,z4_8)
         b3_8  = fa(a31_8,a32_8,a33_8,a34_8,x_8,x1_8,x2_8,x3_8)
*
*     interpolation row 4
*     -------------------
         z1_8=zi(imoins1,j+2,k)
         z2_8=zi(i,      j+2,k)
         z3_8=zi(iplus1, j+2,k)
         z4_8=zi(iplus2, j+2,k)
*
         a41_8 = z1_8
         a42_8 = fa2(dble(cx(i,1)),z1_8,z2_8)
         a43_8 = fa3(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),z1_8,z2_8,z3_8)
         a44_8 = fa4(dble(cx(i,1)),dble(cx(i,2)),dble(cx(i,3)),dble(cx(i,4)),
     %               dble(cx(i,5)),dble(cx(i,6)),z1_8,z2_8,z3_8,z4_8)
         b4_8  = fa(a41_8,a42_8,a43_8,a44_8,x_8,x1_8,x2_8,x3_8)
*
*     interpolation column
*     --------------------
         b11_8 = b1_8
         b12_8 = fa2(dble(cy(j,1)),b1_8,b2_8)
         b13_8 = fa3(dble(cy(j,1)),dble(cy(j,2)),dble(cy(j,3)),b1_8,b2_8,b3_8)
         b14_8 = fa4(dble(cy(j,1)),dble(cy(j,2)),dble(cy(j,3)),
     %               dble(cy(j,4)),dble(cy(j,5)),dble(cy(j,6)),b1_8,b2_8,b3_8,b4_8)
         zo(k,n) = fa(b11_8,b12_8,b13_8,b14_8,y_8,y1_8,y2_8,y3_8)
*
      end do
      end do
*
      return
      end