!-------------------------------------- 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 p_apply_tl - TLM of apply consistency with related dynamical variables
*
#include "model_macros_f.h"
*

      subroutine p_apply_tl ( F_tdu,F_tdv,F_tdt,F_trm,F_tp,F_qp, 1,15
     $                        F_tpm,F_trpm,F_qpm,
     $                        DIST_DIM, Nk)
*
      implicit none
*
      integer DIST_DIM,Nk
      real 
     $     F_tdu   (DIST_SHAPE,Nk), F_tdv   (DIST_SHAPE,Nk),
     $     F_tdt   (DIST_SHAPE,Nk), F_trm   (DIST_SHAPE,Nk,*),
     $     F_tp    (DIST_SHAPE,Nk), F_qp    (DIST_SHAPE,Nk),
     $     F_tpm   (DIST_SHAPE,Nk), F_trpm  (DIST_SHAPE,Nk),
     $     F_qpm   (DIST_SHAPE,Nk)
*
*author 
*     Stephane Laroche        Janvier 2001
*
*revision
* v3_00 - Laroche S.        - initial MPI version
* v3_20 - Laroche S.        - slight modification to rpn_comm_xch_halo call
* v3_21 - Tanguay M.        - Revision Openmp 
* v3_30 - Tanguay M.        - adapt TL/AD to itf/new tendencies
*                           - Validation for LAM version
*
*object
*       TLM of apply consistency of the tendencies on physics variables
*       with related dynamical variables. Interpolate wind
*       tendancies toward theirs respective grids.
*
*arguments
*  Name        I/O                 Description
*----------------------------------------------------------------
* F_tcond       I    -
*	
*implicits
#include "glb_ld.cdk"
#include "cstv.cdk"
#include "lun.cdk"
#include "hblen.cdk"
#include "dcst.cdk"
#include "schm.cdk"
#include "geomg.cdk"
#include "p_cond.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
#include "vt0.cdk"
#include "vt1.cdk"
#include "itf_phy_busind.cdk"
#include "v4dg.cdk"
*
*modules
      integer  vmmlod,vmmget,vmmuld
      external vmmlod,vmmget,vmmuld
*
      integer*8 pnt_trp(phyt_ntr),pnt_trm(phyt_ntr)
      integer i, j, k, n, i0, in, j0, jn, err, key1(10), ng,
     $     keyp(phyt_ntr), keym(h2o_ntr), keyp_, keym_
      real trajexp
      real  wk1(LDIST_SHAPE,Nk) ,   wk2(LDIST_SHAPE,Nk),
     $      wk3(LDIST_SHAPE,Nk) ,   wk4(LDIST_SHAPE,Nk), 
     $      wk5(LDIST_SHAPE,Nk) ,   wk6(LDIST_SHAPE,Nk), trp, trm,
     $      wk7(LDIST_SHAPE,Nk) , 
     $   F_tdum(LDIST_SHAPE,Nk), F_tdvm(LDIST_SHAPE,Nk),
     $   F_tdtm(LDIST_SHAPE,Nk), F_trmm(LDIST_SHAPE,Nk),
     $   F_st1m(LDIST_SHAPE)
      pointer (patrp, trp(LDIST_SHAPE,*)),(patrm, trm(LDIST_SHAPE,*))
*
*notes
*	Consistency is applied according to diagnostic relationships
*	used at initial time in predat1 and predat2. If changes are
*	made to the relations used in these two modules, they should
*	be made accordingly here. (xrp**t1 are used as workfields)
**
*     __________________________________________________________________
*
      if(      Schm_wload_L              ) call gem_stop('P_APPLY_TL 1',-1)
      if(.not. Schm_pcsty_L              ) call gem_stop('P_APPLY_TL 2',-1)
      if(.not. Schm_pheat_L              ) call gem_stop('P_APPLY_TL 3',-1)
*
      keyp_ = VMM_KEY (trt1)
      if (phyt_ntr.gt.0) then
         do n=1,phyt_ntr
            keyp(n) = keyp_ + n
         end do
         err = vmmlod(keyp,phyt_ntr)
         do n=1,phyt_ntr
            err = vmmget(keyp(n),patrp,trp)
            pnt_trp(n) = patrp
         end do
      endif
*
      key1(1) = VMM_KEY(st1  )
      key1(2) = VMM_KEY(fipt1)
      key1(3) = VMM_KEY(fit1 )
      key1(4) = VMM_KEY(tplt1)
      key1(5) = VMM_KEY(tpt1 )
      key1(6) = VMM_KEY(tdt1 )
      key1(7) = VMM_KEY(psdt1)
      key1(8) = VMM_KEY(ut1)
      key1(9) = VMM_KEY(vt1)
      key1(10)= VMM_KEY(tt1)
      err = vmmlod (key1,10)
      err = VMM_GET_VAR(st1  )
      err = VMM_GET_VAR(fipt1)
      err = VMM_GET_VAR(fit1 )
      err = VMM_GET_VAR(tplt1)
      err = VMM_GET_VAR(tpt1 )
      err = VMM_GET_VAR(tdt1 )
      err = VMM_GET_VAR(psdt1)
      err = VMM_GET_VAR(ut1)
      err = VMM_GET_VAR(vt1)
      err = VMM_GET_VAR(tt1)
*
*  4. Interpolation of the wind associated tendencies

*
*     Zero wk5 for hatoprg
*     --------------------
      wk5 = 0.
*
      call itf_phy_uvgridscal ( F_tdu, F_tdv, LDIST_DIM, G_nk, .false. )
*
!$omp parallel
!$omp do
      do k=1,l_nk
         if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) )
     $      wk2(:,:,k) = 0.
         wk3(:,:,k) = 0.
         wk4(:,:,k) = 0.
      end do
!$omp enddo
*
!$omp end parallel 
*
*     Read TRAJ for the simplified physics
*     -------------------------------------
      call v4d_rwtraj_apply(F_tdum,F_tdvm,F_tdtm,F_trmm,F_st1m,LDIST_DIM,Nk)
*
*
*   1.1  Compute VIRTUAL temperature tendency from:  temperature tendency,
*        specific humidity, virtual temperature & specific humidity tendency
*
!$omp parallel private(trajexp) 
*
      patrp = pnt_trp(hucond)
*
!$omp do
      do k=1,l_nk
      do j= 1+pil_s, l_nj-pil_n 
      do i= 1+pil_w, l_ni-pil_e 
*
*       TLM
*       ---
        F_tdt(i,j,k) =  F_tdt(i,j,k)*( 1. + Dcst_delta_8*F_trpm(i,j,k) )
     $                +          trp(i,j,k)*Dcst_delta_8*F_tdtm(i,j,k)
     $                +         F_tp(i,j,k)*Dcst_delta_8*F_trmm(i,j,k)
     $                + F_trm(i,j,k,hucond)*Dcst_delta_8*F_tpm(i,j,k)
*
          wk1(i,j,k) = F_tdt(i,j,k)
*
*       TRAJECTORY
*       ----------
        F_tdtm(i,j,k) = F_tdtm(i,j,k)*( 1. + Dcst_delta_8*F_trpm(i,j,k) )
     $                + Dcst_delta_8*F_tpm(i,j,k)*F_trmm(i,j,k)

      end do
      end do
      end do
!$omp enddo
*
!$omp single
      if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) )
     $     call nesajr (wk1,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
!$omp end single
*
*  2. Compute d/dt ( phi ) from d/dt ( T )
*     Note:   d/dt ( phi' ) = d/dt ( phi ) i.e. not computed

*     TLM
*     ---
!$omp do
      do k=1,l_nk
      do j= 1+pil_s, l_nj-pil_n 
      do i= 1+pil_w, l_ni-pil_e 
            trajexp      = exp(F_st1m(i,j) - F_qpm(i,j,k))
           F_qp(i,j,k)   = F_tdt(i,j,k)                *trajexp
     $                   + st1(i,j)     * F_tdtm(i,j,k)*trajexp
     $                   - F_qp(i,j,k)  * F_tdtm(i,j,k)*trajexp

           wk5(i,j,k)    = F_qp(i,j,k)*Dcst_rgasd_8
      end do
      end do
      end do
!$omp end do
!$omp end parallel
*
      ng = (l_maxx-l_minx+1)*(l_maxy-l_miny+1)
      call hatoprg ( wk6,wk5,1.0,geomg_hz_8,ng,G_nk )

         if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) )
     $     call nesajr (wk6,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
*
*  3. Compute d/dt ( T'lin ) = pi* d/dt ( T ) exp(s-q) ; put in  F_tp
*     Note:   d/dt ( T' ) = d/dt ( T )  i.e. not computed

!$omp parallel
!$omp do
      do k=1,l_nk
      do j= 1+pil_s, l_nj-pil_n 
      do i= 1+pil_w, l_ni-pil_e 
         F_tp(i,j,k) = geomg_z_8(k)*F_qp(i,j,k)
      end do
      end do
      end do
!$omp end do
*
!$omp end parallel 

*  5. Compute total divergence and vertical motion associated tendencies
*     d/dt ( total D ) in xrpqt1,  d/dt ( pi*-dot ) in wk3
*
      call rpn_comm_xch_halo( F_tdu, 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_tdv, LDIST_DIM, l_ni, l_njv,G_nk,
     $                G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) 
*
*
*     TRAJECTORY
*     ----------
      call rpn_comm_xch_halo( F_tdum, 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_tdvm, LDIST_DIM, l_ni, l_njv,G_nk,
     $                G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) 
*
      call uv2tdpsd_tl ( F_qp, wk3,  F_tdu,  F_tdv,  st1, 
     $                   wk7,  wk4,  F_tdum, F_tdvm, F_st1m,
     $                   LDIST_DIM, G_nk )
         if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) ) then
            call nesajr (wk3 ,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
            call nesajr (F_tp,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
            call nesajr (F_qp,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
         endif
*
*C       2.     apply tendencies to primary variables
*               -------------------------------------
      if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) ) then
         call nesajr (F_tdu, wk2, LDIST_DIM,G_nk,1,0,Hblen_tx,Hblen_ty)
         call nesajr (F_tdv, wk2, LDIST_DIM,G_nk,0,1,Hblen_tx,Hblen_ty)
      endif
*
!$omp parallel 
*
!$omp do
      do k=1,l_nk
         do j= 1+pil_s, l_nj-pil_n 
         do i= 1+pil_w, l_ni-pil_e 
c           tt1 (i,j,k) =  tt1 (i,j,k) + Cstv_dt_8*F_tdt (i,j,k)
            tt1 (i,j,k) =  tt1 (i,j,k) + Cstv_dt_8*wk1   (i,j,k)
         end do
         end do
         do j= 1+pil_s, l_nj-pil_n 
         do i= 1+pil_w, l_niu-pil_e 
            ut1 (i,j,k) =  ut1 (i,j,k) + Cstv_dt_8*F_tdu (i,j,k)
         end do
         end do
         do j= 1+pil_s, l_njv-pil_n 
         do i= 1+pil_w, l_ni-pil_e 
            vt1 (i,j,k) =  vt1 (i,j,k) + Cstv_dt_8*F_tdv (i,j,k)
         end do
         end do
      end do
!$omp enddo
*
      if (phyt_ntr.gt.0) then
         do n=1,phyt_ntr
            patrp = pnt_trp(n)
!$omp single
         if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) ) then
            call nesajr (F_trm(minx,miny,1,n), wk2, LDIST_DIM,G_nk,
     $                                          0,0,Hblen_tx,Hblen_ty)
         endif
!$omp end single
!$omp do
            do k=1,l_nk
            do j= 1+pil_s, l_nj-pil_n 
            do i= 1+pil_w, l_ni-pil_e
               trp(i,j,k) = trp(i,j,k) + Cstv_dt_8*F_trm(i,j,k,n)
            end do
            end do
            end do
!$omp end do
         end do
      endif
*
*C       3.     apply tendencies to associated variables
*               ----------------------------------------
!$omp do
      do k=1,l_nk
      do j= 1+pil_s, l_nj-pil_n 
      do i= 1+pil_w, l_ni-pil_e 
         fit1 (i,j,k) =  fit1 (i,j,k) + Cstv_dt_8*wk6   (i,j,k)
         fipt1(i,j,k) =  fipt1(i,j,k) + Cstv_dt_8*wk6   (i,j,k)
C        tpt1 (i,j,k) =  tpt1 (i,j,k) + Cstv_dt_8*F_tdt (i,j,k)
         tpt1 (i,j,k) =  tpt1 (i,j,k) + Cstv_dt_8*wk1   (i,j,k)
         tplt1(i,j,k) =  tplt1(i,j,k) + Cstv_dt_8*F_tp  (i,j,k)
         tdt1 (i,j,k) =  tdt1 (i,j,k) + Cstv_dt_8*F_qp  (i,j,k)
         psdt1(i,j,k) =  psdt1(i,j,k) + Cstv_dt_8*wk3   (i,j,k)
      end do
      end do
      end do
!$omp end do
*
!$omp end parallel 
*
cstl      else
cstl*
cstl*     NO INTIALIZATION FOR THE TLM AT F_stepno.gt.0 --> F_apply_L=.true.
cstl*
cstl      endif
*
*     __________________________________________________________________
*
      return
      end