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