37 use,
intrinsic :: iso_fortran_env, only : stdout => output_unit, &
51 integer,
private :: indent_
52 integer,
private :: section_id_
53 integer,
private :: tab_size_
54 integer,
private :: level_
55 integer,
private :: unit_
57 character(len=LOG_SIZE),
private :: section_header =
""
74 procedure,
private, pass(this) :: print_section_header => &
98 class(
log_t),
intent(inout) :: this
99 character(len=255) :: log_level
100 character(len=255) :: log_tab_size
101 character(len=255) :: log_file
102 integer :: envvar_len
107 call get_environment_variable(
"NEKO_LOG_TAB_SIZE", log_tab_size, envvar_len)
108 if (envvar_len .gt. 0)
then
109 read(log_tab_size(1:envvar_len), *) this%tab_size_
114 call get_environment_variable(
"NEKO_LOG_LEVEL", log_level, envvar_len)
115 if (envvar_len .gt. 0)
then
116 read(log_level(1:envvar_len), *) this%level_
121 call get_environment_variable(
"NEKO_LOG_FILE", log_file, envvar_len)
122 if (envvar_len .gt. 0)
then
123 open(newunit = this%unit_,
file = trim(log_file), status =
'replace', &
133 class(
log_t),
intent(inout) :: this
135 if (this%section_id_ .ne. 0)
then
139 if (this%unit_ .ne. stdout)
then
155 class(
log_t),
intent(inout) :: this
158 this%section_id_ = this%section_id_ + 1
159 this%indent_ = this%indent_ + this%tab_size_
166 class(
log_t),
intent(inout) :: this
169 if (this%section_id_ .eq. 0)
then
172 this%section_id_ = this%section_id_ - 1
173 this%indent_ = this%indent_ - this%tab_size_
176 this%section_header =
""
182 class(
log_t),
intent(in) :: this
185 write(this%unit_,
'(A)', advance =
'no') repeat(
' ', this%indent_)
192 class(
log_t),
intent(in) :: this
193 integer,
optional :: lvl
197 if (
present(lvl))
then
203 if (lvl_ .gt. this%level_)
then
208 write(this%unit_,
'(A)')
''
215 class(
log_t),
intent(inout) :: this
216 character(len=*),
intent(in) :: msg
217 integer,
optional :: lvl
220 if (
present(lvl))
then
226 if (lvl_ .gt. this%level_)
then
230 if (len_trim(this%section_header) .gt. 0)
then
231 call this%print_section_header(lvl)
236 write(this%unit_,
'(A)') trim(msg)
243 class(
log_t),
intent(in) :: this
244 character(len=*),
intent(in) :: version
245 character(len=*),
intent(in) :: build_info
248 write(this%unit_,
'(A)')
''
249 write(this%unit_,
'(1X,A)')
' _ __ ____ __ __ ____ '
250 write(this%unit_,
'(1X,A)')
' / |/ / / __/ / //_/ / __ \ '
251 write(this%unit_,
'(1X,A)')
' / / / _/ / ,< / /_/ / '
252 write(this%unit_,
'(1X,A)')
'/_/|_/ /___/ /_/|_| \____/ '
253 write(this%unit_,
'(A)')
''
254 write(this%unit_,
'(1X,A,A,A)')
'(version: ', trim(version),
')'
255 write(this%unit_,
'(1X,A)') trim(build_info)
256 write(this%unit_,
'(A)')
''
263 class(
log_t),
intent(in) :: this
264 character(len=*),
intent(in) :: msg
268 write(stderr,
'(A,A,A)')
'*** ERROR: ', trim(msg),
' ***'
275 class(
log_t),
intent(in) :: this
276 character(len=*),
intent(in) :: msg
280 write(this%unit_,
'(A,A,A)')
'*** WARNING: ', trim(msg),
' ***'
290 class(
log_t),
intent(inout) :: this
291 character(len=*),
intent(in) :: feature
292 character(len=*),
intent(in),
optional :: removal_version
293 character(len=*),
intent(in),
optional :: extra_info
294 character(len=LOG_SIZE) :: msg
295 character(len=50),
dimension(:),
allocatable :: deprecated_list_local
301 allocate(
character(len=50) :: deprecated_list(1))
302 deprecated_list = trim(feature)
305 do i = 1,
size(deprecated_list)
306 if (trim(deprecated_list(i)) .eq. trim(feature))
return
310 call move_alloc(deprecated_list, deprecated_list_local)
311 allocate(
character(len=50)::deprecated_list(size(deprecated_list_local)+1))
312 deprecated_list(1:
size(deprecated_list_local)) = deprecated_list_local
313 deprecated_list(
size(deprecated_list_local) + 1) = trim(feature)
314 deallocate(deprecated_list_local)
318 write(msg,
'(A,A)')
'*** DEPRECATION: ', trim(feature)
319 call this%message(msg)
320 write(msg,
'(A,A,A)')
'The feature "', trim(feature), &
322 call this%message(msg)
324 if (
present(removal_version))
then
325 write(msg,
'(A,A,A)')
'It will be removed in version ', &
326 trim(removal_version),
'.'
327 call this%message(msg)
330 if (
present(extra_info))
then
331 call this%message(extra_info)
334 call this%message(
'***')
337 call neko_error(
'Deprecated feature used: ' // trim(feature))
344 class(
log_t),
intent(inout) :: this
345 character(len=*),
intent(in) :: msg
346 integer,
optional :: lvl
350 if (len_trim(this%section_header) .gt. 0)
then
351 call this%print_section_header(lvl)
357 pre = (30 - len_trim(msg)) / 2
358 pos = 30 - (len_trim(msg) + pre)
360 if (pre .lt. 0 .or. pos .lt. 0)
then
363 write(this%section_header,
'(A,A,A)') &
367 write(this%section_header,
'(A,A,A)') &
368 repeat(
'-', pre), trim(msg), repeat(
'-', pos)
376 class(
log_t),
intent(inout) :: this
377 integer,
optional :: lvl
380 if (
present(lvl))
then
386 if (lvl_ .gt. this%level_)
then
391 call this%newline(lvl)
393 write(this%unit_,
'(A)') trim(this%section_header)
394 this%section_header =
""
401 class(
log_t),
intent(inout) :: this
402 character(len=*),
intent(in),
optional :: msg
403 integer,
optional :: lvl
405 if (
present(msg))
then
406 call this%message(msg, lvl)
420 use,
intrinsic :: iso_c_binding
421 character(kind=c_char),
dimension(*),
intent(in) :: c_msg
422 character(len=LOG_SIZE) :: msg
428 if (c_msg(len+1) .eq. c_null_char)
exit
430 msg(len:len) = c_msg(len)
433 call neko_log%message(trim(msg(1:len)))
441 use,
intrinsic :: iso_c_binding
442 character(kind=c_char),
dimension(*),
intent(in) :: c_msg
443 character(len=LOG_SIZE) :: msg
449 if (c_msg(len+1) .eq. c_null_char)
exit
451 msg(len:len) = c_msg(len)
455 write(stderr,
'(A,A,A)')
'*** ERROR: ', trim(msg(1:len)),
' ***'
463 use,
intrinsic :: iso_c_binding
464 character(kind=c_char),
dimension(*),
intent(in) :: c_msg
465 character(len=LOG_SIZE) :: msg
471 if (c_msg(len+1) .eq. c_null_char)
exit
473 msg(len:len) = c_msg(len)
478 '*** WARNING: ', trim(msg(1:len)),
' ***'
486 use,
intrinsic :: iso_c_binding
487 character(kind=c_char),
dimension(*),
intent(in) :: c_msg
488 character(len=LOG_SIZE) :: msg
494 if (c_msg(len+1) .eq. c_null_char)
exit
496 msg(len:len) = c_msg(len)
499 call neko_log%section(trim(msg(1:len)))
integer, public pe_rank
MPI rank.
Module for file I/O operations.
subroutine log_end_section_c()
End a log section (from C)
subroutine log_end(this)
Decrease indention level.
subroutine log_print_section_header(this, lvl)
Print a section header.
subroutine log_deprecated(this, feature, removal_version, extra_info)
Write a deprecation warning to a log.
subroutine log_header(this, version, build_info)
Write the Neko header to a log.
integer, parameter, public neko_log_verbose
Verbose log level.
subroutine log_message(this, msg, lvl)
Write a message to a log.
integer, parameter, public neko_log_quiet
Always logged.
subroutine log_begin(this)
Increase indention level.
subroutine log_message_c(c_msg)
Write a message to a log (from C)
subroutine log_end_section(this, msg, lvl)
End a log section.
subroutine log_init(this)
Initialize a log.
subroutine log_warning(this, msg)
Write a warning message to a log.
character(len=50), dimension(:), allocatable deprecated_list
List of already logged deprecated features.
subroutine log_error_c(c_msg)
Write an error message to a log (from C)
subroutine log_indent(this)
Indent a log.
subroutine log_warning_c(c_msg)
Write a warning message to a log (from C)
subroutine log_newline(this, lvl)
Write a new line to a log.
integer, parameter, public sec_head_size
Length of the section header.
integer, parameter, public neko_log_deprecation_error
Deprecation error level.
subroutine log_section_c(c_msg)
Begin a new log section (from C)
integer, parameter, public neko_log_debug
Debug log level.
type(log_t), public neko_log
Global log stream.
integer, parameter, public log_size
integer, parameter, public neko_log_info
Default log level.
subroutine log_free(this)
Free a log.
subroutine log_section(this, msg, lvl)
Begin a new log section.
subroutine log_error(this, msg)
Write an error message to a log.