E.2.7 Output_Statistics Procedure

The main documentation of the Output_Statistics Procedure contains additional explanation of this code listing.

  subroutine Output_Statistics (Statistics, Global, Verbose, Unit)

    use Caesar_Numbers_Module, only: ten, zero

    ! Input variables.

    type(Statistics_type), intent(inout) :: Statistics ! Variable to be output.
    type(logical), intent(in), optional :: Global   ! Global flag.
    type(logical), intent(in), optional :: Verbose  ! Verbosity flag.
    type(integer), intent(in), optional :: Unit     ! Output unit.

    ! Internal variables.

    type(logical) :: A_Global                       ! Actual global flag.
    type(logical) :: A_Verbose                      ! Actual verbosity flag.
    type(integer) :: A_Unit                         ! Actual output unit.
    type(integer) :: Stat_Count                     ! Statistics count.
    type(real) :: Stat_Geometric_Mean               ! Statistics geom mean.
    type(real) :: Stat_Harmonic_Mean                ! Statistics harmonic mean.
    type(real) :: Stat_Maximum                      ! Statistics maximum.
    type(real) :: Stat_Mean                         ! Statistics mean.
    type(real) :: Stat_Minimum                      ! Statistics minimum.
    type(character,80) :: Stat_Name                 ! Statistics name.
    type(real) :: Stat_Standard_Deviation           ! Statistics std deviation.

    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ! Verify requirements.

    VERIFY(Valid_State(Statistics),5)               ! Statistics is valid.

    ! Set unit number.
    
    if (PRESENT(Unit)) then
      A_Unit = Unit
    else
      A_Unit = 6
    end if

    ! Set global flag.
    
    if (PRESENT(Global)) then
      A_Global = Global
    else
      A_Global = .false.
    end if

    ! Set verbosity flag.
    
    if (PRESENT(Verbose)) then
      A_Verbose = Verbose
    else
      A_Verbose = .false.
    end if

    ! Do a global update if called for.
    
    if (A_Global) then
      call Update_Global (Statistics)
    end if

    ! These are evaluated on all PEs -- NOT inside an IO PE block -- because
    ! they contain validity checks on Statistics and thus require global 
    ! communication.

    Stat_Count = Count(Statistics, A_Global)
    Stat_Name = Name(Statistics)
    Stat_Maximum = Maximum(Statistics, A_Global)
    Stat_Minimum = Minimum(Statistics, A_Global)
    Stat_Mean = Mean(Statistics, A_Global)
    Stat_Standard_Deviation = Standard_Deviation(Statistics, A_Global)
    if ((.not. A_Global .and. Statistics%PE_Totally_Positive) .or. &
        (A_Global .and. Statistics%Global_Totally_Positive)) then
      Stat_Geometric_Mean = Geometric_Mean(Statistics, A_Global)
      Stat_Harmonic_Mean = Harmonic_Mean(Statistics, A_Global)
    end if

    ! Output Statistics Info.

    if (this_is_IO_PE) then
      if (A_Verbose) then
        write (A_Unit,100) TRIM(Stat_Name), ':'
        if (A_Global) then
          write (A_Unit,101) '*Global values*'
        else
          write (A_Unit,101) '*Values for IO PE*'
        end if
        write (A_Unit,101) 'Number of values = ', Stat_Count
        write (A_Unit,102) &
          'Range            = [[', &
          Stat_Minimum, ',  ', &
          Stat_Maximum, ' ]]'
        if (Stat_Mean /= zero .and. &
            ABS(Stat_Standard_Deviation / Stat_Mean) <= ten) then
          write (A_Unit,103) &
            'Arithmetic Mean  = ', &
            Stat_Mean, ' +/- ', &
            Stat_Standard_Deviation, ' ( +/- ', &
            Stat_Standard_Deviation / &
            Stat_Mean * 100.d0, '% )' 
        else
          write (A_Unit,103) &
            'Arithmetic Mean  = ', &
            Stat_Mean, ' +/- ', &
            Stat_Standard_Deviation
        end if
        if ((.not. A_Global .and. Statistics%PE_Totally_Positive) .or. &
            (A_Global .and. Statistics%Global_Totally_Positive)) then
          write (A_Unit,103) &
            'Geometric Mean   = ', Stat_Geometric_Mean
          write (A_Unit,103) &
            'Harmonic Mean    = ', Stat_Harmonic_Mean
        end if
      else
        if (Stat_Mean /= zero .and. &
            ABS(Stat_Standard_Deviation / Stat_Mean) <= ten) then
          write (A_Unit,104) &
            TRIM(Stat_Name), ' = ', &
            Stat_Mean, ' +/- ', &
            Stat_Standard_Deviation, ' ( +/- ', &
            Stat_Standard_Deviation / &
            Stat_Mean * 100.d0, '% )' 
        else
          write (A_Unit,104) &
            TRIM(Stat_Name), ' = ', &
            Stat_Mean, ' +/- ', &
            Stat_Standard_Deviation
        end if
      end if
    end if

    ! Format statements.

100 format (a,a)
101 format (2x,a,i7)
102 format (2x,a,1pe14.7,a,1pe15.7,a)
103 format (2x,a,1pe15.7,:,a,1pe13.7,a,0pf8.4,a)
104 format (a,a,1pe15.7,a,1pe13.7,a,0pf7.4,a)

    ! Verify guarantees - none.

    return
  end subroutine Output_Statistics



Michael L. Hall