E.2.5 Add_Value_Statistics Procedure

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

  subroutine Add_Value_Statistics (Statistics, Value)

    ! Use association information.

    use Caesar_Numbers_Module, only: one, zero

    ! Input variables.

    type(real), intent(in) :: Value       ! Value to be added.

    ! Input/Output variables.

    type(Statistics_type), intent(inout) :: Statistics ! Statistics object.

    ! Internal variables.

    type(real) :: N       ! Real version of PE_Count.

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

    ! Verify requirements.

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

    ! Global stats now out of date.

    Statistics%Global_Updated = .false.

    ! Increment sums and count.

    Statistics%PE_Count = Statistics%PE_Count + 1
    Statistics%PE_Sum = Statistics%PE_Sum + Value
    if (Value > zero) then
      Statistics%PE_Log_Sum = Statistics%PE_Log_Sum + LOG(Value)
      Statistics%PE_Reciprocal_Sum = Statistics%PE_Reciprocal_Sum + one/Value
    else
      Statistics%PE_Totally_Positive = .false.
    end if
    Statistics%PE_Squared_Sum = Statistics%PE_Squared_Sum + Value**2

    ! Update statistics.

    N = changetype(real,Statistics%PE_Count)
    Statistics%PE_Arithmetic_Mean = Statistics%PE_Sum / N
    if (Statistics%PE_Totally_Positive) then
      Statistics%PE_Geometric_Mean = EXP(Statistics%PE_Log_Sum / N)
      Statistics%PE_Harmonic_Mean = N / Statistics%PE_Reciprocal_Sum
    end if
    if (Statistics%PE_Count > 1) then
      Statistics%PE_Standard_Deviation = &
        SQRT( (Statistics%PE_Squared_Sum &
        - N * Statistics%PE_Arithmetic_Mean**2) &
        / (N - one) )
    end if

    ! Update extrema.

    if (Statistics%PE_Count > 1) then
      Statistics%PE_Maximum = MAX(Statistics%PE_Maximum, Value)
      Statistics%PE_Minimum = MIN(Statistics%PE_Minimum, Value)
    else
      Statistics%PE_Maximum = Value
      Statistics%PE_Minimum = Value
    end if

    ! Verify guarantees.

    VERIFY(Valid_State(Statistics),5)        ! Statistics is valid.
    ! Means are correct.
    VERIFY(VeryClose(Statistics%PE_Arithmetic_Mean,Statistics%PE_Sum/N),5)  
    if (Statistics%PE_Totally_Positive) then
      VERIFY(VeryClose(Statistics%PE_Geometric_Mean, dnl
        EXP(Statistics%PE_Log_Sum/N)),5)  
      VERIFY(VeryClose(Statistics%PE_Harmonic_Mean, dnl
        N/Statistics%PE_Reciprocal_Sum),5)  
    end if

    return
  end subroutine Add_Value_Statistics



Michael L. Hall