From 485f288206db4b7e1953f43ec9d54ec61da25179 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 7 Feb 2024 14:52:13 +0100
Subject: [PATCH] Philippe 07/02/2024: IO: add LBAK_REDUCE_FLOAT_PRECISION and
 LIO_ALLOW_REDUCED_PRECISION_BACKUP to allow reduced float precision for
 backups (use with caution)

---
 src/LIB/SURCOUCHE/src/modd_io.f90             |  2 ++
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 20 +++++++++++++++++--
 src/LIB/SURCOUCHE/src/modn_confio.f90         |  4 +++-
 src/MNH/modd_bakout.f90                       |  5 +++--
 src/MNH/modn_backup.f90                       |  3 ++-
 5 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 340dccabf..e783ae812 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -65,6 +65,8 @@ CHARACTER(LEN=NDIRNAMELGTMAX) :: CIO_DIR = '' ! Directory for IO
 LOGICAL :: LIO_ALLOW_NO_BACKUP = .FALSE. ! Allow to have no valid backup time (useful for some tests)
 LOGICAL :: LIO_NO_WRITE        = .FALSE. ! Disable file writes (useful for benchs)
 
+LOGICAL :: LIO_ALLOW_REDUCED_PRECISION_BACKUP = .FALSE. ! Allow read/write of backup files with a reduced precision
+
 LOGICAL :: LIO_COMPRESS       = .FALSE. ! Compress (float) arrays (for netCDF)
 INTEGER :: NIO_COMPRESS_LEVEL = 4       ! Compression level (for netCDF)
 
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 7b4bf2295..9045fc2ea 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -913,8 +913,8 @@ SUBROUTINE IO_File_add2list( TPFILE, HNAME, HTYPE, HMODE,
   USE NETCDF, ONLY: NF90_QUANTIZE_BITGROOM, NF90_QUANTIZE_BITROUND, NF90_QUANTIZE_GRANULARBR
 !
 #endif
-USE MODD_BAKOUT,         ONLY: LBAK_COMPRESS, LOUT_COMPRESS, LOUT_REDUCE_FLOAT_PRECISION, &
-                               NBAK_COMPRESS_LEVEL, NOUT_COMPRESS_LEVEL,                  &
+USE MODD_BAKOUT,         ONLY: LBAK_COMPRESS, NBAK_COMPRESS_LEVEL, LBAK_REDUCE_FLOAT_PRECISION, &
+                               LOUT_COMPRESS, NOUT_COMPRESS_LEVEL, LOUT_REDUCE_FLOAT_PRECISION, &
                                COUT_COMPRESS_LOSSY_ALGO, LOUT_COMPRESS_LOSSY, NOUT_COMPRESS_LOSSY_NSD
 USE MODD_CONF,           ONLY: CPROGRAM
 USE MODD_CONFZ,          ONLY: NB_PROCIO_R, NB_PROCIO_W
@@ -1354,6 +1354,22 @@ SELECT CASE(TPFILE%CTYPE)
       END IF
 #endif
     ELSE IF (TRIM(HTYPE)=='MNHBACKUP' .OR. TRIM(HTYPE)=='MNHDIACHRONIC') THEN
+      TPFILE%LNCREDUCE_FLOAT_PRECISION = LBAK_REDUCE_FLOAT_PRECISION(IMI)
+      IF ( LBAK_REDUCE_FLOAT_PRECISION(IMI) ) THEN
+        IF ( .NOT. LIO_ALLOW_REDUCED_PRECISION_BACKUP ) THEN
+          cmnhmsg(1) = 'LBAK_REDUCE_FLOAT_PRECISION=T is dangerous'
+          cmnhmsg(2) = 'if needed, it must be forced with LIO_ALLOW_REDUCED_PRECISION_BACKUP=T in NAM_CONFIO'
+          CALL PRINT_MSG( NVERB_ERROR, 'IO', 'IO_File_add2list' )
+          TPFILE%LNCREDUCE_FLOAT_PRECISION = .FALSE.
+        ELSE
+          IF ( .NOT. ASSOCIATED( TPFILE%TMAINFILE ) ) THEN
+            ! Do not print warning for subfiles
+            CALL PRINT_MSG( NVERB_WARNING, 'IO', 'IO_File_add2list', trim(tpfile%cname) // &
+                            ' LBAK_REDUCE_FLOAT_PRECISION=T dangerous (forced by LIO_ALLOW_REDUCED_PRECISION_BACKUP=T)' )
+          END IF
+        END IF
+      END IF
+
       ! Apply compression to backup files if not already forced for all
       IF ( .NOT. LIO_COMPRESS ) THEN
         TPFILE%LNCCOMPRESS       = LBAK_COMPRESS(IMI)
diff --git a/src/LIB/SURCOUCHE/src/modn_confio.f90 b/src/LIB/SURCOUCHE/src/modn_confio.f90
index 410b439a1..371ca55db 100644
--- a/src/LIB/SURCOUCHE/src/modn_confio.f90
+++ b/src/LIB/SURCOUCHE/src/modn_confio.f90
@@ -41,7 +41,8 @@
 USE MODD_IO, ONLY : LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC,                                            &
                     NBUD_VERB, NBUD_ABORT_LEVEL, NIO_VERB, NIO_ABORT_LEVEL, NGEN_VERB, NGEN_ABORT_LEVEL, &
                     LIO_COMPRESS, NIO_COMPRESS_LEVEL,                                                    &
-                    CIO_DIR, LIO_ALLOW_NO_BACKUP, LIO_NO_WRITE, NFILE_NUM_MAX
+                    CIO_DIR, LIO_ALLOW_NO_BACKUP, LIO_NO_WRITE, LIO_ALLOW_REDUCED_PRECISION_BACKUP,      &
+                    NFILE_NUM_MAX
 !
 IMPLICIT NONE
 !
@@ -57,6 +58,7 @@ NAMELIST/NAM_CONFIO/LCDF4, LLFIOUT, LLFIREAD,                 &
                     NGEN_VERB, NGEN_ABORT_LEVEL, CIO_DIR,     &
                     LIO_COMPRESS, NIO_COMPRESS_LEVEL,         &
                     LIO_ALLOW_NO_BACKUP, LIO_NO_WRITE,        &
+                    LIO_ALLOW_REDUCED_PRECISION_BACKUP,       &
                     NFILE_NUM_MAX
 !
 END MODULE MODN_CONFIO
diff --git a/src/MNH/modd_bakout.f90 b/src/MNH/modd_bakout.f90
index ede0fe810..84e1eab13 100644
--- a/src/MNH/modd_bakout.f90
+++ b/src/MNH/modd_bakout.f90
@@ -56,8 +56,9 @@ LOGICAL :: LBAK_END = .FALSE. ! Force a backup/output at the last timestep
 LOGICAL :: LOUT_END = .FALSE. ! of the segment for all models
 
 ! Compression
-LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_REDUCE_FLOAT_PRECISION = .FALSE.
-! Reduce the precision of floats to single precision instead of double precision (for netCDF)
+
+LOGICAL, DIMENSION(JPMODELMAX) :: LBAK_REDUCE_FLOAT_PRECISION = .FALSE. ! Reduce the precision of floats to single precision
+LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_REDUCE_FLOAT_PRECISION = .FALSE. !  instead of double precision (for netCDF)
 LOGICAL, DIMENSION(JPMODELMAX) :: LBAK_COMPRESS = .FALSE. ! Compress (float) arrays (for netCDF)
 LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_COMPRESS = .FALSE. ! Compress (float) arrays (for netCDF)
 INTEGER, DIMENSION(JPMODELMAX) :: NBAK_COMPRESS_LEVEL = 4 ! Compression level (for netCDF)
diff --git a/src/MNH/modn_backup.f90 b/src/MNH/modn_backup.f90
index 94897f1d0..6dca60a3f 100644
--- a/src/MNH/modn_backup.f90
+++ b/src/MNH/modn_backup.f90
@@ -47,7 +47,8 @@ NAMELIST/NAM_BACKUP/LBAK_BEG,LBAK_END,&
                    XBAK_TIME,NBAK_STEP,&
                    NBAK_STEP_FREQ,NBAK_STEP_FREQ_FIRST,&
                    XBAK_TIME_FREQ,XBAK_TIME_FREQ_FIRST,&
-                   LBAK_COMPRESS, NBAK_COMPRESS_LEVEL,&
+                   LBAK_REDUCE_FLOAT_PRECISION,        &
+                   LBAK_COMPRESS, NBAK_COMPRESS_LEVEL, &
                    CBAK_DIR
 !
 END MODULE MODN_BACKUP
-- 
GitLab