tem_logging_init_logger Subroutine

private subroutine tem_logging_init_logger(me, level, rank, filename, root_only, real_form, int_form)

Initialize a logging data type.

Todo

this should move to a proper place and have a proper format!

Arguments

Type IntentOptional Attributes Name
type(tem_logging_type), intent(out) :: me

Logger to initialize

integer, intent(in) :: level

Level of output to log with this logger

integer, intent(in) :: rank

Rank of the process executing the initialization.

character(len=*), intent(in), optional :: filename

File to write output to, default is null device.

If this is empty or not provided, the output will be to the null device. To send messages to the stdout set this parameter to '/stdout:'.

logical, intent(in), optional :: root_only

Indicate if root only should write messages Default is true.

character(len=*), intent(in), optional :: real_form

Format to write real numbers. Default is 'EN12.3'

character(len=*), intent(in), optional :: int_form

Format to write integer numbers. Default is 'I0'


Calls

proc~~tem_logging_init_logger~~CallsGraph proc~tem_logging_init_logger tem_logging_init_logger proc~newunit newunit proc~tem_logging_init_logger->proc~newunit proc~tem_connect_tonull tem_connect_toNull proc~tem_logging_init_logger->proc~tem_connect_tonull proc~tem_connect_tonull->proc~newunit

Called by

proc~~tem_logging_init_logger~~CalledByGraph proc~tem_logging_init_logger tem_logging_init_logger interface~tem_logging_init tem_logging_init interface~tem_logging_init->proc~tem_logging_init_logger proc~tem_logging_init_primary tem_logging_init_primary interface~tem_logging_init->proc~tem_logging_init_primary proc~tem_logging_init_primary->proc~tem_logging_init_logger proc~tem_logging_load tem_logging_load proc~tem_logging_load->proc~tem_logging_init_logger proc~tem_logging_load->proc~tem_logging_init_primary proc~tem_load_debug tem_load_debug proc~tem_load_debug->interface~tem_logging_init proc~tem_load_debug->proc~tem_logging_load proc~tem_logging_load_primary tem_logging_load_primary proc~tem_logging_load_primary->proc~tem_logging_init_primary proc~tem_logging_load_primary->proc~tem_logging_load proc~tem_debug_load_main tem_debug_load_main proc~tem_debug_load_main->proc~tem_load_debug

Source Code

  subroutine tem_logging_init_logger( me, level, rank, filename, root_only,    &
    &                                 real_form, int_form )
    ! ---------------------------------------------------------------------------
    !> Logger to initialize
    type(tem_logging_type), intent(out) :: me
    !> Level of output to log with this logger
    integer, intent(in) :: level
    !> Rank of the process executing the initialization.
    integer, intent(in) :: rank

    !> File to write output to, default is null device.
    !!
    !! If this is empty or not provided, the output will be to the
    !! null device.
    !! To send messages to the stdout set this parameter to
    !! '/stdout:'.
    character(len=*), optional, intent(in) :: filename

    !> Indicate if root only should write messages
    !! Default is true.
    logical,          optional, intent(in) :: root_only

    !> Format to write real numbers.
    !! Default is 'EN12.3'
    character(len=*), optional, intent(in) :: real_form

    !> Format to write integer numbers.
    !! Default is 'I0'
    character(len=*), optional, intent(in) :: int_form
    ! ---------------------------------------------------------------------------
    logical :: root_out
    character(len=7) :: rankstamp
    character(len=pathLen) :: fname
    logical             :: nUnitOpened
    integer             :: UnitNumber
    logical             :: file_exists
    ! ---------------------------------------------------------------------------

    me%log_level = level

    if (present(root_only)) then
      root_out = root_only
    else
      root_out = .true.
    end if

    if (root_out) then
      me%participating = (rank == 0)
    else
      me%participating = .true.
    end if

    if (present(filename)) then
      if (trim(filename) == '/stdout:') then
        ! Only root should write to stdout.
        root_out = .true.
        if (rank == 0) then
          fname = filename
          me%participating = .true.
        else
          fname = ''
          me%participating = .false.
        end if
      else
        fname = trim(filename)
      end if
    else
      fname = ''
    end if

    if (me%participating .and. (trim(adjustl(fname)) /= '')) then
      ! If I am participating and the filename is not actually empty,
      ! proceed connecting to appropriate external files.
      if (trim(adjustl(fname)) == '/stdout:') then
        ! Messages should be written to the standard output.
        me%funit(0) = stdOutUnit
      else
        ! Messages should be written to some file.
        if (root_out) then
          rankstamp = ''
        else
          write(rankstamp, '(a1,I6.6)') '.', rank
        end if
        ! changes for dynamic load balancing
        ! check if the file exists
        inquire( file  = trim(fname)//trim(rankstamp),                         &
          &      exist = file_exists )
        if( file_exists )then
          ! in case the file exists, check wether it is already opened somewhere
          ! else (dyn load balancing)
          inquire( file   = trim(fname)//trim(rankstamp),                      &
            &      opened = nUnitOpened,                                       &
            &      number = UnitNumber )
          if (nUNitOpened) then
            me%funit(0) = UnitNumber
          else
            me%funit(0) = newunit()
            open( unit     = me%funit(0),                                      &
              &   file     = trim(fname)//trim(rankstamp),                     &
              &   position = 'APPEND',                                         &
              &   status   = 'OLD' )
          end if
        else
          me%funit(0) = newunit()
          open( unit     = me%funit(0),                                        &
            &   file     = trim(fname)//trim(rankstamp),                       &
            &   status   = 'REPLACE' )
        end if
      end if
    else
      ! Output should be deactivated for this logger.
      ! Connect its unit to the null device.
      call tem_connect_toNull(me%funit(0))
    end if

    ! Always connect the last logging unit to the null device.
    call tem_connect_toNull(me%funit(tem_last_lu))

    ! Set all units according to the configured logging level:
    me%funit(1:level) = me%funit(0)
    me%funit(level+1:tem_last_lu-1) = me%funit(tem_last_lu)

    if (present(real_form)) then
      me%real_form = real_form
    else
      me%real_form = 'EN12.3'
    end if

    if (present(int_form)) then
      me%int_form = int_form
    else
      me%int_form = 'I0'
    end if

    !! @todo: this should move to a proper place and have a proper format!
    !if (present(root_only)) then
    !  write(me%fUnit(0),*) 'rank= ', rank, 'filename= ', trim(filename), &
    !    &                                'root_only= ', root_only
    !end if
    !write(me%fUnit(0),*) rank, root_out, 'log unit ', me%fUnit

  end subroutine tem_logging_init_logger