From b2c337c7e1f678a04cc03f3798c2067df34b3a01 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 24 Nov 2017 15:06:44 +0100
Subject: [PATCH] Philippe 24/11/2017: IO: * FD_ll removed several fields not
 used anymore * removed GETFD_COMM function * bug corrections: use NLFIFLU
 instead of NLU * bug correction in CLOSE_ll: .NOT. GPARALLELIO => GPARALLELIO

---
 src/LIB/SURCOUCHE/src/mode_fd.f90     | 24 +------
 src/LIB/SURCOUCHE/src/mode_fm.f90     | 19 +++---
 src/LIB/SURCOUCHE/src/mode_io.f90     | 91 ++++++++-------------------
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 |  4 +-
 4 files changed, 38 insertions(+), 100 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_fd.f90 b/src/LIB/SURCOUCHE/src/mode_fd.f90
index 3dffc73d8..4ec000680 100644
--- a/src/LIB/SURCOUCHE/src/mode_fd.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fd.f90
@@ -24,19 +24,14 @@ INTEGER, PARAMETER :: JPFINL = 32 ! File name length
 TYPE FD_ll
   CHARACTER(LEN=JPFINL)    :: NAME  ! File name 
   INTEGER                  :: FLU   ! Fortran logical unit
-  INTEGER                  :: COMM  ! Local MPI communicator
   CHARACTER(LEN=15)        :: MODE  ! Flag mode acces ('distrib','global','specific')   
-  INTEGER                  :: OWNER ! I/O Processor number 
-!JUANZ
-  INTEGER                  :: NB_PROCIO = 1
-!JUANZ
   TYPE(FD_ll),     POINTER :: NEXT
 END TYPE FD_ll
 
 TYPE(FD_ll), POINTER, SAVE :: TFDLIST
 
 INTERFACE GETFD
-  MODULE PROCEDURE GETFD_FILE, GETFD_COMM
+  MODULE PROCEDURE GETFD_FILE
 END INTERFACE
 
 PUBLIC JPFINL,FD_ll,GETFD,INITFD,NEWFD,DELFD,DISPLAY_FDLIST
@@ -65,23 +60,6 @@ GETFD_FILE=>TZFD
 
 END FUNCTION GETFD_FILE
 
-FUNCTION GETFD_COMM(KCOMM)
-
-TYPE(FD_ll), POINTER :: GETFD_COMM
-INTEGER              :: KCOMM
-
-TYPE(FD_ll), POINTER :: TZFD
-
-TZFD=>TFDLIST 
-DO WHILE(ASSOCIATED(TZFD))
-  IF (TZFD%COMM == KCOMM) EXIT
-  TZFD=>TZFD%NEXT
-END DO
-
-GETFD_COMM=>TZFD
-
-END FUNCTION GETFD_COMM
-
 FUNCTION NEWFD()
 
 TYPE(FD_ll), POINTER :: NEWFD
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 3d30c25a8..e811f4d4d 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -74,9 +74,7 @@ IF (GSMONOPROC) THEN ! sequential execution
     TZFD=>NEWFD()
     TZFD%NAME = HFILEM
     TZFD%MODE = 'GLOBAL'
-    TZFD%OWNER = ISIOP
     TZFD%FLU   = IONEWFLU()
-    TZFD%COMM  = NMNH_COMM_WORLD
     !
     KNUMBR = TZFD%FLU
     KRESP  = NOERROR
@@ -134,7 +132,7 @@ END SUBROUTINE FMLOOK_ll
 SUBROUTINE IO_FILE_OPEN_ll(TPFILE,KRESP,OPARALLELIO,HPOSITION,HSTATUS)
 !
 USE MODD_CONF,  ONLY: NMNHVERSION
-USE MODD_IO_ll, ONLY: ISP,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
+USE MODD_IO_ll, ONLY: LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
 USE MODE_FD_ll, ONLY: FD_ll,GETFD
 USE MODE_FIELD, ONLY: TFIELDDATA,TYPEINT
 USE MODE_FMREAD
@@ -240,14 +238,14 @@ SELECT CASE(TPFILE%CTYPE)
     CALL FMOPEN_ll(TPFILE,IRESP,OPARALLELIO=OPARALLELIO)
     !
     TZFDLFI=>GETFD(ADJUSTL(TRIM(TPFILE%CNAME)//'.lfi'))
-    IF (TRIM(TPFILE%CMODE) == 'READ' .AND. ISP == TPFILE%NMASTER_RANK) THEN
+    IF (TRIM(TPFILE%CMODE) == 'READ' .AND. TPFILE%LMASTER) THEN
       IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
         IF (TPFILE%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NNCID for '//TRIM(TPFILE%CNAME))
       ELSE
         TPFILE%NLFIFLU = TZFDLFI%FLU
         IF (TPFILE%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NLFIFLU for '//TRIM(TPFILE%CNAME))
       ENDIF
-    ELSE IF (TRIM(TPFILE%CMODE) == 'WRITE' .AND. ISP == TPFILE%NMASTER_RANK) THEN
+    ELSE IF (TRIM(TPFILE%CMODE) == 'WRITE' .AND. TPFILE%LMASTER) THEN
       IF (LIOCDF4) THEN
         IF (TPFILE%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NNCID for '//TRIM(TPFILE%CNAME))
       END IF
@@ -324,7 +322,7 @@ IF (PRESENT(KRESP)) KRESP = IRESP
 END SUBROUTINE IO_FILE_OPEN_ll
 
 SUBROUTINE FMOPEN_ll(TPFILE,KRESP,OPARALLELIO)
-USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
+USE MODD_IO_ll, ONLY : ISTDOUT,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
 USE MODE_FD_ll, ONLY : JPFINL
 USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO
 !JUANZ
@@ -419,7 +417,7 @@ CALL OPEN_ll(TPFILE,STATUS="UNKNOWN",MODE='IO_ZSPLIT',IOSTAT=IRESP,     &
 
 IF (IRESP /= 0) GOTO 1000
 
-IF (ISP == TPFILE%NMASTER_RANK) THEN
+IF (TPFILE%LMASTER) THEN
   ! Proc I/O case
   IF (GSFIRST) THEN
     GSFIRST = .FALSE.
@@ -463,7 +461,7 @@ IF (ISP == TPFILE%NMASTER_RANK) THEN
      GNAMFI = .TRUE.
      GFATER = .TRUE.
      !
-     INUMBR8 = TPFILE%NLU
+     INUMBR8 = TPFILE%NLFIFLU
      GNAMFI8 = GNAMFI
      GFATER8 = GFATER
      GSTATS8 = GSTATS
@@ -479,7 +477,6 @@ IF (ISP == TPFILE%NMASTER_RANK) THEN
           INPRAR,            &
           ININAR)
      
-!!$     IF (IRESOU /= 0 .AND. IRESOU /= -11) THEN
   IF (IRESOU /= 0 ) THEN
         IRESP = IRESOU
      ENDIF
@@ -654,7 +651,7 @@ SUBROUTINE FMCLOS_ll(TPFILE,HSTATU,KRESP,OPARALLELIO)
 !
 !!      J.Escobar   18/10/10   bug with PGI compiler on ADJUSTL
 !-------------------------------------------------------------------------------
-USE MODD_IO_ll, ONLY : ISP,TFILEDATA
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODE_FD_ll, ONLY : JPFINL
 USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE
 #if !defined(MNH_SGI)
@@ -718,7 +715,7 @@ ELSE
   ENDIF
 ENDIF
 
-IF (ISP == TPFILE%NMASTER_RANK) THEN
+IF (TPFILE%LMASTER) THEN
   IF (TPFILE%NLFIFLU > 0) THEN
      CALL LFIFER(IRESP8,TPFILE%NLFIFLU,YSTATU)
      IRESP = IRESP8
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index 142d757b1..22d6e657e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -407,14 +407,11 @@ CONTAINS
 
     CASE('GLOBAL')
        IF (YACTION == 'READ') THEN
-          TZFD%OWNER = ISP
           TPFILE%NMASTER_RANK  = -1
           TPFILE%LMASTER       = .TRUE. !Every process read the file
           TPFILE%LMULTIMASTERS = .TRUE.
        ELSE
-          TZFD%OWNER = ISIOP
           IF (TPFILE%CTYPE=='OUTPUTLISTING') THEN
-            TZFD%OWNER = ISP
             TPFILE%NMASTER_RANK  = -1
             TPFILE%LMASTER       = .TRUE. !Every process may write in the file
             TPFILE%LMULTIMASTERS = .TRUE.
@@ -426,7 +423,7 @@ CONTAINS
        END IF
        TPFILE%NSUBFILES_IOZ = 0
 
-       IF (ISP == TZFD%OWNER) THEN 
+       IF (TPFILE%LMASTER) THEN
           !! I/O processor case
 
           TZFD%FLU = IONEWFLU()
@@ -535,8 +532,9 @@ CONTAINS
           TZFD%FLU = JPFNULL
        END IF
 
+      TPFILE%NLU = TZFD%FLU
+
     CASE('SPECIFIC')
-       TZFD%OWNER = ISP
        TZFD%FLU = IONEWFLU()
        TPFILE%NMASTER_RANK  = -1
        TPFILE%LMASTER       = .TRUE. !Every process use the file
@@ -614,15 +612,16 @@ CONTAINS
 
 #endif
 
-    CASE('DISTRIBUTED')
-       TZFD%OWNER = ISIOP
+       TPFILE%NLU = TZFD%FLU
+
 
+    CASE('DISTRIBUTED')
        TPFILE%NMASTER_RANK  = ISIOP
        TPFILE%LMASTER       = (ISP == ISIOP)
        TPFILE%LMULTIMASTERS = .FALSE.
        TPFILE%NSUBFILES_IOZ = 0
 
-       IF (ISP == TZFD%OWNER) THEN 
+       IF (TPFILE%LMASTER) THEN
           TZFD%FLU = IONEWFLU()
        ELSE 
           !! NON I/O processors case
@@ -630,6 +629,8 @@ CONTAINS
           TZFD%FLU = -1
        END IF
 
+       TPFILE%NLU = TZFD%FLU
+
 
     CASE('IO_ZSPLIT')
        TPFILE%NMASTER_RANK  = ISIOP
@@ -642,22 +643,12 @@ CONTAINS
          END IF
        END IF
 
-       TZFD%OWNER = ISIOP
        TZFD%NAME  = TRIM(TPFILE%CNAME)//".lfi"
-       IF (PRESENT(KNB_PROCIO)) THEN
-          TZFD%NB_PROCIO = KNB_PROCIO
-       ELSE
-          TZFD%NB_PROCIO = 1
-       ENDIF
-       IF( .NOT. GPARALLELIO ) THEN
-         TZFD%NB_PROCIO = 1
-       ENDIF
-       TZFD%COMM = NMNH_COMM_WORLD
 #if defined(MNH_IOCDF4)
-       IF (ISP == TPFILE%NMASTER_RANK .AND. (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT) &
-            &                                .OR. (YACTION=='READ'  .AND. LLFIREAD))) THEN
+       IF (TPFILE%LMASTER .AND. (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT) &
+            &                    .OR. (YACTION=='READ'  .AND. LLFIREAD))) THEN
 #else
-       IF (ISP == TPFILE%NMASTER_RANK) THEN
+       IF (TPFILE%LMASTER) THEN
 #endif
              TZFD%FLU = IONEWFLU()
        ELSE 
@@ -665,6 +656,9 @@ CONTAINS
           IOS = 0
           TZFD%FLU = -1
        END IF
+
+       TPFILE%NLFIFLU = TZFD%FLU
+
        IF (TPFILE%NSUBFILES_IOZ > 0) THEN
           IF (.NOT.ALLOCATED(TPFILE%TFILES_IOZ)) THEN
             ALLOCATE(TPFILE%TFILES_IOZ(TPFILE%NSUBFILES_IOZ))
@@ -678,9 +672,6 @@ CONTAINS
              TZFD_IOZ           =>NEWFD()
              TZFD_IOZ%NAME      = YFILE_IOZ
              TZFD_IOZ%MODE      = 'IO_ZSPLIT'
-             TZFD_IOZ%OWNER     = IRANK_PROCIO
-             TZFD_IOZ%COMM      = NMNH_COMM_WORLD
-             TZFD_IOZ%NB_PROCIO = TPFILE%NSUBFILES_IOZ
              TZFD_IOZ%FLU       = -1
 
              CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//TRIM(CFILE),TZSPLITFILE,IRESP,OOLD=.FALSE.)
@@ -697,7 +688,7 @@ CONTAINS
              TZSPLITFILE%LMULTIMASTERS = .FALSE.
              TZSPLITFILE%NSUBFILES_IOZ = 0
 
-             IF ( IRANK_PROCIO .EQ. ISP ) THEN
+             IF ( TZSPLITFILE%LMASTER ) THEN
 #if defined(MNH_IOCDF4)                   
                 IF (LIOCDF4) THEN
                    IF (YACTION == 'READ' .AND. .NOT. LLFIREAD) THEN
@@ -737,7 +728,7 @@ CONTAINS
                    ! Open LFI File for reading
                    !this proc must write on this file open it ...    
                    TZFD_IOZ%FLU       = IONEWFLU()
-                   TZSPLITFILE%NLU    = TZFD_IOZ%FLU
+                   TZSPLITFILE%NLFIFLU = TZFD_IOZ%FLU
                    !! LFI-File case
                    IRESOU = 0
                    GNAMFI8 = .TRUE.
@@ -777,33 +768,9 @@ CONTAINS
 
 !    CALL UPDATE_METADATA(TPFILE)
 
-    ! Recherche d'un communicateur a reutiliser
-    ! TZFD is the first element
-
     TPFILE%NMPICOMM = ICOMM
-    TZFD%COMM = ICOMM
-!!$    TZFD%COMM = MPI_COMM_NULL
-
-!!$    TZFDTEMP=>TZFD%NEXT
-!!$    DO WHILE(ASSOCIATED(TZFDTEMP))
-!!$       CALL MPI_COMM_COMPARE(ICOMM,TZFDTEMP%COMM,ICMPRES,IERR)
-!!$       IF (ICMPRES == MPI_CONGRUENT) THEN
-!!$          TZFD%COMM = TZFDTEMP%COMM
-!!$          EXIT
-!!$       END IF
-!!$       TZFDTEMP=>TZFDTEMP%NEXT
-!!$    END DO
-!!$
-!!$    IF (TZFD%COMM == MPI_COMM_NULL) THEN
-!!$       ! Pas de communicateur equivalent -> on duplique
-!!$       !
-!!$       CALL MPI_COMM_DUP(ICOMM, TZFD%COMM, IERR)
-!!$       !       WRITE(ISTDOUT,*) 'FILE = ',TZFD%NAME,', comm ',TZFD%COMM&
-!!$       !            & , ' cree par duplication de comm ', ICOMM
-!!$    END IF
 
     IOSTAT = IOS
-    TPFILE%NLU = TZFD%FLU
 
   CONTAINS
     FUNCTION SUFFIX(HEXT)
@@ -834,10 +801,8 @@ CONTAINS
         CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','TZFDLFI not found for '&
                                                //TRIM(TPFILEMD%CNAME))
 
-      !TZFDLFI%CDF exists only if ISP == TZFDLFI%OWNER
-      IF (TRIM(TPFILEMD%CMODE) == 'READ' .AND. ISP == TPFILEMD%NMASTER_RANK) THEN
+      IF (TRIM(TPFILEMD%CMODE) == 'READ' .AND. TPFILEMD%LMASTER) THEN
         IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
-!           TPFILEMD%NNCID = TZFDLFI%CDF%NCID
           IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
                                                //TRIM(TPFILEMD%CNAME))
         ELSE
@@ -845,9 +810,8 @@ CONTAINS
           IF (TPFILEMD%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NLFIFLU for '&
                                                 //TRIM(TPFILEMD%CNAME))
         ENDIF
-      ELSE IF (TRIM(TPFILEMD%CMODE) == 'WRITE' .AND. ISP == TPFILEMD%NMASTER_RANK) THEN
+      ELSE IF (TRIM(TPFILEMD%CMODE) == 'WRITE' .AND. TPFILEMD%LMASTER) THEN
         IF (LIOCDF4) THEN
-!           TPFILEMD%NNCID = TZFDLFI%CDF%NCID
           IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
                                                //TRIM(TPFILEMD%CNAME))
         END IF
@@ -921,12 +885,11 @@ CONTAINS
 
     SELECT CASE(TZFD%MODE)
     CASE('GLOBAL','SPECIFIC')
-       IF (TZFD%OWNER == ISP) THEN
-          CLOSE(UNIT=TZFD%FLU, IOSTAT=IRESP,STATUS=STATUSL)
-          CALL IOFREEFLU(TZFD%FLU)
+       IF (TPFILE%LMASTER) THEN
+          CLOSE(UNIT=TPFILE%NLU, IOSTAT=IRESP,STATUS=STATUSL)
+          CALL IOFREEFLU(TPFILE%NLU)
        END IF
-       CALL MPI_ALLREDUCE(IRESP,IGLOBALERR,1,MPI_INTEGER,MPI_BOR,TZFD&
-            & %COMM,IERR)
+       CALL MPI_ALLREDUCE(IRESP,IGLOBALERR,1,MPI_INTEGER,MPI_BOR,TPFILE%NMPICOMM,IERR)
     CASE('DISTRIBUTED')
        ! nothing to close with FM-Files
 
@@ -934,13 +897,13 @@ CONTAINS
        !
        ! close LFI file in the different PROC
        !
-       IF( .NOT. GPARALLELIO ) THEN
+       IF( GPARALLELIO ) THEN
           DO IFILE=1,TPFILE%NSUBFILES_IOZ
              TZFILE => TPFILE%TFILES_IOZ(IFILE)%TFILE
-             IF (ISP == TZFILE%NMASTER_RANK) THEN
-                IF (TZFILE%NLU > 0) THEN !if LFI
+             IF (TPFILE%LMASTER) THEN
+                IF (TZFILE%NLFIFLU > 0) THEN !if LFI
                    CALL LFIFER(IRESP8,TZFILE%NLFIFLU,YSTATU)
-                   CALL IOFREEFLU(TZFD_IOZ%FLU)
+                   CALL IOFREEFLU(INT(TPFILE%NLFIFLU))
                    IRESP = IRESP8
                 END IF
                 IF (ASSOCIATED(TZFILE%TNCDIMS)) CALL CLEANIOCDF(TZFILE%TNCDIMS)
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index bf20b5cef..5cb549b92 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -161,7 +161,7 @@ END FUNCTION str_replace
 
 SUBROUTINE IO_WRITE_HEADER_NC4(TPFILE)
 !
-USE MODD_IO_ll, ONLY: ISP,TFILEDATA
+USE MODD_IO_ll, ONLY: TFILEDATA
 !
 TYPE(TFILEDATA), INTENT(IN)  :: TPFILE ! File structure
 !
@@ -171,7 +171,7 @@ IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETUR
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_HEADER_NC4','called for file '//TRIM(TPFILE%CNAME))
 !
-IF (ISP == TPFILE%NMASTER_RANK)  THEN
+IF (TPFILE%LMASTER)  THEN
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.6')
   IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
 
-- 
GitLab