! $Header$

SUBROUTINE groupe(pext, pbaru, pbarv, pbarum, pbarvm, wm)

  use comconst_mod, only: ngroup

  implicit none

  !   sous-programme servant a fitlrer les champs de flux de masse aux
  !   poles en "regroupant" les mailles 2 par 2 puis 4 par 4 etc. au fur
  !   et a mesure qu'on se rapproche du pole.
  !
  !   en entree: pext, pbaru et pbarv
  !
  !   en sortie:  pbarum,pbarvm et wm.
  !
  !   remarque, le wm est recalcule a partir des pbaru pbarv et on n'a donc
  !   pas besoin de w en entree.

  include "dimensions.h"
  include "paramet.h"
  include "comgeom2.h"

  ! integer ngroup
  ! parameter (ngroup=3)

  real :: pbaru(iip1, jjp1, llm), pbarv(iip1, jjm, llm)
  real :: pext(iip1, jjp1, llm)

  real :: pbarum(iip1, jjp1, llm), pbarvm(iip1, jjm, llm)
  real :: wm(iip1, jjp1, llm)

  real :: zconvm(iip1, jjp1, llm), zconvmm(iip1, jjp1, llm)

  real :: uu

  integer :: i, j, l

  logical :: firstcall, groupe_ok
  save firstcall, groupe_ok

  data firstcall/.TRUE./
  data groupe_ok/.TRUE./

  if (iim==1) then
    groupe_ok = .FALSE.
  endif

  if (firstcall) then
    if (groupe_ok) then
      if(mod(iim, 2**ngroup)/=0) &
              CALL abort_gcm('groupe', 'probleme du nombre de point', 1)
    endif
    firstcall = .FALSE.
  endif


  !   Champs 1D

  CALL convflu(pbaru, pbarv, llm, zconvm)

  CALL scopy(ijp1llm, zconvm, 1, zconvmm, 1)
  CALL scopy(ijmllm, pbarv, 1, pbarvm, 1)

  if (groupe_ok) then
    CALL groupeun(jjp1, llm, zconvmm)
    CALL groupeun(jjm, llm, pbarvm)

    !   Champs 3D
    do l = 1, llm
      do j = 2, jjm
        uu = pbaru(iim, j, l)
        do i = 1, iim
          uu = uu + pbarvm(i, j, l) - pbarvm(i, j - 1, l) - zconvmm(i, j, l)
          pbarum(i, j, l) = uu
          ! zconvm(i,j,l ) =  xflu(i-1,j,l)-xflu(i,j,l)+
          !    *                      yflu(i,j,l)-yflu(i,j-1,l)
        enddo
        pbarum(iip1, j, l) = pbarum(1, j, l)
      enddo
    enddo

  else
    pbarum(:, :, :) = pbaru(:, :, :)
    pbarvm(:, :, :) = pbarv(:, :, :)
  endif

  !    integration de la convergence de masse de haut  en bas ......
  do l = 1, llm
    do j = 1, jjp1
      do i = 1, iip1
        zconvmm(i, j, l) = zconvmm(i, j, l)
      enddo
    enddo
  enddo
  do  l = llm - 1, 1, -1
    do j = 1, jjp1
      do i = 1, iip1
        zconvmm(i, j, l) = zconvmm(i, j, l) + zconvmm(i, j, l + 1)
      enddo
    enddo
  enddo

  CALL vitvert(zconvmm, wm)

  return
END SUBROUTINE  groupe

