!
! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $
!
!
!
      SUBROUTINE caladvtrac_loc(q,pbaru,pbarv , &
              p ,masse, dq ,  teta, &
              flxw, pk, iapptrac)
  USE parallel_lmdz
  USE infotrac, ONLY : nqtot
  USE control_mod, ONLY : iapp_tracvl,planet_type
  USE caladvtrac_mod
  USE mod_hallo
  USE bands
  USE times
  USE Vampir
  USE write_field_loc
  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
USE paramet_mod_h
IMPLICIT NONE
  !
  ! Auteurs:   F.Hourdin , P.Le Van, F.Forget, F.Codron
  !
  ! F.Codron (10/99) : ajout humidite specifique pour eau vapeur
  !=======================================================================
  !
  !   Shema de  Van Leer
  !
  !=======================================================================





  !   Arguments:
  !   ----------
  REAL :: pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm)
  REAL :: masse(ijb_u:ije_u,llm)
  REAL :: p( ijb_u:ije_u,llmp1)
  REAL :: q( ijb_u:ije_u,llm,nqtot),dq( ijb_u:ije_u,llm, nqtot )
  REAL :: teta( ijb_u:ije_u,llm),pk( ijb_u:ije_u,llm)
  REAL :: flxw(ijb_u:ije_u,llm)
  INTEGER :: iapptrac
  !   Local:
  !   ------
   ! REAL :: pbarug(ijb_u:ije_u,llm)
   ! REAL :: pbarvg(ijb_v:ije_v,llm)
  !      REAL :: wg(ijb_u:ije_u,llm)

  REAL :: flxw_adv(distrib_vanleer%ijb_u:distrib_vanleer%ije_u,llm)
  INTEGER,SAVE :: iadvtr=0
!$OMP THREADPRIVATE(iadvtr)
  INTEGER ::  ijb,ije,ijbu,ijbv,ijeu,ijev,j
  INTEGER :: ij,l
  TYPE(Request),SAVE :: Request_vanleer
!$OMP THREADPRIVATE(Request_vanleer)

  ! !write(*,*) 'caladvtrac 58: entree'
  ijbu=ij_begin
  ijeu=ij_end

  ijbv=ij_begin-iip1
  ijev=ij_end
  if (pole_nord) ijbv=ij_begin
  if (pole_sud)  ijev=ij_end-iip1

  IF(iadvtr.EQ.0) THEN
!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    DO l=1,llm
      pbaruc(ijbu:ijeu,l)=0.
      pbarvc(ijbv:ijev,l)=0.
    ENDDO
!$OMP END DO NOWAIT
  ENDIF

  !   accumulation des flux de masse horizontaux
!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
  DO l=1,llm
     DO ij = ijbu,ijeu
        pbaruc(ij,l) = pbaruc(ij,l) + pbaru(ij,l)
     ENDDO
     DO ij = ijbv,ijev
        pbarvc(ij,l) = pbarvc(ij,l) + pbarv(ij,l)
     ENDDO
  ENDDO
!$OMP END DO NOWAIT

  !   selection de la masse instantannee des mailles avant le transport.
  IF(iadvtr.EQ.0) THEN

      ijb=ij_begin
      ije=ij_end

!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
   DO l=1,llm
      massem(ijb:ije,l)=masse(ijb:ije,l)
   ENDDO
!$OMP END DO NOWAIT

  ENDIF

  iadvtr   = iadvtr+1

!$OMP MASTER
  iapptrac = iadvtr
!$OMP END MASTER

  !   Test pour savoir si on advecte a ce pas de temps

  IF ( iadvtr.EQ.iapp_tracvl ) THEN
  ! !write(*,*) 'caladvtrac 133'
!$OMP MASTER
    call suspend_timer(timer_caldyn)
!$OMP END MASTER

  ijb=ij_begin
  ije=ij_end

  !c   ..  Modif P.Le Van  ( 20/12/97 )  ....
  !c

  !   traitement des flux de masse avant advection.
  ! 1. calcul de w
  ! 2. groupement des mailles pres du pole.

    CALL groupe_loc( massem, pbaruc,pbarvc, pbarug,pbarvg,wg )

!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
  DO l=1,llm
    flxw(ijb:ije,l)=wg(ijb:ije,l)/REAL(iapp_tracvl)
  ENDDO
!$OMP ENDDO NOWAIT

!$OMP BARRIER


!$OMP MASTER
  call VTb(VTHallo)
!$OMP END MASTER

  call Register_SwapField_u(pbarug,pbarug_adv, distrib_vanleer, &
        Request_vanleer)
  call Register_SwapField_v(pbarvg,pbarvg_adv, distrib_vanleer, &
        Request_vanleer,up=1)
  call Register_SwapField_u(massem,massem_adv, distrib_vanleer, &
        Request_vanleer)
  call Register_SwapField_u(wg,wg_adv,distrib_vanleer, &
        Request_vanleer)
  call Register_SwapField_u(teta,teta_adv, distrib_vanleer, &
        Request_vanleer,up=1,down=1)
  call Register_SwapField_u(p,p_adv, distrib_vanleer, &
        Request_vanleer,up=1,down=1)
  call Register_SwapField_u(pk,pk_adv, distrib_vanleer, &
        Request_vanleer,up=1,down=1)
  call Register_SwapField_u(q,q_adv, distrib_vanleer, &
        Request_vanleer)

  call SendRequest(Request_vanleer)
!$OMP BARRIER
  call WaitRequest(Request_vanleer)


!$OMP BARRIER
!$OMP MASTER
  call Set_Distrib(distrib_vanleer)
  call VTe(VTHallo)
  call VTb(VTadvection)
  call start_timer(timer_vanleer)
!$OMP END MASTER
!$OMP BARRIER
   ! CALL WriteField_u('pbarug_adv',pbarug_adv)
   ! CALL WriteField_u('',)

  ! !write(*,*) 'caladvtrac 185'
  CALL advtrac_loc( pbarug_adv,pbarvg_adv,wg_adv, &
        p_adv,  massem_adv,q_adv, teta_adv, &
        pk_adv)
  ! !write(*,*) 'caladvtrac 189'


!$OMP MASTER
    call VTe(VTadvection)
    call stop_timer(timer_vanleer)
    call VTb(VThallo)
!$OMP END MASTER

    call Register_SwapField_u(q_adv,q,distrib_caldyn, &
          Request_vanleer)

    call SendRequest(Request_vanleer)
!$OMP BARRIER
    call WaitRequest(Request_vanleer)

!$OMP BARRIER
!$OMP MASTER
    call Set_Distrib(distrib_caldyn)
    call VTe(VThallo)
    call resume_timer(timer_caldyn)
!$OMP END MASTER
!$OMP BARRIER
      iadvtr=0
   ENDIF ! if iadvtr.EQ.iapp_tracvl

END SUBROUTINE caladvtrac_loc


