From c221eeba967db254f93bea69764c754a426bd0cc Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 28 Feb 2024 11:13:39 +0100
Subject: [PATCH] Philippe 28/02/2024: add NDEFFILLVALUE and XDEFFILLVALUE
 parameters

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 23 ++++++++++--------
 src/MNH/call_rttov13.f90             |  9 ++++---
 src/MNH/compute_r00.f90              | 36 +++++++++++++---------------
 3 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 607ea1a69..9f34d92a2 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -109,6 +109,17 @@ integer, parameter :: NMNHDIM_NOTLISTED           = 200 ! Special case for valid
 
 integer, parameter :: NMNHDIM_UNUSED              = 300
 
+#ifdef MNH_IOCDF4
+INTEGER, PARAMETER :: NDEFFILLVALUE =  NF90_FILL_INT  ! Default fill value for integer fields
+REAL,    PARAMETER :: XDEFFILLVALUE =  NF90_FILL_REAL ! Default fill value for real fields
+                                                   ! NF90_FILL_REAL is the default fill value
+                                                   ! used by netCDF to pre-fill real and also double
+                                                   ! variables
+#else
+INTEGER, PARAMETER :: NDEFFILLVALUE =  -2147483647            ! Default fill value for integer fields
+REAL,    PARAMETER :: XDEFFILLVALUE =  9.9692099683868690e+36 ! Default fill value for real fields
+#endif
+
 !Array to allow easy identification of dimensions for Arakawa grid points
 integer, dimension(0:8,3), parameter :: NMNHDIM_ARAKAWA = reshape( [ &
   NMNHDIM_UNKNOWN, NMNHDIM_UNKNOWN, NMNHDIM_UNKNOWN, & ! dummy point (to treat ngrid=0 without crash)
@@ -203,16 +214,8 @@ type :: tfieldmetadata_base
   INTEGER            :: NDIMS     = 0  !Number of dimensions
   INTEGER, DIMENSION(NMNHMAXDIMS) :: NDIMLIST = NMNHDIM_UNKNOWN ! List of dimensions of the data field
   !
-#ifdef MNH_IOCDF4
-  INTEGER            :: NFILLVALUE =  NF90_FILL_INT  !Fill value for integer fields
-  REAL               :: XFILLVALUE =  NF90_FILL_REAL !Fill value for real fields
-                                                     !NF90_FILL_REAL is the default fill value
-                                                     !used by netCDF to pre-fill real and also double
-                                                     !variables
-#else
-  INTEGER            :: NFILLVALUE =  -2147483647            !Fill value for integer fields
-  REAL               :: XFILLVALUE =  9.9692099683868690e+36 !Fill value for real fields
-#endif
+  INTEGER            :: NFILLVALUE = NDEFFILLVALUE !Fill value for integer fields
+  REAL               :: XFILLVALUE = XDEFFILLVALUE !Fill value for real fields
   INTEGER            :: NVALIDMIN  = -2147483646 !Minimum valid value for integer fields
   INTEGER            :: NVALIDMAX  =  2147483647 !Maximum valid value for integer fields
   REAL               :: XVALIDMIN  = -1.E36 !Minimum valid value for real fields
diff --git a/src/MNH/call_rttov13.f90 b/src/MNH/call_rttov13.f90
index 4ae377c93..ddc9b7dc9 100644
--- a/src/MNH/call_rttov13.f90
+++ b/src/MNH/call_rttov13.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2003-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2003-2024 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 for details. version 1.
@@ -91,7 +91,7 @@ USE MODD_CST
 USE MODD_PARAMETERS
 USE MODD_GRID_n
 USE MODD_IO, ONLY: TFILEDATA
-USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL
+USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL, XDEFFILLVALUE
 USE MODD_LUNIT_n
 USE MODD_LBC_n
 USE MODD_DEEP_CONVECTION_n
@@ -202,7 +202,6 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE   ::  ZREF
 REAL, DIMENSION(:,:,:), ALLOCATABLE   ::  ZOUT
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZANTMP, ZUTH
 REAL :: ZZH, zdeg_to_rad, zrad_to_deg, zbeta, zalpha
-REAL :: XFILLVALUE =  9.9692099683868690e+36 
 
 ! Other arrays for zenithal solar angle 
 LOGICAL                             :: LCOSZENOUT
@@ -398,7 +397,7 @@ DO JSAT=1,IJSAT ! loop over sensors
 
   IF (.NOT.radar) THEN
     ALLOCATE(ZOUT(IIU,IJU,nchanprof))
-    ZOUT(:,:,:)=XFILLVALUE
+    ZOUT(:,:,:)=XDEFFILLVALUE
   ELSE
     ALLOCATE(ZREF(IIU,IJU,IKU,nchanprof))
     ZREF(:,:,:,:)=min_reflectivity
@@ -818,7 +817,7 @@ DO JSAT=1,IJSAT ! loop over sensors
       NTYPE      = TYPEREAL,                       &
       NDIMS      = 3,                              &
       LTIMEDEP   = .TRUE.                          )
-      WHERE(ZREF(:,:,:,JCH)==min_reflectivity) ZREF(:,:,:,JCH)=XFILLVALUE
+      WHERE(ZREF(:,:,:,JCH)==min_reflectivity) ZREF(:,:,:,JCH)=XDEFFILLVALUE
       CALL IO_Field_write(TPFILE,TZFIELD,ZREF(:,:,:,JCH))
     END IF
   END DO
diff --git a/src/MNH/compute_r00.f90 b/src/MNH/compute_r00.f90
index d2d12a3c2..2c335cd04 100644
--- a/src/MNH/compute_r00.f90
+++ b/src/MNH/compute_r00.f90
@@ -115,8 +115,7 @@ SUBROUTINE COMPUTE_R00(TPFILE)
 !  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
 !  P. Wautelet 11/04/2019: bugfix: nullify TZTRACFILE when appropriate
 !  P. Wautelet 15/02/2024: add time dimension for Lagrangian trajectories
-!  J.-P. Chaboureau 26/02/2024: add thetae, wind and cloud variables,
-!!                               and replace negative values by XFILLVALUE
+!  J.-P. Chaboureau 26/02/2024: add thetae, wind and cloud variables, and replace negative values by XDEFFILLVALUE
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -126,7 +125,7 @@ USE MODD_CONF
 USE MODD_CONF_n,           ONLY: LUSERV, LUSERC, LUSERI
 USE MODD_CST,              ONLY: XALPI, XBETAI, XCPD, XGAMI, XMD, XMV, XP00, XRD, XTT
 USE MODD_GRID_n
-use modd_field,            only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_LEVEL, NMNHDIM_TRAJ_TIME, tfieldmetadata, TYPEREAL
+use modd_field,            only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_LEVEL, NMNHDIM_TRAJ_TIME, tfieldmetadata, TYPEREAL, XDEFFILLVALUE
 USE MODD_FIELD_n
 USE MODD_IO,               ONLY: TFILEDATA
 USE MODD_LAGR_TRAJ
@@ -180,7 +179,6 @@ LOGICAL                               :: GLFI, GNC4
 LOGICAL                               :: GSTART
 INTEGER                               :: JI, JJ, JSV, ISV ! loop index
 REAL                                  :: ZXMAX,ZYMAX,ZZMAX  ! domain extrema
-REAL                                  :: XFILLVALUE =  9.9692099683868690e+36
 TYPE(TFIELDMETADATA)                  :: TZFIELD
 TYPE(TFIELDMETADATA)                  :: TZFIELD_X0, TZFIELD_Y0, TZFIELD_Z0
 TYPE(TFIELDMETADATA)                  :: TZFIELD_U0, TZFIELD_V0, TZFIELD_W0
@@ -240,8 +238,6 @@ END IF
 ALLOCATE( TLAGR_DATES(NTRAJSTLG) )
 
 ! initial values
-!PW:BUG+TODO?: ne tient pas compte de JPHEXT! + utiliser XXHATM ET XDXHAT plutot que XXHAT?
-!PW:BUG+TODO?:  ne tient pas compte de JPHEXT! + utiliser XXHATM ET XDXHAT plutot que XXHAT?
 ZXOR=0.5 * (XXHAT(2)+XXHAT(3)) 
 ZYOR=0.5 * (XYHAT(2)+XYHAT(3))
 ZDX= XXHAT(3)-XXHAT(2)
@@ -566,7 +562,7 @@ DO JFILECUR=1,NFILES
     ELSE
       ZWORK1=ZX00
     END IF
-    WHERE(ZWORK1==NSPVAL) ZWORK1=XFILLVALUE
+    WHERE(ZWORK1==NSPVAL) ZWORK1=XDEFFILLVALUE
     CALL IO_Field_write( TPFILE, TZFIELD_X0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 
     IF (JFILECUR==1) THEN
@@ -574,7 +570,7 @@ DO JFILECUR=1,NFILES
     ELSE
       ZWORK1=ZY00
     END IF
-    WHERE(ZWORK1==NSPVAL) ZWORK1=XFILLVALUE
+    WHERE(ZWORK1==NSPVAL) ZWORK1=XDEFFILLVALUE
     CALL IO_Field_write( TPFILE, TZFIELD_Y0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 
     IF (JFILECUR==1) THEN
@@ -582,7 +578,7 @@ DO JFILECUR=1,NFILES
     ELSE
       ZWORK1=ZZ00
     END IF
-    WHERE(ZWORK1==NSPVAL) ZWORK1=XFILLVALUE
+    WHERE(ZWORK1==NSPVAL) ZWORK1=XDEFFILLVALUE
     CALL IO_Field_write( TPFILE, TZFIELD_Z0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 !
 !*       4.4  store the U0,V0,W0 field for the current start before 
@@ -593,7 +589,7 @@ DO JFILECUR=1,NFILES
     ELSE
       CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZU0,ZWORK1)
     END IF
-    WHERE(ZWORK1==NSPVAL) ZWORK1=XFILLVALUE
+    WHERE(ZWORK1==NSPVAL) ZWORK1=XDEFFILLVALUE
     CALL IO_Field_write( TPFILE, TZFIELD_U0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 
     IF (JFILECUR==1) THEN
@@ -601,7 +597,7 @@ DO JFILECUR=1,NFILES
     ELSE
       CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZV0,ZWORK1)
     END IF
-    WHERE(ZWORK1==NSPVAL) ZWORK1=XFILLVALUE
+    WHERE(ZWORK1==NSPVAL) ZWORK1=XDEFFILLVALUE
     CALL IO_Field_write( TPFILE, TZFIELD_V0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 
     IF (JFILECUR==1) THEN
@@ -609,7 +605,7 @@ DO JFILECUR=1,NFILES
     ELSE
       CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZW0,ZWORK1)
     END IF
-    WHERE(ZWORK1==NSPVAL) ZWORK1=XFILLVALUE
+    WHERE(ZWORK1==NSPVAL) ZWORK1=XDEFFILLVALUE
     CALL IO_Field_write( TPFILE, TZFIELD_W0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 !
 !*       4.5   compute and store potential temp and water vapor at the origin
@@ -619,7 +615,7 @@ DO JFILECUR=1,NFILES
     ELSE
       CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZTH0,ZWORK1)
     END IF
-    WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+    WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
     CALL IO_Field_write( TPFILE, TZFIELD_TH0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 
     IF (LUSERV) THEN
@@ -628,7 +624,7 @@ DO JFILECUR=1,NFILES
       ELSE
         CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZRV0,ZWORK1)
       END IF
-      WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+      WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
       CALL IO_Field_write( TPFILE, TZFIELD_RV0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 
       IF (JFILECUR==1) THEN
@@ -636,7 +632,7 @@ DO JFILECUR=1,NFILES
       ELSE
         CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZRH0,ZWORK1)
       END IF
-      WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+      WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
       CALL IO_Field_write( TPFILE, TZFIELD_RH0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
 
       IF (JFILECUR==1) THEN
@@ -644,7 +640,7 @@ DO JFILECUR=1,NFILES
       ELSE
         CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZTHE0,ZWORK1)
       END IF
-      WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+      WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
       CALL IO_Field_write( TPFILE, TZFIELD_THE0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
     END IF
 
@@ -654,7 +650,7 @@ DO JFILECUR=1,NFILES
       ELSE
         CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZRC0,ZWORK1)
       END IF
-      WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+      WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
       CALL IO_Field_write( TPFILE, TZFIELD_RC0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
     END IF
 
@@ -664,7 +660,7 @@ DO JFILECUR=1,NFILES
       ELSE
         CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZRI0,ZWORK1)
       END IF
-      WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+      WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
       CALL IO_Field_write( TPFILE, TZFIELD_RI0, RESHAPE( ZWORK1(:,:,:), [ SHAPE(ZWORK1), 1 ] ), KOFFSET = [0, 0, 0, NNBR_START ] )
     END IF
 !
@@ -677,7 +673,7 @@ DO JFILECUR=1,NFILES
         ELSE
           CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZCCN_FREE0(:,:,:,JSV),ZWORK1)
         END IF
-        WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+        WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
         WRITE(YIDX,'(I2.2)')(JSV)
         YMNHNAME = TRIM(CLIMA_WARM_CONC(3))//YIDX
         TZFIELD = TFIELDMETADATA(                       &
@@ -700,7 +696,7 @@ DO JFILECUR=1,NFILES
         ELSE
           CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZIFN_FREE0(:,:,:,JSV),ZWORK1)
         END IF
-        WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
+        WHERE(ZWORK1<0.) ZWORK1=XDEFFILLVALUE
         WRITE(YIDX,'(I2.2)')(JSV)
         YMNHNAME = TRIM(CLIMA_COLD_CONC(5))//YIDX
         TZFIELD = TFIELDMETADATA(                       &
-- 
GitLab