@@ -129,21 +129,29 @@ function split_vector_blocks(own::A,ghost::A) where A
129129 SplitVectorBlocks (own,ghost)
130130end
131131
132- struct SplitVector{A,T} <: AbstractVector{T}
132+ struct SplitVector{A,B, T} <: AbstractVector{T}
133133 blocks:: SplitVectorBlocks{A}
134- permutation:: UnitRange{Int32}
134+ permutation:: B
135135 function SplitVector (
136136 blocks:: SplitVectorBlocks{A} ,permutation) where A
137137 T = eltype (blocks. own)
138- perm = convert (UnitRange{Int32}, permutation)
139- new {A,T} (blocks,perm )
138+ B = typeof ( permutation)
139+ new {A,B, T} (blocks,permutation )
140140 end
141141end
142142
143- function split_vector (blocks:: SplitVectorBlocks ,permutation:: UnitRange )
143+ function split_vector (blocks:: SplitVectorBlocks ,permutation)
144144 SplitVector (blocks,permutation)
145145end
146146
147+ function split_vector (
148+ own:: AbstractVector ,
149+ ghost:: AbstractVector ,
150+ permutation)
151+ blocks = split_vector_blocks (own,ghost)
152+ split_vector (blocks,permutation)
153+ end
154+
147155Base. IndexStyle (:: Type{<:SplitVector} ) = IndexLinear ()
148156Base. size (a:: SplitVector ) = (length (a. blocks. own)+ length (a. blocks. ghost),)
149157function Base. getindex (a:: SplitVector ,local_id:: Int )
@@ -974,6 +982,12 @@ function pvector!(C,V,cache)
974982 end
975983end
976984
985+ function pvector_from_split_blocks (own,ghost,row_partition)
986+ perms = map (local_permutation,row_partition)
987+ values = map (split_vector,own,ghost,perms)
988+ PVector (values,row_partition)
989+ end
990+
977991function old_pvector! (I,V,index_partition;kwargs... )
978992 old_pvector! (default_local_values,I,V,index_partition;kwargs... )
979993end
0 commit comments