G.2.1 Initialize_ELL_Matrix Procedure

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

  subroutine Initialize_ELL_Matrix (ELLM, Max_Nonzeros, Row_Structure, &
                                    Column_Structure, Name, status)

    ! Use association information.

    use Caesar_Flags_Module, only: initialized_flag
    use Caesar_Numbers_Module, only: zero

    ! Input variables.

    type(integer) :: Max_Nonzeros   ! Maximum number of nonzero elements/row.
    ! Row and Column Base_Structures.
    type(Base_Structure_type), intent(in), target :: Row_Structure, &
                                                     Column_Structure
    type(character,*), intent(in), optional :: Name     ! Variable name.

    ! Output variables.

    ! ELL_Matrix to be initialized.
    type(ELL_Matrix_type), intent(out) :: ELLM
    type(Status_type), intent(out), optional :: status  ! Exit status.

    ! Internal variables.

    type(Status_type), dimension(20) :: allocate_status ! Allocation Status.
    type(Status_type) :: consolidated_status            ! Consolidated Status.

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

    ! Verify requirements.

    VERIFY(.not.Valid_State(ELLM),5)         ! ELL_Matrix is not valid.
    VERIFY(Valid_State(Row_Structure),5)     ! Row Structure is valid.
    VERIFY(Valid_State(Column_Structure),5)  ! Column Structure is valid.
    ! Max_Nonzeros is reasonable.
    VERIFY(Max_Nonzeros .InInterval. (/1,Length_Total(Column_Structure)/),5)

    ! Set up structure pointers.

    ELLM%Row_Structure => Row_Structure
    ELLM%Column_Structure => Column_Structure

    ! Allocations and initializations.

    call Initialize (allocate_status)
    call Initialize (consolidated_status)
    call Initialize (ELLM%Values, Length_PE(Row_Structure), Max_Nonzeros, &
                     allocate_status(1))
    call Initialize (ELLM%Columns, Length_PE(Row_Structure), Max_Nonzeros, &
                     allocate_status(2))
    call Initialize (ELLM%Index, ELLM%Column_Structure, &
                     ELLM%Row_Structure, Many_of_One_Array=ELLM%Columns, &
                     status=allocate_status(3))

    ! Set up internals.

    if (PRESENT(Name)) ELLM%Name = Name
    ELLM%Max_Nonzeros = Max_Nonzeros
    call Initialize (ELLM%Average,                   allocate_status( 4))
    call Initialize (ELLM%Average_is_Updated,        allocate_status( 5))
    call Initialize (ELLM%Frobenius_Norm,            allocate_status( 6))
    call Initialize (ELLM%Frobenius_Norm_is_Updated, allocate_status( 7))
    call Initialize (ELLM%Index_is_Updated,          allocate_status( 8))
    call Initialize (ELLM%Infinity_Norm,             allocate_status( 9))
    call Initialize (ELLM%Infinity_Norm_is_Updated,  allocate_status(10))
    call Initialize (ELLM%Maximum,                   allocate_status(11))
    call Initialize (ELLM%Maximum_is_Updated,        allocate_status(12))
    call Initialize (ELLM%Minimum,                   allocate_status(13))
    call Initialize (ELLM%Minimum_is_Updated,        allocate_status(14))
    call Initialize (ELLM%One_Norm,                  allocate_status(15))
    call Initialize (ELLM%One_Norm_is_Updated,       allocate_status(16))
    call Initialize (ELLM%Sum,                       allocate_status(17))
    call Initialize (ELLM%Sum_is_Updated,            allocate_status(18))
    call Initialize (ELLM%Two_Norm_Estimate,         allocate_status(19))
    call Initialize (ELLM%Two_Norm_is_Updated,       allocate_status(20))

    ! Make sure that initial values are correct.

    ELLM%Average = zero
    ELLM%Average_is_Updated = .false.
    ELLM%Frobenius_Norm = zero
    ELLM%Frobenius_Norm_is_Updated = .false.
    ELLM%Index_is_Updated = .false.
    ELLM%Infinity_Norm = zero
    ELLM%Infinity_Norm_is_Updated = .false.
    ELLM%Maximum = zero
    ELLM%Maximum_is_Updated = .false.
    ELLM%Minimum = zero
    ELLM%Minimum_is_Updated = .false.
    ELLM%One_Norm = zero
    ELLM%One_Norm_is_Updated = .false.
    ELLM%Sum = zero
    ELLM%Sum_is_Updated = .false.
    ELLM%Two_Norm_Estimate = zero
    ELLM%Two_Norm_Range = (/ zero, zero /)
    ELLM%Two_Norm_is_Updated = .false.

    ! Process status variables.

    consolidated_status = allocate_status
    if (PRESENT(status)) then
      WARN_IF(Error(consolidated_status), 5)
      status = consolidated_status
    else
      VERIFY(Normal(consolidated_status), 5)
    end if
    call Finalize (consolidated_status)
    call Finalize (allocate_status)

    ! Set initialization flag.

    ELLM%Initialized = initialized_flag

    ! Verify guarantees.

    VERIFY(Valid_State(ELLM),5)     ! ELL_Matrix is now valid.

    return
  end subroutine Initialize_ELL_Matrix



Michael L. Hall