From f915ef0b06c2eeec6d46a20a60cf1303e8154994 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 14 Apr 2017 15:54:20 +0200
Subject: [PATCH] Philippe 14/04/2017: IO: add IO_WRITE_HEADER subroutine

---
 src/LIB/SURCOUCHE/src/fmwrit_ll.f90   | 30 +++++++++++++++++++++++++++
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 |  4 ++--
 src/MNH/diag.f90                      |  2 ++
 src/MNH/modd_lunit.f90                |  3 ++-
 src/MNH/modeln.f90                    |  5 +++--
 src/MNH/open_nestpgd_files.f90        |  9 ++++++--
 src/MNH/prep_nest_pgd.f90             | 15 ++------------
 src/MNH/prep_pgd.f90                  | 20 +++++++-----------
 src/MNH/write_lfifmn_fordiachron.f90  |  7 -------
 src/MNH/write_lfin.f90                |  8 -------
 10 files changed, 55 insertions(+), 48 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index 91174fc06..678318990 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -223,6 +223,7 @@ MODULE MODE_FMWRIT
        & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITC1_ll,FMWRITT0_ll,FMWRITBOXX2_ll,&
        & FMWRITBOXX3_ll,FMWRITBOXX4_ll,FMWRITBOXX5_ll,FMWRITBOXX6_ll
   PUBLIC IO_WRITE_FIELD, IO_WRITE_FIELD_BOX, IO_WRITE_FIELD_LB
+  PUBLIC IO_WRITE_HEADER
 
   !INCLUDE 'mpif.h'
 
@@ -255,6 +256,35 @@ CONTAINS
   END SUBROUTINE FM_WRIT_ERR
 
 
+  SUBROUTINE IO_WRITE_HEADER(TPFILE,HLUOUT)
+    !
+    USE MODD_CONF
+    USE MODD_CONF_n, ONLY : CSTORAGE_TYPE
+    USE MODD_IO_ll, ONLY: TFILEDATA
+    !
+    TYPE(TFILEDATA), INTENT(IN)  :: TPFILE   ! File structure
+    CHARACTER(LEN=*),INTENT(IN)  :: HLUOUT   ! File for prints in FM
+    !
+    INTEGER :: IRESP
+    !
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_HEADER','called')
+    !
+    CALL IO_WRITE_HEADER_NC4(TPFILE,HLUOUT)
+    !
+    CALL IO_WRITE_FIELD(TPFILE,'MASDEV',      HLUOUT,IRESP,NMASDEV)
+    CALL IO_WRITE_FIELD(TPFILE,'BUGFIX',      HLUOUT,IRESP,NBUGFIX)
+    CALL IO_WRITE_FIELD(TPFILE,'BIBUSER',     HLUOUT,IRESP,CBIBUSER)
+    CALL IO_WRITE_FIELD(TPFILE,'PROGRAM',     HLUOUT,IRESP,CPROGRAM)
+    CALL IO_WRITE_FIELD(TPFILE,'STORAGE_TYPE',HLUOUT,IRESP,CSTORAGE_TYPE)
+    CALL IO_WRITE_FIELD(TPFILE,'MY_NAME',     HLUOUT,IRESP,TPFILE%CNAME)
+    IF ( ASSOCIATED(TPFILE%TDADFILE) ) THEN
+      CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',HLUOUT,IRESP,TPFILE%TDADFILE%CNAME)
+    ELSE
+      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_HEADER','TPFILE%TDADFILE not associated')
+      CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',HLUOUT,IRESP,'')
+    ENDIF
+    !
+  END SUBROUTINE IO_WRITE_HEADER
 
   SUBROUTINE FMWRITX0_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 29b23fcd1..ab1c88d05 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -155,8 +155,8 @@ USE MODD_IO_ll, ONLY: ISP,TFILEDATA
 !
 USE MODE_FD_ll
 !
-TYPE(TFILEDATA),POINTER,INTENT(IN)  :: TPFILE ! File structure
-CHARACTER(LEN=*),       INTENT(IN)  :: HFIPRI ! File for prints in FM
+TYPE(TFILEDATA), INTENT(IN)  :: TPFILE ! File structure
+CHARACTER(LEN=*),INTENT(IN)  :: HFIPRI ! File for prints in FM
 !
 INTEGER(KIND=IDCDF_KIND) :: ISTATUS
 TYPE(FD_ll), POINTER         :: TZFD
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 3b06c8376..e03bc3860 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -139,6 +139,7 @@ USE MODI_WRITE_AIRCRAFT_BALLOON
 USE MODE_POS
 USE MODE_TIME
 USE MODE_FM
+USE MODE_FMWRIT, ONLY : IO_WRITE_HEADER
 USE MODE_IO_ll
 USE MODE_ll
 USE MODE_MODELN_HANDLER
@@ -585,6 +586,7 @@ IF ( LAIRCRAFT_BALLOON ) THEN
                           TXDTBAL%TDATE%DAY,  &
                           TXDTBAL%TIME        )
   ENDDO
+  CALL IO_WRITE_HEADER(TZDIACFILE,CLUOUT)
   CALL WRITE_LFIFMN_FORDIACHRO_n(TZDIACFILE)
   CALL WRITE_AIRCRAFT_BALLOON(TZDIACFILE)
   CALL MENU_DIACHRO(TZDIACFILE,CLUOUT,'END')
diff --git a/src/MNH/modd_lunit.f90 b/src/MNH/modd_lunit.f90
index d82f841bc..fe133c538 100644
--- a/src/MNH/modd_lunit.f90
+++ b/src/MNH/modd_lunit.f90
@@ -35,7 +35,8 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    05/05/94                      
-!!      V. Masson   01/2004 add file names for use in externalized surface!-------------------------------------------------------------------------------
+!!      V. Masson   01/2004 add file names for use in externalized surface
+!-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 13ca3cf59..59edda8b1 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -603,6 +603,7 @@ IF (KTCOUNT == 1) THEN
 !
   CALL IO_FILE_OPEN_ll(TDIAFILE,CLUOUT,IRESP)
 !
+  CALL IO_WRITE_HEADER(TDIAFILE,CLUOUT)
   CALL WRITE_DESFM_n(IMI,TRIM(TDIAFILE%CNAME)//'.des',CLUOUT)
   CALL WRITE_LFIFMN_FORDIACHRO_n(TDIAFILE)
 !
@@ -912,7 +913,7 @@ IF (IBAK < NBAK_NUMB ) THEN
     CALL IO_FILE_OPEN_ll(TZBAKFILE,CLUOUT,IRESP)
     !
     CALL WRITE_DESFM_n(IMI,TRIM(TZBAKFILE%CNAME)//'.des',CLUOUT)
-    CALL IO_WRITE_HEADER_NC4(TBACKUPN(IBAK)%TFILE,CLUOUT)
+    CALL IO_WRITE_HEADER(TBACKUPN(IBAK)%TFILE,CLUOUT)
     CALL WRITE_LFIFM_n(TBACKUPN(IBAK)%TFILE,TBACKUPN(IBAK)%TFILE%TDADFILE%CNAME)
     COUTFMFILE = TZBAKFILE%CNAME
     CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE)
@@ -954,7 +955,7 @@ IF (IOUT < NOUT_NUMB ) THEN
     !
     CALL IO_FILE_OPEN_ll(TZOUTFILE,CLUOUT,IRESP)
     !
-    CALL IO_WRITE_HEADER_NC4(TZOUTFILE,CLUOUT)
+    CALL IO_WRITE_HEADER(TZOUTFILE,CLUOUT)
     CALL IO_WRITE_FIELDLIST(TOUTPUTN(IOUT),CLUOUT)
     CALL IO_WRITE_FIELD_USER(TOUTPUTN(IOUT),CLUOUT)
     !
diff --git a/src/MNH/open_nestpgd_files.f90 b/src/MNH/open_nestpgd_files.f90
index a3413c3fc..39024a02f 100644
--- a/src/MNH/open_nestpgd_files.f90
+++ b/src/MNH/open_nestpgd_files.f90
@@ -105,8 +105,8 @@ IMPLICIT NONE
 !*       0.1   Declaration of arguments
 !              ------------------------
 !
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: TPFILEPGD     ! Input  PGD files
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: TPFILENESTPGD ! Output PGD files
+TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,       INTENT(OUT) :: TPFILEPGD     ! Input  PGD files
+TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,TARGET,INTENT(OUT) :: TPFILENESTPGD ! Output PGD files
 !
 !*       0.2   Declaration of local variables
 !              ------------------------------
@@ -305,6 +305,11 @@ IF (NMODEL>=8) TPFILEPGD(8)%CNAME = TRIM(YPGD8)
 !
 DO JPGD=1,NMODEL
   TPFILENESTPGD(JPGD)%CNAME = TRIM(TPFILEPGD(JPGD)%CNAME)//'.nest'//ADJUSTL(YNEST)
+  IF (NDAD(JPGD)>=1) THEN
+    TPFILENESTPGD(JPGD)%TDADFILE => TPFILENESTPGD(NDAD(JPGD))
+  ELSE
+    NULLIFY(TPFILENESTPGD(JPGD)%TDADFILE)
+  END IF
 END DO
 !
 TPFILEPGD(:)    %CTYPE = 'PREPPGD'
diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90
index b14396842..41f2b91e9 100644
--- a/src/MNH/prep_nest_pgd.f90
+++ b/src/MNH/prep_nest_pgd.f90
@@ -364,19 +364,8 @@ END DO
 !
 !
 DO JPGD=1,NMODEL
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'MASDEV',      CLUOUT0,IRESP,NMASDEV)
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'BUGFIX',      CLUOUT0,IRESP,NBUGFIX)
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'BIBUSER',     CLUOUT0,IRESP,CBIBUSER)
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'PROGRAM',     CLUOUT0,IRESP,CPROGRAM)
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'STORAGE_TYPE',CLUOUT0,IRESP,CSTORAGE_TYPE)
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'MY_NAME',     CLUOUT0,IRESP,TZFILENESTPGD(JPGD)%CNAME)
-  IF (NDAD(JPGD)>=1) THEN
-    YDAD_NAME = TZFILENESTPGD(NDAD(JPGD))%CNAME
-  ELSE
-    YDAD_NAME = '                           '
-  END IF
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'DAD_NAME',    CLUOUT0,IRESP,YDAD_NAME)
-  IF (LEN_TRIM(YDAD_NAME)>0) THEN
+  CALL IO_WRITE_HEADER(TZFILENESTPGD(JPGD),CLUOUT0)
+  IF ( ASSOCIATED(TZFILENESTPGD(JPGD)%TDADFILE) ) THEN
     CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'DXRATIO',CLUOUT0,IRESP,NDXRATIO_ALL(JPGD))
     CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'DYRATIO',CLUOUT0,IRESP,NDYRATIO_ALL(JPGD))
     CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'XOR',    CLUOUT0,IRESP,NXOR_ALL(JPGD))
diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90
index dc5c4cda2..bba967b26 100644
--- a/src/MNH/prep_pgd.f90
+++ b/src/MNH/prep_pgd.f90
@@ -75,8 +75,7 @@
 !*    0.     DECLARATION
 !            -----------
 !
-USE MODD_CONF,   ONLY : CPROGRAM, NMASDEV, NBUGFIX, CBIBUSER, &
-                        L1D, L2D, LPACK , LCARTESIAN
+USE MODD_CONF,   ONLY : CPROGRAM, L1D, L2D, LPACK, LCARTESIAN
 USE MODD_CONF_n,ONLY : CSTORAGE_TYPE
 USE MODD_LUNIT,  ONLY : CLUOUT0
 USE MODD_PARAMETERS, ONLY : XUNDEF
@@ -259,17 +258,12 @@ TZFILE%NLFIVERB   = 5
 !
 CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
 !
-CALL IO_WRITE_FIELD(TZFILE,'MASDEV',      CLUOUT0,IRESP,NMASDEV)
-CALL IO_WRITE_FIELD(TZFILE,'BUGFIX',      CLUOUT0,IRESP,NBUGFIX)
-CALL IO_WRITE_FIELD(TZFILE,'BIBUSER',     CLUOUT0,IRESP,CBIBUSER)
-CALL IO_WRITE_FIELD(TZFILE,'PROGRAM',     CLUOUT0,IRESP,CPROGRAM)
-CALL IO_WRITE_FIELD(TZFILE,'STORAGE_TYPE',CLUOUT0,IRESP,CSTORAGE_TYPE)
-CALL IO_WRITE_FIELD(TZFILE,'MY_NAME',     CLUOUT0,IRESP,TZFILE%CNAME)
-CALL IO_WRITE_FIELD(TZFILE,'DAD_NAME',    CLUOUT0,IRESP,YDAD)
-CALL IO_WRITE_FIELD(TZFILE,'SURF',        CLUOUT0,IRESP,'EXTE')
-CALL IO_WRITE_FIELD(TZFILE,'L1D',         CLUOUT0,IRESP,L1D)
-CALL IO_WRITE_FIELD(TZFILE,'L2D',         CLUOUT0,IRESP,L2D)
-CALL IO_WRITE_FIELD(TZFILE,'PACK',        CLUOUT0,IRESP,LPACK)
+CALL IO_WRITE_HEADER(TZFILE,CLUOUT0)
+!
+CALL IO_WRITE_FIELD(TZFILE,'SURF',CLUOUT0,IRESP,'EXTE')
+CALL IO_WRITE_FIELD(TZFILE,'L1D', CLUOUT0,IRESP,L1D)
+CALL IO_WRITE_FIELD(TZFILE,'L2D', CLUOUT0,IRESP,L2D)
+CALL IO_WRITE_FIELD(TZFILE,'PACK',CLUOUT0,IRESP,LPACK)
 IF ( NDXRATIO <= 0 .AND. NDYRATIO <= 0 ) THEN
   NDXRATIO = 1
   NDYRATIO = 1
diff --git a/src/MNH/write_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90
index ef608331e..611c3c022 100644
--- a/src/MNH/write_lfifmn_fordiachron.f90
+++ b/src/MNH/write_lfifmn_fordiachron.f90
@@ -136,18 +136,11 @@ LPACK=.FALSE.
 !
 !*       1.0    Version :
 !
-CALL IO_WRITE_FIELD(TPFILE,'MASDEV', CLUOUT,IRESP,NMASDEV)
-CALL IO_WRITE_FIELD(TPFILE,'BUGFIX', CLUOUT,IRESP,NBUGFIX)
-CALL IO_WRITE_FIELD(TPFILE,'BIBUSER',CLUOUT,IRESP,CBIBUSER)
-CALL IO_WRITE_FIELD(TPFILE,'PROGRAM',CLUOUT,IRESP,CPROGRAM)
-!
 CALL IO_WRITE_FIELD(TPFILE,'L1D', CLUOUT,IRESP,L1D)
 CALL IO_WRITE_FIELD(TPFILE,'L2D', CLUOUT,IRESP,L2D)
 CALL IO_WRITE_FIELD(TPFILE,'PACK',CLUOUT,IRESP,LPACK)
 CALL IO_WRITE_FIELD(TPFILE,'SURF',CLUOUT,IRESP,CSURF)
 !
-CALL IO_WRITE_FIELD(TPFILE,'STORAGE_TYPE',CLUOUT,IRESP,CSTORAGE_TYPE)
-!
 !*       1.1    Dimensions :
 !
 CALL IO_WRITE_FIELD(TPFILE,'IMAX',CLUOUT,IRESP,NIMAX_ll)
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 38e101917..3a50f97a1 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -347,13 +347,7 @@ IKE=IKU-JPVEXT
 !
 !*       1.0    YFMFILE and HDADFILE writing :
 !
-CALL IO_WRITE_FIELD(TPFILE,'MASDEV',  CLUOUT,IRESP,NMASDEV)
-CALL IO_WRITE_FIELD(TPFILE,'BUGFIX',  CLUOUT,IRESP,NBUGFIX)
-CALL IO_WRITE_FIELD(TPFILE,'BIBUSER', CLUOUT,IRESP,CBIBUSER)
-CALL IO_WRITE_FIELD(TPFILE,'PROGRAM', CLUOUT,IRESP,CPROGRAM)
 CALL IO_WRITE_FIELD(TPFILE,'FILETYPE',CLUOUT,IRESP,TPFILE%CTYPE)
-CALL IO_WRITE_FIELD(TPFILE,'MY_NAME', CLUOUT,IRESP,TPFILE%CNAME)
-CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',CLUOUT,IRESP,HDADFILE)
 !
 IF (LEN_TRIM(HDADFILE)>0) THEN
   CALL IO_WRITE_FIELD(TPFILE,'DXRATIO',CLUOUT,IRESP,NDXRATIO_ALL(IMI))
@@ -364,8 +358,6 @@ END IF
 !
 !*       1.1    Type and Dimensions :
 !
-CALL IO_WRITE_FIELD(TPFILE,'STORAGE_TYPE',CLUOUT,IRESP,CSTORAGE_TYPE)
-!
 CALL IO_WRITE_FIELD(TPFILE,'IMAX',CLUOUT,IRESP,NIMAX_ll)
 CALL IO_WRITE_FIELD(TPFILE,'JMAX',CLUOUT,IRESP,NJMAX_ll)
 CALL IO_WRITE_FIELD(TPFILE,'KMAX',CLUOUT,IRESP,NKMAX)
-- 
GitLab