|
| 1 | +module BlockPartitionedArraysTests |
| 2 | + |
| 3 | +using Test, LinearAlgebra, BlockArrays, SparseArrays |
1 | 4 |
|
2 | | -using Test |
3 | 5 | using Gridap |
4 | | -using PartitionedArrays |
5 | 6 | using GridapDistributed |
6 | | -using BlockArrays |
7 | | -using SparseArrays |
8 | | -using LinearAlgebra |
9 | | - |
| 7 | +using PartitionedArrays |
10 | 8 | using GridapDistributed: BlockPArray, BlockPVector, BlockPMatrix, BlockPRange |
11 | 9 |
|
12 | | -ranks = with_debug() do distribute |
13 | | - distribute(LinearIndices((2,))) |
| 10 | +function main(distribute, parts) |
| 11 | + ranks = distribute(LinearIndices((prod(parts),))) |
| 12 | + |
| 13 | + n_global = 4*prod(parts) |
| 14 | + indices = uniform_partition(ranks, n_global, true) |
| 15 | + |
| 16 | + pr = PRange(indices) |
| 17 | + block_range = BlockPRange([pr, pr]) |
| 18 | + |
| 19 | + # BlockPRange API |
| 20 | + @test blocklength(block_range) == 2 |
| 21 | + @test blocksize(block_range) == (2,) |
| 22 | + |
| 23 | + # BlockPVector: constructor, fill!, similar, arithmetic |
| 24 | + v = BlockPVector{Vector{Float64}}(undef, block_range) |
| 25 | + fill!(v, 1.0) |
| 26 | + v2 = similar(v, block_range) |
| 27 | + fill!(v2, 2.0) |
| 28 | + |
| 29 | + v2 = v .+ 1.0 |
| 30 | + v2 = v .- 1.0 |
| 31 | + v2 = v .* 2.0 |
| 32 | + v2 = v ./ 2.0 |
| 33 | + copy!(v2, v) |
| 34 | + |
| 35 | + @test norm(v) ≈ sqrt(2*n_global) |
| 36 | + |
| 37 | + # PartitionedArrays vector API |
| 38 | + consistent!(v) |> wait |
| 39 | + assemble!(v) |> wait |
| 40 | + partition(v) |
| 41 | + local_values(v) |
| 42 | + own_values(v) |
| 43 | + ghost_values(v) |
| 44 | + |
| 45 | + # local_views on vector with and without new range |
| 46 | + local_views(v) |
| 47 | + local_views(v, block_range) |
| 48 | + |
| 49 | + # BlockPMatrix: constructor (exercises BUG3 fix: cols must not be dropped) |
| 50 | + m = BlockPMatrix{SparseMatrixCSC{Float64,Int64}}(undef, block_range, block_range) |
| 51 | + @test blocksize(m) == (2,2) |
| 52 | + |
| 53 | + m2 = similar(m, (block_range, block_range)) |
| 54 | + @test blocksize(m2) == (2,2) |
| 55 | + |
| 56 | + # PartitionedArrays matrix API |
| 57 | + assemble!(m) |> wait |
| 58 | + LinearAlgebra.fillstored!(m, 0.0) |
| 59 | + partition(m) |
| 60 | + own_ghost_values(m) |
| 61 | + ghost_own_values(m) |
| 62 | + |
| 63 | + # local_views on matrix (exercises BUG5 fix: correct I[1]/I[2] indexing) |
| 64 | + local_views(m) |
| 65 | + local_views(m, block_range, block_range) |
| 66 | + |
| 67 | + maximum(abs, v) |
| 68 | + minimum(abs, v) |
| 69 | + |
| 70 | + # BUG4 fix: mul!(y,A,x,α,β) must compute α*(A*x) + β*y, not α*β*(A*x) |
| 71 | + # With A=0: y ← α*(0*x) + β*y_old = β*y_old |
| 72 | + fill!(v, 1.0) |
| 73 | + v4 = similar(v, block_range) |
| 74 | + fill!(v4, 3.0) |
| 75 | + LinearAlgebra.fillstored!(m, 0.0) |
| 76 | + mul!(v4, m, v, 2.0, 2.0) # y ← 2*(0*x) + 2*[3,...] = [6,...] |
| 77 | + @test norm(v4) ≈ 6.0 * sqrt(2*n_global) |
14 | 78 | end |
15 | 79 |
|
16 | | -indices = map(ranks) do r |
17 | | - if r == 1 |
18 | | - own_gids = [1,2,3,4,5] |
19 | | - ghost_gids = [6,7] |
20 | | - ghost_owners = [2,2] |
21 | | - else |
22 | | - own_gids = [6,7,8,9,10] |
23 | | - ghost_gids = [5] |
24 | | - ghost_owners = [1] |
25 | | - end |
26 | | - own_idx = OwnIndices(10,r,own_gids) |
27 | | - ghost_idx = GhostIndices(10,ghost_gids,ghost_owners) |
28 | | - OwnAndGhostIndices(own_idx,ghost_idx) |
29 | | -end |
30 | | - |
31 | | -block_range = BlockPRange([PRange(indices),PRange(indices)]) |
32 | | - |
33 | | -_v = PVector{OwnAndGhostVectors{Vector{Float64}}}(undef,indices) |
34 | | -v = BlockPArray([_v,_v],(block_range,)) |
35 | | -fill!(v,1.0) |
36 | | - |
37 | | -_m = map(CartesianIndices((2,2))) do I |
38 | | - i,j = I[1],I[2] |
39 | | - local_mats = map(ranks,indices) do r, ind |
40 | | - n = local_length(ind) |
41 | | - if i==j && r == 1 |
42 | | - SparseMatrixCSC(n,n,Int[1,3,5,7,9,10,11,13],Int[1,2,2,3,3,4,4,5,5,6,6,7],fill(1.0,12)) |
43 | | - elseif i==j && r == 2 |
44 | | - SparseMatrixCSC(n,n,Int[1,2,4,6,8,10,11],Int[1,1,2,2,3,3,4,4,5,6],fill(1.0,10)) |
45 | | - else |
46 | | - SparseMatrixCSC(n,n,fill(Int(1),n+1),Int[],Float64.([])) |
47 | | - end |
48 | | - end |
49 | | - PSparseMatrix(local_mats,indices,indices) |
50 | | -end; |
51 | | -m = BlockPArray(_m,(block_range,block_range)) |
52 | | - |
53 | | -x = similar(_v) |
54 | | -mul!(x,_m[1,1],_v) |
55 | | - |
56 | | -# BlockPRange |
57 | | - |
58 | | -@test blocklength(block_range) == 2 |
59 | | -@test blocksize(block_range) == (2,) |
60 | | - |
61 | | -# AbstractArray API |
62 | | - |
63 | | -__v = similar(v,block_range) |
64 | | -__m = similar(m,(block_range,block_range)) |
65 | | -fill!(__v,1.0) |
66 | | - |
67 | | -__v = __v .+ 1.0 |
68 | | -__v = __v .- 1.0 |
69 | | -__v = __v .* 1.0 |
70 | | -__v = __v ./ 1.0 |
71 | | - |
72 | | -# PartitionedArrays API |
73 | | - |
74 | | -consistent!(__v) |> wait |
75 | | -t = assemble!(__v) |
76 | | -assemble!(__m) |> wait |
77 | | -fetch(t); |
78 | | - |
79 | | -PartitionedArrays.to_trivial_partition(m) |
80 | | - |
81 | | -partition(v) |
82 | | -partition(m) |
83 | | -local_values(v) |
84 | | -own_values(v) |
85 | | -ghost_values(v) |
86 | | -own_ghost_values(m) |
87 | | -ghost_own_values(m) |
88 | | - |
89 | | -# LinearAlgebra API |
90 | | -fill!(v,1.0) |
91 | | -x = similar(v) |
92 | | -mul!(x,m,v) |
93 | | -consistent!(x) |> wait |
94 | | - |
95 | | -@test dot(v,x) ≈ 36 |
96 | | -norm(v) |
97 | | -copy!(x,v) |
98 | | - |
99 | | -LinearAlgebra.fillstored!(__m,1.0) |
100 | | - |
101 | | -__v = BlockPVector{Vector{Float64}}(undef,block_range) |
102 | | -#__m = BlockPMatrix{SparseMatrixCSC{Float64,Int64}}(undef,block_range,block_range) |
103 | | - |
104 | | -maximum(abs,v) |
105 | | -minimum(abs,v) |
106 | | - |
107 | | -# GridapDistributed API |
108 | | -v_parts = local_views(v) |
109 | | -m_parts = local_views(m) |
110 | | - |
111 | | -v_parts = local_views(v,block_range) |
112 | | -m_parts = local_views(m,block_range,block_range) |
| 80 | +end # module |
0 commit comments