From 2e4b4288ba6541406e838f1f6af40a724cd605ad Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 19 Feb 2019 10:49:23 +0100 Subject: [PATCH] Philippe 19/02/2019: IO: simplification/restructuration/cleaning of open/close subroutines (to be continued) --- src/LIB/SURCOUCHE/src/mode_fm.f90 | 339 +++++++++++------------------- src/LIB/SURCOUCHE/src/mode_io.f90 | 196 +++++++---------- 2 files changed, 197 insertions(+), 338 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90 index 760c8710d..53c1fe8ea 100644 --- a/src/LIB/SURCOUCHE/src/mode_fm.f90 +++ b/src/LIB/SURCOUCHE/src/mode_fm.f90 @@ -3,25 +3,26 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- +! Author(s): +! ! Modifications: -! D.Gazen : avril 2016 change error message -! P. Wautelet : may 2016: use NetCDF Fortran module -! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! Philippe Wautelet: 29/10/2018: better detection of older MNH version numbers -! Philippe Wautelet: 13/12/2018: moved some operations to new mode_io_*_nc4 modules -! Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN + move management -! of NNCID and NLFIFLU to the nc4 and lfi subroutines -! Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll -! to allow to disable writes (for bench purposes) +! D. Gazen April 2016: change error message +! P. Wautelet May 2016 : use NetCDF Fortran module +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 29/10/2018: better detection of older MNH version numbers +! P. Wautelet 13/12/2018: moved some operations to new mode_io_*_nc4 modules +! P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN + move management +! of NNCID and NLFIFLU to the nc4 and lfi subroutines +! P. Wautelet 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll +! to allow to disable writes (for bench purposes) ! P. Wautelet 06/02/2019: simplify OPEN_ll and do somme assignments at a more logical place ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_FILE_ADD2LIST ! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines ! (nsubfiles_ioz is now determined in IO_FILE_ADD2LIST) +! P. Wautelet 19/02/2019: simplification/restructuration/cleaning of open/close subroutines (TBCto be continued) !----------------------------------------------------------------- MODULE MODE_FM -USE MODD_MPIF - USE MODE_MSG IMPLICIT NONE @@ -34,10 +35,8 @@ PUBLIC IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll CONTAINS SUBROUTINE SET_FMPACK_ll(O1D,O2D,OPACK) -USE MODD_IO_ll, ONLY : LPACK,L1D,L2D -!JUAN -USE MODD_VAR_ll, ONLY : IP -!JUAN +USE MODD_IO_ll, ONLY: LPACK, L1D, L2D +USE MODD_VAR_ll, ONLY: IP IMPLICIT NONE @@ -47,27 +46,27 @@ LPACK = OPACK L1D = O1D L2D = O2D -IF ( IP .EQ. 1 ) PRINT *,'INIT L1D,L2D,LPACK = ',L1D,L2D,LPACK +IF ( IP == 1 ) PRINT *,'INIT L1D,L2D,LPACK = ',L1D,L2D,LPACK END SUBROUTINE SET_FMPACK_ll SUBROUTINE IO_FILE_OPEN_ll(TPFILE,KRESP,HPOSITION,HSTATUS,HPROGRAM_ORIG) ! -USE MODD_CONF, ONLY: CPROGRAM -USE MODD_IO_ll, ONLY: LIO_NO_WRITE, TFILEDATA -USE MODE_FMREAD -USE MODE_IO_ll, ONLY : OPEN_ll -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST,IO_FILE_FIND_BYNAME +USE MODD_CONF, ONLY: CPROGRAM +USE MODD_IO_ll, ONLY: LIO_NO_WRITE, TFILEDATA ! -TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE ! File structure -INTEGER, INTENT(OUT), OPTIONAL :: KRESP ! Return code -CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HPOSITION -CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HSTATUS -CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program +USE MODE_IO_ll, ONLY: OPEN_ll +USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST, IO_FILE_FIND_BYNAME ! -INTEGER :: IRESP -TYPE(TFILEDATA),POINTER :: TZFILE_DES -TYPE(TFILEDATA),POINTER :: TZFILE_DUMMY +TYPE(TFILEDATA), POINTER, INTENT(INOUT) :: TPFILE ! File structure +INTEGER, INTENT(OUT), OPTIONAL :: KRESP ! Return code +CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HPOSITION +CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HSTATUS +CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program +! +INTEGER :: IRESP +TYPE(TFILEDATA), POINTER :: TZFILE_DES +TYPE(TFILEDATA), POINTER :: TZFILE_DUMMY ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_OPEN_ll','opening '//TRIM(TPFILE%CNAME)//' for '//TRIM(TPFILE%CMODE)// & ' (filetype='//TRIM(TPFILE%CTYPE)//')') @@ -98,42 +97,42 @@ IF (IRESP/=0) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_OPEN_ll','file '//TRIM(TP SELECT CASE(TPFILE%CTYPE) !Chemistry input files CASE('CHEMINPUT') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,POSITION='REWIND',STATUS='OLD',MODE='GLOBAL') + CALL OPEN_ll(TPFILE,IRESP,HPOSITION='REWIND',HSTATUS='OLD',HMODE='GLOBAL') !Chemistry tabulation files CASE('CHEMTAB') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,MODE='GLOBAL') + CALL OPEN_ll(TPFILE,IRESP,HMODE='GLOBAL') !GPS files CASE('GPS') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,MODE='SPECIFIC') + CALL OPEN_ll(TPFILE,IRESP,HMODE='SPECIFIC') !Meteo files CASE('METEO') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,MODE='GLOBAL') + CALL OPEN_ll(TPFILE,IRESP,HMODE='GLOBAL') !Namelist files CASE('NML') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,DELIM='QUOTE',MODE='GLOBAL') + CALL OPEN_ll(TPFILE,IRESP,HDELIM='QUOTE',HMODE='GLOBAL') !OUTPUTLISTING files CASE('OUTPUTLISTING') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,MODE='GLOBAL') + CALL OPEN_ll(TPFILE,IRESP,HMODE='GLOBAL') !SURFACE_DATA files CASE('SURFACE_DATA') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,MODE='GLOBAL') + CALL OPEN_ll(TPFILE,IRESP,HMODE='GLOBAL') !Text files CASE('TXT') - CALL OPEN_ll(TPFILE,IOSTAT=IRESP,POSITION=HPOSITION,STATUS=HSTATUS,MODE='GLOBAL') + CALL OPEN_ll(TPFILE,IRESP,HPOSITION=HPOSITION,HSTATUS=HSTATUS,HMODE='GLOBAL') CASE DEFAULT @@ -141,7 +140,7 @@ SELECT CASE(TPFILE%CTYPE) IF(TPFILE%CTYPE/='MNHOUTPUT' .AND. CPROGRAM/='LFICDF') THEN CALL IO_FILE_ADD2LIST(TZFILE_DES,TRIM(TPFILE%CNAME)//'.des','DES',TPFILE%CMODE,TPDATAFILE=TPFILE,OOLD=.TRUE.) !OOLD=T because the file may already be in the list CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_OPEN_ll','OPEN_ll for '//TRIM(TPFILE%CNAME)//'.des') - CALL OPEN_ll(TZFILE_DES,IOSTAT=IRESP,DELIM='QUOTE') + CALL OPEN_ll(TZFILE_DES,IRESP,HDELIM='QUOTE') TZFILE_DES%LOPENED = .TRUE. TZFILE_DES%NOPEN_CURRENT = TZFILE_DES%NOPEN_CURRENT + 1 TZFILE_DES%NOPEN = TZFILE_DES%NOPEN + 1 @@ -155,29 +154,26 @@ IF (PRESENT(KRESP)) KRESP = IRESP ! END SUBROUTINE IO_FILE_OPEN_ll + SUBROUTINE FMOPEN_ll(TPFILE,KRESP,HPROGRAM_ORIG) -USE MODD_IO_ll, ONLY: TFILEDATA -USE MODE_IO_ll, ONLY: OPEN_ll,GCONFIO -!JUANZ -USE MODD_CONFZ,ONLY : NB_PROCIO_R,NB_PROCIO_W -!JUANZ + +USE MODD_IO_ll, ONLY: TFILEDATA + #if defined(MNH_IOCDF4) -USE MODD_NETCDF, ONLY:IDCDF_KIND use mode_io_file_nc4, only: io_create_file_nc4, io_open_file_nc4 #endif use mode_io_file_lfi, only: io_create_file_lfi, io_open_file_lfi +USE MODE_IO_ll, ONLY: OPEN_ll, GCONFIO -TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File structure -INTEGER, INTENT(OUT) :: KRESP ! return-code -CHARACTER(LEN=*),INTENT(IN), OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program +TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File structure +INTEGER, INTENT(OUT) :: KRESP ! return-code +CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program ! ! Local variables ! -INTEGER :: IROWF, IRESP +INTEGER :: IRESP CHARACTER(LEN=7) :: YACTION ! Action upon the file ('READ' or 'WRITE') CHARACTER(LEN=8) :: YRESP -INTEGER :: IERR -INTEGER :: INB_PROCIO LOGICAL :: GEXIST_LFI, GEXIST_NC4 YACTION = TPFILE%CMODE @@ -190,26 +186,9 @@ IF (.NOT. GCONFIO) THEN STOP END IF -IROWF = 0 IRESP = 0 -IROWF=LEN_TRIM(TPFILE%CNAME) - -IF (IROWF.EQ.0) THEN - IRESP=-45 - GOTO 1000 -ENDIF - - SELECT CASE (YACTION) - CASE('READ') - INB_PROCIO = NB_PROCIO_R - CASE('WRITE') - INB_PROCIO = NB_PROCIO_W - END SELECT - -CALL OPEN_ll(TPFILE,IOSTAT=IRESP,MODE='IO_ZSPLIT',HPROGRAM_ORIG=HPROGRAM_ORIG) - -IF (IRESP /= 0) GOTO 1000 +CALL OPEN_ll(TPFILE,IRESP,HMODE='IO_ZSPLIT',HPROGRAM_ORIG=HPROGRAM_ORIG) IF (TPFILE%LMASTER) THEN ! Proc I/O case @@ -277,14 +256,7 @@ IF (TPFILE%CFORMAT=='LFI' .OR. TPFILE%CFORMAT=='LFICDF4') THEN END SELECT END IF -! Broadcast ERROR -CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR) -IF (IRESP /= 0) GOTO 1000 - - -1000 CONTINUE - -IF (IRESP.NE.0) THEN +IF ( IRESP /= 0 ) THEN WRITE(YRESP,"( I0 )") IRESP CALL PRINT_MSG(NVERB_ERROR,'IO','FMOPEN_ll',TRIM(TPFILE%CNAME)//': exit with IRESP='//TRIM(YRESP)) END IF @@ -293,16 +265,23 @@ KRESP=IRESP END SUBROUTINE FMOPEN_ll + SUBROUTINE IO_FILE_CLOSE_ll(TPFILE,KRESP,HPROGRAM_ORIG) ! -USE MODD_CONF, ONLY: CPROGRAM -USE MODD_IO_ll, ONLY: TFILEDATA -USE MODE_IO_ll, ONLY : CLOSE_ll +USE MODD_CONF, ONLY: CPROGRAM +USE MODD_IO_ll, ONLY: TFILEDATA + +use mode_io_file_lfi, only: io_close_file_lfi +#if defined(MNH_IOCDF4) +use mode_io_file_nc4, only: io_close_file_nc4 +use mode_io_write_nc4, only: io_write_coordvar_nc4 +#endif +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 -CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program +TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File structure +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! Return code +CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program ! INTEGER :: IRESP, JI TYPE(TFILEDATA),POINTER :: TZFILE_DES @@ -331,62 +310,11 @@ IF (TPFILE%NOPEN_CURRENT>1) THEN END IF ! SELECT CASE(TPFILE%CTYPE) - !Chemistry input files - CASE('CHEMINPUT') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - ! - TPFILE%NLU = -1 - - - !Chemistry tabulation files - CASE('CHEMTAB') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) + CASE('CHEMINPUT','CHEMTAB','GPS','METEO','NML','OUTPUTLISTING','SURFACE_DATA','TXT') + CALL CLOSE_ll(TPFILE,IRESP) ! TPFILE%NLU = -1 - - !GPS files - CASE('GPS') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - ! - TPFILE%NLU = -1 - - - !Meteo files - CASE('METEO') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - ! - TPFILE%NLU = -1 - - - !Namelist files - CASE('NML') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - ! - TPFILE%NLU = -1 - - - !OUTPUTLISTING files - CASE('OUTPUTLISTING') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - ! - TPFILE%NLU = -1 - - - !SURFACE_DATA files - CASE('SURFACE_DATA') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - ! - TPFILE%NLU = -1 - - - !Text files - CASE('TXT') - CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - ! - TPFILE%NLU = -1 - - CASE DEFAULT !Do not close (non-existing) '.des' file if OUTPUT IF(TPFILE%CTYPE/='OUTPUT' .AND. CPROGRAM/='LFICDF') THEN @@ -397,15 +325,29 @@ SELECT CASE(TPFILE%CTYPE) TZFILE_DES%NCLOSE = TZFILE_DES%NCLOSE + 1 ! IF (TZFILE_DES%NOPEN_CURRENT==0) THEN - CALL CLOSE_ll(TZFILE_DES,IOSTAT=IRESP) + CALL CLOSE_ll(TZFILE_DES,IRESP) TZFILE_DES%LOPENED = .FALSE. TZFILE_DES%NLU = -1 END IF ENDIF ! - CALL FMCLOS_ll(TPFILE,KRESP=IRESP,HPROGRAM_ORIG=HPROGRAM_ORIG) +#if defined(MNH_IOCDF4) + !Write coordinates variables in NetCDF file + IF (TPFILE%CMODE == 'WRITE' .AND. (TPFILE%CFORMAT=='NETCDF4' .OR. TPFILE%CFORMAT=='LFICDF4')) THEN + CALL IO_WRITE_COORDVAR_NC4(TPFILE,HPROGRAM_ORIG=HPROGRAM_ORIG) + END IF +#endif + + if (tpfile%lmaster) then + if (tpfile%cformat == 'LFI' .or. tpfile%cformat == 'LFICDF4') call io_close_file_lfi(tpfile,iresp) +#if defined(MNH_IOCDF4) + if (tpfile%cformat == 'NETCDF4' .or. tpfile%cformat == 'LFICDF4') call io_close_file_nc4(tpfile,iresp) +#endif + end if + ! + CALL IO_ADD2TRANSFER_LIST(TPFILE) ! - DO JI = 1,TPFILE%NSUBFILES_IOZ + SUBFILES: 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') @@ -415,7 +357,19 @@ SELECT CASE(TPFILE%CTYPE) TZFILE_IOZ%LOPENED = .FALSE. TZFILE_IOZ%NOPEN_CURRENT = 0 TZFILE_IOZ%NCLOSE = TZFILE_IOZ%NCLOSE + 1 - END DO +#if defined(MNH_IOCDF4) + !Write coordinates variables in netCDF file + IF (TZFILE_IOZ%CMODE == 'WRITE' .AND. (TZFILE_IOZ%CFORMAT=='NETCDF4' .OR. TZFILE_IOZ%CFORMAT=='LFICDF4')) THEN + CALL IO_WRITE_COORDVAR_NC4(TZFILE_IOZ,HPROGRAM_ORIG=HPROGRAM_ORIG) + END IF +#endif + IF (TZFILE_IOZ%LMASTER) THEN + if (tzfile_ioz%cformat == 'LFI' .or. tzfile_ioz%cformat == 'LFICDF4') call io_close_file_lfi(tzfile_ioz,iresp) +#if defined(MNH_IOCDF4) + if (tzfile_ioz%cformat == 'NETCDF4' .or. tzfile_ioz%cformat == 'LFICDF4') call io_close_file_nc4(tzfile_ioz,iresp) +#endif + END IF + END DO SUBFILES END SELECT ! TPFILE%LOPENED = .FALSE. @@ -426,106 +380,53 @@ IF (PRESENT(KRESP)) KRESP=IRESP ! END SUBROUTINE IO_FILE_CLOSE_ll -SUBROUTINE FMCLOS_ll(TPFILE,KRESP,HPROGRAM_ORIG) -! -!! MODIFICATIONS -!! ------------- -! -!! J.Escobar 18/10/10 bug with PGI compiler on ADJUSTL -!------------------------------------------------------------------------------- + +subroutine IO_ADD2TRANSFER_LIST(TPFILE) + USE MODD_CONF, ONLY : CPROGRAM USE MODD_IO_ll, ONLY : TFILEDATA -USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE -USE MODI_SYSTEM_MNH - use mode_io_file_lfi, only: io_close_file_lfi -#if defined(MNH_IOCDF4) - use mode_io_file_nc4, only: io_close_file_nc4 - use mode_io_write_nc4, only: io_write_coordvar_nc4 -#endif -TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File structure -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems araised -CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program - -INTEGER :: IRESP,IROWF -CHARACTER(LEN=28) :: YFILEM ! name of the file -CHARACTER(LEN=8) :: YRESP -CHARACTER(LEN=10) :: YCPIO -CHARACTER(LEN=14) :: YTRANS -CHARACTER(LEN=100) :: YCOMMAND -INTEGER :: IERR, IFITYP -INTEGER, SAVE :: ICPT=0 - -YFILEM = TPFILE%CNAME -CALL PRINT_MSG(NVERB_DEBUG,'IO','FMCLOS_ll','closing '//TRIM(YFILEM)) +USE MODI_SYSTEM_MNH -IRESP = 0 -IROWF = 0 +TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File structure -IROWF=LEN_TRIM(YFILEM) +CHARACTER(len=:),allocatable :: YFILEM ! name of the file +CHARACTER(len=:),allocatable :: YCPIO +CHARACTER(len=:),allocatable :: YTRANS +CHARACTER(LEN=100) :: YCOMMAND +INTEGER, SAVE :: ICPT = 0 -IF (IROWF.EQ.0) THEN - IRESP=-59 - GOTO 1000 -ENDIF +YFILEM = TPFILE%CNAME -#if defined(MNH_IOCDF4) -!Write coordinates variables in NetCDF file -IF (TPFILE%CMODE == 'WRITE' .AND. (TPFILE%CFORMAT=='NETCDF4' .OR. TPFILE%CFORMAT=='LFICDF4')) THEN - CALL IO_WRITE_COORDVAR_NC4(TPFILE,HPROGRAM_ORIG=HPROGRAM_ORIG) -END IF -#endif +CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_ADD2TRANSFER_LIST','called for '//TRIM(YFILEM)) -IF (TPFILE%LMASTER) THEN - if (tpfile%cformat == 'LFI' .or. tpfile%cformat == 'LFICDF4') call io_close_file_lfi(tpfile,iresp) -#if defined(MNH_IOCDF4) - if (tpfile%cformat == 'NETCDF4' .or. tpfile%cformat == 'LFICDF4') call io_close_file_nc4(tpfile,iresp) -#endif - IF (IRESP == 0 .AND. CPROGRAM/='LFICDF') THEN - !! Write in pipe +IF (TPFILE%LMASTER .AND. CPROGRAM/='LFICDF') THEN + !! Write in pipe #if defined(MNH_SX5) - YTRANS='nectransfer.x' + YTRANS='nectransfer.x' #else - YTRANS='xtransfer.x' + YTRANS='xtransfer.x' #endif - IFITYP = TPFILE%NLFITYPE - SELECT CASE (IFITYP) - CASE(:-1) - IRESP=-66 - GOTO 500 + SELECT CASE (TPFILE%NLFITYPE) + CASE(:-1,3:) + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_ADD2TRANSFER_LIST',TRIM(YFILEM)//': incorrect NLFITYPE') CASE(0) YCPIO='NIL' CASE(1) YCPIO='MESONH' CASE(2) - CALL PRINT_MSG(NVERB_INFO,'IO','FMCLOS_ll','file '//TRIM(YFILEM)//' not transferred') - GOTO 500 - CASE(3:) - IRESP=-66 - GOTO 500 - END SELECT + CALL PRINT_MSG(NVERB_INFO,'IO','IO_ADD2TRANSFER_LIST','file '//TRIM(YFILEM)//' not transferred') + END SELECT + + if (TPFILE%NLFITYPE==0 .or. TPFILE%NLFITYPE==1) then ICPT=ICPT+1 - WRITE (YCOMMAND,'(A," ",A," ",A," >> OUTPUT_TRANSFER",I3.3," 2>&1 &")') TRIM(YTRANS),TRIM(YCPIO),TRIM(YFILEM),ICPT - CALL PRINT_MSG(NVERB_INFO,'IO','FMCLOS_ll','YCOMMAND='//TRIM(YCOMMAND)) + WRITE (YCOMMAND,'(A," ",A," ",A," >> OUTPUT_TRANSFER",I3.3," 2>&1 &")') YTRANS,YCPIO,TRIM(YFILEM),ICPT + CALL PRINT_MSG(NVERB_INFO,'IO','IO_ADD2TRANSFER_LIST','YCOMMAND='//TRIM(YCOMMAND)) CALL SYSTEM_MNH(YCOMMAND) - END IF + end if END IF -500 CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR) -IF (IRESP /= 0) GOTO 1000 - -CALL CLOSE_ll(TPFILE,IOSTAT=IRESP) - -1000 CONTINUE - -IF (IRESP.NE.0) THEN - WRITE(YRESP,"( I0 )") IRESP - CALL PRINT_MSG(NVERB_ERROR,'IO','FMCLOS_ll',TRIM(YFILEM)//': exit with IRESP='//TRIM(YRESP)) -END IF - -KRESP=IRESP - -END SUBROUTINE FMCLOS_ll +end subroutine IO_ADD2TRANSFER_LIST END MODULE MODE_FM diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90 index b4f6ba125..1f86e1553 100644 --- a/src/LIB/SURCOUCHE/src/mode_io.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io.f90 @@ -3,32 +3,32 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!! Authors -!! ------- -! -! D. Gazen -! Juan 19/08/2005: bug argument optinonel ACCESS --> YACCESS -! Juan 22/05/2008: bug mode SPECIFIC in OPEN_ll -! Juan 05/11/2009: allow JPMAX_UNIT=48 open files -! J.Escobar 18/10/10 bug with PGI compiler on ADJUSTL -! P. Wautelet 04/02/2016: bug with DELIM='NONE' and GCC 5.2/5.3 -! D.Gazen : avril 2016 change error message -! P. Wautelet : may 2016: use netCDF Fortran module -! P. Wautelet : July 2016: added type OUTBAK -! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! J. Pianezze 01/08/2016 add LOASIS flag -! Philippe Wautelet: 13/12/2018: moved some operations to new mode_io_*_nc4 modules -! Philippe Wautelet: 10/01/2019: bug correction: close correctly Z-split files -! Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN -! + move IOFREEFLU and IONEWFLU to mode_io_file_lfi.f90 -! + move management of NNCID and NLFIFLU to the nc4 and lfi subroutines -! Philippe Wautelet: 10/01/2019: bug: modify some metadata before open calls -! Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll to allow -! to disable writes (for bench purposes) +! Author(s) +! D. Gazen +! Modifications: +! J. Escobar 19/08/2005: bug argument optinonel ACCESS --> YACCESS +! J. Escobar 22/05/2008: bug mode SPECIFIC in OPEN_ll +! J. Escobar 05/11/2009: allow JPMAX_UNIT=48 open files +! J. Escobar 18/10/2010: bug with PGI compiler on ADJUSTL +! P. Wautelet 04/02/2016: bug with DELIM='NONE' and GCC 5.2/5.3 +! D.Gazen April 2016: change error message +! P. Wautelet May 2016 : use netCDF Fortran module +! P. Wautelet July 2016 : added type OUTBAK +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! J. Pianezze 01/08/2016: add LOASIS flag +! P. Wautelet 13/12/2018: moved some operations to new mode_io_*_nc4 modules +! P. Wautelet 10/01/2019: bug correction: close correctly Z-split files +! P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN +! + move IOFREEFLU and IONEWFLU to mode_io_file_lfi.f90 +! + move management of NNCID and NLFIFLU to the nc4 and lfi subroutines +! P. Wautelet 10/01/2019: bug: modify some metadata before open calls +! P. Wautelet 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll to allow +! to disable writes (for bench purposes) ! P. Wautelet 06/02/2019: simplify OPEN_ll and do somme assignments at a more logical place ! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines ! (nsubfiles_ioz is now determined in IO_FILE_ADD2LIST) ! P. Wautelet 14/02/2019: move UPCASE function to tools.f90 +! P. Wautelet 19/02/2019: simplification/restructuration/cleaning of open/close subroutines (TBCto be continued) ! !----------------------------------------------------------------- MODULE MODE_IO_ll @@ -50,7 +50,7 @@ MODULE MODE_IO_ll CONTAINS SUBROUTINE SET_CONFIO_ll() - USE MODN_CONFIO + USE MODN_CONFIO, only: LCDF4, LLFIOUT, LLFIREAD !Use MODN_CONFIO namelist variables CALL SET_CONFIO_INTERN_ll(LCDF4, LLFIOUT, LLFIREAD) @@ -58,6 +58,7 @@ CONTAINS SUBROUTINE SET_CONFIO_INTERN_ll(OIOCDF4, OLFIOUT, OLFIREAD) USE MODD_IO_ll, ONLY : LIOCDF4, LLFIOUT, LLFIREAD, LIO_ALLOW_NO_BACKUP, LIO_NO_WRITE + LOGICAL, INTENT(IN) :: OIOCDF4, OLFIOUT, OLFIREAD CALL PRINT_MSG(NVERB_DEBUG,'IO','SET_CONFIO_ll','called') @@ -91,12 +92,14 @@ CONTAINS END SUBROUTINE SET_CONFIO_INTERN_ll SUBROUTINE INITIO_ll() + USE MODD_IO_ll, only: CNULLFILE, GSMONOPROC, ISIOP, ISNPROC, ISP, NNULLUNIT + USE MODE_MNH_WORLD, ONLY: INIT_NMNH_COMM_WORLD - USE MODD_IO_ll - USE MODE_FIELD + IMPLICIT NONE INTEGER :: IERR, IOS + character(len=256) :: yioerrmsg CALL PRINT_MSG(NVERB_DEBUG,'IO','INITIO_ll','called') @@ -118,27 +121,20 @@ CONTAINS !! Open /dev/null for GLOBAL mode #if defined(DEV_NULL) - OPEN(NEWUNIT=NNULLUNIT,FILE=CNULLFILE ,ACTION='WRITE',IOSTAT=IOS) + OPEN(NEWUNIT=NNULLUNIT,FILE=CNULLFILE ,ACTION='WRITE',IOSTAT=IOS, IOMSG=yioerrmsg) #else - OPEN(NEWUNIT=NNULLUNIT,STATUS='SCRATCH',ACTION='WRITE',IOSTAT=IOS) + OPEN(NEWUNIT=NNULLUNIT,STATUS='SCRATCH',ACTION='WRITE',IOSTAT=IOS, IOMSG=yioerrmsg) #endif - IF (IOS > 0) THEN - CALL PRINT_MSG(NVERB_FATAL,'IO','INITIO_ll','error opening /dev/null') + IF (IOS /= 0) THEN + CALL PRINT_MSG(NVERB_FATAL,'IO','INITIO_ll','problem opening /dev/null :'//trim(yioerrmsg)) END IF END SUBROUTINE INITIO_ll - SUBROUTINE OPEN_ll(& - TPFILE, & - IOSTAT, & - MODE, & - STATUS, & - POSITION,& - DELIM, & - HPROGRAM_ORIG) + + SUBROUTINE OPEN_ll(TPFILE, KRESP, HMODE, HSTATUS, HPOSITION, HDELIM, HPROGRAM_ORIG) USE MODD_IO_ll #if defined(MNH_IOCDF4) - USE MODD_NETCDF, ONLY:IDCDF_KIND use mode_io_file_nc4, only: io_create_file_nc4, io_open_file_nc4 #endif use mode_io_file_lfi, only: io_create_file_lfi, io_open_file_lfi @@ -146,37 +142,37 @@ CONTAINS use mode_io_tools, only: io_rank use mode_tools, only: upcase - TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE - INTEGER, INTENT(OUT) :: IOSTAT - CHARACTER(len=*),INTENT(IN), OPTIONAL :: MODE - CHARACTER(len=*),INTENT(IN), OPTIONAL :: STATUS - CHARACTER(len=*),INTENT(IN), OPTIONAL :: POSITION - CHARACTER(len=*),INTENT(IN), OPTIONAL :: DELIM - CHARACTER(LEN=*),INTENT(IN), OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program + TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE + INTEGER, INTENT(OUT) :: KRESP + CHARACTER(len=*), OPTIONAL, INTENT(IN) :: HMODE + CHARACTER(len=*), OPTIONAL, INTENT(IN) :: HSTATUS + CHARACTER(len=*), OPTIONAL, INTENT(IN) :: HPOSITION + CHARACTER(len=*), OPTIONAL, INTENT(IN) :: HDELIM + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program ! ! local var ! - CHARACTER(len=5) :: CFILE - INTEGER :: IFILE, IRANK_PROCIO - CHARACTER(len=20) :: YSTATUS - INTEGER :: YRECL - INTEGER ,PARAMETER :: RECL_DEF = 10000 - CHARACTER(len=20) :: YPOSITION - CHARACTER(len=20) :: YDELIM - CHARACTER(len=20) :: YACTION - CHARACTER(len=20) :: YMODE - CHARACTER(LEN=256) :: YIOERRMSG - INTEGER :: IOS,IRESP - TYPE(TFILEDATA),POINTER :: TZSPLITFILE + INTEGER, PARAMETER :: RECL_DEF = 10000 + ! + CHARACTER(len=5) :: YFILE + CHARACTER(len=20) :: YSTATUS + CHARACTER(len=20) :: YPOSITION + CHARACTER(len=20) :: YDELIM + CHARACTER(len=20) :: YACTION + CHARACTER(len=20) :: YMODE + CHARACTER(LEN=256) :: YIOERRMSG CHARACTER(LEN=:),ALLOCATABLE :: YPREFILENAME !To store the directory + filename - CHARACTER(LEN=:),ALLOCATABLE :: YFORSTATUS ! Status for open of a file (for LFI) ('OLD','NEW','UNKNOWN','SCRATCH','REPLACE') + INTEGER :: IFILE, IRANK_PROCIO + INTEGER :: YRECL + INTEGER :: IOS, IRESP + TYPE(TFILEDATA),POINTER :: TZSPLITFILE CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','opening '//TRIM(TPFILE%CNAME)//' for '//TRIM(TPFILE%CMODE)) IOS = 0 - IF (PRESENT(MODE)) THEN - YMODE = MODE + IF (PRESENT(HMODE)) THEN + YMODE = HMODE YMODE = UPCASE(TRIM(ADJUSTL(YMODE))) ELSE YMODE = 'GLOBAL' ! Default Mode @@ -185,21 +181,21 @@ CONTAINS YACTION = TPFILE%CMODE YACTION = UPCASE(TRIM(ADJUSTL(YACTION))) IF (YACTION /= "READ" .AND. YACTION /= "WRITE") THEN - IOSTAT = 99 + KRESP = 99 TPFILE%NLU = -1 CALL PRINT_MSG(NVERB_ERROR,'IO','OPEN_ll','action='//TRIM(YACTION)//' not supported') RETURN END IF IF (.NOT. ANY(YMODE == (/'GLOBAL ','SPECIFIC ', 'IO_ZSPLIT '/))) THEN - IOSTAT = 99 + KRESP = 99 TPFILE%NLU = -1 CALL PRINT_MSG(NVERB_ERROR,'IO','OPEN_ll','ymode='//TRIM(YMODE)//' not supported') RETURN END IF - IF (PRESENT(STATUS)) THEN - YSTATUS=STATUS + IF (PRESENT(HSTATUS)) THEN + YSTATUS=HSTATUS ELSE YSTATUS='UNKNOWN' ENDIF @@ -210,13 +206,13 @@ CONTAINS YRECL = TPFILE%NRECL END IF - IF (PRESENT(POSITION)) THEN - YPOSITION=POSITION + IF (PRESENT(HPOSITION)) THEN + YPOSITION=HPOSITION ELSE YPOSITION='ASIS' ENDIF - IF (PRESENT(DELIM)) THEN - YDELIM=DELIM + IF (PRESENT(HDELIM)) THEN + YDELIM=HDELIM ELSE YDELIM='NONE' ENDIF @@ -399,18 +395,18 @@ CONTAINS END IF DO IFILE=1,TPFILE%NSUBFILES_IOZ IRANK_PROCIO = 1 + IO_RANK(IFILE-1,ISNPROC,TPFILE%NSUBFILES_IOZ) - WRITE(CFILE ,'(".Z",i3.3)') IFILE + WRITE(YFILE ,'(".Z",i3.3)') IFILE - CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//TRIM(CFILE),TZSPLITFILE,IRESP) + CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//TRIM(YFILE),TZSPLITFILE,IRESP) IF (IRESP/=0) THEN !File not yet in filelist => add it (nothing to do if already in list) IF (ALLOCATED(TPFILE%CDIRNAME)) THEN - CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(CFILE),TPFILE%CTYPE,TPFILE%CMODE, & + CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(YFILE),TPFILE%CTYPE,TPFILE%CMODE, & HDIRNAME=TPFILE%CDIRNAME, & KLFINPRAR=TPFILE%NLFINPRAR,KLFITYPE=TPFILE%NLFITYPE,KLFIVERB=TPFILE%NLFIVERB, & HFORMAT=TPFILE%CFORMAT) ELSE - CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(CFILE),TPFILE%CTYPE,TPFILE%CMODE, & + CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(YFILE),TPFILE%CTYPE,TPFILE%CMODE, & KLFINPRAR=TPFILE%NLFINPRAR,KLFITYPE=TPFILE%NLFITYPE,KLFIVERB=TPFILE%NLFIVERB, & HFORMAT=TPFILE%CFORMAT) END IF @@ -471,7 +467,7 @@ CONTAINS TPFILE%NMPICOMM = NMNH_COMM_WORLD - IOSTAT = IOS + KRESP = IOS CONTAINS FUNCTION SUFFIX(HEXT) @@ -485,30 +481,19 @@ CONTAINS END SUBROUTINE OPEN_ll - SUBROUTINE CLOSE_ll(TPFILE,IOSTAT,HPROGRAM_ORIG) - USE MODD_IO_ll - USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME - use mode_io_file_lfi, only: io_close_file_lfi -#if defined(MNH_IOCDF4) - use mode_io_file_nc4, only: io_close_file_nc4 - use mode_io_write_nc4, only: io_write_coordvar_nc4 -#endif - TYPE(TFILEDATA), INTENT(IN) :: TPFILE - INTEGER, INTENT(OUT), OPTIONAL :: IOSTAT - CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HPROGRAM_ORIG !To emulate a file coming from this program + SUBROUTINE CLOSE_ll(TPFILE,KRESP) + USE MODD_IO_ll + + TYPE(TFILEDATA), INTENT(IN) :: TPFILE + INTEGER, INTENT(OUT) :: KRESP character(len=256) :: yioerrmsg - INTEGER :: IERR, IGLOBALERR, IGLOBALERR2, IRESP, IRESP2 - INTEGER :: IFILE - TYPE(TFILEDATA),POINTER :: TZFILE + INTEGER :: IRESP CALL PRINT_MSG(NVERB_DEBUG,'IO','CLOSE_ll','closing '//TRIM(TPFILE%CNAME)) IRESP = 0 - IRESP2 = 0 - IGLOBALERR = 0 - IGLOBALERR2 = 0 IF (TPFILE%LMASTER) THEN IF (TPFILE%NLU/=-1 .AND. TPFILE%NLU/=NNULLUNIT) THEN @@ -519,37 +504,10 @@ CONTAINS !Warning and not error or fatal if close fails to allow continuation of execution IF (IRESP/=0) CALL PRINT_MSG(NVERB_WARNING,'IO','CLOSE_ll','Problem when closing '//TRIM(TPFILE%CNAME)//': '//TRIM(YIOERRMSG)) - DO IFILE=1,TPFILE%NSUBFILES_IOZ - TZFILE => TPFILE%TFILES_IOZ(IFILE)%TFILE -#if defined(MNH_IOCDF4) - !Write coordinates variables in netCDF file - IF (TZFILE%CMODE == 'WRITE' .AND. (TZFILE%CFORMAT=='NETCDF4' .OR. TZFILE%CFORMAT=='LFICDF4')) THEN - CALL IO_WRITE_COORDVAR_NC4(TZFILE,HPROGRAM_ORIG=HPROGRAM_ORIG) - END IF -#endif - IF (TZFILE%LMASTER) THEN - if (tzfile%cformat == 'LFI' .or. tzfile%cformat == 'LFICDF4') call io_close_file_lfi(tzfile,iresp2) -#if defined(MNH_IOCDF4) - if (tzfile%cformat == 'NETCDF4' .or. tzfile%cformat == 'LFICDF4') call io_close_file_nc4(tzfile,iresp2) -#endif - END IF - END DO - ! - IF (TPFILE%NSUBFILES_IOZ>0) CALL MPI_ALLREDUCE(IRESP2,IGLOBALERR2,1,MPI_INTEGER,MPI_BOR,TPFILE%NMPICOMM,IERR) - ! - CALL MPI_ALLREDUCE(IRESP, IGLOBALERR, 1,MPI_INTEGER,MPI_BOR,TPFILE%NMPICOMM,IERR) - - IF (PRESENT(IOSTAT)) THEN - IF (IGLOBALERR/=0) THEN - IOSTAT = IGLOBALERR - ELSE - IOSTAT = IGLOBALERR2 - END IF - END IF + KRESP = IRESP END SUBROUTINE CLOSE_ll - ! - ! + END MODULE MODE_IO_ll -- GitLab