From c7fe1b944e40872e68edd06fa089dc1476886782 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 20 Apr 2017 16:24:51 +0200
Subject: [PATCH] Philippe 20/04/2017: IO: * use new structures of files and
 fields for PREP_SURFEX * bug correction when writing empty DAD_NAME * adapt
 WRITE_SURFT0_MNH to new structures

---
 src/LIB/SURCOUCHE/src/fmwrit_ll.f90 |  2 +-
 src/MNH/prep_surfex.f90             | 84 ++++++++++++++++++-----------
 src/MNH/write_surf_mnh.f90          | 46 ++++++++--------
 src/MNH/zoom_pgd.f90                |  1 +
 4 files changed, 79 insertions(+), 54 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index 678318990..52a25c561 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -281,7 +281,7 @@ CONTAINS
       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,'')
+      CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',HLUOUT,IRESP,' ')
     ENDIF
     !
   END SUBROUTINE IO_WRITE_HEADER
diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90
index a628994ed..701baacf3 100644
--- a/src/MNH/prep_surfex.f90
+++ b/src/MNH/prep_surfex.f90
@@ -35,29 +35,28 @@
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_FM
-USE MODE_IO_ll
-USE MODE_ll
-USE MODE_FMREAD
-USE MODE_FMWRIT
-!
-USE MODI_OPEN_PRC_FILES
-!
-USE MODD_PARAMETERS, ONLY : JPMODELMAX,JPHEXT,JPVEXT, NUNDEF, XUNDEF
-USE MODD_LUNIT,      ONLY : CLUOUT0, CPGDFILE,COUTFMFILE
-USE MODD_CONF,       ONLY : CPROGRAM,NMASDEV,NBUGFIX,CBIBUSER,&
-                            L1D, L2D, LPACK
+USE MODD_CONF,        ONLY : CPROGRAM,NMASDEV,NBUGFIX,CBIBUSER,&
+                             L1D, L2D, LPACK
+USE MODD_CONF_n,      ONLY : CSTORAGE_TYPE
+USE MODD_IO_ll,       ONLY : TFILEDATA, LIOCDF4, LLFIOUT, TFILE_SURFEX
+USE MODD_LUNIT,       ONLY : CLUOUT0, CPGDFILE,COUTFMFILE
 USE MODD_LUNIT_n,     ONLY : CINIFILE
+USE MODD_MNH_SURFEX_n
+USE MODD_PARAMETERS,  ONLY : JPMODELMAX,JPHEXT,JPVEXT, NUNDEF, XUNDEF
 USE MODD_TIME_n,      ONLY : TDTCUR
-USE MODD_CONF_n,     ONLY : CSTORAGE_TYPE
 !
+USE MODE_FIELD
+USE MODE_FM
+USE MODE_FMREAD
+USE MODE_FMWRIT
+USE MODE_IO_ll
+USE MODE_ll
 USE MODE_MODELN_HANDLER
-!JUANZ
 USE MODE_SPLITTINGZ_ll
-!JUANZ
-USE MODI_VERSION
+!
+USE MODI_OPEN_PRC_FILES
 USE MODI_READ_ALL_NAMELISTS
-USE MODD_MNH_SURFEX_n
+USE MODI_VERSION
 !
 IMPLICIT NONE
 !
@@ -84,10 +83,10 @@ INTEGER               :: ININAR          ! number of articles initially
 !
 INTEGER               :: IINFO_ll        ! return code of // routines
 CHARACTER (LEN=100)   :: HCOMMENT
-CHARACTER(LEN=28)     :: YDAD ='                            '
-! name of dad of input FM file
 INTEGER               :: II, IJ, IGRID, ILENGTH
 !
+TYPE(TFILEDATA),TARGET :: TZFILE
+!
 !-------------------------------------------------------------------------------
 !
 !
@@ -113,7 +112,28 @@ CALL OPEN_PRC_FILES(YPRE_REAL1,YATMFILE, YATMFILETYPE  &
 CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !
 CPGDFILE = YPGDFILE
-CALL FMOPEN_ll(CINIFILE,'WRITE',CLUOUT0,0,1,1,ININAR,IRESP)
+!
+TZFILE%CNAME      = CINIFILE
+TZFILE%CTYPE      = 'PREPSURFEX'
+print *,'PW: LIOCDF4=',LIOCDF4
+IF (LIOCDF4) THEN
+  IF (.NOT.LLFIOUT) THEN
+    TZFILE%CFORMAT='NETCDF4'
+  ELSE
+    TZFILE%CFORMAT='LFICDF4'
+    TZFILE%NLFINPRAR= 0
+  END IF
+ELSE IF (LLFIOUT) THEN
+  TZFILE%CFORMAT='LFI'
+  TZFILE%NLFINPRAR= 0
+ELSE
+  CALL PRINT_MSG(NVERB_FATAL,'IO','PREP_REAL_CASE','unknown backup/output fileformat')
+ENDIF
+TZFILE%CMODE      = 'WRITE'
+TZFILE%NLFITYPE   = 1
+TZFILE%NLFIVERB   = 1
+!
+CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT0,IRESP)
 !
 !-------------------------------------------------------------------------------
 !
@@ -152,6 +172,10 @@ CALL SET_DAD_ll(0, 1)
 !JUANZ CALL INI_PARA_ll(IINFO_ll)
 CALL INI_PARAZ_ll(IINFO_ll)
 !
+CALL INI_FIELD_LIST(1)
+!
+CALL INI_FIELD_SCALARS()
+!
 !-------------------------------------------------------------------------------
 !
 !
@@ -176,21 +200,17 @@ YSURF_CUR => YSURF_LIST(1)
 CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
 CALL GOTO_SURFEX(1)
 !
+TFILE_SURFEX => TZFILE
 CALL PREP_SURF_MNH(YATMFILE,YATMFILETYPE)
+NULLIFY(TFILE_SURFEX)
 !
 !-------------------------------------------------------------------------------
 !
-CALL FMWRIT(COUTFMFILE,'MASDEV      ',CLUOUT0,'--',NMASDEV,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'BUGFIX      ',CLUOUT0,'--',NBUGFIX,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'BIBUSER     ',CLUOUT0,'--',CBIBUSER,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'PROGRAM     ',CLUOUT0,'--',CPROGRAM,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'STORAGE_TYPE',CLUOUT0,'--',CSTORAGE_TYPE,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'MY_NAME     ',CLUOUT0,'--',COUTFMFILE,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'DAD_NAME    ',CLUOUT0,'--',YDAD,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'SURF        ',CLUOUT0,'--','EXTE',0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'L1D         ',CLUOUT0,'--',L1D,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'L2D         ',CLUOUT0,'--',L2D,0,1,' ',IRESP)
-CALL FMWRIT(COUTFMFILE,'PACK        ',CLUOUT0,'--',LPACK,0,1,' ',IRESP)
+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)
 !
 !-------------------------------------------------------------------------------
 WRITE(ILUOUT0,*) ' '
@@ -200,7 +220,7 @@ WRITE(ILUOUT0,*) '|   PREP_SURFEX ends correctly   |'
 WRITE(ILUOUT0,*) '|                                |'
 WRITE(ILUOUT0,*) '----------------------------------'
 CALL CLOSE_ll(CLUOUT0, IOSTAT=IRESP)
-CALL FMCLOS_ll(CINIFILE,'KEEP',CLUOUT0,IRESP)
+CALL IO_FILE_CLOSE_ll(TZFILE,CLUOUT0,IRESP)
 !
 CALL END_PARA_ll(IINFO_ll)
 CALL SURFEX_DEALLO_LIST
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index ec451e3bf..0c632e9c2 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -1362,12 +1362,15 @@ END SUBROUTINE WRITE_SURFL0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD,       ONLY: TFIELDDATA, TYPEDATE
 USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_MSG
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, COUTFILE, NLUOUT
-USE MODD_CONF_n,               ONLY : CSTORAGE_TYPE
+USE MODD_CONF_n,      ONLY : CSTORAGE_TYPE
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH, ONLY : COUT, COUTFILE, NLUOUT
+USE MODD_TYPE_DATE
 !
 !
 IMPLICIT NONE
@@ -1388,6 +1391,8 @@ CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! Comment string
 CHARACTER(LEN=LEN_HREC)      :: YRECFM    ! Name of the article to be written
 INTEGER, DIMENSION(3)  :: ITDATE
 CHARACTER(LEN=5) :: YMSG
+TYPE (DATE_TIME) :: TZDATA
+TYPE(TFIELDDATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH','writing '//TRIM(HREC))
@@ -1396,26 +1401,25 @@ IF( HREC=='DTCUR' .AND. CSTORAGE_TYPE/='SU' ) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH',TRIM(HREC)//' not written in file by externalized surface')
   RETURN
 ELSE
-
-  YRECFM=TRIM(HREC)//'%TDATE'
-!
-  ITDATE(1)=KYEAR
-  ITDATE(2)=KMONTH
-  ITDATE(3)=KDAY
-  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',ITDATE,0,LEN(HCOMMENT),HCOMMENT,KRESP)
-!
-  IF (KRESP /=0) THEN
-    WRITE ( YMSG, '( I5 )' ) KRESP
-    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
-  END IF
-!
-  YRECFM=TRIM(HREC)//'%TIME'
-  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',PTIME,0,LEN(HCOMMENT),HCOMMENT,KRESP)
+  TZDATA%TDATE = DATE(KYEAR,KMONTH,KDAY)
+  TZDATA%TIME  = PTIME
+  !  
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEDATE
+  TZFIELD%NDIMS      = 0
+  !
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,TZDATA)
+END IF
 !
-  IF (KRESP /=0) THEN
-    WRITE ( YMSG, '( I5 )' ) KRESP
-    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
-  END IF
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
 END IF
 !
 END SUBROUTINE WRITE_SURFT0_MNH
diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90
index 82f6325a2..6b55a0a58 100644
--- a/src/MNH/zoom_pgd.f90
+++ b/src/MNH/zoom_pgd.f90
@@ -59,6 +59,7 @@ USE MODD_DIM_n,       ONLY : NIMAX, NJMAX
 USE MODD_CONF_n,   ONLY : CSTORAGE_TYPE
 !
 USE MODE_POS
+USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_FMREAD
 USE MODE_IO_ll
-- 
GitLab