G.1.8 Get Value Mathematic_Vector Functions

The main documentation of the Get Value Mathematic_Vector Functions contains additional explanation of this code listing.

```  define([REAL_ACCESS_ROUTINE],[
pushdef([VALUE], [\$1])
pushdef([Get_REAL_VALUE_MV], expand(Get_VALUE_MV))
pushdef([VALUE_is_Updated], expand(VALUE_is_Updated))

function Get_REAL_VALUE_MV (MV) result(VALUE)

! Input/Output variables.

! Mathematic_Vector object.
type(Mathematic_Vector_type), intent(inout) :: MV

! Output variables.

type(real) :: VALUE             ! Mathematic_Vector value to be output.

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

! Verify requirements.

VERIFY(Valid_State(MV),5)       ! Mathematic_Vector is valid.

! Set value.

if (MV%VALUE_is_Updated) then
VALUE = MV%VALUE
else
ifelse(
VALUE, [Average],
[VALUE = Global_Sum(MV%Values)/Length_Total(MV%Structure)],
VALUE, [Infinity_Norm],
[VALUE = Global_MaxVal(ABS(MV%Values))],
VALUE, [Maximum],
[VALUE = Global_MaxVal(MV%Values)],
VALUE, [Minimum],
[VALUE = Global_MinVal(MV%Values)],
VALUE, [One_Norm],
[VALUE = Global_Sum(ABS(MV%Values))],
VALUE, [Sum],
[VALUE = Global_Sum(MV%Values)],
VALUE, [Two_Norm],
[VALUE = SQRT(Global_Sum(MV%Values**2))],
[])
MV%VALUE_is_Updated = .true.
MV%VALUE = VALUE
end if

! Verify guarantees - none.

return
end function Get_REAL_VALUE_MV

popdef([VALUE])
popdef([Get_REAL_VALUE_MV])
popdef([VALUE_is_Updated])
])

fortext([Value],
[Average Infinity_Norm Maximum Minimum One_Norm Sum Two_Norm],[
REAL_ACCESS_ROUTINE(Value)
])

define([INTEGER_ACCESS_ROUTINE],[
pushdef([VALUE], [\$1])
pushdef([VALUE_Result], expand(VALUE_Result))
pushdef([Get_INTEGER_VALUE_MV], expand(Get_VALUE_MV))

function Get_INTEGER_VALUE_MV (MV) result(VALUE_Result)

! Input/Output variables.

! Mathematic_Vector object.
type(Mathematic_Vector_type), intent(inout) :: MV

! Output variables.

type(integer) :: VALUE_Result   ! Mathematic_Vector value to be output.

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

! Verify requirements.

VERIFY(Valid_State(MV),5)       ! Mathematic_Vector is valid.

! Set value.

ifelse(
VALUE, [First_PE],
[VALUE_Result = First_PE(MV%Structure)],
VALUE, [Last_PE],
[VALUE_Result = Last_PE(MV%Structure)],
VALUE, [Length_PE],
[VALUE_Result = Length_PE(MV%Structure)],
VALUE, [Length_Total],
[VALUE_Result = Length_Total(MV%Structure)],
[])

! Verify guarantees - none.

return
end function Get_INTEGER_VALUE_MV

popdef([VALUE])
popdef([VALUE_Result])
popdef([Get_INTEGER_VALUE_MV])
])

fortext([Value],
[First_PE Last_PE Length_PE Length_Total],[
INTEGER_ACCESS_ROUTINE(Value)
])

function Get_Locus_MV (MV) result(Locus_MV)

! Input variables.

! Mathematic_Vector object.
type(Mathematic_Vector_type), intent(in) :: MV

! Output variables.

! Mathematic_Vector value to be output.
type(character,name_length) :: Locus_MV

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

! Verify requirements.

VERIFY(Valid_State(MV),5)       ! Mathematic_Vector is valid.

! Set value.

Locus_MV = Locus(MV%Structure)

! Verify guarantees - none.

return
end function Get_Locus_MV

function Get_Name_MV (MV) result(Name)

! Input variables.

! Mathematic_Vector object.
type(Mathematic_Vector_type), intent(in) :: MV

! Output variables.

! Mathematic_Vector value to be output.
type(character,name_length) :: Name

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

! Verify requirements.

VERIFY(Valid_State(MV),5)       ! Mathematic_Vector is valid.

! Set value.

Name = MV%Name

! Verify guarantees - none.

return
end function Get_Name_MV

function Get_P_Norm_MV (MV, P) result(P_Norm)

! Use association information.

use Caesar_Numbers_Module, only: one

! Input variables.

type(integer), optional, intent(in) :: P    ! P_Norm exponent.

! Input/Output variables.

! Mathematic_Vector object.
type(Mathematic_Vector_type), intent(inout) :: MV

! Output variables.

type(real) :: P_Norm            ! Mathematic_Vector value to be output.

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

! Verify requirements.

VERIFY(Valid_State(MV),5)       ! Mathematic_Vector is valid.

! Set value.

if (MV%P_Norm_is_Updated .and. P==MV%P_Norm_Exponent) then
P_Norm = MV%P_Norm
else
P_Norm = (Global_Sum(ABS(MV%Values)**P))**(one/P)
MV%P_Norm_is_Updated = .true.
MV%P_Norm = P_Norm
MV%P_Norm_Exponent = P
end if

! Verify guarantees - none.

return
end function Get_P_Norm_MV
```

Michael L. Hall