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

      subroutine hzd_exhrdif_tl ( F_u, F_v, F_psd, F_td,  1,8
     %                            F_um,F_vm,F_psdm,F_tdm,DIST_DIM, Nk )
*
      implicit none
*
      integer DIST_DIM, Nk
*
      real     F_u(DIST_SHAPE,Nk),  F_v(DIST_SHAPE,Nk),
     %       F_psd(DIST_SHAPE,Nk), F_td(DIST_SHAPE,Nk)
*
      real     F_um(DIST_SHAPE,Nk),  F_vm(DIST_SHAPE,Nk),
     %       F_psdm(DIST_SHAPE,Nk), F_tdm(DIST_SHAPE,Nk)
*
*author
*     M.Tanguay
*
*revision
* v3_30 - Tanguay M.  - initial MPI version 
*
*arguments
*  Name        I/O        Description
*----------------------------------------------------------------
*----------------------------------------------------------------
* 
*implicits
#include "glb_ld.cdk"
#include "hzd.cdk"
*
      integer nn, mm
      real*8 pt25,nu_dif,epsilon,khdim,lnr,visco
      parameter (epsilon = 1.0d-12, pt25=0.25d0)
      real smu  (LDIST_SHAPE,Nk),smv (LDIST_SHAPE,Nk),
     $     smpsd(LDIST_SHAPE,Nk),smtd(LDIST_SHAPE,Nk)
      real smu_m  (LDIST_SHAPE,Nk),smv_m (LDIST_SHAPE,Nk),
     $     smpsd_m(LDIST_SHAPE,Nk),smtd_m(LDIST_SHAPE,Nk)
**
*     __________________________________________________________________
*
      nu_dif = 0.d0
      lnr    = 1.0d0 - exp(Hzd_lnr)
      if (Hzd_pwr.gt.0) nu_dif = pt25*lnr**(2.d0/Hzd_pwr)
      nu_dif = min(nu_dif,pt25-epsilon)
      if (nu_dif.lt.1.0e-10) return
*
      visco = min ( nu_dif, pt25 )
*
*     TRAJECTORY
*     ----------
      call rpn_comm_xch_halo ( F_um  , 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_vm  , 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_psdm, 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_tdm , LDIST_DIM, l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
*     TLM
*     ---
      call rpn_comm_xch_halo ( F_u  , 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_v  , 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_psd, 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_td , LDIST_DIM, l_ni,l_nj,G_nk,
     $               G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
      nn=Hzd_pwr/2
*
!$omp parallel shared( visco,nn ) 
      do mm=1,nn
*
*        TRAJECTORY
*        ----------
         call hzd_nudeln (F_um  ,smu_m  ,LDIST_DIM,Nk,visco,1,0,mm,nn)
         call hzd_nudeln (F_vm  ,smv_m  ,LDIST_DIM,Nk,visco,0,1,mm,nn)
         call hzd_nudeln (F_psdm,smpsd_m,LDIST_DIM,Nk,visco,0,0,mm,nn)
         call hzd_nudeln (F_tdm ,smtd_m ,LDIST_DIM,Nk,visco,0,0,mm,nn)
*
*        TLM 
*        ---
         call hzd_nudeln (F_u  ,smu  ,LDIST_DIM,Nk,visco,1,0,mm,nn)
         call hzd_nudeln (F_v  ,smv  ,LDIST_DIM,Nk,visco,0,1,mm,nn)
         call hzd_nudeln (F_psd,smpsd,LDIST_DIM,Nk,visco,0,0,mm,nn)
         call hzd_nudeln (F_td ,smtd ,LDIST_DIM,Nk,visco,0,0,mm,nn)
*
         if(mm.ne.nn) then
!$omp single
*           TRAJECTORY
*           ----------
            call rpn_comm_xch_halo( smu_m  , LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
            call rpn_comm_xch_halo( smv_m  , LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
            call rpn_comm_xch_halo( smpsd_m, LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
            call rpn_comm_xch_halo( smtd_m , LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
*           TLM 
*           ---
            call rpn_comm_xch_halo( smu  , LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
            call rpn_comm_xch_halo( smv  , LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
            call rpn_comm_xch_halo( smpsd, LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
            call rpn_comm_xch_halo( smtd , LDIST_DIM, l_ni,l_nj,G_nk,
     $                    G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
!$omp end single
         endif
*
      end do
!$omp end parallel
*     __________________________________________________________________
*
      return
      end