From 93c63503c5d75c53b20cfbaccb6c5229397f7aa4 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 21 Jan 2019 11:03:04 +0100
Subject: [PATCH] Philippe 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE
 to modd_io_ll to allow to disable writes (for bench purposes)

---
 src/LIB/SURCOUCHE/src/modd_io.f90             |  4 ++
 src/LIB/SURCOUCHE/src/mode_fm.f90             |  8 +++-
 src/LIB/SURCOUCHE/src/mode_io.f90             | 14 +++++--
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 25 +++++++++--
 src/LIB/SURCOUCHE/src/modn_confio.f90         | 12 +++---
 src/MNH/modeln.f90                            | 42 +++++++++++--------
 6 files changed, 76 insertions(+), 29 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 21e82e1da..62a02bf94 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -6,6 +6,7 @@
 ! Modifications:
 !  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN (removed ISTDOUT, ISTDERR, added NNULLUNIT, CNULLFILE)
+!  Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll to allow to disable writes (for bench purposes)
 !-----------------------------------------------------------------
 
 MODULE MODD_IO_ll
@@ -45,6 +46,9 @@ INTEGER, SAVE :: NGEN_ABORT_LEVEL = NVERB_ERROR   ! Level of 'GEN' error necessa
 
 CHARACTER(LEN=NDIRNAMELGTMAX) :: CIO_DIR = '' ! Directory for IO
 
+logical, save :: LIO_ALLOW_NO_BACKUP = .false. ! Allow to have no valid backup time (useful for some tests)
+logical, save :: LIO_NO_WRITE        = .false. ! Disable file writes (useful for benchs)
+
 !Structure containing one pointer to a file
 !Useful to create arrays of pointers to files
 TYPE TFILE_ELT
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index eea6d328d..02265538c 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -11,6 +11,8 @@
 !  Philippe Wautelet: 13/12/2018: moved some operations to new mode_io_*_nc4 modules
 !  Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN + move management
 !                                 of NNCID and NLFIFLU to the nc4 and lfi subroutines
+!  Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll
+!                                 to allow to disable writes (for bench purposes)
 !-----------------------------------------------------------------
 
 MODULE MODE_FM
@@ -48,7 +50,7 @@ END SUBROUTINE SET_FMPACK_ll
 SUBROUTINE IO_FILE_OPEN_ll(TPFILE,KRESP,OPARALLELIO,HPOSITION,HSTATUS,HPROGRAM_ORIG)
 !
 USE MODD_CONF,  ONLY: CPROGRAM
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_IO_ll, ONLY: LIO_NO_WRITE, TFILEDATA
 USE MODE_FMREAD
 USE MODE_IO_ll, ONLY : OPEN_ll
 USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST,IO_FILE_FIND_BYNAME
@@ -69,6 +71,10 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_OPEN_ll','opening '//TRIM(TPFILE%CNAME)
 !
 IF (.NOT.ASSOCIATED(TPFILE)) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','TPFILE is not associated')
 !
+IF ( LIO_NO_WRITE .AND. TPFILE%CMODE == 'WRITE' .AND. TPFILE%CTYPE/='OUTPUTLISTING') THEN
+  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_OPEN_ll','opening file '//TRIM(TPFILE%CNAME)//' in write mode but LIO_NO_WRITE is set')
+END IF
+!
 TZFILE_DES   => NULL()
 TZFILE_DUMMY => NULL()
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index 930794b33..0077216d4 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -23,6 +23,8 @@
 !                                    + move IOFREEFLU and IONEWFLU to mode_io_file_lfi.f90
 !                                    + move management of NNCID and NLFIFLU to the nc4 and lfi subroutines
 !     Philippe Wautelet: 10/01/2019: bug: modify some metadata before open calls
+!     Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll to allow
+!                                    to disable writes (for bench purposes)
 !
 MODULE MODE_IO_ll
 
@@ -68,7 +70,7 @@ CONTAINS
   END SUBROUTINE SET_CONFIO_ll
 
   SUBROUTINE SET_CONFIO_INTERN_ll(OIOCDF4, OLFIOUT, OLFIREAD)
-    USE MODD_IO_ll, ONLY : LIOCDF4, LLFIOUT, LLFIREAD
+    USE MODD_IO_ll, ONLY : LIOCDF4, LLFIOUT, LLFIREAD, LIO_ALLOW_NO_BACKUP, LIO_NO_WRITE
     LOGICAL, INTENT(IN) :: OIOCDF4, OLFIOUT, OLFIREAD
 
     CALL PRINT_MSG(NVERB_DEBUG,'IO','SET_CONFIO_ll','called')
@@ -89,10 +91,16 @@ CONTAINS
       LIOCDF4  = .FALSE.
       LLFIOUT  = .TRUE.
       LLFIREAD = .TRUE.
-#endif       
+#endif
       GCONFIO = .TRUE.
+
+      ! Set LIO_ALLOW_NO_BACKUP=.true. if writes are disabled (to be coherent)
+      IF (LIO_NO_WRITE) THEN
+        CALL PRINT_MSG(NVERB_WARNING,'IO','SET_CONFIO_ll','file writes are disabled')
+        LIO_ALLOW_NO_BACKUP = .true.
+      END IF
     END IF
-    
+
   END SUBROUTINE SET_CONFIO_INTERN_ll
 
   SUBROUTINE INITIO_ll()
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 94485e3f1..8745773f0 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2016-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !!    Authors
@@ -9,6 +9,8 @@
 !     P. Wautelet : 2016: original version
 ! Modifications:
 !  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll
+!                                 to allow to disable writes (for bench purposes)
 !-----------------------------------------------------------------
 MODULE MODE_IO_MANAGE_STRUCT
 !
@@ -43,6 +45,7 @@ REAL,    INTENT(IN) :: PSEGLEN ! segment duration (in seconds)
 !
 INTEGER           :: IMI              ! Model number for loop
 INTEGER           :: IBAK_NUMB, IOUT_NUMB ! Number of backups/outputs
+INTEGER           :: IERR_LVL         ! Level of error message
 INTEGER           :: IVAR             ! Number of variables
 INTEGER           :: ISTEP_MAX        ! Number of timesteps
 INTEGER           :: IPOS,IFIELD      ! Indices
@@ -55,6 +58,15 @@ CHARACTER (LEN=4) :: YDADNUMBER       ! Character string for the DAD model file
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_PREPARE_BAKOUT_STRUCT','called')
 !
+! Special case if writes are forced to NO
+IF (LIO_NO_WRITE) THEN
+  DO IMI = 1, NMODEL
+    OUT_MODEL(IMI)%NBAK_NUMB = 0
+    OUT_MODEL(IMI)%NOUT_NUMB = 0
+  END DO
+  RETURN
+END IF
+!
 DO IMI = 1, NMODEL
   IBAK_NUMB = 0
   IOUT_NUMB = 0
@@ -159,7 +171,14 @@ DO IMI = 1, NMODEL
       IBAK_NUMB = IBAK_NUMB + 1
     END IF
   END DO
-  IF (IBAK_NUMB==0) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_PREPARE_BAKOUT_STRUCT','no (valid) backup time')
+  IF (IBAK_NUMB==0) THEN
+    IF(LIO_ALLOW_NO_BACKUP) THEN
+      IERR_LVL = NVERB_WARNING
+    ELSE
+      IERR_LVL = NVERB_ERROR
+    END IF
+    CALL PRINT_MSG(IERR_LVL,'IO','IO_PREPARE_BAKOUT_STRUCT','no (valid) backup time')
+  END IF
   !
   IOUT_NUMB = 0
   DO JOUT = 1,SIZE(IOUT_STEP)
diff --git a/src/LIB/SURCOUCHE/src/modn_confio.f90 b/src/LIB/SURCOUCHE/src/modn_confio.f90
index a9c647314..b4a4ea3be 100644
--- a/src/LIB/SURCOUCHE/src/modn_confio.f90
+++ b/src/LIB/SURCOUCHE/src/modn_confio.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2014-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ##################
@@ -28,8 +28,9 @@
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!      Original    31/03/2014    
+!!      Original    31/03/2014
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!  Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll to allow to disable writes (for bench purposes)
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -37,7 +38,7 @@
 !
 USE MODD_IO_ll, ONLY : LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC, &
                        NIO_VERB, NIO_ABORT_LEVEL, NGEN_VERB, NGEN_ABORT_LEVEL, &
-                       CIO_DIR
+                       CIO_DIR, LIO_ALLOW_NO_BACKUP, LIO_NO_WRITE
 !
 IMPLICIT NONE
 !
@@ -49,7 +50,8 @@ LOGICAL,SAVE :: LLFIREAD = .FALSE. ! TRUE : enable LFI reading (disable NetCDF4
 NAMELIST/NAM_CONFIO/LCDF4, LLFIOUT, LLFIREAD,                 &
                     LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC, &
                     NIO_VERB,  NIO_ABORT_LEVEL,               &
-                    NGEN_VERB, NGEN_ABORT_LEVEL, CIO_DIR
+                    NGEN_VERB, NGEN_ABORT_LEVEL, CIO_DIR,     &
+                    LIO_ALLOW_NO_BACKUP, LIO_NO_WRITE
 !
 END MODULE MODN_CONFIO
 
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index f2c335258..84354e1f3 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -251,6 +251,8 @@ END MODULE MODI_MODEL_n
 !!                  07/2017  (V. Vionnet) : Add blowing snow scheme 
 !!      S. Riette : 11/2016 Add ZPABST to keep pressure constant during timestep
 !!                   01/2018 (C.Lac) Add VISCOSITY
+!!  Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll
+!                                  to allow to disable writes (for bench purposes)
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -289,7 +291,7 @@ USE MODD_GET_n
 USE MODD_GRID,           ONLY: XLONORI,XLATORI
 USE MODD_GRID_n
 USE MODD_ICE_C1R3_DESCR, ONLY: XRTMIN_C1R3=>XRTMIN
-USE MODD_IO_ll,          ONLY: TFILEDATA,TFILE_SURFEX,TFILE_DUMMY
+USE MODD_IO_ll,          ONLY: LIO_NO_WRITE, TFILEDATA,TFILE_SURFEX,TFILE_DUMMY
 USE MODD_LBC_n
 USE MODD_LES
 USE MODD_LES_BUDGET
@@ -630,11 +632,13 @@ IF (KTCOUNT == 1) THEN
   IBAK=0
   IOUT=0
 !
-  CALL IO_FILE_OPEN_ll(TDIAFILE)
+  IF ( .NOT. LIO_NO_WRITE ) THEN
+    CALL IO_FILE_OPEN_ll(TDIAFILE)
 !
-  CALL IO_WRITE_HEADER(TDIAFILE)
-  CALL WRITE_DESFM_n(IMI,TDIAFILE)
-  CALL WRITE_LFIFMN_FORDIACHRO_n(TDIAFILE)
+    CALL IO_WRITE_HEADER(TDIAFILE)
+    CALL WRITE_DESFM_n(IMI,TDIAFILE)
+    CALL WRITE_LFIFMN_FORDIACHRO_n(TDIAFILE)
+  END IF
 !
 !*       1.4   Initialization of the list of fields for the halo updates
 !
@@ -2050,8 +2054,10 @@ CALL END_DIAG_IN_RUN
 !
 ZTIME1 = ZTIME2
 !
-IF (NBUMOD==IMI .AND. CBUTYPE/='NONE') THEN
-  CALL ENDSTEP_BUDGET(TDIAFILE,KTCOUNT,TDTCUR,TDTMOD,XTSTEP,NSV)
+IF ( .NOT. LIO_NO_WRITE ) THEN
+  IF (NBUMOD==IMI .AND. CBUTYPE/='NONE') THEN
+    CALL ENDSTEP_BUDGET(TDIAFILE,KTCOUNT,TDTCUR,TDTMOD,XTSTEP,NSV)
+  END IF
 END IF
 !
 CALL SECOND_MNH2(ZTIME2)
@@ -2091,16 +2097,18 @@ END IF
 !
 IF (OEXIT) THEN
 !
-  IF (LSERIES) CALL WRITE_SERIES_n(TDIAFILE)
-  CALL WRITE_AIRCRAFT_BALLOON(TDIAFILE)
-  CALL WRITE_STATION_n(TDIAFILE)
-  CALL WRITE_PROFILER_n(TDIAFILE)
-  CALL WRITE_LES_n(TDIAFILE,' ')
-  CALL WRITE_LES_n(TDIAFILE,'A')
-  CALL WRITE_LES_n(TDIAFILE,'E')
-  CALL WRITE_LES_n(TDIAFILE,'H')
-  CALL MENU_DIACHRO(TDIAFILE,'END')
-  CALL IO_FILE_CLOSE_ll(TDIAFILE)
+  IF ( .NOT. LIO_NO_WRITE ) THEN
+    IF (LSERIES) CALL WRITE_SERIES_n(TDIAFILE)
+    CALL WRITE_AIRCRAFT_BALLOON(TDIAFILE)
+    CALL WRITE_STATION_n(TDIAFILE)
+    CALL WRITE_PROFILER_n(TDIAFILE)
+    CALL WRITE_LES_n(TDIAFILE,' ')
+    CALL WRITE_LES_n(TDIAFILE,'A')
+    CALL WRITE_LES_n(TDIAFILE,'E')
+    CALL WRITE_LES_n(TDIAFILE,'H')
+    CALL MENU_DIACHRO(TDIAFILE,'END')
+    CALL IO_FILE_CLOSE_ll(TDIAFILE)
+  END IF
   !
   CALL IO_FILE_CLOSE_ll(TINIFILE)
   IF (CSURF=="EXTE") CALL IO_FILE_CLOSE_ll(TINIFILEPGD,OPARALLELIO=.FALSE.)
-- 
GitLab