1 | /* |
2 | * Vector_unit_tests.hpp |
3 | * |
4 | * Created on: Apr 6, 2016 |
5 | * Author: i-bird |
6 | */ |
7 | |
8 | #ifndef OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_UNIT_TESTS_HPP_ |
9 | #define OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_UNIT_TESTS_HPP_ |
10 | |
11 | #define BOOST_TEST_DYN_LINK |
12 | #include <boost/test/unit_test.hpp> |
13 | #include <VCluster/VCluster.hpp> |
14 | |
15 | #include <iostream> |
16 | #include "Vector/Vector.hpp" |
17 | |
18 | BOOST_AUTO_TEST_SUITE( vector_test_suite ) |
19 | |
20 | #ifdef HAVE_EIGEN |
21 | |
22 | BOOST_AUTO_TEST_CASE(vector_eigen_parallel) |
23 | { |
24 | Vcluster<> & vcl = create_vcluster(); |
25 | |
26 | if (vcl.getProcessingUnits() != 3) |
27 | return; |
28 | |
29 | // 3 Processors 9x9 Matrix to invert |
30 | |
31 | Vector<double> v(9); |
32 | |
33 | if (vcl.getProcessUnitID() == 0) |
34 | { |
35 | // v row1 |
36 | v.insert(0,0); |
37 | v.insert(1,1); |
38 | v.insert(2,2); |
39 | } |
40 | else if (vcl.getProcessUnitID() == 1) |
41 | { |
42 | v.insert(3,3); |
43 | v.insert(4,4); |
44 | v.insert(5,5); |
45 | } |
46 | else if (vcl.getProcessUnitID() == 2) |
47 | { |
48 | v.insert(6,6); |
49 | v.insert(7,7); |
50 | v.insert(8,8); |
51 | } |
52 | |
53 | Vector<double> v3; |
54 | v3 = v; |
55 | |
56 | // force to sync |
57 | v.getVec(); |
58 | |
59 | Vector<double> v2; |
60 | v2 = v; |
61 | |
62 | // Master has the full vector |
63 | |
64 | if (vcl.getProcessUnitID() == 0) |
65 | { |
66 | BOOST_REQUIRE_EQUAL(v(0),0); |
67 | BOOST_REQUIRE_EQUAL(v(1),1); |
68 | BOOST_REQUIRE_EQUAL(v(2),2); |
69 | |
70 | BOOST_REQUIRE_EQUAL(v(3),3); |
71 | BOOST_REQUIRE_EQUAL(v(4),4); |
72 | BOOST_REQUIRE_EQUAL(v(5),5); |
73 | |
74 | BOOST_REQUIRE_EQUAL(v(6),6); |
75 | BOOST_REQUIRE_EQUAL(v(7),7); |
76 | BOOST_REQUIRE_EQUAL(v(8),8); |
77 | |
78 | // Change the vector on Master |
79 | |
80 | v(0) = 8; |
81 | v(1) = 7; |
82 | v(2) = 6; |
83 | v(3) = 5; |
84 | v(4) = 4; |
85 | v(5) = 3; |
86 | v(6) = 2; |
87 | v(7) = 1; |
88 | v(8) = 0; |
89 | } |
90 | |
91 | v.scatter(); |
92 | v2.scatter(); |
93 | v3.scatter(); |
94 | |
95 | if (vcl.getProcessUnitID() == 0) |
96 | { |
97 | BOOST_REQUIRE_EQUAL(v(0),8); |
98 | BOOST_REQUIRE_EQUAL(v(1),7); |
99 | BOOST_REQUIRE_EQUAL(v(2),6); |
100 | |
101 | BOOST_REQUIRE_EQUAL(v2(0),0); |
102 | BOOST_REQUIRE_EQUAL(v2(1),1); |
103 | BOOST_REQUIRE_EQUAL(v2(2),2); |
104 | |
105 | BOOST_REQUIRE_EQUAL(v3(0),0); |
106 | BOOST_REQUIRE_EQUAL(v3(1),1); |
107 | BOOST_REQUIRE_EQUAL(v3(2),2); |
108 | } |
109 | else if (vcl.getProcessUnitID() == 1) |
110 | { |
111 | BOOST_REQUIRE_EQUAL(v(3),5); |
112 | BOOST_REQUIRE_EQUAL(v(4),4); |
113 | BOOST_REQUIRE_EQUAL(v(5),3); |
114 | |
115 | BOOST_REQUIRE_EQUAL(v2(3),3); |
116 | BOOST_REQUIRE_EQUAL(v2(4),4); |
117 | BOOST_REQUIRE_EQUAL(v2(5),5); |
118 | |
119 | BOOST_REQUIRE_EQUAL(v3(3),3); |
120 | BOOST_REQUIRE_EQUAL(v3(4),4); |
121 | BOOST_REQUIRE_EQUAL(v3(5),5); |
122 | } |
123 | else if (vcl.getProcessUnitID() == 2) |
124 | { |
125 | BOOST_REQUIRE_EQUAL(v(6),2); |
126 | BOOST_REQUIRE_EQUAL(v(7),1); |
127 | BOOST_REQUIRE_EQUAL(v(8),0); |
128 | |
129 | BOOST_REQUIRE_EQUAL(v2(6),6); |
130 | BOOST_REQUIRE_EQUAL(v2(7),7); |
131 | BOOST_REQUIRE_EQUAL(v2(8),8); |
132 | |
133 | BOOST_REQUIRE_EQUAL(v3(6),6); |
134 | BOOST_REQUIRE_EQUAL(v3(7),7); |
135 | BOOST_REQUIRE_EQUAL(v3(8),8); |
136 | } |
137 | } |
138 | |
139 | #endif |
140 | |
141 | #ifdef HAVE_PETSC |
142 | |
143 | BOOST_AUTO_TEST_CASE(vector_petsc_parallel) |
144 | { |
145 | Vcluster<> & vcl = create_vcluster(); |
146 | |
147 | if (vcl.getProcessingUnits() != 3) |
148 | return; |
149 | |
150 | // 3 Processors 9x9 Matrix to invert |
151 | |
152 | Vector<double,PETSC_BASE> v(9,3); |
153 | |
154 | if (vcl.getProcessUnitID() == 0) |
155 | { |
156 | // v row1 |
157 | v.insert(0,0); |
158 | v.insert(1,1); |
159 | v.insert(2,2); |
160 | } |
161 | else if (vcl.getProcessUnitID() == 1) |
162 | { |
163 | v.insert(3,3); |
164 | v.insert(4,4); |
165 | v.insert(5,5); |
166 | } |
167 | else if (vcl.getProcessUnitID() == 2) |
168 | { |
169 | v.insert(6,6); |
170 | v.insert(7,7); |
171 | v.insert(8,8); |
172 | } |
173 | |
174 | Vector<double,PETSC_BASE> v3; |
175 | v3 = v; |
176 | |
177 | if (vcl.getProcessUnitID() == 0) |
178 | { |
179 | // v row1 |
180 | v(0) = 8; |
181 | v(1) = 7; |
182 | v(2) = 6; |
183 | } |
184 | else if (vcl.getProcessUnitID() == 1) |
185 | { |
186 | v(3) = 5; |
187 | v(4) = 4; |
188 | v(5) = 3; |
189 | } |
190 | else if (vcl.getProcessUnitID() == 2) |
191 | { |
192 | v(6) = 2; |
193 | v(7) = 1; |
194 | v(8) = 0; |
195 | } |
196 | |
197 | // Master has the full vector |
198 | |
199 | if (vcl.getProcessUnitID() == 0) |
200 | { |
201 | BOOST_REQUIRE_EQUAL(v(0),8); |
202 | BOOST_REQUIRE_EQUAL(v(1),7); |
203 | BOOST_REQUIRE_EQUAL(v(2),6); |
204 | |
205 | BOOST_REQUIRE_EQUAL(v3(0),0); |
206 | BOOST_REQUIRE_EQUAL(v3(1),1); |
207 | BOOST_REQUIRE_EQUAL(v3(2),2); |
208 | } |
209 | else if (vcl.getProcessUnitID() == 1) |
210 | { |
211 | BOOST_REQUIRE_EQUAL(v(3),5); |
212 | BOOST_REQUIRE_EQUAL(v(4),4); |
213 | BOOST_REQUIRE_EQUAL(v(5),3); |
214 | |
215 | BOOST_REQUIRE_EQUAL(v3(3),3); |
216 | BOOST_REQUIRE_EQUAL(v3(4),4); |
217 | BOOST_REQUIRE_EQUAL(v3(5),5); |
218 | } |
219 | else if (vcl.getProcessUnitID() == 2) |
220 | { |
221 | BOOST_REQUIRE_EQUAL(v(6),2); |
222 | BOOST_REQUIRE_EQUAL(v(7),1); |
223 | BOOST_REQUIRE_EQUAL(v(8),0); |
224 | |
225 | BOOST_REQUIRE_EQUAL(v3(6),6); |
226 | BOOST_REQUIRE_EQUAL(v3(7),7); |
227 | BOOST_REQUIRE_EQUAL(v3(8),8); |
228 | } |
229 | |
230 | // Here we get the petsc vector |
231 | auto & vp = v.getVec(); |
232 | |
233 | // We check the correctness of the PETSC vector |
234 | |
235 | if (vcl.getProcessUnitID() == 0) |
236 | { |
237 | PetscInt ix[] = {0,1,2}; |
238 | PetscScalar y[3]; |
239 | |
240 | VecGetValues(vp,3,ix,y); |
241 | |
242 | BOOST_REQUIRE_EQUAL(y[0],8); |
243 | BOOST_REQUIRE_EQUAL(y[1],7); |
244 | BOOST_REQUIRE_EQUAL(y[2],6); |
245 | } |
246 | else if (vcl.getProcessUnitID() == 1) |
247 | { |
248 | PetscInt ix[] = {3,4,5}; |
249 | PetscScalar y[3]; |
250 | |
251 | VecGetValues(vp,3,ix,y); |
252 | |
253 | BOOST_REQUIRE_EQUAL(y[0],5); |
254 | BOOST_REQUIRE_EQUAL(y[1],4); |
255 | BOOST_REQUIRE_EQUAL(y[2],3); |
256 | } |
257 | else if (vcl.getProcessUnitID() == 2) |
258 | { |
259 | PetscInt ix[] = {6,7,8}; |
260 | PetscScalar y[3]; |
261 | |
262 | VecGetValues(vp,3,ix,y); |
263 | |
264 | BOOST_REQUIRE_EQUAL(y[0],2); |
265 | BOOST_REQUIRE_EQUAL(y[1],1); |
266 | BOOST_REQUIRE_EQUAL(y[2],0); |
267 | } |
268 | |
269 | } |
270 | |
271 | #endif |
272 | |
273 | BOOST_AUTO_TEST_SUITE_END() |
274 | |
275 | |
276 | #endif /* OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_UNIT_TESTS_HPP_ */ |
277 | |