From 1dada6e057d6e369bda6b8f4744ddb78a7d6b888 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 18 Aug 2017 15:10:36 +0200
Subject: [PATCH] Philippe 18/08/2017: IO: IO_FILE_ADD2LIST manage the case in
 which a file is already in the filelist (with an optional argument)

---
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 46 +++++++++++++------
 1 file changed, 33 insertions(+), 13 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index af5188262..c1569453a 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -572,33 +572,53 @@ END SUBROUTINE POPULATE_STRUCT
 !
 END SUBROUTINE IO_PREPARE_BAKOUT_STRUCT
 !
-SUBROUTINE IO_FILE_ADD2LIST(TPFILE,HNAME,HTYPE,HMODE,KLFINPRAR,KLFITYPE,KLFIVERB,TPDADFILE)
+SUBROUTINE IO_FILE_ADD2LIST(TPFILE,HNAME,HTYPE,HMODE,KLFINPRAR,KLFITYPE,KLFIVERB,TPDADFILE,OOLD)
 !
 USE MODD_FMOUT,          ONLY : LOUT_COMPRESS,LOUT_REDUCE_FLOAT_PRECISION,NOUT_COMPRESS_LEVEL
 USE MODE_MODELN_HANDLER, ONLY : GET_CURRENT_MODEL_INDEX
 !
-TYPE(TFILEDATA),POINTER,         INTENT(OUT) :: TPFILE    !File structure to return
-CHARACTER(LEN=*),                INTENT(IN)  :: HNAME     !Filename
-CHARACTER(LEN=*),                INTENT(IN)  :: HTYPE     !Filetype (backup, output, prepidealcase...)
-CHARACTER(LEN=*),                INTENT(IN)  :: HMODE     !Opening mode (read, write...)
-INTEGER,                OPTIONAL,INTENT(IN)  :: KLFINPRAR !Number of predicted articles of the LFI file (non crucial)
-INTEGER,                OPTIONAL,INTENT(IN)  :: KLFITYPE  !Type of the file (used to generate list of files to transfers)
-INTEGER,                OPTIONAL,INTENT(IN)  :: KLFIVERB  !LFI verbosity level
-TYPE(TFILEDATA),POINTER,OPTIONAL,INTENT(IN)  :: TPDADFILE !Corresponding dad file
+TYPE(TFILEDATA),POINTER,         INTENT(INOUT) :: TPFILE    !File structure to return
+CHARACTER(LEN=*),                INTENT(IN)    :: HNAME     !Filename
+CHARACTER(LEN=*),                INTENT(IN)    :: HTYPE     !Filetype (backup, output, prepidealcase...)
+CHARACTER(LEN=*),                INTENT(IN)    :: HMODE     !Opening mode (read, write...)
+INTEGER,                OPTIONAL,INTENT(IN)    :: KLFINPRAR !Number of predicted articles of the LFI file (non crucial)
+INTEGER,                OPTIONAL,INTENT(IN)    :: KLFITYPE  !Type of the file (used to generate list of files to transfers)
+INTEGER,                OPTIONAL,INTENT(IN)    :: KLFIVERB  !LFI verbosity level
+TYPE(TFILEDATA),POINTER,OPTIONAL,INTENT(IN)    :: TPDADFILE !Corresponding dad file
+LOGICAL,                OPTIONAL,INTENT(IN)    :: OOLD      !FALSE if new file (should not be found)
+                                                            !TRUE if the file could already be in the list
+                                                            !     (add it only if not yet present)
 !
 INTEGER :: IMI,IRESP
 INTEGER :: ILFINPRAR
 INTEGER :: ILFITYPE
 INTEGER :: ILFIVERB
-TYPE(TFILEDATA),POINTER :: TZFILE_DUMMY
+LOGICAL :: GOLD
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_ADD2LIST','called for '//TRIM(HNAME))
 !
-IF (ASSOCIATED(TPFILE)) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already associated')
+IF (PRESENT(OOLD)) THEN
+  GOLD = OOLD
+ELSE
+  GOLD = .FALSE. !By default, we assume file is not yet in list
+END IF
+!
+IF (ASSOCIATED(TPFILE)) THEN
+  IF (GOLD) THEN
+    CALL PRINT_MSG(NVERB_INFO,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already associated. Pointer will be overwritten')
+    TPFILE => NULL()
+  ELSE
+    CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already associated')
+  END IF
+END IF
 !
-CALL IO_FILE_FIND_BYNAME(HNAME,TZFILE_DUMMY,IRESP,OOLD=.FALSE.)
+CALL IO_FILE_FIND_BYNAME(HNAME,TPFILE,IRESP,OOLD=GOLD)
 IF (IRESP==0) THEN
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already in filelist')
+  IF (.NOT.GOLD) THEN
+    CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already in filelist')
+  ELSE
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already in filelist (not unexpected)')
+  END IF
   RETURN
 END IF
 !
-- 
GitLab