D.8.1 Initialize_Collected_Array Procedure

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

  subroutine Initialize_Collected_Array_1 (CA, OV, Name, status)

    ! Use associations.

    use Caesar_Flags_Module, only: initialized_flag

    ! Input variables.

    type(character,*), intent(in), optional :: Name     ! Variable name.
    type(Overlapped_Vector_type), intent(in) :: OV      ! OV for this CA.

    ! Output variables.

    ! Collected_Array to be initialized.
    type(Collected_Array_type), intent(inout) :: CA 
    type(Status_type), intent(out), optional :: status  ! Exit status.

    ! Internal variables.

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

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

    ! Verify requirements.

    VERIFY(Valid_State(OV),5)                    ! Overlapped Vector is valid.

    ! Set up pointers.

    CA%One_Structure => OV%One_Structure
    CA%Many_Structure => OV%Many_Structure
    CA%Many_of_One_Index => OV%Many_of_One_Index

    ! Set up internals.

    if (PRESENT(Name)) CA%Name = Name
    CA%Dimensionality = OV%Dimensionality
    CA%Version = OV%Version

    ! Allocations and initializations.

    call Initialize (allocate_status)
    call Initialize (consolidated_status)

    ! Set to maximum dimensionality of 5 to enable VERIFYs without if-checks.
    ! Also, this gets around problems with using the dimensionality when it
    ! is set to a negative number for a ragged right array.

    call Initialize (CA%Dimensions, 5, allocate_status(1))

    ! Set initial dimensions.

    CA%Dimensions(1:CA%Dimensionality-1) = OV%Dimensions(1:OV%Dimensionality-1) 

    ! Set One Axis size.

    CA%Dimensions(CA%Dimensionality) = Length_PE(CA%One_Structure)

    ! Set Many Axis size.

    if (CA%Many_of_One_Index%Dimensionality == 2) then
      CA%A_Dimensionality = CA%Dimensionality + 1
      CA%Dimensions(CA%A_Dimensionality) = &
        SIZE(CA%Many_of_One_Index%Index2, 2)
    else if (CA%Many_of_One_Index%Dimensionality == 1) then
      CA%A_Dimensionality = CA%Dimensionality
      CA%Dimensions(CA%Dimensionality + 1) = 0
    else
      ! Shouldn't be triggered. Will add something for RR here later.
      VERIFY(.false.,0)
    end if

    ! Set up the Collected Values.

    select case (CA%A_Dimensionality)
    case (1)
      call Initialize (CA%Values1, CA%Dimensions(1), allocate_status(2))
      CA%Values1 = OV
    case (2)
      call Initialize (CA%Values2, CA%Dimensions(1), CA%Dimensions(2), &
                       allocate_status(2))
      CA%Values2 = OV
    case (3)
      call Initialize (CA%Values3, CA%Dimensions(1), CA%Dimensions(2), &
                       CA%Dimensions(3), allocate_status(2))
      CA%Values3 = OV
    case (4)
      call Initialize (CA%Values4, CA%Dimensions(1), CA%Dimensions(2), &
                       CA%Dimensions(3), CA%Dimensions(4), allocate_status(2))
      CA%Values4 = OV
    case (5)
      call Initialize (CA%Values5, CA%Dimensions(1), CA%Dimensions(2), &
                       CA%Dimensions(3), CA%Dimensions(4), CA%Dimensions(5), &
                       allocate_status(2))
      CA%Values5 = OV
    !case (-1)
    !  call Initialize (CA%ValuesRR, CA%Dimensions(1), CA%Dimensions(2), &
    !                   allocate_status(2))
    !  CA%ValuesRR = OV
    end select

    ! Consolidate and handle status.

    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.

    CA%Initialized = initialized_flag

    ! Verify guarantees.

    VERIFY(Valid_State(CA),5)  ! CA is now valid.

    return
  end subroutine Initialize_Collected_Array_1

  subroutine Initialize_Collected_Array_2 (CA, Many_of_One_Index, &
                                           Dimensionality, Name, status, & 
                                           dim1, dim2, dim3)

    ! Use associations.

    use Caesar_Flags_Module, only: initialized_flag

    ! Input variables.

    type(character,*), intent(in), optional :: Name           ! Variable name.
    ! Index for Many-1.
    type(Data_Index_type), intent(in), target :: Many_of_One_Index 
    type(integer), intent(in) :: Dimensionality   ! Dimensionality for this CA.
    type(integer), intent(in), optional :: dim1, dim2, dim3   ! Dimensions.

    ! Output variables.

    ! Collected_Array to be initialized.
    type(Collected_Array_type), intent(out) :: CA 
    type(Status_type), intent(out), optional :: status  ! Exit status.

    ! Internal variables.

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

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

    ! Verify requirements.

    VERIFY(Valid_State(Many_of_One_Index),5)      ! Index is valid.
    VERIFY(Dimensionality .InInterval. (/1,4/),5) ! Dimensionality is in range.
    VERIFY(PRESENT(dim1) .or. Dimensionality == 1,5) ! Proper dimensions exist.
    VERIFY(PRESENT(dim2) .or. Dimensionality <= 2,5) ! Proper dimensions exist.
    VERIFY(PRESENT(dim3) .or. Dimensionality <= 3,5) ! Proper dimensions exist.

    ! Allocations and initializations.

    call Initialize (allocate_status)
    call Initialize (consolidated_status)

    ! Set up pointers.

    CA%One_Structure => Many_of_One_Index%One_Structure
    CA%Many_Structure => Many_of_One_Index%Many_Structure
    CA%Many_of_One_Index => Many_of_One_Index

    ! Set up internals.

    if (PRESENT(Name)) CA%Name = Name
    CA%Dimensionality = Dimensionality
    CA%Version = 0

    ! Allocations and initializations.

    call Initialize (allocate_status)
    call Initialize (consolidated_status)

    ! Set to maximum dimensionality of 5 to enable VERIFYs without if-checks.
    ! Also, this gets around problems with using the dimensionality when it
    ! is set to a negative number for a ragged right array.

    call Initialize (CA%Dimensions, 5, allocate_status(1))

    ! Set initial dimensions.

    select case (CA%Dimensionality)
    case (1)
      ! No initial dimensions.
    case (2)
      CA%Dimensions(1) = dim1
    case (3)
      CA%Dimensions(1) = dim1
      CA%Dimensions(2) = dim2
    case (4)
      CA%Dimensions(1) = dim1
      CA%Dimensions(2) = dim2
      CA%Dimensions(3) = dim3
    end select

    ! Set One Axis size.

    CA%Dimensions(CA%Dimensionality) = Length_PE(CA%One_Structure)

    ! Set Many Axis size.

    if (CA%Many_of_One_Index%Dimensionality == 2) then
      CA%A_Dimensionality = CA%Dimensionality + 1
      CA%Dimensions(CA%A_Dimensionality) = &
        SIZE(CA%Many_of_One_Index%Index2, 2)
    else if (CA%Many_of_One_Index%Dimensionality == 1) then
      CA%A_Dimensionality = CA%Dimensionality
      CA%Dimensions(CA%Dimensionality + 1) = 0
    else
      ! Shouldn't be triggered. Will add something for RR here later.
      VERIFY(.false.,0)
    end if

    ! Set up the Collected Values.

    select case (CA%A_Dimensionality)
    case (1)
      call Initialize (CA%Values1, CA%Dimensions(1), allocate_status(2))
    case (2)
      call Initialize (CA%Values2, CA%Dimensions(1), CA%Dimensions(2), &
                       allocate_status(2))
    case (3)
      call Initialize (CA%Values3, CA%Dimensions(1), CA%Dimensions(2), &
                       CA%Dimensions(3), allocate_status(2))
    case (4)
      call Initialize (CA%Values4, CA%Dimensions(1), CA%Dimensions(2), &
                       CA%Dimensions(3), CA%Dimensions(4), allocate_status(2))
    case (5)
      call Initialize (CA%Values5, CA%Dimensions(1), CA%Dimensions(2), &
                       CA%Dimensions(3), CA%Dimensions(4), CA%Dimensions(5), &
                       allocate_status(2))
    !case (-1)
    !  call Initialize (CA%ValuesRR, CA%Dimensions(1), CA%Dimensions(2), &
    !                   allocate_status(2))
    end select

    ! 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.

    CA%Initialized = initialized_flag

    ! Verify guarantees.

    VERIFY(Valid_State(CA),5)  ! CA is now valid.

    return
  end subroutine Initialize_Collected_Array_2



Michael L. Hall