!-------------------------------------- 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 nlip_2_tl - TLM of nlip_2 
*
#include "model_macros_f.h"
*

      subroutine nlip_2_tl ( F_nu,    F_nv,    F_n1,   F_nth,   F_n3,   F_n3p,  1,1
     $                       F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0,
     $                       F_ncn,   F_st0,   F_qt0,  F_fipt0, F_fis,
     $                       F_ut0,   F_vt0,   F_mut0 ,F_multx,
     $                       F_wijk1, F_wijk2,
*
     $                       F_num,   F_nvm,   F_n1m,  F_nthm,  F_n3m, F_n3pm,  
     $                       F_rhelnm,F_rhellm,F_tpt0m,F_tplt0m,F_pipt0m, 
     $                       F_ncnm,  F_st0m,  F_qt0m, F_fipt0m,  
     $                       F_ut0m,  F_vt0m,  F_mut0m,F_multxm, 
     $                       F_wijk1m,F_wijk2m,
*
     $                       DIST_DIM, Nk )
*
      implicit none
*
      integer DIST_DIM, Nk
      real    F_nu   (DIST_SHAPE,Nk), F_nv   (DIST_SHAPE,Nk),
     %        F_n1   (DIST_SHAPE,Nk), F_nth  (DIST_SHAPE,Nk),
     %        F_n3   (DIST_SHAPE,Nk), F_n3p  (DIST_SHAPE,Nk),
     %        F_rheln(DIST_SHAPE,Nk), F_rhell(DIST_SHAPE,Nk),
     %        F_tpt0 (DIST_SHAPE,Nk), F_tplt0(DIST_SHAPE,Nk),
     %        F_pipt0(DIST_SHAPE,Nk), F_ncn  (DIST_SHAPE,Nk),
     %        F_st0  (DIST_SHAPE)   , F_qt0  (DIST_SHAPE,Nk),
     %        F_fipt0(DIST_SHAPE,Nk), F_fis  (DIST_SHAPE)   ,
     %        F_ut0  (DIST_SHAPE,Nk), F_vt0  (DIST_SHAPE,Nk),
     %        F_mut0 (DIST_SHAPE,Nk), F_multx(DIST_SHAPE,Nk), 
     %        F_wijk1(DIST_SHAPE,Nk), F_wijk2(DIST_SHAPE,Nk)
*
      real    F_num   (DIST_SHAPE,Nk), F_nvm   (DIST_SHAPE,Nk),
     %        F_n1m   (DIST_SHAPE,Nk), F_nthm  (DIST_SHAPE,Nk),
     %        F_n3m   (DIST_SHAPE,Nk), F_n3pm  (DIST_SHAPE,Nk),
     %        F_rhelnm(DIST_SHAPE,Nk), F_rhellm(DIST_SHAPE,Nk),
     %        F_tpt0m (DIST_SHAPE,Nk), F_tplt0m(DIST_SHAPE,Nk),
     %        F_pipt0m(DIST_SHAPE,Nk), F_ncnm  (DIST_SHAPE,Nk), 
     %        F_st0m  (DIST_SHAPE)   , F_qt0m  (DIST_SHAPE,Nk),
     %        F_fipt0m(DIST_SHAPE,Nk), 
     %        F_ut0m  (DIST_SHAPE,Nk), F_vt0m  (DIST_SHAPE,Nk),
     %        F_mut0m (DIST_SHAPE,Nk), F_multxm(DIST_SHAPE,Nk), 
     %        F_wijk1m(DIST_SHAPE,Nk), F_wijk2m(DIST_SHAPE,Nk)
*
*
*author
*     M.Tanguay
*
*revision
* v2_10 - Tanguay M.        - initial MPI version
* v2_30 - Edouard S.        - remove pi' at the top (pptt0)
* v2_31 - Tanguay M.        - adapt for vertical hybrid coordinate and LAM version
* v3_00 - Tanguay M.        - adapt to restructured nlip_2 
* v3_03 - Tanguay M.        - Adjoint Lam and NoHyd configuration 
* v3_11 - Tanguay M.        - AIXport+Opti+OpenMP for TLM-ADJ
*
*object
*     see id section 
*     --------------------------------------------------------
*     REMARK: INPUT TRAJ:F_tpt0m,  F_pipt0m, F_qt0m, F_st0m
*                        F_tplt0m, F_ut0m,   F_vt0m, F_rhellm
*                        F_fipt0m, F_mut0m,  F_multxm (NoHyd)
*     --------------------------------------------------------
*
*arguments
*     see documentation of appropriate comdecks
*
*implicits
#include "glb_ld.cdk"
*
      integer i01, in1, j01, jn1, nij, i02, in2, j02, jn2
*
*     Prepare the nonlinear perturbation q" of log hydro pressure
*     and the "relative" geopotential ( phi' + phis ) for gradient
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      i01=1
      in1=l_ni
      j01=1
      jn1=l_nj
      i02=1
      in2=l_ni
      j02=1
      jn2=l_nj
      if (G_lam) then
          if (l_west) i01=1+pil_w -1
          if (l_east) in1=l_ni-pil_e +1
          if (l_south)j01=1+pil_s -1
          if (l_north)jn1=l_nj-pil_n +1
          if (l_west) i02=1+pil_w
          if (l_east) in2=l_ni-pil_e
          if (l_south)j02=1+pil_s
          if (l_north)jn2=l_nj-pil_n
      endif
*
      call nlip_2_2_tl     ( F_nu,    F_nv,    F_n1,   F_nth,   F_n3,   F_n3p, 
     $                       F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0,
     $                       F_ncn,   F_st0,   F_qt0,  F_fipt0, F_fis,
     $                       F_ut0,   F_vt0,   F_mut0 ,F_multx,
     $                       F_wijk1, F_wijk2,
*
     $                       F_num,   F_nvm,   F_n1m,  F_nthm,  F_n3m, F_n3pm,  
     $                       F_rhelnm,F_rhellm,F_tpt0m,F_tplt0m,F_pipt0m, 
     $                       F_ncnm,  F_st0m,  F_qt0m, F_fipt0m,  
     $                       F_ut0m,  F_vt0m,  F_mut0m,F_multxm, 
     $                       F_wijk1m,F_wijk2m,
*
     $                       DIST_DIM, Nk,
     $                       i01,j01,in1,jn1,i02,j02,in2,jn2 )
*
      return
      end
*
! 2nd stage added for OpenMP
*

      subroutine nlip_2_2_tl ( F_nu,    F_nv,    F_n1,   F_nth,   F_n3,   F_n3p, 1,2
     $                         F_rheln, F_rhell, F_tpt0, F_tplt0, F_pipt0,
     $                         F_ncn,   F_st0,   F_qt0,  F_fipt0, F_fis,
     $                         F_ut0,   F_vt0,   F_mut0 ,F_multx,
     $                         F_wijk1, F_wijk2,
*
     $                         F_num,   F_nvm,   F_n1m,  F_nthm,  F_n3m, F_n3pm,
     $                         F_rhelnm,F_rhellm,F_tpt0m,F_tplt0m,F_pipt0m,
     $                         F_ncnm,  F_st0m,  F_qt0m, F_fipt0m,
     $                         F_ut0m,  F_vt0m,  F_mut0m,F_multxm,
     $                         F_wijk1m,F_wijk2m,
*
     $                         DIST_DIM, Nk,
     $                         i01,j01,in1,jn1,i02,j02,in2,jn2 )
*
      implicit none
*
      integer DIST_DIM, Nk, i01,j01,in1,jn1,i02,j02,in2,jn2 
      real    F_nu   (DIST_SHAPE,Nk), F_nv   (DIST_SHAPE,Nk),
     %        F_n1   (DIST_SHAPE,Nk), F_nth  (DIST_SHAPE,Nk),
     %        F_n3   (DIST_SHAPE,Nk), F_n3p  (DIST_SHAPE,Nk),
     %        F_rheln(DIST_SHAPE,Nk), F_rhell(DIST_SHAPE,Nk),
     %        F_tpt0 (DIST_SHAPE,Nk), F_tplt0(DIST_SHAPE,Nk),
     %        F_pipt0(DIST_SHAPE,Nk), F_ncn  (DIST_SHAPE,Nk),
     %        F_st0  (DIST_SHAPE)   , F_qt0  (DIST_SHAPE,Nk),
     %        F_fipt0(DIST_SHAPE,Nk), F_fis  (DIST_SHAPE)   ,
     %        F_ut0  (DIST_SHAPE,Nk), F_vt0  (DIST_SHAPE,Nk),
     %        F_mut0 (DIST_SHAPE,Nk), F_multx(DIST_SHAPE,Nk), 
     %        F_wijk1(DIST_SHAPE,Nk), F_wijk2(DIST_SHAPE,Nk)
*
      real    F_num   (DIST_SHAPE,Nk), F_nvm   (DIST_SHAPE,Nk),
     %        F_n1m   (DIST_SHAPE,Nk), F_nthm  (DIST_SHAPE,Nk),
     %        F_n3m   (DIST_SHAPE,Nk), F_n3pm  (DIST_SHAPE,Nk),
     %        F_rhelnm(DIST_SHAPE,Nk), F_rhellm(DIST_SHAPE,Nk),
     %        F_tpt0m (DIST_SHAPE,Nk), F_tplt0m(DIST_SHAPE,Nk),
     %        F_pipt0m(DIST_SHAPE,Nk), F_ncnm  (DIST_SHAPE,Nk), 
     %        F_st0m  (DIST_SHAPE)   , F_qt0m  (DIST_SHAPE,Nk),
     %        F_fipt0m(DIST_SHAPE,Nk), 
     %        F_ut0m  (DIST_SHAPE,Nk), F_vt0m  (DIST_SHAPE,Nk),
     %        F_mut0m (DIST_SHAPE,Nk), F_multxm(DIST_SHAPE,Nk), 
     %        F_wijk1m(DIST_SHAPE,Nk), F_wijk2m(DIST_SHAPE,Nk)
*
*
*author
*     M.Tanguay
*
*revision
* v2_10 - Tanguay M.        - initial MPI version
* v2_30 - Edouard S.        - remove pi' at the top (pptt0)
* v2_31 - Tanguay M.        - adapt for vertical hybrid coordinate and LAM version
* v3_00 - Tanguay M.        - adapt to restructured nlip_2 
* v3_03 - Tanguay M.        - Adjoint Lam and NoHyd configuration 
* v3_11 - Tanguay M.        - AIXport+Opti+OpenMP for TLM-ADJ
* v3_21 - Tanguay M.        - Revision Openmp
*
*object
*     see id section 
*     --------------------------------------------------------
*     REMARK: INPUT TRAJ:F_tpt0m,  F_pipt0m, F_qt0m, F_st0m
*                        F_tplt0m, F_ut0m,   F_vt0m, F_rhellm
*                        F_fipt0m, F_mut0m,  F_multxm (NoHyd)
*     --------------------------------------------------------
*
*arguments
*     see documentation of appropriate comdecks
*
*implicits
#include "glb_ld.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "geomg.cdk"
#include "cori.cdk"
#include "schm.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
#include "ptopo.cdk"
*
      integer i, j, k, i00, inn, j00, jnn, i0, in, j0, jn, nij
      real wk2(DIST_SHAPE), w1, w2, w3, q1
*
      real*8 ONE_8, HALF_8, QUARTER_8
      parameter ( ONE_8=1.0, HALF_8=.5, QUARTER_8=.25 )
*
      real*8 eps_8, gamma_8
      real*8 p1_8,p2_8,p3_8,p4_8,p5_8,p6_8,p7_8,t1_8,t2_8,t3_8,t4_8
*
      real*8 t1m_8
      real w1m,w2m,w3m,wk2m(DIST_SHAPE)
*
      real*8, dimension(i01:in1,j01:jn1) :: xlogm_8, ylogm_8, invm_8
      real*8, dimension(i02:in2,j02:jn2) :: yexp2m_8, xlog2m_8, ylog2m_8, inv2m_8
*
* --------------------------------------------------------------------
*
*     TRAJECTORY
*     ----------
      call rpn_comm_xch_halo( F_tpt0m ,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_qt0m  ,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      if (.not. Schm_hydro_L) then
        call rpn_comm_xch_halo( F_mut0m ,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
      if (Cori_cornl_L) then
        call rpn_comm_xch_halo( F_ut0m ,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
        call rpn_comm_xch_halo( F_vt0m ,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )

      endif
*
*     TLM
*     ---
      call rpn_comm_xch_halo( F_tpt0 , LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_qt0  , LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      if (.not. Schm_hydro_L) then
        call rpn_comm_xch_halo( F_mut0 ,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
*
      if (Cori_cornl_L) then
        call rpn_comm_xch_halo( F_ut0 ,LDIST_DIM,l_niu,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
        call rpn_comm_xch_halo( F_vt0 ,LDIST_DIM,l_ni,l_njv,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
*
      gamma_8 = ONE_8
      if (.not. Schm_hydro_L) then
           eps_8 =  Schm_nonhy_8 * Dcst_rgasd_8   * Cstv_tstr_8
     %           /( Dcst_cappa_8 * Dcst_grav_8**2 * Cstv_tau_8**2 )
         gamma_8 =  ONE_8/( ONE_8 + eps_8 )
      endif
      p1_8 = Dcst_rayt_8*Dcst_rayt_8
      p2_8 = ONE_8 / Cstv_tau_8
      p3_8 = ONE_8 / p1_8
      p4_8 = Dcst_rgasd_8 / p1_8
      p5_8 = ONE_8 / Cstv_tstr_8
      p6_8 = gamma_8 / Cstv_tau_8
      p7_8 = p6_8 / Dcst_cappa_8
*
      q1   = ONE_8 / Cstv_tau_8
*
!$omp parallel private(xlogm_8, ylogm_8, invm_8, 
!$omp$                 xlog2m_8,ylog2m_8,inv2m_8,
!$omp$                 i0,in,j0,jn,i00,j00,inn,jnn,
!$omp$                 wk2m,wk2,w1m,w2m,w3m,
!$omp$                 w1,w2,w3,t1_8,t2_8,t3_8,t4_8,t1m_8)
*
      i0=i01
      j0=j01
      in=in1
      jn=jn1
*
      nij = (in - i0 + 1)*(jn - j0 + 1)
*
!$omp do
      do k=1,l_nk
         t1_8 = ONE_8/Geomg_z_8(k)
*
         do j= j0, jn
            do i= i0, in
              xlogm_8(i,j) = ONE_8 + F_pipt0m(i,j,k)*t1_8
            end do
            call vlog (ylogm_8(i0,j), xlogm_8(i0,j), (in-i0+1))
            call vrec ( invm_8(i0,j), xlogm_8(i0,j), (in-i0+1))
         end do
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY 
*           ----------
            F_wijk1m(i,j,k) = ylogm_8(i,j) - ( Geomg_pib(k)* F_st0m(i,j) )*t1_8 
*
*           TLM
*           ---
            F_wijk1(i,j,k) = ( F_pipt0(i,j,k)*t1_8 ) * invm_8(i,j) - ( Geomg_pib(k) * F_st0(i,j) )*t1_8 
*
         enddo
         enddo
         if (.not. Schm_hydro_L) then
         do j= j0, jn
         do i= i0, in
*           TRAJECTORY 
*           ----------
            F_wijk2m(i,j,k)= F_fipt0m(i,j,k) + F_fis(i,j)
*
*           TLM 
*           ---
            F_wijk2(i,j,k) = F_fipt0 (i,j,k) 
         enddo
         enddo
         endif
*
      enddo
!$omp enddo

************************************************************
* The nonlinear deviation of horizontal momentum equations *
************************************************************
*
!$omp single 
*
*     TRAJECTORY
*     ----------
      call rpn_comm_xch_halo( F_wijk1m,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      if (.not. Schm_hydro_L) then
        call rpn_comm_xch_halo( F_wijk2m,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
*
*     TLM
*     ---
      call rpn_comm_xch_halo( F_wijk1, LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      if (.not. Schm_hydro_L) then
        call rpn_comm_xch_halo( F_wijk2,LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif
*
!$omp end single 
*
!$omp do
      do 100 k=1,l_nk
*
*     Compute Nu for hydrostatic version 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      i0 = 1
      in = l_niu
      j0 = 1+pil_s
      jn = l_nj-pil_n
      if (G_lam) then
         if (l_west) i0=1+pil_w
         if (l_east) in=l_niu-pil_e
      endif
*
      do j= j0, jn
      do i= i0, in
*
*        TRAJECTORY
*        ----------
         w1m = ( 1. - intuv_c0xxu_8(i) ) * F_tpt0m(i  ,j,k) 
     %              + intuv_c0xxu_8(i)   * F_tpt0m(i+1,j,k)
         w2m = (   F_qt0m(i+1,j,k) -   F_qt0m(i,j,k) ) * Geomg_invhx_8(i) 
         w3m = ( F_wijk1m(i+1,j,k) - F_wijk1m(i,j,k) ) * Geomg_invhx_8(i) 
         F_num(i,j,k) = p4_8 * ( w1m*w2m + Cstv_tstr_8*w3m )
*
*        TLM 
*        ---
         w1 = ( 1. - intuv_c0xxu_8(i) ) * F_tpt0(i  ,j,k)
     %             + intuv_c0xxu_8(i)   * F_tpt0(i+1,j,k)
         w2 = (   F_qt0(i+1,j,k) -   F_qt0(i,j,k) ) * Geomg_invhx_8(i) 
         w3 = ( F_wijk1(i+1,j,k) - F_wijk1(i,j,k) ) * Geomg_invhx_8(i) 
         F_nu(i,j,k) = p4_8 * ( w1m*w2 + w1*w2m + Cstv_tstr_8*w3 )
*
      end do
      end do
*
      if (Cori_cornl_L) then
*        Set indices for calculating wk2
         i00 = minx
         inn = maxx
         j00 = 1+pil_s
         jnn = l_njv
         if (G_lam) then
             if (l_west) i00 = 1+pil_w -2
             if (l_east) inn = l_niu-pil_e +3
             if (l_north)jnn = l_njv-pil_n +1
         else
             if (l_south) j00 = 3
             if (l_north) jnn = l_njv-1
         endif
*
         do j = j00, jnn
         do i = i00, inn
*           TRAJECTORY
*           ----------
            wk2m(i,j) = inuvl_wyvy3_8(j,1) * F_vt0m(i,j-2,k) 
     %                + inuvl_wyvy3_8(j,2) * F_vt0m(i,j-1,k) 
     %                + inuvl_wyvy3_8(j,3) * F_vt0m(i,j  ,k) 
     %                + inuvl_wyvy3_8(j,4) * F_vt0m(i,j+1,k)          
*           TLM 
*           ---
            wk2(i,j)  = inuvl_wyvy3_8(j,1) * F_vt0(i,j-2,k) 
     %                + inuvl_wyvy3_8(j,2) * F_vt0(i,j-1,k) 
     %                + inuvl_wyvy3_8(j,3) * F_vt0(i,j  ,k) 
     %                + inuvl_wyvy3_8(j,4) * F_vt0(i,j+1,k)          
         end do
         end do
*
         if (.not.G_lam) then 
            if (l_south) then
               do i = i00, inn
*
*                 TRAJECTORY
*                 ----------
                  wk2m(i,j00-2)= inuvl_wyvy3_8(j00-2,3)*F_vt0m(i,j00-2,k) 
     %                         + inuvl_wyvy3_8(j00-2,4)*F_vt0m(i,j00-1,k) 
                  wk2m(i,j00-1)= inuvl_wyvy3_8(j00-1,2)*F_vt0m(i,j00-2,k) 
     %                         + inuvl_wyvy3_8(j00-1,3)*F_vt0m(i,j00-1,k) 
     %                         + inuvl_wyvy3_8(j00-1,4)*F_vt0m(i,j00  ,k) 
*                 TLM 
*                 ---
                  wk2(i,j00-2)= inuvl_wyvy3_8(j00-2,3)*F_vt0(i,j00-2,k) 
     %                        + inuvl_wyvy3_8(j00-2,4)*F_vt0(i,j00-1,k) 
                  wk2(i,j00-1)= inuvl_wyvy3_8(j00-1,2)*F_vt0(i,j00-2,k) 
     %                        + inuvl_wyvy3_8(j00-1,3)*F_vt0(i,j00-1,k) 
     %                        + inuvl_wyvy3_8(j00-1,4)*F_vt0(i,j00  ,k) 
               end do
            endif
            if (l_north) then
               do i = i00, inn
*                 TRAJECTORY
*                 ----------
                  wk2m(i,jnn+2)= inuvl_wyvy3_8(jnn+2,1)*F_vt0m(i,jnn  ,k) 
     %                        +  inuvl_wyvy3_8(jnn+2,2)*F_vt0m(i,jnn+1,k) 
                  wk2m(i,jnn+1)= inuvl_wyvy3_8(jnn+1,1)*F_vt0m(i,jnn-1,k) 
     %                        +  inuvl_wyvy3_8(jnn+1,2)*F_vt0m(i,jnn  ,k) 
     %                        +  inuvl_wyvy3_8(jnn+1,3)*F_vt0m(i,jnn+1,k) 
*                 TLM
*                 ---
                  wk2(i,jnn+2)= inuvl_wyvy3_8(jnn+2,1)*F_vt0(i,jnn  ,k)
     %                        + inuvl_wyvy3_8(jnn+2,2)*F_vt0(i,jnn+1,k)
                  wk2(i,jnn+1)= inuvl_wyvy3_8(jnn+1,1)*F_vt0(i,jnn-1,k)
     %                        + inuvl_wyvy3_8(jnn+1,2)*F_vt0(i,jnn  ,k)
     %                        + inuvl_wyvy3_8(jnn+1,3)*F_vt0(i,jnn+1,k)
               end do
            endif
         endif
*
         do j= j0, jn
         do i= i0, in
*           TRAJECTORY
*           ----------
            F_num(i,j,k) = F_num(i,j,k) - Cori_fcoru_8(i,j) *
     %     (inuvl_wxxu3_8(i,1)*wk2m(i-1,j)+inuvl_wxxu3_8(i,2)*wk2m(i  ,j)
     %    + inuvl_wxxu3_8(i,3)*wk2m(i+1,j)+inuvl_wxxu3_8(i,4)*wk2m(i+2,j))
*
*           TLM 
*           ---
            F_nu(i,j,k) = F_nu(i,j,k) - Cori_fcoru_8(i,j) *
     %     (inuvl_wxxu3_8(i,1)*wk2(i-1,j)+inuvl_wxxu3_8(i,2)*wk2(i  ,j)
     %    + inuvl_wxxu3_8(i,3)*wk2(i+1,j)+inuvl_wxxu3_8(i,4)*wk2(i+2,j))
         end do
         end do
      endif
*
*     Compute Nv for hydrostatic version
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      i0 = 1+pil_w
      in = l_ni-pil_e
      j0 = 1
      jn = l_njv
      if (G_lam) then
         if (l_south) j0=1+pil_s
         if (l_north) jn=l_njv-pil_n
      endif
      do j= j0, jn
      t1_8 = Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
      do i= i0, in
*
*        TRAJECTORY
*        ----------
         w1m = ( 1. - intuv_c0yyv_8(j) ) * F_tpt0m(i,j  ,k) 
     %              + intuv_c0yyv_8(j)   * F_tpt0m(i,j+1,k)
         w2m = (F_qt0m  (i,j+1,k) - F_qt0m(i,j,k)) * t1_8
         w3m = (F_wijk1m(i,j+1,k)-F_wijk1m(i,j,k)) * t1_8
         F_nvm(i,j,k) = p4_8 * ( w1m*w2m + Cstv_tstr_8*w3m )
*
*        TLM
*        ---
         w1 = ( 1. - intuv_c0yyv_8(j) ) * F_tpt0(i,j  ,k)
     %             + intuv_c0yyv_8(j)   * F_tpt0(i,j+1,k)
         w2 = (F_qt0  (i,j+1,k) - F_qt0(i,j,k)) * t1_8
         w3 = (F_wijk1(i,j+1,k)-F_wijk1(i,j,k)) * t1_8
         F_nv(i,j,k) = p4_8 * ( w1m*w2 + w1*w2m + Cstv_tstr_8*w3 )
*
      end do
      end do
*
      if (Cori_cornl_L) then
*        Set indices for calculating wk2
         j00 = miny
         jnn = maxy
         i00 = 1+pil_w
         inn = l_niu
         if (G_lam) then
            if (l_south) j00=1+pil_s-2
            if (l_north) jnn=l_njv-pil_n+3
            if (l_east) inn = l_niu-pil_e +1
         endif
*
         do j = j00, jnn
         do i = i00, inn
*           TRAJECTORY
*           ----------
            wk2m(i,j)  = inuvl_wxux3_8(i,1)*F_ut0m(i-2,j,k) 
     %                 + inuvl_wxux3_8(i,2)*F_ut0m(i-1,j,k) 
     %                 + inuvl_wxux3_8(i,3)*F_ut0m(i  ,j,k) 
     %                 + inuvl_wxux3_8(i,4)*F_ut0m(i+1,j,k) 
*
*           TLM 
*           ---
            wk2(i,j)  = inuvl_wxux3_8(i,1)*F_ut0(i-2,j,k)
     %                + inuvl_wxux3_8(i,2)*F_ut0(i-1,j,k)
     %                + inuvl_wxux3_8(i,3)*F_ut0(i  ,j,k)
     %                + inuvl_wxux3_8(i,4)*F_ut0(i+1,j,k)
         end do
         end do
*
*        Set indices for calculating Nv
         if (.not.G_lam) then
            if (l_south) j0 = 2
            if (l_north) jn = l_njv-1
         endif
         do j = j0, jn
         do i = i0, in
*           TRAJECTORY
*           ----------
            F_nvm(i,j,k) =   F_nvm(i,j,k) + Cori_fcorv_8(i,j) *
     %     (inuvl_wyyv3_8(j,1)*wk2m(i,j-1)+inuvl_wyyv3_8(j,2)*wk2m(i,j  )
     %    + inuvl_wyyv3_8(j,3)*wk2m(i,j+1)+inuvl_wyyv3_8(j,4)*wk2m(i,j+2))
*
*           TLM 
*           ---
            F_nv(i,j,k) =   F_nv(i,j,k) + Cori_fcorv_8(i,j) *
     %     (inuvl_wyyv3_8(j,1)*wk2(i,j-1)+inuvl_wyyv3_8(j,2)*wk2(i,j  )
     %    + inuvl_wyyv3_8(j,3)*wk2(i,j+1)+inuvl_wyyv3_8(j,4)*wk2(i,j+2))
         end do
         end do
*
         if (.not.G_lam) then
            if (l_south) then
               do i = i0, in
*                 TRAJECTORY
*                 ----------
                  F_nvm(i,1,k)= F_nvm(i,1,k) + Cori_fcorv_8(i,1)
     %       * (inuvl_wyyv3_8(1,2)*wk2m(i,1)+inuvl_wyyv3_8(1,3)*wk2m(i,2) 
     %                                      +inuvl_wyyv3_8(1,4)*wk2m(i,3))
*
*                 TLM 
*                 ---
                  F_nv(i,1,k) = F_nv(i,1,k) + Cori_fcorv_8(i,1)
     %       * (inuvl_wyyv3_8(1,2)*wk2(i,1)+inuvl_wyyv3_8(1,3)*wk2(i,2)
     %                                     +inuvl_wyyv3_8(1,4)*wk2(i,3))
               end do 
            endif 
*
            if (l_north) then
               do i = i0, in
*               TRAJECTORY
*               ----------
                F_nvm(i,l_njv,k)=F_nvm(i,l_njv,k)+Cori_fcorv_8(i,l_njv) *
     %         (   inuvl_wyyv3_8(l_njv,1)*wk2m(i,l_njv-1) 
     %           + inuvl_wyyv3_8(l_njv,2)*wk2m(i,l_njv  ) 
     %           + inuvl_wyyv3_8(l_njv,3)*wk2m(i,l_njv+1) )
*
*               TLM 
*               ---
                F_nv(i,l_njv,k)=F_nv(i,l_njv,k)+Cori_fcorv_8(i,l_njv) *
     %         (   inuvl_wyyv3_8(l_njv,1)*wk2(i,l_njv-1)
     %           + inuvl_wyyv3_8(l_njv,2)*wk2(i,l_njv  )
     %           + inuvl_wyyv3_8(l_njv,3)*wk2(i,l_njv+1) )
               end do 
            endif 
         endif
      endif
*
      if (.not. Schm_hydro_L) then
*
         i0 = 1
         in = l_niu
         j0 = 1+pil_s
         jn = l_nj-pil_n
         if (G_lam) then
             if (l_west) i0 = 1+pil_w
             if (l_east) in = l_niu-pil_e
         endif
         i00 = 1+pil_w
         inn = l_ni-pil_e
         j00 = 1
         jnn = l_njv
         if (G_lam) then
             if (l_south) j00 = 1+pil_s
             if (l_north) jnn = l_njv-pil_n
         endif
*
*        Add nonhydrostatic contributions to Nu 
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            w1m = ( 1. - intuv_c0xxu_8(i) ) * F_mut0m(i  ,j,k)
     %                 + intuv_c0xxu_8(i)   * F_mut0m(i+1,j,k)
            w2m = ( F_wijk2m(i+1,j,k) -F_wijk2m (i,j,k) ) * Geomg_invhx_8(i)
            F_num(i,j,k) = F_num(i,j,k) + p3_8*w1m*w2m
*
*           TLM 
*           ---
            w1 = ( 1. - intuv_c0xxu_8(i) ) * F_mut0(i  ,j,k)
     %                + intuv_c0xxu_8(i)   * F_mut0(i+1,j,k)
            w2 = ( F_wijk2(i+1,j,k) -F_wijk2 (i,j,k) ) * Geomg_invhx_8(i)
            F_nu(i,j,k) = F_nu(i,j,k) + p3_8*(w1m*w2 + w1*w2m)
*
         end do
         end do
*
*        Add nonhydrostatic contributions to Nv
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         do j= j00, jnn
         do i= i00, inn
*
*           TRAJECTORY
*           ----------
            w1m = ( 1. - intuv_c0yyv_8(j) ) * F_mut0m(i,j  ,k)
     %                 + intuv_c0yyv_8(j)   * F_mut0m(i,j+1,k)
            w2m = (F_wijk2m (i,j+1,k) - F_wijk2m(i,j,k) )
     %            *Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
            F_nvm(i,j,k) = F_nvm(i,j,k) + p3_8*w1m*w2m
*
*           TLM 
*           ---
            w1 = ( 1. - intuv_c0yyv_8(j) ) * F_mut0(i,j  ,k)
     %                + intuv_c0yyv_8(j)   * F_mut0(i,j+1,k)
            w2 = (F_wijk2 (i,j+1,k) - F_wijk2(i,j,k) )
     %            *Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
            F_nv(i,j,k) = F_nv(i,j,k) + p3_8*(w1m*w2 + w1*w2m)
         end do
         end do

      endif
*
      if (k.eq.1) then
         i0=1
         in=l_ni
         j0=1
         jn=l_nj
         if (G_lam) then
            if (l_west)  i0 = 1+pil_w
            if (l_east)  in = l_ni-pil_e
            if (l_south) j0 = 1+pil_s
            if (l_north) jn = l_nj-pil_n
         endif
         nij = (in - i0 +1)*(jn - j0 +1)
         do j = j0, jn
            do i = i0, in
               yexp2m_8(i,j) = F_st0m(i,j)
            end do
            call vexp ( yexp2m_8(i0,j), yexp2m_8(i0,j), (in-i0+1) )
         end do
      endif
*
 100   continue
!$omp enddo

* For LAM, set  Nu,Nv values on the boundaries of the LAM grid
*
      if (G_lam) then
         if (l_west) then
!$omp do
             do k=1,l_nk
             do j=1+pil_s,l_nj-pil_n
*
*               TRAJECTORY 
*               ----------
                F_num(pil_w,j,k) = 0.
*
*               TLM
*               ---
                F_nu(pil_w,j,k) = 0.
             end do
             enddo
!$omp enddo
         endif
         if (l_east) then
!$omp do
            do k=1,l_nk
            do j=1+pil_s,l_nj-pil_n
*
*              TRAJECTORY 
*              ----------
               F_num(l_ni-pil_e,j,k) = 0.
*
*              TLM
*              ---
               F_nu(l_ni-pil_e,j,k) = 0.
            end do
            enddo
!$omp enddo
         endif
         if (l_south) then
!$omp do
            do k=1,l_nk
            do i=1+pil_w,l_ni-pil_e
*
*              TRAJECTORY 
*              ----------
               F_nvm(i,pil_s,k) = 0.
*
*              TLM
*              ---
               F_nv(i,pil_s,k) = 0.
            end do
            enddo
!$omp enddo
         endif
         if (l_north) then
!$omp do
            do k=1,l_nk
            do i=1+pil_w,l_ni-pil_e
*
*              TRAJECTORY 
*              ----------
               F_nvm(i,l_nj-pil_n,k) = 0.
*
*              TLM
*              ---
               F_nv(i,l_nj-pil_n,k) = 0.
            end do
            enddo
!$omp enddo
         endif
      endif
*
      i0=1
      in=l_ni
      j0=1
      jn=l_nj
      if (G_lam) then
         if (l_west)  i0 = 1+pil_w
         if (l_east)  in = l_ni-pil_e
         if (l_south) j0 = 1+pil_s
         if (l_north) jn = l_nj-pil_n
      endif
*
      nij = (in - i0 +1)*(jn - j0 +1)
*
**************************************
* Combination of governing equations * 
**************************************
*
*     compute Ncn
*     ~~~~~~~~~~~
!$omp do
      do k =  1, l_nk
*
      do j = j0, jn
         do i = i0, in
            xlog2m_8(i,j) = 1. + Geomg_dpba(k) * (yexp2m_8(i,j) - 1.0)
         end do
         call vlog(ylog2m_8(i0,j), xlog2m_8(i0,j), (in-i0+1))
         call vrec( inv2m_8(i0,j), xlog2m_8(i0,j), (in-i0+1))
      end do
*
      do j = j0, jn
      do i = i0, in
*        TRAJECTORY
*        ----------
         w1m= ylog2m_8(i,j) 
         w2m= Geomg_dpib(k) * F_st0m(i,j)
         F_ncnm(i,j,k) = q1 * ( w1m - w2m )
*
*        TLM 
*        ---
         w1 = (     Geomg_dpba(k) * (yexp2m_8(i,j)*F_st0(i,j)) ) * inv2m_8(i,j)
         w2 = Geomg_dpib(k) * F_st0(i,j)
         F_ncn(i,j,k) = q1 * ( w1 - w2 )
      enddo
      enddo
*
      enddo
!$omp enddo
*
!$omp single
*
*     Compute the nonlinear deviation of horizontal divergence 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*     TRAJECTORY
*     ----------
      call rpn_comm_xch_halo( F_num, LDIST_DIM,l_niu,l_nj,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_nvm, LDIST_DIM,l_ni,l_njv,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
*     TLM 
*     ---
      call rpn_comm_xch_halo( F_nu, LDIST_DIM,l_niu,l_nj,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_nv, LDIST_DIM,l_ni,l_njv,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
!$omp end single
*
!$omp do
      do k=1,l_nk
*
         if (G_lam) then
             do j= j0,jn
             do i= i0,in
*
*               TRAJECTORY
*               ----------
                F_n1m(i,j,k) = (F_num(i,j,k) - F_num(i-1,j,k)) /( Geomg_cy2_8(j)*Geomg_hxu_8(i-1) ) 
     $               +         (F_nvm(i,j,k) - F_nvm(i,j-1,k)) * Geomg_invhsyv_8(j-1)
*
*               TLM
*               ---
                F_n1(i,j,k) =  (F_nu(i,j,k) - F_nu(i-1,j,k) )  /( Geomg_cy2_8(j)*Geomg_hxu_8(i-1) )
     $               +         (F_nv(i,j,k) - F_nv(i,j-1,k) )  * Geomg_invhsyv_8(j-1)
*
             end do
             end do
         else
*
*          TRAJECTORY
*          ----------
           call caldiv_2 ( F_n1m(minx,miny,k), F_num(minx,miny,k),
     $                       F_nvm(minx,miny,k), LDIST_DIM, 1 )
*
*          TLM 
*          ---
           call caldiv_2 ( F_n1(minx,miny,k), F_nu(minx,miny,k),
     $                       F_nv(minx,miny,k), LDIST_DIM, 1 )
         endif
*
         do j= j0, jn
            do i= i0, in
               xlog2m_8(i,j) = ONE_8+F_tpt0m(i,j,k)*p5_8
            end do
            call vlog ( ylog2m_8(i0,j), xlog2m_8(i0,j), (in-i0+1) )
            call vrec (  inv2m_8(i0,j), xlog2m_8(i0,j), (in-i0+1) )
         end do
*
         do j= j0, jn
         do i= i0, in
*
*             TRAJECTORY
*             ----------
                    t1m_8   = ylog2m_8(i,j)-F_tplt0m(i,j,k)*p5_8
              F_nthm(i,j,k) = (-Dcst_cappa_8*F_wijk1m(i,j,k)+t1m_8)*p2_8
              F_wijk1m(i,j,k) = F_n1m(i,j,k)- q1 * F_ncnm(i,j,k)
              F_wijk2m(i,j,k) = p7_8*F_nthm(i,j,k)
*
*             TLM
*             ---
                    t1_8   = (F_tpt0 (i,j,k)*p5_8) * inv2m_8(i,j)
     %                       -F_tplt0(i,j,k)*p5_8
              F_nth(i,j,k) =(-Dcst_cappa_8*F_wijk1(i,j,k)+t1_8)*p2_8
              F_wijk1(i,j,k) = F_n1(i,j,k)- q1 * F_ncn(i,j,k)
              F_wijk2(i,j,k) = p7_8*F_nth(i,j,k)
         end do
         end do
*
         if (.not. Schm_hydro_L) then
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            F_n3m (i,j,k) = ( F_multxm(i,j,k) - F_mut0m(i,j,k) )*p2_8
            F_n3pm(i,j,k) =  F_n3m(i,j,k) - eps_8*F_nthm(i,j,k)
            F_wijk1m(i,j,k) = F_wijk1m(i,j,k) +  p6_8*F_n3pm(i,j,k)
            F_wijk2m(i,j,k) = F_wijk2m(i,j,k) +  p7_8*F_n3m (i,j,k)
*
*           TLM 
*           ---
            F_n3 (i,j,k) = ( F_multx(i,j,k) - F_mut0(i,j,k) )*p2_8
            F_n3p(i,j,k) =  F_n3(i,j,k) - eps_8*F_nth(i,j,k)
            F_wijk1(i,j,k) = F_wijk1(i,j,k) +  p6_8*F_n3p(i,j,k)
            F_wijk2(i,j,k) = F_wijk2(i,j,k) +  p7_8*F_n3 (i,j,k)
         end do
         end do
         endif 
*
      end do
!$omp enddo
*
***********************************************
* The RHS of the nonlinear Helmholtz equation * 
***********************************************
*
!$omp do
      do 300 k=1,l_nk
*
      if ( k .eq. 1 ) then
*
         t1_8 = QUARTER_8*Geomg_hz_8(k)
         t3_8 = HALF_8*Geomg_z_8(k)
         t4_8 = HALF_8*Geomg_z_8(k+1)
*
         do j= j0, jn
         do i= i0, in
*           TRAJECTORY
*           ----------
            F_rhelnm(i,j,k) = p1_8 * (F_rhellm(i,j,k)
     $                      - t1_8 *( F_wijk1m(i,j,k) + F_wijk1m(i,j,k+1) )
     $                      + t3_8 *F_wijk2m(i,j,k)  + t4_8*F_wijk2m(i,j,k+1))
*
*           TLM 
*           ---
            F_rheln(i,j,k) = p1_8 * (F_rhell(i,j,k)
     $                     - t1_8 *( F_wijk1(i,j,k) + F_wijk1(i,j,k+1) )
     $                     + t3_8 *F_wijk2(i,j,k)  + t4_8*F_wijk2(i,j,k+1))
*
         end do
         end do
*
      elseif ( k .eq. l_nk ) then
*
         t1_8  = QUARTER_8*Geomg_hz_8(k-1)
         t3_8  = HALF_8*Geomg_z_8(k-1)
         t4_8  = HALF_8*Geomg_z_8(k)
*
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            F_rhelnm(i,j,k) = p1_8 * (F_rhellm(i,j,k)
     $                      - t1_8 *( F_wijk1m(i,j,k-1) + F_wijk1m(i,j,k) )
     $                      - t3_8 *F_wijk2m(i,j,k-1)  - t4_8*F_wijk2m(i,j,k))
*
*           TLM 
*           ---
            F_rheln(i,j,k) = p1_8 * (F_rhell(i,j,k)
     $                     - t1_8 *( F_wijk1(i,j,k-1) + F_wijk1(i,j,k) )
     $                     - t3_8 *F_wijk2(i,j,k-1)  - t4_8*F_wijk2(i,j,k))
         end do
         end do
*
      else
*
         t1_8 = QUARTER_8*Geomg_hz_8(k-1)
         t2_8 = QUARTER_8*Geomg_hz_8(k)
         t3_8 = HALF_8*Geomg_z_8(k-1)
         t4_8 = HALF_8*Geomg_z_8(k+1)
*
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            F_rhelnm(i,j,k) =  p1_8 * (F_rhellm(i,j,k)
     $                      -  t1_8 *( F_wijk1m(i,j,k-1) + F_wijk1m(i,j,k  ) )
     $                      -  t2_8 *( F_wijk1m(i,j,k  ) + F_wijk1m(i,j,k+1) )
     $                      -  t3_8 *F_wijk2m(i,j,k-1) + t4_8*F_wijk2m(i,j,k+1))
*
*           TLM 
*           ---
            F_rheln(i,j,k) =  p1_8 * (F_rhell(i,j,k)
     $                     -  t1_8 *( F_wijk1(i,j,k-1) + F_wijk1(i,j,k  ) )
     $                     -  t2_8 *( F_wijk1(i,j,k  ) + F_wijk1(i,j,k+1) )
     $                     -  t3_8 *F_wijk2(i,j,k-1) + t4_8*F_wijk2(i,j,k+1))
         end do
         end do
*
      endif
 300  continue
!$omp enddo
!$omp end parallel
*
*     __________________________________________________________________
*
      return
      end