]> SALOME platform Git repositories - tools/solverlab.git/blob - CDMATH/tests/cdmath/SparseMatrixPetscTests.cxx
Salome HOME
update CDMATH
[tools/solverlab.git] / CDMATH / tests / cdmath / SparseMatrixPetscTests.cxx
1 /*
2  * SparseMatrixPetsctests.cxx
3  *
4  *  Created on: Dec. 2017
5  *      Authors: CDMATH
6  */
7
8 #include "SparseMatrixPetscTests.hxx"
9
10 #include "Vector.hxx"
11
12 using namespace std;
13
14 //----------------------------------------------------------------------
15 void
16 SparseMatrixPetscTests::testClassSparseMatrixPetsc( void )
17 //----------------------------------------------------------------------
18 {
19     SparseMatrixPetsc A(2,2);
20     A.setValue(0,0,1.);
21     A.setValue(0,1,2.);
22     A.setValue(1,0,3.);
23     A.setValue(1,1,4.);
24
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) );
29
30         CPPUNIT_ASSERT_EQUAL( false, A.isSymmetric(1.e-5) );
31
32     SparseMatrixPetsc A1(2,2);
33     A1=A;
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) );
38
39         SparseMatrixPetsc A11(2,2);
40
41         A11 = A1-A;
42
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) );
47
48         A11 = A1+A;
49
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) );
54
55         SparseMatrixPetsc A22(2,2);
56
57         A22 = 2*A;
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) );
62
63         A22 = A*3;
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) );
68
69         A22 = A/2;
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) );
74
75         SparseMatrixPetsc A2(A1);
76     A2*=2;
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) );
81
82     A2/=2;
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) );
87
88     A2-=A;
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) );
93
94     A2+=A;
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) );
99
100         Vector X(2);
101     X(0)=1.;
102     X(1)=2.;
103
104     Vector X1(X);
105     X1=A*X;
106         CPPUNIT_ASSERT_EQUAL( 5., X1(0) );
107         CPPUNIT_ASSERT_EQUAL( 11.0, X1(1) );
108
109         CPPUNIT_ASSERT_EQUAL( true, A2.isSquare() );
110         CPPUNIT_ASSERT_EQUAL( false, A2.isSymmetric() );
111
112         SparseMatrixPetsc A3(2,3);
113     A3.setValue(0,0,1.);
114     A3.setValue(0,1,2.);
115     A3.setValue(0,2,2.);
116     A3.setValue(1,0,3.);
117     A3.setValue(1,1,4.);
118     A3.setValue(1,2,4.);
119         CPPUNIT_ASSERT_EQUAL( false, A3.isSquare() );
120
121     A.setValue(0,0,1.);
122     A.setValue(0,1,-1.);
123     A.setValue(1,0,-1.);
124     A.setValue(1,1,1.);
125         CPPUNIT_ASSERT_EQUAL( true, A.isSymmetric(1.e-10) );
126
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);
130
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);
134
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);
139
140     A.setValue(0,0,-1.);
141     A.setValue(0,1, 1.);
142     A.setValue(1,0, 1.);
143     A.setValue(1,1,-1.);
144
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);
148
149         /* Condition number of a symmetric non singular matrix */
150     A.setValue(0,0, 0.);
151     A.setValue(0,1, 1.);
152     A.setValue(1,0, 1.);
153     A.setValue(1,1, 0.);
154
155         CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, A.getConditionNumber(1.e-10),1.e-5);
156
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.);
161
162         CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, A33.getConditionNumber(true,1.e-10),1.e-5);
163
164         /* Condition number of a non symmetric singular matrix */
165     A33.setValue(1,2, 1.);
166     A33.setValue(2,1, 4.);
167
168         CPPUNIT_ASSERT_DOUBLES_EQUAL( 4, A33.getConditionNumber(true,1.e-10),1.e-5);
169
170         SparseMatrixPetsc A4(4,4);
171     A4.setValue(0,0,1.);
172     A4.setValue(0,1,2.);
173     A4.setValue(0,2,3.);
174     A4.setValue(0,3,4.);
175     A4.setValue(1,0,5.);
176     A4.setValue(1,1,6.);
177     A4.setValue(1,2,7.);
178     A4.setValue(1,3,8.);
179     A4.setValue(2,0,9.);
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.);
187
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) );
205
206         SparseMatrixPetsc AA(4,4);
207
208         AA.setValue(1,1,1.);
209         AA.setValue(3,3,3.);
210         AA.setValue(2,2,2.);
211
212         CPPUNIT_ASSERT_EQUAL( 1., AA(1,1) );
213         CPPUNIT_ASSERT_EQUAL( 2., AA(2,2) );
214         CPPUNIT_ASSERT_EQUAL( 3., AA(3,3) );
215
216         SparseMatrixPetsc BB(4,4,3);
217
218         BB.setValue(1,1,1.);
219         BB.setValue(3,3,3.);
220         BB.setValue(2,2,2.);
221
222         CPPUNIT_ASSERT_EQUAL( 1., BB(1,1) );
223         CPPUNIT_ASSERT_EQUAL( 2., BB(2,2) );
224         CPPUNIT_ASSERT_EQUAL( 3., BB(3,3) );
225
226     Matrix A6(2,2);
227     A6(0,0)=1.;
228     A6(0,1)=2.;
229     A6(1,0)=3.;
230     A6(1,1)=4.;
231
232     SparseMatrixPetsc A7(2,2);
233     A7.setValue(0,0,A6);
234
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) );
239
240     A7.addValue(0,0,A6);
241
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) );
246
247     SparseMatrixPetsc A8(2,2,2,4);
248     A8.setValuesBlocked(0,0,A6);
249
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) );
254
255     A8.addValuesBlocked(0,0,A6);
256
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) );
261 }