From 2958e6f30b973319d5aa583b20731b727e18e7a0 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 6 Oct 2017 15:07:04 +0200 Subject: [PATCH] Philippe 06/10/2017: IO: improved PRINT_MSG * added LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC in NAM_CONFIO namelist * added TFILE_OUTPUTLISTING pointer to select file for output of PRINT_MSG --- src/LIB/SURCOUCHE/src/modd_io.f90 | 5 ++ src/LIB/SURCOUCHE/src/mode_io.f90 | 71 +++++++++++++++++++++++---- src/LIB/SURCOUCHE/src/modn_confio.f90 | 8 ++- src/Makefile | 4 +- 4 files changed, 76 insertions(+), 12 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90 index 5d4348318..537ff3dce 100644 --- a/src/LIB/SURCOUCHE/src/modd_io.f90 +++ b/src/LIB/SURCOUCHE/src/modd_io.f90 @@ -37,6 +37,9 @@ LOGICAL, SAVE :: LIOCDF4 = .FALSE. ! TRUE will enable full NetCDF4 (HDF5) I/O LOGICAL, SAVE :: LLFIOUT = .FALSE. ! TRUE will also force LFI output when LIOCDF4 is on (debug only) LOGICAL, SAVE :: LLFIREAD = .FALSE. ! TRUE will force LFI read (instead of NetCDF) when LIOCDF4 is on (debug only) +LOGICAL, SAVE :: LVERB_OUTLST = .TRUE. ! TRUE will PRINT_MSG in OUTPUT_LISTINGn files +LOGICAL, SAVE :: LVERB_STDOUT = .FALSE. ! TRUE will also PRINT_MSG on standard output +LOGICAL, SAVE :: LVERB_ALLPRC = .FALSE. ! FALSE: only process 0 do PRINT_MSG, TRUE: all processes INTEGER, SAVE :: NIO_VERB = NVERB_WARNING ! Verbosity level for IO INTEGER, SAVE :: NIO_ABORT_LEVEL = NVERB_ERROR ! Level of IO error necessary to force stop of application @@ -106,6 +109,8 @@ TYPE(TFILEDATA),POINTER,SAVE :: TFILE_LAST => NULL() TYPE(TFILEDATA),POINTER,SAVE :: TFILE_SURFEX => NULL() !Pointer used to find the file used when writing SURFEX fields in write_surf_mnh.f90 +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_OUTPUTLISTING => NULL() !Pointer used to point to the file used when writing to OUTPUT_LISTINGn file + TYPE(TFILEDATA),TARGET, SAVE :: TFILE_DUMMY = TFILEDATA(CNAME="dummy") !Non existing file which can be used as a dummy target END MODULE MODD_IO_ll diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90 index 5d87aac48..c6cfe0893 100644 --- a/src/LIB/SURCOUCHE/src/mode_io.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io.f90 @@ -1028,8 +1028,7 @@ END MODULE MODE_IO_ll MODULE MODE_MSG ! -USE MODD_IO_ll, ONLY : NVERB_FATAL,NVERB_ERROR,NVERB_WARNING,NVERB_INFO,NVERB_DEBUG,& - NIO_VERB,NIO_ABORT_LEVEL,NGEN_VERB,NGEN_ABORT_LEVEL +USE MODD_IO_ll, ONLY : NVERB_FATAL,NVERB_ERROR,NVERB_WARNING,NVERB_INFO,NVERB_DEBUG ! IMPLICIT NONE ! @@ -1037,16 +1036,53 @@ CONTAINS ! SUBROUTINE PRINT_MSG(KVERB,HDOMAIN,HSUBR,HMSG) ! -USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD +USE ISO_FORTRAN_ENV, ONLY : ERROR_UNIT, OUTPUT_UNIT +! +USE MODD_CONF, ONLY : CPROGRAM +USE MODD_IO_ll, ONLY : NIO_VERB,NIO_ABORT_LEVEL,NGEN_VERB,NGEN_ABORT_LEVEL, & + LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC, TFILE_OUTPUTLISTING +USE MODD_LUNIT, ONLY : TLUOUT0 +USE MODD_VAR_ll, ONLY : IP, NMNH_COMM_WORLD +!USE MODE_FM, ONLY : IO_FILE_CLOSE_ll ! INTEGER, INTENT(IN) :: KVERB !Verbosity level CHARACTER(LEN=*),INTENT(IN) :: HDOMAIN !Domain/category of message CHARACTER(LEN=*),INTENT(IN) :: HSUBR !Subroutine/function name CHARACTER(LEN=*),INTENT(IN) :: HMSG !Message ! -INTEGER :: IERR, IMAXVERB,IABORTLEVEL +CHARACTER(LEN=8) :: YPRC CHARACTER(LEN=9) :: YPRE CHARACTER(LEN=30) :: YSUBR +INTEGER :: IERR, IMAXVERB,IABORTLEVEL +INTEGER :: ILU +LOGICAL :: GWRITE_OUTLST,GWRITE_STDOUT +! +!Determine if the process will write +GWRITE_OUTLST = .FALSE. +GWRITE_STDOUT = .FALSE. +IF (IP == 1 .OR. LVERB_ALLPRC) THEN + IF (LVERB_OUTLST) GWRITE_OUTLST = .TRUE. + IF (LVERB_STDOUT) GWRITE_STDOUT = .TRUE. +END IF +! +YPRC='' +IF (LVERB_ALLPRC) WRITE(YPRC,'( I8 )') IP-1 +! +!Check if the output file is available +ILU = -1 +IF (ASSOCIATED(TFILE_OUTPUTLISTING)) THEN + IF (TFILE_OUTPUTLISTING%LOPENED) THEN + ILU = TFILE_OUTPUTLISTING%NLU + ELSE + GWRITE_OUTLST = .FALSE. + IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT=*) 'TFILE_OUTPUTLISTING not opened' + END IF +ELSE +!PW: TODO?: temporary to detect non-initialisation +! should disappear except at the beginning of a run + GWRITE_OUTLST = .FALSE. + IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT=*) 'TFILE_OUTPUTLISTING not associated' +END IF ! SELECT CASE(HDOMAIN) CASE('IO') @@ -1056,7 +1092,8 @@ SELECT CASE(HDOMAIN) IMAXVERB = NGEN_VERB IABORTLEVEL = NGEN_ABORT_LEVEL CASE DEFAULT - PRINT *,'ERROR: PRINT_MSG: wrong message category (',TRIM(HDOMAIN),')' + IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT=*) 'ERROR: PRINT_MSG: wrong message category (',TRIM(HDOMAIN),')' + IF (GWRITE_OUTLST) WRITE(UNIT=ILU, FMT=*) 'ERROR: PRINT_MSG: wrong message category (',TRIM(HDOMAIN),')' RETURN END SELECT ! @@ -1074,14 +1111,31 @@ SELECT CASE(KVERB) CASE(NVERB_DEBUG) YPRE='DEBUG: ' CASE DEFAULT - PRINT *,'ERROR: PRINT_MSG: wrong verbosity level' + IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT=*) 'ERROR: PRINT_MSG: wrong verbosity level' + IF (GWRITE_OUTLST) WRITE(UNIT=ILU, FMT=*) 'ERROR: PRINT_MSG: wrong verbosity level' END SELECT ! YSUBR=TRIM(HSUBR)//':' -WRITE (*,"(A9,A30,A)") YPRE,YSUBR,HMSG +IF (LVERB_ALLPRC) THEN + IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT="(A8,': ',A9,A30,A)") ADJUSTL(YPRC),YPRE,YSUBR,HMSG + IF (GWRITE_OUTLST) WRITE(UNIT=ILU, FMT="(A8,': ',A9,A30,A)") ADJUSTL(YPRC),YPRE,YSUBR,HMSG +ELSE + IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT="(A9,A30,A)") YPRE,YSUBR,HMSG + IF (GWRITE_OUTLST) WRITE(UNIT=ILU, FMT="(A9,A30,A)") YPRE,YSUBR,HMSG +END IF ! IF (KVERB<=IABORTLEVEL) THEN - PRINT *,'ABORT asked by application' + IF (IP==1) WRITE(UNIT=ERROR_UNIT,FMT=*) 'ABORT asked by application '//TRIM(CPROGRAM) + IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT=*) 'ABORT asked by application '//TRIM(CPROGRAM) + IF (GWRITE_OUTLST) WRITE(UNIT=ILU, FMT=*) 'ABORT asked by application '//TRIM(CPROGRAM) +#if 0 + !Problem: loop dependency between MODE_MSG and MODE_FM (IO_FILE_CLOSE_ll call PRINT_MSG) + NIO_VERB = 0 !To not get further messages (ABORT should be the last for readability) + IF (ILU>0) CALL IO_FILE_CLOSE_ll(TFILE_OUTPUTLISTING) !To flush it +#else + IF (ILU>0) FLUSH(UNIT=ILU) !OK in F2003 + IF (ASSOCIATED(TLUOUT0)) FLUSH(UNIT=TLUOUT0%NLU) +#endif CALL MPI_ABORT(NMNH_COMM_WORLD, -10, IERR) CALL ABORT END IF @@ -1089,4 +1143,3 @@ END IF END SUBROUTINE PRINT_MSG ! END MODULE MODE_MSG - diff --git a/src/LIB/SURCOUCHE/src/modn_confio.f90 b/src/LIB/SURCOUCHE/src/modn_confio.f90 index a23610af0..2f85e5f5d 100644 --- a/src/LIB/SURCOUCHE/src/modn_confio.f90 +++ b/src/LIB/SURCOUCHE/src/modn_confio.f90 @@ -29,7 +29,8 @@ !* 0. DECLARATIONS ! ------------ ! -USE MODD_IO_ll, ONLY : NIO_VERB, NIO_ABORT_LEVEL, NGEN_VERB, NGEN_ABORT_LEVEL +USE MODD_IO_ll, ONLY : LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC, & + NIO_VERB, NIO_ABORT_LEVEL, NGEN_VERB, NGEN_ABORT_LEVEL ! IMPLICIT NONE ! @@ -38,7 +39,10 @@ LOGICAL,SAVE :: LLFIOUT = .FALSE. ! TRUE : add LFI output when NetCDF4 I/O is e LOGICAL,SAVE :: LLFIREAD = .FALSE. ! TRUE : enable LFI reading (disable NetCDF4 reading) ! when NetCDF4 I/O is enabled (debug) -NAMELIST/NAM_CONFIO/ LCDF4, LLFIOUT, LLFIREAD, NIO_VERB, NIO_ABORT_LEVEL, NGEN_VERB, NGEN_ABORT_LEVEL +NAMELIST/NAM_CONFIO/LCDF4, LLFIOUT, LLFIREAD, & + LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC, & + NIO_VERB, NIO_ABORT_LEVEL, & + NGEN_VERB, NGEN_ABORT_LEVEL ! END MODULE MODN_CONFIO diff --git a/src/Makefile b/src/Makefile index c8103b99d..86cddd7a1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -166,7 +166,7 @@ DEP_ALL_USER = $(sort $(filter-out $(IGNORE_DEP_USER) ,$(DEP_USER)) ) .INTERMEDIATE: $(LIB_MASTER) -.SECONDARY: mpi.mod netcdf.mod openacc.mod +.SECONDARY: iso_fortran_env.mod mpi.mod netcdf.mod openacc.mod ########################################################## # # @@ -542,6 +542,8 @@ ifeq "$(DO_COMP_USER)" "YES" include filedepalluser endif +iso_fortran_env.mod: + mpi.mod: netcdf.mod: -- GitLab