The main documentation of the Initialize_Overlapped_Vector Procedure contains additional explanation of this code listing.
subroutine Initialize_Overlapped_Vector_1 (OV, DV, Many_of_One_Index, & Name, status) ! Use associations. use Caesar_Flags_Module, only: initialized_flag ! Input variables. type(character,*), intent(in), optional :: Name ! Variable name. type(Distributed_Vector_type), intent(in), target :: DV ! DV for this OV. ! Index for Many-One. type(Data_Index_type), intent(in), target :: Many_of_One_Index ! Output variables. ! Overlapped_Vector to be initialized. type(Overlapped_Vector_type), intent(inout) :: OV type(Status_type), intent(out), optional :: status ! Exit status. ! Internal variables. type(Status_type), dimension(1) :: allocate_status ! Allocation Status. type(Status_type) :: consolidated_status ! Consolidated Status. type(integer) :: i, j, k ! Loop counters. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(DV),5) ! Distributed Vector is valid. VERIFY(Valid_State(Many_of_One_Index),5) ! Index is valid. ! Structures are the same. VERIFY(ASSOCIATED(Many_of_One_Index%Many_Structure, DV%Structure),5) ! Set up pointers. OV%One_Structure => Many_of_One_Index%One_Structure OV%Many_Structure => DV%Structure OV%Dimensions => DV%Dimensions OV%DV => DV OV%Many_of_One_Index => Many_of_One_Index OV%Overlap_Index => Many_of_One_Index%Off_PE_Index OV%Overlap_Trace => Many_of_One_Index%Off_PE_Trace ! Set up internals. if (PRESENT(Name)) OV%Name = Name OV%Dimensionality = DV%Dimensionality OV%Version = DV%Version ! Allocations and initializations. call Initialize (allocate_status) call Initialize (consolidated_status) ! Set up the Overlapped Values. select case (OV%Dimensionality) case (1) call Initialize (OV%Overlap_Values1, Many_of_One_Index%NOff_PE, & allocate_status(1)) call Gather (OV%Overlap_Values1, DV%Values1, Trace=OV%Overlap_Trace) case (2) call Initialize (OV%Overlap_Values2, OV%Dimensions(1), & Many_of_One_Index%NOff_PE, & allocate_status(1)) do i = 1, OV%Dimensions(1) call Gather (OV%Overlap_Values2(i,:), DV%Values2(i,:), & Trace=OV%Overlap_Trace) end do case (3) call Initialize (OV%Overlap_Values3, OV%Dimensions(1), & OV%Dimensions(2), Many_of_One_Index%NOff_PE, & allocate_status(1)) do i = 1, OV%Dimensions(1) do j = 1, OV%Dimensions(2) call Gather (OV%Overlap_Values3(i,j,:), DV%Values3(i,j,:), & Trace=OV%Overlap_Trace) end do end do case (4) call Initialize (OV%Overlap_Values4, OV%Dimensions(1), & OV%Dimensions(2), OV%Dimensions(3), & Many_of_One_Index%NOff_PE, & allocate_status(1)) do i = 1, OV%Dimensions(1) do j = 1, OV%Dimensions(2) do k = 1, OV%Dimensions(3) call Gather (OV%Overlap_Values4(i,j,k,:), DV%Values4(i,j,k,:), & Trace=OV%Overlap_Trace) end do end do end do !case (-1) ! call Initialize (OV%Overlap_ValuesRR, Many_of_One_Index%NOff_PE, & ! allocate_status) 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. OV%Initialized = initialized_flag ! Verify guarantees. VERIFY(Valid_State(OV),5) ! OV is now valid. return end subroutine Initialize_Overlapped_Vector_1 subroutine Initialize_Overlapped_Vector_2 (OV, Many_of_One_Index, & Dimensionality, Name, status, & dim1, dim2, dim3) ! Input variables. type(character,*), intent(in), optional :: Name ! Variable name. type(Data_Index_type), intent(in) :: Many_of_One_Index ! Index for Many-1. type(integer), intent(in) :: Dimensionality ! Dimensionality for this OV. type(integer), intent(in), optional :: dim1, dim2, dim3 ! Dimensions. ! Output variables. ! Overlapped_Vector to be initialized. type(Overlapped_Vector_type), intent(out) :: OV 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. ! Pass-through variables. type(character,name_length) :: Name_Pass type(integer) :: dim1_Pass, dim2_Pass, dim3_Pass !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! 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. ! Make "Pass" versions of the optional inputs. if (PRESENT(Name)) then Name_Pass = Name else Name_Pass = '' end if if (PRESENT(dim1)) then dim1_Pass = dim1 else dim1_Pass = 0 end if if (PRESENT(dim2)) then dim2_Pass = dim2 else dim2_Pass = 0 end if if (PRESENT(dim3)) then dim3_Pass = dim3 else dim3_Pass = 0 end if ! Allocations and initializations. call Initialize (allocate_status) call Initialize (consolidated_status) ! Initialize the internal DV. call Initialize (OV%DV_Internal, Many_of_One_Index%Many_Structure, & Dimensionality, Name_Pass, allocate_status(1), & dim1_Pass, dim2_Pass, dim3_Pass) !OV%DV_Internal = (/ 0.d0 /) ! Use other OV initialization procedure. call Initialize_Overlapped_Vector_1 (OV, OV%DV_Internal, & Many_of_One_Index, Name_Pass, & allocate_status(2)) ! 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) ! Verify guarantees. VERIFY(Valid_State(OV),5) ! OV is now valid. return end subroutine Initialize_Overlapped_Vector_2