diff --git a/A-INSTALL b/A-INSTALL index 7d0d2ad77ff178889189042e7a7db047c77c9946..e9fcf06f82d72f0ce656fbaac3f47b67f067bbe4 100644 --- a/A-INSTALL +++ b/A-INSTALL @@ -1076,9 +1076,13 @@ etc ... # REM : the 'profile_mesonh...' file & the 'dir_obj...' directory will be suffixed with an ECRAD extension # # Usage : -# 1) In namelist replace RAD='ECMW' be RAD='ECRA' -# 2) Add link to 'ecrad-1.0.1/data' files -# see 007_16janvier/008_run2 test case for example +# 1) In namelist replace RAD='ECMW' by RAD='ECRA' +# 2) Add link to all 'ecrad-1.0.1/data' files in your mesonh run directory +ln -sf ${SRC_MESONH}/src/LIB/RAD/ecrad-1.0.1/data/* . +# +# REM : you can replace CDATADIR = "." by CDATADIR = "data" of ini_radiations_ecrad.f90 to link only the data folder instead of all the files one by one +# +# See 007_16janvier/008_run2 test case for example # # d) MNH_MEGAN for optional compilation of MEGAN code # -------------------------------------- diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 index 5abc98b1e2e5663dc251939d12f7067d84d7a6b4..3b757c3bc97d5f5d9b8f21bebc65bb8909973480 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 @@ -3,6 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- +! Modifications: +! P. Wautelet 19/09/2019: add possibility to provide a fallback file if some information are not found in the input file +!----------------------------------------------------------------- program LFI2CDF USE MODD_CONF, ONLY: CPROGRAM USE MODD_CONFZ, ONLY: NB_PROCIO_R @@ -33,7 +36,7 @@ program LFI2CDF INTEGER :: IINFO_ll ! return code of // routines INTEGER :: nfiles_out = 0 ! number of output files CHARACTER(LEN=:),allocatable :: hvarlist - TYPE(TFILE_ELT),DIMENSION(1) :: infiles + TYPE(TFILE_ELT),DIMENSION(2) :: infiles TYPE(TFILE_ELT),DIMENSION(MAXFILES) :: outfiles TYPE(workfield), DIMENSION(:), POINTER :: tzreclist @@ -152,7 +155,11 @@ program LFI2CDF CALL fill_files(infiles,outfiles,tzreclist,nbvar,options) END IF - CALL CLOSE_FILES(infiles, 1) + if ( options( OPTFALLBACK )%set ) then + CALL CLOSE_FILES(infiles, 2) + else + CALL CLOSE_FILES(infiles, 1) + end if CALL CLOSE_FILES(outfiles,nfiles_out) - + end program LFI2CDF diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 index 1740187f0964e318455240e2c869398bfd2c9abe..e578f204cd7f11353fa6bbcc329c30456f371b44 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 @@ -1,20 +1,24 @@ -!MNH_LIC Copyright 2015-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2015-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. !----------------------------------------------------------------- +! Modifications: +! P. Wautelet 19/09/2019: add possibility to provide a fallback file if some information are not found in the input file +! P. Wautelet 21/10/2019: add OPTDIR option to set directory for writing outfiles +!----------------------------------------------------------------- module mode_options USE MODE_FIELD, ONLY: TYPEUNDEF, TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE implicit none - integer,parameter :: nbavailoptions = 10 + integer,parameter :: NBAVAILOPTIONS = 12 integer,parameter :: MODEUNDEF = -11, MODECDF2CDF = 11, MODELFI2CDF = 12, MODECDF2LFI = 13 - integer,parameter :: OPTCOMPRESS = 1, OPTHELP = 2, OPTLIST = 3 - integer,parameter :: OPTMERGE = 4, OPTOUTPUT = 5, OPTREDUCE = 6 - integer,parameter :: OPTMODE = 7, OPTSPLIT = 8, OPTVAR = 9 - integer,parameter :: OPTVERBOSE = 10 + integer,parameter :: OPTCOMPRESS = 1, OPTHELP = 2, OPTLIST = 3 + integer,parameter :: OPTMERGE = 4, OPTOUTPUT = 5, OPTREDUCE = 6 + integer,parameter :: OPTMODE = 7, OPTSPLIT = 8, OPTVAR = 9 + integer,parameter :: OPTVERBOSE = 10, OPTFALLBACK = 11, OPTDIR = 12 type option logical :: set = .false. @@ -153,6 +157,17 @@ subroutine init_options(options) options(OPTVERBOSE)%long_name = "verbose" options(OPTVERBOSE)%short_name = 'V' options(OPTVERBOSE)%has_argument = .false. + + options(OPTFALLBACK)%long_name = "fallback-file" + options(OPTFALLBACK)%short_name = 'f' + options(OPTFALLBACK)%has_argument = .true. + options(OPTFALLBACK)%type = TYPECHAR + + options(OPTDIR)%long_name = "outdir" + options(OPTDIR)%short_name = 'd' + options(OPTDIR)%has_argument = .true. + options(OPTDIR)%type = TYPECHAR + end subroutine init_options subroutine get_option(options,finished) @@ -323,18 +338,21 @@ subroutine help() !TODO: -l option for cdf2cdf and cdf2lfi print *,"Usage : lfi2cdf [-h --help] [-l] [-v --var var1[,...]] [-r --reduce-precision]" print *," [-m --merge number_of_z_levels] [-s --split] [-o --output output-file.nc]" - print *," [-R --runmode mode] [-V --verbose]" + print *," [-R --runmode mode] [-V --verbose] [-f --fallback-file fallback-file]" print *," [-c --compress compression_level] input-file.lfi" print *," cdf2cdf [-h --help] [-v --var var1[,...]] [-r --reduce-precision]" print *," [-m --merge number_of_split_files] [-s --split] [-o --output output-file.nc]" - print *," [-R --runmode mode] [-V --verbose]" + print *," [-R --runmode mode] [-V --verbose] [-f --fallback-file fallback-file]" print *," [-c --compress compression_level] input-file.nc" - print *," cdf2lfi [-o --output output-file.lfi] [-R --runmode mode] [-V --verbose] input-file.nc" + print *," cdf2lfi [-o --output output-file.lfi] [-R --runmode mode] [-V --verbose]" + print *," [-f --fallback-file fallback-file] input-file.nc" print *,"" print *,"Options:" print *," --compress, -c compression_level" print *," Compress data. The compression level should be in the 1 to 9 interval." print *," Only supported with the netCDF format (cdf2cdf and lfi2cdf only)" + print *," -f --fallback-file fallback-file" + print *," File to use to read some grid information if not found in input-file" print *," --help, -h" print *," Print this text" print *," --list, -l" diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index bf5f280aa15166f970d6c4b50b940c4d8db55f15..8dc5e9dc3d0a82e77f11381c496f99c2cf6a1cfd 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -8,11 +8,15 @@ ! P. Wautelet 10/04/2019: use IO_Err_handle_nc4 to handle netCDF errors ! P. Wautelet 25/06/2019: add support for 3D integer arrays ! P. Wautelet 01/08/2019: allow merge of entire Z-split files +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) +! P. Wautelet 19/09/2019: add possibility to provide a fallback file if some information are not found in the input file +! P. Wautelet 21/10/2019: add OPTDIR option to set directory for writing outfiles +! P. Wautelet 21/10/2019: if DTMOD and DTCUR not found, try to read the time coordinate !----------------------------------------------------------------- MODULE mode_util USE MODD_IO, ONLY: TFILEDATA, TFILE_ELT USE MODD_NETCDF, ONLY: DIMCDF, CDFINT - USE MODD_PARAMETERS, ONLY: JPVEXT, NLFIMAXCOMMENTLENGTH, NMNHNAMELGTMAX + USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH, NMNHNAMELGTMAX use modd_precision, only: LFIINT USE MODE_FIELD @@ -41,12 +45,12 @@ MODULE mode_util LOGICAL :: LSPLIT = .FALSE. ! TRUE if variable is split by vertical level INTEGER :: NSIZE = 0 ! Size of the variable (in number of elements) INTEGER :: NSRC = 0 ! Number of variables used to compute the variable (needed only if calc=.true.) - INTEGER :: NDIMS_FILE ! Number of dims (as present in input file) - INTEGER,DIMENSION(:),ALLOCATABLE :: NDIMSIZES_FILE ! Dimensions sizes (as present in input file) + INTEGER(kind=CDFINT) :: NDIMS_FILE ! Number of dims (as present in input file) + INTEGER(kind=CDFINT), DIMENSION(:),ALLOCATABLE :: NDIMSIZES_FILE ! Dimensions sizes (as present in input file) CHARACTER(LEN=NF90_MAX_NAME),DIMENSION(:),ALLOCATABLE :: CDIMNAMES_FILE ! Dimensions names (as present in input file) CHARACTER(LEN=40) :: CUNITS_FILE = '' ! Units (as present in input file) INTEGER :: NGRID_FILE ! Grid number (as present in input file) - INTEGER :: NTYPE_FILE ! netCDF datatype (NF90_CHAR, NF90_INT...) (as present in input file) + INTEGER(kind=CDFINT) :: NTYPE_FILE ! netCDF datatype (NF90_CHAR, NF90_INT...) (as present in input file) INTEGER,DIMENSION(MAXRAW) :: src ! List of variables used to compute the variable (needed only if calc=.true.) INTEGER :: tgt ! Target: id of the variable that use it (calc variable) TYPE(TFIELDDATA) :: TFIELD ! Metadata about the field @@ -634,7 +638,8 @@ END DO CHARACTER(LEN=16) :: YMNHVERSION CHARACTER(LEN=:),ALLOCATABLE :: YHISTORY - INTEGER :: ilen, ji + INTEGER :: ji + INTEGER(KIND=CDFINT) :: ilen INTEGER(KIND=CDFINT) :: status INTEGER(KIND=CDFINT) :: kcdf_id @@ -853,8 +858,8 @@ END DO ALLOCATE(XTAB3D(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3))) IF (tpreclist(ji)%calc) ALLOCATE(XTAB3D2(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3))) !Hack not very clean: 3D LB fields are not split - !If NSUBFILES_IOZ is set to 0, IO_READ_FIELD will read it as a non-split field - !CAUTION: there are no guarantee the IO_READ_FIELD will continue to use this information that way... + !If NSUBFILES_IOZ is set to 0, IO_Field_read will read it as a non-split field + !CAUTION: there are no guarantee the IO_Field_read will continue to use this information that way... if ( tpreclist(ji)%tfield%clbtype /= 'NONE' .or. tpreclist(ji)%name(1:2) == 'LB' ) then tzfile = infiles(1)%tfile tzfile%nsubfiles_ioz=0 @@ -967,6 +972,7 @@ END DO SUBROUTINE OPEN_FILES(infiles,outfiles,KNFILES_OUT,hinfile,houtfile,nbvar_infile,options,runmode) USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CONF_n, ONLY: CSTORAGE_TYPE + USE MODD_CONFZ, ONLY: NB_PROCIO_R USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX USE MODD_GRID, ONLY: XBETA, XRPK, XLAT0, XLON0, XLATORI, XLONORI USE MODD_GRID_n, ONLY: LSLEVE, XXHAT, XYHAT, XZHAT @@ -987,10 +993,15 @@ END DO TYPE(option),DIMENSION(:), INTENT(IN) :: options INTEGER, INTENT(IN) :: runmode - INTEGER :: idx, IRESP2 - INTEGER(KIND=CDFINT) :: omode - INTEGER(KIND=CDFINT) :: status - INTEGER(KIND=LFIINT) :: ilu,iresp + character(len=:), allocatable :: yunits + INTEGER :: idx, IRESP2 + integer :: inb_procio_r_save + INTEGER(KIND=CDFINT) :: ioldmode + INTEGER(KIND=CDFINT) :: istatus + INTEGER(KIND=CDFINT) :: ivar_id + integer(kind=CDFINT) :: ilen + INTEGER(KIND=LFIINT) :: ilu,iresp + logical :: gok CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_FILES','called') @@ -1007,6 +1018,15 @@ END DO CALL IO_FILE_OPEN(INFILES(1)%TFILE) nbvar_infile = INFILES(1)%TFILE%NNCNAR + + !Open fallback file if provided + if ( options( OPTFALLBACK )%set ) then + inb_procio_r_save = NB_PROCIO_R + NB_PROCIO_R = 1 + CALL IO_FILE_ADD2LIST(INFILES(2)%TFILE,options( OPTFALLBACK )%cvalue,'UNKNOWN','READ',HFORMAT='NETCDF4') + CALL IO_FILE_OPEN(INFILES(2)%TFILE) + NB_PROCIO_R = inb_procio_r_save + end if ELSE ! ! LFI @@ -1024,52 +1044,158 @@ END DO CALL IO_FILE_CLOSE(INFILES(1)%TFILE) return END IF + + !Open fallback file if provided + if ( options( OPTFALLBACK )%set ) then + inb_procio_r_save = NB_PROCIO_R + NB_PROCIO_R = 1 + CALL IO_FILE_ADD2LIST(INFILES(2)%TFILE,options( OPTFALLBACK )%cvalue,'UNKNOWN','READ', & + HFORMAT='LFI',KLFIVERB=0) + CALL IO_FILE_OPEN(INFILES(2)%TFILE) + NB_PROCIO_R = inb_procio_r_save + end if END IF ! !Read problem dimensions and some grid variables (needed to determine domain size and also by IO_FILE_OPEN to create netCDF files) - CALL IO_Field_read(INFILES(1)%TFILE,'JPHEXT',JPHEXT) + JPHEXT = 1 + CALL IO_Field_read(INFILES(1)%TFILE,'JPHEXT',JPHEXT,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'JPHEXT',JPHEXT,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'JPHEXT not found') + JPHEXT_ll = JPHEXT JPVEXT_ll = JPVEXT ! ALLOCATE(NIMAX_ll,NJMAX_ll,NKMAX) - CALL IO_Field_read(INFILES(1)%TFILE,'IMAX',NIMAX_ll) - CALL IO_Field_read(INFILES(1)%TFILE,'JMAX',NJMAX_ll) + CALL IO_Field_read(INFILES(1)%TFILE,'IMAX',NIMAX_ll,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'IMAX',NIMAX_ll,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'IMAX not found') + + CALL IO_Field_read(INFILES(1)%TFILE,'JMAX',NJMAX_ll,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'JMAX',NJMAX_ll,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'JMAX not found') + CALL IO_Field_read(INFILES(1)%TFILE,'KMAX',NKMAX,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'KMAX',NKMAX,IRESP2) IF (IRESP2/=0) NKMAX = 0 ! - CALL IO_Field_read(INFILES(1)%TFILE,'PROGRAM',CPROGRAM_ORIG) + CALL IO_Field_read(INFILES(1)%TFILE,'PROGRAM',CPROGRAM_ORIG,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'PROGRAM',CPROGRAM_ORIG,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'PROGRAM not found') ! ALLOCATE(CSTORAGE_TYPE) - CALL IO_Field_read(INFILES(1)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE) + CALL IO_Field_read(INFILES(1)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'STORAGE_TYPE not found') ! ALLOCATE(XXHAT(NIMAX_ll+2*JPHEXT)) - CALL IO_Field_read(INFILES(1)%TFILE,'XHAT',XXHAT) + CALL IO_Field_read(INFILES(1)%TFILE,'XHAT',XXHAT,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'XHAT',XXHAT,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'XHAT not found') + ALLOCATE(XYHAT(NJMAX_ll+2*JPHEXT)) - CALL IO_Field_read(INFILES(1)%TFILE,'YHAT',XYHAT) - CALL IO_Field_read(INFILES(1)%TFILE,'CARTESIAN',LCARTESIAN) - ! - CALL IO_Field_read(INFILES(1)%TFILE,'LAT0',XLAT0) - CALL IO_Field_read(INFILES(1)%TFILE,'LON0',XLON0) - CALL IO_Field_read(INFILES(1)%TFILE,'BETA',XBETA) - ! + CALL IO_Field_read(INFILES(1)%TFILE,'YHAT',XYHAT,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'YHAT',XYHAT,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'YHAT not found') + + CALL IO_Field_read(INFILES(1)%TFILE,'CARTESIAN',LCARTESIAN,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'CARTESIAN',LCARTESIAN,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'CARTESIAN not found') + + CALL IO_Field_read(INFILES(1)%TFILE,'LAT0',XLAT0,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'LAT0',XLAT0,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'LAT0 not found') + + CALL IO_Field_read(INFILES(1)%TFILE,'LON0',XLON0,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'LON0',XLON0,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'LON0 not found') + + CALL IO_Field_read(INFILES(1)%TFILE,'BETA',XBETA,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'BETA',XBETA,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'BETA not found') + IF (.NOT.LCARTESIAN) THEN - CALL IO_Field_read(INFILES(1)%TFILE,'RPK', XRPK) - CALL IO_Field_read(INFILES(1)%TFILE,'LATORI',XLATORI) - CALL IO_Field_read(INFILES(1)%TFILE,'LONORI',XLONORI) + CALL IO_Field_read(INFILES(1)%TFILE,'RPK', XRPK, IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'RPK', XRPK,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'RPK not found') + + CALL IO_Field_read(INFILES(1)%TFILE,'LATORI',XLATORI,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'LATORI',XLATORI,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'LATORI not found') + + CALL IO_Field_read(INFILES(1)%TFILE,'LONORI',XLONORI,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'LONORI',XLONORI,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'LONORI not found') ENDIF ! IF (TRIM(CPROGRAM_ORIG)/='PGD' .AND. TRIM(CPROGRAM_ORIG)/='NESPGD' .AND. TRIM(CPROGRAM_ORIG)/='ZOOMPG' & .AND. .NOT.(TRIM(CPROGRAM_ORIG)=='REAL' .AND. CSTORAGE_TYPE=='SU') ) THEN !condition to detect PREP_SURFEX ALLOCATE(XZHAT(NKMAX+2*JPVEXT)) - CALL IO_Field_read(INFILES(1)%TFILE,'ZHAT',XZHAT) + CALL IO_Field_read(INFILES(1)%TFILE,'ZHAT',XZHAT,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'ZHAT',XZHAT,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'ZHAT not found') + ALLOCATE(LSLEVE) - CALL IO_Field_read(INFILES(1)%TFILE,'SLEVE',LSLEVE) + CALL IO_Field_read(INFILES(1)%TFILE,'SLEVE',LSLEVE,IRESP2) + !If not found in main file, try the fallback one + if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'SLEVE',LSLEVE,IRESP2) + if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'SLEVE not found') + ALLOCATE(TDTMOD) CALL IO_Field_read(INFILES(1)%TFILE,'DTMOD',TDTMOD,IRESP2) IF(IRESP2/=0) DEALLOCATE(TDTMOD) + ALLOCATE(TDTCUR) CALL IO_Field_read(INFILES(1)%TFILE,'DTCUR',TDTCUR,IRESP2) IF(IRESP2/=0) DEALLOCATE(TDTCUR) + + !If time values were not found, try to get it from the time coordinate + if ( .not. associated( tdtcur ) .and. infiles(1)%tfile%cformat == 'NETCDF4' ) then + gok = .false. + + istatus = NF90_INQ_VARID( infiles(1)%tfile%nncid, 'time', ivar_id ) + if ( istatus == NF90_NOERR ) then + allocate( tdtcur ) + istatus = NF90_GET_VAR( infiles(1)%tfile%nncid, ivar_id, tdtcur%time ) + if ( istatus == NF90_NOERR ) then + istatus = NF90_INQUIRE_ATTRIBUTE( infiles(1)%tfile%nncid, ivar_id, 'units', len = ilen ) + if ( istatus == NF90_NOERR ) then + allocate( character(len = ilen ) :: yunits ) + istatus = NF90_GET_ATT( infiles(1)%tfile%nncid, ivar_id, 'units', yunits ) + ! Extract date from yunits + idx = INDEX( yunits, 'since ' ) + Read( yunits(idx+6 :idx+9 ) , '( I4.4 )' ) tdtcur%tdate%year + Read( yunits(idx+11:idx+12 ), '( I2.2 )' ) tdtcur%tdate%month + Read( yunits(idx+14:idx+15 ), '( I2.2 )' ) tdtcur%tdate%day + + if ( .not. associated( tdtmod ) ) then + allocate( tdtmod ) + tdtmod = tdtcur + tdtmod%time = 0. + end if + + gok = .true. + end if + end if + end if + + if ( .not. gok ) deallocate( tdtcur ) + end if END IF ! ! Outfiles @@ -1082,8 +1208,13 @@ END DO KNFILES_OUT = KNFILES_OUT + 1 idx = KNFILES_OUT - CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,HOUTFILE,'MNH','WRITE', & - HFORMAT='NETCDF4',OOLD=.TRUE.) + if ( options(OPTDIR)%set ) then + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,HOUTFILE,'MNH','WRITE', & + HFORMAT='NETCDF4',OOLD=.TRUE., hdirname = options(OPTDIR)%cvalue ) + else + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,HOUTFILE,'MNH','WRITE', & + HFORMAT='NETCDF4',OOLD=.TRUE.) + end if CALL IO_FILE_OPEN(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) IF (options(OPTCOMPRESS)%set) THEN @@ -1095,8 +1226,8 @@ END DO outfiles(idx)%tfile%LNCREDUCE_FLOAT_PRECISION = .TRUE. END IF - status = NF90_SET_FILL(outfiles(idx)%TFILE%NNCID,NF90_NOFILL,omode) - if ( status /= NF90_NOERR ) call IO_Err_handle_nc4( status, 'OPEN_FILES', 'NF90_SET_FILL', '' ) + istatus = NF90_SET_FILL(outfiles(idx)%TFILE%NNCID,NF90_NOFILL,ioldmode) + if ( istatus /= NF90_NOERR ) call IO_Err_handle_nc4( istatus, 'OPEN_FILES', 'NF90_SET_FILL', '' ) END IF ! .NOT.osplit ELSE ! @@ -1104,8 +1235,13 @@ END DO ! KNFILES_OUT = KNFILES_OUT + 1 idx = KNFILES_OUT - CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,houtfile,'MNH','WRITE', & - HFORMAT='LFI',KLFIVERB=0,OOLD=.TRUE.) + if ( options(OPTDIR)%set ) then + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,houtfile,'MNH','WRITE', & + HFORMAT='LFI',KLFIVERB=0,OOLD=.TRUE., hdirname = options(OPTDIR)%cvalue ) + else + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,houtfile,'MNH','WRITE', & + HFORMAT='LFI',KLFIVERB=0,OOLD=.TRUE.) + end if LIOCDF4 = .FALSE. !Necessary to open correctly the LFI file CALL IO_FILE_OPEN(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) LIOCDF4 = .TRUE. @@ -1116,8 +1252,13 @@ END DO KNFILES_OUT = KNFILES_OUT + 1 idx = KNFILES_OUT - CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,'dummy_file','MNH','WRITE', & - HFORMAT='NETCDF4',OOLD=.TRUE.) + if ( options(OPTDIR)%set ) then + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,'dummy_file','MNH','WRITE', & + HFORMAT='NETCDF4',OOLD=.TRUE., hdirname = options(OPTDIR)%cvalue ) + else + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,'dummy_file','MNH','WRITE', & + HFORMAT='NETCDF4',OOLD=.TRUE.) + end if CALL IO_FILE_OPEN(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) END IF @@ -1141,7 +1282,7 @@ END DO INTEGER :: ji INTEGER :: idx1, idx2 INTEGER(KIND=CDFINT) :: status - INTEGER(KIND=CDFINT) :: omode + INTEGER(KIND=CDFINT) :: ioldmode CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_SPLIT_NCFILES_OUT','called') @@ -1171,8 +1312,13 @@ END DO DO ji = 1,nbvar filename = trim(houtfile)//'.'//TRIM(YVARS(ji)) - CALL IO_FILE_ADD2LIST(outfiles(ji)%TFILE,filename,'MNH','WRITE', & - HFORMAT='NETCDF4') + if ( options(OPTDIR)%set ) then + CALL IO_FILE_ADD2LIST(outfiles(ji)%TFILE,filename,'MNH','WRITE', & + HFORMAT='NETCDF4', hdirname = options(OPTDIR)%cvalue ) + else + CALL IO_FILE_ADD2LIST(outfiles(ji)%TFILE,filename,'MNH','WRITE', & + HFORMAT='NETCDF4') + end if CALL IO_FILE_OPEN(outfiles(ji)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) IF (options(OPTCOMPRESS)%set) THEN @@ -1184,7 +1330,7 @@ END DO outfiles(ji)%tfile%LNCREDUCE_FLOAT_PRECISION = .TRUE. END IF - status = NF90_SET_FILL(outfiles(ji)%TFILE%NNCID,NF90_NOFILL,omode) + status = NF90_SET_FILL(outfiles(ji)%TFILE%NNCID,NF90_NOFILL,ioldmode) if ( status /= NF90_NOERR ) call IO_Err_handle_nc4( status, 'OPEN_SPLIT_NCFILES_OUT', 'NF90_SET_FILL', '' ) END DO @@ -1243,7 +1389,7 @@ END DO !split_variable and other attributes were added in MesoNH > 5.4.2 ISTATUS = NF90_INQUIRE_ATTRIBUTE(IFILE_ID, KVAR_ID, 'split_variable', LEN=ILENG) IF (ISTATUS == NF90_NOERR) THEN - IF (GSPLIT_AT_ENTRY) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_GET_METADATA_NC4','split variable delcaration inside a split file') + IF (GSPLIT_AT_ENTRY) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Metadata_get_nc4','split variable delcaration inside a split file') ALLOCATE(CHARACTER(LEN=ILENG) :: YSPLIT) ISTATUS = NF90_GET_ATT(IFILE_ID, KVAR_ID, 'split_variable', YSPLIT) @@ -1253,7 +1399,7 @@ END DO ISTATUS = NF90_GET_ATT(IFILE_ID, KVAR_ID, 'ndims', TPREC%NDIMS_FILE) IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_GET_ATT', 'ndims' ) - IF ( TPREC%NDIMS_FILE/=3 ) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_GET_METADATA_NC4', & + IF ( TPREC%NDIMS_FILE/=3 ) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Metadata_get_nc4', & 'split variable with ndims/=3 not supported') ISTATUS = NF90_INQUIRE_ATTRIBUTE(IFILE_ID, KVAR_ID, 'time_dependent', LEN=ILENG) @@ -1267,7 +1413,7 @@ END DO ELSE IF ( YTIMEDEP == 'no' ) THEN TPREC%TFIELD%LTIMEDEP = .FALSE. ELSE - CALL PRINT_MSG(NVERB_WARNING,'IO','IO_GET_METADATA_NC4','unknown value '//trim(YTIMEDEP)// & + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Metadata_get_nc4','unknown value '//trim(YTIMEDEP)// & ' for time_dependent attribute' ) END IF @@ -1286,7 +1432,67 @@ END DO DEALLOCATE(YTIMEDEP) ELSE IF ( YSPLIT /= 'no' ) THEN - CALL PRINT_MSG(NVERB_WARNING,'IO','IO_GET_METADATA_NC4','unknown value '//trim(YSPLIT)//' for split_variable attribute' ) + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Metadata_get_nc4','unknown value '//trim(YSPLIT)//' for split_variable attribute' ) + END IF + + DEALLOCATE(YSPLIT) + END IF + + ISTATUS = NF90_GET_ATT(IFILE_ID,KVAR_ID,'grid',TPREC%NGRID_FILE) + !On MesoNH versions < 5.4.0, the grid number was stored in 'GRID' instead of 'grid' + IF (ISTATUS /= NF90_NOERR) ISTATUS = NF90_GET_ATT(IFILE_ID,KVAR_ID,'GRID',TPREC%NGRID_FILE) + IF (ISTATUS /= NF90_NOERR) TPREC%NGRID_FILE = 0 + + ISTATUS = NF90_GET_ATT(IFILE_ID,KVAR_ID,'units',TPREC%CUNITS_FILE) + IF (ISTATUS /= NF90_NOERR) TPREC%CUNITS_FILE = '' + + !split_variable and other attributes were added in MesoNH > 5.4.2 + ISTATUS = NF90_INQUIRE_ATTRIBUTE(IFILE_ID, KVAR_ID, 'split_variable', LEN=ILENG) + IF (ISTATUS == NF90_NOERR) THEN + IF (GSPLIT_AT_ENTRY) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Metadata_get_nc4','split variable declaration inside a split file') + + ALLOCATE(CHARACTER(LEN=ILENG) :: YSPLIT) + ISTATUS = NF90_GET_ATT(IFILE_ID, KVAR_ID, 'split_variable', YSPLIT) + IF (istatus /= NF90_NOERR) call IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_GET_ATT', 'split_variable' ) + IF ( YSPLIT == 'yes' ) then + TPREC%LSPLIT = .true. + + ISTATUS = NF90_GET_ATT(IFILE_ID, KVAR_ID, 'ndims', TPREC%NDIMS_FILE) + IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_GET_ATT', 'ndims' ) + IF ( TPREC%NDIMS_FILE/=3 ) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Metadata_get_nc4', & + 'split variable with ndims/=3 not supported') + + ISTATUS = NF90_INQUIRE_ATTRIBUTE(IFILE_ID, KVAR_ID, 'time_dependent', LEN=ILENG) + IF (istatus /= NF90_NOERR) & + CALL IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_INQUIRE_ATTRIBUTE', 'time_dependent' ) + ALLOCATE(CHARACTER(LEN=ILENG) :: YTIMEDEP) + ISTATUS = NF90_GET_ATT(IFILE_ID, KVAR_ID, 'time_dependent', YTIMEDEP) + IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_GET_ATT', 'time_dependent' ) + IF ( YTIMEDEP == 'yes' ) then + TPREC%TFIELD%LTIMEDEP = .TRUE. + ELSE IF ( YTIMEDEP == 'no' ) THEN + TPREC%TFIELD%LTIMEDEP = .FALSE. + ELSE + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Metadata_get_nc4','unknown value '//trim(YTIMEDEP)// & + ' for time_dependent attribute' ) + END IF + + ISTATUS = NF90_GET_ATT(IFILE_ID, KVAR_ID, 'split_nblocks', iblocks) + IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_GET_ATT', 'split_nblocks' ) + +!PW: todo:check tfiles_ioz exist + IFILE_ID = TPFILE%TFILES_IOZ(1)%TFILE%NNCID + + istatus = NF90_INQ_VARID(IFILE_ID,trim(TPREC%NAME)//'0001',ivar_id) + IF (ISTATUS /= NF90_NOERR) & + CALL IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_INQ_VARID', trim(TPREC%NAME)//'0001' ) + ISTATUS = NF90_INQUIRE_VARIABLE(IFILE_ID, IVAR_ID, DIMIDS = IDIMS_ID) + IF (ISTATUS /= NF90_NOERR) & + CALL IO_Err_handle_nc4( istatus, 'IO_Metadata_get_nc4', 'NF90_INQUIRE_VARIABLE', trim(TPREC%NAME)//'0001' ) + + DEALLOCATE(YTIMEDEP) + ELSE IF ( YSPLIT /= 'no' ) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Metadata_get_nc4','unknown value '//trim(YSPLIT)//' for split_variable attribute' ) END IF DEALLOCATE(YSPLIT) @@ -1345,7 +1551,7 @@ END DO IF (TPREC%LSPLIT) THEN IF( (.NOT.TPREC%TFIELD%LTIMEDEP .AND. TPREC%NDIMS_FILE/=2) & .OR. ( TPREC%TFIELD%LTIMEDEP .AND. TPREC%NDIMS_FILE/=3) ) & - CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GET_METADATA_NC4',trim(TPREC%NAME)//': split variables can only be 3D') + CALL PRINT_MSG(NVERB_FATAL,'IO','IO_Metadata_get_nc4',trim(TPREC%NAME)//': split variables can only be 3D') !Split variables are Z-split !Move time dimension to last (4th) position IF (TPREC%TFIELD%LTIMEDEP) THEN @@ -1369,7 +1575,7 @@ END DO if (TPREC%NGRID_FILE/=0 .and. iblocks/=NKMAX+2*JPVEXT) THEN !If size is not as expected, reset its name - CALL PRINT_MSG(NVERB_WARNING,'IO','IO_GET_METADATA_NC4',trim(TPREC%NAME)//': strange nblocks size') + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Metadata_get_nc4',trim(TPREC%NAME)//': strange nblocks size') TPREC%CDIMNAMES_FILE(3) = 'unknown' end if TPREC%NDIMSIZES_FILE(3) = iblocks diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index 3d37d58583d72d6e1377ac451d1a01c253d243b7..afd62237f12cfe0acf7f3e8eafb9917ed399c10c 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -818,6 +818,11 @@ CONTAINS CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_SEND=TIMEZ%T_WRIT3D_SEND + T1 - T0 ! + ! Write the variable attributes in the non-split file + ! + if ( tpfile%nmaster_rank==isp .and. gnc4 ) & + call IO_Write_field_header_split_nc4( tpfile, tpfield, size( pfield, 3 ) ) + ! ! write the data ! ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90 index fc766f55219d6ad3d9e8321af35156acf77878fc..f341a1a62868cb50663100c5d795cbb0f576a7fa 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_file.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_file.f90 @@ -36,6 +36,7 @@ ! P. Wautelet 01/03/2019: move open/close subroutines to mode_io_file.f90 ! P. Wautelet 05/03/2019: rename IO subroutines and modules ! P. Wautelet 12/03/2019: simplify opening of IO split files +! P. Wautelet 05/09/2019: disable IO_Coordvar_write_nc4 for Z-split files !----------------------------------------------------------------- module mode_io_file @@ -580,10 +581,12 @@ SELECT CASE(TPFILE%CTYPE) TZFILE_IOZ%NOPEN_CURRENT = 0 TZFILE_IOZ%NCLOSE = TZFILE_IOZ%NCLOSE + 1 #if defined(MNH_IOCDF4) - !Write coordinates variables in netCDF file - IF (TZFILE_IOZ%CMODE == 'WRITE' .AND. (TZFILE_IOZ%CFORMAT=='NETCDF4' .OR. TZFILE_IOZ%CFORMAT=='LFICDF4')) THEN - CALL IO_Coordvar_write_nc4(TZFILE_IOZ,HPROGRAM_ORIG=HPROGRAM_ORIG) - END IF +!Remark: IO_Coordvar_write_nc4 disabled (for the moment) for Z-split files +! because it introduce a serialization due to MPI communications inside the call +! !Write coordinates variables in netCDF file +! IF (TZFILE_IOZ%CMODE == 'WRITE' .AND. (TZFILE_IOZ%CFORMAT=='NETCDF4' .OR. TZFILE_IOZ%CFORMAT=='LFICDF4')) THEN +! CALL IO_Coordvar_write_nc4(TZFILE_IOZ,HPROGRAM_ORIG=HPROGRAM_ORIG) +! END IF #endif IF (TZFILE_IOZ%LMASTER) THEN if (tzfile_ioz%cformat == 'LFI' .or. tzfile_ioz%cformat == 'LFICDF4') call IO_File_close_lfi(tzfile_ioz,iresp) diff --git a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 index 746e5746e59b97bb174194ac81d125d22a6f9a1f..5a80880fa4e74e5bcee57266b095c9bead5d8e6e 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 @@ -16,6 +16,7 @@ ! P. Wautelet 10/01/2019: replace handle_err by IO_Err_handle_nc4 for better netCDF error messages ! P. Wautelet 05/03/2019: rename IO subroutines and modules ! P. Wautelet 07/03/2019: bugfix: io_set_mnhversion must be called by all the processes +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) ! !----------------------------------------------------------------- #if defined(MNH_IOCDF4) diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 index 74c69fbcf0a9f2d061d80c7e7d554c61dad7c846..75e142d20f6469336fb3ec89e106d833b43b13aa 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 @@ -12,6 +12,7 @@ ! P. Wautelet 21/02/2019: bugfix: intent of read fields: OUT->INOUT to keep initial value if not found in file ! P. Wautelet 05/03/2019: rename IO subroutines and modules ! P. Wautelet 25/06/2019: added IO_Field_read for 3D integer arrays (IO_Field_read_nc4_N3) +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) !----------------------------------------------------------------- #if defined(MNH_IOCDF4) module mode_io_read_nc4 @@ -59,9 +60,9 @@ INTEGER, INTENT(OUT) :: KRESP ! return-code CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HCALENDAR ! INTEGER :: IERRLEVEL -INTEGER :: ILEN INTEGER :: IGRID INTEGER(KIND=CDFINT) :: INCID +INTEGER(KIND=CDFINT) :: ILEN INTEGER(KIND=CDFINT) :: STATUS CHARACTER(LEN=12) :: YVAL_FILE, YVAL_MEM CHARACTER(LEN=:),ALLOCATABLE :: YVALUE diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 index b4d2a3d5fd80491940d3e6e0bb281ef086894af0..fb0eb161c7c708bd1df9dd04fe59bafb88b61eb7 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 @@ -7,6 +7,8 @@ ! P. Wautelet 13/12/2018: extracted from mode_io.f90 ! P. Wautelet 14/12/2018: added IO_Filename_construct ! P. Wautelet 05/03/2019: rename IO subroutines and modules +! P. Wautelet 05/09/2019: io_get_mnhversion: Z-split files: to prevent serialization between files, +! nmnhversion is taken from the main file !----------------------------------------------------------------- module mode_io_tools @@ -117,70 +119,76 @@ subroutine IO_Mnhversion_get(tpfile) if ( trim(tpfile%cmode) /= 'READ' ) & call print_msg(NVERB_FATAL,'IO','IO_Mnhversion_get',trim(tpfile%cname)// 'not opened in read mode') - imnhversion(:) = 0 - !use tzfield because tfieldlist could be not initialised - tzfield%cmnhname = 'MNHVERSION' - tzfield%cstdname = '' - tzfield%clongname = 'MesoNH version' - tzfield%cunits = '' - tzfield%cdir = '--' - tzfield%ccomment = '' - tzfield%ngrid = 0 - tzfield%ntype = TYPEINT - tzfield%ndims = 1 - tzfield%ltimedep = .false. - call IO_Field_read(tpfile,tzfield,imnhversion,iresp) - if (iresp/=0) then - tzfield%cmnhname = 'MASDEV' - tzfield%clongname = 'MesoNH version (without bugfix)' - tzfield%ndims = 0 - call IO_Field_read(tpfile,tzfield,imasdev,iresp) + if ( .not. associated( tpfile%tmainfile ) ) then + imnhversion(:) = 0 + !use tzfield because tfieldlist could be not initialised + tzfield%cmnhname = 'MNHVERSION' + tzfield%cstdname = '' + tzfield%clongname = 'MesoNH version' + tzfield%cunits = '' + tzfield%cdir = '--' + tzfield%ccomment = '' + tzfield%ngrid = 0 + tzfield%ntype = TYPEINT + tzfield%ndims = 1 + tzfield%ltimedep = .false. + call IO_Field_read(tpfile,tzfield,imnhversion,iresp) if (iresp/=0) then - call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','unknown MASDEV version for '//trim(tpfile%cname)) - else - if (imasdev<100) then - imnhversion(1)=imasdev/10 - imnhversion(2)=mod(imasdev,10) - else !for example for mnh 4.10 - imnhversion(1)=imasdev/100 - imnhversion(2)=mod(imasdev,100) + tzfield%cmnhname = 'MASDEV' + tzfield%clongname = 'MesoNH version (without bugfix)' + tzfield%ndims = 0 + call IO_Field_read(tpfile,tzfield,imasdev,iresp) + if (iresp/=0) then + call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','unknown MASDEV version for '//trim(tpfile%cname)) + else + if (imasdev<100) then + imnhversion(1)=imasdev/10 + imnhversion(2)=mod(imasdev,10) + else !for example for mnh 4.10 + imnhversion(1)=imasdev/100 + imnhversion(2)=mod(imasdev,100) + end if + end if + ! + tzfield%cmnhname = 'BUGFIX' + tzfield%clongname = 'MesoNH bugfix number' + call IO_Field_read(tpfile,tzfield,ibugfix,iresp) + if (iresp/=0) then + call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','unknown BUGFIX version for '//trim(tpfile%cname)) + else + imnhversion(3)=ibugfix end if end if ! - tzfield%cmnhname = 'BUGFIX' - tzfield%clongname = 'MesoNH bugfix number' - call IO_Field_read(tpfile,tzfield,ibugfix,iresp) - if (iresp/=0) then - call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','unknown BUGFIX version for '//trim(tpfile%cname)) - else - imnhversion(3)=ibugfix - end if - end if - ! - write(ymnhversion_file,"( I0,'.',I0,'.',I0 )" ) imnhversion(1),imnhversion(2),imnhversion(3) - write(ymnhversion_curr,"( I0,'.',I0,'.',I0 )" ) nmnhversion(1),nmnhversion(2),nmnhversion(3) - ! - if ( imnhversion(1)==0 .and. imnhversion(2)==0 .and. imnhversion(3)==0 ) then - call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& - ' was written with an unknown version of MesoNH') - else if ( imnhversion(1)< nmnhversion(1) .or. & - (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)< nmnhversion(2)) .or. & - (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)==nmnhversion(2) .and. imnhversion(3)<nmnhversion(3)) ) then - call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& - ' was written with an older version of MesoNH ('//trim(ymnhversion_file)//& - ' instead of '//trim(ymnhversion_curr)//')') - else if ( imnhversion(1)> nmnhversion(1) .or. & - (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)> nmnhversion(2)) .or. & - (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)==nmnhversion(2) .and. imnhversion(3)>nmnhversion(3)) ) then - call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& - ' was written with a more recent version of MesoNH ('//trim(ymnhversion_file)//& - ' instead of '//trim(ymnhversion_curr)//')') - else - call print_msg(NVERB_DEBUG,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& - ' was written with the same version of MesoNH ('//trim(ymnhversion_curr)//')') - end if + write(ymnhversion_file,"( I0,'.',I0,'.',I0 )" ) imnhversion(1),imnhversion(2),imnhversion(3) + write(ymnhversion_curr,"( I0,'.',I0,'.',I0 )" ) nmnhversion(1),nmnhversion(2),nmnhversion(3) ! - tpfile%nmnhversion(:) = imnhversion(:) + if ( imnhversion(1)==0 .and. imnhversion(2)==0 .and. imnhversion(3)==0 ) then + call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& + ' was written with an unknown version of MesoNH') + else if ( imnhversion(1)< nmnhversion(1) .or. & + (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)< nmnhversion(2)) .or. & + (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)==nmnhversion(2) .and. imnhversion(3)<nmnhversion(3)) ) then + call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& + ' was written with an older version of MesoNH ('//trim(ymnhversion_file)//& + ' instead of '//trim(ymnhversion_curr)//')') + else if ( imnhversion(1)> nmnhversion(1) .or. & + (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)> nmnhversion(2)) .or. & + (imnhversion(1)==nmnhversion(1) .and. imnhversion(2)==nmnhversion(2) .and. imnhversion(3)>nmnhversion(3)) ) then + call print_msg(NVERB_WARNING,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& + ' was written with a more recent version of MesoNH ('//trim(ymnhversion_file)//& + ' instead of '//trim(ymnhversion_curr)//')') + else + call print_msg(NVERB_DEBUG,'IO','IO_Mnhversion_get','file '//trim(tpfile%cname)//& + ' was written with the same version of MesoNH ('//trim(ymnhversion_curr)//')') + end if + ! + tpfile%nmnhversion(:) = imnhversion(:) + else ! associated( tpfile%tmainfile ) + if ( .not. tpfile%tmainfile%lopened ) & + call Print_msg( NVERB_FATAL, 'IO', 'IO_Mnhversion_get', 'tmainfile should be opened' ) + tpfile%nmnhversion(:) = tpfile%tmainfile%nmnhversion(:) + end if end subroutine IO_Mnhversion_get diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 21734960714a0e90b1f0376525c179b08705d1a0..2be340eafd509639e7f2385f1c2f05f543e666ab 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -10,6 +10,7 @@ ! P. Wautelet 13/12/2018: split of mode_netcdf into multiple modules/files ! P. Wautelet 10/01/2019: replace handle_err by IO_Err_handle_nc4 for better netCDF error messages ! P. Wautelet 05/03/2019: rename IO subroutines and modules +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) !----------------------------------------------------------------- #if defined(MNH_IOCDF4) module mode_io_tools_nc4 @@ -78,7 +79,7 @@ TYPE(DIMCDF),DIMENSION(:), INTENT(OUT) :: TPDIMS INTEGER, INTENT(OUT) :: KRESP ! INTEGER :: IGRID -INTEGER :: ILEN, ISIZE +INTEGER(kind=CDFINT) :: ILEN, ISIZE INTEGER :: JI CHARACTER(LEN=32) :: YINT CHARACTER(LEN=2) :: YDIR @@ -112,7 +113,7 @@ IF (IGRID==0) THEN ILEN = 1 END IF CASE (1) - PTDIM => IO_Dimcdf_get_nc4(TPFILE,KLEN) + PTDIM => IO_Dimcdf_get_nc4(TPFILE, int( KLEN, kind=CDFINT ) ) TPDIMS(1) = PTDIM ILEN = PTDIM%LEN CASE DEFAULT @@ -165,7 +166,7 @@ ELSE ELSE IF ( YDIR == 'ZZ' ) THEN PTDIM => TPFILE%TNCCOORDS(3,IGRID)%TDIM ELSE IF (JI==TPFIELD%NDIMS) THEN !Guess last dimension - PTDIM => IO_Dimcdf_get_nc4(TPFILE, KLEN) + PTDIM => IO_Dimcdf_get_nc4(TPFILE, int( KLEN, kind=CDFINT ) ) END IF ILEN = PTDIM%LEN TPDIMS(JI) = PTDIM @@ -263,16 +264,16 @@ IIU_ll = NIMAX_ll + 2*JPHEXT IJU_ll = NJMAX_ll + 2*JPHEXT IKU = NKMAX + 2*JPVEXT -IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI)) PIOCDF%DIM_NI => IO_Dimcdf_get_nc4(TPFILE, IIU_ll, 'ni') -IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ)) PIOCDF%DIM_NJ => IO_Dimcdf_get_nc4(TPFILE, IJU_ll, 'nj') -IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI_U)) PIOCDF%DIM_NI_U => IO_Dimcdf_get_nc4(TPFILE, IIU_ll, 'ni_u') -IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ_U)) PIOCDF%DIM_NJ_U => IO_Dimcdf_get_nc4(TPFILE, IJU_ll, 'nj_u') -IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI_V)) PIOCDF%DIM_NI_V => IO_Dimcdf_get_nc4(TPFILE, IIU_ll, 'ni_v') -IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ_V)) PIOCDF%DIM_NJ_V => IO_Dimcdf_get_nc4(TPFILE, IJU_ll, 'nj_v') +IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI)) PIOCDF%DIM_NI => IO_Dimcdf_get_nc4(TPFILE, int( IIU_ll, kind=CDFINT ), 'ni') +IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ)) PIOCDF%DIM_NJ => IO_Dimcdf_get_nc4(TPFILE, int( IJU_ll, kind=CDFINT ), 'nj') +IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI_U)) PIOCDF%DIM_NI_U => IO_Dimcdf_get_nc4(TPFILE, int( IIU_ll, kind=CDFINT ), 'ni_u') +IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ_U)) PIOCDF%DIM_NJ_U => IO_Dimcdf_get_nc4(TPFILE, int( IJU_ll, kind=CDFINT ), 'nj_u') +IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI_V)) PIOCDF%DIM_NI_V => IO_Dimcdf_get_nc4(TPFILE, int( IIU_ll, kind=CDFINT ), 'ni_v') +IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ_V)) PIOCDF%DIM_NJ_V => IO_Dimcdf_get_nc4(TPFILE, int( IJU_ll, kind=CDFINT ), 'nj_v') IF (TRIM(YPROGRAM)/='PGD' .AND. TRIM(YPROGRAM)/='NESPGD' .AND. TRIM(YPROGRAM)/='ZOOMPG' & .AND. .NOT.(TRIM(YPROGRAM)=='REAL' .AND. CSTORAGE_TYPE=='SU') ) THEN !condition to detect PREP_SURFEX - IF (.NOT. ASSOCIATED(PIOCDF%DIM_LEVEL)) PIOCDF%DIM_LEVEL => IO_Dimcdf_get_nc4(TPFILE, IKU , 'level') - IF (.NOT. ASSOCIATED(PIOCDF%DIM_LEVEL_W)) PIOCDF%DIM_LEVEL_W => IO_Dimcdf_get_nc4(TPFILE, IKU , 'level_w') + IF (.NOT. ASSOCIATED(PIOCDF%DIM_LEVEL)) PIOCDF%DIM_LEVEL => IO_Dimcdf_get_nc4(TPFILE, int( IKU, kind=CDFINT ), 'level') + IF (.NOT. ASSOCIATED(PIOCDF%DIM_LEVEL_W)) PIOCDF%DIM_LEVEL_W => IO_Dimcdf_get_nc4(TPFILE, int( IKU, kind=CDFINT ), 'level_w') IF (.NOT. ASSOCIATED(PIOCDF%DIMTIME)) PIOCDF%DIMTIME => IO_Dimcdf_get_nc4(TPFILE, NF90_UNLIMITED, 'time') ELSE !PGD and SURFEX files for MesoNH have no vertical levels or time scale diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index aff7f36a2a0f708223db3bca817a6bd02b0e33c2..34eebc5adef4e993658ae2cbc7dcd0f27b164250 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -12,6 +12,8 @@ ! P. Wautelet 11/01/2019: NVERB_INFO->NVERB_WARNING for zero size fields ! P. Wautelet 01/02/2019: IO_Coordvar_write_nc4: bug: use of non-associated pointers (PIOCDF%DIM_Nx_y) ! P. Wautelet 05/03/2019: rename IO subroutines and modules +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) +! P. Wautelet 19/09/2019: temporary workaround for netCDF bug if MNH_INT=8 (if netCDF fortran < 4.4.5) !----------------------------------------------------------------- #if defined(MNH_IOCDF4) module mode_io_write_nc4 @@ -286,10 +288,14 @@ IF(TPFIELD%NTYPE==TYPEINT .AND. TPFIELD%NDIMS>0) THEN ! Remarks: * the attribute '_FillValue' is also recognized by the netCDF library ! and is used when pre-filling a variable ! * it cannot be modified if some data has already been written (->check OEXISTED) +#if ( MNH_INT == 4 ) +!BUG: NF90_PUT_ATT does not work for NF90_INT64 and _FillValue attribute if netCDF-fortran version < 4.4.5 (bug in netCDF) +! (see https://github.com/Unidata/netcdf-fortran/issues/62) IF(.NOT.OEXISTED) THEN STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', TPFIELD%NFILLVALUE) IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_attr_write_nc4','NF90_PUT_ATT','_FillValue') END IF +#endif ! ! Valid_min/max (CF/COMODO convention) STATUS = NF90_PUT_ATT(INCID, KVARID,'valid_min', TPFIELD%NVALIDMIN) @@ -2009,6 +2015,7 @@ INTEGER,PARAMETER :: YEAR=1, MONTH=2, DAY=3, HH=5, MM=6, SS=7 CHARACTER(len=5) :: YZONE CHARACTER(LEN=:),ALLOCATABLE :: YCMD, YHISTORY, YHISTORY_NEW, YHISTORY_PREV INTEGER :: ILEN_CMD, ILEN_PREV +INTEGER(KIND=CDFINT) :: ILEN_NC INTEGER(KIND=CDFINT) :: ISTATUS INTEGER,DIMENSION(8) :: IDATETIME ! @@ -2018,7 +2025,8 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_History_append_nc4','called for file '//TRIM ! IF (TPFILE%LMASTER) THEN !Check if history attribute already exists in file and read it - ISTATUS = NF90_INQUIRE_ATTRIBUTE(TPFILE%NNCID, NF90_GLOBAL, 'history', LEN=ILEN_PREV) + ISTATUS = NF90_INQUIRE_ATTRIBUTE(TPFILE%NNCID, NF90_GLOBAL, 'history', LEN=ILEN_NC) + ILEN_PREV = int( ILEN_NC, kind=kind(ILEN_PREV) ) IF (ISTATUS == NF90_NOERR) THEN ALLOCATE(CHARACTER(LEN=ILEN_PREV) :: YHISTORY_PREV) ISTATUS = NF90_GET_ATT(TPFILE%NNCID, NF90_GLOBAL, 'history', YHISTORY_PREV) diff --git a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 index 67ef014021be97382819f8df9f4d05f06ab1329a..b10e2eea94b404e947df4e57f4a9c5ac5240c8b4 100644 --- a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 +++ b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 @@ -3,13 +3,12 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!! MODIFICATIONS -!! ------------- -!! -!! J.Escobar 3/12/2014 : typo form -> from -!! Philippe 03/10/2017: set IP and NPROC in INIT_NMNH_COMM_WORLD -!! Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN -!! +! Modifications: +! J. Escobar 03/12/2014: typo form -> from +! P. Wautelet 03/10/2017: set IP and NPROC in INIT_NMNH_COMM_WORLD +! P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN +! P. Wautelet 21/11/2019: bugfix: close call could be done on a non-opened file +!----------------------------------------------------------------- MODULE MODE_MNH_WORLD IMPLICIT NONE CHARACTER(len=*), parameter :: conf_mnh_world="conf_mnh_world.nam" @@ -69,8 +68,8 @@ CONTAINS IF (IERR.EQ.0) THEN READ(unit=ilu,NML=NAM_CONF_MNH_WORLD) WRITE(*,NAM_CONF_MNH_WORLD) + CLOSE(unit=ILU) ENDIF - CLOSE(unit=ILU) ENDIF iroot = 0 ! Brodcast mapping diff --git a/src/MNH/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90 index 8afdb41aefd43f6996f8a5c7a00afc6665930c81..55b5db9c4bf12ca54f13e17b2b6cdec2357bd3db 100644 --- a/src/MNH/flash_geom_elec.f90 +++ b/src/MNH/flash_geom_elec.f90 @@ -100,6 +100,7 @@ END MODULE MODI_FLASH_GEOM_ELEC_n ! P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 8dff6ecf1f14745011b8847db13127b708aea57a..5f82142249a0613864b7cbf2feabde6638a214a6 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -746,16 +746,16 @@ PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB) ! IF (LDIAG_IN_RUN) THEN ! + XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) + XCURRENT_DSTAOD(:,:)=0.0 + XCURRENT_SLTAOD(:,:)=0.0 + IF (CRAD=='ECMW') THEN XCURRENT_LWD (:,:) = XFLALWD(:,:) XCURRENT_SWD (:,:) = SUM(XDIRSRFSWD(:,:,:)+XSCAFLASWD(:,:,:),DIM=3) XCURRENT_LWU (:,:) = XLWU(:,:,IKB) XCURRENT_SWU (:,:) = XSWU(:,:,IKB) XCURRENT_SWDIR(:,:) = SUM(XDIRSRFSWD,DIM=3) XCURRENT_SWDIFF(:,:) = SUM(XSCAFLASWD(:,:,:),DIM=3) - XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) - XCURRENT_DSTAOD(:,:)=0.0 - XCURRENT_SLTAOD(:,:)=0.0 - IF (CRAD=='ECMW') THEN DO JK=IKB,IKE IKRAD = JK - 1 DO JJ=IJB,IJE diff --git a/src/MNH/ini_cpl.f90 b/src/MNH/ini_cpl.f90 index b1ef0fa5227f135a57e4ecc88faa0b7b6d47a1f5..0646747bacba903a0b9d57db46473508237d4a84 100644 --- a/src/MNH/ini_cpl.f90 +++ b/src/MNH/ini_cpl.f90 @@ -213,6 +213,8 @@ END MODULE MODI_INI_CPL !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +!! Q.Rodier 09/2019 add missing abort if coupling files date not ordered +!! or before date of the segment !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -372,6 +374,7 @@ DO JCI=1,NCPL_NBR YTITLE='CURRENT DATE AND TIME OF THE FILE'//YCI CALL SM_PRINT_TIME(TDTCPL(JCI),TLUOUT,YTITLE) GSKIP(JCI)=.TRUE. ! flag to skip after this coupling file + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_CPL','') ELSE NCPL_TIMES(JCI,1) = NINT( ZDIST / PTSTEP ) + 2 END IF @@ -388,7 +391,8 @@ DO JCI=1,NCPL_NBR WRITE(YCI,'(I2.0)') JCI-1 YTITLE='CURRENT DATE AND TIME OF THE FILE'//YCI CALL SM_PRINT_TIME(TDTCPL(JCI-1),TLUOUT,YTITLE) - GEND=.TRUE. ! error flag set to true + GEND=.TRUE. ! error flag set to true + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_CPL','') END IF ! END IF diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 3d8f085963fea14de3ebad7877b4d984f42e2f2c..0c099b7fbd6bcd5ae0243e75412d060eb4bfdbeb 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -191,6 +191,8 @@ ALLOCATE(TSTATION%GFLUX (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%LEI (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%SWD (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%SWU (ISTORE,NUMBSTAT)) +ALLOCATE(TSTATION%SWDIR (ISTORE,NUMBSTAT)) +ALLOCATE(TSTATION%SWDIFF (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%LWD (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%LWU (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%DSTAOD (ISTORE,NUMBSTAT)) @@ -220,6 +222,8 @@ TSTATION%GFLUX = XUNDEF TSTATION%LEI = XUNDEF TSTATION%SWD = XUNDEF TSTATION%SWU = XUNDEF +TSTATION%SWDIR = XUNDEF +TSTATION%SWDIFF = XUNDEF TSTATION%LWD = XUNDEF TSTATION%LWU = XUNDEF TSTATION%DSTAOD = XUNDEF diff --git a/src/MNH/modd_sub_modeln.f90 b/src/MNH/modd_sub_modeln.f90 index 326de827d4e9ad98b76d86c68b05b290806bfd80..5f08f0b0258c454e3cd8859f056519ef024d4945 100644 --- a/src/MNH/modd_sub_modeln.f90 +++ b/src/MNH/modd_sub_modeln.f90 @@ -50,7 +50,7 @@ TYPE SUB_MODEL_t REAL(kind=MNHTIME), DIMENSION(2) :: XT_TURB, XT_2WAY, XT_SHADOWS REAL(kind=MNHTIME), DIMENSION(2) :: XT_FORCING, XT_NUDGING, XT_CHEM - REAL, DIMENSION(:,:,:), POINTER :: ZWT_ACT_NUC=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XWT_ACT_NUC=>NULL() ! Vertical motion used for ACTivation/NUCleation LOGICAL, DIMENSION(:,:), POINTER :: GMASKkids=>NULL() ! kids domains mask @@ -79,7 +79,7 @@ REAL(kind=MNHTIME), DIMENSION(:), POINTER :: XT_COUPL=>NULL(), XT_1WAY=>NULL(), REAL(kind=MNHTIME), DIMENSION(:), POINTER :: XT_RAD=>NULL(), XT_DCONV=>NULL(), XT_GROUND=>NULL(), XT_MAFL=>NULL() REAL(kind=MNHTIME), DIMENSION(:), POINTER :: XT_TURB=>NULL(), XT_2WAY=>NULL(), XT_TRACER=>NULL() REAL(kind=MNHTIME), DIMENSION(:), POINTER :: XT_FORCING=>NULL(), XT_NUDGING=>NULL(), XT_CHEM=>NULL() -REAL, DIMENSION(:,:,:), POINTER :: ZWT_ACT_NUC=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XWT_ACT_NUC=>NULL() LOGICAL, DIMENSION(:,:), POINTER :: GMASKkids=>NULL() LOGICAL, POINTER :: GCLOSE_OUT=>NULL() @@ -101,7 +101,7 @@ SUB_MODEL_MODEL(KFROM)%TLSHALO2_ll=>TLSHALO2_ll SUB_MODEL_MODEL(KFROM)%THALO2T_ll=>THALO2T_ll SUB_MODEL_MODEL(KFROM)%THALO2MT_ll=>THALO2MT_ll SUB_MODEL_MODEL(KFROM)%THALO2SC_ll=>THALO2SC_ll -SUB_MODEL_MODEL(KFROM)%ZWT_ACT_NUC=>ZWT_ACT_NUC +SUB_MODEL_MODEL(KFROM)%XWT_ACT_NUC=>XWT_ACT_NUC SUB_MODEL_MODEL(KFROM)%GMASKkids=>GMASKkids ! ! Current model is set to model KTO @@ -154,7 +154,7 @@ XT_SHADOWS=>SUB_MODEL_MODEL(KTO)%XT_SHADOWS XT_FORCING=>SUB_MODEL_MODEL(KTO)%XT_FORCING XT_NUDGING=>SUB_MODEL_MODEL(KTO)%XT_NUDGING XT_CHEM=>SUB_MODEL_MODEL(KTO)%XT_CHEM -ZWT_ACT_NUC=>SUB_MODEL_MODEL(KTO)%ZWT_ACT_NUC +XWT_ACT_NUC=>SUB_MODEL_MODEL(KTO)%XWT_ACT_NUC GMASKkids=>SUB_MODEL_MODEL(KTO)%GMASKkids GCLOSE_OUT=>SUB_MODEL_MODEL(KTO)%GCLOSE_OUT diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 3608bf11b5777a9bbe63251cb778b0983fcff5e9..9891704116ea8edbdd1ae21ad5525f0977e7da26 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -264,6 +264,7 @@ END MODULE MODI_MODEL_n ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! J. Escobar 09/07/2019: norme Doctor -> Rename Module Type variable TZ -> T ! J. Escobar 09/07/2019: for bug in management of XLSZWSM variable, add/use specific 2D TLSFIELD2D_ll pointer +! J. Escobar 27/09/2019: add missing report timing of RESOLVED_ELEC !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -598,7 +599,7 @@ IF (KTCOUNT == 1) THEN NULLIFY(TLSHALO2_ll) NULLIFY(TFIELDSC_ll) ! - ALLOCATE(ZWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3))) + ALLOCATE(XWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3))) ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2))) ! ! initialization of the FM file backup/output number @@ -1734,19 +1735,19 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'C3R5' & .OR. CCLOUD == "LIMA" ) THEN IF ( LFORCING ) THEN - ZWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWTFRC(:,:,:) + XWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWTFRC(:,:,:) ELSE - ZWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWT_ACT_NUC(:,:,:) = XWT(:,:,:) END IF IF (CTURB /= 'NONE' ) THEN IF ( ((CCLOUD=='C2R2'.OR.CCLOUD=='KHKO').AND.LACTTKE) .OR. (CCLOUD=='LIMA'.AND.MACTTKE) ) THEN - ZWT_ACT_NUC(:,:,:) = ZWT_ACT_NUC(:,:,:) + (2./3. * XTKET(:,:,:))**0.5 + XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) + (2./3. * XTKET(:,:,:))**0.5 ELSE - ZWT_ACT_NUC(:,:,:) = ZWT_ACT_NUC(:,:,:) + XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) ENDIF ENDIF ELSE - ZWT_ACT_NUC(:,:,:) = 0. + XWT_ACT_NUC(:,:,:) = 0. END IF ! XRTHS_CLD = XRTHS @@ -1764,7 +1765,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN GCLOSE_OUT, LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP, & XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABSM, ZWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & + XPABSM, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & XSVT, XRSVS, & XSRCT, XCLDFR,XCIT, & LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & @@ -1782,7 +1783,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN GCLOSE_OUT, LSUBG_COND,LSIGMAS,CSUBG_AUCV, & XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABSM, ZWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & + XPABSM, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & XSVT, XRSVS, & XSRCT, XCLDFR,XCIT, & LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & @@ -1842,7 +1843,7 @@ XTIME_BU_PROCESS = 0. XTIME_LES_BU_PROCESS = 0. ! IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN - ZWT_ACT_NUC(:,:,:) = 0. + XWT_ACT_NUC(:,:,:) = 0. ! XRTHS_CLD = XRTHS XRRS_CLD = XRRS @@ -2145,6 +2146,7 @@ IF (OEXIT) THEN CALL TIME_STAT_ll(TIMEZ%T_MAP_SX_YP2_ZP1_B,ZTOT, ' REMAP FFTXZ-1=>B ' ,'-','F') ! JUAN P1/P2 CALL TIME_STAT_ll(XT_CLOUD,ZTOT, ' RESOLVED_CLOUD','=') + CALL TIME_STAT_ll(XT_ELEC,ZTOT, ' RESOLVED_ELEC','=') CALL TIME_STAT_ll(XT_HALO,ZTOT, ' EXCHANGE_HALO','=') CALL TIME_STAT_ll(XT_STEP_SWA,ZTOT, ' ENDSTEP','=') CALL TIME_STAT_ll(XT_STEP_BUD,ZTOT, ' BUDGETS','=') @@ -2157,8 +2159,8 @@ IF (OEXIT) THEN XT_ADV + XT_FORCING + XT_NUDGING + XT_SOURCES + XT_DIFF + & XT_ADVUVW + XT_GRAV + & XT_RELAX+ XT_PARAM + XT_COUPL + XT_RAD_BOUND+XT_PRESS + & - XT_CLOUD+ XT_HALO + XT_SPECTRA + XT_STEP_SWA +XT_STEP_MISC+ & - XT_STEP_BUD + XT_CLOUD+ XT_ELEC + XT_HALO + XT_SPECTRA + XT_STEP_SWA + & + XT_STEP_MISC+ XT_STEP_BUD CALL TIME_STAT_ll(ZALL,ZTOT, ' SUM(CALL)','=') CALL TIMING_SEPARATOR('=') ! diff --git a/src/MNH/paspol.f90 b/src/MNH/paspol.f90 index 3bdc1e191584b6d285e58cc196337271d0ccebe2..1a2146b66e5f3b71efebaed0305508bf6888b345 100644 --- a/src/MNH/paspol.f90 +++ b/src/MNH/paspol.f90 @@ -61,6 +61,7 @@ END MODULE MODI_PASPOL !! P.Wautelet 28/03/2018 Replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! Q. Rodier 09/2019: correction for the emission if restart ! -------------------------------------------------------------------------- ! !! EXTERNAL @@ -528,7 +529,7 @@ DO JSV=1,NSV_PP ! ! - IF (.NOT.GBEGEMIS(JSV)) THEN + IF (.NOT.GBEGEMIS(JSV) .AND. CCONF=='START') THEN XRSVS(:,:,:,IP) = XRSVS(:,:,:,IP) & +XRHODJ(:,:,:)*XSVT(:,:,:,IP)/PTSTEP GBEGEMIS(JSV)= .TRUE. diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index bedad9ddef9e7eac9f877bc31387c3100c1ef29e..802fa044c109bacd947149d054a572142a021f8e 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -235,6 +235,7 @@ END MODULE MODI_PHYS_PARAM_n ! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 21/11/2019: ZRG_HOUR and ZRAT_HOUR are now parameter arrays !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -379,19 +380,19 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Atmospheric density and Exner REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMF ! MF contribution to XSIGS ! -REAL, DIMENSION(0:24) :: ZRG_HOUR = (/ 0., 0., 0., 0., 0., 32.04, 114.19, & - 228.01, 351.25, 465.49, 557.24, & - 616.82, 638.33, 619.43, 566.56, & - 474.71, 359.20, 230.87, 115.72, & - 32.48, 0., 0., 0., 0., 0. /) -! -REAL, DIMENSION(0:24) :: ZRAT_HOUR = (/ 326.00, 325.93, 325.12, 324.41, & - 323.16, 321.95, 322.51, 325.16, & - 328.01, 331.46, 335.58, 340.00, & - 345.20, 350.32, 354.20, 356.58, & - 356.56, 355.33, 352.79, 351.34, & - 347.00, 342.00, 337.00, 332.00, & - 326.00 /) +REAL, DIMENSION(0:24), parameter :: ZRG_HOUR = (/ 0., 0., 0., 0., 0., 32.04, 114.19, & + 228.01, 351.25, 465.49, 557.24, & + 616.82, 638.33, 619.43, 566.56, & + 474.71, 359.20, 230.87, 115.72, & + 32.48, 0., 0., 0., 0., 0. /) +! +REAL, DIMENSION(0:24), parameter :: ZRAT_HOUR = (/ 326.00, 325.93, 325.12, 324.41, & + 323.16, 321.95, 322.51, 325.16, & + 328.01, 331.46, 335.58, 340.00, & + 345.20, 350.32, 354.20, 356.58, & + 356.56, 355.33, 352.79, 351.34, & + 347.00, 342.00, 337.00, 332.00, & + 326.00 /) ! ! character(len=6) :: ynum diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index a463a4ad712b60b1a0dfabcc444ed12fe91e4b55..5dd11eb7cd32600a396f73ede6404a4a511a52c3 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -115,7 +115,7 @@ USE MODI_RADAR_RAIN_ICE USE MODI_LIDAR USE MODI_WATER_SUM USE MODI_GPS_ZENITH_GRID -USE MODD_PARAM_n, ONLY : CCLOUD +USE MODD_PARAM_n, ONLY : CCLOUD,CRAD ! ! IMPLICIT NONE @@ -538,10 +538,12 @@ IF (GSTORE) THEN TPROFILER%LE (IN,I) = PROFILER_INTERP_2D(XCURRENT_LE ) TPROFILER%LEI (IN,I) = PROFILER_INTERP_2D(XCURRENT_LEI ) TPROFILER%GFLUX (IN,I) = PROFILER_INTERP_2D(XCURRENT_GFLUX ) + IF (CRAD /= 'NONE') THEN TPROFILER%SWD (IN,I) = PROFILER_INTERP_2D(XCURRENT_SWD ) TPROFILER%SWU (IN,I) = PROFILER_INTERP_2D(XCURRENT_SWU ) TPROFILER%LWD (IN,I) = PROFILER_INTERP_2D(XCURRENT_LWD ) TPROFILER%LWU (IN,I) = PROFILER_INTERP_2D(XCURRENT_LWU ) + END IF TPROFILER%TKE_DISS(IN,:,I) = PROFILER_INTERP(XCURRENT_TKE_DISS) ENDIF ENDIF @@ -570,10 +572,12 @@ IF (GSTORE) THEN CALL DISTRIBUTE_PROFILER(TPROFILER%LE (IN,I)) CALL DISTRIBUTE_PROFILER(TPROFILER%LEI (IN,I)) CALL DISTRIBUTE_PROFILER(TPROFILER%GFLUX (IN,I)) + IF (CRAD /= 'NONE') THEN CALL DISTRIBUTE_PROFILER(TPROFILER%LWD (IN,I)) CALL DISTRIBUTE_PROFILER(TPROFILER%LWU (IN,I)) CALL DISTRIBUTE_PROFILER(TPROFILER%SWD (IN,I)) CALL DISTRIBUTE_PROFILER(TPROFILER%SWU (IN,I)) + ENDIF ENDIF DO JK=1,IKU CALL DISTRIBUTE_PROFILER(TPROFILER%ZON (IN,JK,I)) diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index 23d5a06c51b12c89c3b16d9c55cd4ed8c6ced3ac..2db97b874fe104915f2b3655a456b9e734f3a40d 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -905,7 +905,7 @@ IF( IMICRO >= 0 ) THEN DEALLOCATE(ZPRES) DEALLOCATE(ZRHODREF) DEALLOCATE(ZZT) - DEALLOCATE(ZRHODJ) + IF(LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) DEALLOCATE(ZRHODJ) DEALLOCATE(ZTHS) DEALLOCATE(ZTHT) DEALLOCATE(ZTHLT) diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index 6ff7014b90c5d416e45fa2a60cda6fe5b8aaf16e..a8178a0be6fb189500b2977c055ecec45d8db4fe 100644 --- a/src/MNH/read_all_data_grib_case.f90 +++ b/src/MNH/read_all_data_grib_case.f90 @@ -131,6 +131,7 @@ END MODULE MODI_READ_ALL_DATA_GRIB_CASE !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 14/03/2019: correct ZWS when variable not present in file ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! Q. Rodier 16/09/2019: switch of GRIB number ID for Orograpgy in ARPEGE/AROME in EPyGrAM !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -516,7 +517,7 @@ SELECT CASE (IMODEL) WRITE (ILUOUT0,'(A)')'Orography is missing - abort' ENDIF CASE(6,7) ! arpege and arome GRIB2 - CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=5) + CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=4) IF(INUM_ZS < 0) THEN WRITE (ILUOUT0,'(A)')'Orography is missing - abort' ENDIF diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90 index b5e9923162403a4345ae638acf393c5419d115fa..dcfe7b1e65ffd3fe804e74db710c50fa29b2b7a1 100644 --- a/src/MNH/read_chem_data_netcdf_case.f90 +++ b/src/MNH/read_chem_data_netcdf_case.f90 @@ -85,6 +85,7 @@ END MODULE MODI_READ_CHEM_DATA_NETCDF_CASE !! P. Wautelet 30/10/17 use F90 module for netCDF !! J.Pianezzej 13/02/2019 : correction for use of MEGAN ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -169,7 +170,7 @@ REAL,DIMENSION(:,:),ALLOCATABLE :: ZVALUE ! Intermediate array REAL,DIMENSION(:),ALLOCATABLE :: ZVALUE1D ! Intermediate array REAL,DIMENSION(:,:),ALLOCATABLE :: ZOUT ! Intermediate arrays REAL,DIMENSION(:),ALLOCATABLE :: ZOUT1D ! Intermediate arrays -INTEGER :: ind_netcdf ! Indice for netcdf var. +INTEGER(kind=CDFINT) :: ind_netcdf ! Indice for netcdf var. !chemistry field infile MOZ1.nam INTEGER :: ICHANNEL CHARACTER(LEN=8) :: YMOZ="MOZ1.nam" @@ -195,14 +196,14 @@ integer(kind=CDFINT) :: status, ncid, varid integer(kind=CDFINT) :: lat_varid, lon_varid, lev_varid, time_varid integer(kind=CDFINT) :: hyam_varid, hybm_varid, p0_varid, t_varid, q_varid, ps_varid integer(kind=CDFINT) :: recid, latid, lonid, levid, timeid -integer(kind=CDFINT) :: latlen, lonlen, levlen, nrecs,timelen -integer(kind=CDFINT) :: itimeindex, KILEN, jrec +integer(kind=CDFINT) :: latlen, lonlen, levlen, nrecs, timelen +integer(kind=CDFINT) :: itimeindex, KILEN CHARACTER(LEN=40) :: recname REAL, DIMENSION(:), ALLOCATABLE :: lats REAL, DIMENSION(:), ALLOCATABLE :: lons REAL, DIMENSION(:), ALLOCATABLE :: levs -INTEGER, DIMENSION(:), ALLOCATABLE :: count3d, start3d -INTEGER, DIMENSION(:), ALLOCATABLE :: count2d, start2d +INTEGER(kind=CDFINT), DIMENSION(:), ALLOCATABLE :: count3d, start3d +INTEGER(kind=CDFINT), DIMENSION(:), ALLOCATABLE :: count2d, start2d REAL, DIMENSION(:), ALLOCATABLE :: time, hyam, hybm REAL :: p0 INTEGER, DIMENSION(:), ALLOCATABLE :: kinlo @@ -573,7 +574,7 @@ DO JI = 1,IMOZ !for every MNH species existing in MOZ1.nam JLOOP1 = JLOOP1+lonlen ENDDO CALL HORIBL(lats(1),lons(1),lats(latlen),lons(lonlen), & - latlen,kinlo,KILEN, & + int(latlen,kind=kind(1)),kinlo,KILEN, & ZVALUE(JK,:),INO,ZLONOUT,ZLATOUT, & ZOUT(JK,:),.FALSE.,PTIME_HORI,.TRUE.) CALL ARRAY_1D_TO_2D(INO,ZOUT(JK,:),IIU,IJU, & @@ -654,7 +655,7 @@ DO JI = 1,IMOZ !for every MNH species existing in MOZ1.nam JLOOP1 = JLOOP1+lonlen ENDDO CALL HORIBL(lats(1),lons(1),lats(latlen),lons(lonlen), & - latlen,kinlo,KILEN, & + int(latlen,kind=kind(1)),kinlo,KILEN, & ZVALUE(JK,:),INO,ZLONOUT,ZLATOUT, & ZOUT(JK,:),.FALSE.,PTIME_HORI,.TRUE.) CALL ARRAY_1D_TO_2D(INO,ZOUT(JK,:),IIU,IJU, & @@ -678,7 +679,7 @@ DO JK = 1, levlen JLOOP1 = JLOOP1 + lonlen ENDDO CALL HORIBL(lats(1),lons(1),lats(latlen),lons(lonlen), & - latlen,kinlo,KILEN, & + int(latlen,kind=kind(1)),kinlo,KILEN, & ZVALUE(JK,:),INO,ZLONOUT,ZLATOUT, & ZOUT(JK,:),.FALSE.,PTIME_HORI,.FALSE.) ! @@ -694,7 +695,7 @@ DO JK = 1, levlen JLOOP1 = JLOOP1 + lonlen ENDDO CALL HORIBL(lats(1),lons(1),lats(latlen),lons(lonlen), & - latlen,kinlo,KILEN, & + int(latlen,kind=kind(1)),kinlo,KILEN, & ZVALUE(JK,:),INO,ZLONOUT,ZLATOUT, & ZOUT(JK,:),.FALSE.,PTIME_HORI,.FALSE.) ! @@ -709,7 +710,7 @@ DO JJ = 1, latlen JLOOP1 = JLOOP1 + lonlen ENDDO CALL HORIBL(lats(1),lons(1),lats(latlen),lons(lonlen), & - latlen,kinlo,KILEN, & + int(latlen,kind=kind(1)),kinlo,KILEN, & ZVALUE1D(:),INO,ZLONOUT,ZLATOUT, & ZOUT1D(:),.FALSE.,PTIME_HORI,.FALSE.) ! diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index 2fa1ab92cfafb6252f3ea28062feacf644b2420d..f1d20df7e869f96195e5b9ac6ca4e6e7fd7e6d1b 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -101,6 +101,7 @@ USE MODD_CST USE MODD_GRID USE MODD_TIME USE MODD_CONF +USE MODD_PARAM_n, ONLY : CRAD ! USE MODE_DATETIME USE MODE_ll @@ -398,6 +399,7 @@ IF (GSTORE) THEN TSTATION%LE (IN,I) = STATION_INTERP_2D(XCURRENT_LE ) TSTATION%LEI (IN,I) = STATION_INTERP_2D(XCURRENT_LEI ) TSTATION%GFLUX (IN,I) = STATION_INTERP_2D(XCURRENT_GFLUX ) + IF (CRAD /= 'NONE') THEN TSTATION%SWD (IN,I) = STATION_INTERP_2D(XCURRENT_SWD ) TSTATION%SWU (IN,I) = STATION_INTERP_2D(XCURRENT_SWU ) TSTATION%LWD (IN,I) = STATION_INTERP_2D(XCURRENT_LWD ) @@ -405,6 +407,7 @@ IF (GSTORE) THEN TSTATION%SWDIR (IN,I) = STATION_INTERP_2D(XCURRENT_SWDIR ) TSTATION%SWDIFF(IN,I) = STATION_INTERP_2D(XCURRENT_SWDIFF) TSTATION%DSTAOD(IN,I) = STATION_INTERP_2D(XCURRENT_DSTAOD) + ENDIF TSTATION%SFCO2 (IN,I) = STATION_INTERP_2D(XCURRENT_SFCO2 ) ENDIF ELSE @@ -435,6 +438,7 @@ IF (GSTORE) THEN TSTATION%LE (IN,I) = XCURRENT_LE(TSTATION%I(I),TSTATION%J(I)) TSTATION%LEI (IN,I) = XCURRENT_LEI(TSTATION%I(I),TSTATION%J(I)) TSTATION%GFLUX (IN,I) = XCURRENT_GFLUX(TSTATION%I(I),TSTATION%J(I)) + IF (CRAD /= 'NONE') THEN TSTATION%SWD (IN,I) = XCURRENT_SWD(TSTATION%I(I),TSTATION%J(I)) TSTATION%SWU (IN,I) = XCURRENT_SWU(TSTATION%I(I),TSTATION%J(I)) TSTATION%LWD (IN,I) = XCURRENT_LWD(TSTATION%I(I),TSTATION%J(I)) @@ -442,6 +446,7 @@ IF (GSTORE) THEN TSTATION%SWDIR (IN,I) = XCURRENT_SWDIR(TSTATION%I(I),TSTATION%J(I)) TSTATION%SWDIFF(IN,I) = XCURRENT_SWDIFF(TSTATION%I(I),TSTATION%J(I)) TSTATION%DSTAOD(IN,I) = XCURRENT_DSTAOD(TSTATION%I(I),TSTATION%J(I)) + ENDIF TSTATION%SFCO2 (IN,I) = XCURRENT_SFCO2(TSTATION%I(I),TSTATION%J(I)) ENDIF ENDIF @@ -486,6 +491,7 @@ IF (GSTORE) THEN CALL DISTRIBUTE_STATION(TSTATION%LE (IN,I)) CALL DISTRIBUTE_STATION(TSTATION%LEI (IN,I)) CALL DISTRIBUTE_STATION(TSTATION%GFLUX (IN,I)) + IF (CRAD /= 'NONE') THEN CALL DISTRIBUTE_STATION(TSTATION%SWD (IN,I)) CALL DISTRIBUTE_STATION(TSTATION%SWU (IN,I)) CALL DISTRIBUTE_STATION(TSTATION%LWD (IN,I)) @@ -493,6 +499,7 @@ IF (GSTORE) THEN CALL DISTRIBUTE_STATION(TSTATION%SWDIR (IN,I)) CALL DISTRIBUTE_STATION(TSTATION%SWDIFF (IN,I)) CALL DISTRIBUTE_STATION(TSTATION%DSTAOD (IN,I)) + END IF CALL DISTRIBUTE_STATION(TSTATION%SFCO2 (IN,I)) ENDIF ! diff --git a/src/MNH/tools_c.f90 b/src/MNH/tools_c.f90 index 224b55f4b35635b90713b04322b55aa7eca85b59..60fd4147b3a74545404600df297ae2890b8615cf 100644 --- a/src/MNH/tools_c.f90 +++ b/src/MNH/tools_c.f90 @@ -19,15 +19,34 @@ module modi_tools_c ! ! P. Wautelet 04/12/2018 ! +! Modifications: +! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) + use, intrinsic :: iso_c_binding implicit none + private + + public :: sleep_c + interface - subroutine sleep_c(ksec) bind(c, name="sleep") + subroutine sleep_c_intern(ksec) bind(c, name="sleep") import C_INT integer(kind=C_INT), VALUE :: ksec - end subroutine sleep_c + end subroutine sleep_c_intern end interface +contains + + subroutine sleep_c(ksec) + integer, intent(in) :: ksec + + integer(kind=C_INT) :: isec_c + + isec_c = int( ksec, kind=C_INT ) + + call sleep_c_intern( isec_c ) + end subroutine + end module modi_tools_c diff --git a/src/MNH/viscosity.f90 b/src/MNH/viscosity.f90 index 3b348d47d3fcd02ab1cf41e01de0606a5498808f..b3d3e6a44a3bfa855d8555943dc035330e27689d 100644 --- a/src/MNH/viscosity.f90 +++ b/src/MNH/viscosity.f90 @@ -2,8 +2,7 @@ !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. -!----------------------------------------------------------------- -! +!------------------------------------------------------------------------------- ! ##################### MODULE MODI_VISCOSITY ! ##################### @@ -91,6 +90,7 @@ SUBROUTINE VISCOSITY(HLBCX, HLBCY, KRR, KSV, PNU, PPRANDTL, & !! ------------- !! 01/18 (C.Lac) Add budgets ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 08/11/2019: corrected wrong budget name VISC_BU_RU -> VISC_BU_RTH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -193,7 +193,7 @@ IF (OVISC_TH) THEN ! END IF ! -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'VISC_BU_RU') +IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'VISC_BU_RTH') ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index b70fe68aa07c4e64b9abf90081b591f66930374d..2eb2b3b4452ca203fc7d05e8e536933d876ef857 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -82,8 +82,9 @@ USE MODD_LG, ONLY: CLGNAMES USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST USE MODD_SALT, ONLY: CSALTNAMES, LSALT USE MODD_NSV -USE MODD_RADIATIONS_n, ONLY:NAER +USE MODD_RADIATIONS_n, ONLY:NAER USE MODD_DIAG_IN_RUN +USE MODD_PARAM_n, ONLY: CRAD ! USE MODE_DUST_PSD USE MODE_AERO_PSD @@ -318,6 +319,7 @@ IF (LDIAG_IN_RUN) THEN YCOMMENT (JPROC) = 'Storage heat flux' ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%GFLUX(:,II) ! + IF (CRAD /= 'NONE') THEN JPROC = JPROC + 1 YTITLE (JPROC) = 'SWD' YUNIT (JPROC) = 'W m-2' @@ -342,6 +344,7 @@ IF (LDIAG_IN_RUN) THEN YCOMMENT (JPROC) = 'Upward long-wave radiation' ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%LWU(:,II) ! + END IF ! JPROC = JPROC + 1 YTITLE (JPROC) = 'TKE_DISS' diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 92722fe09c8748365494f66fe7cd59f0728b584a..916f951e3b4a5c45a51d019d01d7dbefd7fec4d5 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -78,6 +78,7 @@ USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST USE MODD_SALT, ONLY: CSALTNAMES, LSALT, NMODE_SLT USE MODD_NSV USE MODD_DIAG_IN_RUN +USE MODD_PARAM_n, ONLY: CRAD ! USE MODD_DIM_n USE MODD_GRID_n @@ -278,6 +279,7 @@ IF (LDIAG_IN_RUN) THEN YCOMMENT (JPROC) = 'Storage heat flux' ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%GFLUX(:,II) ! + IF (CRAD /= 'NONE') THEN JPROC = JPROC + 1 YTITLE (JPROC) = 'SWD' YUNIT (JPROC) = 'W m-2' @@ -320,6 +322,7 @@ IF (LDIAG_IN_RUN) THEN YCOMMENT (JPROC) = 'Dust aerosol optical depth' ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%DSTAOD(:,II) ! + END IF JPROC = JPROC + 1 YTITLE (JPROC) = 'LEI' YUNIT (JPROC) = 'W m-2' diff --git a/src/SURFEX/init_isban.F90 b/src/SURFEX/init_isban.F90 index dfa0031efbe28ff219ee22d8797ece38d3b8b20b..4bdbb57e1112e5df8c0cf986a6e72663295b7cbe 100644 --- a/src/SURFEX/init_isban.F90 +++ b/src/SURFEX/init_isban.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. !############################################################# SUBROUTINE INIT_ISBA_n (DTCO, OREAD_BUDGETC, UG, U, USS, GCP, IM, DTZ,& @@ -58,6 +58,7 @@ SUBROUTINE INIT_ISBA_n (DTCO, OREAD_BUDGETC, UG, U, USS, GCP, IM, DTZ,& !! V.VIonnet 2017 : Blow snow !! P.Tulet 06/16 : add MEGAN coupling !! J.Pianezzej 02/2019 : correction for use of MEGAN +! P. Wautelet 21/11/2019: initialize YSNOW_SCHEME !! !------------------------------------------------------------------------------- ! @@ -267,6 +268,8 @@ IM%O%NNBYEARSOLD = 1 IM%O%NSPINS = 1 IM%O%NSPINW = 1 ! +YSNOW_SCHEME=' ' +! IF (HINIT=='PRE') THEN CALL READ_PREP_ISBA_SNOW(HPROGRAM,YSNOW_SCHEME,ISNOW_NLAYER) ! diff --git a/src/SURFEX/modd_netcdf_sfx.F90 b/src/SURFEX/modd_netcdf_sfx.F90 new file mode 100644 index 0000000000000000000000000000000000000000..9c8bf9becf5f1cc6d8b6f7f62905552b67a3c9cc --- /dev/null +++ b/src/SURFEX/modd_netcdf_sfx.F90 @@ -0,0 +1,12 @@ +!SFX_LIC Copyright 2019-2019 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! Author: P. Wautelet 18/09/2019 +module modd_netcdf_sfx + +implicit none + +integer, parameter :: CDFINT = selected_int_kind( 8 ) + +end module modd_netcdf_sfx diff --git a/src/SURFEX/modd_snow_metamo.F90 b/src/SURFEX/modd_snow_metamo.F90 index e48dd6ccda5de27a939527f451f2bf44d4dd2826..12c548f6353a22902bcbd66f9f4ce448458dd8db 100644 --- a/src/SURFEX/modd_snow_metamo.F90 +++ b/src/SURFEX/modd_snow_metamo.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2008-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ajoutEB ! correction de l'erreur interversion de XVTANG2 et XVTANG3 @@ -31,11 +31,14 @@ !! MODIFICATIONS !! ------------- !! Original 02/2008 +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +use modd_netcdf_sfx, only: CDFINT +! IMPLICIT NONE ! !------------------------------------------------------------------------------- @@ -138,11 +141,11 @@ REAL, PARAMETER :: XVTELV1 = 0.005 ! INTEGER,PARAMETER :: NVDENT1 = 3 ! -INTEGER :: NVARDIMS !number of dimensions of netcdf input variable -INTEGER :: NLENDIM1,NLENDIM2,NLENDIM3 -INTEGER :: NID_VAR ! Netcdf IDs for variable +INTEGER(kind=CDFINT) :: NVARDIMS !number of dimensions of netcdf input variable +INTEGER(kind=CDFINT) :: NLENDIM1,NLENDIM2,NLENDIM3 +INTEGER(kind=CDFINT) :: NID_VAR ! Netcdf IDs for variable ! -INTEGER :: NID_FILE +INTEGER(kind=CDFINT) :: NID_FILE REAL, DIMENSION(:,:,:), POINTER :: XDRDT0,XTAU,XKAPPA ! field read ! END MODULE MODD_SNOW_METAMO diff --git a/src/SURFEX/mode_read_cdf.F90 b/src/SURFEX/mode_read_cdf.F90 index ce5e4a05a1f722e1f6101cb4fa8b8a658556b76e..e675d32b4505922a0f078b09c0aa3528f4fe9ba4 100644 --- a/src/SURFEX/mode_read_cdf.F90 +++ b/src/SURFEX/mode_read_cdf.F90 @@ -1,10 +1,13 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. +! Modifications: +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) MODULE MODE_READ_CDF !=================================================================== ! +use modd_netcdf_sfx, only: CDFINT ! USE MODI_ABOR1_SFX ! @@ -20,8 +23,8 @@ CONTAINS USE NETCDF ! IMPLICIT NONE -INTEGER, INTENT(IN) :: status - CHARACTER(*), INTENT(IN) :: line +INTEGER(kind=CDFINT), INTENT(IN) :: status + CHARACTER(*), INTENT(IN) :: line REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ! @@ -41,19 +44,20 @@ USE NETCDF ! IMPLICIT NONE ! -INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant -INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant -REAL, INTENT(OUT) :: PMISSVALUE !undefined value -REAL,DIMENSION(:),INTENT(OUT) :: PVALU1D !value array +INTEGER(kind=CDFINT),INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: IDVAR !variable to read identifiant +REAL, INTENT(OUT) :: PMISSVALUE !undefined value +REAL,DIMENSION(:), INTENT(OUT) :: PVALU1D !value array ! -integer :: status +integer, parameter :: NDIMS=1 +! +integer(kind=CDFINT) :: status character(len=80) :: HACTION -integer,save :: NDIMS=1 -integer :: KVARTYPE -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) :: KVARTYPE +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM -integer :: JLOOP -integer :: NGATTS +integer(kind=CDFINT) :: JLOOP +integer(kind=CDFINT) :: NGATTS character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME REAL,DIMENSION(:),ALLOCATABLE :: ZVALU1D !value array REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -132,21 +136,22 @@ USE NETCDF ! IMPLICIT NONE ! -INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant -INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: IDVAR !variable to read identifiant REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2 !dimensions for PVALU2D array CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME !dimensions names REAL, INTENT(OUT) :: PMISSVALUE REAL,DIMENSION(:,:),INTENT(OUT) :: PVALU2D !value array ! -integer :: status +integer, parameter :: NDIMS=2 +! +integer(kind=CDFINT) :: status character(len=80) :: HACTION -integer,save :: NDIMS=2 -integer :: KVARTYPE -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) :: KVARTYPE +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM -integer :: JLOOP -integer :: NGATTS +integer(kind=CDFINT) :: JLOOP +integer(kind=CDFINT) :: NGATTS character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME real :: ZMISS1,ZMISS2 REAL,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D !value array @@ -235,18 +240,19 @@ IMPLICIT NONE REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes innetcdf file REAL, DIMENSION(:), INTENT(OUT) :: PVAL ! value to get ! -integer :: status -integer :: kcdf_id -integer :: NBVARS +integer(kind=CDFINT) :: status +integer(kind=CDFINT) :: kcdf_id +integer(kind=CDFINT) :: NBVARS character(len=80) :: HACTION character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME -integer ::JLOOP1,JDIM1,JDIM2,JLOOP -integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 -integer ::NVARDIMS -integer ::NLEN -integer,dimension(1) :: IDIMID -integer,DIMENSION(1:2) :: NLEN2D,IDIMID2D -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) ::JLOOP1 +integer ::JDIM1,JDIM2,JLOOP +integer(kind=CDFINT) ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer(kind=CDFINT) ::NVARDIMS +integer(kind=CDFINT) ::NLEN +integer(kind=CDFINT),dimension(1) :: IDIMID +integer(kind=CDFINT),DIMENSION(1:2) :: NLEN2D,IDIMID2D +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM real,DIMENSION(:),ALLOCATABLE :: ZVALU real,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D @@ -430,18 +436,18 @@ IMPLICIT NONE ! CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file -INTEGER, INTENT(OUT):: KDIM ! value of dimension to get +INTEGER(kind=CDFINT), INTENT(OUT):: KDIM ! value of dimension to get ! -integer :: status -integer :: kcdf_id -integer :: NBVARS +integer(kind=CDFINT) :: status +integer(kind=CDFINT) :: kcdf_id +integer(kind=CDFINT) :: NBVARS character(len=80) :: HACTION character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME -integer ::JLOOP1,JLOOP -integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 -integer ::NVARDIMS -integer, dimension(1) :: NDIMID -integer,DIMENSION(2) ::NLEN2D, NDIMID2D +integer(kind=CDFINT) ::JLOOP1,JLOOP +integer(kind=CDFINT) ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer(kind=CDFINT) ::NVARDIMS +integer(kind=CDFINT), dimension(1) :: NDIMID +integer(kind=CDFINT),DIMENSION(2) ::NLEN2D, NDIMID2D REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ! diff --git a/src/SURFEX/mode_read_grib.F90 b/src/SURFEX/mode_read_grib.F90 index ddd50d15ea3a3397107ac71dea73282a5edd4b19..ec71d31314156d270939ae14202ce729473420d3 100644 --- a/src/SURFEX/mode_read_grib.F90 +++ b/src/SURFEX/mode_read_grib.F90 @@ -1,7 +1,11 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. +!------------------------------------------------------------------- +! Modifications: +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) +!------------------------------------------------------------------- ! ##################### MODULE MODE_READ_GRIB ! ##################### @@ -694,7 +698,7 @@ INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing REAL, DIMENSION(:), INTENT(IN) :: PMASK ! grib land mask REAL, DIMENSION(:), POINTER :: PSST ! ! -INTEGER :: IRET +INTEGER(kind=kindOfInt) :: IRET REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_SST',0,ZHOOK_HANDLE) @@ -732,7 +736,7 @@ INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing REAL, DIMENSION(:), INTENT(IN) :: PMASK ! grib land mask REAL, DIMENSION(:), POINTER :: PTS ! ! -INTEGER :: IRET +INTEGER(kind=kindOfInt) :: IRET REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TSWATER',0,ZHOOK_HANDLE) diff --git a/src/SURFEX/mode_read_netcdf_mercator.F90 b/src/SURFEX/mode_read_netcdf_mercator.F90 index ad51a19ab58e80f12d7665714cf91ada168f0a3a..7462dff30fb1a0739c8c786c5a8e03872b64321f 100644 --- a/src/SURFEX/mode_read_netcdf_mercator.F90 +++ b/src/SURFEX/mode_read_netcdf_mercator.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. !! !! Modified 09/2013 : S. Senesi : adapt READ_NETCDF_SST to read 2D fields other than SST @@ -10,9 +10,12 @@ MODULE MODE_READ_NETCDF_MERCATOR !! Modified 03/2014 : M.N. Bouin ! possibility of wave parameters !! ! from external source !! ! + correction of 2 bugs +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) !------------------------------------------------------------------------------- ! ! +use modd_netcdf_sfx, only: CDFINT +! USE MODI_ABOR1_SFX ! USE YOMHOOK ,ONLY : LHOOK, DR_HOOK @@ -27,7 +30,7 @@ CONTAINS USE NETCDF ! IMPLICIT NONE -INTEGER, INTENT(IN) :: status +INTEGER(kind=CDFINT), INTENT(IN) :: status CHARACTER(LEN=80), INTENT(IN) :: line REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -48,20 +51,20 @@ USE NETCDF ! IMPLICIT NONE ! -INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant -INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: IDVAR !variable to read identifiant REAL, INTENT(OUT) :: PMISSVALUE !undefined value REAL,DIMENSION(:),INTENT(OUT) :: PVALU1D !value array ! -integer :: status +integer, parameter :: NDIMS=1 +! +integer(kind=CDFINT) :: status character(len=80) :: HACTION -integer,save :: NDIMS=1 -integer :: KVARTYPE -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) :: KVARTYPE +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM -integer :: JLOOP -integer :: NGATTS -integer, dimension(1) :: NDIMID +integer(kind=CDFINT) :: NGATTS +integer(kind=CDFINT), dimension(1) :: NDIMID character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME REAL,DIMENSION(:),ALLOCATABLE :: ZVALU1D !value array REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -122,21 +125,22 @@ USE NETCDF ! IMPLICIT NONE ! -INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant -INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: IDVAR !variable to read identifiant REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2 !dimensions for PVALU2D array CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME !dimensions names REAL, INTENT(OUT) :: PMISSVALUE REAL,DIMENSION(:,:),INTENT(OUT) :: PVALU2D !value array ! -integer :: status +integer, parameter :: NDIMS=2 +! +integer(kind=CDFINT) :: status character(len=80) :: HACTION -integer,save :: NDIMS=2 -integer :: KVARTYPE -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) :: KVARTYPE +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM -integer :: JLOOP2, JLOOP, J1, J2 -integer :: NGATTS +integer(kind=CDFINT) :: JLOOP2, JLOOP, J1, J2 +integer(kind=CDFINT) :: NGATTS character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME real :: ZMISS1,ZMISS2 real :: ZSCFA, ZOFFS @@ -249,22 +253,23 @@ USE NETCDF ! IMPLICIT NONE ! -INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant -INTEGER,INTENT(IN) :: IDVAR !variable to read identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: KCDF_ID !netcdf file identifiant +INTEGER(kind=CDFINT),INTENT(IN) :: IDVAR !variable to read identifiant REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2,PDIM3 !dimensions for PVALU2D array CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME,HDIM3NAME !dimensions names REAL, INTENT(OUT) :: PMISSVALUE REAL,DIMENSION(:,:,:),INTENT(OUT) :: PVALU3D !value array ! -integer :: status +integer, parameter :: NDIMS=3 +! +integer(kind=CDFINT) :: status character(len=80) :: HACTION -integer,save :: NDIMS=3 -integer :: KVARTYPE -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) :: KVARTYPE +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM -integer :: JLOOP2, JLOOP -integer :: J1,J2,J3 -integer :: NGATTS +integer(kind=CDFINT) :: JLOOP2, JLOOP +integer(kind=CDFINT) :: J1,J2,J3 +integer(kind=CDFINT) :: NGATTS character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME real :: ZMISS1,ZMISS2,ZMISS3 real :: ZSCFA, ZOFFS @@ -384,18 +389,18 @@ IMPLICIT NONE ! CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file -INTEGER, INTENT(OUT):: KDIM ! value of dimension to get +INTEGER(kind=CDFINT), INTENT(OUT):: KDIM ! value of dimension to get ! -integer :: status -integer :: kcdf_id -integer :: NBVARS +integer(kind=CDFINT) :: status +integer(kind=CDFINT) :: kcdf_id +integer(kind=CDFINT) :: NBVARS character(len=80) :: HACTION character(len=80),DIMENSION(:),ALLOCATABLE :: YVARNAME -integer ::JLOOP1,JLOOP -integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 -integer ::NVARDIMS -INTEGER, DIMENSION(1) :: NDIMID -integer,DIMENSION(2) ::NLEN2D, NDIMID2D +integer(kind=CDFINT) ::JLOOP1,JLOOP +integer(kind=CDFINT) ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer(kind=CDFINT) ::NVARDIMS +INTEGER(kind=CDFINT), DIMENSION(1) :: NDIMID +integer(kind=CDFINT),DIMENSION(2) ::NLEN2D, NDIMID2D REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ! @@ -523,18 +528,18 @@ INCLUDE "mpif.h" CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file. CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file ! -integer :: status -integer :: kcdf_id -integer :: INBVARS +integer(kind=CDFINT) :: status +integer(kind=CDFINT) :: kcdf_id +integer(kind=CDFINT) :: INBVARS character(len=80) :: HACTION character(len=80),DIMENSION(:),ALLOCATABLE :: YVARNAME -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID -integer ::JLOOP1,JLOOP -integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 -integer ::INVARDIMS -integer,DIMENSION(3) ::INDIMLEN +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID +integer(kind=CDFINT) ::JLOOP1,JLOOP +integer(kind=CDFINT) ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer(kind=CDFINT) ::INVARDIMS +integer(kind=CDFINT),DIMENSION(3) ::INDIMLEN character(LEN=80),DIMENSION(3) :: NDIMNAM -integer :: IDIM +integer(kind=CDFINT) :: IDIM integer :: INLON INTEGER :: IINLA, INO real :: ZZLAMISS,ZZLOMISS @@ -767,16 +772,16 @@ IMPLICIT NONE CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of variable to read in netcdf file REAL, DIMENSION(:), INTENT(OUT) :: PVAL ! value to get ! -integer :: status -integer :: kcdf_id -integer :: NBVARS +integer(kind=CDFINT) :: status +integer(kind=CDFINT) :: kcdf_id +integer(kind=CDFINT) :: NBVARS character(len=80) :: HACTION character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME -integer ::JLOOP1 -integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 -integer ::NVARDIMS -INTEGER, DIMENSION(1) :: NDIMID -integer ::NLEN +integer(kind=CDFINT) ::JLOOP1 +integer(kind=CDFINT) ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer(kind=CDFINT) ::NVARDIMS +INTEGER(kind=CDFINT), DIMENSION(1) :: NDIMID +integer(kind=CDFINT) ::NLEN real,DIMENSION(:),ALLOCATABLE :: ZVALU real :: ZMISS REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -886,18 +891,18 @@ IMPLICIT NONE REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes in netcdf file REAL, DIMENSION(:), INTENT(OUT) :: PVAL ! value to get ! -integer :: status -integer :: kcdf_id -integer :: NBVARS +integer(kind=CDFINT) :: status +integer(kind=CDFINT) :: kcdf_id +integer(kind=CDFINT) :: NBVARS character(len=80) :: HACTION character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME -integer ::JLOOP1,JDIM1,JDIM2,JLOOP -integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 -integer ::NVARDIMS -integer ::NLEN -integer, dimension(1) :: NDIMID -integer,DIMENSION(2) ::NLEN2D, NDIMID2D -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) ::JLOOP1,JDIM1,JDIM2,JLOOP +integer(kind=CDFINT) ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer(kind=CDFINT) ::NVARDIMS +integer(kind=CDFINT) ::NLEN +integer(kind=CDFINT), dimension(1) :: NDIMID +integer(kind=CDFINT),DIMENSION(2) ::NLEN2D, NDIMID2D +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM real,DIMENSION(:),ALLOCATABLE :: ZVALU real,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D @@ -1087,17 +1092,18 @@ REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes in netcdf fi REAL, DIMENSION(:), INTENT(OUT) :: PDEP ! depth in netcdf file REAL, DIMENSION(:,:), INTENT(OUT) :: PVAL ! value to get ! -integer :: status -integer :: kcdf_id -integer :: NBVARS +integer(kind=CDFINT) :: status +integer(kind=CDFINT) :: kcdf_id +integer(kind=CDFINT) :: NBVARS character(len=80) :: HACTION character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME -integer ::JLOOP1,JDIM1,JDIM2,JDIM3,JLOOP +integer(kind=CDFINT) ::JLOOP1 +integer :: JDIM1,JDIM2,JDIM3,JLOOP !integer ::JLOOP2,JLOOP -integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 -integer ::NVARDIMS -integer,DIMENSION(3) ::NLEN3D -integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN +integer(kind=CDFINT) ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2 +integer(kind=CDFINT) ::NVARDIMS +integer(kind=CDFINT),DIMENSION(3) ::NLEN3D +integer(kind=CDFINT),DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM real,DIMENSION(:,:,:),ALLOCATABLE :: ZVALU3D real :: ZMISS diff --git a/src/SURFEX/mode_snowcro_flanner.F90 b/src/SURFEX/mode_snowcro_flanner.F90 index afa89445276a1ea7d3d79c86b83dd14669b5a9d8..e719d0f2d9701cc733d20b0fe4cbe2619e16c255 100644 --- a/src/SURFEX/mode_snowcro_flanner.F90 +++ b/src/SURFEX/mode_snowcro_flanner.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. MODULE MODE_SNOWCRO_FLANNER @@ -24,6 +24,10 @@ MODULE MODE_SNOWCRO_FLANNER !! ------------- !! Original 01/2013 ! +! Modifications: +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) +! +use modd_netcdf_sfx, only : CDFINT USE MODD_SURFEX_OMP, ONLY : NBLOCK USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, NPROC, NCOMM ! @@ -72,7 +76,7 @@ IMPLICIT NONE !* 2. declarations of local variables ! INTEGER :: INFOMPI -INTEGER :: IERROR !error status +INTEGER(kind=CDFINT) :: IERROR !error status ! REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -115,14 +119,14 @@ USE NETCDF ! IMPLICIT NONE ! -INTEGER,INTENT(IN) :: ID_FILE +INTEGER(kind=CDFINT),INTENT(IN) :: ID_FILE CHARACTER(LEN=5),INTENT(IN) :: HSURF REAL, DIMENSION(:,:,:), POINTER :: PVAR ! INTEGER :: INFOMPI -INTEGER, DIMENSION(:), ALLOCATABLE :: IVARDIMSID +INTEGER(kind=CDFINT), DIMENSION(:), ALLOCATABLE :: IVARDIMSID ! -INTEGER :: IERROR !error status +INTEGER(kind=CDFINT) :: IERROR !error status ! IF (NRANK==NPIO) THEN ! Look for variable ID diff --git a/src/SURFEX/prep_isba_netcdf.F90 b/src/SURFEX/prep_isba_netcdf.F90 index c61ec8c397670cd77ad5579eb3b1ceeda601f857..08841012550a9ef1cce41bcced944baee8e6bcd6 100644 --- a/src/SURFEX/prep_isba_netcdf.F90 +++ b/src/SURFEX/prep_isba_netcdf.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### SUBROUTINE PREP_ISBA_NETCDF (DTCO, U, HPROGRAM,HSURF,HFILE,KLUOUT,PFIELD) @@ -26,10 +26,14 @@ SUBROUTINE PREP_ISBA_NETCDF (DTCO, U, HPROGRAM,HSURF,HFILE,KLUOUT,PFIELD) !! ------------- !! Original 04/2012 !! J.Escobar 11/2013 Add USE MODI_GET_TYPE_DIM_n +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) !!------------------------------------------------------------------ ! ! ! +USE GRIB_API, ONLY : kindOfInt +! +use modd_netcdf_sfx, only: CDFINT USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t ! @@ -50,7 +54,6 @@ USE PARKIND1 ,ONLY : JPRB USE NETCDF ! IMPLICIT NONE - ! !* 0.1 declarations of arguments ! @@ -73,14 +76,14 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZFIELD, ZFIELD0 ! field read REAL(KIND=JPRB) :: ZHOOK_HANDLE ! INTEGER :: JI, ICPT -INTEGER::IERROR !error status +INTEGER(kind=kindOfInt)::IERROR !error status INTEGER::JJ,JK,JLOOP ! loop counters INTEGER::INLAYERS ! vertical dimension length INTEGER::IL ! nature dimension length -INTEGER::ID_FILE,ID_VAR ! Netcdf IDs for file and variable -INTEGER::INVARDIMS !number of dimensions of netcdf input variable -INTEGER,DIMENSION(:),ALLOCATABLE::IVARDIMSID -INTEGER::ILENDIM,ILENDIM1,ILENDIM2 +INTEGER(kind=CDFINT)::ID_FILE,ID_VAR ! Netcdf IDs for file and variable +INTEGER(kind=CDFINT)::INVARDIMS !number of dimensions of netcdf input variable +INTEGER(kind=CDFINT),DIMENSION(:),ALLOCATABLE::IVARDIMSID +INTEGER(kind=CDFINT)::ILENDIM,ILENDIM1,ILENDIM2 SELECT CASE (TRIM(HSURF)) CASE ('TG','WG','WGI') diff --git a/src/SURFEX/read_netcdf.F90 b/src/SURFEX/read_netcdf.F90 index bdd337748e285b1dd8725e6c0abf392282f98e1e..4c724796600155725de103440cf163da75cad548 100644 --- a/src/SURFEX/read_netcdf.F90 +++ b/src/SURFEX/read_netcdf.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2008-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### SUBROUTINE READ_NETCDF (UG, U, USS, & @@ -23,12 +23,14 @@ !! !! Original 01/2008 !! +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) !---------------------------------------------------------------------------- ! !* 0. DECLARATION ! ----------- ! ! +use modd_netcdf_sfx, only : CDFINT USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t USE MODD_SSO_n, ONLY : SSO_t @@ -73,7 +75,7 @@ REAL, DIMENSION(:),ALLOCATABLE :: ZLATI ! array of values extract from netcdf ! INTEGER :: ILUOUT ! output listing INTEGER :: JLOOP ! loop indice -INTEGER :: JDIMENSION ! dimensions of ZVALU,ZLAT, +INTEGER(kind=CDFINT) :: JDIMENSION ! dimensions of ZVALU,ZLAT, REAL(KIND=JPRB) :: ZHOOK_HANDLE ! and ZLON arrays !---------------------------------------------------------------------------- diff --git a/src/SURFEX/read_pgd_netcdf.F90 b/src/SURFEX/read_pgd_netcdf.F90 index a30e3b5ad8e4c858b2a6ea43e36be0e0cb5f3166..6907b4d7895c819c6a802946f8067007a3ca21bc 100644 --- a/src/SURFEX/read_pgd_netcdf.F90 +++ b/src/SURFEX/read_pgd_netcdf.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. !################################################################################# SUBROUTINE READ_PGD_NETCDF (UG, U, USS, & @@ -26,9 +26,11 @@ SUBROUTINE READ_PGD_NETCDF (UG, U, USS, & !! MODIFICATIONS !! ------------- !! Original 11/2012 +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) !!------------------------------------------------------------------ ! ! +use modd_netcdf_sfx, only : CDFINT USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t USE MODD_SSO_n, ONLY : SSO_t @@ -73,9 +75,9 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZFIELD0 ! ! CHARACTER(LEN=28) :: YNCVAR ! -INTEGER::IERROR !error status -INTEGER::ID_FILE ! id of netcdf file -INTEGER::INFIELD,INLAT,INLON ! dimension lengths +INTEGER(kind=CDFINT)::IERROR !error status +INTEGER(kind=CDFINT)::ID_FILE ! id of netcdf file +INTEGER(kind=CDFINT)::INFIELD,INLAT,INLON ! dimension lengths INTEGER::ILUOUT INTEGER::JPOINT !loop counter ! @@ -175,17 +177,17 @@ USE NETCDF IMPLICIT NONE -INTEGER,INTENT(IN)::ID_FILE +INTEGER(kind=CDFINT),INTENT(IN)::ID_FILE CHARACTER(LEN=20), INTENT(IN) :: HFIELD ! name of variable REAL,DIMENSION(:),POINTER::PFIELD -INTEGER::ID_VAR ! Netcdf IDs for file and variable -INTEGER::INVARDIMS !number of dimensions of netcdf input variable -INTEGER,DIMENSION(:),ALLOCATABLE::IVARDIMSID -INTEGER::ILENDIM1,ILENDIM2 -INTEGER,INTENT(OUT)::ILENDIM -INTEGER::IERROR !error status -INTEGER::ITYPE +INTEGER(kind=CDFINT)::ID_VAR ! Netcdf IDs for file and variable +INTEGER(kind=CDFINT)::INVARDIMS !number of dimensions of netcdf input variable +INTEGER(kind=CDFINT),DIMENSION(:),ALLOCATABLE::IVARDIMSID +INTEGER(kind=CDFINT)::ILENDIM1,ILENDIM2 +INTEGER(kind=CDFINT),INTENT(OUT)::ILENDIM +INTEGER(kind=CDFINT)::IERROR !error status +INTEGER(kind=CDFINT)::ITYPE ! Look for variable ID for HFIELD IERROR=NF90_INQ_VARID(ID_FILE,TRIM(HFIELD),ID_VAR) diff --git a/src/SURFEX/read_z1d_netcdf.F90 b/src/SURFEX/read_z1d_netcdf.F90 index af433b7392ff96229cc157444ba18483b7a4522f..91e77dfe0eeaf46c9624cc69173af559b58deea6 100644 --- a/src/SURFEX/read_z1d_netcdf.F90 +++ b/src/SURFEX/read_z1d_netcdf.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2014-2019 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence -!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### SUBROUTINE READ_Z1D_NETCDF @@ -21,12 +21,14 @@ !! !! Original 11/2014 !! initialisation of NOCKMAX,XZHOC -!! +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) +! !---------------------------------------------------------------------------- ! !* 0. DECLARATION ! ----------- ! +use modd_netcdf_sfx, only : CDFINT USE MODD_OCEAN_GRID USE MODD_SURF_PAR, ONLY : NUNDEF USE MODD_PREP_SEAFLUX, ONLY : CFILE_SEAFLX,CTYPE_SEAFLX @@ -42,7 +44,7 @@ IMPLICIT NONE ! CHARACTER (LEN=28) :: YFILENAME CHARACTER (LEN=28) :: YNCVARNAME -INTEGER :: JDIMENSION +INTEGER(kind=CDFINT) :: JDIMENSION ! !* 0.2 Declaration of local variables ! ------------------------------ diff --git a/src/SURFEX/start_lake_of.F90 b/src/SURFEX/start_lake_of.F90 index 0f08293016c79cdfd7efc516e9d71ebeb48b335a..26f4b89ba8ea509ba4ce4df1c8a565331c81569f 100644 --- a/src/SURFEX/start_lake_of.F90 +++ b/src/SURFEX/start_lake_of.F90 @@ -45,6 +45,7 @@ SUBROUTINE START_LAKE_OF(KDAY, KMONTH, PLON, PLAT, PDEPTH, & ! IN ! Modified 07/2012, P. Le Moigne : In case there's a lake but no climatic data ! associated then fill with neighbour existing data ! instead of aborting +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) !------------------------------------------------------------------------------------------------------------ ! USE MODD_DATA_LAKE, ONLY : CLAKELTA, NLONG, NLATG, XFIRSTLAT, & @@ -52,6 +53,7 @@ USE MODD_DATA_LAKE, ONLY : CLAKELTA, NLONG, NLATG, XFIRSTLAT, & XAUXT_SNOW, XAUXT_ICE, XAUXT_MNW, XAUXT_WML, XAUXT_BOT, & XAUXT_B1, XAUXCT, XAUXH_SNOW, XAUXH_ICE, XAUXH_ML, & XAUXH_B1, XAUXT_SFC +use modd_netcdf_sfx, only : CDFINT ! USE MODI_ABOR1_SFX ! @@ -62,6 +64,7 @@ USE NETCDF ! IMPLICIT NONE ! +! !* 0.1 declarations of arguments ! INTEGER, INTENT(IN) :: KDAY, & ! The day number @@ -97,7 +100,7 @@ REAL :: ZWLON, ZWLAT, ZWDEPTH ! LOGICAL :: LEXIST ! - INTEGER :: ID_LAKELTA, ID_MONTH, & ! IDs for NetCDF + INTEGER(kind=CDFINT) :: ID_LAKELTA, ID_MONTH, & ! IDs for NetCDF ID_DEC, ID_LON, ID_LAT, ID_DEPTH, & ID_T_SNOW, ID_T_ICE, ID_T_MNW, ID_T_WML, ID_T_BOT, ID_T_B1, ID_CT, & ID_H_SNOW, ID_H_ICE, ID_H_ML, ID_H_B1, ID_T_SFC @@ -105,9 +108,9 @@ LOGICAL :: LEXIST INTEGER :: ILON, ILAT ! Numbers of the "lake" grid boxes in longitude and latitude INTEGER :: IDEPTH ! Number of the lake class in depth INTEGER, DIMENSION(1) :: ILOC_DEPTH - INTEGER :: IRET - INTEGER :: IMONTHN, IDECN, ILONN, ILATN, IDEPTHN - INTEGER, DIMENSION(5) :: NINDEX + INTEGER(kind=CDFINT) :: IRET + INTEGER(kind=CDFINT) :: IMONTHN, IDECN, ILONN, ILATN, IDEPTHN + INTEGER(kind=CDFINT), DIMENSION(5) :: NINDEX REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ---------------------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/uncompress_field.F90 b/src/SURFEX/uncompress_field.F90 index 684fcdef42379f9e1f2cea7236478c73875335be..a3c2aa88e052868ef2453d6666253eca49c9ecb1 100644 --- a/src/SURFEX/uncompress_field.F90 +++ b/src/SURFEX/uncompress_field.F90 @@ -1,3 +1,11 @@ +!SFX_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +!------------------------------------------------------------------------------------------------------------ +! Modifications: +! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) +!------------------------------------------------------------------------------------------------------------ SUBROUTINE UNCOMPRESS_FIELD(KLONG,PSEUIL,PFIELD_IN,PFIELD_OUT) IMPLICIT NONE diff --git a/src/configure b/src/configure index 03587c46eabf707d695b0a7dc7226288298d306f..2e6f572cb49dcbfc706c4399c5c2fb064bdf1609 100755 --- a/src/configure +++ b/src/configure @@ -44,6 +44,21 @@ cd ${LOCAL}/conf TARG=$(uname -s -n) # case "$TARG" in +'Linux jean-zay'*) + export ARCH=${ARCH:-LXifort} + export VER_MPI=${VER_MPI:-MPIINTEL} + export OPTLEVEL=${OPTLEVEL:-O2} + export MVWORK=${MVWORK:-NO} + export VER_CDF=${VER_CDF:-CDFAUTO} + export MNHENV=${MNHENV:-" +module purge +module load intel-compilers-19/19.0.4.243 +module load intel-mpi-19/19.0.4.243 +ulimit -s unlimited +export SLURM_CPU_BIND=none +export I_MPI_PIN_PROCESSOR_LIST=all:map=spread +"} + ;; 'Linux'*'occigen'*) export ARCH=${ARCH:-LXifort} export VER_MPI=${VER_MPI:-MPIINTEL}