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