E.2.8 Update_Global_Statistics Procedure

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

  subroutine Update_Global_Statistics (Statistics)

    ! Use association information.

    use Caesar_Numbers_Module, only: one

    ! Input/Output variables.

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

    ! Internal variables.

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

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

    ! Verify requirements.

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

    ! Check to see if the update has already been done.

    if (Statistics%Global_Updated) return

    ! Increment sums and count.

    Statistics%Global_Count = Global_Sum(Statistics%PE_Count)
    Statistics%Global_Sum = Global_Sum(Statistics%PE_Sum)
    Statistics%Global_Log_Sum = Global_Sum(Statistics%PE_Log_Sum)
    Statistics%Global_Reciprocal_Sum = &
      Global_Sum(Statistics%PE_Reciprocal_Sum)
    Statistics%Global_Squared_Sum = &
      Global_Sum(Statistics%PE_Squared_Sum)
    Statistics%Global_Totally_Positive = &
      Global_ALL(Statistics%PE_Totally_Positive)

    ! Update statistics.

    N = changetype(real,Statistics%Global_Count)
    Statistics%Global_Arithmetic_Mean = Statistics%Global_Sum / N
    if (Statistics%Global_Totally_Positive) then
      Statistics%Global_Geometric_Mean = EXP(Statistics%Global_Log_Sum / N)
      Statistics%Global_Harmonic_Mean = N / Statistics%Global_Reciprocal_Sum
    end if
    if (Statistics%Global_Count > 1) then
      Statistics%Global_Standard_Deviation = &
        SQRT( (Statistics%Global_Squared_Sum &
        - N * Statistics%Global_Arithmetic_Mean**2) &
        / (N - one) )
    end if

    ! Update extrema.

    Statistics%Global_Maximum = Global_MaxVal(Statistics%PE_Maximum)
    Statistics%Global_Minimum = Global_MinVal(Statistics%PE_Minimum)

    ! Set update flag.

    Statistics%Global_Updated = .true.

    ! Verify guarantees.

    VERIFY(Valid_State(Statistics),5)        ! Statistics is valid.
    ! Means are correct.
    VERIFY(VeryClose(Statistics%Global_Arithmetic_Mean, dnl
      Statistics%Global_Sum/N),5)  
    if (Statistics%Global_Totally_Positive) then
      VERIFY(VeryClose(Statistics%Global_Geometric_Mean, dnl
        EXP(Statistics%Global_Log_Sum/N)),5)  
      VERIFY(VeryClose(Statistics%Global_Harmonic_Mean, dnl
        N/Statistics%Global_Reciprocal_Sum),5)  
    end if

    return
  end subroutine Update_Global_Statistics



Michael L. Hall