2 * SparseMatrixPetsctests.cxx
4 * Created on: Dec. 2017
8 #include "SparseMatrixPetscTests.hxx"
14 //----------------------------------------------------------------------
16 SparseMatrixPetscTests::testClassSparseMatrixPetsc( void )
17 //----------------------------------------------------------------------
19 SparseMatrixPetsc A(2,2);
25 CPPUNIT_ASSERT_EQUAL( 1.0, A(0,0) );
26 CPPUNIT_ASSERT_EQUAL( 2.0, A(0,1) );
27 CPPUNIT_ASSERT_EQUAL( 3.0, A(1,0) );
28 CPPUNIT_ASSERT_EQUAL( 4.0, A(1,1) );
30 CPPUNIT_ASSERT_EQUAL( false, A.isSymmetric(1.e-5) );
32 SparseMatrixPetsc A1(2,2);
34 CPPUNIT_ASSERT_EQUAL( 1.0, A1(0,0) );
35 CPPUNIT_ASSERT_EQUAL( 2.0, A1(0,1) );
36 CPPUNIT_ASSERT_EQUAL( 3.0, A1(1,0) );
37 CPPUNIT_ASSERT_EQUAL( 4.0, A1(1,1) );
39 SparseMatrixPetsc A11(2,2);
43 CPPUNIT_ASSERT_EQUAL( 0.0, A11(0,0) );
44 CPPUNIT_ASSERT_EQUAL( 0.0, A11(0,1) );
45 CPPUNIT_ASSERT_EQUAL( 0.0, A11(1,0) );
46 CPPUNIT_ASSERT_EQUAL( 0.0, A11(1,1) );
50 CPPUNIT_ASSERT_EQUAL( 2.0, A11(0,0) );
51 CPPUNIT_ASSERT_EQUAL( 4.0, A11(0,1) );
52 CPPUNIT_ASSERT_EQUAL( 6.0, A11(1,0) );
53 CPPUNIT_ASSERT_EQUAL( 8.0, A11(1,1) );
55 SparseMatrixPetsc A22(2,2);
58 CPPUNIT_ASSERT_EQUAL( 2.0, A22(0,0) );
59 CPPUNIT_ASSERT_EQUAL( 4.0, A22(0,1) );
60 CPPUNIT_ASSERT_EQUAL( 6.0, A22(1,0) );
61 CPPUNIT_ASSERT_EQUAL( 8.0, A22(1,1) );
64 CPPUNIT_ASSERT_EQUAL( 3.0, A22(0,0) );
65 CPPUNIT_ASSERT_EQUAL( 6.0, A22(0,1) );
66 CPPUNIT_ASSERT_EQUAL( 9.0, A22(1,0) );
67 CPPUNIT_ASSERT_EQUAL( 12.0, A22(1,1) );
70 CPPUNIT_ASSERT_EQUAL( 0.5, A22(0,0) );
71 CPPUNIT_ASSERT_EQUAL( 1.0, A22(0,1) );
72 CPPUNIT_ASSERT_EQUAL( 1.5, A22(1,0) );
73 CPPUNIT_ASSERT_EQUAL( 2.0, A22(1,1) );
75 SparseMatrixPetsc A2(A1);
77 CPPUNIT_ASSERT_EQUAL( 2.0, A2(0,0) );
78 CPPUNIT_ASSERT_EQUAL( 4.0, A2(0,1) );
79 CPPUNIT_ASSERT_EQUAL( 6.0, A2(1,0) );
80 CPPUNIT_ASSERT_EQUAL( 8.0, A2(1,1) );
83 CPPUNIT_ASSERT_EQUAL( 1.0, A2(0,0) );
84 CPPUNIT_ASSERT_EQUAL( 2.0, A2(0,1) );
85 CPPUNIT_ASSERT_EQUAL( 3.0, A2(1,0) );
86 CPPUNIT_ASSERT_EQUAL( 4.0, A2(1,1) );
89 CPPUNIT_ASSERT_EQUAL( 0.0, A2(0,0) );
90 CPPUNIT_ASSERT_EQUAL( 0.0, A2(0,1) );
91 CPPUNIT_ASSERT_EQUAL( 0.0, A2(1,0) );
92 CPPUNIT_ASSERT_EQUAL( 0.0, A2(1,1) );
95 CPPUNIT_ASSERT_EQUAL( 1.0, A2(0,0) );
96 CPPUNIT_ASSERT_EQUAL( 2.0, A2(0,1) );
97 CPPUNIT_ASSERT_EQUAL( 3.0, A2(1,0) );
98 CPPUNIT_ASSERT_EQUAL( 4.0, A2(1,1) );
106 CPPUNIT_ASSERT_EQUAL( 5., X1(0) );
107 CPPUNIT_ASSERT_EQUAL( 11.0, X1(1) );
109 CPPUNIT_ASSERT_EQUAL( true, A2.isSquare() );
110 CPPUNIT_ASSERT_EQUAL( false, A2.isSymmetric() );
112 SparseMatrixPetsc A3(2,3);
119 CPPUNIT_ASSERT_EQUAL( false, A3.isSquare() );
125 CPPUNIT_ASSERT_EQUAL( true, A.isSymmetric(1.e-10) );
127 std::vector< double > vp = A.getEigenvalues(2);
128 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, vp[0],1.e-5);
129 CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, vp[1],1.e-5);
131 std::vector< Vector > Vp = A.getEigenvectors(2);
132 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, abs(Vp[0][0]) - abs(Vp[0][1]),1.e-5);
133 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, abs(Vp[1][0]) - abs(Vp[1][1]),1.e-5);
135 MEDCoupling::DataArrayDouble * VpArrayDouble = A.getEigenvectorsDataArrayDouble(2);
136 const double *values=VpArrayDouble->getConstPointer();
137 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, abs(values[0]) - abs(values[1]),1.e-5);
138 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, abs(values[2]) - abs(values[3]),1.e-5);
145 std::vector< double > sigma = A.getSingularValues(2);
146 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, sigma[0],1.e-5);
147 CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, sigma[1],1.e-5);
149 /* Condition number of a symmetric non singular matrix */
155 CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, A.getConditionNumber(1.e-10),1.e-5);
157 /* Condition number of a symmetric singular matrix */
158 SparseMatrixPetsc A33(3,3,2);
159 A33.setValue(1,2, 1.);
160 A33.setValue(2,1, 1.);
162 CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, A33.getConditionNumber(true,1.e-10),1.e-5);
164 /* Condition number of a non symmetric singular matrix */
165 A33.setValue(1,2, 1.);
166 A33.setValue(2,1, 4.);
168 CPPUNIT_ASSERT_DOUBLES_EQUAL( 4, A33.getConditionNumber(true,1.e-10),1.e-5);
170 SparseMatrixPetsc A4(4,4);
180 A4.setValue(2,1,10.);
181 A4.setValue(2,2,11.);
182 A4.setValue(2,3,12.);
183 A4.setValue(3,0,13.);
184 A4.setValue(3,1,14.);
185 A4.setValue(3,2,15.);
186 A4.setValue(3,3,16.);
188 SparseMatrixPetsc A5(A4.transpose());
189 CPPUNIT_ASSERT_EQUAL( 1., A5(0,0) );
190 CPPUNIT_ASSERT_EQUAL( 5., A5(0,1) );
191 CPPUNIT_ASSERT_EQUAL( 9., A5(0,2) );
192 CPPUNIT_ASSERT_EQUAL( 13., A5(0,3) );
193 CPPUNIT_ASSERT_EQUAL( 2., A5(1,0) );
194 CPPUNIT_ASSERT_EQUAL( 6., A5(1,1) );
195 CPPUNIT_ASSERT_EQUAL( 10., A5(1,2) );
196 CPPUNIT_ASSERT_EQUAL( 14., A5(1,3) );
197 CPPUNIT_ASSERT_EQUAL( 3., A5(2,0) );
198 CPPUNIT_ASSERT_EQUAL( 7., A5(2,1) );
199 CPPUNIT_ASSERT_EQUAL( 11., A5(2,2) );
200 CPPUNIT_ASSERT_EQUAL( 15., A5(2,3) );
201 CPPUNIT_ASSERT_EQUAL( 4., A5(3,0) );
202 CPPUNIT_ASSERT_EQUAL( 8., A5(3,1) );
203 CPPUNIT_ASSERT_EQUAL( 12., A5(3,2) );
204 CPPUNIT_ASSERT_EQUAL( 16., A5(3,3) );
206 SparseMatrixPetsc AA(4,4);
212 CPPUNIT_ASSERT_EQUAL( 1., AA(1,1) );
213 CPPUNIT_ASSERT_EQUAL( 2., AA(2,2) );
214 CPPUNIT_ASSERT_EQUAL( 3., AA(3,3) );
216 SparseMatrixPetsc BB(4,4,3);
222 CPPUNIT_ASSERT_EQUAL( 1., BB(1,1) );
223 CPPUNIT_ASSERT_EQUAL( 2., BB(2,2) );
224 CPPUNIT_ASSERT_EQUAL( 3., BB(3,3) );
232 SparseMatrixPetsc A7(2,2);
235 CPPUNIT_ASSERT_EQUAL( 1.0, A7(0,0) );
236 CPPUNIT_ASSERT_EQUAL( 2.0, A7(0,1) );
237 CPPUNIT_ASSERT_EQUAL( 3.0, A7(1,0) );
238 CPPUNIT_ASSERT_EQUAL( 4.0, A7(1,1) );
242 CPPUNIT_ASSERT_EQUAL( 2.0, A7(0,0) );
243 CPPUNIT_ASSERT_EQUAL( 4.0, A7(0,1) );
244 CPPUNIT_ASSERT_EQUAL( 6.0, A7(1,0) );
245 CPPUNIT_ASSERT_EQUAL( 8.0, A7(1,1) );
247 SparseMatrixPetsc A8(2,2,2,4);
248 A8.setValuesBlocked(0,0,A6);
250 CPPUNIT_ASSERT_EQUAL( 1.0, A8(0,0) );
251 CPPUNIT_ASSERT_EQUAL( 2.0, A8(0,1) );
252 CPPUNIT_ASSERT_EQUAL( 3.0, A8(1,0) );
253 CPPUNIT_ASSERT_EQUAL( 4.0, A8(1,1) );
255 A8.addValuesBlocked(0,0,A6);
257 CPPUNIT_ASSERT_EQUAL( 2.0, A8(0,0) );
258 CPPUNIT_ASSERT_EQUAL( 4.0, A8(0,1) );
259 CPPUNIT_ASSERT_EQUAL( 6.0, A8(1,0) );
260 CPPUNIT_ASSERT_EQUAL( 8.0, A8(1,1) );