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

      subroutine bacp_2_ad 1,1
     $                  ( F_itr  ,F_itnlh, F_st0   ,F_pipt0 ,
     $                    F_qt0  ,F_fit0 , F_fipt0 ,F_fis   ,F_tt0   ,
     $                    F_tpt0 ,F_tplt0, F_ut0   ,F_vt0   ,F_psdt0 ,
     $                    F_tdt0 ,F_qpt0 , F_wt0   ,
     $                    F_mut0 ,F_multx, F_gptx  ,F_gxtx  ,
     $                    F_ru   ,F_rv   , F_rth   ,F_r3    ,F_r3p   ,
     $                    F_rvv  ,F_rcn  , F_nu    ,F_nv    ,
     $                    F_nth  ,F_n3   , F_n3p   ,
     $                    F_ncn  ,F_wijk0, F_wijk1 ,
*
     $                                     F_gptxm ,
     $                                     F_rthm  ,F_r3m   ,F_r3pm  ,
     $                    F_rvvm ,         
     $                    F_nthm ,F_n3m   ,F_n3pm  ,
     $                            F_wijk0m,F_wijk1m,
*
     $                                     DIST_DIM, Nk )
*
      implicit none
*
      integer  F_itr, F_itnlh, DIST_DIM, Nk 
      real     F_st0  (DIST_SHAPE)    ,
     %         F_pipt0(DIST_SHAPE,Nk) ,  F_qt0  (DIST_SHAPE,Nk) ,
     %         F_fit0 (DIST_SHAPE,Nk) ,  F_fipt0(DIST_SHAPE,Nk) ,
     %         F_fis  (DIST_SHAPE)    ,  F_tt0  (DIST_SHAPE,Nk) ,
     %         F_tpt0 (DIST_SHAPE,Nk) ,  F_tplt0(DIST_SHAPE,Nk) ,
     %         F_ut0  (DIST_SHAPE,Nk) ,  F_vt0  (DIST_SHAPE,Nk) ,
     %         F_psdt0(DIST_SHAPE,Nk) ,  F_tdt0 (DIST_SHAPE,Nk) ,
     %         F_qpt0 (DIST_SHAPE,Nk) ,  F_wt0  (DIST_SHAPE,Nk) ,
     %         F_mut0 (DIST_SHAPE,Nk) ,  F_multx(DIST_SHAPE,Nk) ,
     %         F_gptx (DIST_SHAPE,Nk) ,  F_gxtx (DIST_SHAPE,Nk) ,
     %         F_ru   (DIST_SHAPE,Nk) ,  F_rv   (DIST_SHAPE,Nk) ,
     %         F_rcn  (DIST_SHAPE,Nk) ,  F_rth  (DIST_SHAPE,Nk) ,
     %         F_rvv  (DIST_SHAPE,Nk) ,  F_nth  (DIST_SHAPE,Nk) ,
     %         F_r3   (DIST_SHAPE,Nk) ,  F_r3p  (DIST_SHAPE,Nk) ,
     %         F_nu   (DIST_SHAPE,Nk) ,  F_nv   (DIST_SHAPE,Nk) ,
     %         F_n3   (DIST_SHAPE,Nk) ,  F_n3p  (DIST_SHAPE,Nk) ,
     %         F_ncn  (DIST_SHAPE,Nk) ,
     %         F_wijk0(DIST_SHAPE,Nk) ,  F_wijk1(DIST_SHAPE,Nk)
*
      real     F_gptxm (DIST_SHAPE,Nk),  
     %                                   F_rthm  (DIST_SHAPE,Nk),
     %         F_rvvm  (DIST_SHAPE,Nk),  F_nthm  (DIST_SHAPE,Nk),
     %         F_r3m   (DIST_SHAPE,Nk),  F_r3pm  (DIST_SHAPE,Nk),
     %         F_n3m   (DIST_SHAPE,Nk),  F_n3pm  (DIST_SHAPE,Nk),
     %         F_wijk0m(DIST_SHAPE,Nk),  F_wijk1m(DIST_SHAPE,Nk)
*
*author
*     M.Tanguay
*
*revision
* v2_10 - Tanguay M.        - initial MPI version
* v2_30 - Edouard S.        - remove pi' at the top (F_pptt0)
* v2_31 - Tanguay M.        - adapt for vertical hybrid coordinate and LAM version 
*                           - adapt for tracers in tr3d  
* v3_00 - Tanguay M.        - adapt to restructured bacp_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
* v3_30 - Tanguay M.        - Enforce similarities between NL and TRAJ TL  
*
*object
*     see id section 
*     ------------------------------------------------------------------------
*     REMARK: INPUT TRAJ: F_gptxm, F_rthm, F_nthm,
*                         F_r3m, F_r3pm, F_rvvm, F_n3m, F_n3pm (NoHyd)
*     ------------------------------------------------------------------------
*
*arguments
*     see documentation of appropriate comdecks 
*
*implicits
#include "glb_ld.cdk"
*
      integer i0, j0, in, jn
*
      i0 = 1+pil_w
      in = l_ni-pil_e
      j0 = 1+pil_s
      jn = l_nj-pil_n
*
      call bacp_2_2_ad
     $                  ( F_itr  ,F_itnlh, F_st0   ,F_pipt0 ,
     $                    F_qt0  ,F_fit0 , F_fipt0 ,F_fis   ,F_tt0   ,
     $                    F_tpt0 ,F_tplt0, F_ut0   ,F_vt0   ,F_psdt0 ,
     $                    F_tdt0 ,F_qpt0 , F_wt0   ,
     $                    F_mut0 ,F_multx, F_gptx  ,F_gxtx  ,
     $                    F_ru   ,F_rv   , F_rth   ,F_r3    ,F_r3p   ,
     $                    F_rvv  ,F_rcn  , F_nu    ,F_nv    ,
     $                    F_nth  ,F_n3   , F_n3p   ,
     $                    F_ncn  ,F_wijk0, F_wijk1 ,
*
     $                                     F_gptxm ,
     $                                     F_rthm  ,F_r3m   ,F_r3pm  ,
     $                    F_rvvm ,
     $                    F_nthm ,F_n3m   ,F_n3pm  ,
     $                            F_wijk0m,F_wijk1m,
*
     $                                     DIST_DIM, Nk, i0, j0, in, jn )

*
      return
      end
*

      subroutine bacp_2_2_ad 1,2
     $                  ( F_itr  ,F_itnlh, F_st0   ,F_pipt0 ,
     $                    F_qt0  ,F_fit0 , F_fipt0 ,F_fis   ,F_tt0   ,
     $                    F_tpt0 ,F_tplt0, F_ut0   ,F_vt0   ,F_psdt0 ,
     $                    F_tdt0 ,F_qpt0 , F_wt0   ,
     $                    F_mut0 ,F_multx, F_gptx  ,F_gxtx  ,
     $                    F_ru   ,F_rv   , F_rth   ,F_r3    ,F_r3p   ,
     $                    F_rvv  ,F_rcn  , F_nu    ,F_nv    ,
     $                    F_nth  ,F_n3   , F_n3p   ,
     $                    F_ncn  ,F_wijk0, F_wijk1 ,
*
     $                                     F_gptxm ,
     $                                     F_rthm  ,F_r3m   ,F_r3pm  ,
     $                    F_rvvm ,
     $                    F_nthm ,F_n3m   ,F_n3pm  ,
     $                            F_wijk0m,F_wijk1m,
*
     $                                     DIST_DIM, Nk, i0, j0, in, jn )
*
      implicit none
*
      integer  F_itr, F_itnlh, DIST_DIM, Nk, i0, j0, in, jn
      real     F_st0  (DIST_SHAPE)    ,
     %         F_pipt0(DIST_SHAPE,Nk) ,  F_qt0  (DIST_SHAPE,Nk) ,
     %         F_fit0 (DIST_SHAPE,Nk) ,  F_fipt0(DIST_SHAPE,Nk) ,
     %         F_fis  (DIST_SHAPE)    ,  F_tt0  (DIST_SHAPE,Nk) ,
     %         F_tpt0 (DIST_SHAPE,Nk) ,  F_tplt0(DIST_SHAPE,Nk) ,
     %         F_ut0  (DIST_SHAPE,Nk) ,  F_vt0  (DIST_SHAPE,Nk) ,
     %         F_psdt0(DIST_SHAPE,Nk) ,  F_tdt0 (DIST_SHAPE,Nk) ,
     %         F_qpt0 (DIST_SHAPE,Nk) ,  F_wt0  (DIST_SHAPE,Nk) ,
     %         F_mut0 (DIST_SHAPE,Nk) ,  F_multx(DIST_SHAPE,Nk) ,
     %         F_gptx (DIST_SHAPE,Nk) ,  F_gxtx (DIST_SHAPE,Nk) ,
     %         F_ru   (DIST_SHAPE,Nk) ,  F_rv   (DIST_SHAPE,Nk) ,
     %         F_rcn  (DIST_SHAPE,Nk) ,  F_rth  (DIST_SHAPE,Nk) ,
     %         F_rvv  (DIST_SHAPE,Nk) ,  F_nth  (DIST_SHAPE,Nk) ,
     %         F_r3   (DIST_SHAPE,Nk) ,  F_r3p  (DIST_SHAPE,Nk) ,
     %         F_nu   (DIST_SHAPE,Nk) ,  F_nv   (DIST_SHAPE,Nk) ,
     %         F_n3   (DIST_SHAPE,Nk) ,  F_n3p  (DIST_SHAPE,Nk) ,
     %         F_ncn  (DIST_SHAPE,Nk) ,
     %         F_wijk0(DIST_SHAPE,Nk) ,  F_wijk1(DIST_SHAPE,Nk)
*
      real     F_gptxm (DIST_SHAPE,Nk),
     %                                   F_rthm  (DIST_SHAPE,Nk),
     %         F_rvvm  (DIST_SHAPE,Nk),  F_nthm  (DIST_SHAPE,Nk),
     %         F_r3m   (DIST_SHAPE,Nk),  F_r3pm  (DIST_SHAPE,Nk),
     %         F_n3m   (DIST_SHAPE,Nk),  F_n3pm  (DIST_SHAPE,Nk),
     %         F_wijk0m(DIST_SHAPE,Nk),  F_wijk1m(DIST_SHAPE,Nk)
*
*implicits
#include "glb_ld.cdk"
#include "cori.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "geomg.cdk"
#include "schm.cdk"
*
      integer i, j, k, nij
      real*8  ZERO_8, ONE_8, TWO_8, HALF_8, QUARTER_8, gamma_8, eps_8
      real*8  aaa_8,bbb_8,ccc_8,ddd_8,a1_8,b1_8,b2_8,xxx_8,xx1_8,
     %        yyy_8,zzz_8,pd2_8,aaa1_8,aaa2_8,bbb1_8,bbb2_8,bbb3_8,
     %        ccc1_8,ccc2_8,ddd1_8
      real*8  xxx_m_8, xx1_m_8, yyy_m_8, zzz_m_8, pd2_m_8
      parameter( ZERO_8=0.0, ONE_8=1.0, TWO_8=2.0, HALF_8=.5,  QUARTER_8=.25 )
      real*8 tmp_8, c1_8, inv_z_8(G_nk), c2_8, c3_8
      real*8, dimension(i0:in,j0:jn):: xexpm_8, yexpm_8, xlogm_8,
     %                        ylogm_8, xrecm_8, xsqm_8,  qpm_8 
      real*8, dimension(i0:in,j0:jn,l_nk):: yreckm_8,xrsqkm_8,rpipkm_8
*
      real w_pipt0m(DIST_SHAPE,Nk),w_multxm(DIST_SHAPE,Nk),w_qt0m (DIST_SHAPE,Nk),
     %     w_fipt0m(DIST_SHAPE,Nk),w_qpt0m (DIST_SHAPE,Nk),w_gxtxm(DIST_SHAPE,Nk),
     %     w_tplt0m(DIST_SHAPE,Nk),w_st0m  (DIST_SHAPE)
*
      real exp_m,rec_m
*
*     ______________________________________________________
*
      nij = (in - i0 + 1)*(jn - j0 + 1)
*
*     ----------------------------
*     Zero adjoint local variables
*     ----------------------------
C     xxx_8 = ZERO_8 
C     xx1_8 = ZERO_8 
C     yyy_8 = ZERO_8 
C     zzz_8 = ZERO_8 
C     pd2_8 = ZERO_8 
*
*     ---------------------------
*     START TRAJECTORY EVALUATION
*     ---------------------------
*
*     Constants for nonhydro distortion
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      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
*
      do k = 1, G_nk
         inv_z_8(k) = 1.0d0 / Geomg_z_8(k)
      end do
*
**********************************************************
*  1. Retrieve the nonhydro deviation q' of log pressure *
**********************************************************
      aaa_8  =  gamma_8/( Dcst_cappa_8*Cstv_tau_8*Dcst_rgasd_8*Cstv_tstr_8 )
      aaa1_8 = Dcst_rgasd_8*Cstv_tstr_8
      aaa2_8 = ONE_8/Dcst_rayt_8**2
      bbb_8  = Geomg_z_8(l_nk) / ( Dcst_rgasd_8*Cstv_tstr_8 )
      bbb1_8 = Dcst_cappa_8*Cstv_tstr_8
      bbb2_8 = ONE_8/(Dcst_grav_8*Cstv_tau_8)
      bbb3_8 = Schm_nonhy_8/((Dcst_grav_8**2)*(Cstv_tau_8**2))
      c1_8   = 1.0d0 / Dcst_cappa_8
      c2_8   = 1.0d0 / Geomg_pib(l_nk)
      c3_8   = 1.0d0 / Dcst_grav_8
      ccc_8  = Schm_nonhy_8*gamma_8/( Dcst_grav_8**2 * Cstv_tau_8**3 )
      ccc1_8 = Geomg_z_8(l_nk) * c2_8
      ccc2_8 = Dcst_rgasd_8*Cstv_tstr_8
      ddd_8  = Schm_nonhy_8 * gamma_8
     %         /( Dcst_cappa_8 * Dcst_grav_8**2 * Cstv_tau_8**3 )
      ddd1_8 = Cstv_tau_8*Cstv_tstr_8
*
!$omp parallel private (xlogm_8,ylogm_8,xrecm_8,qpm_8,  xsqm_8,
!$omp%                  exp_m,  rec_m,
!$omp%                  xxx_m_8,yyy_m_8,zzz_m_8,pd2_m_8,xx1_m_8,
!$omp%                  xxx_8,  yyy_8,  zzz_8,  pd2_8,  xx1_8,
!$omp%                  b1_8,   b2_8,   a1_8,   tmp_8) 
*
      if (.not. Schm_hydro_L) then
*
      w_qpt0m(:,:,1) = ZERO_8
*
!$omp do
      do j= j0, jn
         do k=1,l_nk-1
         xxx_8 = HALF_8*Geomg_hz_8(k)
         yyy_8 = (ccc_8*c1_8)*HALF_8*( Geomg_z_8(k) + Geomg_z_8(k+1) )
         zzz_8 = Cstv_tau_8*inv_z_8(k)
         do i= i0, in
*
            w_qpt0m(i,j,k+1) = w_qpt0m(i,j,k)
     %       + xxx_8*( gamma_8*(F_n3pm(i,j,k+1)-F_r3pm(i,j,k+1))
     %       + ccc_8*F_gptxm(i,j,k+1) + gamma_8*(F_n3pm(i,j,k)-F_r3pm(i,j,k))
     %       + ccc_8*F_gptxm(i,j,k) ) + yyy_8*(F_gptxm(i,j,k+1)-F_gptxm(i,j,k))
            w_qpt0m(i,j,k) = zzz_8*w_qpt0m(i,j,k)
*
         end do
         end do
      end do
!$omp enddo
*
!$omp do
      do j= j0, jn
      do i= i0, in
*
         w_qpt0m(i,j,l_nk) = Cstv_tau_8*w_qpt0m(i,j,l_nk)*inv_z_8(l_nk)
*
      end do
      end do
!$omp enddo
*
      endif
*
********************************************
*  2. Calculate s, pi'lin, pi', q and phi' *
********************************************

*     Calculate s 
*     ~~~~~~~~~~~
!$omp do
      do j= j0, jn
      do i= i0, in
*
         w_st0m(i,j)= bbb_8*F_gptxm(i,j,l_nk)*c2_8
*
      end do
      end do
!$omp enddo
*
      if (.not. Schm_hydro_L) then
!$omp do
         do j= j0, jn
         do i= i0, in
*
            w_st0m(i,j) = w_st0m(i,j) - ccc1_8*w_qpt0m(i,j,l_nk)
*
         end do
         end do
!$omp enddo
      endif
*
*     Compute pi'lin (F_wijk0), pi', q and phi'
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
!$omp do
      do j= j0, jn
      do i= i0, in
         xexpm_8(i,j) = w_st0m(i,j)
      end do
      end do
!$omp enddo
*
!$omp single 
      call vexp ( yexpm_8, xexpm_8, nij )
!$omp end single 
*
!$omp do
      do 100 k=1,l_nk 

         if (k.eq.1) then

*        Impose the boundary conditions 
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             do j= j0, jn
             do i= i0, in
*
                w_pipt0m(i,j,1) = Geomg_pib(1) *(yexpm_8(i,j)-ONE_8)
                xlogm_8 (i,j)   = Geomg_z_8(1) + w_pipt0m(i,j,1)
*
             end do
             end do
*
             call vlog ( ylogm_8, xlogm_8, nij )
*
             do j= j0, jn
             do i= i0, in
*
                w_qt0m  (i,j,1) = ylogm_8(i,j) 
                w_fipt0m(i,j,1) = F_gptxm (i,j,1)
                w_gxtxm (i,j,1) = 0.
*
             end do
             end do
         else
             yyy_8 = Dcst_rgasd_8*Cstv_tstr_8 * inv_z_8(k)
             do j= j0, jn
             do i= i0, in
*
                w_pipt0m(i,j,k)= Geomg_pib(k)*(yexpm_8(i,j)-ONE_8)
                xlogm_8 (i,j)  = Geomg_z_8(1) + w_pipt0m(i,j,1)
*
             end do
             end do
*
             call vlog ( ylogm_8, xlogm_8, nij )
*
             do j= j0, jn
             do i= i0, in
*
                F_wijk0m(i,j,k)= Geomg_pib(k) * w_st0m(i,j)
                  w_qt0m(i,j,k)= ylogm_8(i,j)
                w_fipt0m(i,j,k)= F_gptxm(i,j,k) - yyy_8*F_wijk0m(i,j,k)
*
             end do
             end do
*
             if (.not. Schm_hydro_L) then
                do j= j0, jn
                do i= i0, in
*
                   w_qt0m  (i,j,k) =   w_qt0m(i,j,k) +        w_qpt0m(i,j,k)
                   w_fipt0m(i,j,k) = w_fipt0m(i,j,k) - ccc2_8*w_qpt0m(i,j,k)
*
                end do
                end do
             endif
*
         endif
         if (k.eq.l_nk) then
             w_fipt0m (:,:,l_nk) = ZERO_8 
         endif

*******************************
*  3. Retrieve the variable X * 
*******************************

*     Compute term {1} (F_wijk1) without vertical staggering 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         do j= j0, jn
         do i= i0, in
*
            F_wijk1m(i,j,k) = F_nthm(i,j,k) - F_rthm(i,j,k) 
*
         end do
         end do
*
         if (.not. Schm_hydro_L) then
         do j= j0, jn
         do i= i0, in
*
            F_wijk1m(i,j,k) = F_wijk1m(i,j,k) + F_n3m(i,j,k) - F_r3m(i,j,k)
*
         end do
         end do
         endif
*
         xxx_8 = gamma_8/Dcst_cappa_8*Geomg_z_8(k) 
         do j= j0, jn
         do i= i0, in
*
            F_wijk1m(i,j,k) = xxx_8*F_wijk1m(i,j,k) 
*
         end do
         end do
*
*     Compute {1} - {2} (F_wijk1)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~

         if (.not. Schm_hydro_L) then
            b1_8 = Geomg_z_8(k)/Cstv_tau_8
            b2_8 = ddd_8*Geomg_z_8(k)
            do j= j0, jn
            do i= i0, in
*
               F_wijk1m(i,j,k)= F_wijk1m(i,j,k)-b1_8*w_qpt0m(i,j,k)
     $                                         +b2_8*F_gptxm(i,j,k)
*
            end do
            end do
         endif
*
 100  continue
!$omp enddo
*
!$omp do
      do j= j0, jn
*
         do k=1,l_nk-1 
         a1_8=aaa_8*QUARTER_8*(Geomg_z_8(k)+Geomg_z_8(k+1))**2/Geomg_hz_8(k) 
         do i= i0, in
*
            F_wijk1m(i,j,k) = HALF_8*( F_wijk1m(i,j,k+1) + F_wijk1m(i,j,k) )
     %                        - a1_8*( F_gptxm (i,j,k+1) - F_gptxm (i,j,k) )
*
         end do
         end do

*        Compute the desired variable X 
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         do k=1,l_nk-1 
         do i= i0, in
*
            w_gxtxm(i,j,k+1) = - w_gxtxm(i,j,k) + TWO_8*F_wijk1m(i,j,k) 
*
         end do
         end do
      end do
!$omp enddo

**********************************************************
*  4. Calculate vertical velocity & nonhydrostatic index * 
**********************************************************
*
!$omp do
      do 300 k=1,l_nk 
*
**********************************************
*  5. Calculate the temperature perturbation * 
**********************************************
*     Calculate T'lin and prepare {$} (F_wijk1) 
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         a1_8 = Dcst_cappa_8*inv_z_8(k) 
         do j= j0, jn
         do i= i0, in
*
*           TRAJECTORY 
*           ----------
            w_tplt0m(i,j,k) = ddd1_8*(F_rthm(i,j,k) - F_nthm(i,j,k) +
     $                        a1_8*w_gxtxm(i,j,k))
*
         end do
         end do
*
         if (.not. Schm_hydro_L) then
             do j= j0, jn
             do i= i0, in
*
                w_tplt0m(i,j,k) = w_tplt0m(i,j,k) + bbb1_8*w_qpt0m(i,j,k)
*
             end do
             end do
         endif
*
 300  continue
!$omp enddo
*
*************************************************************
*  $. Final back substitution after the nonlinear iteration * 
*************************************************************
*
C     if ( F_itr .lt. F_itnlh ) then
C        return 
C     endif
*
*     -------------------------
*     END TRAJECTORY EVALUATION
*     -------------------------
*
*     -------------------------
*     START ADJOINT CALCULATION 
*     -------------------------
*************************************************************
*     ADJ of                                                *
*  $. Final back substitution after the nonlinear iteration *
*************************************************************
*
      if ( .not. (F_itr .lt. F_itnlh) ) then
*
*
*     ADJ of
*     Compute phi and T
*     ~~~~~~~~~~~~~~~~~
!$omp do
      do k=l_nk,1,-1
      do j= j0, jn
      do i= i0, in
          F_tpt0 (i,j,k) = F_tt0 (i,j,k) + F_tpt0 (i,j,k)
          F_tt0  (i,j,k) = ZERO_8 
          F_fipt0(i,j,k) = F_fit0(i,j,k) + F_fipt0(i,j,k)
          F_fit0 (i,j,k) = ZERO_8 
      end do
      end do
      end do
!$omp enddo
*
!$omp do
      do j= j0, jn
*
*     ADJ of
*     Compute total divergence
*     ~~~~~~~~~~~~~~~~~~~~~~~~
      do k=l_nk,1,-1
*
      tmp_8 = Geomg_dpib(k)/Cstv_tau_8
      do i= i0, in
         F_rcn(i,j,k) =         F_tdt0(i,j,k)      + F_rcn(i,j,k)
         F_ncn(i,j,k) =       - F_tdt0(i,j,k)      + F_ncn(i,j,k)
         F_st0(i,j)   = - tmp_8*F_tdt0(i,j,k)      + F_st0(i,j)
         F_tdt0(i,j,k)= ZERO_8 
      end do
*
*     ADJ of
*     Compute pi*-dot
*     ~~~~~~~~~~~~~~~
      if ( (k.eq.1) .or. (k.eq.l_nk) ) then
         F_psdt0 (:,:,k) = ZERO_8
      else
         tmp_8 = Geomg_pib(k)/Cstv_tau_8
         do i= i0, in
            F_gxtx (i,j,k) =         F_psdt0(i,j,k)   + F_gxtx(i,j,k)
            F_st0  (i,j)   = - tmp_8*F_psdt0(i,j,k)   + F_st0 (i,j)
            F_psdt0(i,j,k) = ZERO_8 
         end do
      endif
*
      end do
      end do
!$omp enddo
*
!$omp do
      do 700 k=l_nk,1,-1
*
         if (.not.Cori_cornl_L) then
*     ADJ of 
*     Compute gradient of P and hence U & V
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      do j= l_njv-pil_n, j0, -1 
      do i= i0, in
         F_rv  (i,j,k)   = Cstv_tau_8*( F_vt0(i,j,k) ) 
     $                     + F_rv  (i,j,k)
         F_nv  (i,j,k)   = Cstv_tau_8*(-F_vt0(i,j,k) ) 
     $                     + F_nv  (i,j,k)
         F_gptx(i,j+1,k) = Cstv_tau_8*( - aaa2_8*(  F_vt0(i,j,k))*Geomg_cyv2_8(j)*Geomg_invhsy_8(j) )
     $                     + F_gptx(i,j+1,k)
         F_gptx(i,j,k)   = Cstv_tau_8*( - aaa2_8*(- F_vt0(i,j,k))*Geomg_cyv2_8(j)*Geomg_invhsy_8(j) )
     $                     + F_gptx(i,j,k)
         F_vt0 (i,j,k)   = ZERO_8 
      end do
      end do
*
      do j= j0, jn
      do i= l_niu-pil_e, i0, -1 
         F_ru  (i,j,k)   = Cstv_tau_8*( F_ut0(i,j,k) )
     $                     + F_ru  (i,j,k)
         F_nu  (i,j,k)   = Cstv_tau_8*(-F_ut0(i,j,k) ) 
     $                     + F_nu  (i,j,k)
         F_gptx(i+1,j,k) = Cstv_tau_8*( - aaa2_8*( F_ut0(i,j,k)) / Geomg_hx_8(i) )
     $                     + F_gptx(i+1,j,k)
         F_gptx(i,j,k)   = Cstv_tau_8*( - aaa2_8*(-F_ut0(i,j,k)) / Geomg_hx_8(i) )
     $                     + F_gptx(i,j,k)
         F_ut0 (i,j,k)   = ZERO_8 
      end do
      end do
         endif
*
700   continue
!$omp enddo
*
      if (.not.Cori_cornl_L) then
*
!$omp single 
      call rpn_comm_adj_halo( F_gptx, LDIST_DIM,l_ni,l_nj,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0)
!$omp end single 
*
*     Zero F_gptx halo
*     ----------------
!$omp do 
      do k= 1,l_nk
      call v4d_zerohalo ( F_gptx(l_minx,l_miny,k),l_ni,l_nj,LDIST_DIM,1)
      enddo
!$omp enddo 
*
      endif
*
      endif
*
      if (Cori_cornl_L) then
*
!$omp do
      do 600 k=1,l_nk

*     Compute gradient of P and hence U & V
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
      do j= l_njv-pil_n, j0, -1 
      do i= i0, in
*
*     ADJ 
*     ---
      F_rv  (i,j,  k)= Cstv_tau_8*(           F_vt0(i,j,k) ) + F_rv  (i,j,  k)
      F_nv  (i,j,  k)= Cstv_tau_8*(          -F_vt0(i,j,k) ) + F_nv  (i,j,  k)
      F_gptx(i,j+1,k)= Cstv_tau_8*(- aaa2_8*( F_vt0(i,j,k) )
     $                 *Geomg_cyv2_8(j)*Geomg_invhsy_8(j)  )    + F_gptx(i,j+1,k) 
      F_gptx(i,j,  k)= Cstv_tau_8*(- aaa2_8*(-F_vt0(i,j,k) )
     $                 *Geomg_cyv2_8(j)*Geomg_invhsy_8(j)  )    + F_gptx(i,j,  k)
      F_vt0 (i,j,k)  = ZERO_8
      end do
      end do
*
      do j= j0, jn
      do i= l_niu-pil_e, i0, -1 
*
*     ADJ 
*     ---
      F_ru  (i,  j,k)= Cstv_tau_8*(           F_ut0(i,j,k) ) + F_ru  (i,  j,k)
      F_nu  (i,  j,k)= Cstv_tau_8*(          -F_ut0(i,j,k) ) + F_nu  (i,  j,k)
      F_gptx(i+1,j,k)= Cstv_tau_8*(- aaa2_8*( F_ut0(i,j,k) )
     $                 /Geomg_hx_8(i)                   )    + F_gptx(i+1,j,k)
      F_gptx(i,  j,k)= Cstv_tau_8*(- aaa2_8*(-F_ut0(i,j,k) )
     $                 /Geomg_hx_8(i)                   )    + F_gptx(i,  j,k)
      F_ut0 (i,j,k)  = ZERO_8
      end do
      end do
 600  continue
!$omp enddo
*
!$omp single 
      call rpn_comm_adj_halo( F_gptx, LDIST_DIM,l_ni,l_nj,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0)
!$omp end single 
*
*     Zero F_gptx halo
*     ----------------
!$omp do 
      do k= 1,l_nk
      call v4d_zerohalo ( F_gptx(l_minx,l_miny,k),l_ni,l_nj,LDIST_DIM,1)
      enddo
!$omp enddo 
*
      endif
*
!$omp do
      do j= j0, jn
      do i= i0, in
         xexpm_8(i,j) = w_st0m(i,j)
      end do
      end do
!$omp enddo 
*
!$omp single 
      call vexp ( yexpm_8, xexpm_8, nij )
!$omp end single 
*
!$omp do
      do k=l_nk,1,-1
*
**********************************************
*     ADJ of                                 *
*  5. Calculate the temperature perturbation *
**********************************************
*
*     ADJ of
*     Calculate T'
*     ~~~~~~~~~~~~
         do j= j0, jn
         do i= i0, in
            xrecm_8(i,j) = 1.0 + Geomg_dpib(k) * (yexpm_8(i,j) - 1.0)
            xsqm_8 (i,j) = xrecm_8(i,j) *  xrecm_8(i,j) 
         end do
         end do
*
         call vrec ( yreckm_8(i0,j0,k), xrecm_8, nij )
         call vrec ( xrsqkm_8(i0,j0,k), xsqm_8,  nij )
*
      enddo
!$omp enddo
*
      if (Schm_hydro_L) then
*
!$omp do
      do j= j0, jn
*
         do k=l_nk,1,-1
         do i= i0, in
*
*        TRAJECTORY
*        ----------
         F_wijk0m(i,j,k)= yreckm_8(i,j,k)
         F_wijk1m(i,j,k)= w_st0m(i,j) * Geomg_dpib(k)
         pd2_m_8 = Geomg_pib(k) * w_st0m(i,j) * inv_z_8(k) 
         xxx_m_8 = (1. + w_pipt0m(i,j,k)*inv_z_8(k)) * F_wijk0m(i,j,k)
         yyy_m_8 = w_tplt0m(i,j,k) - Cstv_tstr_8 * (( pd2_m_8 -
     %                  F_wijk1m(i,j,k)) -1. )
*
*        ADJ
*        ---
         yyy_8          =        xxx_m_8 * F_tpt0(i,j,k)
         xxx_8          =  F_tpt0(i,j,k) * yyy_m_8
         F_tpt0 (i,j,k) = ZERO_8
*
         F_tplt0(i,j,k) =                     yyy_8   + F_tplt0(i,j,k)
         pd2_8          = - Cstv_tstr_8 * ((  yyy_8))
         F_wijk1(i,j,k) = - Cstv_tstr_8 * ((- yyy_8)) + F_wijk1(i,j,k)
*
         F_pipt0(i,j,k) = (               xxx_8* inv_z_8(k)) * F_wijk0m(i,j,k)
     %                    + F_pipt0 (i,j,k)
         F_wijk0(i,j,k) = (1. + w_pipt0m(i,j,k)* inv_z_8(k)) * xxx_8
     %                    + F_wijk0 (i,j,k)
*
         F_st0  (i,j)   = Geomg_pib(k) * pd2_8 * inv_z_8(k)  + F_st0(i,j)
*
         F_st0  (i,j)   = F_wijk1(i,j,k) * Geomg_dpib(k)     + F_st0(i,j)
         F_wijk1(i,j,k) = ZERO_8
*
         F_st0(i,j)     = -(Geomg_dpib(k) *(F_wijk0(i,j,k)*yexpm_8(i,j))) * xrsqkm_8(i,j,k) 
     %                    + F_st0(i,j)
         F_wijk0(i,j,k) = ZERO_8
*
         end do
         end do
*
      end do
!$omp enddo
*
         else
*
!$omp do 
      do j= j0, jn
*
            do k=l_nk,1,-1
            do i= i0, in
*
               exp_m = exp(w_qpt0m(i,j,k))
*
               rec_m = 1.0/(1.0 + Geomg_dpib(k) * (exp(w_st0m(i,j))-1.))
*
*              TRAJECTORY
*              ----------
               F_wijk0m(i,j,k)= rec_m
               F_wijk1m(i,j,k)= w_st0m(i,j) * Geomg_dpib(k)
               pd2_m_8 = Geomg_pib(k) * w_st0m(i,j) * inv_z_8(k)
               xx1_m_8 = (1. + w_pipt0m(i,j,k)* inv_z_8(k)) * F_wijk0m(i,j,k)
               xxx_m_8 = xx1_m_8 * exp_m 
               yyy_m_8 = w_tplt0m(i,j,k)-Cstv_tstr_8*((pd2_m_8-F_wijk1m(i,j,k)+
     $                    w_qpt0m(i,j,k))-1.)
*
*              ADJ
*              ---
C              yyy_8          =       xxx_m_8 * F_tpt0(i,j,k) + yyy_8
               yyy_8          =       xxx_m_8 * F_tpt0(i,j,k) 
C              xxx_8          = F_tpt0(i,j,k) * yyy_m_8       + xxx_8
               xxx_8          = F_tpt0(i,j,k) * yyy_m_8       
               F_tpt0(i,j,k)  = ZERO_8
*
               F_tplt0(i,j,k) =                 yyy_8 + F_tplt0(i,j,k)
C              pd2_8          = -Cstv_tstr_8 *  yyy_8 + pd2_8
               pd2_8          = -Cstv_tstr_8 *  yyy_8 
               F_wijk1(i,j,k) =  Cstv_tstr_8 *  yyy_8 + F_wijk1(i,j,k)
               F_qpt0 (i,j,k) = -Cstv_tstr_8 *  yyy_8 + F_qpt0 (i,j,k)
C              yyy_8          =  ZERO_8
*
               F_qpt0(i,j,k)  = xx1_m_8 * exp_m  * xxx_8 + F_qpt0(i,j,k)
C              xx1_8          =   xxx_8 * exp_m          + xx1_8
               xx1_8          =   xxx_8 * exp_m       
C              xxx_8          = ZERO_8
*
               F_wijk0 (i,j,k)= (1. + w_pipt0m(i,j,k)* inv_z_8(k)) * xx1_8           + F_wijk0 (i,j,k)
               F_pipt0 (i,j,k)= (              xx1_8 * inv_z_8(k)) * F_wijk0m(i,j,k) + F_pipt0 (i,j,k)
C              xx1_8          = ZERO_8
*
               F_st0(i,j)     = Geomg_pib(k) * pd2_8 * inv_z_8(k) + F_st0(i,j)
C              pd2_8          = ZERO_8
*
               F_st0  (i,j)   = F_wijk1(i,j,k) * Geomg_dpib(k)    + F_st0(i,j)
               F_wijk1(i,j,k) = ZERO_8
*
               F_st0  (i,j)   = - (       Geomg_dpib(k) * (exp(w_st0m(i,j)) *F_wijk0(i,j,k)))*rec_m*rec_m 
     $                          + F_st0  (i,j)
               F_wijk0(i,j,k) = ZERO_8
*
*     ADJ of
*     Calculate T'lin and prepare {$} (F_wijk1)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
               F_qpt0(i,j,k) =  bbb1_8* F_tplt0(i,j,k) + F_qpt0(i,j,k) 
*
            end do
            end do
      end do
!$omp end do 
*
         endif
*
!$omp do
      do j= j0, jn
*
         do k=l_nk,1,-1
         a1_8 = Dcst_cappa_8*inv_z_8(k)
*
         do i= i0, in
*
*        ADJ 
*        ---
         F_st0  (i,j)   = - F_wijk1(i,j,k) + F_st0(i,j)
         F_wijk1(i,j,k) = ZERO_8 
*
         F_rth  (i,j,k) = ddd1_8*(       F_tplt0(i,j,k)) +  F_rth (i,j,k)
         F_nth  (i,j,k) = ddd1_8*(     - F_tplt0(i,j,k)) +  F_nth (i,j,k)
         F_gxtx (i,j,k) = ddd1_8*( a1_8* F_tplt0(i,j,k)) +  F_gxtx(i,j,k)
         F_tplt0(i,j,k) = ZERO_8 
*
         end do
         end do
*
      enddo
!$omp enddo
*
         if (.not. Schm_hydro_L) then
*
**********************************************************
*  4. Calculate vertical velocity & nonhydrostatic index *
**********************************************************
*
!$omp do 
      do j= j0, jn
*
            do k=l_nk,1,-1
*
            a1_8 = aaa1_8*Cstv_tau_8*inv_z_8(k)
*
            do i= i0, in
*
               exp_m = exp(w_qpt0m(i,j,k))
*
*              TRAJECTORY
*              ----------
               zzz_m_8 =  1.0 / (1.0 + Geomg_dpib(k)*(yexpm_8(i,j) -1.0))
               xxx_m_8 = F_gptxm(i,j,k)-aaa1_8*w_qpt0m(i,j,k)-a1_8*w_gxtxm(i,j,k)
C              w_wt0m  (i,j,k)= - F_rvvm(i,j,k)*c3_8 + bbb2_8*xxx_m_8
               w_multxm(i,j,k)= Cstv_tau_8
     $                        *(F_n3m(i,j,k)-F_r3m(i,j,k))+bbb3_8*xxx_m_8
               yyy_m_8 = (1.+w_pipt0m(i,j,k)*inv_z_8(k))*
     $                            (w_multxm(i,j,k)-w_qpt0m(i,j,k))
*
*              ADJ
*              ---
               F_qpt0 (i,j,k)  = exp_m                * F_mut0(i,j,k)   + F_qpt0(i,j,k)
C              yyy_8           = exp_m* zzz_m_8       * F_mut0(i,j,k)   + yyy_8       
               yyy_8           = exp_m* zzz_m_8       * F_mut0(i,j,k)       
C              zzz_8           = exp_m* F_mut0(i,j,k) * yyy_m_8         + zzz_8
               zzz_8           = exp_m* F_mut0(i,j,k) * yyy_m_8        
               F_qpt0 (i,j,k)  = exp_m* F_mut0(i,j,k) * zzz_m_8*yyy_m_8 + F_qpt0(i,j,k)
               F_mut0 (i,j,k)  = ZERO_8
*
               F_pipt0(i,j,k) = ( yyy_8*inv_z_8(k))* 
     $                           (w_multxm(i,j,k)-w_qpt0m(i,j,k))       + F_pipt0(i,j,k)
               F_multx(i,j,k) =  (1.+w_pipt0m(i,j,k)*inv_z_8(k))* yyy_8 + F_multx(i,j,k)
               F_qpt0 (i,j,k) = -(1.+w_pipt0m(i,j,k)*inv_z_8(k))* yyy_8 + F_qpt0 (i,j,k)
C              yyy_8          = ZERO_8
*
               F_n3   (i,j,k) = Cstv_tau_8 * F_multx(i,j,k) + F_n3(i,j,k)
               F_r3   (i,j,k) =-Cstv_tau_8 * F_multx(i,j,k) + F_r3(i,j,k)
C              xxx_8          =     bbb3_8 * F_multx(i,j,k) + xxx_8
               xxx_8          =     bbb3_8 * F_multx(i,j,k) 
               F_multx(i,j,k) = ZERO_8
*
               F_rvv (i,j,k)  = - F_wt0(i,j,k)*c3_8         + F_rvv(i,j,k)
               xxx_8          =   bbb2_8* F_wt0(i,j,k)      + xxx_8
               F_wt0 (i,j,k)  = ZERO_8
*
               F_gptx(i,j,k)  =          xxx_8 + F_gptx(i,j,k)
               F_qpt0(i,j,k)  = -aaa1_8* xxx_8 + F_qpt0(i,j,k)
               F_gxtx(i,j,k)  =   -a1_8* xxx_8 + F_gxtx(i,j,k)
C              xxx_8          = ZERO_8
*
               F_st0 (i,j)    =  - (      Geomg_dpib(k)*(yexpm_8(i,j)*zzz_8 )) * xrsqkm_8(i,j,k) 
     $                           + F_st0(i,j)
C              zzz_8          = ZERO_8
*
            end do
            end do
*
      enddo
!$omp enddo
*
         endif
*
**********************************************************
*     ADJ of                                             *
*  4. Calculate vertical velocity & nonhydrostatic index *
**********************************************************

*******************************
*     ADJ of
*  3. Retrieve the variable X * 
*******************************
*
!$omp do
      do j= j0, jn
*
*        ADJ of
*        Compute the desired variable X
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         do k=l_nk-1,1,-1
         do i= i0, in
*
*        ADJ
*        ---
         F_gxtx (i,j,k)   =     - F_gxtx(i,j,k+1) + F_gxtx (i,j,k)
         F_wijk1(i,j,k)   = TWO_8*F_gxtx(i,j,k+1) + F_wijk1(i,j,k)
         F_gxtx (i,j,k+1) = ZERO_8 

         end do
         end do
*
         do k=l_nk-1,1,-1
         a1_8=aaa_8*QUARTER_8*(Geomg_z_8(k)+Geomg_z_8(k+1))**2/Geomg_hz_8(k)
         do i= i0, in
*
*        ADJ
*        ---
         F_wijk1(i,j,k+1) = HALF_8*(   F_wijk1(i,j,k) ) + F_wijk1(i,j,k+1)
         F_gptx (i,j,k+1) = - a1_8*(   F_wijk1(i,j,k) ) + F_gptx (i,j,k+1)
         F_gptx (i,j,k)   = - a1_8*( - F_wijk1(i,j,k) ) + F_gptx (i,j,k) 
         F_wijk1(i,j,k)   = HALF_8*(   F_wijk1(i,j,k) )  
*
         end do
         end do
*
      end do
!$omp enddo
*
!$omp do
      do j= j0, jn
      do i= i0, in
         xexpm_8(i,j) = w_st0m(i,j)
      end do
      end do
!$omp enddo
*
!$omp single 
      call vexp ( yexpm_8, xexpm_8, nij )
!$omp end single 
*
!$omp do
      do 101 k=l_nk,1,-1
*
*******************************
*     ADJ of                  *
*  3. Retrieve the variable X *
*******************************
*
*     Compute {1} - {2} (F_wijk1)
*     ~~~~~~~~~~~~~~~~~~~~~~~~~
*
         if (.not. Schm_hydro_L) then
            b1_8 = Geomg_z_8(k)/Cstv_tau_8
            b2_8 = ddd_8*Geomg_z_8(k)
            do j= j0, jn
            do i= i0, in
*
*              ADJ 
*              ---
               F_qpt0 (i,j,k) = -b1_8* F_wijk1(i,j,k) + F_qpt0(i,j,k)
               F_gptx (i,j,k) =  b2_8* F_wijk1(i,j,k) + F_gptx(i,j,k)
*
            end do
            end do
         endif
*
*     ADJ of
*     Compute term {1} (F_wijk1) without vertical staggering
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         xxx_8 = gamma_8/Dcst_cappa_8*Geomg_z_8(k)
         do j= j0, jn
         do i= i0, in
*
*           ADJ 
*           ---
            F_wijk1(i,j,k) = xxx_8*F_wijk1(i,j,k)
*
         end do
         end do
*
         if (.not. Schm_hydro_L) then
         do j= j0, jn
         do i= i0, in
*
*           ADJ 
*           ---
            F_n3(i,j,k) =   F_wijk1(i,j,k) + F_n3(i,j,k) 
            F_r3(i,j,k) = - F_wijk1(i,j,k) + F_r3(i,j,k)
*
         end do
         end do
         endif
*
         do j= j0, jn
         do i= i0, in
*
*           ADJ 
*           ---
            F_nth  (i,j,k) =   F_wijk1(i,j,k) + F_nth(i,j,k)
            F_rth  (i,j,k) = - F_wijk1(i,j,k) + F_rth(i,j,k)
            F_wijk1(i,j,k) = ZERO_8 

         end do
         end do
*
 101  continue
!$omp enddo
*
*     ADJ of
*     Compute pi'lin (F_wijk0), pi', q and phi'
*     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
!$omp do
      do j=l_miny,l_maxy
      do i=l_minx,l_maxx
         F_fipt0(i,j,l_nk)  = ZERO_8
      enddo
      enddo
!$omp enddo
*
*
*     TRAJECTORY
*     ----------
!$omp do
      do k= l_nk,1,-1
*
         do j= j0, jn
         do i= i0, in
*
            xlogm_8 (i,j)   = Geomg_z_8(k) + w_pipt0m(i,j,k) 
*
         end do
         end do
*
         call vrec ( rpipkm_8(i0,j0,k), xlogm_8, nij )
*
      enddo
!$omp enddo
*
      k = 1
*
*        ADJ of
*        Impose the boundary conditions
*        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!$omp do
      do j= j0, jn
      do i= i0, in
*
*        ADJ
*        ---
         F_gxtx (i,j,1) = 0. 
*
         F_gptx (i,j,1) = F_fipt0(i,j,1) + F_gptx (i,j,1)
         F_fipt0(i,j,1) = ZERO_8 
*
         F_pipt0(i,j,1) = F_qt0  (i,j,1) * rpipkm_8(i,j,1) + F_pipt0(i,j,1) 
         F_qt0  (i,j,1) = ZERO_8 
*
         F_st0(i,j)     = Geomg_pib(1) *(F_pipt0(i,j,1)*yexpm_8(i,j)) + F_st0(i,j)
         F_pipt0(i,j,1) = ZERO_8
*
      end do
      end do
!$omp enddo
*
!$omp do
      do j= j0, jn
*
         do k= l_nk,2,-1
*
             if (.not. Schm_hydro_L) then
                do i= i0, in
*
*                  ADJ 
*                  ---
                   F_qpt0(i,j,k) = - ccc2_8* F_fipt0(i,j,k) + F_qpt0(i,j,k)
*
                   F_qpt0(i,j,k) = F_qt0(i,j,k)             + F_qpt0(i,j,k)
*
                end do
             endif
*
             yyy_8 = Dcst_rgasd_8*Cstv_tstr_8 * inv_z_8(k)
             do i= i0, in
*
*            ADJ
*            ---
             F_gptx (i,j,k) =         F_fipt0(i,j,k) + F_gptx (i,j,k)
             F_wijk0(i,j,k) = - yyy_8*F_fipt0(i,j,k) + F_wijk0(i,j,k)
             F_fipt0(i,j,k) = ZERO_8 
*
             F_pipt0(i,j,k) = F_qt0(i,j,k) * rpipkm_8(i,j,k) 
     %                        + F_pipt0(i,j,k)
             F_qt0  (i,j,k) = ZERO_8 
*
             F_st0(i,j)     = Geomg_pib(k)* (F_pipt0(i,j,k)*yexpm_8(i,j)) + F_st0(i,j) 
             F_pipt0(i,j,k) = ZERO_8
*
             F_st0(i,j)     = Geomg_pib(k) * F_wijk0(i,j,k)               + F_st0(i,j)
             F_wijk0(i,j,k) = ZERO_8
*
             end do
*
         end do
      end do
!$omp enddo
*
********************************************
*     ADJ of                               *
*  2. Calculate s, pi'lin, pi', q and phi' *
********************************************

*     ADJ of
*     Calculate s
*     ~~~~~~~~~~~
*
      if (.not. Schm_hydro_L) then
!$omp do
         do j= j0, jn
         do i= i0, in
*
*           ADJ 
*           ---
            F_qpt0(i,j,l_nk) = - ccc1_8*F_st0(i,j) + F_qpt0(i,j,l_nk)
*
         end do
         end do
!$omp enddo
      endif
*
!$omp do
      do j= j0, jn
      do i= i0, in
*
*     ADJ 
*     ---
      F_gptx(i,j,l_nk) = bbb_8*F_st0(i,j)*c2_8 + F_gptx(i,j,l_nk) 
      F_st0 (i,j)      = ZERO_8
*
      end do
      end do
!$omp enddo
*
**********************************************************
*     ADJ of                                             *
*  1. Retrieve the nonhydro deviation q' of log pressure *
**********************************************************
*
      if (.not. Schm_hydro_L) then
*
!$omp do
      do j= j0, jn
      do i= i0, in
*
*        ADJ 
*        ---
         F_qpt0(i,j,l_nk) = Cstv_tau_8*F_qpt0(i,j,l_nk)*inv_z_8(l_nk)
*
      end do
      end do
!$omp enddo
*
!$omp do
      do j= jn,j0,-1
         do k=l_nk-1,1,-1
         xxx_8 = HALF_8*Geomg_hz_8(k)
         yyy_8 = (ccc_8*c1_8)*HALF_8*( Geomg_z_8(k) + Geomg_z_8(k+1) )
         zzz_8 = Cstv_tau_8*inv_z_8(k)
         do i= in,i0,-1
*
*           ADJ 
*           ---
            F_qpt0(i,j,k) = zzz_8*F_qpt0(i,j,k)
*
            F_qpt0(i,j,k  ) =                 F_qpt0(i,j,k+1)  + F_qpt0(i,j,k  )
            F_n3p (i,j,k+1) = xxx_8*( gamma_8*F_qpt0(i,j,k+1)) + F_n3p (i,j,k+1)
            F_r3p (i,j,k+1) =-xxx_8*( gamma_8*F_qpt0(i,j,k+1)) + F_r3p (i,j,k+1)
            F_gptx(i,j,k+1) = xxx_8*(   ccc_8*F_qpt0(i,j,k+1)) + F_gptx(i,j,k+1)
            F_n3p (i,j,k  ) = xxx_8*( gamma_8*F_qpt0(i,j,k+1)) + F_n3p (i,j,k  )
            F_r3p (i,j,k  ) =-xxx_8*( gamma_8*F_qpt0(i,j,k+1)) + F_r3p (i,j,k  )
            F_gptx(i,j,k  ) = xxx_8*(   ccc_8*F_qpt0(i,j,k+1)) + F_gptx(i,j,k  )
            F_gptx(i,j,k+1) = yyy_8*(         F_qpt0(i,j,k+1)) + F_gptx(i,j,k+1)
            F_gptx(i,j,k  ) =-yyy_8*(         F_qpt0(i,j,k+1)) + F_gptx(i,j,k  )  
            F_qpt0(i,j,k+1) = ZERO_8
*
         end do
         end do
      end do
!$omp enddo
*
      F_qpt0(:,:,1) = ZERO_8
*
      endif
*
!$omp end parallel
*     -----------------------
*     END ADJOINT CALCULATION 
*     -----------------------
*
      return
      end