source: test/unit_test/solver_test.cpp@ d24c2f

Last change on this file since d24c2f was dfed1c, checked in by Julian Iseringhausen <isering@…>, 14 years ago

Major vmg update.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1136 5161e1c8-67bf-11de-9fd5-51895aff932f

  • Property mode set to 100644
File size: 6.9 KB
Line 
1/*
2 * solver_test.cpp
3 *
4 * Created on: 21.07.2010
5 * Author: Julian Iseringhausen
6 */
7
8#ifdef HAVE_CONFIG_H
9#include <config.h>
10#endif
11
12#include <limits>
13
14#ifdef HAVE_LAPACK
15#include "solver/dgesv.hpp"
16#include "solver/dsysv.hpp"
17#endif
18#include "solver/givens.hpp"
19#include "solver/solver_regular.hpp"
20
21#include "solver_test.hpp"
22
23using namespace VMG;
24using VMGTests::SolverTestSuite;
25
26CPPUNIT_TEST_SUITE_REGISTRATION(SolverTestSuite);
27
28void SolverTestSuite::setUp()
29{
30#ifdef HAVE_LAPACK
31 dgesv = new DGESV<SolverRegular>();
32 dsysv = new DSYSV<SolverRegular>();
33
34 dgesv->Realloc(5);
35 dsysv->Realloc(10);
36#endif
37
38 givens = new Givens<SolverRegular>();
39 givens->Realloc(5);
40}
41
42void SolverTestSuite::tearDown()
43{
44 MG::Destroy();
45
46#ifdef HAVE_LAPACK
47 delete dgesv;
48 delete dsysv;
49#endif
50 delete givens;
51}
52
53void SolverTestSuite::DGESVTest()
54{
55#ifdef HAVE_LAPACK
56 dgesv->Mat(0, 0) = 1.0;
57 dgesv->Mat(0, 1) = -4.0;
58 dgesv->Mat(0, 2) = 0.0;
59 dgesv->Mat(0, 3) = -5.0;
60 dgesv->Mat(0, 4) = 0.0;
61
62 dgesv->Mat(1, 0) = 0.0;
63 dgesv->Mat(1, 1) = 2.0;
64 dgesv->Mat(1, 2) = 2.0;
65 dgesv->Mat(1, 3) = 5.0;
66 dgesv->Mat(1, 4) = 4.0;
67
68 dgesv->Mat(2, 0) = 4.0;
69 dgesv->Mat(2, 1) = -16.0;
70 dgesv->Mat(2, 2) = 0.0;
71 dgesv->Mat(2, 3) = -25.0;
72 dgesv->Mat(2, 4) = 0.0;
73
74 dgesv->Mat(3, 0) = -1.0;
75 dgesv->Mat(3, 1) = -2.0;
76 dgesv->Mat(3, 2) = -4.0;
77 dgesv->Mat(3, 3) = -5.0;
78 dgesv->Mat(3, 4) = -8.0;
79
80 dgesv->Mat(4, 0) = 0.0;
81 dgesv->Mat(4, 1) = 0.0;
82 dgesv->Mat(4, 2) = 2.0;
83 dgesv->Mat(4, 3) = 0.0;
84 dgesv->Mat(4, 4) = 5.0;
85
86 dgesv->Rhs(0) = 12.5;
87 dgesv->Rhs(1) = 8.0;
88 dgesv->Rhs(2) = -10.0;
89 dgesv->Rhs(3) = 3.5;
90 dgesv->Rhs(4) = -16.0;
91
92 dgesv->Compute();
93
94 CPPUNIT_ASSERT_DOUBLES_EQUAL( 8.5, dgesv->Sol(0), 1.0e-12);
95 CPPUNIT_ASSERT_DOUBLES_EQUAL(-16.0, dgesv->Sol(1), 1.0e-12);
96 CPPUNIT_ASSERT_DOUBLES_EQUAL(-18.0, dgesv->Sol(2), 1.0e-12);
97 CPPUNIT_ASSERT_DOUBLES_EQUAL( 12.0, dgesv->Sol(3), 1.0e-12);
98 CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.0, dgesv->Sol(4), 1.0e-12);
99#endif
100}
101
102
103void SolverTestSuite::DSYSVTest()
104{
105#ifdef HAVE_LAPACK
106 dsysv->Mat(0, 0) = 4.0;
107 dsysv->Mat(0, 1) = -1.0;
108 dsysv->Mat(0, 2) = -1.0;
109 dsysv->Mat(0, 3) = -1.0;
110 dsysv->Mat(0, 4) = 0.0;
111 dsysv->Mat(0, 5) = 0.0;
112 dsysv->Mat(0, 6) = -1.0;
113 dsysv->Mat(0, 7) = 0.0;
114 dsysv->Mat(0, 8) = 0.0;
115 dsysv->Mat(0, 9) = 1.0;
116
117 dsysv->Mat(1, 0) = -1.0;
118 dsysv->Mat(1, 1) = 4.0;
119 dsysv->Mat(1, 2) = -1.0;
120 dsysv->Mat(1, 3) = 0.0;
121 dsysv->Mat(1, 4) = -1.0;
122 dsysv->Mat(1, 5) = 0.0;
123 dsysv->Mat(1, 6) = 0.0;
124 dsysv->Mat(1, 7) = -1.0;
125 dsysv->Mat(1, 8) = 0.0;
126 dsysv->Mat(1, 9) = 1.0;
127
128 dsysv->Mat(2, 0) = -1.0;
129 dsysv->Mat(2, 1) = -1.0;
130 dsysv->Mat(2, 2) = 4.0;
131 dsysv->Mat(2, 3) = 0.0;
132 dsysv->Mat(2, 4) = 0.0;
133 dsysv->Mat(2, 5) = -1.0;
134 dsysv->Mat(2, 6) = 0.0;
135 dsysv->Mat(2, 7) = 0.0;
136 dsysv->Mat(2, 8) = -1.0;
137 dsysv->Mat(2, 9) = 1.0;
138
139 dsysv->Mat(3, 0) = -1.0;
140 dsysv->Mat(3, 1) = 0.0;
141 dsysv->Mat(3, 2) = 0.0;
142 dsysv->Mat(3, 3) = 4.0;
143 dsysv->Mat(3, 4) = -1.0;
144 dsysv->Mat(3, 5) = -1.0;
145 dsysv->Mat(3, 6) = -1.0;
146 dsysv->Mat(3, 7) = 0.0;
147 dsysv->Mat(3, 8) = 0.0;
148 dsysv->Mat(3, 9) = 1.0;
149
150 dsysv->Mat(4, 0) = 0.0;
151 dsysv->Mat(4, 1) = -1.0;
152 dsysv->Mat(4, 2) = 0.0;
153 dsysv->Mat(4, 3) = -1.0;
154 dsysv->Mat(4, 4) = 4.0;
155 dsysv->Mat(4, 5) = -1.0;
156 dsysv->Mat(4, 6) = 0.0;
157 dsysv->Mat(4, 7) = -1.0;
158 dsysv->Mat(4, 8) = 0.0;
159 dsysv->Mat(4, 9) = 1.0;
160
161 dsysv->Mat(5, 0) = 0.0;
162 dsysv->Mat(5, 1) = 0.0;
163 dsysv->Mat(5, 2) = -1.0;
164 dsysv->Mat(5, 3) = -1.0;
165 dsysv->Mat(5, 4) = -1.0;
166 dsysv->Mat(5, 5) = 4.0;
167 dsysv->Mat(5, 6) = 0.0;
168 dsysv->Mat(5, 7) = 0.0;
169 dsysv->Mat(5, 8) = -1.0;
170 dsysv->Mat(5, 9) = 1.0;
171
172 dsysv->Mat(6, 0) = -1.0;
173 dsysv->Mat(6, 1) = 0.0;
174 dsysv->Mat(6, 2) = 0.0;
175 dsysv->Mat(6, 3) = -1.0;
176 dsysv->Mat(6, 4) = 0.0;
177 dsysv->Mat(6, 5) = 0.0;
178 dsysv->Mat(6, 6) = 4.0;
179 dsysv->Mat(6, 7) = -1.0;
180 dsysv->Mat(6, 8) = -1.0;
181 dsysv->Mat(6, 9) = 1.0;
182
183 dsysv->Mat(7, 0) = 0.0;
184 dsysv->Mat(7, 1) = -1.0;
185 dsysv->Mat(7, 2) = 0.0;
186 dsysv->Mat(7, 3) = 0.0;
187 dsysv->Mat(7, 4) = -1.0;
188 dsysv->Mat(7, 5) = 0.0;
189 dsysv->Mat(7, 6) = -1.0;
190 dsysv->Mat(7, 7) = 4.0;
191 dsysv->Mat(7, 8) = -1.0;
192 dsysv->Mat(7, 9) = 1.0;
193
194 dsysv->Mat(8, 0) = 0.0;
195 dsysv->Mat(8, 1) = 0.0;
196 dsysv->Mat(8, 2) = -1.0;
197 dsysv->Mat(8, 3) = 0.0;
198 dsysv->Mat(8, 4) = 0.0;
199 dsysv->Mat(8, 5) = -1.0;
200 dsysv->Mat(8, 6) = -1.0;
201 dsysv->Mat(8, 7) = -1.0;
202 dsysv->Mat(8, 8) = 4.0;
203 dsysv->Mat(8, 9) = 1.0;
204
205 dsysv->Mat(9, 0) = 1.0;
206 dsysv->Mat(9, 1) = 1.0;
207 dsysv->Mat(9, 2) = 1.0;
208 dsysv->Mat(9, 3) = 1.0;
209 dsysv->Mat(9, 4) = 1.0;
210 dsysv->Mat(9, 5) = 1.0;
211 dsysv->Mat(9, 6) = 1.0;
212 dsysv->Mat(9, 7) = 1.0;
213 dsysv->Mat(9, 8) = 1.0;
214 dsysv->Mat(9, 9) = 0.0;
215
216
217 dsysv->Rhs(0) = -0.125;
218 dsysv->Rhs(1) = -0.125;
219 dsysv->Rhs(2) = -0.125;
220 dsysv->Rhs(3) = -0.125;
221 dsysv->Rhs(4) = 1.0;
222 dsysv->Rhs(5) = -0.125;
223 dsysv->Rhs(6) = -0.125;
224 dsysv->Rhs(7) = -0.125;
225 dsysv->Rhs(8) = -0.125;
226 dsysv->Rhs(9) = 0.0;
227
228 dsysv->Compute();
229
230 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0625, dsysv->Sol(0), std::numeric_limits<double>::epsilon());
231 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, dsysv->Sol(1), std::numeric_limits<double>::epsilon());
232 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0625, dsysv->Sol(2), std::numeric_limits<double>::epsilon());
233 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, dsysv->Sol(3), std::numeric_limits<double>::epsilon());
234 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.25, dsysv->Sol(4), std::numeric_limits<double>::epsilon());
235 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, dsysv->Sol(5), std::numeric_limits<double>::epsilon());
236 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0625, dsysv->Sol(6), std::numeric_limits<double>::epsilon());
237 CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, dsysv->Sol(7), std::numeric_limits<double>::epsilon());
238 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0625, dsysv->Sol(8), std::numeric_limits<double>::epsilon());
239#endif
240}
241
242void SolverTestSuite::GivensTest()
243{
244 givens->Mat(0, 0) = 1.0;
245 givens->Mat(0, 1) = -4.0;
246 givens->Mat(0, 2) = 0.0;
247 givens->Mat(0, 3) = -5.0;
248 givens->Mat(0, 4) = 0.0;
249
250 givens->Mat(1, 0) = 0.0;
251 givens->Mat(1, 1) = 2.0;
252 givens->Mat(1, 2) = 2.0;
253 givens->Mat(1, 3) = 5.0;
254 givens->Mat(1, 4) = 4.0;
255
256 givens->Mat(2, 0) = 4.0;
257 givens->Mat(2, 1) = -16.0;
258 givens->Mat(2, 2) = 0.0;
259 givens->Mat(2, 3) = -25.0;
260 givens->Mat(2, 4) = 0.0;
261
262 givens->Mat(3, 0) = -1.0;
263 givens->Mat(3, 1) = -2.0;
264 givens->Mat(3, 2) = -4.0;
265 givens->Mat(3, 3) = -5.0;
266 givens->Mat(3, 4) = -8.0;
267
268 givens->Mat(4, 0) = 0.0;
269 givens->Mat(4, 1) = 0.0;
270 givens->Mat(4, 2) = 2.0;
271 givens->Mat(4, 3) = 0.0;
272 givens->Mat(4, 4) = 5.0;
273
274 givens->Rhs(0) = 12.5;
275 givens->Rhs(1) = 8.0;
276 givens->Rhs(2) = -10.0;
277 givens->Rhs(3) = 3.5;
278 givens->Rhs(4) = -16.0;
279
280 givens->Compute();
281
282 CPPUNIT_ASSERT_DOUBLES_EQUAL( 8.5, givens->Sol(0), 1.0e-12);
283 CPPUNIT_ASSERT_DOUBLES_EQUAL(-16.0, givens->Sol(1), 1.0e-12);
284 CPPUNIT_ASSERT_DOUBLES_EQUAL(-18.0, givens->Sol(2), 1.0e-12);
285 CPPUNIT_ASSERT_DOUBLES_EQUAL( 12.0, givens->Sol(3), 1.0e-12);
286 CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.0, givens->Sol(4), 1.0e-12);
287}
Note: See TracBrowser for help on using the repository browser.