The main documentation of the Get Value ELL_Matrix Functions contains additional explanation of this code listing.
define([REAL_ACCESS_ROUTINE],[ pushdef([VALUE], [$1]) pushdef([Get_REAL_VALUE_ELLM], expand(Get_VALUE_ELLM)) ifelse( VALUE, [Two_Norm_Estimate], [pushdef([VALUE_is_Updated], Two_Norm_is_Updated)], VALUE, [Two_Norm_Range], [pushdef([VALUE_is_Updated], Two_Norm_is_Updated)], [pushdef([VALUE_is_Updated], expand(VALUE_is_Updated))]) function Get_REAL_VALUE_ELLM (ELLM) result(VALUE) ! Use association information. ifelse(VALUE, [Two_Norm_Estimate], [ use Caesar_Numbers_Module, only: half ]) ! Input/Output variables. ! ELL_Matrix object. type(ELL_Matrix_type), intent(inout) :: ELLM ! Output variables. ifelse( VALUE, [Two_Norm_Range], [type(real), dimension(2) :: VALUE ! ELL_Matrix value to be output.], [type(real) :: VALUE ! ELL_Matrix value to be output.]) ! Internal variables. ifelse( VALUE, [One_Norm], [type(real,1) :: Column_Sums ! Column sum temporary. ], VALUE, [Two_Norm_Estimate], [type(real), dimension(2) :: TNRange ! Two Norm temporary. ], VALUE, [Two_Norm_Range], [type(real) :: N ! Matrix row dimension. type(real) :: M ! Matrix column dimension. ], []) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(ELLM),5) ! ELL_Matrix is valid. ! Set value. if (ELLM%VALUE_is_Updated) then VALUE = ELLM%VALUE else ifelse( VALUE, [Average], [VALUE = Global_Sum(ELLM%Values) / & Length_Total(ELLM%Row_Structure) / & Length_Total(ELLM%Column_Structure) ], VALUE, [Frobenius_Norm], [VALUE = SQRT(Global_Sum(ELLM%Values**2))], VALUE, [Infinity_Norm], [VALUE = Global_MaxVal(SUM(ABS(ELLM%Values),2))], VALUE, [Maximum], [VALUE = Global_MaxVal(ELLM%Values)], VALUE, [Minimum], [VALUE = Global_MinVal(ELLM%Values)], VALUE, [One_Norm], [call Initialize (Column_Sums, Length_PE(ELLM%Column_Structure)) call Scatter_SUM (Column_Sums, ABS(ELLM%Values), ELLM%Columns) VALUE = Global_MaxVal(Column_Sums) call Finalize (Column_Sums)], VALUE, [Two_Norm_Estimate], [TNRange = Two_Norm_Range(ELLM) VALUE = half * (TNRange(1) + TNRange(2))], VALUE, [Two_Norm_Range], [N = changetype(real, Length_Total(ELLM%Row_Structure)) M = changetype(real, Length_Total(ELLM%Column_Structure)) VALUE[](1) = MAX(Frobenius_Norm(ELLM)/SQRT(N), & Maximum(ELLM), & Infinity_Norm(ELLM)/SQRT(N), & One_Norm(ELLM)/SQRT(M)) VALUE[](2) = MIN(Frobenius_Norm(ELLM), & SQRT(M*N)*Maximum(ELLM), & SQRT(M)*Infinity_Norm(ELLM), & SQRT(N)*One_Norm(ELLM), & SQRT(One_Norm(ELLM)*Infinity_Norm(ELLM)))], VALUE, [Sum], [VALUE = Global_Sum(ELLM%Values)], []) ELLM%VALUE_is_Updated = .true. ELLM%VALUE = VALUE end if ! Verify guarantees - none. return end function Get_REAL_VALUE_ELLM popdef([VALUE]) popdef([Get_REAL_VALUE_ELLM]) popdef([VALUE_is_Updated]) ]) fortext([Value], [Average Frobenius_Norm Infinity_Norm Maximum Minimum One_Norm Sum Two_Norm_Estimate Two_Norm_Range],[ REAL_ACCESS_ROUTINE(Value) ]) define([INTEGER_ACCESS_ROUTINE],[ pushdef([VALUE], [$1]) pushdef([VALUE_Result], expand(VALUE_Result)) pushdef([Get_INTEGER_VALUE_ELLM], expand(Get_VALUE_ELLM)) function Get_INTEGER_VALUE_ELLM (ELLM) result(VALUE_Result) ! Input/Output variables. ! ELL_Matrix object. type(ELL_Matrix_type), intent(in) :: ELLM ! Output variables. type(integer) :: VALUE_Result ! ELL_Matrix value to be output. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(ELLM),5) ! ELL_Matrix is valid. ! Set value. ifelse( VALUE, [First_Row_PE], [VALUE_Result = First_PE(ELLM%Row_Structure)], VALUE, [Last_Row_PE], [VALUE_Result = Last_PE(ELLM%Row_Structure)], VALUE, [Max_Nonzeros], [VALUE_Result = ELLM%Max_Nonzeros], VALUE, [NColumns], [VALUE_Result = Length_Total(ELLM%Column_Structure)], VALUE, [NRows_PE], [VALUE_Result = Length_PE(ELLM%Row_Structure)], VALUE, [NRows_Total], [VALUE_Result = Length_Total(ELLM%Row_Structure)], []) ! Verify guarantees - none. return end function Get_INTEGER_VALUE_ELLM popdef([VALUE]) popdef([VALUE_Result]) popdef([Get_INTEGER_VALUE_ELLM]) ]) fortext([Value], [First_Row_PE Last_Row_PE Max_Nonzeros NColumns NRows_PE NRows_Total],[ INTEGER_ACCESS_ROUTINE(Value) ]) function Get_Name_ELLM (ELLM) result(Name) ! Input variables. ! ELL_Matrix object. type(ELL_Matrix_type), intent(in) :: ELLM ! Output variables. type(character,80) :: Name ! ELL_Matrix value to be output. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(ELLM),5) ! ELL_Matrix is valid. ! Set value. Name = ELLM%Name ! Verify guarantees - none. return end function Get_Name_ELLM