logger_setup Subroutine

public subroutine logger_setup(logfile, nio, log_level, log_stdout, log_timestamp, close_old, iunit)

Wrapper to set up MPI if needed and initialize log files

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in), optional :: logfile

name of the dedicated LightKrylov logfile

integer, intent(in), optional :: nio

I/O rank for logging

integer, intent(in), optional :: log_level

set logging level 0 : all_level 10 : debug_level 20 : information_level 30 : warning_level 40 : error_level 100 : none_level

logical, intent(in), optional :: log_stdout

duplicate log messages to stdout?

logical, intent(in), optional :: log_timestamp

add timestamp to log messages

logical, intent(in), optional :: close_old

close previously opened logfiles (if present?) - stdout is not closed

integer, intent(out), optional :: iunit

log unit identifier


Source Code

   subroutine logger_setup(logfile, nio, log_level, log_stdout, log_timestamp, close_old, iunit)
      !! Wrapper to set up MPI if needed and initialize log files
      character(len=*), optional, intent(in) :: logfile
      !! name of the dedicated LightKrylov logfile
      integer, optional, intent(in)          :: nio
      !! I/O rank for logging
      integer, optional, intent(in)          :: log_level
      !! set logging level
      !! 0   : all_level
      !! 10  : debug_level
      !! 20  : information_level
      !! 30  : warning_level
      !! 40  : error_level
      !! 100 : none_level
      logical, optional, intent(in)          :: log_stdout
      !! duplicate log messages to stdout?
      logical, optional, intent(in)          :: log_timestamp
      !! add timestamp to log messages
      logical, optional, intent(in)          :: close_old
      !! close previously opened logfiles (if present?) - stdout is not closed
      integer, optional, intent(out)         :: iunit
      !! log unit identifier

      ! internals
      character(len=:), allocatable :: logfile_
      integer                       :: nio_
      integer                       :: log_level_
      logical                       :: log_stdout_
      logical                       :: log_timestamp_
      logical                       :: close_old_
      integer                       :: iunit_
      ! misc
      integer :: stat

      logfile_ = optval(logfile, 'lightkrylov.log')
      nio_ = optval(nio, 0)
      log_level_ = optval(log_level, 20)
      log_level_ = max(0, min(log_level_, 100))
      log_stdout_ = optval(log_stdout, .true.)
      log_timestamp_ = optval(log_timestamp, .true.)
      close_old_ = optval(close_old, .true.)

      ! Flush log units
      if (close_old_) call reset_log_units()

      ! set log level
      call logger%configure(level=log_level_, time_stamp=log_timestamp_)

      ! set up LightKrylov log file
      call logger%add_log_file(logfile_, unit=iunit_, stat=stat)
      if (stat /= 0) call stop_error('Unable to open logfile '//trim(logfile_)//'.', module=this_module, procedure='logger_setup')

      ! Set up comms
      call comm_setup()

      ! Set I/O rank
      if (nio_ /= 0) call set_io_rank(nio_)

      ! log to stdout
      if (log_stdout_) then
         call logger%add_log_unit(unit=6, stat=stat)
         if (stat /= 0) call stop_error('Unable to add stdout to logger.', module=this_module, procedure='logger_setup')
      end if

      ! mark that logger is active
      logger_is_active = .true.

      ! return unit if requested
      if (present(iunit)) iunit = iunit_
      return
   end subroutine logger_setup