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