From 9e500e8fab59be67028be76478106f6a164e37c1 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 10 Apr 2018 14:05:49 +0200
Subject: [PATCH] Philippe 10/04/2018: IO: add HPROGRAM_ORIG optional argument
 to IO_SET_KNOWNDIMS_NC4

---
 src/LIB/SURCOUCHE/src/mode_fm.f90     | 12 +++++++-----
 src/LIB/SURCOUCHE/src/mode_io.f90     |  7 +++++--
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 20 ++++++++++++++------
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index e175c32fd..48aaf6baf 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -51,7 +51,7 @@ IF ( IP .EQ. 1 ) PRINT *,'INIT L1D,L2D,LPACK = ',L1D,L2D,LPACK
 
 END SUBROUTINE SET_FMPACK_ll
 
-SUBROUTINE IO_FILE_OPEN_ll(TPFILE,KRESP,OPARALLELIO,HPOSITION,HSTATUS)
+SUBROUTINE IO_FILE_OPEN_ll(TPFILE,KRESP,OPARALLELIO,HPOSITION,HSTATUS,HPROGRAM_ORIG)
 !
 USE MODD_CONF,  ONLY: CPROGRAM, NMNHVERSION
 USE MODD_IO_ll, ONLY: TFILEDATA
@@ -65,6 +65,7 @@ INTEGER,                INTENT(OUT), OPTIONAL :: KRESP  ! Return code
 LOGICAL,                INTENT(IN),  OPTIONAL :: OPARALLELIO
 CHARACTER(LEN=*),       INTENT(IN),  OPTIONAL :: HPOSITION
 CHARACTER(LEN=*),       INTENT(IN),  OPTIONAL :: HSTATUS
+CHARACTER(LEN=*),       INTENT(IN),  OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program
 !
 INTEGER :: IRESP,IRESP2
 INTEGER :: IMASDEV,IBUGFIX
@@ -158,7 +159,7 @@ SELECT CASE(TPFILE%CTYPE)
       TZFILE_DES%NOPEN         = TZFILE_DES%NOPEN + 1
     ENDIF
     !
-    CALL FMOPEN_ll(TPFILE,IRESP,OPARALLELIO=OPARALLELIO)
+    CALL FMOPEN_ll(TPFILE,IRESP,OPARALLELIO=OPARALLELIO,HPROGRAM_ORIG=HPROGRAM_ORIG)
     !
     !Compare MNHVERSION of file with current version
     IF (TRIM(TPFILE%CMODE) == 'READ') THEN
@@ -225,7 +226,7 @@ IF (PRESENT(KRESP)) KRESP = IRESP
 !
 END SUBROUTINE IO_FILE_OPEN_ll
 
-SUBROUTINE FMOPEN_ll(TPFILE,KRESP,OPARALLELIO)
+SUBROUTINE FMOPEN_ll(TPFILE,KRESP,OPARALLELIO,HPROGRAM_ORIG)
 USE MODD_IO_ll, ONLY : ISTDOUT,TFILEDATA
 USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO
 !JUANZ
@@ -238,6 +239,7 @@ USE MODE_NETCDF
 TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File structure
 INTEGER,         INTENT(OUT)   :: KRESP  ! return-code
 LOGICAL,         INTENT(IN),  OPTIONAL :: OPARALLELIO
+CHARACTER(LEN=*),INTENT(IN),  OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program
 !
 !   Local variables
 !
@@ -313,7 +315,7 @@ ENDIF
     INB_PROCIO = NB_PROCIO_W
  END SELECT
 CALL OPEN_ll(TPFILE,STATUS="UNKNOWN",MODE='IO_ZSPLIT',IOSTAT=IRESP,     &
-             KNB_PROCIO=INB_PROCIO,KMELEV=IMELEV,OPARALLELIO=GPARALLELIO)
+             KNB_PROCIO=INB_PROCIO,KMELEV=IMELEV,OPARALLELIO=GPARALLELIO,HPROGRAM_ORIG=HPROGRAM_ORIG)
 
 IF (IRESP /= 0) GOTO 1000
 
@@ -348,7 +350,7 @@ IF (TPFILE%LMASTER) THEN
         IF (INCERR /= NF90_NOERR) THEN
           CALL PRINT_MSG(NVERB_FATAL,'IO','FMOPEN_ll','NF90_CREATE for '//TRIM(YFILEM)//'.nc: '//NF90_STRERROR(INCERR))
         END IF
-        CALL IO_SET_KNOWNDIMS_NC4(TPFILE)
+        CALL IO_SET_KNOWNDIMS_NC4(TPFILE,HPROGRAM_ORIG=HPROGRAM_ORIG)
      END IF
   END IF
 #endif
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index 3f463e0c3..11c8cb51e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -210,7 +210,9 @@ CONTAINS
        PAD,      &
        KNB_PROCIO,& 
        KMELEV,&
-       OPARALLELIO)
+       OPARALLELIO, &
+       HPROGRAM_ORIG)
+
 #if defined(MNH_IOCDF4)
   USE MODD_NETCDF, ONLY:IDCDF_KIND
   USE MODE_NETCDF
@@ -233,6 +235,7 @@ CONTAINS
     INTEGER,         INTENT(IN),  OPTIONAL :: KNB_PROCIO
     INTEGER(KIND=LFI_INT), INTENT(IN),  OPTIONAL :: KMELEV    
     LOGICAL,         INTENT(IN),  OPTIONAL :: OPARALLELIO
+    CHARACTER(LEN=*),INTENT(IN),  OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program
     !
     ! local var
     !
@@ -679,7 +682,7 @@ CONTAINS
                       ELSE
                          IOS = 0
                       END IF
-                      CALL IO_SET_KNOWNDIMS_NC4(TZSPLITFILE)
+                      CALL IO_SET_KNOWNDIMS_NC4(TZSPLITFILE,HPROGRAM_ORIG=HPROGRAM_ORIG)
                    END IF
                 END IF
 #endif
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 5491a790b..3ab0d00d7 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -118,22 +118,30 @@ END SUBROUTINE CLEANLIST
 END SUBROUTINE CLEANIOCDF
 
 
-SUBROUTINE IO_SET_KNOWNDIMS_NC4(TPFILE)
+SUBROUTINE IO_SET_KNOWNDIMS_NC4(TPFILE,HPROGRAM_ORIG)
 
 USE MODD_CONF,          ONLY: CPROGRAM
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
 USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT
 
-TYPE(TFILEDATA),INTENT(IN) :: TPFILE
+TYPE(TFILEDATA),INTENT(IN)           :: TPFILE
+CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program
 
-INTEGER              :: IIU_ll, IJU_ll, IKU
-TYPE(IOCDF), POINTER :: PIOCDF
+CHARACTER(LEN=:),ALLOCATABLE :: YPROGRAM
+INTEGER                      :: IIU_ll, IJU_ll, IKU
+TYPE(IOCDF), POINTER         :: PIOCDF
 
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_SET_KNOWNDIMS_NC4','called for '//TRIM(TPFILE%CNAME))
 
 PIOCDF => TPFILE%TNCDIMS
 
+IF (PRESENT(HPROGRAM_ORIG)) THEN
+  YPROGRAM = HPROGRAM_ORIG
+ELSE
+  YPROGRAM = CPROGRAM
+ENDIF
+
 IIU_ll = NIMAX_ll + 2*JPHEXT
 IJU_ll = NJMAX_ll + 2*JPHEXT
 IKU    = NKMAX    + 2*JPVEXT
@@ -144,8 +152,8 @@ IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI_U))    PIOCDF%DIM_NI_U    => GETDIMCDF(TPFILE
 IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ_U))    PIOCDF%DIM_NJ_U    => GETDIMCDF(TPFILE, IJU_ll, 'nj_u')
 IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI_V))    PIOCDF%DIM_NI_V    => GETDIMCDF(TPFILE, IIU_ll, 'ni_v')
 IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ_V))    PIOCDF%DIM_NJ_V    => GETDIMCDF(TPFILE, IJU_ll, 'nj_v')
-IF (TRIM(CPROGRAM)/='PGD' .AND. TRIM(CPROGRAM)/='NESPGD' .AND. TRIM(CPROGRAM)/='ZOOMPG' &
-    .AND. .NOT.(TRIM(CPROGRAM)=='REAL' .AND. CSTORAGE_TYPE=='SU') ) THEN !condition to detect PREP_SURFEX
+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   => GETDIMCDF(TPFILE, IKU   , 'level')
   IF (.NOT. ASSOCIATED(PIOCDF%DIM_LEVEL_W)) PIOCDF%DIM_LEVEL_W => GETDIMCDF(TPFILE, IKU   , 'level_w')
   IF (.NOT. ASSOCIATED(PIOCDF%DIMTIME)) PIOCDF%DIMTIME => GETDIMCDF(TPFILE, NF90_UNLIMITED, 'time')
-- 
GitLab