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

      subroutine rhsp_2_tl ( F_ru,   F_rv,   F_rcn,  F_rth,  F_rw,      F_rvv, 1
     %                       F_oru,  F_orv,  F_orcn, F_orth, F_orw,     F_orvv,
     %                       F_ruw1, F_rvw1, F_u,    F_v,    F_t,       F_q, 
     %                       F_fi,   F_s,    F_td,   F_psd,  F_nest_u,  F_nest_v,  
     %                       F_w,    F_fis,  F_fip,  F_mu,
*
     %                       F_rum,  F_rvm,  F_rcnm, F_rthm, F_rwm,     F_rvvm,
     %                       F_orum, F_orvm, F_orcnm,F_orthm,F_orwm,    F_orvvm,
     %                       F_ruw1m,F_rvw1m,F_um,   F_vm,   F_tm,      F_qm,
     %                       F_fim,  F_sm,   F_tdm,  F_psdm, F_nestm_um,F_nestm_vm, 
     %                       F_wm,           F_fipm, F_mum,
*
     %                       DIST_DIM, Nk )
*
      implicit none
*
      integer DIST_DIM, Nk
*
      real F_ru    (DIST_SHAPE,Nk), F_rv    (DIST_SHAPE,Nk),
     %     F_rcn   (DIST_SHAPE,Nk), F_rth   (DIST_SHAPE,Nk),
     %     F_rw    (DIST_SHAPE,Nk), F_rvv   (DIST_SHAPE,Nk),
     %     F_oru   (DIST_SHAPE,Nk), F_orv   (DIST_SHAPE,Nk),
     %     F_orcn  (DIST_SHAPE,Nk), F_orth  (DIST_SHAPE,Nk),
     %     F_orw   (DIST_SHAPE,Nk), F_orvv  (DIST_SHAPE,Nk),
     %     F_ruw1  (DIST_SHAPE,Nk), F_rvw1  (DIST_SHAPE,Nk),
     %     F_nest_u(DIST_SHAPE,Nk), F_nest_v(DIST_SHAPE,Nk),
     %     F_u     (DIST_SHAPE,Nk), F_v     (DIST_SHAPE,Nk),
     %     F_t     (DIST_SHAPE,Nk), F_q     (DIST_SHAPE,Nk),
     %     F_fi    (DIST_SHAPE,Nk), F_s     (DIST_SHAPE)   ,
     %     F_td    (DIST_SHAPE,Nk), F_psd   (DIST_SHAPE,Nk),
     %     F_w     (DIST_SHAPE,Nk), F_fis   (DIST_SHAPE)   ,
     %     F_fip   (DIST_SHAPE,Nk), F_mu    (DIST_SHAPE,Nk)
*
      real F_rum     (DIST_SHAPE,Nk), F_rvm     (DIST_SHAPE,Nk),
     %     F_rcnm    (DIST_SHAPE,Nk), F_rthm    (DIST_SHAPE,Nk),
     %     F_rwm     (DIST_SHAPE,Nk), F_rvvm    (DIST_SHAPE,Nk),
     %     F_orum    (DIST_SHAPE,Nk), F_orvm    (DIST_SHAPE,Nk),
     %     F_orcnm   (DIST_SHAPE,Nk), F_orthm   (DIST_SHAPE,Nk),
     %     F_orwm    (DIST_SHAPE,Nk), F_orvvm   (DIST_SHAPE,Nk),
     %     F_ruw1m   (DIST_SHAPE,Nk), F_rvw1m   (DIST_SHAPE,Nk),
     %     F_nestm_um(DIST_SHAPE,Nk), F_nestm_vm(DIST_SHAPE,Nk),
     %     F_um      (DIST_SHAPE,Nk), F_vm      (DIST_SHAPE,Nk),
     %     F_tm      (DIST_SHAPE,Nk), F_qm      (DIST_SHAPE,Nk),
     %     F_fim     (DIST_SHAPE,Nk), F_sm      (DIST_SHAPE)   ,
     %     F_tdm     (DIST_SHAPE,Nk), F_psdm    (DIST_SHAPE,Nk),
     %     F_wm      (DIST_SHAPE,Nk), 
     %     F_fipm    (DIST_SHAPE,Nk), F_mum     (DIST_SHAPE,Nk)
*
*author
*     M.Tanguay
*
*revision
* v2_10 - Tanguay M.        - initial MPI version
* v2_31 - Tanguay M.        - adapt for vertical hybrid coordinate and LAM version 
*                           - adapt for tracers in tr3d  
* v3_03 - Tanguay M.        - Adjoint Lam and NoHyd configuration 
* v3_11 - Tanguay M.        - AIXport+Opti+OpenMP for TLM-ADJ
* v3_30 - Tanguay M.        - Use invhsyv
* v3_31 - Tanguay M.        - new scope for operator + adw_cliptraj (LAM)
*
*object
*     see id section 
*     -------------------------------------------------------------
*     REMARK:INPUT TRAJ:F_um,F_vm,F_tm,F_qm,F_fim,F_sm,F_tdm,F_psdm
*                       F_nestm_um, F_nestm_vm (G_lam)
*     -------------------------------------------------------------
*
*arguments
*  Name        I/O                 Description
*----------------------------------------------------------------
* F_ru          O
*----------------------------------------------------------------
*
*implicits
#include "glb_ld.cdk"
#include "cori.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "geomg.cdk"
#include "offc.cdk"
#include "schm.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
*
      integer i, j, k, i0, j0, in, jn,i00,inn,j00,jnn,nij
      real*8  aaa_8, bbb_8, ZERO_8, ONE_8, pd1_8
      real*8  c1_8,c2_8,c3_8,c4_8,c5_8,c6_8,c7_8,c8_8

      parameter( ZERO_8=0.0, ONE_8=1.0 )
*     - - - - - - - - - - - - - - - - 
*
      real wk1 (DIST_SHAPE), wk2 (DIST_SHAPE)
      real wk1m(DIST_SHAPE), wk2m(DIST_SHAPE)
*
      real*8 xmassm_8(l_ni,l_nj), y1logm_8(l_ni,l_nj), y2logm_8(l_ni,l_nj),
     $      expfm_8(l_ni,l_nj), invsm_8(l_ni,l_nj), invtm_8(l_ni,l_nj)
*
      real*8 inv_Cstv_tstr_8
      real*8 inv_Geomg_hx_8(l_niu)
      real*8 inv_Geomg_z_8(l_nk)
*
*     ______________________________________________________
*
*     Common coefficients 

      aaa_8 = ( Offc_a1_8 / Offc_b0_8 )/ Cstv_dt_8 
      bbb_8 = ( Offc_b1_8 / Offc_b0_8 )

      c1_8  = bbb_8 * Dcst_rgasd_8 / ( Dcst_rayt_8*Dcst_rayt_8 )
      c2_8  = bbb_8 / ( Dcst_rayt_8*Dcst_rayt_8 )
      c3_8  = aaa_8*Dcst_cappa_8 
      c4_8  = bbb_8*Dcst_cappa_8 
      c5_8  = aaa_8*Schm_nonhy_8 
      c6_8  = bbb_8*Dcst_grav_8 
      c7_8  = bbb_8*Dcst_rgasd_8*Cstv_tstr_8
      if (Cori_cornl_L) then
         c8_8 = Offc_b1_8 / Offc_b0_8
      else
         c8_8 = ( Offc_b1_8 - Offc_b0_8 ) / Offc_b0_8
      endif
*
*     Exchange haloes for derivatives & interpolation 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*     TRAJECTORY
*     ----------
      call rpn_comm_xch_halo( F_um, 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_vm, LDIST_DIM,l_ni,l_njv,G_nk,
     $            G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_tm, 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_qm, 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_fim,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_mum, 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_u , 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_v , LDIST_DIM,l_ni,l_njv,G_nk,
     $            G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      call rpn_comm_xch_halo( F_t , 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_q , 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_fi, 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_mu, LDIST_DIM,l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
      endif 
*
      nij = l_ni*l_nj
*
!$omp parallel
!$omp do
      do j = 1, l_nj
      do i = 1, l_ni
*
         xmassm_8(i,j) = F_sm(i,j)
*
      end do
      end do
!$omp enddo
*
!$omp single
      call vexp (expfm_8,xmassm_8,nij)
!$omp end single
*
      inv_Cstv_tstr_8 = 1.0d0 / Cstv_tstr_8
*
!$omp do
      do i = 1, l_niu
         inv_Geomg_hx_8(i) = 1.0d0 / Geomg_hx_8(i)
      end do
!$omp enddo
*
!$omp do
      do k = 1, l_nk
         inv_Geomg_z_8(k) = 1.0d0 / Geomg_z_8(k)
      end do
!$omp enddo
!$omp end parallel
*
!$omp parallel private(i,j,i0,j0,jn,in,i00,inn,j00,jnn,
!$omp$                 pd1_8,xmassm_8,y1logm_8,y2logm_8,
!$omp$                 invsm_8,invtm_8,
!$omp$                 wk1m,wk2m,wk1,wk2)
*
!$omp do
      do 1000 k = 1,l_nk 
*
      if (Schm_hydro_L) then
      do j = 1, l_nj
      do i = 1, l_ni
*
*        TRAJECTORY
*        ----------
         wk1m  (i,j) = ONE_8
*
*        TLM 
*        ---
         wk1   (i,j) = ZERO_8 
*
      end do
      end do
      endif
*
*****************************
* Compute RHS of U equation *
*****************************

* set indices for calculating Ru
      i0 = 1
      j0 = 1
      in = l_niu
      jn = l_nj
      if (.not. Schm_hydro_L) then
      do j = j0, jn
      do i = i0, in
*
*        TRAJECTORY
*        ----------
         wk1m(i,j) = ( 1. - intuv_c0xxu_8(i) )*(1.+ F_mum(i  ,j,k))
     %                    + intuv_c0xxu_8(i)  *(1.+ F_mum(i+1,j,k))
*
*        TLM 
*        ---
         wk1(i,j) = ( 1. - intuv_c0xxu_8(i) )*( F_mu(i  ,j,k))
     %                   + intuv_c0xxu_8(i)  *( F_mu(i+1,j,k))
*
      end do
      end do
      endif
      if ( abs(c8_8) .lt. 1.0e-6 ) then
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            F_rum(i,j,k)= - aaa_8*F_um(i,j,k)
*
     %                    - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_tm(i  ,j,k)
     %                                   + intuv_c0xxu_8(i)  * F_tm(i+1,j,k) )
     %                           *          ( F_qm (i+1,j,k) - F_qm (i,j,k) ) * inv_Geomg_hx_8(i)
*
     %                    - c2_8 *wk1m(i,j)*( F_fim(i+1,j,k) - F_fim(i,j,k) ) * inv_Geomg_hx_8(i)
*
            F_orum(i,j,k) = F_rum (i,j,k)
*
*           TLM 
*           ---
            F_ru(i,j,k) = - aaa_8*F_u(i,j,k)
*
     %                    - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_tm(i  ,j,k)
     %                                   + intuv_c0xxu_8(i)  * F_tm(i+1,j,k) )
     %                           *         ( F_q (i+1,j,k) - F_q (i,j,k) ) * inv_Geomg_hx_8(i)
*
     %                    - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_t(i  ,j,k)
     %                                   + intuv_c0xxu_8(i)  * F_t(i+1,j,k) )
     %                           *         ( F_qm(i+1,j,k) - F_qm(i,j,k) ) * inv_Geomg_hx_8(i)
*
     %                    - c2_8 *wk1m(i,j)*( F_fi (i+1,j,k) - F_fi (i,j,k) ) * inv_Geomg_hx_8(i)
*
     %                    - c2_8 *wk1 (i,j)*( F_fim(i+1,j,k) - F_fim(i,j,k) ) * inv_Geomg_hx_8(i)
*
            F_oru(i,j,k) = F_ru (i,j,k)
         end do
         end do
      else

*        Set indices for calculating wk2
         i00=minx
         inn=maxx
         j00 = 1
         jnn = l_njv
         if (l_south) j00 = 3
         if (l_north) jnn = l_njv-1
*
         do j = j00, jnn
         do i = i00, inn
*
*           TRAJECTORY
*           ----------
            wk2m(i,j)  = inuvl_wyvy3_8(j,1) * F_vm(i,j-2,k) 
     %                 + inuvl_wyvy3_8(j,2) * F_vm(i,j-1,k) 
     %                 + inuvl_wyvy3_8(j,3) * F_vm(i,j  ,k) 
     %                 + inuvl_wyvy3_8(j,4) * F_vm(i,j+1,k)          
*
*           TLM
*           ---
            wk2(i,j)  = inuvl_wyvy3_8(j,1) * F_v(i,j-2,k) 
     %                + inuvl_wyvy3_8(j,2) * F_v(i,j-1,k) 
     %                + inuvl_wyvy3_8(j,3) * F_v(i,j  ,k) 
     %                + inuvl_wyvy3_8(j,4) * F_v(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_vm(i,j00-2,k) 
     %                         + inuvl_wyvy3_8(j00-2,4) * F_vm(i,j00-1,k) 
                  wk2m(i,j00-1)= inuvl_wyvy3_8(j00-1,2) * F_vm(i,j00-2,k) 
     %                         + inuvl_wyvy3_8(j00-1,3) * F_vm(i,j00-1,k) 
     %                         + inuvl_wyvy3_8(j00-1,4) * F_vm(i,j00  ,k) 
*
*                 TLM
*                 ---
                  wk2(i,j00-2)= inuvl_wyvy3_8(j00-2,3) * F_v(i,j00-2,k) 
     %                        + inuvl_wyvy3_8(j00-2,4) * F_v(i,j00-1,k) 
                  wk2(i,j00-1)= inuvl_wyvy3_8(j00-1,2) * F_v(i,j00-2,k) 
     %                        + inuvl_wyvy3_8(j00-1,3) * F_v(i,j00-1,k) 
     %                        + inuvl_wyvy3_8(j00-1,4) * F_v(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_vm(i,jnn  ,k) 
     %                         + inuvl_wyvy3_8(jnn+2,2) * F_vm(i,jnn+1,k) 
                  wk2m(i,jnn+1)= inuvl_wyvy3_8(jnn+1,1) * F_vm(i,jnn-1,k) 
     %                         + inuvl_wyvy3_8(jnn+1,2) * F_vm(i,jnn  ,k) 
     %                         + inuvl_wyvy3_8(jnn+1,3) * F_vm(i,jnn+1,k) 
*
*                 TLM
*                 ---
                  wk2(i,jnn+2)= inuvl_wyvy3_8(jnn+2,1) * F_v(i,jnn  ,k) 
     %                        + inuvl_wyvy3_8(jnn+2,2) * F_v(i,jnn+1,k) 
                  wk2(i,jnn+1)= inuvl_wyvy3_8(jnn+1,1) * F_v(i,jnn-1,k) 
     %                        + inuvl_wyvy3_8(jnn+1,2) * F_v(i,jnn  ,k) 
     %                        + inuvl_wyvy3_8(jnn+1,3) * F_v(i,jnn+1,k) 
               end do
            endif
*
         endif
*
*        Set indices for calculating Ru
         if (G_lam) then
             if (l_west ) i0 = 2
             if (l_east ) in = l_niu-1
             if (l_south) j0 = 3
             if (l_north) jn = l_njv-1
         endif
*
*        Adding coriolis factor to Ru
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            F_rum(i,j,k) = - aaa_8*F_um(i,j,k)
*
     %                - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_tm(i  ,j,k)
     %                               + intuv_c0xxu_8(i)  * F_tm(i+1,j,k) )
     %                  * ( F_qm(i+1,j,k) - F_qm(i,j,k) ) * inv_Geomg_hx_8(i)
*
     %                - c2_8 *wk1m(i,j) * ( F_fim(i+1,j,k) - F_fim(i,j,k) )
     %                     * inv_Geomg_hx_8(i) 
*
     %                + c8_8 * 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))
*
            F_orum(i,j,k) = F_rum(i,j,k)
*
*           TLM
*           ---
            F_ru(i,j,k) = - aaa_8*F_u(i,j,k)
*
     %              - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_tm(i  ,j,k)
     %                             + intuv_c0xxu_8(i)  * F_tm(i+1,j,k) )
     %                * ( F_q (i+1,j,k) - F_q (i,j,k) ) * inv_Geomg_hx_8(i)
*
     %              - c1_8 *( ( 1. - intuv_c0xxu_8(i) )* F_t(i  ,j,k)
     %                             + intuv_c0xxu_8(i)  * F_t(i+1,j,k) )
     %                * ( F_qm(i+1,j,k) - F_qm(i,j,k) ) * inv_Geomg_hx_8(i)
*
     %              - c2_8 *wk1m(i,j) * ( F_fi (i+1,j,k) - F_fi (i,j,k) ) 
     %                     * inv_Geomg_hx_8(i) 
*
     %              - c2_8 *wk1 (i,j) * ( F_fim(i+1,j,k) - F_fim(i,j,k) ) 
     %                     * inv_Geomg_hx_8(i) 
*
     %              + c8_8 * 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))
            F_oru(i,j,k) = F_ru (i,j,k)
         end do
         end do
      endif

*****************************
* Compute RHS of V equation *
*****************************

* set indices for calculating Rv
      i0 = 1
      j0 = 1
      in = l_ni
      jn = l_njv
      if (.not. Schm_hydro_L) then
      do j = j0, jn
      do i = i0, in
*
*        TRAJECTORY
*        ----------
         wk1m(i,j) = ( 1. - intuv_c0yyv_8(j) )*(1.+F_mum(i,j  ,k))
     %                    + intuv_c0yyv_8(j)  *(1.+F_mum(i,j+1,k))
*
*        TLM 
*        ---
         wk1 (i,j) = ( 1. - intuv_c0yyv_8(j) )*(F_mu(i,j  ,k))
     %                    + intuv_c0yyv_8(j)  *(F_mu(i,j+1,k))
*
      end do
      end do

      endif
*
      if ( abs(c8_8) .lt. 1.0e-6 ) then
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            F_rvm(i,j,k) = - aaa_8*F_vm(i,j,k)
*
     %                    - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j  ,k)
     %                                   + intuv_c0yyv_8(j)  *F_tm(i,j+1,k) )
     %                           *         ( F_qm (i,j+1,k) - F_qm (i,j,k) )
     %                           * Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
     %                    - c2_8 *wk1m(i,j)*( F_fim(i,j+1,k) - F_fim(i,j,k) )
     %                           * Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
            F_orvm(i,j,k) = F_rvm (i,j,k)
*
*           TLM 
*           ---
            F_rv(i,j,k) = - aaa_8*F_v(i,j,k)
*
     %                    - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j  ,k)
     %                                   + intuv_c0yyv_8(j)  *F_tm(i,j+1,k) )
     %                           *         ( F_q (i,j+1,k) -  F_q (i,j,k) )
     %                           * Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
     %                    - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_t(i,j  ,k)
     %                                   + intuv_c0yyv_8(j)  *F_t(i,j+1,k) )
     %                           *         ( F_qm(i,j+1,k) -  F_qm(i,j,k) )
     %                           * Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
     %                    - c2_8 *wk1m(i,j)*( F_fi (i,j+1,k) -  F_fi (i,j,k) )
     %                           * Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
     %                    - c2_8 *wk1 (i,j)*( F_fim(i,j+1,k) -  F_fim(i,j,k) )
     %                           * Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
            F_orv(i,j,k) = F_rv (i,j,k)
         end do
         end do
      else
*
*        Set indices for calculating wk2
         j00=miny
         jnn=maxy
         i00 = 1
         inn = l_niu
         if (G_lam) then
            if (l_west) i00 = 3
            if (l_east) inn = l_niu-1
         endif
*
         do j = j00, jnn
         do i = i00, inn
*
*           TRAJECTORY
*           ----------
            wk2m(i,j)  = inuvl_wxux3_8(i,1)*F_um(i-2,j,k)
     %                 + inuvl_wxux3_8(i,2)*F_um(i-1,j,k)
     %                 + inuvl_wxux3_8(i,3)*F_um(i  ,j,k)
     %                 + inuvl_wxux3_8(i,4)*F_um(i+1,j,k)
*
*           TLM 
*           ---
            wk2(i,j)  = inuvl_wxux3_8(i,1)*F_u(i-2,j,k) 
     %                + inuvl_wxux3_8(i,2)*F_u(i-1,j,k) 
     %                + inuvl_wxux3_8(i,3)*F_u(i  ,j,k) 
     %                + inuvl_wxux3_8(i,4)*F_u(i+1,j,k) 
         end do
         end do
*
*        Set indices for calculating Rv
         if (l_south) j0 = 2
         if (l_north) jn = l_njv-1
         if (G_lam) then
            if (l_west) i0 = 3
            if (l_east) in = l_niu-1
         endif
*
*        Adding coriolis factor to Rv
         do j = j0, jn
         do i = i0, in
*
*           TRAJECTORY
*           ----------
            F_rvm(i,j,k) = - aaa_8*F_vm(i,j,k)
*
     %               - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j  ,k) 
     %                              + intuv_c0yyv_8(j)  *F_tm(i,j+1,k) )
     %                 * (F_qm(i,j+1,k)-F_qm(i,j,k))*Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
     %               - c2_8 *wk1m(i,j)*( F_fim(i,j+1,k) - F_fim(i,j,k) ) 
     %                 * Geomg_cyv2_8(j) * Geomg_invhsy_8(j) 
*
     %               - c8_8 * 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))
*
            F_orvm(i,j,k) = F_rvm(i,j,k)
*
*           TLM
*           ---
            F_rv(i,j,k) = - aaa_8*F_v(i,j,k)
*
     %              - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_tm(i,j  ,k)
     %                             + intuv_c0yyv_8(j)  *F_tm(i,j+1,k) )
     %                * (F_q(i,j+1,k)-F_q (i,j,k))*Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
     %              - c1_8 *( ( 1. - intuv_c0yyv_8(j) )*F_t(i,j  ,k)
     %                             + intuv_c0yyv_8(j)  *F_t(i,j+1,k) )
     %                * (F_qm(i,j+1,k)-F_qm(i,j,k))*Geomg_cyv2_8(j) * Geomg_invhsy_8(j)
*
     %              - c2_8 *wk1m(i,j)*( F_fi (i,j+1,k) - F_fi (i,j,k) )
     %                * Geomg_cyv2_8(j) * Geomg_invhsy_8(j) 
*
     %              - c2_8 *wk1 (i,j)*( F_fim(i,j+1,k) - F_fim(i,j,k) )
     %                * Geomg_cyv2_8(j) * Geomg_invhsy_8(j) 
*
     %              - c8_8 * 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))
*
            F_orv(i,j,k) = F_rv (i,j,k)
         end do
         end do
*
         if (.not.G_lam) then
            if (l_south) then
               do i = i0, in
*
*                 TRAJECTORY
*                 ----------
                  F_rvm(i,1,k) = - aaa_8*F_vm(i,1,k)
*
     %                 - c1_8 *( ( 1. - intuv_c0yyv_8(1) )*F_tm(i,1  ,k) 
     %                                + intuv_c0yyv_8(1)  *F_tm(i,1+1,k) )
     %                   * (F_qm(i,1+1,k)-F_qm(i,1,k))*Geomg_cyv2_8(1) * Geomg_invhsy_8(1)
*
     %                 - c2_8 * wk1m(i,1) * ( F_fim(i,1+1,k) - F_fim(i,1,k) ) 
     %                   * Geomg_cyv2_8(1) * Geomg_invhsy_8(1)
*
     %                 - c8_8 * 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))
*
                  F_orvm(i,1,k) = F_rvm(i,1,k)
*
*                 TLM 
*                 ---
                  F_rv(i,1,k) = - aaa_8*F_v(i,1,k)
*
     %                 - c1_8 *( ( 1. - intuv_c0yyv_8(1) )*F_tm(i,1  ,k)
     %                                + intuv_c0yyv_8(1)  *F_tm(i,1+1,k) )
     %                   * (F_q (i,1+1,k)-F_q(i,1,k))*Geomg_cyv2_8(1) * Geomg_invhsy_8(1)
*
     %                 - c1_8 *( ( 1. - intuv_c0yyv_8(1) )*F_t(i,1  ,k)
     %                                + intuv_c0yyv_8(1)  *F_t(i,1+1,k) )
     %                   * (F_qm(i,1+1,k)-F_qm(i,1,k))*Geomg_cyv2_8(1) * Geomg_invhsy_8(1)
*
     %                - c2_8 * wk1m(i,1) * ( F_fi (i,1+1,k) - F_fi (i,1,k) )
     %                   * Geomg_cyv2_8(1) * Geomg_invhsy_8(1) 
*
     %                - c2_8 * wk1 (i,1) * ( F_fim(i,1+1,k) - F_fim(i,1,k) )
     %                   * Geomg_cyv2_8(1) * Geomg_invhsy_8(1) 
*
     %                - c8_8 * 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))
*
                  F_orv(i,1,k) = F_rv (i,1,k)
               end do 
            endif 
*
            if (l_north) then
               do i = i0, in
*
*                 TRAJECTORY
*                 ----------
                  F_rvm(i,l_njv,k) = - aaa_8*F_vm(i,l_njv,k)
*
     %         - c1_8 *(( 1. - intuv_c0yyv_8(l_njv) )*F_tm(i,l_njv  ,k) 
     %                       + intuv_c0yyv_8(l_njv)  *F_tm(i,l_njv+1,k))
     %           * ( F_qm(i,l_njv+1,k) - F_qm(i,l_njv,k) ) 
     %           * Geomg_cyv2_8(l_njv) * Geomg_invhsy_8(l_njv)
*
     %         - c2_8 *wk1m(i,l_njv)*( F_fim(i,l_njv+1,k)
     %           - F_fim(i,l_njv,k))*Geomg_cyv2_8(l_njv) * Geomg_invhsy_8(l_njv)
*
     %         - c8_8 * 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) )
*
                  F_orvm(i,l_njv,k) = F_rvm(i,l_njv,k)
*
*                 TLM
*                 ---
                  F_rv(i,l_njv,k) = - aaa_8*F_v(i,l_njv,k)
*
     %         - c1_8 *(( 1. - intuv_c0yyv_8(l_njv) )*F_tm(i,l_njv  ,k)
     %                       + intuv_c0yyv_8(l_njv)  *F_tm(i,l_njv+1,k))
     %           * ( F_q(i,l_njv+1,k) - F_q(i,l_njv,k) )
     %           * Geomg_cyv2_8(l_njv) * Geomg_invhsy_8(l_njv)
*
     %         - c1_8 *(( 1. - intuv_c0yyv_8(l_njv) )*F_t(i,l_njv  ,k)
     %                       + intuv_c0yyv_8(l_njv)  *F_t(i,l_njv+1,k))
     %           * ( F_qm(i,l_njv+1,k) - F_qm(i,l_njv,k) )
     %           * Geomg_cyv2_8(l_njv) * Geomg_invhsy_8(l_njv)
*
     %         - c2_8 *wk1m(i,l_njv)*( F_fi (i,l_njv+1,k)
     %           - F_fi (i,l_njv,k))*Geomg_cyv2_8(l_njv) * Geomg_invhsy_8(l_njv)
*
     %         - c2_8 *wk1 (i,l_njv)*( F_fim(i,l_njv+1,k)
     %           - F_fim(i,l_njv,k))*Geomg_cyv2_8(l_njv) * Geomg_invhsy_8(l_njv)
*
     %         - c8_8 * 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) )
*
                  F_orv(i,l_njv,k) = F_rv (i,l_njv,k)
               end do 
            endif 
         endif
      endif

* RHS of continuity, thermodynamic, passive advection equations *
      i0 = 1
      j0 = 1
      in = l_ni
      jn = l_nj
*
      do j = j0, jn
      do i = i0, in
         xmassm_8(i,j) = ONE_8+Geomg_dpba(k)*(expfm_8(i,j) - ONE_8)
      end do
      end do
      call vlog(y1logm_8, xmassm_8, nij)
      call vrec( invsm_8, xmassm_8, nij)
*
      do j = j0, jn
      do i = i0, in
         xmassm_8(i,j) = F_tm(i,j,k)*inv_Cstv_tstr_8
      end do
      end do
      call vlog(y2logm_8, xmassm_8, nij)
      call vrec( invtm_8, xmassm_8, nij)
*
      pd1_8 = log(Geomg_z_8(k))
      do j= j0, jn
      do i= i0, in
*
*        TRAJECTORY
*        ----------
         F_rcnm(i,j,k) = - aaa_8*y1logm_8(i,j) - bbb_8*F_tdm(i,j,k)
*
         F_rthm(i,j,k) = - aaa_8*y2logm_8(i,j) - c3_8*(pd1_8-F_qm(i,j,k)) 
*
     %                   + c4_8*F_psdm(i,j,k)*inv_Geomg_z_8(k)
*
         F_orcnm(i,j,k)=   F_rcnm(i,j,k)
         F_orthm(i,j,k)=   F_rthm(i,j,k)
*
*        TLM 
*        ---
         F_rcn(i,j,k) = - aaa_8*(Geomg_dpba(k)*(F_s(i,j)*expfm_8(i,j))) * invsm_8(i,j)
     %                  - bbb_8*F_td(i,j,k)
*
         F_rth(i,j,k) = - aaa_8*( F_t(i,j,k) * inv_Cstv_tstr_8 ) * invtm_8(i,j)
     %                  - c3_8 *(-F_q(i,j,k))
*
     %                  + c4_8 *F_psd(i,j,k) * inv_Geomg_z_8(k)
*
         F_orcn(i,j,k)=   F_rcn(i,j,k)
         F_orth(i,j,k)=   F_rth(i,j,k)
      end do
      end do
*
* RHS of vertical momentum, vertical velocity  equation *
      if (.not. Schm_hydro_L) then
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY
*           ----------
            F_rwm (i,j,k) = - c5_8*F_wm(i,j,k) + c6_8*F_mum(i,j,k)
*
            F_rvvm(i,j,k) = - aaa_8*( F_fis(i,j) + F_fipm(i,j,k) )
     %                     + c7_8*F_psdm(i,j,k)*inv_Geomg_z_8(k)+c6_8*F_wm(i,j,k)
*
            F_orwm (i,j,k) = F_rwm (i,j,k)
*
            F_orvvm(i,j,k) = F_rvvm(i,j,k)
*
*           TLM
*           ---
            F_rw (i,j,k) = - c5_8*F_w(i,j,k) + c6_8*F_mu(i,j,k)
*
            F_rvv(i,j,k) = - aaa_8*( F_fip(i,j,k) )
     %                     + c7_8*F_psd(i,j,k)*inv_Geomg_z_8(k)+c6_8*F_w(i,j,k)
*
            F_orw (i,j,k) = F_rw (i,j,k)
            F_orvv(i,j,k) = F_rvv(i,j,k)
         end do
         end do
      endif 

 1000 continue
!$omp enddo
*
*******************************************************
* Interpolate Ru, Rv from U-, V-grid to G-grid, resp. *
*******************************************************
*
!$omp single
*     TRAJECTORY
*     ----------
      call rpn_comm_xch_halo ( F_rum,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_rvm,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_ru, 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_rv, LDIST_DIM,l_ni,l_njv,G_nk,
     $              G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
!$omp end single
*
*     set indices for Ruw1
      i0 = 1
      in = l_niu
      j0 = 1
      jn = l_nj
      if (G_lam) then
         if (l_west)  i0 = 4
         if (l_east)  in = l_niu - 2
         if (l_south) j0 = 4
         if (l_north) jn = l_njv - 2
      endif
*      
!$omp do
      do k=1,l_nk
         do j = j0, jn
         do i = i0, in
*
*           TRAJECTORY
*           ----------
            F_ruw1m(i,j,k) =  inuvl_wxux3_8(i,1) * F_rum(i-2,j,k)
     $                      + inuvl_wxux3_8(i,2) * F_rum(i-1,j,k)
     $                      + inuvl_wxux3_8(i,3) * F_rum(i  ,j,k)
     $                      + inuvl_wxux3_8(i,4) * F_rum(i+1,j,k)
*
*           TLM
*           ---
            F_ruw1(i,j,k) =  inuvl_wxux3_8(i,1) * F_ru(i-2,j,k)
     $                     + inuvl_wxux3_8(i,2) * F_ru(i-1,j,k)
     $                     + inuvl_wxux3_8(i,3) * F_ru(i  ,j,k)
     $                     + inuvl_wxux3_8(i,4) * F_ru(i+1,j,k)
         end do
         end do
      end do
!$omp enddo
*
*     set indices for Rvw1
      i0 = 1
      in = l_ni
      j0 = 1
      jn = l_njv
      if (l_south) j0 = 3
      if (l_north) jn = l_njv-1

      if (G_lam) then
         if (l_west)  i0 = 4
         if (l_east)  in = l_niu - 2
         if (l_south) j0 = 4
         if (l_north) jn = l_njv - 2
      endif
*
!$omp do
      do k=1,l_nk
         do j = j0, jn
         do i = i0, in
*
*           TRAJECTORY
*           ----------
            F_rvw1m(i,j,k) =  inuvl_wyvy3_8(j,1) * F_rvm(i,j-2,k)
     %                      + inuvl_wyvy3_8(j,2) * F_rvm(i,j-1,k)
     %                      + inuvl_wyvy3_8(j,3) * F_rvm(i,j  ,k)
     %                      + inuvl_wyvy3_8(j,4) * F_rvm(i,j+1,k)         
*
*           TLM
*           ---
            F_rvw1(i,j,k) =  inuvl_wyvy3_8(j,1) * F_rv(i,j-2,k)
     %                     + inuvl_wyvy3_8(j,2) * F_rv(i,j-1,k)
     %                     + inuvl_wyvy3_8(j,3) * F_rv(i,j  ,k)
     %                     + inuvl_wyvy3_8(j,4) * F_rv(i,j+1,k)         
         end do
         end do
         if (.not.G_lam) then
            if (l_south) then
            do i = i0, in
*
*              TRAJECTORY
*              ----------
               F_rvw1m(i,j0-2,k) = inuvl_wyvy3_8(j0-2,3) * F_rvm(i,j0-2,k)
     %                           + inuvl_wyvy3_8(j0-2,4) * F_rvm(i,j0-1,k)
               F_rvw1m(i,j0-1,k) = inuvl_wyvy3_8(j0-1,2) * F_rvm(i,j0-2,k)
     %                           + inuvl_wyvy3_8(j0-1,3) * F_rvm(i,j0-1,k)
     %                           + inuvl_wyvy3_8(j0-1,4) * F_rvm(i,j0,k  )
*
*              TLM 
*              ---
               F_rvw1(i,j0-2,k) = inuvl_wyvy3_8(j0-2,3) * F_rv(i,j0-2,k)
     %                          + inuvl_wyvy3_8(j0-2,4) * F_rv(i,j0-1,k)
               F_rvw1(i,j0-1,k) = inuvl_wyvy3_8(j0-1,2) * F_rv(i,j0-2,k)
     %                          + inuvl_wyvy3_8(j0-1,3) * F_rv(i,j0-1,k)
     %                          + inuvl_wyvy3_8(j0-1,4) * F_rv(i,j0,k  )
            end do
            endif
            if (l_north) then
            do i = i0, in
*
*              TRAJECTORY
*              ----------
               F_rvw1m(i,jn+2,k) = inuvl_wyvy3_8(jn+2,1) * F_rvm(i,jn  ,k)
     %                           + inuvl_wyvy3_8(jn+2,2) * F_rvm(i,jn+1,k)
               F_rvw1m(i,jn+1,k) = inuvl_wyvy3_8(jn+1,1) * F_rvm(i,jn-1,k)
     %                           + inuvl_wyvy3_8(jn+1,2) * F_rvm(i,jn  ,k)
     %                           + inuvl_wyvy3_8(jn+1,3) * F_rvm(i,jn+1,k)
*              TLM 
*              ---
               F_rvw1(i,jn+2,k) = inuvl_wyvy3_8(jn+2,1) * F_rv(i,jn  ,k)
     %                          + inuvl_wyvy3_8(jn+2,2) * F_rv(i,jn+1,k)
               F_rvw1(i,jn+1,k) = inuvl_wyvy3_8(jn+1,1) * F_rv(i,jn-1,k)
     %                          + inuvl_wyvy3_8(jn+1,2) * F_rv(i,jn  ,k)
     %                          + inuvl_wyvy3_8(jn+1,3) * F_rv(i,jn+1,k)
            end do
            endif
         endif
      end do
!$omp enddo
*
*  Change Ru, Rv 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_rum(pil_w,j,k) = - aaa_8*F_nestm_um(pil_w,j,k)
                F_orum(pil_w,j,k) = F_rum(pil_w,j,k)
*
*               TLM 
*               ---
                F_ru(pil_w,j,k) = - aaa_8*F_nest_u(pil_w,j,k)
                F_oru(pil_w,j,k) = F_ru(pil_w,j,k)
             enddo
             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_rum(l_ni-pil_e,j,k) = - aaa_8*F_nestm_um(l_ni-pil_e,j,k)
                F_orum(l_ni-pil_e,j,k) = F_rum(l_ni-pil_e,j,k)
*
*               TLM 
*               ---
                F_ru(l_ni-pil_e,j,k) = - aaa_8*F_nest_u(l_ni-pil_e,j,k)
                F_oru(l_ni-pil_e,j,k) = F_ru(l_ni-pil_e,j,k)
             enddo
             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_rvm(i,pil_s,k) = - aaa_8*F_nestm_vm(i,pil_s,k)
                F_orvm(i,pil_s,k) = F_rvm(i,pil_s,k)
*
*               TLM 
*               ---
                F_rv(i,pil_s,k) = - aaa_8*F_nest_v(i,pil_s,k)
                F_orv(i,pil_s,k) = F_rv(i,pil_s,k)
             enddo
             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_rvm(i,l_nj-pil_n,k) = - aaa_8*F_nestm_vm(i,l_nj-pil_n,k)
                F_orvm(i,l_nj-pil_n,k) = F_rvm(i,l_nj-pil_n,k)
*
*               TLM 
*               ---
                F_rv(i,l_nj-pil_n,k) = - aaa_8*F_nest_v(i,l_nj-pil_n,k)
                F_orv(i,l_nj-pil_n,k) = F_rv(i,l_nj-pil_n,k)
             enddo
             enddo
!$omp enddo
          endif
      endif
*
!$omp end parallel
*
      return
      end