diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index 904898810bf8d5521d21c3769d90c19cf545d252..77edd7856ee417f1f83c3a37debe7bd20dcd097b 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2024 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -977,7 +977,8 @@ END DO 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 + USE MODD_GRID_n, ONLY: LSLEVE, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZHATM, & + XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll USE MODD_IO, ONLY: LIOCDF4 USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PARAMETERS_ll, ONLY: JPHEXT_ll=>JPHEXT, JPVEXT_ll=>JPVEXT @@ -985,6 +986,7 @@ END DO USE MODE_IO_FILE, ONLY: IO_FILE_OPEN, IO_FILE_CLOSE USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST + USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: infiles TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: outfiles @@ -997,6 +999,7 @@ END DO character(len=:), allocatable :: yunits INTEGER :: idx, IRESP2 + integer :: iiu, iju, iku integer :: inb_procio_r_save INTEGER(KIND=CDFINT) :: ioldmode INTEGER(KIND=CDFINT) :: istatus @@ -1095,18 +1098,33 @@ END DO 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)) + iiu = nimax_ll + 2 * JPHEXT + ALLOCATE( XXHAT(iiu), XXHATM(iiu) ) 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)) + iju = njmax_ll + 2 * JPHEXT + ALLOCATE( XYHAT(iju), XYHATM(iju) ) 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') + ! Interpolations of positions to mass points + XXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU) + XXHATM( IIU) = 1.5 * XXHAT( IIU) - 0.5 * XXHAT(IIU-1) + + XYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU) + XYHATM( IJU) = 1.5 * XYHAT( IJU) - 0.5 * XYHAT(IJU-1) + + ! Set global domain boundaries (hypothesis: only 1 process) + XXHAT_ll => XXHAT + XYHAT_ll => XYHAT + XXHATM_ll => XXHATM + XYHATM_ll => XYHATM + 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) @@ -1146,12 +1164,16 @@ END DO ! 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)) + iku = nkmax + 2 * JPVEXT + ALLOCATE( XZHAT(iku), XZHATM(iku) ) 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') + ! Interpolations of vertical positions to mass points + CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM ) + ALLOCATE(LSLEVE) CALL IO_Field_read(INFILES(1)%TFILE,'SLEVE',LSLEVE,IRESP2) !If not found in main file, try the fallback one