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 835c60cc5745a34a5aee6822e59fbc32a739ea40..16d5f2988ed57c27d4dce7e3ee91d71006ae5735 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -819,6 +819,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_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 95cc8e030fa19e1aa0a283226e29ede5a4ea5cb7..0197ed559bd919b33a25f5afcfc5452e263018c9 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -15,6 +15,8 @@ ! P. Wautelet 12/07/2019: add support for 1D array of dates ! P. Wautelet 10/09/2019: IO_Coordvar_write_nc4: split communication and file write operations ! + no more process coordination for Z-split files +! 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) !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_write_nc4 @@ -289,10 +291,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) @@ -2193,6 +2199,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 ! @@ -2202,7 +2209,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/ch_f77.fx90 b/src/MNH/ch_f77.fx90 index 9935889845b4345f3f627c0c8011457f39a3f981..25e86d2cdf4ce98bdf846ef9e14eb25250567380 100644 --- a/src/MNH/ch_f77.fx90 +++ b/src/MNH/ch_f77.fx90 @@ -24,6 +24,7 @@ C**MODIFIED: 08/02/2019 (P.Wautelet) bug fixes: missing argument C + wrong use of an non initialized value C**MODIFIED: P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg C P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +C P. Wautelet 21/11/2019: replace several CONTINUE (workaround of problems with gfortran OpenACC) C! C! C! @@ -5440,21 +5441,10 @@ c INCLUDE 'params' IF(nwint .eq. -12) mopt = 12 IF(nwint .eq. -13) mopt = 13 - IF (mopt .EQ. 1) GO TO 1 - IF (mopt .EQ. 2) GO TO 2 - IF (mopt .EQ. 3) GO TO 3 - IF (mopt .EQ. 4) GO TO 4 - IF (mopt .EQ. 5) GO TO 5 - IF (mopt .EQ. 6) GO TO 6 - - IF (mopt .EQ. 10) GO TO 10 - IF (mopt .EQ. 11) GO TO 11 - IF (mopt .EQ. 12) GO TO 12 - IF (mopt .EQ. 13) GO TO 13 - + select case( mopt ) *_______________________________________________________________________ - 1 CONTINUE + case ( 1 ) wlabel = 'equal spacing' nw = nwint + 1 @@ -5465,11 +5455,10 @@ c INCLUDE 'params' wc(iw) = ( wl(iw) + wu(iw) )/2. ENDDO wl(nw) = wu(nw-1) - GO TO 9 *_______________________________________________________________________ - 2 CONTINUE + case ( 2 ) * Input from table. In this example: * Wavelength grid will be read from a file. @@ -5491,11 +5480,10 @@ c wlabel = 'isaksen.grid' wu(iw) = wl(iw+1) wc(iw) = 0.5*(wl(iw) + wu(iw)) ENDDO - GO TO 9 *_______________________________________________________________________ - 3 CONTINUE + case ( 3 ) * user-defined grid. In this example, a single calculation is used to * obtain results for two 1 nm wide intervals centered at 310 and 400 nm: @@ -5512,11 +5500,11 @@ c wlabel = 'isaksen.grid' wu(iw) = wl(iw+1) wc(iw) = 0.5*(wl(iw) + wu(iw)) ENDDO - GO TO 9 *_______________________________________________________________________ - 4 CONTINUE + case ( 4 ) + wlabel = 'fast-TUV tropospheric grid' fi = 'DATAE1/GRIDS/fast_tuv.grid' @@ -5542,11 +5530,9 @@ c wlabel = 'isaksen.grid' wc(iw) = 0.5*(wl(iw) + wu(iw)) ENDDO - GO TO 9 - *_______________________________________________________________________ - 5 continue + case ( 5 ) * use standard grid up to 205.8 nm * elsewhere, use 10 cm-1 grid to 1000 nm @@ -5574,11 +5560,9 @@ c wlabel = 'isaksen.grid' wc(iw) = (wl(iw) + wu(iw))/2. ENDDO - GO TO 9 - *_______________________________________________________________________ - 6 CONTINUE + case ( 6 ) ***** Correction for air-vacuum wavelength shift: * The TUV code assumes that all working wavelengths are strictly IN-VACUUM. This is for ALL @@ -5615,10 +5599,10 @@ c wlabel = 'isaksen.grid' CALL wshift(mrefr, nwint, wc, airout, kout) CALL wshift(mrefr, nwint, wu, airout, kout) - GO TO 9 *_______________________________________________________________________ * Landgraf and Crutzen 1998 - 10 CONTINUE + case ( 10 ) + nw = 6 wl(1) = 289.0 wl(2) = 305.5 @@ -5630,10 +5614,10 @@ c wlabel = 'isaksen.grid' wu(iw) = wl(iw+1) wc(iw) = 0.5*(wl(iw) + wu(iw)) ENDDO - GO TO 9 *_______________________________________________________________________ * Wild 2000 - 11 CONTINUE + case ( 11 ) + nw = 8 wl(1) = 289.00 wl(2) = 298.25 @@ -5648,10 +5632,11 @@ c wlabel = 'isaksen.grid' wu(iw) = wl(iw+1) wc(iw) = 0.5*(wl(iw) + wu(iw)) ENDDO - GO TO 9 + *_______________________________________________________________________ * Bian and Prather 2002 - 12 CONTINUE + case ( 12 ) + nw = 8 wl(1) = 291.0 wl(2) = 298.3 @@ -5666,13 +5651,12 @@ c wlabel = 'isaksen.grid' wu(iw) = wl(iw+1) wc(iw) = 0.5*(wl(iw) + wu(iw)) ENDDO - GO TO 9 -*_______________________________________________________________________ *_______________________________________________________________________ * UV-b, UV-A, Vis - 13 CONTINUE + case ( 13 ) + nw = 4 wl(1) = 280.0 wl(2) = 315.0 @@ -5683,10 +5667,10 @@ c wlabel = 'isaksen.grid' wu(iw) = wl(iw+1) wc(iw) = 0.5*(wl(iw) + wu(iw)) ENDDO - GO TO 9 + *_______________________________________________________________________ - 9 CONTINUE + end select * check grid for assorted improprieties: @@ -5816,12 +5800,13 @@ c wlabel = 'isaksen.grid' * 4 = mirage z-grid for Mexico City * 5 = arbitrary user-defined grid +#if 0 GO TO 5 *-----grid option 2: manual ----------------- * entire grid (nz levels) in increments zincr - 1 CONTINUE + 1 CONTINUE WRITE(*,*) 'equally spaced z-grid' zincr = (zstop - zstart) / REAL(nz - 1) z(1) = zstart @@ -5941,28 +5926,27 @@ c wlabel = 'isaksen.grid' *-----grid option 5: user defined 5 CONTINUE +#endif * insert your grid values here: * specify: * nz = total number of altitudes * Table: z(iz), where iz goes from 1 to nz C use model levels for vertical grid where available - do 12, i = 1, nlevel + do i = 1, nlevel z(i) = zin(i) *1E-3 -12 continue + end do nz = nlevel C fill up between model top and 50km with 1km grid spacing -20 continue - if (z(nz) .ge. 50.) goto 30 + do while (z(nz) < 50.) nz = nz + 1 if (nz .gt. kz) & call Print_msg( NVERB_FATAL, 'GEN', 'gridz', & 'not enough memory, increase kz' ) z(nz) = z(nz-1) + 1. - goto 20 -C -30 continue + end do +#if 0 C GOTO 10 @@ -5983,6 +5967,7 @@ C *------------------------------------------------ 10 CONTINUE +#endif * Insert additional altitude for selected outputs. @@ -7127,17 +7112,21 @@ C locals OPEN (NEWUNIT=IN_LUN, FILE= $ 'DATAE1/O2/effxstex.txt',FORM='FORMATTED') - READ( IN_LUN, 901 ) +C READ( IN_LUN, 901 ) + READ( IN_LUN, '( / )' ) DO I = 1,20 - READ( IN_LUN, 903 ) ( AC(I,J), J=1,17 ) +C READ( IN_LUN, 903 ) ( AC(I,J), J=1,17 ) + READ( IN_LUN, '( 17(E23.14,1x) )' ) ( AC(I,J), J=1,17 ) ENDDO - READ( IN_LUN, 901 ) +C READ( IN_LUN, 901 ) + READ( IN_LUN, '( / )' ) DO I = 1,20 - READ( IN_LUN, 903 ) ( BC(I,J), J=1,17 ) +C READ( IN_LUN, 903 ) ( BC(I,J), J=1,17 ) + READ( IN_LUN, '( 17(E23.14,1x) )' ) ( BC(I,J), J=1,17 ) ENDDO - 901 FORMAT( / ) - 903 FORMAT( 17(E23.14,1x)) +C 901 FORMAT( / ) +C 903 FORMAT( 17(E23.14,1x)) 998 CLOSE (IN_LUN) @@ -7174,11 +7163,11 @@ c WRITE(6,*) 'X NOT IN RANGE IN CHEBEV', X DD=0. Y=(2.*X-A-B)/(B-A) Y2=2.*Y - DO 11 J=M,2,-1 + DO J=M,2,-1 SV=D D=Y2*D-DD+C(J) DD=SV - 11 CONTINUE + END DO CHEBEV=Y*D-DD+0.5*C(1) RETURN @@ -7839,7 +7828,7 @@ CCC FILE numer.f * also, use this loop to find the point at which xnew needs to be inserted * into vector x, if x is sorted. - 10 CONTINUE + 10 CONTINUE IF (i .LT. n) THEN IF (x(i) .LT. x(i-1)) THEN call Print_msg( NVERB_FATAL, 'GEN', 'addpnt', 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 8b2b47e73c091ec40ccdab80f4ac0aa8b334ba21..219e12397615e3a52af8ccd216f6eafc00f2ff9d 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -187,6 +187,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)) @@ -215,6 +217,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 e1073f233c28c2b4640134fab9ab554b18b422e0..eab7659703ead9f6ee1c679c835ff6b85394cf90 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -265,6 +265,7 @@ END MODULE MODI_MODEL_n ! 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 ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! J. Escobar 27/09/2019: add missing report timing of RESOLVED_ELEC !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -599,7 +600,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 @@ -1735,19 +1736,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 @@ -1765,7 +1766,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, & @@ -1783,7 +1784,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, & @@ -1843,7 +1844,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 @@ -2143,6 +2144,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','=') @@ -2155,8 +2157,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/nband_model.fx90 b/src/MNH/nband_model.fx90 index 53afd5948ba507103dc76601f246710c187b3b11..e0aface0e240a114c19048fbf5ddf99cb6c969f5 100644 --- a/src/MNH/nband_model.fx90 +++ b/src/MNH/nband_model.fx90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-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. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 diag 2006/05/18 13:07:25 -!----------------------------------------------------------------- ***FILE: nband_model.f ***AUTHOR: J.-P. Chaboureau *LA* ***DATE: 29/03/00 @@ -17,6 +12,8 @@ * indicated by "*MNH" * named nband_model.f90 and compiled with -Fixed * J.Escobar (1/12/2017) bug => intialized all ZV=0.0 in spectr +* P. Wautelet 21/11/2019: replace several CONTINUE (workaround of problems with gfortran OpenACC) +* SUBROUTINE NBMVEC I ( KIDIA ,KFDIA ,KLON,KLEV,KGL,KCABS,KNG1,KUABS I , KH2O ,KCO2 ,KO3,KCNT,KN2O,KCH4,KCO,KC11,KC12,KCFC @@ -145,20 +142,20 @@ C IF (NIMP.EQ.0) STOP *MNH PCMCH4 = CVCH4 * RCH4M / RAIRM PCMCH4 = XCH4 * XCH4M / XAIRM C - DO 103 JA=1,8 - DO 102 JK=1,KGL+1 - DO 101 JL=KIDIA,KFDIA - ZU(JL,JA,JK)=0. - 101 CONTINUE - 102 CONTINUE - 103 CONTINUE - DO 106 JA=1,3 - DO 105 JK=1,KGL+1 - DO 104 JL=KIDIA,KFDIA - ZXT(JL,JA,JK)=0. - 104 CONTINUE - 105 CONTINUE - 106 CONTINUE + DO JA=1,8 + DO JK=1,KGL+1 + DO JL=KIDIA,KFDIA + ZU(JL,JA,JK)=0. + END DO + END DO + END DO + DO JA=1,3 + DO JK=1,KGL+1 + DO JL=KIDIA,KFDIA + ZXT(JL,JA,JK)=0. + END DO + END DO + END DO c DO 113 JNIV=1,2 c DO 112 JSI=1,10 c DO 111 JL=KIDIA,KFDIA @@ -178,26 +175,26 @@ C 200 CONTINUE C IG1P1=KNG1+1 - DO 201 JL=KIDIA,KFDIA + DO JL=KIDIA,KFDIA ZSSIG(JL,1)=PPL(JL,1) - 201 CONTINUE + END DO C - DO 206 JK = 1 , KLEV - JKJ=(JK-1)*IG1P1+1 - JKJR = JKJ - JKJP = JKJ + IG1P1 - DO 203 JL = KIDIA,KFDIA - ZSSIG(JL,JKJP)=PPL(JL,JK+1) - 203 CONTINUE - DO 205 IG1=1,KNG1 - JKJ=JKJ+1 - DO 204 JL = KIDIA,KFDIA - ZSSIG(JL,JKJ)= (ZSSIG(JL,JKJR)+ZSSIG(JL,JKJP))*0.5 + DO JK = 1 , KLEV + JKJ=(JK-1)*IG1P1+1 + JKJR = JKJ + JKJP = JKJ + IG1P1 + DO JL = KIDIA,KFDIA + ZSSIG(JL,JKJP)=PPL(JL,JK+1) + END DO + DO IG1=1,KNG1 + JKJ=JKJ+1 + DO JL = KIDIA,KFDIA + ZSSIG(JL,JKJ)= (ZSSIG(JL,JKJR)+ZSSIG(JL,JKJP))*0.5 *MNH S + RT1(IG1) * (ZSSIG(JL,JKJP) - ZSSIG(JL,JKJR)) * 0.5 - S + XRT1(IG1) * (ZSSIG(JL,JKJP) - ZSSIG(JL,JKJR)) * 0.5 - 204 CONTINUE - 205 CONTINUE - 206 CONTINUE + S + XRT1(IG1) * (ZSSIG(JL,JKJP) - ZSSIG(JL,JKJR)) * 0.5 + END DO + END DO + END DO C C----------------------------------------------------------------------- C @@ -219,39 +216,39 @@ C 9301 FORMAT(1X,I4,2E13.6) C END IF 302 CONTINUE C - DO 306 JK = 1 , KLEV - JKP1=JK+1 - JKL = KLEV+1 - JK - DO 303 JL = KIDIA,KFDIA - ZXWV(JL) = MAX (PQVAVE(JL,JK) , ZEPSCQ ) - ZXOZ(JL) = MAX (PO3AVE(JL,JK) , ZEPSCO ) - 303 CONTINUE - JKJ=(JK-1)*IG1P1+1 - JKJPN=JKJ+KNG1 - DO 305 JKK=JKJ,JKJPN - DO 304 JL = KIDIA,KFDIA - ZUPMH2O = ( ZUPM(JL,JKK) + PVGH2O ) * ZDPM(JL,JKK) / 101325. - ZUPMCO2 = ( ZUPM(JL,JKK) + PVGCO2 ) * ZDPM(JL,JKK) / 101325. - ZUPMO3 = ( ZUPM(JL,JKK) + PVGO3 ) * ZDPM(JL,JKK) / 101325. - ZDUC(JL,JKK)= ZDPM(JL,JK) - ZU6= ZXWV(JL) * ZUPMH2O - ZFPPW= 1.6078 * ZXWV(JL) / (1.+0.608*ZXWV(JL)) - ZU(JL, 1,JKK) = ZXWV(JL) * ZDPM(JL,JKK) - ZU(JL, 2,JKK) = ZXWV(JL) * ZUPMH2O - ZU(JL, 3,JKK) = PCMCO2 * ZDPM(JL,JKK) - ZU(JL, 4,JKK) = PCMCO2 * ZUPMCO2 - ZU(JL, 5,JKK) = ZXOZ(JL) * ZDPM(JL,JKK) - ZU(JL, 6,JKK) = ZXOZ(JL) * ZUPMO3 - ZU(JL, 7,JKK) = ZU6 * ZFPPW - ZU(JL, 8,JKK) = ZU6 * (1.-ZFPPW) - 304 CONTINUE - 305 CONTINUE - 306 CONTINUE - DO 308 JA=1,8 - DO 307 JL=KIDIA,KFDIA - ZU(JL,JA,KGL+1) = 0. - 307 CONTINUE - 308 CONTINUE + DO JK = 1 , KLEV + JKP1=JK+1 + JKL = KLEV+1 - JK + DO JL = KIDIA,KFDIA + ZXWV(JL) = MAX (PQVAVE(JL,JK) , ZEPSCQ ) + ZXOZ(JL) = MAX (PO3AVE(JL,JK) , ZEPSCO ) + END DO + JKJ=(JK-1)*IG1P1+1 + JKJPN=JKJ+KNG1 + DO JKK=JKJ,JKJPN + DO JL = KIDIA,KFDIA + ZUPMH2O = ( ZUPM(JL,JKK) + PVGH2O ) * ZDPM(JL,JKK) / 101325. + ZUPMCO2 = ( ZUPM(JL,JKK) + PVGCO2 ) * ZDPM(JL,JKK) / 101325. + ZUPMO3 = ( ZUPM(JL,JKK) + PVGO3 ) * ZDPM(JL,JKK) / 101325. + ZDUC(JL,JKK)= ZDPM(JL,JK) + ZU6= ZXWV(JL) * ZUPMH2O + ZFPPW= 1.6078 * ZXWV(JL) / (1.+0.608*ZXWV(JL)) + ZU(JL, 1,JKK) = ZXWV(JL) * ZDPM(JL,JKK) + ZU(JL, 2,JKK) = ZXWV(JL) * ZUPMH2O + ZU(JL, 3,JKK) = PCMCO2 * ZDPM(JL,JKK) + ZU(JL, 4,JKK) = PCMCO2 * ZUPMCO2 + ZU(JL, 5,JKK) = ZXOZ(JL) * ZDPM(JL,JKK) + ZU(JL, 6,JKK) = ZXOZ(JL) * ZUPMO3 + ZU(JL, 7,JKK) = ZU6 * ZFPPW + ZU(JL, 8,JKK) = ZU6 * (1.-ZFPPW) + END DO + END DO + END DO + DO JA=1,8 + DO JL=KIDIA,KFDIA + ZU(JL,JA,KGL+1) = 0. + END DO + END DO C IF (NIMP.EQ.0) THEN C DO 312 JK=1,KGL+1 C PRINT 9312,JK,(ZU(KIDIA,JA,JK),JA=1,8) @@ -1681,37 +1678,35 @@ C ------------------------------------------------------------------ C C 1. C - 100 CONTINUE -C - DO 101 JL=KIDIA,KFDIA - PTAU(JL)=0. - 101 CONTINUE + DO JL=KIDIA,KFDIA + PTAU(JL)=0. + END DO C *MNH IF (PWVN.GT.CLIM(1) .AND. PWVN.LT.CLIM(2)) THEN IF (PWVN.GT.XCLIM(1) .AND. PWVN.LT.XCLIM(2)) THEN C ZCOEF=4.18 + 5578.*EXP(-7.87e-03*PWVN) - DO 102 JL=KIDIA,KFDIA - ZE(JL)=PV(JL,11,KINF)-PV(JL,11,KSUP) - ZP(JL)=PV(JL,12,KINF)-PV(JL,12,KSUP) - ZTAUE(JL)=PANGLE(JL)*ZCOEF*ZE(JL) - ZTAUP(JL)=PANGLE(JL)*ZCOEF*ZP(JL)*0.002 - 102 CONTINUE + DO JL=KIDIA,KFDIA + ZE(JL)=PV(JL,11,KINF)-PV(JL,11,KSUP) + ZP(JL)=PV(JL,12,KINF)-PV(JL,12,KSUP) + ZTAUE(JL)=PANGLE(JL)*ZCOEF*ZE(JL) + ZTAUP(JL)=PANGLE(JL)*ZCOEF*ZP(JL)*0.002 + END DO C IF (KCABS.EQ.20) THEN - DO 103 JL=KIDIA,KFDIA - ZTAUE(JL)=0. - 103 CONTINUE + DO JL=KIDIA,KFDIA + ZTAUE(JL)=0. + END DO END IF IF (KCABS.EQ.21) THEN - DO 104 JL=KIDIA,KFDIA - ZTAUP(JL)=0. - 104 CONTINUE + DO JL=KIDIA,KFDIA + ZTAUP(JL)=0. + END DO END IF C - DO 105 JL=KIDIA,KFDIA - PTAU(JL)=ZTAUE(JL)+ZTAUP(JL) - 105 CONTINUE + DO JL=KIDIA,KFDIA + PTAU(JL)=ZTAUE(JL)+ZTAUP(JL) + END DO END IF C C ------------------------------------------------------------------ @@ -2043,86 +2038,78 @@ C C* 1. INITIALIZE TO CLEAR-SKY FLUXES C ------------------------------ C - 100 CONTINUE IMAXC=KLEV REPSEC=1.E-12 REPSEC=1.e-7 ! JPChaboureau's modification to avoid division by zero C - DO 102 JK = 1 , KLEV+1 - DO 101 JL = KIDIA,KFDIA - PFDT(JL,JK) = PFDC(JL,JK) - PFUT(JL,JK) = PFUC(JL,JK) - 101 CONTINUE - 102 CONTINUE + DO JK = 1 , KLEV+1 + DO JL = KIDIA,KFDIA + PFDT(JL,JK) = PFDC(JL,JK) + PFUT(JL,JK) = PFUC(JL,JK) + END DO + END DO C - DO 105 JK1=1,KLEV+1 - DO 104 JK2=1,KLEV+1 - DO 103 JL = KIDIA,KFDIA - ZUPF(JL,JK2,JK1)=PFUC(JL,JK1) - ZDNF(JL,JK2,JK1)=PFDC(JL,JK1) - 103 CONTINUE - 104 CONTINUE - 105 CONTINUE + DO JK1=1,KLEV+1 + DO JK2=1,KLEV+1 + DO JL = KIDIA,KFDIA + ZUPF(JL,JK2,JK1)=PFUC(JL,JK1) + ZDNF(JL,JK2,JK1)=PFDC(JL,JK1) + END DO + END DO + END DO C C ------------------------------------------------------------------ C C* 2. FLUXES FOR ONE OVERCAST UNITY EMISSIVITY CLOUD C ---------------------------------------------- C - 200 CONTINUE -C - DO 229 JKC = 1 , IMAXC - JCLOUD=JKC - JKCP1=JCLOUD+1 + DO JKC = 1 , IMAXC + JCLOUD=JKC + JKCP1=JCLOUD+1 C C* 2.1 ABOVE THE CLOUD C --------------- C - 210 CONTINUE -C - DO 215 JK=JKCP1,KLEV+1 - JKM1=JK-1 - DO 211 JL = KIDIA,KFDIA - ZFU(JL)=0. - 211 CONTINUE - IF (JK .GT. JKCP1) THEN - DO 213 JKJ=JKCP1,JKM1 - DO 212 JL = KIDIA,KFDIA - ZFU(JL) = ZFU(JL) + PCNTRB(JL,JK,JKJ) - 212 CONTINUE - 213 CONTINUE - END IF -C - DO 214 JL = KIDIA,KFDIA - ZUPF(JL,JKCP1,JK)=PBLEV(JL,JK)-ZFU(JL) - 214 CONTINUE - 215 CONTINUE + DO JK=JKCP1,KLEV+1 + JKM1=JK-1 + DO JL = KIDIA,KFDIA + ZFU(JL)=0. + END DO + IF (JK .GT. JKCP1) THEN + DO JKJ=JKCP1,JKM1 + DO JL = KIDIA,KFDIA + ZFU(JL) = ZFU(JL) + PCNTRB(JL,JK,JKJ) + END DO + END DO + END IF +C + DO JL = KIDIA,KFDIA + ZUPF(JL,JKCP1,JK)=PBLEV(JL,JK)-ZFU(JL) + END DO + END DO C C C* 2.2 BELOW THE CLOUD C --------------- C - 220 CONTINUE -C - DO 225 JK=1,JCLOUD - JKP1=JK+1 - DO 221 JL = KIDIA,KFDIA - ZFD(JL)=0. - 221 CONTINUE -C - IF (JK .LT. JCLOUD) THEN - DO 223 JKJ=JKP1,JCLOUD - DO 222 JL = KIDIA,KFDIA - ZFD(JL) = ZFD(JL) + PCNTRB(JL,JK,JKJ) - 222 CONTINUE - 223 CONTINUE - END IF - DO 224 JL = KIDIA,KFDIA - ZDNF(JL,JKCP1,JK)=-PBLEV(JL,JK)-ZFD(JL) - 224 CONTINUE - 225 CONTINUE -C - 229 CONTINUE + DO JK=1,JCLOUD + JKP1=JK+1 + DO JL = KIDIA,KFDIA + ZFD(JL)=0. + END DO +C + IF (JK .LT. JCLOUD) THEN + DO JKJ=JKP1,JCLOUD + DO JL = KIDIA,KFDIA + ZFD(JL) = ZFD(JL) + PCNTRB(JL,JK,JKJ) + END DO + END DO + END IF + DO JL = KIDIA,KFDIA + ZDNF(JL,JKCP1,JK)=-PBLEV(JL,JK)-ZFD(JL) + END DO + END DO + END DO C C ------------------------------------------------------------------ C @@ -2132,130 +2119,120 @@ C C* ZCLM(JK1,JK2) IS THE OBSCURATION FACTOR BY CLOUD LAYERS BETWEEN C HALF-LEVELS JK1 AND JK2 AS SEEN FROM JK1 C - 300 CONTINUE -C - DO 303 JK1 = 1 , KLEV+1 - DO 302 JK2 = 1 , KLEV+1 - DO 301 JL = KIDIA,KFDIA - ZCLM(JL,JK1,JK2) = 0. - 301 CONTINUE - 302 CONTINUE - 303 CONTINUE + DO JK1 = 1 , KLEV+1 + DO JK2 = 1 , KLEV+1 + DO JL = KIDIA,KFDIA + ZCLM(JL,JK1,JK2) = 0. + END DO + END DO + END DO C C C C* 3.1 CLOUD COVER BELOW THE LEVEL OF CALCULATION C ------------------------------------------ C - 310 CONTINUE -C - DO 314 JK1 = 2 , KLEV+1 - DO 311 JL = KIDIA,KFDIA - ZCLEAR(JL)=1. - ZCLOUD(JL)=0. - 311 CONTINUE - DO 313 JK = JK1 - 1 , 1 , -1 - DO 312 JL = KIDIA,KFDIA - IF (KOVLP.EQ.1) THEN -c* maximum-random - ZCLEAR(JL)=ZCLEAR(JL)*(1.0-MAX(PCLDLU(JL,JK),ZCLOUD(JL))) + DO JK1 = 2 , KLEV+1 + DO JL = KIDIA,KFDIA + ZCLEAR(JL)=1. + ZCLOUD(JL)=0. + END DO + DO JK = JK1 - 1 , 1 , -1 + DO JL = KIDIA,KFDIA + IF (KOVLP.EQ.1) THEN +c* maximum-random + ZCLEAR(JL)=ZCLEAR(JL)*(1.0-MAX(PCLDLU(JL,JK),ZCLOUD(JL))) * /(1.0-MIN(ZCLOUD(JL),1.-REPSEC)) - ZCLM(JL,JK1,JK) = 1.0 - ZCLEAR(JL) - ZCLOUD(JL) = PCLDLU(JL,JK) - ELSE IF (KOVLP.EQ.2) THEN -c* maximum -c ZCLOUD(JL) = AMAX1(ZCLOUD(JL) , PCLDLU(JL,JK)) - ZCLOUD(JL)=MAX(ZCLOUD(JL),PCLDLU(JL,JK)) - ZCLM(JL,JK1,JK) = ZCLOUD(JL) - ELSE IF (KOVLP.EQ.3) THEN -c* random - ZCLEAR(JL) = ZCLEAR(JL)*(1.0 - PCLDLU(JL,JK)) - ZCLOUD(JL) = 1.0 - ZCLEAR(JL) - ZCLM(JL,JK1,JK) = ZCLOUD(JL) - END IF - 312 CONTINUE - 313 CONTINUE - 314 CONTINUE + ZCLM(JL,JK1,JK) = 1.0 - ZCLEAR(JL) + ZCLOUD(JL) = PCLDLU(JL,JK) + ELSE IF (KOVLP.EQ.2) THEN +c* maximum +c ZCLOUD(JL) = AMAX1(ZCLOUD(JL) , PCLDLU(JL,JK)) + ZCLOUD(JL)=MAX(ZCLOUD(JL),PCLDLU(JL,JK)) + ZCLM(JL,JK1,JK) = ZCLOUD(JL) + ELSE IF (KOVLP.EQ.3) THEN +c* random + ZCLEAR(JL) = ZCLEAR(JL)*(1.0 - PCLDLU(JL,JK)) + ZCLOUD(JL) = 1.0 - ZCLEAR(JL) + ZCLM(JL,JK1,JK) = ZCLOUD(JL) + END IF + END DO + END DO + END DO C C C* 3.2 CLOUD COVER ABOVE THE LEVEL OF CALCULATION C ------------------------------------------ C - 320 CONTINUE -C - DO 324 JK1 = 1 , KLEV - DO 321 JL = KIDIA,KFDIA - ZCLEAR(JL)=1. - ZCLOUD(JL)=0. - 321 CONTINUE - DO 323 JK = JK1 , KLEV - DO 322 JL = KIDIA,KFDIA - IF (KOVLP.EQ.1) THEN -c* maximum-random - ZCLEAR(JL)=ZCLEAR(JL)*(1.0-MAX(PCLDLD(JL,JK),ZCLOUD(JL))) + DO JK1 = 1 , KLEV + DO JL = KIDIA,KFDIA + ZCLEAR(JL)=1. + ZCLOUD(JL)=0. + END DO + DO JK = JK1 , KLEV + DO JL = KIDIA,KFDIA + IF (KOVLP.EQ.1) THEN +c* maximum-random + ZCLEAR(JL)=ZCLEAR(JL)*(1.0-MAX(PCLDLD(JL,JK),ZCLOUD(JL))) * /(1.0-MIN(ZCLOUD(JL),1.-REPSEC)) - ZCLM(JL,JK1,JK) = 1.0 - ZCLEAR(JL) - ZCLOUD(JL) = PCLDLD(JL,JK) - ELSE IF (KOVLP.EQ.2) THEN -c* maximum -c ZCLOUD(JL) = AMAX1(ZCLOUD(JL) , PCLDLD(JL,JK)) - ZCLOUD(JL)=MAX(ZCLOUD(JL) , PCLDLD(JL,JK)) - ZCLM(JL,JK1,JK) = ZCLOUD(JL) - ELSE IF (KOVLP.EQ.3) THEN -c* random - ZCLEAR(JL) = ZCLEAR(JL)*(1.0 - PCLDLD(JL,JK)) - ZCLOUD(JL) = 1.0 - ZCLEAR(JL) - ZCLM(JL,JK1,JK) = ZCLOUD(JL) - END IF - 322 CONTINUE - 323 CONTINUE - 324 CONTINUE + ZCLM(JL,JK1,JK) = 1.0 - ZCLEAR(JL) + ZCLOUD(JL) = PCLDLD(JL,JK) + ELSE IF (KOVLP.EQ.2) THEN +c* maximum +c ZCLOUD(JL) = AMAX1(ZCLOUD(JL) , PCLDLD(JL,JK)) + ZCLOUD(JL)=MAX(ZCLOUD(JL) , PCLDLD(JL,JK)) + ZCLM(JL,JK1,JK) = ZCLOUD(JL) + ELSE IF (KOVLP.EQ.3) THEN +c* random + ZCLEAR(JL) = ZCLEAR(JL)*(1.0 - PCLDLD(JL,JK)) + ZCLOUD(JL) = 1.0 - ZCLEAR(JL) + ZCLM(JL,JK1,JK) = ZCLOUD(JL) + END IF + END DO + END DO + END DO C C C ------------------------------------------------------------------ C C* 4. FLUXES FOR PARTIAL/MULTIPLE LAYERED CLOUDINESS C ---------------------------------------------- -C - 400 CONTINUE C C* 4.1 DOWNWARD FLUXES C --------------- C - 410 CONTINUE -C - DO 411 JL = KIDIA,KFDIA - PFDT(JL,KLEV+1) = 0. - 411 CONTINUE + DO JL = KIDIA,KFDIA + PFDT(JL,KLEV+1) = 0. + END DO C - DO 417 JK1 = KLEV , 1 , -1 + DO JK1 = KLEV , 1 , -1 C C* CONTRIBUTION FROM CLEAR-SKY FRACTION C - DO 412 JL = KIDIA,KFDIA - ZFD (JL) = (1. - ZCLM(JL,JK1,KLEV)) * ZDNF(JL,1,JK1) - 412 CONTINUE + DO JL = KIDIA,KFDIA + ZFD (JL) = (1. - ZCLM(JL,JK1,KLEV)) * ZDNF(JL,1,JK1) + END DO C C* CONTRIBUTION FROM ADJACENT CLOUD C - DO 413 JL = KIDIA,KFDIA - ZFD(JL) = ZFD(JL) + ZCLM(JL,JK1,JK1) * ZDNF(JL,JK1+1,JK1) - 413 CONTINUE + DO JL = KIDIA,KFDIA + ZFD(JL) = ZFD(JL) + ZCLM(JL,JK1,JK1) * ZDNF(JL,JK1+1,JK1) + END DO C C* CONTRIBUTION FROM OTHER CLOUDY FRACTIONS C - DO 415 JK = KLEV-1 , JK1 , -1 - DO 414 JL = KIDIA,KFDIA - ZCFRAC = ZCLM(JL,JK1,JK+1) - ZCLM(JL,JK1,JK) - ZFD(JL) = ZFD(JL) + ZCFRAC * ZDNF(JL,JK+2,JK1) - 414 CONTINUE - 415 CONTINUE + DO JK = KLEV-1 , JK1 , -1 + DO JL = KIDIA,KFDIA + ZCFRAC = ZCLM(JL,JK1,JK+1) - ZCLM(JL,JK1,JK) + ZFD(JL) = ZFD(JL) + ZCFRAC * ZDNF(JL,JK+2,JK1) + END DO + END DO C - DO 416 JL = KIDIA,KFDIA - PFDT(JL,JK1) = ZFD (JL) - 416 CONTINUE + DO JL = KIDIA,KFDIA + PFDT(JL,JK1) = ZFD (JL) + END DO C - 417 CONTINUE + END DO C C C @@ -2263,11 +2240,9 @@ C C* 4.2 UPWARD FLUX AT THE SURFACE C -------------------------- C - 420 CONTINUE -C - DO 421 JL = KIDIA,KFDIA - PFUT(JL,1) = PEM0(JL)*PBSUR(JL)-(1.-PEM0(JL))*PFDT(JL,1) - 421 CONTINUE + DO JL = KIDIA,KFDIA + PFUT(JL,1) = PEM0(JL)*PBSUR(JL)-(1.-PEM0(JL))*PFDT(JL,1) + END DO C C C @@ -2275,36 +2250,34 @@ C C* 4.3 UPWARD FLUXES C ------------- C - 430 CONTINUE -C - DO 437 JK1 = 2 , KLEV+1 + DO JK1 = 2 , KLEV+1 C C* CONTRIBUTION FROM CLEAR-SKY FRACTION C - DO 432 JL = KIDIA,KFDIA - ZFU (JL) = (1. - ZCLM(JL,JK1,1)) * ZUPF(JL,1,JK1) - 432 CONTINUE + DO JL = KIDIA,KFDIA + ZFU (JL) = (1. - ZCLM(JL,JK1,1)) * ZUPF(JL,1,JK1) + END DO C C* CONTRIBUTION FROM ADJACENT CLOUD C - DO 433 JL = KIDIA,KFDIA - ZFU(JL) = ZFU(JL) + ZCLM(JL,JK1,JK1-1) * ZUPF(JL,JK1,JK1) - 433 CONTINUE + DO JL = KIDIA,KFDIA + ZFU(JL) = ZFU(JL) + ZCLM(JL,JK1,JK1-1) * ZUPF(JL,JK1,JK1) + END DO C C* CONTRIBUTION FROM OTHER CLOUDY FRACTIONS C - DO 435 JK = 2 , JK1-1 - DO 434 JL = KIDIA,KFDIA - ZCFRAC = ZCLM(JL,JK1,JK-1) - ZCLM(JL,JK1,JK) - ZFU(JL) = ZFU(JL) + ZCFRAC * ZUPF(JL,JK ,JK1) - 434 CONTINUE - 435 CONTINUE + DO JK = 2 , JK1-1 + DO JL = KIDIA,KFDIA + ZCFRAC = ZCLM(JL,JK1,JK-1) - ZCLM(JL,JK1,JK) + ZFU(JL) = ZFU(JL) + ZCFRAC * ZUPF(JL,JK ,JK1) + END DO + END DO C - DO 436 JL = KIDIA,KFDIA - PFUT(JL,JK1) = ZFU (JL) - 436 CONTINUE + DO JL = KIDIA,KFDIA + PFUT(JL,JK1) = ZFU (JL) + END DO C - 437 CONTINUE + END DO C C----------------------------------------------------------------------- C 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 e9beceaa387a7a84ff6bf6d8dc2e4e4ae4998d65..70d3fb4411aa6ae6e3fd8f2064de5efe09b16d68 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 ce7a3f0b758036b8e485499aebcb6954304d05f4..a311590ffb2047a34726c276c78d3f0797a3b8c1 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -96,7 +96,7 @@ USE MODD_GRID USE MODD_SUB_PROFILER_n USE MODD_NSV USE MODD_PARAMETERS -USE MODD_PARAM_n, ONLY : CCLOUD +USE MODD_PARAM_n, ONLY: CCLOUD, CRAD USE MODD_PROFILER_n USE MODD_TIME, only: tdtexp USE MODD_TIME_n, only: tdtcur @@ -512,10 +512,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 @@ -544,10 +546,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 a86f384b1897094e5aa356dc6f91ceb96e1e2243..b2ba41a713963f3ceeeafdafe61ed2306ae3788a 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -907,7 +907,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 33f1fa4a9ffea8542d8f8dfa55fafb3393a80b49..1c71367b1befd1043898e32e5c4c2450e1fd8363 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -90,11 +90,11 @@ USE MODD_CST USE MODD_DIAG_IN_RUN USE MODD_GRID USE MODD_PARAMETERS -USE MODD_STATION_n -USE MODD_SUB_STATION_n +USE MODD_PARAM_n, only: CRAD +use modd_station_n +use modd_sub_station_n use modd_time, only: tdtexp use modd_time_n, only: tdtcur -USE MODD_TYPE_DATE ! USE MODE_ll ! @@ -372,6 +372,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 ) @@ -379,6 +380,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 @@ -409,6 +411,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)) @@ -416,6 +419,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 @@ -460,6 +464,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)) @@ -467,6 +472,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 54d2170c1a52324b5db3370b510595760f113a42..fb7a01b5c23b3149fbb469bd7c7590a3adb5560d 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 diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 507f7483f288dedbc181446fef1d2b85f7590827..7b3ed0d552d36004c3120719f63873269c4dbc57 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -83,8 +83,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_AERO_PSD USE MODE_DUST_PSD @@ -315,6 +316,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' @@ -339,6 +341,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 4361a9a91fd94f13896036f97c2344d0779ff93e..f5d3a81f2e14d54d1385efac2eef39bb161e3921 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -79,6 +79,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 @@ -273,6 +274,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' @@ -315,6 +317,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}