! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $

!
!
SUBROUTINE fluxstokenc_p(pbaru, pbarv, masse, teta, phi)
  USE parallel_lmdz
  USE control_mod, ONLY: iapp_tracvl, planet_type, iphysiq
  USE caladvtrac_mod
  USE mod_hallo
  USE bands
  USE times
  USE Vampir
  USE write_field_loc


  IMPLICIT NONE
  !
  ! Auteurs:   F.Hourdin , P.Le Van, F.Forget, F.Codron
  !
  !=======================================================================
  !
  !   Shema de  Van Leer
  !
  !=======================================================================

  include "dimensions.h"
  include "paramet.h"
  include "tracstoke.h"

  !   Arguments:
  !   ----------
  REAL :: pbaru(ijb_u:ije_u, llm), pbarv(ijb_v:ije_v, llm)
  REAL :: masse(ijb_u:ije_u, llm)
  REAL :: teta(ijb_u:ije_u, llm)
  REAL :: phi(ijb_u:ije_u, llm)

  INTEGER, SAVE :: pasflx = 0
  !$OMP THREADPRIVATE(pasflx)
  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(pasflx==0) THEN
    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    DO l = 1, llm
      tetac(ijbu:ijeu, l) = 0.
      phic(ijbu:ijeu, l) = 0.
      pbarucc(ijbu:ijeu, l) = 0.
      pbarvcc(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
      pbarucc(ij, l) = pbarucc(ij, l) + pbaru(ij, l)
      tetac(ij, l) = tetac(ij, l) + teta(ij, l)
      phic(ij, l) = phic(ij, l) + phi(ij, l)

    ENDDO
    DO ij = ijbv, ijev
      pbarvcc(ij, l) = pbarvcc(ij, l) + pbarv(ij, l)
    ENDDO
  ENDDO
  !$OMP END DO NOWAIT

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

    ijb = ij_begin
    ije = ij_end

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

  ENDIF

  pasflx = pasflx + 1


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

  IF (pasflx==(iphysiq * istphy)) THEN
    ! !write(*,*) 'caladvtrac 133'
    !$OMP MASTER
    CALL suspend_timer(timer_caldyn)
    !$OMP END MASTER

    ijb = ij_begin
    ije = ij_end


    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    DO l = 1, llm
      pbarucc(ijb:ije, l) = pbarucc(ijb:ije, l) / REAL(iphysiq * istphy)
      tetac(ijb:ije, l) = tetac(ijb:ije, l) / REAL(iphysiq * istphy)
      phic(ijb:ije, l) = phic(ijb:ije, l) / REAL(iphysiq * istphy)
    ENDDO
    !$OMP ENDDO NOWAIT

    if (pole_sud) ije = ij_end - iip1

    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    DO l = 1, llm
      pbarvcc(ijb:ije, l) = pbarvcc(ijb:ije, l) / REAL(iphysiq * istphy)
    ENDDO
    !$OMP ENDDO NOWAIT


    !$OMP BARRIER
    CALL Register_Hallo_u(pbarucc, llm, 1, 1, 1, 1, Request_vanleer)
    CALL Register_Hallo_v(pbarvcc, llm, 1, 1, 1, 1, Request_vanleer)
    CALL SendRequest(Request_vanleer)
    !$OMP BARRIER
    CALL WaitRequest(Request_vanleer)
    !$OMP BARRIER

    !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(massec, pbarucc, pbarvcc, pbarugg, pbarvgg, wgg)

    ijb = ij_begin
    ije = ij_end

    !$OMP BARRIER
    CALL WriteField_u('pbarug', pbarugg)
    CALL WriteField_v('pbarvg', pbarvgg)
    CALL WriteField_u('wg', wgg)
    CALL WriteField_u('tetag', tetac)
    CALL WriteField_u('phig', phic)
    CALL WriteField_u('masseg', massec)


    !$OMP MASTER
    CALL Set_Distrib(distrib_caldyn)
    CALL VTe(VThallo)
    CALL resume_timer(timer_caldyn)
    !$OMP END MASTER


    !$OMP BARRIER
    pasflx = 0
  ENDIF ! if iadvtr.EQ.iapp_tracvl

END SUBROUTINE fluxstokenc_p
