SUBROUTINE POSDDH
!****
!     ------------------------------------------------------------------

!     GESTION DES SORTIES
!     DIAGNOSTICS PAR DOMAINES HORIZONTAUX
!     ------------------------------------

!       -------------------------------------------------------
!     BUT
!     ---
!      EN FONCTION DES INDICATEURS LOGIQUES PERMANENTS ET CEUX
!     DU MOMENT (LHDOUFG,LHDOUFZ,LHDOUFD,LHDOUP) REALISE DES SYNTHESES
!     DES DIAGNOSTICS DES DOMAINES INTERNES PAR PROCESSEUR EN DIAGNOSTICS
!     SUR DES DOMAINES DE L USAGER. LES RESULTATS SONT ENSUITE IMPRIMES
!     ET/OU TRANSCRITS SUR UN FICHIER

!     ARGUMENTS D ENTREE
!     ------------------

!     ARGUMENTS IMPLICITES
!     --------------------
!       UNITE NULOUT
!       INDICATEURS LOGIQUES, COMMON /YOMLDDH/
!       EN PARTICULIER LHDOUP ET LHDOUFG,LHDOUFZ,LHDOUFD GERES PAR CNT4
!                      ------    ------
!         DANS LE COMDECK * YOMMDDH * POUR LES MASQUES
!       DIMENSIONS PROPRES AUX MASQUES DIAGNOSTIQUES DDH, COMMON /DDHDIM/
!       ET DIMENSIONS POUR LES TABLEAUX DE CUMULS
!       POINTEURS PROPRES AUX MASQUES DIAGNOSTIQUES DDH, COMMON /POMMDDH/
!       DECLARATION DES MASQUES ET LEURS AUXILLIAIRES
!       NSTEP ET D AUTRES PARAMETRES COMME AUXILLIAIRES EVANTUELS
!       NINDAT, NSSSSS (YOMRIP), CFNDDH, LINC (YOMOP),
!       NPODDH (YOMLUN)

!     AUTRES ENTREES
!     --------------
!       SOUS PROGRAMMES UTILISES
!        SYNTHESE POUR UN DOMAINE DE L UTILISATEUR   PPSYDH
!        IMPRESSION D UN BILAN                       PPEDDH
!        OUVERTURE DE FICHIER
!        ECRITURE D UN FICHIER                       PPFIDH
!        FERMETURE DE FICHIER

!      QUELQUES PARAMETRES NOTABLES
!      ----------------------------
!        ILONDO : NOMBRE D ARTICLES PROPRES A UN DOMAINE
!        ILDOC : LONGUEUR DE L ARTICLE DOCUMENTAIRE FICHIER

!     SORTIES
!     -------
!        PAS DE SORTIES DIRECTES: GERE LES APPELS AUX SS-PRGM

!     ORIGINAL
!     --------
!     91-03-04, Alain Joly.

!     MODIFICATIONS
!     -------------
!     92-10-05, J.M. Piriou: liste des articles ecrits (CALL LFILAF).
!     97-06-16, P. Viterbo : new style for surface DDH.
!     R. El Khatib : 01-08-07 Pruning options
!     R. El Khatib : 03-01-30 Enable file overlapping (helpful during restart)
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
!        M.Hamrud      01-DEC-2003 CY28R1 Cleaning
!   2006-08-22, J.M. Piriou: write DDH on LFA files.
!   2007-03-01, J.M. Piriou: correction de bug suggeree par Mats Hamrud le 19.2.2007.
!        R. El Khatib  23-Oct-2008 Use CFPATH in output file name to enable output data
!                                  to be saved on an alternative file system.
!     ------------------------------------------------------------------

USE PARKIND1  ,ONLY : JPIM     ,JPRB
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK

USE YOMCT0B  , ONLY : LECMWF
USE YOMDIM   , ONLY : NFLEVG
USE YOMLUN   , ONLY : NULOUT   ,NPODDH
USE YOMCT0   , ONLY : NPROC    ,NPRINTLEV
USE YOMCT3   , ONLY : NSTEP
USE YOMDYN   , ONLY : TSTEP
USE YOMRIP   , ONLY : NINDAT   ,NSSSSS
USE YOMOP    , ONLY : CFNDDH   ,LINC     ,CFPATH   ,NLPATH
USE YOMLDDH  , ONLY : LHDGLB   ,LHDZON   ,LHDDOP   ,LHDLFA   ,&
 & LHDHKS   ,LHDMCI   ,LHDENT   ,LHDPRG   ,LHDPRZ   ,&
 & LHDPRD   ,LHDEFG   ,LHDEFZ   ,LHDEFD   ,LHDLIST  ,&
 & LHDOUFG  ,LHDOUFZ  ,LHDOUFD  ,LHDOUP   ,LHDFIL  
USE YOMMDDH  , ONLY : NDHKD    ,NDHNOM   ,NDHIDH   ,NDHCS    ,&
 & NDHCV    ,NDHCVSU  ,NDHCSSU  ,NDHVV    ,NDHFVD   ,&
 & NDHFVP   ,NDHVS    ,NDHFSD   ,NDHFSP   ,NDHFFS   ,&
 & NDHVFS   ,NDHZPR   ,FNODDH   ,HDSFGL   ,NLRDDH   ,&
 & NURDDH   ,NLXDDH   ,NUXDDH   ,HDSFLA   ,HDSFDU   ,&
 & NDHVTSS  ,NDHFTSS  ,NDHVTTS  ,NDHFTTS  ,NDHVTIS  ,&
 & NDHFTIS  ,NDHVSSS  ,NDHFSSS  ,NDHVIIS  ,NDHFIIS  ,&
 & NDHVWLS  ,NDHFWLS  ,NDHVTLS  ,NDHFTLS    
USE YOMPGO   , ONLY : NLENRBL2
USE YOMPADDH , ONLY : NGPUMASK
USE YOMMP    , ONLY : MYPROC

IMPLICIT NONE

!     ------------------------------------------------------------------
REAL(KIND=JPRB) :: ZDDHCV (0:NFLEVG,NDHCVSU+NDHVV)
REAL(KIND=JPRB), ALLOCATABLE :: ZDDHCV_TOT (:,:,:)
REAL(KIND=JPRB) :: ZDDHCS (NDHCSSU+NDHVS)
REAL(KIND=JPRB), ALLOCATABLE :: ZDDHCS_TOT (:,:)
INTEGER(KIND=JPIM) :: IDIMCV,IDIMCS,IDIMDOM
REAL(KIND=JPRB) :: ZDHNOM(11)
INTEGER(KIND=JPIM) :: IGRDDH(NDHIDH)
INTEGER(KIND=JPIM) :: IDATEF(11), IDOCFI(17)
CHARACTER :: CLRAC*3, CLGLB*2, CLZON*2, CLDOM*2
CHARACTER :: CLNAMX*4, CLNMFI*14
CHARACTER(LEN=214) :: CLLFANAME ! Output filename
INTEGER(KIND=JPIM) :: ILDOC, ILONDO

INTEGER(KIND=JPIM) :: ICOMM, IDOM, IINC, ILONSOL, IMASK, INBARPE,&
 & ISEC, ITID, JBOX, JDHI, JDOC, &
 & JID, JKD, JROC  
INTEGER(KIND=JPIM) :: IDUMARR(1)
INTEGER(KIND=JPIM) :: ILENRBl2(1)
LOGICAL :: LLPODO, LLPODOF, LLPOGL, LLPOZOF, LLPOZOP

REAL(KIND=JPRB) :: ZSEC(1)
REAL(KIND=JPRB) :: ZHOOK_HANDLE

#include "addpgr.intfb.h"
#include "addpgri.intfb.h"
#include "inipgo.intfb.h"
#include "ppeddh.intfb.h"
#include "ppeddhec.intfb.h"
#include "ppfidh.intfb.h"
#include "ppsydh.intfb.h"
#include "wrpgr.intfb.h"

!     SORTIE EXPRESS AU PREMIER PAS DE TEMPS
IF (LHOOK) CALL DR_HOOK('POSDDH',0,ZHOOK_HANDLE)
IF ( NSTEP <= 0 ) THEN
  IF( LHOOK) CALL DR_HOOK('POSDDH',1,ZHOOK_HANDLE)
  RETURN
ENDIF
!     RACINES DE NOMS
CLGLB = 'GL'
CLZON = 'ZO'
CLDOM = 'DL'
!     LONGUEUR DE L ARTICLE DOCUMENTAIRE
ILDOC = 17

ILONSOL = 0
IF ( NDHVS /= 0 ) ILONSOL = ILONSOL+2*(NDHVTLS+NDHVTSS+NDHVTTS+&
 & NDHVTIS+NDHVSSS+NDHVIIS+NDHVWLS)  
IF ( (NDHFSD+NDHFSP) /= 0 ) ILONSOL = ILONSOL+NDHFTLS+&
 & NDHFTSS+NDHFTTS+NDHFTIS+NDHFSSS+NDHFIIS+NDHFWLS  
IF ( (NDHVFS) /= 0 ) ILONSOL = ILONSOL + NDHVFS
IF ( (NDHFFS) /= 0 ) ILONSOL = ILONSOL + NDHFFS

ILONDO = 1 + NDHCV + NDHVV + ILONSOL
!*
!     ------------------------------------------------------------------
!     1.- SYNTHESE LOGIQUE : QUE DOIT-ON FAIRE ?
!     DOMAINE GLOBAL
LLPOGL = LHDGLB .AND. ((LHDPRG.AND.LHDOUP) .OR.(LHDEFG.AND.LHDOUFG))
!     BANDES ZONALES
LLPOZOF = LHDZON .AND. (LHDEFZ.AND.LHDOUFZ)
LLPOZOP = LHDZON .AND. (LHDPRZ.AND.LHDOUP)
!     DOMAINES LIMITES
LLPODO = LHDDOP .AND. ((LHDPRD.AND.LHDOUP) .OR.(LHDEFD.AND.LHDOUFD))
LLPODOF = LHDDOP .AND. (LHDEFD.AND.LHDOUFD)

IF (NPRINTLEV >= 1) THEN
  WRITE (NULOUT,*) ' '
  WRITE (NULOUT,*) ' DDH * POSDDH - GESTION SORTIES * ',' NSTEP = ',NSTEP
ENDIF
IF ( LHDLIST ) THEN
  WRITE (NULOUT,*) ' DDH * LLPOGL = ',LLPOGL
  WRITE (NULOUT,*) ' DDH * LLPOZOF = ',LLPOZOF,' LLPOZOP = ',LLPOZOP
  WRITE (NULOUT,*) ' DDH * LLPODO = ',LLPODO,' LLPODOF = ',LLPODOF
  WRITE (NULOUT,*) ' DDH * ILONDO = ',ILONDO,' DONT ILONSOL = ',ILONSOL
ENDIF
!*
!     1.1- PREPARATIONS POUR LES IDENTIFICATIONS
CLRAC = CFNDDH(1:3)
CLNAMX = CFNDDH(6:9)
IF ( LINC ) THEN
  IINC = NINT( REAL(NSTEP,JPRB)*TSTEP/3600._JPRB )
ELSE
  IINC = NSTEP
ENDIF
WRITE (CLNMFI,'(A3,''XX'',A4,''+'',I4.4)') CLRAC, CLNAMX,IINC

IF (NPRINTLEV >= 1) THEN
  WRITE (NULOUT,*) ' DDH * POS NOM GENERIQUE FICHIERS ',CLNMFI
ENDIF

!     TABLEAU DE DATE
ZSEC(1)=REAL(NSTEP,JPRB)*TSTEP
ISEC=NINT(ZSEC(1))

!     ANNEE
IDATEF(1) = NINDAT / 10000
!     MOIS
IDATEF(2) = (NINDAT - 10000*IDATEF(1) ) / 100
!     JOUR DU MOIS
IDATEF(3) = NINDAT - 10000*IDATEF(1) - 100*IDATEF(2)
!    HEURE DU JOUR
IDATEF(4) = NSSSSS / 3600
!    MINUTES
IDATEF(5) = 0

ISEC=ISEC/3600
IF (ISEC <= 0) THEN
!     ANALYSE INITIALISEE
  IDATEF(6) = 1
  IDATEF(7) = 0
  IDATEF(8) = 0
  IDATEF(9) = 1
ELSE
!     PREVISION A N HEURES D ECHEANCE (OU A N JOURS)
  IF ( ISEC < 65000 ) THEN
    IDATEF(6) = 1
    IDATEF(7) = ISEC
  ELSE
    IDATEF(6) = 2
    IDATEF(7) = ISEC/24
  ENDIF
  IDATEF(8) = 0
  IDATEF(9) = 10
ENDIF
IDATEF(10) = NSTEP
IDATEF(11) = 0

!     TABLEAU DE DOCUMENTATION DE FICHIER
DO JDOC = 1, ILDOC
  IDOCFI(JDOC) = 0
ENDDO
IF (LHDOUFG.OR.LHDOUFZ.OR.LHDOUFD) THEN
  IF ( LHDHKS ) IDOCFI(2) = 1
  IF ( LHDMCI ) IDOCFI(3) = 1
  IF ( LHDENT ) IDOCFI(4) = 1
  IDOCFI(5) = NSTEP
  IDOCFI(6) = NFLEVG
  IDOCFI(7) = NDHCV
  IDOCFI(8) = NDHCS
  IDOCFI(9) = NDHVV
  IDOCFI(10) = NDHFVD
  IDOCFI(11) = NDHFVP
  IDOCFI(12) = NDHVS
  IDOCFI(13) = NDHFSD
  IDOCFI(14) = NDHFSP
  IDOCFI(16) = NDHVFS
  IDOCFI(17) = NDHFFS
ENDIF
IDIMCV=NDHCVSU+NDHVV
IDIMCS=NDHCSSU+NDHVS
!*
!     ------------------------------------------------------------------
!     2.- TRAITEMENT DU GLOBE
IF ( LLPOGL ) THEN
!     INITIALISE LE TABLEAU DE DISTRIBUTION
  DO JDHI = 1, NDHIDH
    IGRDDH(JDHI) = JDHI
  ENDDO

!     INITIALISE LE TABLEAU D IDENTIFICATION
  DO JID = 1, 10
    ZDHNOM(JID) = 0.0_JPRB
  ENDDO
  ZDHNOM(11) = 5._JPRB

!     CONSTITUTION DES MOYENNES GLOBALES
  ITID=0
  IMASK=0
  IDIMDOM=1
  ALLOCATE(ZDDHCV_TOT(0:NFLEVG,IDIMDOM,IDIMCV))
  ALLOCATE(ZDDHCS_TOT(IDIMDOM,IDIMCS))
  IDOM=1
  CALL PPSYDH (IDOM,IGRDDH,NDHIDH,HDSFGL, &
   & ZDDHCV,ZDDHCV_TOT,IDIMDOM,ZDDHCS,ZDDHCS_TOT,ITID,IMASK)  

!fw
!fw      !!!!!!!!!!!   kann doch in ppsydh gemacht werden
!fw
!fw       if not master send HDSFGL,ZDDHCV,ZDDHCS to master
!fw       if master recv
!fw       if master assemble global result
!fw
!fw       if master do the printing and i/o
!fw
!     IMPRESSION EVENTUELLE DU BILAN EN MOYENNE VERTICALE
  IF(MYPROC == 1) THEN
    IF ( LHDPRG.AND.LHDOUP) THEN
      IF(LECMWF) THEN
        CALL PPEDDHEC (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
      ELSE
        CALL PPEDDH (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
      ENDIF
    ENDIF

!     SORTIE EVENTUELLE SUR UN FICHIER RESERVE
    IF ( LHDEFG.AND.LHDOUFG ) THEN
!     OUVERTURE FICHIER
      CLNMFI(4:5) = CLGLB
      IDOCFI(1) = 5
      IDOCFI(15) = 1
      INBARPE=(5+ILONDO)*2
      CLLFANAME=' '
      IF (NLPATH >=1) THEN
        CLLFANAME=CFPATH(1:NLPATH)//CLNMFI
      ELSE
        CLLFANAME=CLNMFI
      ENDIF
      IF(LHDLFA) THEN
        CALL LFAOUV(NPODDH,CLLFANAME,'W')
      ELSE
        CALL INIPGO(1,INBARPE)
      ENDIF
      IDUMARR(1) = 0
!     NOM DE L EXPERIENCE
      IF(LHDLFA) THEN
        CALL LFAECRC(NPODDH,'INDICE EXPERIENCE',CLNAMX,1)
      ELSE
        CALL ADDPGRI(CLNAMX,1,IDUMARR(1),1)
      ENDIF
!     ARTICLE DATE
      IF(LHDLFA) THEN
        CALL LFAECRI(NPODDH,'DATE',IDATEF,11)
      ELSE
        CALL ADDPGRI('DATE',1,IDATEF,11)
      ENDIF
!     ARTICLE DOCUMENTAIRE
      IF(LHDLFA) THEN
        CALL LFAECRI(NPODDH,'DOCFICHIER',IDOCFI,ILDOC)
      ELSE
        CALL ADDPGRI('DOCFICHIER',1,IDOCFI,ILDOC)
      ENDIF
!     ARTICLE ECHEANCE
      IF(LHDLFA) THEN
        CALL LFAECRR(NPODDH,'ECHEANCE',ZSEC(1),1)
      ELSE
        CALL ADDPGR('ECHEANCE',1,ZSEC(1),1)
      ENDIF
!     ARTICLES SCIENTIFIQUES
      CALL PPFIDH (ZDHNOM,ZDDHCV,ZDDHCS,1,ZDDHCV_TOT,ZDDHCS_TOT,IDIMDOM)
!     LISTE DES ARTICLES ECRITS
      IF (LHDFIL) CALL LFALAF(NPODDH,NULOUT)
!     FERMETURE FICHIER
      IF(LHDLFA) THEN
        CALL LFAFER(NPODDH)
      ELSE
        ILENRBL2(1)=NLENRBL2
        CALL ADDPGRI('BLOCKLENGTH',1,ILENRBL2,1)
        CALL WRPGR(CLNMFI,IDATEF(1),IDATEF(2),IDATEF(3),&
         & IDATEF(4),IDATEF(5),NSTEP)  
      ENDIF
    ENDIF
  ENDIF
  DEALLOCATE(ZDDHCV_TOT)
  DEALLOCATE(ZDDHCS_TOT)
ENDIF
!*
!     ------------------------------------------------------------------
!     3.- TRAITEMENT DES BANDES ZONALES
IF ( LLPOZOP .AND. (.NOT.LLPOZOF) ) THEN
!     IMPRIME LA BANDE DE LATITUDE NDHZPR
!     IDENTIFICATION
  DO JID = 1, 10
    ZDHNOM(JID) = 0.0_JPRB
  ENDDO
  ZDHNOM(2) = REAL(NDHZPR,JPRB)
  ZDHNOM(3) = REAL(NDHKD,JPRB)
  ZDHNOM(4) = 1.0_JPRB - 2.0_JPRB*(ZDHNOM(2)-0.5_JPRB)/ZDHNOM(3)
  ZDHNOM(11) = 6._JPRB

!     CONSTITUTION DES MOYENNES SUR UNE BANDE ZONALE
  ITID=NDHZPR
  IMASK=0
  IDIMDOM=NDHKD
  ALLOCATE(ZDDHCV_TOT(0:NFLEVG,IDIMDOM,IDIMCV))
  ALLOCATE(ZDDHCS_TOT(IDIMDOM,IDIMCS))
  IDOM=NDHZPR
  CALL PPSYDH (IDOM,NLRDDH(1,NDHZPR),NLXDDH(NDHZPR),HDSFLA(NDHZPR), &
   & ZDDHCV,ZDDHCV_TOT,IDIMDOM,ZDDHCS,ZDDHCS_TOT,ITID,IMASK)  

!     IMPRESSION DU BILAN EN MOYENNE VERTICALE

  IF(MYPROC == 1) THEN
    IF(LECMWF) THEN
      CALL PPEDDHEC (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
    ELSE
      CALL PPEDDH (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
    ENDIF
  ENDIF
  DEALLOCATE(ZDDHCV_TOT)
  DEALLOCATE(ZDDHCS_TOT)

ENDIF

IF ( LLPOZOF ) THEN
!fw
!fw      only master does file i/o
!fw
!     SORTIE D UN FICHIER REGROUPANT L ENSEMBLE DES BANDES DE LATITUDE

!     OUVERTURE FICHIER

  IF(MYPROC == 1) THEN
    CLNMFI(4:5) = CLZON
    IDOCFI(1) = 6
    IDOCFI(15) = NDHKD
    INBARPE=(5+ILONDO)*2
    CLLFANAME=' '
    IF (NLPATH >=1) THEN
      CLLFANAME=CFPATH(1:NLPATH)//CLNMFI
    ELSE
      CLLFANAME=CLNMFI
    ENDIF
    IF(LHDLFA) THEN
      CALL LFAOUV(NPODDH,CLLFANAME,'W')
    ELSE
      CALL INIPGO(NDHKD,INBARPE)
    ENDIF
    IDUMARR(1) = 0
!     NOM DE L EXPERIENCE
    IF(LHDLFA) THEN
      CALL LFAECRC(NPODDH,'INDICE EXPERIENCE',CLNAMX,1)
    ELSE
      CALL ADDPGRI(CLNAMX,1,IDUMARR(1),1)
    ENDIF
!     ARTICLE DATE
    IF(LHDLFA) THEN
      CALL LFAECRI(NPODDH,'DATE',IDATEF,11)
    ELSE
      CALL ADDPGRI('DATE',1,IDATEF,11)
    ENDIF
!     ARTICLE DOCUMENTAIRE
    IF(LHDLFA) THEN
      CALL LFAECRI(NPODDH,'DOCFICHIER',IDOCFI,ILDOC)
    ELSE
      CALL ADDPGRI('DOCFICHIER',1,IDOCFI,ILDOC)
    ENDIF
!     ARTICLE ECHEANCE
    IF(LHDLFA) THEN
      CALL LFAECRR(NPODDH,'ECHEANCE',ZSEC(1),1)
    ELSE
      CALL ADDPGR('ECHEANCE',1,ZSEC(1),1)
    ENDIF

  ENDIF

  IDIMDOM=NDHKD
  ALLOCATE(ZDDHCV_TOT(0:NFLEVG,IDIMDOM,IDIMCV))
  ALLOCATE(ZDDHCS_TOT(IDIMDOM,IDIMCS))
  DO JKD = 1, NDHKD
!     IDENTIFICATION
    DO JID = 1, 10
      ZDHNOM(JID) = 0.0_JPRB
    ENDDO
    ZDHNOM(2) = REAL(JKD,JPRB)
    ZDHNOM(3) = REAL(NDHKD,JPRB)
    ZDHNOM(4) = 1.0_JPRB - 2.0_JPRB*(ZDHNOM(2)-0.5_JPRB)/ZDHNOM(3)
    ZDHNOM(11) = 6._JPRB

!     CONSTITUTION DES MOYENNES SUR LA BANDE ZONALE COURANTE

    ITID=JKD
    IMASK=0
    IDOM=JKD
    CALL PPSYDH (IDOM,NLRDDH(1,JKD),NLXDDH(JKD),HDSFLA(JKD), &
     & ZDDHCV,ZDDHCV_TOT,IDIMDOM,ZDDHCS,ZDDHCS_TOT,ITID,IMASK)  

!fw
!fw      !!!!!!!!!!!   kann doch in ppsydh gemacht werden
!fw
!fw          if not master send HDSFLA(JKD),ZDDHCV,ZDDHCS
!fw          if master recv
!fw
!fw          if master assemble results
!fw          if master print
!fw
!     IMPRESSION EVENTUELLE
    IF(MYPROC == 1) THEN
      IF (LLPOZOP.AND.(JKD == NDHZPR)) THEN
        IF(LECMWF) THEN
          CALL PPEDDHEC (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
        ELSE
          CALL PPEDDH (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
        ENDIF
      ENDIF

!     ECRITURE DU DOMAINE SUR FICHIER.
      CALL PPFIDH (ZDHNOM,ZDDHCV,ZDDHCS,JKD,ZDDHCV_TOT,ZDDHCS_TOT,IDIMDOM)
!     LISTE DES ARTICLES ECRITS
      IF (LHDFIL) CALL LFALAF(NPODDH,NULOUT)
    ENDIF

  ENDDO
  DEALLOCATE(ZDDHCV_TOT)
  DEALLOCATE(ZDDHCS_TOT)

!     FERMETURE DU FICHIER

  IF(MYPROC == 1) THEN
!fw
    IF(LHDLFA) THEN
      CALL LFAFER(NPODDH)
    ELSE
      ILENRBL2(1)=NLENRBL2
      CALL ADDPGRI('BLOCKLENGTH',1,ILENRBL2,1)
      CALL WRPGR(CLNMFI,IDATEF(1),IDATEF(2),IDATEF(3),&
       & IDATEF(4),IDATEF(5),NSTEP)  
    ENDIF
  ENDIF
ENDIF
!*
!     ------------------------------------------------------------------
!     4.- TRAITEMENT DES DOMAINES DE L UTILISATEUR
IF ( LLPODO ) THEN
  IF ( LLPODOF ) THEN
!fw
!fw      if master do file i/o
!fw
    IF(MYPROC == 1) THEN
!fw
!     OUVERTURE FICHIER
      CLNMFI(4:5) = CLDOM
      IDOCFI(1) = 1
      IDOCFI(15) = NDHNOM
      INBARPE=(5+ILONDO)*2
      CLLFANAME=' '
      IF (NLPATH >=1) THEN
        CLLFANAME=CFPATH(1:NLPATH)//CLNMFI
      ELSE
        CLLFANAME=CLNMFI
      ENDIF
      IF(LHDLFA) THEN
        CALL LFAOUV(NPODDH,CLLFANAME,'W')
      ELSE
        CALL INIPGO(NDHNOM,INBARPE)
      ENDIF
      IDUMARR(1) = 0
!     NOM DE L EXPERIENCE
      IF(LHDLFA) THEN
        CALL LFAECRC(NPODDH,'INDICE EXPERIENCE',CLNAMX,1)
      ELSE
        CALL ADDPGRI(CLNAMX,1,IDUMARR(1),1)
      ENDIF
!     ARTICLE DATE
      IF(LHDLFA) THEN
        CALL LFAECRI(NPODDH,'DATE',IDATEF,11)
      ELSE
        CALL ADDPGRI('DATE',1,IDATEF,11)
      ENDIF
!     ARTICLE DOCUMENTAIRE
      IF(LHDLFA) THEN
        CALL LFAECRI(NPODDH,'DOCFICHIER',IDOCFI,ILDOC)
      ELSE
        CALL ADDPGRI('DOCFICHIER',1,IDOCFI,ILDOC)
      ENDIF
!     ARTICLE ECHEANCE
      IF(LHDLFA) THEN
        CALL LFAECRR(NPODDH,'ECHEANCE',ZSEC(1),1)
      ELSE
        CALL ADDPGR('ECHEANCE',1,ZSEC(1),1)
      ENDIF
    ENDIF
  ENDIF

  IDIMDOM=NDHNOM
  ALLOCATE(ZDDHCV_TOT(0:NFLEVG,IDIMDOM,IDIMCV))
  ALLOCATE(ZDDHCS_TOT(IDIMDOM,IDIMCS))
  DO JBOX = 1, NDHNOM
!     RECHERCHE L IDENTIFICATION DU DOMAINE
    IMASK = NINT( FNODDH(1,JBOX) )
    IDOM = NINT( FNODDH(2,JBOX) )

    IF (NPRINTLEV >= 1) THEN
      WRITE (NULOUT,*) ' DDH * DOMAINE (',IMASK,',',IDOM,') = ',&
       & JBOX,' EN SORTIE '  
    ENDIF

!     CONSTITUTION DES MOYENNES SUR LE DOMAINE
    ITID=-1
    ICOMM=0
    DO JROC=1,NPROC
      IF( NGPUMASK(JBOX,JROC) == 1 )THEN
        ICOMM=ICOMM+1
      ENDIF
    ENDDO
    IF( ICOMM == 0 )THEN
      WRITE(NULOUT,'("POSDDH:  DOMAIN CONTAINS NO POINTS")')
      CYCLE
    ENDIF
    CALL PPSYDH (JBOX,NURDDH(1,IDOM,IMASK),NUXDDH(IDOM,IMASK),HDSFDU(IDOM,IMASK), &
     & ZDDHCV,ZDDHCV_TOT,IDIMDOM,ZDDHCS,ZDDHCS_TOT,ITID,JBOX)

!fw
!fw       if master assemble results
!fw       if master print
!fw
!     IMPRESSION EVENTUELLE DU BILAN VERTICAL
    IF(MYPROC == 1) THEN
      IF ( LHDPRD.AND.LHDOUP )THEN
        IF(LECMWF) THEN
          CALL PPEDDHEC (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
        ELSE
          CALL PPEDDH (ZDHNOM,ZDDHCV,ZDDHCS,CLNAMX,IDATEF)
        ENDIF
      ENDIF

!     TRANSFERT DE CE DOMAINE SUR LE FICHIER
      IF ( LLPODOF ) THEN
        CALL PPFIDH (FNODDH(1,JBOX),ZDDHCV,ZDDHCS,JBOX,ZDDHCV_TOT,ZDDHCS_TOT,IDIMDOM)
!          LISTE DES ARTICLES ECRITS
        IF (LHDFIL) CALL LFALAF(NPODDH,NULOUT)
      ENDIF

    ENDIF
  ENDDO

  IF ( LLPODOF ) THEN
!     FERMETURE FICHIER
    IF(MYPROC == 1) THEN
      IF(LHDLFA) THEN
        CALL LFAFER(NPODDH)
      ELSE
        ILENRBL2(1)=NLENRBL2
        CALL ADDPGRI('BLOCKLENGTH',1,ILENRBL2,1)
        CALL WRPGR(CLNMFI,IDATEF(1),IDATEF(2),IDATEF(3),&
         & IDATEF(4),IDATEF(5),NSTEP)  
      ENDIF
    ENDIF
  ENDIF
  DEALLOCATE(ZDDHCV_TOT)
  DEALLOCATE(ZDDHCS_TOT)
ENDIF

IF (NPRINTLEV >= 1) THEN
  WRITE (NULOUT,*) ' POSDDH * FINI '
ENDIF
IF (LHOOK) CALL DR_HOOK('POSDDH',1,ZHOOK_HANDLE)
END SUBROUTINE POSDDH
