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

      subroutine prep_2_ad ( F_ru,    F_rv,    F_ruw1,  F_ruw2, F_rvw1, F_rvw2, 1,5
     $                       F_xct1,  F_yct1,  F_zct1,  F_fis,  F_rd,   F_rcn,
     $                       F_r1,    F_rth,   F_rw,    F_rvv,  F_r3,   F_r3p,
     $                       F_rhell, F_wijk1, F_wijk2,
*
     $                                                  F_ruw2m,        F_rvw2m,
     $                       F_xct1m, F_yct1m, F_zct1m,    
*
     $                       DIST_DIM,ni,nj,Nk )
*
      implicit none
*
      integer DIST_DIM, ni, nj, Nk
      real F_ru   (DIST_SHAPE,Nk), F_rv   (DIST_SHAPE,Nk),
     %     F_ruw1 (DIST_SHAPE,Nk), F_ruw2 (DIST_SHAPE,Nk),
     %     F_rvw1 (DIST_SHAPE,Nk), F_rvw2 (DIST_SHAPE,Nk),
     %     F_xct1 (ni,nj,Nk), F_yct1  (ni,nj,Nk), F_zct1  (ni,nj,Nk),
     %     F_rd   (DIST_SHAPE,Nk), F_rcn  (DIST_SHAPE,Nk),
     %     F_r1   (DIST_SHAPE,Nk), F_rth  (DIST_SHAPE,Nk),
     %     F_rw   (DIST_SHAPE,Nk), F_rvv  (DIST_SHAPE,Nk),
     %     F_r3   (DIST_SHAPE,Nk), F_r3p  (DIST_SHAPE,Nk),
     %     F_rhell(DIST_SHAPE,Nk), F_fis  (DIST_SHAPE)   ,
     %     F_wijk1(DIST_SHAPE,Nk), F_wijk2(DIST_SHAPE,Nk)
*
      real F_ruw2m(DIST_SHAPE,Nk), F_rvw2m(DIST_SHAPE,Nk), 
     %     F_xct1m (ni,nj,Nk), F_yct1m  (ni,nj,Nk), F_zct1m  (ni,nj,Nk)
*
*author
*     M.Tanguay
*
*revision
* v2_10 - Tanguay M.        - initial MPI version
* v2_31 - Tanguay M.        - adapt ADJ for new advection code and LAM version
* v3_00 - Tanguay M.        - adapt to restructured prep_2 
* 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_ruw2m, F_rvw2m, F_xct1m, F_yct1m, F_zct1m
*     -------------------------------------------------------------
*
*arguments
*     see appropriate comdeck documentation
*
*implicits
#include "glb_ld.cdk"
#include "lun.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "grd.cdk"
#include "geomg.cdk"
#include "offc.cdk"
#include "schm.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
#include "adw.cdk"
#include "cori.cdk"
*
      integer i, j, k, i0, j0, in, jn, i00, inn, j00, jnn
      real*8  x_8, y_8, z_8, cx_8, cy_8, cz_8, rx_8, ry_8, rz_8
      real*8  b1ob0_8, mumu_8, tot_8
      real*8  a1_8, a2_8, b1_8, b2_8, b3_8, eps_8, gamma_8 
*
      real*8  ZERO_8, ONE_8, TWO_8, FOUR_8, HALF_8, QUARTER_8
      parameter( ZERO_8=0.0, ONE_8=1.0, TWO_8=2.0, FOUR_8=4.0,
     $           HALF_8=0.5, QUARTER_8=.25 )
*
      real*8 cxm_8, cym_8, czm_8, rxm_8, rym_8, rzm_8, mumum_8
      real*8 cxm2_8,cym2_8,czm2_8,rxm2_8,rym2_8,rzm2_8,mumum2_8,mumum3_8
      real*8 rxm3_8,rym3_8,rzm3_8,inv_cxyzm2_8,inv_cxyzm22_8
*     ______________________________________________________
*
      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
*
!$omp parallel private (x_8,y_8,z_8,mumu_8,rx_8,ry_8,rz_8,
!$omp%             cx_8,cy_8,cz_8,a1_8,a2_8,b1_8,b2_8,b3_8,
!$omp%             mumum_8,rxm_8,rym_8,rzm_8,cxm_8,cym_8,czm_8,
!$omp%             cxm2_8,cym2_8,czm2_8,i0,in,j0,jn,
!$omp%             rxm2_8,rym2_8,rzm2_8,i00,inn,j00,jnn,
!$omp%             mumum2_8,mumum3_8,i,j,k,
!$omp%             rxm3_8,rym3_8,rzm3_8,b1ob0_8,tot_8,
!$omp%             inv_cxyzm2_8,inv_cxyzm22_8)
*
*     ----------------------------
*     Zero adjoint local variables
*     ----------------------------
      cx_8 = ZERO_8
      cy_8 = ZERO_8
      cz_8 = ZERO_8
*
      rx_8 = ZERO_8
      ry_8 = ZERO_8
      rz_8 = ZERO_8
*
      mumu_8 = ZERO_8
*
*     -------------------------
*     START ADJOINT CALCULATION
*     -------------------------
*
****************************************
* The linear RHS of Helmholtz equation *
****************************************
!$omp do
      do j= 1+pil_s, l_nj-pil_n 
*
         k = l_nk 
*
            a1_8 = QUARTER_8*Geomg_hz_8(k-1)
            b1_8 = HALF_8*Geomg_z_8(k-1)
            b2_8 = HALF_8*Geomg_z_8(k)
            do i= 1+pil_w, l_ni-pil_e 
*
*              ADJ
*              ---
               F_wijk2(i,j,k-1) = b1_8*  F_rhell(i,j,k)   + F_wijk2(i,j,k-1)
               F_wijk2(i,j,k  ) = b2_8*  F_rhell(i,j,k)   + F_wijk2(i,j,k  )
               F_wijk1(i,j,k-1) = a1_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k-1) 
               F_wijk1(i,j,k  ) = a1_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k  )
               F_rhell(i,j,k  ) = ZERO_8
*
            end do

         do k=l_nk-1,2,-1
*
            a1_8 = QUARTER_8*Geomg_hz_8(k-1)
            a2_8 = QUARTER_8*Geomg_hz_8(k)
            b1_8 = HALF_8*Geomg_z_8(k-1)
            b3_8 = HALF_8*Geomg_z_8(k+1)
            do i= 1+pil_w, l_ni-pil_e 
*
*              ADJ
*              ---
               F_wijk2(i,j,k-1) =   b1_8*  F_rhell(i,j,k)   + F_wijk2(i,j,k-1)
               F_wijk2(i,j,k+1) = - b3_8*  F_rhell(i,j,k)   + F_wijk2(i,j,k+1)
               F_wijk1(i,j,k  ) =   a2_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k  )
               F_wijk1(i,j,k+1) =   a2_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k+1)
               F_wijk1(i,j,k-1) =   a1_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k-1)
               F_wijk1(i,j,k  ) =   a1_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k  )
               F_rhell(i,j,k  ) = ZERO_8
*
            end do
*
         end do
*
         k = 1

            a2_8 = QUARTER_8*Geomg_hz_8(k)
            b2_8 = HALF_8*Geomg_z_8(k)
            b3_8 = HALF_8*Geomg_z_8(k+1)
            do i= 1+pil_w, l_ni-pil_e
*
*              ADJ
*              ---
               F_wijk2(i,j,k  ) = - b2_8*  F_rhell(i,j,k)   + F_wijk2(i,j,k  )
               F_wijk2(i,j,k+1) = - b3_8*  F_rhell(i,j,k)   + F_wijk2(i,j,k+1)
               F_wijk1(i,j,k  ) =   a2_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k  )
               F_wijk1(i,j,k+1) =   a2_8*( F_rhell(i,j,k) ) + F_wijk1(i,j,k+1)
               F_rhell(i,j,k  ) = ZERO_8
*
            end do
*
      end do
!$omp enddo
*
**************************************
* ADJ of
* Combination of governing equations * 
**************************************
*
      a1_8 = ONE_8/( Dcst_grav_8 * Cstv_tau_8 )
      a2_8 = Schm_nonhy_8/( Dcst_grav_8**2 * Cstv_tau_8**2 )
      b1_8 = gamma_8/Cstv_tau_8 
      b2_8 = gamma_8/Cstv_tau_8/Dcst_cappa_8
*
!$omp do
      do k=1,l_nk
*
*     ADJ of
*     Combination of divergence & continuity equations
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
         if (.not. Schm_hydro_L) then

*        Combination of equations for vertical motion
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            do j= 1+pil_s, l_nj-pil_n
            do i= 1+pil_w, l_ni-pil_e
*
*              ADJ
*              ---
               F_r3 (i,j,k) =    b2_8* F_wijk2(i,j,k) + F_r3 (i,j,k)
*
               F_r3p(i,j,k) =    b1_8* F_wijk1(i,j,k) + F_r3p(i,j,k)
*
               F_r3 (i,j,k) =          F_r3p  (i,j,k) + F_r3 (i,j,k)
               F_rth(i,j,k) = - eps_8* F_r3p  (i,j,k) + F_rth(i,j,k)
               F_r3p(i,j,k) = ZERO_8
*
               F_rw (i,j,k) =    a1_8* F_r3   (i,j,k) + F_rw (i,j,k)
               F_rvv(i,j,k) =    a2_8* F_r3   (i,j,k) + F_rvv(i,j,k)
               F_r3 (i,j,k) = ZERO_8
*
C              F_rvv(i,j,k) = F_rvv(i,j,k)
*
            end do
            end do
         endif
*
         do j= 1+pil_s, l_nj-pil_n
         do i= 1+pil_w, l_ni-pil_e
*
*           ADJ 
*           ---
            F_rth  (i,j,k) = b2_8*F_wijk2(i,j,k) + F_rth(i,j,k)
            F_wijk2(i,j,k) = ZERO_8
*
            F_r1   (i,j,k) =      F_wijk1(i,j,k) + F_r1 (i,j,k)
            F_wijk1(i,j,k) = ZERO_8
*
            F_rd (i,j,k) =   F_r1(i,j,k)             + F_rd (i,j,k)
            F_rcn(i,j,k) = - F_r1(i,j,k) /Cstv_tau_8 + F_rcn(i,j,k)
            F_r1 (i,j,k) = ZERO_8 
*
         end do
         end do
*

         if (G_lam) then
             do j= l_nj-pil_n,1+pil_s,-1
             do i= l_ni-pil_e,1+pil_w,-1
                F_ru(i,  j,  k) =(  F_rd(i,j,k) )/( Geomg_cy2_8(j)*Geomg_hxu_8(i-1) ) + F_ru(i,  j,  k)
                F_ru(i-1,j,  k) =(- F_rd(i,j,k) )/( Geomg_cy2_8(j)*Geomg_hxu_8(i-1) ) + F_ru(i-1,j,  k)
                F_rv(i,  j,  k) =(  F_rd(i,j,k) )*  Geomg_invhsyv_8(j-1)              + F_rv(i,  j,  k)
                F_rv(i,  j-1,k) =(- F_rd(i,j,k) )*  Geomg_invhsyv_8(j-1)              + F_rv(i,  j-1,k)
                F_rd(i,  j,  k) = ZERO_8
             end do
             end do
         else
*
*            ADJ 
*            ---
             call caldiv_2_ad ( F_rd(minx,miny,k), F_ru(minx,miny,k),
     $                          F_rv(minx,miny,k), LDIST_DIM, 1)
*
         endif
*
      end do
!$omp enddo
*
!$omp single 
*
*     ADJ of
*     Compute the RHS of divergence equation 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      call rpn_comm_adj_halo( F_rv, LDIST_DIM,l_ni,l_njv,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
      call rpn_comm_adj_halo( F_ru, LDIST_DIM,l_niu,l_nj,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
!$omp end single 
*
!$omp do
      do k= 1,l_nk

*     Zero F_rv halo
*     -------------
      call v4d_zerohalo ( F_rv(l_minx,l_miny,k),l_ni,l_njv,LDIST_DIM,1)
*
*     Zero F_ru halo
*     --------------
      call v4d_zerohalo ( F_ru(l_minx,l_miny,k),l_niu,l_nj,LDIST_DIM,1)
*
      enddo
!$omp enddo
*
*
**********************************************************
* ADJ of
* Final form of the RHS of horizontal momentum equations *
**********************************************************

*     CONSTANT
*     --------
      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
      j00 = 1
      jnn = l_njv
      i00 = 1+pil_w
      inn = l_ni-pil_e
      if (G_lam) then
         if (l_south) j00 = 1+pil_s
         if (l_north) jnn = l_njv-pil_n
      else
         if (l_south) j00 = 2
         if (l_north) jnn = l_njv-1
      endif
*
!$omp do 
      do k=1,l_nk 
*
*     ADJ of
*     Add advective & topographic contributions to Ru & Rv
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
        if (.not.G_lam) then
            if (l_north) then
            do i = l_ni,1,-1
*
*           ADJ
*           ---
            F_rvw2(i,l_njv+1,k) = inuvl_wyyv3_8(l_njv,3)* F_rv(i,l_njv,k)
     %                            + F_rvw2(i,l_njv+1,k)
            F_rvw2(i,l_njv  ,k) = inuvl_wyyv3_8(l_njv,2)* F_rv(i,l_njv,k)
     %                            + F_rvw2(i,l_njv  ,k)
            F_rvw2(i,l_njv-1,k) = inuvl_wyyv3_8(l_njv,1)* F_rv(i,l_njv,k)
     %                            + F_rvw2(i,l_njv-1,k)
*
            end do
            endif
*
            if (l_south) then
            do i = l_ni,1,-1
*
*           ADJ 
*           ---
            F_rvw2(i,3,k) = inuvl_wyyv3_8(1,4)*F_rv(i,1,k) + F_rvw2(i,3,k)
            F_rvw2(i,2,k) = inuvl_wyyv3_8(1,3)*F_rv(i,1,k) + F_rvw2(i,2,k)
            F_rvw2(i,1,k) = inuvl_wyyv3_8(1,2)*F_rv(i,1,k) + F_rvw2(i,1,k)
*
            end do
            endif
*
         endif
*
         do j= jnn, j00,-1
         do i= inn, i00,-1
*
*           ADJ 
*           ---
            F_rvw2(i,j+2,k) = inuvl_wyyv3_8(j,4)*F_rv(i,j,k) + F_rvw2(i,j+2,k)
            F_rvw2(i,j+1,k) = inuvl_wyyv3_8(j,3)*F_rv(i,j,k) + F_rvw2(i,j+1,k)
            F_rvw2(i,j  ,k) = inuvl_wyyv3_8(j,2)*F_rv(i,j,k) + F_rvw2(i,j  ,k)
            F_rvw2(i,j-1,k) = inuvl_wyyv3_8(j,1)*F_rv(i,j,k) + F_rvw2(i,j-1,k)
*
         end do
         end do
*
         do j= jn,j0,-1
         do i= in,i0,-1
*
*           ADJ 
*           ---
            F_ruw2(i+2,j,k) = inuvl_wxxu3_8(i,4)*F_ru(i,j,k) + F_ruw2(i+2,j,k)
            F_ruw2(i+1,j,k) = inuvl_wxxu3_8(i,3)*F_ru(i,j,k) + F_ruw2(i+1,j,k)
            F_ruw2(i  ,j,k) = inuvl_wxxu3_8(i,2)*F_ru(i,j,k) + F_ruw2(i  ,j,k)
            F_ruw2(i-1,j,k) = inuvl_wxxu3_8(i,1)*F_ru(i,j,k) + F_ruw2(i-1,j,k)
*
         end do
         end do
*
      end do
!$omp enddo 
*
!$omp single 
*
*     ADJ 
*     ---
      call rpn_comm_adj_halo( F_rvw2, LDIST_DIM, l_ni,l_nj,G_nk,
     $              G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
      call rpn_comm_adj_halo( F_ruw2, LDIST_DIM, l_ni,l_nj,G_nk,
     $              G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
!$omp end single 
*
!$omp do
      do k= 1,l_nk

*     Zero F_rvw2,F_ruw2 halo
*     -----------------------
      call v4d_zerohalo ( F_rvw2(l_minx,l_miny,k),l_ni,l_nj,LDIST_DIM,1)
      call v4d_zerohalo ( F_ruw2(l_minx,l_miny,k),l_ni,l_nj,LDIST_DIM,1)
*
      enddo
!$omp enddo
*
******************************************************************
* ADJ of
* Metric corrections to the RHS of horizontal momentum equations *
******************************************************************
      tot_8 = - FOUR_8*Dcst_omega_8/Cstv_dt_8
      b1ob0_8 = Offc_b1_8/Offc_b0_8
*
      i0 = 1
      in = l_ni
      j0 = 1
      jn = l_nj
      if (G_lam) then
         if (l_west)  i0= pil_w
         if (l_east)  in= l_niu - pil_e + 2
         if (l_south) j0= pil_s
         if (l_north) jn= l_njv - pil_n + 2
      endif
*
!$omp do 
      do 101 k=l_nk,1,-1  
      do 101 j= jn,j0,-1
      do 101 i= in,i0,-1
*
*     ---------------------------------
*     START REBUILD TRAJECTORY LOOP 100
*     ---------------------------------
*
*     Compute components of r(t0) and put in x, y, z
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        CONSTANT 
*        --------
         y_8 = adw_cy_8(j)
         if (G_lam) then
         x_8 = adw_cx_8(i) * y_8
         y_8 = adw_sx_8(i) * y_8
         else
         x_8 = adw_cx_8(l_i0 - 1 + i) * y_8
         y_8 = adw_sx_8(l_i0 - 1 + i) * y_8
         endif
         z_8 = adw_sy_8(j)
*
*     Compute (Rx, Ry, Rz) = (rx, ry, rz)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        TRAJECTORY
*        ----------
         mumum_8 =    ( ONE_8 + F_zct1m(i,j,k) )*( ONE_8 - F_zct1m(i,j,k) )
*
*        TRAJECTORY  
*        ----------
         mumum3_8 =     mumum_8
         if (mumum_8 .GT. ZERO_8) then
         mumum3_8 =     ONE_8 / mumum_8
         endif
*
*        TRAJECTORY
*        ----------
         rzm_8 = F_rvw2m(i,j,k)
         rym_8 =  mumum3_8 * (F_xct1m(i,j,k)*F_ruw2m(i,j,k)-
     $                        F_yct1m(i,j,k)*F_zct1m(i,j,k)*rzm_8)
         rxm_8 = -mumum3_8 * (F_yct1m(i,j,k)*F_ruw2m(i,j,k)+
     $                        F_xct1m(i,j,k)*F_zct1m(i,j,k)*rzm_8)
*
*     Compute components of (r - r~) and put in cx, cy, cz
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        TRAJECTORY
*        ----------
         cxm_8 = x_8 - F_xct1m(i,j,k)
         cym_8 = y_8 - F_yct1m(i,j,k)
         czm_8 = z_8 - F_zct1m(i,j,k)
*
*     Find components of Coriolis vector  2 * omg/tau * [k' ^ (r - r~)]
*     where geographic unit north vector  k' = r_13 I + r_23 J + r_33 K
*     Then substract them from (rx, ry, rz)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
         if (.not.Cori_cornl_L) then
*
*        TRAJECTORY
*        ----------
         rxm3_8= rxm_8 + ( Grd_rot_8(2,3)*czm_8 - Grd_rot_8(3,3)*cym_8 )*tot_8
         rym3_8= rym_8 + ( Grd_rot_8(3,3)*cxm_8 - Grd_rot_8(1,3)*czm_8 )*tot_8
         rzm3_8= rzm_8 + ( Grd_rot_8(1,3)*cym_8 - Grd_rot_8(2,3)*cxm_8 )*tot_8
*
         else
*
*        TRAJECTORY
*        ----------
         rxm3_8= rxm_8 
         rym3_8= rym_8 
         rzm3_8= rzm_8 
*
         endif
*
*     Compute components of c and put in cx, cy, cz 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*        TRAJECTORY
*        ----------
         cxm2_8 = x_8 + b1ob0_8*F_xct1m(i,j,k)
         cym2_8 = y_8 + b1ob0_8*F_yct1m(i,j,k)
         czm2_8 = z_8 + b1ob0_8*F_zct1m(i,j,k)
*
*     Compute mu and modify (Rx,Ry,Rz)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*        TRAJECTORY
*        ----------
         inv_cxyzm2_8 = ONE_8/( x_8*cxm2_8+ y_8*cym2_8+ z_8*czm2_8)
         inv_cxyzm22_8 = ONE_8/(( x_8*cxm2_8+ y_8*cym2_8+ z_8*czm2_8)**2)
         mumum2_8 = - ( x_8*rxm3_8 + y_8*rym3_8 + z_8*rzm3_8 )*inv_cxyzm2_8
         rxm2_8 = rxm3_8 + mumum2_8*cxm2_8
         rym2_8 = rym3_8 + mumum2_8*cym2_8
         rzm2_8 = rzm3_8 + mumum2_8*czm2_8
*
*     -------------------------------
*     END REBUILD TRAJECTORY LOOP 100
*     -------------------------------
*
*     ADJ of
*     Compute advective contributions on G-grid
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        ADJ  
*        ---
         rz_8          =   F_rvw2(i,j,k) 
         F_rvw1(i,j,k) = - F_rvw2(i,j,k) + F_rvw1(i,j,k)
         F_rvw2(i,j,k) = ZERO_8
*
         ry_8          = (   x_8* F_ruw2(i,j,k) ) 
         rx_8          = ( - y_8* F_ruw2(i,j,k) ) 
         F_ruw1(i,j,k) =        - F_ruw2(i,j,k)   + F_ruw1(i,j,k)
         F_ruw2(i,j,k) = ZERO_8
*
*     ADJ of
*     Compute mu and modify (Rx,Ry,Rz)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        ADJ  
*        ---
         cz_8   = mumum2_8*rz_8   
*
         cy_8   = mumum2_8*ry_8   
*
         cx_8   = mumum2_8*rx_8  
*
         mumu_8 =  rx_8*cxm2_8 + (ry_8*cym2_8 + rz_8*czm2_8)
*
         rx_8 = -  ( x_8*mumu_8 )*inv_cxyzm2_8 + rx_8
         ry_8 = -  ( y_8*mumu_8 )*inv_cxyzm2_8 + ry_8
         rz_8 = -  ( z_8*mumu_8 )*inv_cxyzm2_8 + rz_8
         cx_8 = 
     %           ( ( x_8*rxm2_8+ y_8*rym2_8+ z_8*rzm2_8) 
     %            *( x_8*mumu_8                        ))*inv_cxyzm22_8 + cx_8 
         cy_8 = 
     %           ( ( x_8*rxm2_8+ y_8*rym2_8+ z_8*rzm2_8) 
     %            *(             y_8*mumu_8            ))*inv_cxyzm22_8 + cy_8 
         cz_8 = 
     %           ( ( x_8*rxm2_8+ y_8*rym2_8+ z_8*rzm2_8) 
     %            *(                         z_8*mumu_8))*inv_cxyzm22_8 + cz_8 
*
*     ADJ of
*     Compute components of c and put in cx, cy, cz
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        ADJ  
*        ---
         F_zct1(i,j,k) = b1ob0_8*cz_8 + F_zct1(i,j,k) 
         F_yct1(i,j,k) = b1ob0_8*cy_8 + F_yct1(i,j,k)
         F_xct1(i,j,k) = b1ob0_8*cx_8 + F_xct1(i,j,k) 
*
*     ADJ of
*     Find components of Coriolis vector  2 * omg/tau * [k' ^ (r - r~)]
*     where geographic unit north vector  k' = r_13 I + r_23 J + r_33 K
*     Then substract them from (rx, ry, rz)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
         if (.not.Cori_cornl_L) then
*
*        ADJ  
*        ---
         cx_8 = ( - Grd_rot_8(2,3)* rz_8 )*tot_8 
         cx_8 = (   Grd_rot_8(3,3)* ry_8 )*tot_8 + cx_8
*
         cy_8 = (   Grd_rot_8(1,3)* rz_8 )*tot_8 
         cy_8 = ( - Grd_rot_8(3,3)* rx_8 )*tot_8 + cy_8 
*
         cz_8 = ( - Grd_rot_8(1,3)* ry_8 )*tot_8 
         cz_8 = (   Grd_rot_8(2,3)* rx_8 )*tot_8 + cz_8
*
         else
*
         cx_8 = ZERO_8
         cy_8 = ZERO_8
         cz_8 = ZERO_8
*
         endif
*
*     ADJ of
*     Compute components of (r - r~) and put in cx, cy, cz
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        ADJ 
*        ---
         F_zct1(i,j,k) = - cz_8 + F_zct1(i,j,k)
*
         F_yct1(i,j,k) = - cy_8 + F_yct1(i,j,k) 
*
         F_xct1(i,j,k) = - cx_8 + F_xct1(i,j,k)
*
*
*     ADJ of
*     Compute components of r(t0) and put in x, y, z
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*      ADJ
*      ---
       mumu_8 = ry_8 * (
     %                   F_xct1m(i,j,k)*F_ruw2m(i,j,k)
     %                 - F_yct1m(i,j,k)*F_zct1m(i,j,k)*rzm_8) +
     %       (- rx_8 * (
     %                 + F_yct1m(i,j,k)*F_ruw2m(i,j,k)
     %                 + F_xct1m(i,j,k)*F_zct1m(i,j,k)*rzm_8) )
*
*      ADJ 
*      ---
       F_xct1 (i,j,k)= -mumum3_8* ( rx_8*F_zct1m(i,j,k)*rzm_8) + F_xct1 (i,j,k)
       F_zct1 (i,j,k)= -mumum3_8* ( F_xct1m(i,j,k)*rx_8*rzm_8) + F_zct1 (i,j,k)
       rz_8          = -mumum3_8* ( F_xct1m(i,j,k)*F_zct1m(i,j,k)*rx_8) + rz_8
       F_yct1 (i,j,k)= -mumum3_8* ( rx_8*F_ruw2m(i,j,k)      ) + F_yct1 (i,j,k) 
       F_ruw2 (i,j,k)= -mumum3_8* ( F_yct1m(i,j,k)*rx_8      ) + F_ruw2 (i,j,k)
*
       F_yct1 (i,j,k)=  mumum3_8* ( - ry_8*F_zct1m(i,j,k)*rzm_8) + F_yct1 (i,j,k)
       F_zct1 (i,j,k)=  mumum3_8* ( - F_yct1m(i,j,k)*ry_8*rzm_8) + F_zct1 (i,j,k)
       rz_8          =  mumum3_8* ( - F_yct1m(i,j,k)*F_zct1m(i,j,k)*ry_8) + rz_8
       F_xct1 (i,j,k)=  mumum3_8* ( ry_8 *F_ruw2m(i,j,k)       ) + F_xct1 (i,j,k)
       F_ruw2 (i,j,k)=  mumum3_8* ( F_xct1m(i,j,k)* ry_8       ) + F_ruw2 (i,j,k)
*
       F_rvw2(i,j,k) = rz_8 + F_rvw2(i,j,k)
*
*        ADJ
*        ---
         if (mumum_8 .GT. ZERO_8) then
         mumu_8  = - ( ONE_8 / mumum_8**2) * mumu_8
         endif
*
*     ADJ of
*     Compute (Rx, Ry, Rz) = (rx, ry, rz)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*        ADJ
*        ---
         F_zct1 (i,j,k) = ( ONE_8 + F_zct1m(i,j,k) )*( - mumu_8 ) + F_zct1 (i,j,k)
         F_zct1 (i,j,k) = (   mumu_8 )*( ONE_8 - F_zct1m(i,j,k) ) + F_zct1 (i,j,k)
*
101   continue 
!$omp enddo 
*
!$omp end parallel
*
*     __________________________________________________________________
*
      return
      end