From 6cb7890dd34cca68473343494543074dc7bc2ee8 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 23 Nov 2017 13:40:58 +0100
Subject: [PATCH] Philippe 23/11/2017: IO: use TFILES_IOZ field to replace
 IO_FILE_FIND_BYNAME calls + treated correctly NOPEN_CURRENT and NCLOSE fields
 for Z-splitted files

---
 src/LIB/SURCOUCHE/src/fmreadwrit.f90  | 18 +++--------
 src/LIB/SURCOUCHE/src/mode_fm.f90     | 45 +++++++++++++--------------
 src/LIB/SURCOUCHE/src/mode_io.f90     |  9 +++---
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 14 ++-------
 4 files changed, 35 insertions(+), 51 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
index e2ff07972..b39e2eeee 100644
--- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90
+++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
@@ -804,8 +804,6 @@ END SUBROUTINE IO_WRITE_FIELD_LFI_X1
 !
 SUBROUTINE IO_WRITE_FIELD_LFI_X2(TPFILE,TPFIELD,PFIELD,KRESP,KVERTLEVEL,KZFILE)
 !
-USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
-!
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
@@ -819,32 +817,26 @@ INTEGER,OPTIONAL,      INTENT(IN) :: KZFILE     ! Number of the Z-level splitted
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER                                  :: ILENG,IERR
+INTEGER                                  :: ILENG
 INTEGER(kind=LFI_INT)                    :: IRESP, ITOTAL
 INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK
 CHARACTER(LEN=4)                         :: YSUFFIX
-CHARACTER(LEN=3)                         :: YNUMBER
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4)   :: YVARNAME
 CHARACTER(LEN=LEN_HREC)                  :: YRECFM
 TYPE(TFILEDATA),POINTER                  :: TZFILE
 !
-IERR = 0
+IRESP=0
 !
 ILENG = SIZE(PFIELD)
 IF (PRESENT(KVERTLEVEL)) THEN
-  WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL
   IF (.NOT.PRESENT(KZFILE)) THEN
     CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELD_LFI_X2','KZFILE argument not provided')
     RETURN
   END IF
-  WRITE(YNUMBER,'(I3.3)') KZFILE
+  WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL
   YVARNAME = TRIM(TPFIELD%CMNHNAME)//YSUFFIX
-!PW: TODO: try to not do a find (for better perf)
-  CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER,TZFILE,IERR)
-  IF (IERR/=0) THEN
-    CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELD_LFI_X2','file '//TRIM(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER)//' not found in list')
-    RETURN
-  END IF
+  IF (KZFILE>TPFILE%NSUBFILES_IOZ) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_WRITE_FIELD_LFI_X2','KZFILE value too high')
+  TZFILE => TPFILE%TFILES_IOZ(KZFILE)%TFILE
 ELSE
   YVARNAME = TRIM(TPFIELD%CMNHNAME)
   TZFILE => TPFILE
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 54bdc03d9..17cb2ee22 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -523,17 +523,14 @@ END SUBROUTINE FMOPEN_ll
 SUBROUTINE IO_FILE_CLOSE_ll(TPFILE,KRESP,OPARALLELIO)
 !
 USE MODD_IO_ll, ONLY: TFILEDATA
-USE MODE_FD_ll, ONLY: FD_ll,GETFD
-USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE
+USE MODE_IO_ll, ONLY : CLOSE_ll
 USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
 !
 TYPE(TFILEDATA),  INTENT(INOUT)         :: TPFILE ! File structure
 INTEGER,          INTENT(OUT), OPTIONAL :: KRESP  ! Return code
 LOGICAL,          INTENT(IN),  OPTIONAL :: OPARALLELIO
 !
-INTEGER                 :: INB_PROCIO, IRESP, IRESP2, JI
-CHARACTER (LEN=3)       :: YNUMBER  ! Character string for Z-level
-TYPE(FD_ll), POINTER    :: TZFDLFI
+INTEGER                 :: IRESP, JI
 TYPE(TFILEDATA),POINTER :: TZFILE_DES
 TYPE(TFILEDATA),POINTER :: TZFILE_IOZ
 !
@@ -549,6 +546,13 @@ IF (TPFILE%NOPEN_CURRENT>1) THEN
                  ': decrementing NOPEN_CURRENT (still opened after this call)')
   TPFILE%NOPEN_CURRENT = TPFILE%NOPEN_CURRENT - 1
   TPFILE%NCLOSE        = TPFILE%NCLOSE        + 1
+  !
+  DO JI = 1,TPFILE%NSUBFILES_IOZ
+    TZFILE_IOZ => TPFILE%TFILES_IOZ(JI)%TFILE
+    TZFILE_IOZ%NOPEN_CURRENT = TZFILE_IOZ%NOPEN_CURRENT - 1
+    TZFILE_IOZ%NCLOSE        = TZFILE_IOZ%NCLOSE        + 1
+  END DO
+  !
   RETURN
 END IF
 !
@@ -625,29 +629,24 @@ SELECT CASE(TPFILE%CTYPE)
       END IF
     ENDIF
     !
-    !Next lines done before the close to be sure the FD_ll still exists
-    TZFDLFI=>GETFD(ADJUSTL(TRIM(TPFILE%CNAME)//'.lfi'))
-    INB_PROCIO=TZFDLFI%NB_PROCIO
-    !
     CALL FMCLOS_ll(TPFILE,'KEEP',KRESP=IRESP,OPARALLELIO=OPARALLELIO)
     !
     TPFILE%NLFIFLU = -1
     TPFILE%NNCID   = -1
     !
-    IF (INB_PROCIO>1) THEN
-      DO JI = 1,TZFDLFI%NB_PROCIO
-        WRITE (YNUMBER,FMT="(I3.3)") JI
-        CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER,TZFILE_IOZ,IRESP2)
-        IF (IRESP2/=0) &
-          CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_CLOSE_ll','file '//TRIM(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER)//' not found in list')
-        IF (TZFILE_IOZ%LOPENED) THEN
-          TZFILE_IOZ%LOPENED = .FALSE.
-          TZFILE_IOZ%NCLOSE  = TZFILE_IOZ%NCLOSE + 1
-          TZFILE_IOZ%NLFIFLU = -1
-          TZFILE_IOZ%NNCID   = -1
-        END IF
-      END DO
-    END IF
+    DO JI = 1,TPFILE%NSUBFILES_IOZ
+      TZFILE_IOZ => TPFILE%TFILES_IOZ(JI)%TFILE
+      IF (.NOT.TZFILE_IOZ%LOPENED) &
+        CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_CLOSE_ll','file '//TRIM(TZFILE_IOZ%CNAME)//' is not opened')
+      IF (TZFILE_IOZ%NOPEN_CURRENT/=1) &
+        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_CLOSE_ll','file '//TRIM(TZFILE_IOZ%CNAME)//&
+                       ' is currently opened 0 or several times (expected only 1)')
+      TZFILE_IOZ%LOPENED       = .FALSE.
+      TZFILE_IOZ%NOPEN_CURRENT = 0
+      TZFILE_IOZ%NCLOSE        = TZFILE_IOZ%NCLOSE + 1
+      TZFILE_IOZ%NLFIFLU       = -1
+      TZFILE_IOZ%NNCID         = -1
+    END DO
 END SELECT
 !
 TPFILE%LOPENED       = .FALSE.
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index 83fb6ab69..f83e9c3bf 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -776,10 +776,10 @@ CONTAINS
                         ININAR8)
                    !KNINAR = ININAR8
                 END IF
-
-                CALL UPDATE_METADATA(TZSPLITFILE)
-
              ENDIF
+             !
+             CALL UPDATE_METADATA(TZSPLITFILE) !Done outside of the IF == ISP
+             !
           ENDDO
        END IF
 
@@ -834,7 +834,8 @@ CONTAINS
       IF(.NOT.PRESENT(TPFILEMD)) RETURN
 
       TPFILEMD%LOPENED = .TRUE.
-      TPFILEMD%NOPEN   = TPFILEMD%NOPEN + 1
+      TPFILEMD%NOPEN         = TPFILEMD%NOPEN         + 1
+      TPFILEMD%NOPEN_CURRENT = TPFILEMD%NOPEN_CURRENT + 1
 
       NULLIFY(TZFDLFI)
 
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 52ba9465f..bf20b5cef 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -518,8 +518,6 @@ END SUBROUTINE IO_WRITE_FIELD_NC4_X1
 
 SUBROUTINE IO_WRITE_FIELD_NC4_X2(TPFILE,TPFIELD,PFIELD,KRESP,KVERTLEVEL,KZFILE)
 !
-USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
-!
 TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
@@ -530,7 +528,6 @@ INTEGER,OPTIONAL,      INTENT(IN) :: KZFILE     ! Number of the Z-level splitted
 INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=4)         :: YSUFFIX
-CHARACTER(LEN=3)         :: YNUMBER
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4) :: YTMP,YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
 INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
@@ -538,21 +535,16 @@ INTEGER                  :: IRESP
 TYPE(TFILEDATA),POINTER  :: TZFILE
 !
 IRESP = 0
-
+!
 IF (PRESENT(KVERTLEVEL)) THEN
   WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL
   IF (.NOT.PRESENT(KZFILE)) THEN
     CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELD_NC4_X2','KZFILE argument not provided')
     RETURN
   END IF
-  WRITE(YNUMBER,'(I3.3)') KZFILE
   YTMP = TRIM(TPFIELD%CMNHNAME)//YSUFFIX
-!PW: TODO: try to not do a find (for better perf)
-  CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER,TZFILE,IRESP)
-  IF (IRESP/=0) THEN
-    CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELD_NC4_X2','file '//TRIM(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER)//' not found in list')
-    RETURN
-  END IF
+  IF (KZFILE>TPFILE%NSUBFILES_IOZ) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_WRITE_FIELD_NC4_X2','KZFILE value too high')
+  TZFILE => TPFILE%TFILES_IOZ(KZFILE)%TFILE
 ELSE
   YTMP = TRIM(TPFIELD%CMNHNAME)
   TZFILE => TPFILE
-- 
GitLab