!-------------------------------------- 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 adw_polx_ad - ADJ of adw_polx 
*
#include "model_macros_f.h"
*

      subroutine adw_polx_ad ( F_field, F_xg, F_sud, 4
     %                         F_nic, F_halox, F_njc, F_haloy, F_nk )
*
#include "impnone.cdk"
*
      logical F_sud
*
      integer F_nic, F_halox, F_njc, F_haloy, F_nk
*
      real   F_field (-F_halox+1:F_nic+F_halox,
     %                -F_haloy+1:F_njc+F_haloy, F_nk)
      real*8 F_xg    (-F_halox+1:F_nic+F_halox)
*
*author
*     monique tanguay
*
*revision
* v2_31 - Tanguay M.        - initial MPI version
* v3_21 - Tanguay M.        - Revision Openmp
*
*language
*     fortran 77
*
*object
*     see id section
*
*ADJ of
*arguments
*______________________________________________________________________
*              |                                                 |     |
* NAME         | DESCRIPTION                                     | I/O |
*--------------|-------------------------------------------------|-----|
*              |                                                 |     |
* F_field      | field to treat                                  |  io |
* F_xg         | x coordinates of global grid                    |  i  |
* F_sud        | switch: .true.: pole extension is for south pole|  i  |
*              |        .false.: pole extension is for north pole|  i  |
*              |                                                 |     |
* F_nic        | number of points in x direction (advection grid)|  i  |
* F_njc        | number of points in y direction (advection grid)|  i  |
*              |                                                 |     |
* F_halox      | size of halo in x direction (advection grid)    |  i  |
* F_haloy      | size of halo in y direction (advection grid)    |  i  |
*              |                                                 |     |
* F_nk         | number of levels                                |  i  |
*______________|_________________________________________________|_____|
*
*implicits
#include "adw.cdk"
*
*modules
*     none
************************************************************************
      integer m, ns, nd, i, j, k
      real e(0:F_nic+49)
*
      real*8 ZERO_8
      parameter (ZERO_8=0.0)
*
*     TRAJECTORY (START)
*     ------------------
*
* Basic statement functions for cubic int. on a non-uniform mesh
*
      real triprd, delta, poly
      real*8 y_8, y1_8, y2_8, y3_8, y4_8
      real v1, v2, v3, v4
      triprd( y1_8, y2_8, y3_8, y4_8 ) = ( y1_8 - y2_8 ) * ( y1_8 - y3_8 ) * ( y1_8 - y4_8 )
*
* triprd is fully symmetric in y2, y3, y4.
* and hence delta is symmetric in y2, y3, y4.
*
      delta( y_8, y1_8, y2_8, y3_8, y4_8 ) = triprd(  y_8, y2_8, y3_8, y4_8 )
     %                           / triprd( y1_8, y2_8, y3_8, y4_8 )
*
* delta is a cubic in y which asumes the value 1.0 at y_8 = y1_8,
* and the value 0.0 for y_8 = y2_8, y3_8, y4_8.
* consequently a cubic which takes the values v1, v2, v3, v4 at
* y_8 = y1_8, y2_8, y3_8, y4_8, is
*
*
      poly( v1, v2, v3, v4, y_8, y1_8, y2_8, y3_8, y4_8 ) =
     %      v1 * delta( y_8, y1_8, y2_8, y3_8, y4_8 ) +
     %      v2 * delta( y_8, y2_8, y1_8, y3_8, y4_8 ) +
     %      v3 * delta( y_8, y3_8, y1_8, y2_8, y4_8 ) +
     %      v4 * delta( y_8, y4_8, y1_8, y2_8, y3_8 )
*
**
                   ns = F_njc
      if ( F_sud ) ns = 1
                   nd = F_njc+2
      if ( F_sud ) nd = -1
                   m  = F_nic + 1
*
*     TRAJECTORY (END)
*     ----------------
*
*     Zero adjoint variables
*     ----------------------
      do i = 1,(F_nic+50)
         e(i-1)  = 0.0
      enddo
*
!$omp do
      do k = F_nk,1,-1
*
         do i = F_halox,1,-1
            F_field(F_nic+1-i,nd,k) = F_field(    1-i,nd,k) + F_field(F_nic+1-i,nd,k)
            F_field(      1-i,nd,k) = ZERO_8 
            F_field(        i,nd,k) = F_field(F_nic+i,nd,k) + F_field(        i,nd,k)
            F_field(F_nic+  i,nd,k) = ZERO_8 
         enddo
*
*        ADJ of
*        ----------------------------------------------------------------
*        do i=1,F_nic
*           j = Adw_iln(i)
*           F_field(i,nd,k) = poly(e(j-1),e(j),e(j+1),e(j+2),Adw_lnr_8(i),
*    %                          F_xg(j-1),F_xg(j),F_xg(j+1),F_xg(j+2))
*        enddo
*        ----------------------------------------------------------------
         do i=F_nic,1,-1
            j = Adw_iln(i)
*
            y_8  = Adw_lnr_8(i)
            y1_8 = F_xg(j-1)
            y2_8 = F_xg(j)
            y3_8 = F_xg(j+1)
            y4_8 = F_xg(j+2)
*
            e(j+2)    = F_field(i,nd,k) * delta( y_8, y4_8, y1_8, y2_8, y3_8 ) + e(j+2)
            e(j+1)    = F_field(i,nd,k) * delta( y_8, y3_8, y1_8, y2_8, y4_8 ) + e(j+1)
            e(j)      = F_field(i,nd,k) * delta( y_8, y2_8, y1_8, y3_8, y4_8 ) + e(j)
            e(j-1)    = F_field(i,nd,k) * delta( y_8, y1_8, y2_8, y3_8, y4_8 ) + e(j-1)
            F_field(i,nd,k) = ZERO_8 
*
         enddo
*
         do i=F_nic,1,-1
            F_field(i,ns,k) = e(i) + F_field(i,ns,k)
                  e(i)      = ZERO_8 
         enddo
*
         F_field(2,     ns, k) = e(m+1) + F_field(2,     ns, k)
         e(m+1)                = ZERO_8 
         F_field(1,     ns, k) = e(m)   + F_field(1,     ns, k)
         e(m)                  = ZERO_8 
         F_field(F_nic, ns, k) = e(0)   + F_field(F_nic, ns, k)
         e(0)                  = ZERO_8 
*     
      enddo
!$omp enddo
*
      return
      end