From afa9bc6415d5b5525729e8984029859a302cfb19 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 21 Apr 2017 11:36:35 +0200
Subject: [PATCH] Philippe 21/04/2017: IO: use IO_WRITE_FIELD for
 write_hgrid(n) Warning: not tested (especially on ZOOM_PGD which is not
 supported anymore)

---
 src/LIB/SURCOUCHE/src/mode_field.f90 |  2 +-
 src/MNH/prep_ideal_case.f90          | 41 +++++++++++----
 src/MNH/write_hgrid.f90              | 76 +++++++++-------------------
 src/MNH/write_hgridn.f90             | 75 +++++++++------------------
 src/MNH/zoom_pgd.f90                 | 65 ++++++++++++++----------
 5 files changed, 116 insertions(+), 143 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 40fad9cf9..72df09876 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -340,7 +340,7 @@ TFIELDLIST(IDX)%NDIMS      = 0
 IDX = IDX+1
 !
 !
-IF (.NOT.LCARTESIAN) THEN
+IF (.NOT.LCARTESIAN .OR. TRIM(CPROGRAM) == 'IDEAL') THEN
 !
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'RPK'
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 95498935a..509bbcd2b 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -575,6 +575,7 @@ REAL              :: ZZS_MAX, ZZS_MAX_ll
 INTEGER           :: IJPHEXT
 !
 TYPE(TFILEDATA),TARGET :: TZFILE
+TYPE(TFILEDATA)        :: TZINIFILEPGD
 !
 !
 !*       0.2  Namelist declarations
@@ -1836,17 +1837,37 @@ IF (CSURF =='EXTE') THEN
     !* writing of physiographic fields in the file
     CSTORAGE_TYPE='PG'
     COUTFMFILE = CINIFILEPGD
-    CALL FMOPEN_ll(CINIFILEPGD,'WRITE',CLUOUT,NNPRAR,NTYPE,NVERB,NNINAR,NRESP)  
-    CALL FMWRIT(CINIFILEPGD,'PROGRAM     ',CLUOUT,'--',CPROGRAM,0,1,' ',NRESP)
-    CALL FMWRIT(CINIFILEPGD,'SURF        ',CLUOUT,'--','EXTE',0,1,' ',NRESP)
-    CALL FMWRIT(CINIFILEPGD,'L1D         ',CLUOUT,'--',L1D,0,1,' ',NRESP)
-    CALL FMWRIT(CINIFILEPGD,'L2D         ',CLUOUT,'--',L2D,0,1,' ',NRESP)
-    CALL FMWRIT(CINIFILEPGD,'PACK        ',CLUOUT,'--',LPACK,0,1,' ',NRESP)
-    CALL WRITE_HGRID(1,CINIFILEPGD,' ')
+    !
+    TZINIFILEPGD%CNAME      = CINIFILEPGD
+    TZINIFILEPGD%CTYPE      = 'PREPIDEALCASE'
+    IF (LCDF4) THEN
+      IF (.NOT.LLFIOUT) THEN
+        TZINIFILEPGD%CFORMAT='NETCDF4'
+      ELSE
+        TZINIFILEPGD%CFORMAT='LFICDF4'
+        TZINIFILEPGD%NLFINPRAR= NNPRAR
+      END IF
+    ELSE IF (LLFIOUT) THEN
+      TZINIFILEPGD%CFORMAT='LFI'
+      TZINIFILEPGD%NLFINPRAR= NNPRAR
+    ELSE
+      CALL PRINT_MSG(NVERB_FATAL,'IO','PREP_IDEAL_CASE','unknown backup/output fileformat')
+    ENDIF
+    TZINIFILEPGD%CMODE      = 'WRITE'
+    TZINIFILEPGD%NLFITYPE   = NTYPE
+    TZINIFILEPGD%NLFIVERB   = NVERB
+    !
+    CALL IO_FILE_OPEN_ll(TZINIFILEPGD,CLUOUT,NRESP)
+    !
+    CALL IO_WRITE_HEADER(TZINIFILEPGD,CLUOUT)
+    CALL IO_WRITE_FIELD(TZINIFILEPGD,'SURF',CLUOUT,IRESP,'EXTE')
+    CALL IO_WRITE_FIELD(TZINIFILEPGD,'L1D', CLUOUT,IRESP,L1D)
+    CALL IO_WRITE_FIELD(TZINIFILEPGD,'L2D', CLUOUT,IRESP,L2D)
+    CALL IO_WRITE_FIELD(TZINIFILEPGD,'PACK',CLUOUT,IRESP,LPACK)
+    CALL WRITE_HGRID(1,TZINIFILEPGD)
     CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
-  CSTORAGE_TYPE='TT'
+    CSTORAGE_TYPE='TT'
   ENDIF
-  
   !
   !
   !* rereading of physiographic fields and definition of prognostic fields
@@ -1866,7 +1887,7 @@ END IF
 !             ---------------
 !
 IF (CSURF =='EXTE' .AND. (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM)) THEN
-  CALL FMCLOS_ll(CINIFILEPGD,'KEEP',CLUOUT,NRESP)
+  CALL IO_FILE_CLOSE_ll(TZINIFILEPGD,CLUOUT,NRESP)
 ENDIF
 CALL IO_FILE_CLOSE_ll(TZFILE,CLUOUT,NRESP)
 IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN
diff --git a/src/MNH/write_hgrid.f90 b/src/MNH/write_hgrid.f90
index 075f923e9..314215609 100644
--- a/src/MNH/write_hgrid.f90
+++ b/src/MNH/write_hgrid.f90
@@ -12,19 +12,20 @@
       MODULE MODI_WRITE_HGRID
 !     #######################
 INTERFACE
-      SUBROUTINE WRITE_HGRID(KMI,HOUTFILE,HDADFILE)
+      SUBROUTINE WRITE_HGRID(KMI,TPFILE)
 !
-INTEGER,           INTENT(IN) :: KMI      ! model index
-CHARACTER (LEN=*), INTENT(IN) :: HOUTFILE ! name of the file n
-CHARACTER (LEN=*), INTENT(IN) :: HDADFILE ! name of the father of file n
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+INTEGER,         INTENT(IN)  :: KMI       ! model index
+TYPE(TFILEDATA), INTENT(IN)  :: TPFILE    ! File to write
 !
 END SUBROUTINE WRITE_HGRID
 END INTERFACE
 END MODULE MODI_WRITE_HGRID
 !
-!     #############################################
-      SUBROUTINE WRITE_HGRID(KMI,HOUTFILE,HDADFILE)
-!     #############################################
+!     ##################################
+      SUBROUTINE WRITE_HGRID(KMI,TPFILE)
+!     ##################################
 !
 !!****  *WRITE_HGRID* - to write grid information in FM file of model KMI
 !!
@@ -62,6 +63,7 @@ USE MODD_LUNIT
 USE MODD_CONF
 USE MODD_CONF_n
 USE MODD_GRID
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_PGDGRID
 USE MODD_PGDDIM
 USE MODD_PARAMETERS
@@ -75,9 +77,8 @@ IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
 !
-INTEGER,           INTENT(IN) :: KMI      ! model index
-CHARACTER (LEN=*), INTENT(IN) :: HOUTFILE ! name of the file n
-CHARACTER (LEN=*), INTENT(IN) :: HDADFILE ! name of the father of file n
+INTEGER,         INTENT(IN)  :: KMI       ! model index
+TYPE(TFILEDATA), INTENT(IN)  :: TPFILE    ! File to write
 !
 !
 !*       0.2   declarations of local variables
@@ -100,7 +101,7 @@ IF (KMI<0 .OR. KMI>JPMODELMAX) THEN
   STOP
 ENDIF
 IF (KMI/=0) THEN
-  CALL WRITE_HGRID_n(HOUTFILE,HDADFILE)
+  CALL WRITE_HGRID_n(TPFILE)
   RETURN
 END IF
 !
@@ -109,49 +110,20 @@ END IF
 !*       2.     WRITING FROM MODD_PGD...
 !	        ----------------------
 !
-YCOMMENT=' '
-!-------------------------------------------------------------------------------
-!
-CALL FMWRIT(HOUTFILE,'MASDEV',CLUOUT0,'--',NMASDEV,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-CALL FMWRIT(HOUTFILE,'BUGFIX',CLUOUT0,'--',NBUGFIX,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-CALL FMWRIT(HOUTFILE,'BIBUSER',CLUOUT0,'--',CBIBUSER,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-CALL FMWRIT(HOUTFILE,'MY_NAME',CLUOUT0,'--',HOUTFILE,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-CALL FMWRIT(HOUTFILE,'DAD_NAME',CLUOUT0,'--',HDADFILE,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!-------------------------------------------------------------------------------
-!
-CALL FMWRIT(HOUTFILE,'STORAGE_TYPE',CLUOUT0,'--',CSTORAGE_TYPE,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-!-------------------------------------------------------------------------------
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LAT0',CLUOUT0,'--',XLAT0,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LON0',CLUOUT0,'--',XLON0,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT=' '
-CALL FMWRIT(HOUTFILE,'RPK' ,CLUOUT0,'--',XRPK ,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'BETA',CLUOUT0,'--',XBETA,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LATOR',CLUOUT0,'--',XPGDLATOR,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LONOR',CLUOUT0,'--',XPGDLONOR,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT=' '
-CALL FMWRIT(HOUTFILE,'IMAX' ,CLUOUT0,'--',NPGDIMAX,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT=' '
-CALL FMWRIT(HOUTFILE,'JMAX' ,CLUOUT0,'--',NPGDJMAX,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-YCOMMENT='METERS'
-CALL FMWRIT(HOUTFILE,'XHAT',CLUOUT0,'XX',XPGDXHAT,2,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='METERS'
-CALL FMWRIT(HOUTFILE,'YHAT',CLUOUT0,'YY',XPGDYHAT,3,LEN(YCOMMENT),YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'LAT0',  CLUOUT0,IRESP,XLAT0)
+CALL IO_WRITE_FIELD(TPFILE,'LON0',  CLUOUT0,IRESP,XLON0)
+CALL IO_WRITE_FIELD(TPFILE,'RPK',   CLUOUT0,IRESP,XRPK)
+CALL IO_WRITE_FIELD(TPFILE,'BETA',  CLUOUT0,IRESP,XBETA)
+CALL IO_WRITE_FIELD(TPFILE,'LATORI',CLUOUT0,IRESP,XPGDLATOR)
+CALL IO_WRITE_FIELD(TPFILE,'LONORI',CLUOUT0,IRESP,XPGDLONOR)
+CALL IO_WRITE_FIELD(TPFILE,'IMAX',  CLUOUT0,IRESP,NPGDIMAX)
+CALL IO_WRITE_FIELD(TPFILE,'JMAX',  CLUOUT0,IRESP,NPGDJMAX)
+CALL IO_WRITE_FIELD(TPFILE,'XHAT',  CLUOUT0,IRESP,XPGDXHAT)
+CALL IO_WRITE_FIELD(TPFILE,'YHAT',  CLUOUT0,IRESP,XPGDYHAT)
 !
 IF (CSTORAGE_TYPE=='TT') THEN
-  YCOMMENT=' '
-  CALL FMWRIT(HOUTFILE,'THINSHELL',CLUOUT0,'--',LTHINSHELL,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-  YCOMMENT=' '
-  CALL FMWRIT(HOUTFILE,'CARTESIAN',CLUOUT0,'--',LCARTESIAN,0,LEN(YCOMMENT),YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'THINSHELL',CLUOUT0,IRESP,LTHINSHELL)
+  CALL IO_WRITE_FIELD(TPFILE,'CARTESIAN',CLUOUT0,IRESP,LCARTESIAN)
 END IF
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/write_hgridn.f90 b/src/MNH/write_hgridn.f90
index 125308409..96c29456c 100644
--- a/src/MNH/write_hgridn.f90
+++ b/src/MNH/write_hgridn.f90
@@ -12,19 +12,20 @@
       MODULE MODI_WRITE_HGRIDn
 !     ########################
 INTERFACE
-      SUBROUTINE WRITE_HGRID_n(HOUTFILE,HDADFILE)
+      SUBROUTINE WRITE_HGRID_n(TPFILE)
 !
-CHARACTER (LEN=*), INTENT(IN) :: HOUTFILE ! name of the file n
-CHARACTER (LEN=*), INTENT(IN) :: HDADFILE ! name of the father of file n
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA), INTENT(IN)  :: TPFILE    ! File to write
 !
 END SUBROUTINE WRITE_HGRID_n
 !
 END INTERFACE
 END MODULE MODI_WRITE_HGRIDn
 !
-!     ###########################################
-      SUBROUTINE WRITE_HGRID_n(HOUTFILE,HDADFILE)
-!     ###########################################
+!     ################################
+      SUBROUTINE WRITE_HGRID_n(TPFILE)
+!     ################################
 !
 !!****  *WRITE_HGRID_n* - to write grid information in FM file of model _n
 !!
@@ -75,13 +76,14 @@ END MODULE MODI_WRITE_HGRIDn
 !
 !*       0.    DECLARATIONS
 !
-USE MODD_PARAMETERS
 USE MODD_CONF
 USE MODD_CONF_n
+USE MODD_DIM_n
 USE MODD_GRID
 USE MODD_GRID_n
-USE MODD_DIM_n
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_LUNIT_n
+USE MODD_PARAMETERS
 !
 USE MODE_FM
 USE MODE_FMWRIT
@@ -90,62 +92,31 @@ IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
 !
-CHARACTER (LEN=*), INTENT(IN) :: HOUTFILE ! name of the file n
-CHARACTER (LEN=*), INTENT(IN) :: HDADFILE ! name of the father of file n
+TYPE(TFILEDATA), INTENT(IN)  :: TPFILE    ! File to write
 !
 !
 !*       0.2   declarations of local variables
 !
 INTEGER               :: ILUOUT
 INTEGER               :: IRESP
-CHARACTER (LEN=100)   :: YCOMMENT   
 !-------------------------------------------------------------------------------
 !
 CALL FMLOOK_ll(CLUOUT,CLUOUT,ILUOUT,IRESP)
 !
-YCOMMENT=' '
-!
-!-------------------------------------------------------------------------------
-CALL FMWRIT(HOUTFILE,'MASDEV',CLUOUT,'--',NMASDEV,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-CALL FMWRIT(HOUTFILE,'BUGFIX',CLUOUT,'--',NBUGFIX,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-CALL FMWRIT(HOUTFILE,'BIBUSER',CLUOUT,'--',CBIBUSER,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-CALL FMWRIT(HOUTFILE,'MY_NAME',CLUOUT,'--',HOUTFILE,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-CALL FMWRIT(HOUTFILE,'DAD_NAME',CLUOUT,'--',HDADFILE,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!-------------------------------------------------------------------------------
-!
-CALL FMWRIT(HOUTFILE,'STORAGE_TYPE',CLUOUT,'--',CSTORAGE_TYPE,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-!-------------------------------------------------------------------------------
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LAT0',CLUOUT,'--',XLAT0,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LON0',CLUOUT,'--',XLON0,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT=' '
-CALL FMWRIT(HOUTFILE,'RPK' ,CLUOUT,'--',XRPK ,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'BETA',CLUOUT,'--',XBETA,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LATORI',CLUOUT,'--',XLATORI,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='DEGREES'
-CALL FMWRIT(HOUTFILE,'LONORI',CLUOUT,'--',XLONORI,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT=' '
-CALL FMWRIT(HOUTFILE,'IMAX' ,CLUOUT,'--',NIMAX ,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT=' '
-CALL FMWRIT(HOUTFILE,'JMAX' ,CLUOUT,'--',NJMAX ,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-!
-YCOMMENT='METERS'
-CALL FMWRIT(HOUTFILE,'XHAT',CLUOUT,'XX',XXHAT,2,LEN(YCOMMENT),YCOMMENT,IRESP)
-YCOMMENT='METERS'
-CALL FMWRIT(HOUTFILE,'YHAT',CLUOUT,'YY',XYHAT,3,LEN(YCOMMENT),YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'LAT0',  CLUOUT,IRESP,XLAT0)
+CALL IO_WRITE_FIELD(TPFILE,'LON0',  CLUOUT,IRESP,XLON0)
+CALL IO_WRITE_FIELD(TPFILE,'RPK',   CLUOUT,IRESP,XRPK)
+CALL IO_WRITE_FIELD(TPFILE,'BETA',  CLUOUT,IRESP,XBETA)
+CALL IO_WRITE_FIELD(TPFILE,'LATORI',CLUOUT,IRESP,XLATORI)
+CALL IO_WRITE_FIELD(TPFILE,'LONORI',CLUOUT,IRESP,XLONORI)
+CALL IO_WRITE_FIELD(TPFILE,'IMAX',  CLUOUT,IRESP,NIMAX)
+CALL IO_WRITE_FIELD(TPFILE,'JMAX',  CLUOUT,IRESP,NJMAX)
+CALL IO_WRITE_FIELD(TPFILE,'XHAT',  CLUOUT,IRESP,XXHAT)
+CALL IO_WRITE_FIELD(TPFILE,'YHAT',  CLUOUT,IRESP,XYHAT)
 !
 IF (CSTORAGE_TYPE=='TT') THEN
-  YCOMMENT=' '
-  CALL FMWRIT(HOUTFILE,'THINSHELL',CLUOUT,'--',LTHINSHELL,0,LEN(YCOMMENT),YCOMMENT,IRESP)
-  YCOMMENT=' '
-  CALL FMWRIT(HOUTFILE,'CARTESIAN',CLUOUT,'--',LCARTESIAN,0,LEN(YCOMMENT),YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'THINSHELL',CLUOUT,IRESP,LTHINSHELL)
+  CALL IO_WRITE_FIELD(TPFILE,'CARTESIAN',CLUOUT,IRESP,LCARTESIAN)
 END IF
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90
index 6b55a0a58..c53d85fec 100644
--- a/src/MNH/zoom_pgd.f90
+++ b/src/MNH/zoom_pgd.f90
@@ -52,6 +52,7 @@
 !
 USE MODD_CONF,   ONLY : CPROGRAM, NMASDEV, NBUGFIX, CBIBUSER, &
                         L1D, L2D, LPACK
+USE MODD_IO_ll,  ONLY: TFILEDATA
 USE MODD_LUNIT,  ONLY : CLUOUT0, COUTFMFILE, CPGDFILE
 USE MODD_PARAMETERS, ONLY : XUNDEF, NUNDEF, JPVEXT, JPHEXT, JPMODELMAX
 USE MODD_PARAM_n,     ONLY : CSURF
@@ -64,6 +65,7 @@ USE MODE_FMWRIT
 USE MODE_FMREAD
 USE MODE_IO_ll
 USE MODE_ll
+USE MODE_MSG
 USE MODE_MODELN_HANDLER
 !
 USE MODI_READ_HGRID
@@ -106,6 +108,7 @@ LOGICAL :: GFOUND
 INTEGER            :: IXOR_DAD,IYOR_DAD  ! compared to Dad file, if any
 INTEGER            :: IXOR,IYOR          ! given or computed
 INTEGER            :: IDXRATIO,IDYRATIO
+TYPE(TFILEDATA)    :: TZZOOMFILE
 !
 REAL,  DIMENSION(:,:), ALLOCATABLE :: ZZS1,ZZSMT1,ZZS2,ZZSMT2
 !
@@ -198,8 +201,28 @@ IF ( (LEN_TRIM(YZOOMFILE) == 0) .OR. (ADJUSTL(YZOOMFILE) == ADJUSTL(CPGDFILE)) )
   YZOOMFILE=ADJUSTL(ADJUSTR(CPGDFILE)//'.z'//ADJUSTL(YZOOMNBR))
 END IF
 !
-CALL FMOPEN_ll(YZOOMFILE,'WRITE',CLUOUT0,1,1,5,ININAR,IRESP)
-CALL WRITE_HGRID(1,YZOOMFILE,YDAD_NAME)
+TZZOOMFILE%CNAME      = YZOOMFILE
+TZZOOMFILE%CTYPE      = 'ZOOMPGD'
+IF (LCDF4) THEN
+  IF (.NOT.LLFIOUT) THEN
+    TZZOOMFILE%CFORMAT='NETCDF4'
+  ELSE
+    TZZOOMFILE%CFORMAT='LFICDF4'
+    TZZOOMFILE%NLFINPRAR= 1
+  END IF
+ELSE IF (LLFIOUT) THEN
+  TZZOOMFILE%CFORMAT='LFI'
+  TZZOOMFILE%NLFINPRAR= 1
+ELSE
+  CALL PRINT_MSG(NVERB_FATAL,'IO','ZOOM_PGD','unknown backup/output fileformat')
+ENDIF
+TZZOOMFILE%CMODE      = 'WRITE'
+TZZOOMFILE%NLFITYPE   = 1
+TZZOOMFILE%NLFIVERB   = 5
+!PW: TODO: points to dad file (if existing) ! TZZOOMFILE%TDADFILE =>
+!
+CALL IO_FILE_OPEN_ll(TZZOOMFILE,CLUOUT0,IRESP)
+CALL WRITE_HGRID(1,TZZOOMFILE)
 !
 !*    2.5     Preparation of surface physiographic fields
 !             -------------------------------------------
@@ -225,40 +248,26 @@ IF (CSURF=='EXTE') THEN
 ELSE
   ALLOCATE(ZZS2(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
   ZZS2(:,:)=ZZS1(IXOR:IXOR+NIMAX+2*JPHEXT-1,IYOR:IYOR+NJMAX+2*JPHEXT-1)
-  YRECFM='ZS'
-  YCOMMENT='X_Y_orography (METERS)'
-  IGRID=4
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YZOOMFILE,YRECFM,CLUOUT0,'XY',ZZS2,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TZZOOMFILE,'ZS',CLUOUT0,IRESP,ZZS2)
 END IF
 !
 ALLOCATE(ZZSMT2(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
 ZZSMT2(:,:)=ZZSMT1(IXOR:IXOR+NIMAX+2*JPHEXT-1,IYOR:IYOR+NJMAX+2*JPHEXT-1)
-YRECFM='ZSMT'
-YCOMMENT='X_Y_smooth orography (METERS)'
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YZOOMFILE,YRECFM,CLUOUT0,'XY',ZZSMT2,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'ZSMT',CLUOUT0,IRESP,ZZSMT2)
 !
 !*    2.7     Write configuration variables in the output file
 !             ------------------------------------------------
 !
-CALL FMWRIT(YZOOMFILE,'MASDEV      ',CLUOUT0,'--',NMASDEV,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'BUGFIX      ',CLUOUT0,'--',NBUGFIX,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'BIBUSER     ',CLUOUT0,'--',CBIBUSER,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'PROGRAM     ',CLUOUT0,'--',CPROGRAM,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'STORAGE_TYPE',CLUOUT0,'--',CSTORAGE_TYPE,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'MY_NAME     ',CLUOUT0,'--',YZOOMFILE,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'DAD_NAME    ',CLUOUT0,'--',YDAD_NAME,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'DXRATIO     ',CLUOUT0,'--',IDXRATIO,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'DYRATIO     ',CLUOUT0,'--',IDYRATIO,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'XOR         ',CLUOUT0,'--',IXOR_DAD,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'YOR         ',CLUOUT0,'--',IYOR_DAD,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'L1D         ',CLUOUT0,'--',L1D,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'L2D         ',CLUOUT0,'--',L2D,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'PACK        ',CLUOUT0,'--',LPACK,0,1,' ',IRESP)
-CALL FMWRIT(YZOOMFILE,'SURF        ',CLUOUT0,'--',CSURF,0,1,' ',IRESP)
-CALL FMCLOS_ll(YZOOMFILE,'KEEP',CLUOUT0,IRESP)
+CALL IO_WRITE_HEADER(TZZOOMFILE,CLUOUT0)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'DXRATIO',CLUOUT0,IRESP,IDXRATIO)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'DYRATIO',CLUOUT0,IRESP,IDYRATIO)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'XOR',    CLUOUT0,IRESP,IXOR_DAD)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'YOR',    CLUOUT0,IRESP,IYOR_DAD)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'L1D',    CLUOUT0,IRESP,L1D)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'L2D',    CLUOUT0,IRESP,L2D)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'PACK',   CLUOUT0,IRESP,LPACK)
+CALL IO_WRITE_FIELD(TZZOOMFILE,'SURF',   CLUOUT0,IRESP,CSURF)
+CALL IO_FILE_CLOSE_ll(TZZOOMFILE,CLUOUT0,IRESP)
 !
 !*    2.8     Shift to new PGD file
 !             ---------------------
-- 
GitLab