The main documentation of the Gather_OV_from_DV Procedure contains additional explanation of this code listing.
subroutine Gather_OV_from_DV (OV, DV) ! Input variable. type(Distributed_Vector_type), intent(in), target :: DV ! DV to be gathered. ! Input/Output variable. type(Overlapped_Vector_type), intent(inout) :: OV ! Gathered vector. ! Internal variables. type(integer) :: i, j, k ! Loop counters. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(OV),5) ! OV is valid. VERIFY(Valid_State(DV),5) ! DV is valid. VERIFY(ASSOCIATED(DV%Structure,OV%Many_Structure),5) ! DV, OV ->same struct VERIFY(DV%Dimensionality == OV%Dimensionality,5) ! DV, OV have same Dims. ! Set the DV values of the OV if necessary. if (.not. ASSOCIATED(OV%DV,DV)) then select case (OV%Dimensionality) case (1) OV%DV%Values1 = DV%Values1 case (2) OV%DV%Values2 = DV%Values2 case (3) OV%DV%Values3 = DV%Values3 case (4) OV%DV%Values4 = DV%Values4 !case (-1) ! OV%DV%ValuesRR = DV%ValuesRR end select end if ! 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(OV) /= Version(DV)) then select case (OV%Dimensionality) case (1) call Gather (OV%Overlap_Values1, DV%Values1, Trace=OV%Overlap_Trace) case (2) do i = 1, SIZE(OV%Overlap_Values2,1) call Gather (OV%Overlap_Values2(i,:), DV%Values2(i,:), & Trace=OV%Overlap_Trace) end do case (3) do i = 1, SIZE(OV%Overlap_Values3,1) do j = 1, SIZE(OV%Overlap_Values3,2) call Gather (OV%Overlap_Values3(i,j,:), DV%Values3(i,j,:), & Trace=OV%Overlap_Trace) end do end do case (4) do i = 1, SIZE(OV%Overlap_Values4,1) do j = 1, SIZE(OV%Overlap_Values4,2) do k = 1, SIZE(OV%Overlap_Values4,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 Gather (OV%Overlap_ValuesRR, DV%ValuesRR, & ! Trace=OV%Overlap_Trace) end select end if ! Set version. OV = Version(DV) ! Verify guarantees. VERIFY(Valid_State(OV),5) ! OV is valid. return end subroutine Gather_OV_from_DV