The main documentation of the Gather_and_Collect_CA_from_DV Procedure contains additional explanation of this code listing.
subroutine Gather_and_Collect_CA_from_DV (CA, DV)
! Input variable.
type(Distributed_Vector_type), intent(in) :: DV ! DV to be gathered.
! Input/Output variable.
type(Collected_Array_type), intent(inout) :: CA ! Gathered vector.
! Internal variables.
type(integer) :: i, j, k ! Loop counters.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
VERIFY(Valid_State(CA),5) ! CA is valid.
VERIFY(Valid_State(DV),5) ! DV is valid.
! DV, CA -> same Many Structure.
VERIFY(ASSOCIATED(DV%Structure,CA%Many_Structure),5)
! DV, CA -> same Dimensionality and Dimensions.
VERIFY(DV%Dimensionality == CA%Dimensionality,5)
VERIFY(CA%Dimensions(1:CA%Dimensionality-2) == dnl
DV%Dimensions(1:DV%Dimensionality-2),5) ! Same dimensions.
! Gather the off PE values if they are out-of-date. This could be done
! faster for multiple dimensions by packing everything into a single
! vector, gathering, and then unpacking. Maybe in a later version.
if (Version(CA) /= Version(DV)) then
select case (CA%Many_of_One_Index%Dimensionality)
! Vector Index.
case (1)
select case (CA%Dimensionality)
case (1)
call Gather (CA%Values1, DV%Values1, Trace=CA%Many_of_One_Index%Trace)
case (2)
do i = 1, CA%Dimensions(1)
call Gather (CA%Values2(i,:), DV%Values2(i,:), &
Trace=CA%Many_of_One_Index%Trace)
end do
case (3)
do i = 1, CA%Dimensions(1)
do j = 1, CA%Dimensions(2)
call Gather (CA%Values3(i,j,:), DV%Values3(i,j,:), &
Trace=CA%Many_of_One_Index%Trace)
end do
end do
case (4)
do i = 1, CA%Dimensions(1)
do j = 1, CA%Dimensions(2)
do k = 1, CA%Dimensions(3)
call Gather (CA%Values4(i,j,k,:), DV%Values4(i,j,k,:), &
Trace=CA%Many_of_One_Index%Trace)
end do
end do
end do
!case (-1)
! call Gather (CA%ValuesRR, DV%ValuesRR, &
! Trace=CA%Many_of_One_Index%Trace)
end select
! Array Index.
case (2)
select case (CA%Dimensionality)
case (1)
call Gather (CA%Values2, DV%Values1, Trace=CA%Many_of_One_Index%Trace)
case (2)
do i = 1, CA%Dimensions(1)
call Gather (CA%Values3(i,:,:), DV%Values2(i,:), &
Trace=CA%Many_of_One_Index%Trace)
end do
case (3)
do i = 1, CA%Dimensions(1)
do j = 1, CA%Dimensions(2)
call Gather (CA%Values4(i,j,:,:), DV%Values3(i,j,:), &
Trace=CA%Many_of_One_Index%Trace)
end do
end do
case (4)
do i = 1, CA%Dimensions(1)
do j = 1, CA%Dimensions(2)
do k = 1, CA%Dimensions(3)
call Gather (CA%Values5(i,j,k,:,:), DV%Values4(i,j,k,:), &
Trace=CA%Many_of_One_Index%Trace)
end do
end do
end do
!case (-1)
! call Gather (CA%ValuesRR, DV%ValuesRR, &
! Trace=CA%Many_of_One_Index%Trace)
end select
end select
end if
! Set version.
CA = Version(DV)
! Verify guarantees.
VERIFY(Valid_State(CA),5) ! CA is valid.
return
end subroutine Gather_and_Collect_CA_from_DV