59 CHARACTER(LEN=32) :: mod_name
60 INTEGER,
PUBLIC :: err
61 LOGICAL :: isinitialized = .false.
63 INTEGER,
POINTER ::
ppnum => null()
89 INTEGER,
SAVE,
TARGET ::
ppnum = 1
90 LOGICAL,
SAVE,
TARGET ::
parinit = .false.
91 CHARACTER(LEN=1),
SAVE ::
prefix =
' '
114 use,
INTRINSIC :: ieee_arithmetic
119 CHARACTER(LEN=*) :: n
130 CALL mpi_comm_rank(mpi_comm_world,this%myrank,this%err)
131 CALL mpi_comm_size(mpi_comm_world,this%ppnum,this%err)
132 this%parinit = .true.
134 SELECT CASE (selected_real_kind(precision(
dummy)))
142 CALL this%Warning(
"logging_base::InitLogging",
"Cannot determine default MPI real types.")
150 CALL this%Warning(
"logging_base::InitLogging",
"Setting numbers to NaN for testing disabled in debug mode")
153 this%isinitialized = .true.
164 this%isinitialized = .false.
185 CHARACTER(LEN=1),
INTENT(IN) :: val
197 CHARACTER(LEN=32) :: n
243 i = this%isinitialized
245 IF (
ASSOCIATED(this%parinit))
THEN
246 i = i.AND.this%parinit
264 SUBROUTINE info(this,msg,rank,node_info,tostderr)
268 CHARACTER(LEN=*),
INTENT(IN) :: msg
269 INTEGER,
OPTIONAL,
INTENT(IN) :: rank
270 LOGICAL,
OPTIONAL,
INTENT(IN) :: node_info
271 LOGICAL,
OPTIONAL,
INTENT(IN) :: tostderr
276 INTEGER :: print_rank,output_unit
277 LOGICAL :: print_node_info
279 IF (
PRESENT(rank))
THEN
284 IF (
PRESENT(node_info))
THEN
285 print_node_info = node_info
287 print_node_info = .false.
291 IF (
PRESENT(tostderr))
THEN
292 IF (tostderr) output_unit =
stderr
295 IF (.NOT.
parinit)
CALL mpi_comm_rank(mpi_comm_world,
myrank,ierr)
299 IF (
myrank.EQ.print_rank)
THEN
300 WRITE (output_unit,
'(A)',advance=
'NO')
prefix
302 IF (print_node_info) &
303 WRITE (output_unit,
'(A,I4.4,A)',advance=
'NO')
"NODE [",
myrank,
"] "
305 WRITE (output_unit,
'(A)') trim(msg)
324 CHARACTER(LEN=*),
INTENT(IN) :: modproc
325 CHARACTER(LEN=*),
INTENT(IN) :: msg
326 INTEGER,
OPTIONAL,
INTENT(IN) :: rank
328 CALL info(this,
"WARNING in " // trim(modproc) //
": " // trim(msg),&
329 rank,node_info=.true.,tostderr=.true.)
338 SUBROUTINE error(this,modproc,msg,rank,node_info)
342 CHARACTER(LEN=*),
INTENT(IN) :: modproc
343 CHARACTER(LEN=*),
INTENT(IN) :: msg
344 INTEGER,
OPTIONAL,
INTENT(IN) :: rank
345 LOGICAL,
OPTIONAL,
INTENT(IN) :: node_info
351 CALL info(this,
"ERROR in " // trim(modproc) //
": " // trim(msg),&
352 rank=rank,node_info=node_info,tostderr=.true.)
355 CALL mpi_abort(mpi_comm_world,1,ierr)
character(len=1), save prefix
preceds info output
real, save nan_default_real
NaN real constant.
integer, target, save ppnum
MPI number of processes.
subroutine info(this, msg, rank, node_info, tostderr)
Print information on standard output.
real, parameter dummy
check default real type
subroutine finalize(this)
Destructor of logging_base class.
integer, save default_mpi_real
default real type for MPI
pure integer function getnumprocs(this)
Get the total number of MPI processes.
integer, parameter stdout
fortran stdout unit
integer, save default_mpi_complex
default real type for MPI
pure integer function gettype(this)
Get the module type number.
pure character(len=32) function getname(this)
Get the module name.
subroutine initlogging(this, t, n)
Constructor of the base class.
subroutine error(this, modproc, msg, rank, node_info)
Print error message on standard error and terminate the program.
pure integer function getrank(this)
Get the MPI rank.
subroutine warning(this, modproc, msg, rank)
Print warning message on standard error.
subroutine setprefix(val)
Set character preceding the info output.
logical, target, save parinit
MPI initialization status.
pure logical function initialized(this)
Query initialization status.
integer, target, save myrank
MPI rank.
integer, save default_mpi_2real
default 2real type for MPI
integer, parameter stderr
fortran stderr unit