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