From 80c1ebbc8f120126decfcf0f099d032613b070ce Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 21 Feb 2019 10:55:08 +0100
Subject: [PATCH] Philippe 21/02/2019: bugfix: intent of read fields:
 OUT->INOUT to keep initial value if not found in file

---
 src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 | 33 ++++++++---------
 src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 | 41 +++++++++++-----------
 2 files changed, 38 insertions(+), 36 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
index 91e4e0031..17ec7f6e2 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
@@ -5,9 +5,10 @@
 !-----------------------------------------------------------------
 module mode_io_read_lfi
 ! Modifications:
-!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!  Philippe Wautelet: 21/06/2018:      read and write correctly if MNH_REAL=4
-!  Philippe Wautelet: 14/12/2018:      split fmreadwrit.f90
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 21/06/2018: read and write correctly if MNH_REAL=4
+!  P. Wautelet 14/12/2018: split fmreadwrit.f90
+!  P. Wautelet 21/02/2019: bugfix: intent of read fields: OUT->INOUT to keep initial value if not found in file
 !
 USE MODD_IO_ll
 USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH
@@ -47,7 +48,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(OUT)   :: PFIELD  ! array containing the data field
+REAL,             INTENT(INOUT) :: PFIELD  ! array containing the data field
 INTEGER,          INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -86,7 +87,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(OUT)   :: PFIELD  ! array containing the data field
+REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD  ! array containing the data field
 INTEGER,          INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -120,7 +121,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),    INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),   INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),INTENT(OUT)   :: PFIELD  ! array containing the data field
+REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
 INTEGER,            INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -154,7 +155,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),      INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),     INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),INTENT(OUT)   :: PFIELD  ! array containing the data field
+REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
 INTEGER,              INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -188,7 +189,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),       INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:),INTENT(OUT)   :: PFIELD  ! array containing the data field
+REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
 INTEGER,                INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -222,7 +223,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:),INTENT(OUT)   :: PFIELD  ! array containing the data field
+REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
 INTEGER,                  INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -256,7 +257,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),           INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:,:),INTENT(OUT)   :: PFIELD  ! array containing the data field
+REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
 INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -290,7 +291,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-INTEGER,         INTENT(OUT)   :: KFIELD  ! array containing the data field
+INTEGER,         INTENT(INOUT) :: KFIELD  ! array containing the data field
 INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -324,7 +325,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:),INTENT(OUT)   :: KFIELD  ! array containing the data field
+INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD  ! array containing the data field
 INTEGER,             INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -358,7 +359,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),      INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:),INTENT(OUT)   :: KFIELD  ! array containing the data field
+INTEGER,DIMENSION(:,:),INTENT(INOUT) :: KFIELD  ! array containing the data field
 INTEGER,               INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -392,7 +393,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-LOGICAL,         INTENT(OUT)   :: OFIELD  ! array containing the data field
+LOGICAL,         INTENT(INOUT) :: OFIELD  ! array containing the data field
 INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -439,7 +440,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(OUT)   :: OFIELD  ! array containing the data field
+LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD  ! array containing the data field
 INTEGER,             INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
@@ -494,7 +495,7 @@ IMPLICIT NONE
 !
 TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*),INTENT(OUT)   :: HFIELD  ! array containing the data field
+CHARACTER(LEN=*),INTENT(INOUT) :: HFIELD  ! array containing the data field
 INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
index 9fb6870ad..dbaf49d89 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
@@ -3,12 +3,13 @@
 !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 : may 2016   : use NetCDF Fortran module
-!    J.Escobar   : 14/12/2017 : Correction for MNH_INT=8
-!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!    P. Wautelet : 13/12/2018 : split of mode_netcdf into multiple modules/files
-!  Philippe Wautelet: 10/01/2019: replace handle_err by io_handle_err_nc4 for better netCDF error messages
+! Modifications:
+!  P. Wautelet may 2016  : use NetCDF Fortran module
+!  J. Escobar  14/12/2017: correction for MNH_INT=8
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 13/12/2018: split of mode_netcdf into multiple modules/files
+!  P. Wautelet 10/01/2019: replace handle_err by io_handle_err_nc4 for better netCDF error messages
+!  P. Wautelet 21/02/2019: bugfix: intent of read fields: OUT->INOUT to keep initial value if not found in file
 !-----------------------------------------------------------------
 #if defined(MNH_IOCDF4)
 module mode_io_read_nc4
@@ -258,7 +259,7 @@ END SUBROUTINE IO_READ_CHECK_FIELD_ATTR_NC4
 SUBROUTINE IO_READ_FIELD_NC4_X0(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(OUT)   :: PFIELD
+REAL,             INTENT(INOUT) :: PFIELD
 INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -313,7 +314,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_X0
 SUBROUTINE IO_READ_FIELD_NC4_X1(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(OUT)   :: PFIELD
+REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD
 INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -380,7 +381,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_X1
 SUBROUTINE IO_READ_FIELD_NC4_X2(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),    INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),   INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),INTENT(OUT)   :: PFIELD
+REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD
 INTEGER,            INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -462,7 +463,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_X2
 SUBROUTINE IO_READ_FIELD_NC4_X3(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),      INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),     INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),INTENT(OUT)   :: PFIELD
+REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,              INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND)                              :: STATUS
@@ -533,7 +534,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_X3
 SUBROUTINE IO_READ_FIELD_NC4_X4(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),       INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:),INTENT(OUT)   :: PFIELD
+REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND)                              :: STATUS
@@ -607,7 +608,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_X4
 SUBROUTINE IO_READ_FIELD_NC4_X5(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:),INTENT(OUT)   :: PFIELD
+REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                  INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND)                              :: STATUS
@@ -684,7 +685,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_X5
 SUBROUTINE IO_READ_FIELD_NC4_X6(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),           INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:,:),INTENT(OUT)   :: PFIELD
+REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                    INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND)                              :: STATUS
@@ -763,7 +764,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_X6
 SUBROUTINE IO_READ_FIELD_NC4_N0(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-INTEGER,          INTENT(OUT)   :: KFIELD
+INTEGER,          INTENT(INOUT) :: KFIELD
 INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -819,7 +820,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_N0
 SUBROUTINE IO_READ_FIELD_NC4_N1(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
-INTEGER, DIMENSION(:),   INTENT(OUT)   :: KFIELD
+INTEGER, DIMENSION(:),   INTENT(INOUT) :: KFIELD
 INTEGER,                 INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -887,7 +888,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_N1
 SUBROUTINE IO_READ_FIELD_NC4_N2(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
-INTEGER, DIMENSION(:,:), INTENT(OUT)   :: KFIELD
+INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD
 INTEGER,                 INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -969,7 +970,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_N2
 SUBROUTINE IO_READ_FIELD_NC4_L0(TPFILE, TPFIELD, OFIELD, KRESP)
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-LOGICAL,          INTENT(OUT)   :: OFIELD
+LOGICAL,          INTENT(INOUT) :: OFIELD
 INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -1039,7 +1040,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_L0
 SUBROUTINE IO_READ_FIELD_NC4_L1(TPFILE, TPFIELD, OFIELD, KRESP)
 TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(OUT)   :: OFIELD
+LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD
 INTEGER,             INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
@@ -1126,7 +1127,7 @@ END SUBROUTINE IO_READ_FIELD_NC4_L1
 SUBROUTINE IO_READ_FIELD_NC4_C0(TPFILE, TPFIELD, HFIELD, KRESP)
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*), INTENT(OUT)   :: HFIELD
+CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD
 INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND)     :: STATUS
@@ -1195,7 +1196,7 @@ USE MODE_DATETIME
 !
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-TYPE (DATE_TIME), INTENT(OUT)   :: TPDATA
+TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA
 INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=IDCDF_KIND)     :: STATUS
-- 
GitLab