From 0f734e52e71fc3c834f7e4857a8d950d7e7844d5 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 20 Feb 2023 13:10:51 +0100 Subject: [PATCH] Philippe 20/02/2023: IO: add suffix to logicals written from SURFEX (to prevent name collisions with MesoNH variables) --- src/MNH/read_surf_mnh.f90 | 34 ++++++++++++++++++++++++++++------ src/MNH/write_surf_mnh.f90 | 17 +++++++++++++---- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90 index 96693291f..1edbd37ea 100644 --- a/src/MNH/read_surf_mnh.f90 +++ b/src/MNH/read_surf_mnh.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2003-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-2023 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. @@ -18,10 +18,12 @@ CONTAINS SUBROUTINE PREPARE_METADATA_READ_SURF(HREC,HDIR,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD) ! -use modd_field, only: tfieldmetadata, tfieldlist -use mode_field, only: Find_field_id_from_mnhname +use modd_field, only: tfieldmetadata, tfieldlist +use modd_parameters, only: NMNHNAMELGTMAX + +use mode_field, only: Find_field_id_from_mnhname ! -CHARACTER(LEN=LEN_HREC),INTENT(IN) :: HREC ! name of the article to write +CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to write CHARACTER(LEN=2), INTENT(IN) :: HDIR ! Expected type of the data field (XX,XY,--...) INTEGER, INTENT(IN) :: KGRID ! Localization on the model grid INTEGER, INTENT(IN) :: KTYPE ! Datatype @@ -32,6 +34,9 @@ TYPE(TFIELDMETADATA), INTENT(OUT) :: TPFIELD ! metadata of field CHARACTER(LEN=32) :: YTXT INTEGER :: IID, IRESP ! +IF ( LEN_TRIM( HREC ) > NMNHNAMELGTMAX ) & + CALL PRINT_MSG( NVERB_WARNING, 'IO', TRIM(HSUBR), 'HREC is too long (' // TRIM(HREC) // ')' ) + CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.) IF (IRESP==0) THEN TPFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) @@ -1591,6 +1596,8 @@ CHARACTER(LEN=*), INTENT(OUT) :: HCOMMENT ! comment ! !* 0.2 Declarations of local variables ! +CHARACTER(LEN=4), PARAMETER :: YSUFFIX = '_SFX' + INTEGER :: ILUOUT TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- @@ -1614,8 +1621,23 @@ IF (HREC=='ECOCLIMAP') THEN END IF END IF ! -CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPELOG,0,'READ_SURFL0_MNH',TZFIELD) -CALL IO_Field_read(TPINFILE,TZFIELD,OFIELD,KRESP) +IF ( TPINFILE%NMNHVERSION(1) < 5 .OR. ( TPINFILE%NMNHVERSION(1) == 5 .AND. TPINFILE%NMNHVERSION(2) < 6 ) ) THEN + CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPELOG,0,'READ_SURFL0_MNH',TZFIELD) + CALL IO_Field_read(TPINFILE,TZFIELD,OFIELD,KRESP) +ELSE + ! Add a suffix to logical variables coming from SURFEX + ! This is done because some variables can have the same name than MesoNH variables + ! This suffix has been added in MesoNH 5.6.0 + CALL PREPARE_METADATA_READ_SURF(TRIM(HREC)//YSUFFIX,'--',0,TYPELOG,0,'READ_SURFL0_MNH',TZFIELD) + CALL IO_Field_read(TPINFILE,TZFIELD,OFIELD,KRESP) + + IF ( KRESP /= 0 ) THEN + ! Retries without the suffix + ! Potentially useful if tpinfile was not written with MesoNH + CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPELOG,0,'READ_SURFL0_MNH',TZFIELD) + CALL IO_Field_read(TPINFILE,TZFIELD,OFIELD,KRESP) + END IF +END IF HCOMMENT = TZFIELD%CCOMMENT ! IF (KRESP /=0) THEN diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90 index 490481b6f..c17800ab6 100644 --- a/src/MNH/write_surf_mnh.f90 +++ b/src/MNH/write_surf_mnh.f90 @@ -11,12 +11,13 @@ CONTAINS SUBROUTINE PREPARE_METADATA_WRITE_SURF(HREC,HDIR,HCOMMENT,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD) ! -use modd_field, only: tfieldmetadata, tfieldlist, NMNHDIM_UNUSED +use modd_field, only: tfieldmetadata, tfieldlist, NMNHDIM_UNUSED +use modd_parameters, only: NMNHNAMELGTMAX -use mode_field, only: Find_field_id_from_mnhname +use mode_field, only: Find_field_id_from_mnhname USE MODE_MSG ! -CHARACTER(LEN=LEN_HREC),INTENT(IN) :: HREC ! name of the article to write +CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to write CHARACTER(LEN=2), INTENT(IN) :: HDIR ! Expected type of the data field (XX,XY,--...) CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string INTEGER, INTENT(IN) :: KGRID ! Localization on the model grid @@ -29,6 +30,9 @@ CHARACTER(LEN=32) :: YTXT INTEGER :: IDX,IID, IRESP LOGICAL :: GWARN ! +IF ( LEN_TRIM( HREC ) > NMNHNAMELGTMAX ) & + CALL PRINT_MSG( NVERB_WARNING, 'IO', TRIM(HSUBR), 'HREC is too long (' // TRIM(HREC) // ')' ) + CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.) IF (IRESP==0) THEN TPFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) @@ -1356,6 +1360,8 @@ CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string ! !* 0.2 Declarations of local variables ! +CHARACTER(LEN=4), PARAMETER :: YSUFFIX = '_SFX' + CHARACTER(LEN=5) :: YMSG TYPE(TFIELDMETADATA) :: TZFIELD ! @@ -1366,7 +1372,10 @@ IF( (CMASK /= 'FULL ').AND. (HREC=='COVER') ) THEN TRIM(CMASK)//' not written in file by externalized surface') RETURN ELSE - CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPELOG,0,'WRITE_SURFL0_MNH',TZFIELD) + ! Add a suffix to logical variables coming from SURFEX + ! This is done because some variables can have the same name than MesoNH variables + ! This suffix has been added in MesoNH 5.6.0 + CALL PREPARE_METADATA_WRITE_SURF(TRIM(HREC)//YSUFFIX,'--',HCOMMENT,0,TYPELOG,0,'WRITE_SURFL0_MNH',TZFIELD) CALL IO_Field_write(TFILE_SURFEX,TZFIELD,OFIELD,KRESP) END IF ! -- GitLab