From 64610af7489249c3baba3f2ef88e7c52817a33e6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@cnrs.fr>
Date: Wed, 23 Oct 2024 15:21:23 +0200
Subject: [PATCH] Philippe 23/10/2024: OUTPUTS: add compression parameters per
 variable in namelist NAM_OUTPUT (not yet exploited)

---
 src/MNH/modd_bakout.f90 | 13 ++++++++++++-
 src/MNH/modn_output.f90 | 29 ++++++++++++++++++++++++++++-
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/src/MNH/modd_bakout.f90 b/src/MNH/modd_bakout.f90
index 8f5d12b87..533d235d8 100644
--- a/src/MNH/modd_bakout.f90
+++ b/src/MNH/modd_bakout.f90
@@ -38,6 +38,7 @@
 !  P. Wautelet 14/12/2023: add lossy compression for output files
 !  P. Wautelet 07/02/2024: add compression for backup files
 !  P. Wautelet 20/03/2024: add boxes for output files
+!  P. Wautelet 23/10/2024: add compression parameters per variable
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -58,18 +59,22 @@ 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) :: 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)
 INTEGER, DIMENSION(JPMODELMAX) :: NOUT_COMPRESS_LEVEL = 4 ! Compression level (for netCDF)
+! Compression per variable (supersede previous parameters)
+INTEGER, DIMENSION(:,:), ALLOCATABLE :: NOUT_VAR_COMPRESS_LEVEL ! Compression level per variable (set to 0 if no compression)
 
 ! Lossy compression
 LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_COMPRESS_LOSSY = .FALSE. ! Lossy compression of (float) arrays (for netCDF)
 CHARACTER(LEN=NCOMPRNAMELGTMAX), DIMENSION(JPMODELMAX) :: COUT_COMPRESS_LOSSY_ALGO = 'GRANULARBR' ! Quantization algorithm
 INTEGER, DIMENSION(JPMODELMAX) :: NOUT_COMPRESS_LOSSY_NSD  = 3  ! Number of Significant Digits (or Bits)
+! Lossy compression per variable (supersede previous parameters)
+CHARACTER(LEN=NCOMPRNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: COUT_VAR_COMPRESS_LOSSY_ALGO ! Quantization algorithm
+INTEGER, DIMENSION(:,:), ALLOCATABLE :: NOUT_VAR_COMPRESS_LOSSY_NSD  ! Number of Significant Digits (or Bits)
 
 REAL, ALLOCATABLE, DIMENSION(:,:)  ::   XBAK_TIME, XOUT_TIME
 ! XBAK_TIME(m,i) / XOUT_TIME(m,i) array of
@@ -117,6 +122,12 @@ INTEGER, DIMENSION(:,:), ALLOCATABLE :: NOUT_BOX_JSUP
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: NOUT_BOX_KINF
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: NOUT_BOX_KSUP
 
+! Compression parameters per variable in boxes
+INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NOUT_BOX_VAR_COMPRESS_LEVEL ! Compression level
+CHARACTER(LEN=NCOMPRNAMELGTMAX), DIMENSION(:,:,:), ALLOCATABLE :: COUT_BOX_VAR_COMPRESS_LOSSY_ALGO ! Quantization algorithm
+INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NOUT_BOX_VAR_COMPRESS_LOSSY_NSD  ! Number of Significant Digits (or Bits)
+
+
 ! Flag to disable output file splitting (supersedes NB_PROCIO_W option from NAM_CONFZ)
 LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_FILESPLIT_DISABLE = .FALSE.
 END MODULE MODD_BAKOUT
diff --git a/src/MNH/modn_output.f90 b/src/MNH/modn_output.f90
index 12ff83c1e..5ff3fc265 100644
--- a/src/MNH/modn_output.f90
+++ b/src/MNH/modn_output.f90
@@ -36,6 +36,7 @@
 !  P. Wautelet 02/10/2017: split NAM_OUTPUT in NAM_BACKUP and NAM_OUTPUT
 !  P. Wautelet 14/12/2023: add lossy compression for output files
 !  P. Wautelet 20/03/2024: add boxes for output files
+!  P. Wautelet 23/10/2024: add compression parameters per variable
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -51,8 +52,9 @@ NAMELIST/NAM_OUTPUT/LOUT_BEG,LOUT_END,&
                    XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST, &
                    COUT_VAR, &
                    LOUT_REDUCE_FLOAT_PRECISION, &
-                   LOUT_COMPRESS, NOUT_COMPRESS_LEVEL,&
+                   LOUT_COMPRESS, NOUT_COMPRESS_LEVEL, NOUT_VAR_COMPRESS_LEVEL, &
                    LOUT_COMPRESS_LOSSY, COUT_COMPRESS_LOSSY_ALGO, NOUT_COMPRESS_LOSSY_NSD, &
+                   COUT_VAR_COMPRESS_LOSSY_ALGO, NOUT_VAR_COMPRESS_LOSSY_NSD, &
                    COUT_DIR, &
                    NOUT_BOXES, COUT_BOX_NAME, COUT_BOX_VAR_SUPP, &
                    LOUT_MAINDOMAIN_WRITE, &
@@ -60,6 +62,7 @@ NAMELIST/NAM_OUTPUT/LOUT_BEG,LOUT_END,&
                    LOUT_UNPHYSICAL_HOR_CELLS_REMOVE, LOUT_UNPHYSICAL_VER_CELLS_REMOVE,  &
                    LOUT_PHYSICAL_SIMPLIFIED, &
                    NOUT_BOX_IINF, NOUT_BOX_ISUP, NOUT_BOX_JINF, NOUT_BOX_JSUP, NOUT_BOX_KINF, NOUT_BOX_KSUP, &
+                   NOUT_BOX_VAR_COMPRESS_LEVEL, COUT_BOX_VAR_COMPRESS_LOSSY_ALGO, NOUT_BOX_VAR_COMPRESS_LOSSY_NSD, &
                    LOUT_FILESPLIT_DISABLE
 
 LOGICAL, SAVE, PRIVATE :: LOUTPUT_NML_ALLOCATED = .FALSE.
@@ -84,6 +87,10 @@ SUBROUTINE OUTPUT_NML_ALLOCATE( )
   ALLOCATE( NOUT_STEP(NMODEL, NFILE_NUM_MAX) )
   ALLOCATE( COUT_VAR(NMODEL, JPOUTVARMAX) )
 
+  ALLOCATE( NOUT_VAR_COMPRESS_LEVEL     (NMODEL, JPOUTVARMAX) )
+  ALLOCATE( COUT_VAR_COMPRESS_LOSSY_ALGO(NMODEL, JPOUTVARMAX) )
+  ALLOCATE( NOUT_VAR_COMPRESS_LOSSY_NSD (NMODEL, JPOUTVARMAX) )
+
   ALLOCATE( COUT_BOX_NAME(NMODEL, NOUT_BOXMAX) )
 
   ALLOCATE( COUT_BOX_VAR_SUPP(NMODEL, NOUT_BOXMAX, JPOUTVARMAX ) )
@@ -95,10 +102,18 @@ SUBROUTINE OUTPUT_NML_ALLOCATE( )
   ALLOCATE( NOUT_BOX_KINF(NMODEL, NOUT_BOXMAX) )
   ALLOCATE( NOUT_BOX_KSUP(NMODEL, NOUT_BOXMAX) )
 
+  ALLOCATE( NOUT_BOX_VAR_COMPRESS_LEVEL     (NMODEL, NOUT_BOXMAX, JPOUTVARMAX ) )
+  ALLOCATE( COUT_BOX_VAR_COMPRESS_LOSSY_ALGO(NMODEL, NOUT_BOXMAX, JPOUTVARMAX ) )
+  ALLOCATE( NOUT_BOX_VAR_COMPRESS_LOSSY_NSD (NMODEL, NOUT_BOXMAX, JPOUTVARMAX ) )
+
   XOUT_TIME(:,:) = XNEGUNDEF
   NOUT_STEP(:,:) = NNEGUNDEF
   COUT_VAR(:,:)  = ''
 
+  NOUT_VAR_COMPRESS_LEVEL(:,:)      = NNEGUNDEF
+  COUT_VAR_COMPRESS_LOSSY_ALGO(:,:) = 'NOT_SET'
+  NOUT_VAR_COMPRESS_LOSSY_NSD(:,:)  = NNEGUNDEF
+
   COUT_BOX_NAME(:,:) = ''
 
   COUT_BOX_VAR_SUPP(:,:,:) = ''
@@ -110,6 +125,10 @@ SUBROUTINE OUTPUT_NML_ALLOCATE( )
   NOUT_BOX_KINF(:,:) = NNEGUNDEF
   NOUT_BOX_KSUP(:,:) = NNEGUNDEF
 
+  NOUT_BOX_VAR_COMPRESS_LEVEL(:,:,:)      = NNEGUNDEF
+  COUT_BOX_VAR_COMPRESS_LOSSY_ALGO(:,:,:) = 'NOT_SET'
+  NOUT_BOX_VAR_COMPRESS_LOSSY_NSD(:,:,:)  = NNEGUNDEF
+
   LOUTPUT_NML_ALLOCATED = .TRUE.
 
 END SUBROUTINE OUTPUT_NML_ALLOCATE
@@ -127,6 +146,10 @@ SUBROUTINE OUTPUT_NML_DEALLOCATE( )
   DEALLOCATE( NOUT_STEP )
   DEALLOCATE( COUT_VAR  )
 
+  DEALLOCATE( NOUT_VAR_COMPRESS_LEVEL      )
+  DEALLOCATE( COUT_VAR_COMPRESS_LOSSY_ALGO )
+  DEALLOCATE( NOUT_VAR_COMPRESS_LOSSY_NSD  )
+
   DEALLOCATE( COUT_BOX_NAME )
 
   DEALLOCATE( COUT_BOX_VAR_SUPP )
@@ -138,6 +161,10 @@ SUBROUTINE OUTPUT_NML_DEALLOCATE( )
   DEALLOCATE( NOUT_BOX_KINF )
   DEALLOCATE( NOUT_BOX_KSUP )
 
+  DEALLOCATE( NOUT_BOX_VAR_COMPRESS_LEVEL      )
+  DEALLOCATE( COUT_BOX_VAR_COMPRESS_LOSSY_ALGO )
+  DEALLOCATE( NOUT_BOX_VAR_COMPRESS_LOSSY_NSD  )
+
   LOUTPUT_NML_ALLOCATED = .FALSE.
 
 END SUBROUTINE OUTPUT_NML_DEALLOCATE
-- 
GitLab