169 {
170
171
172
173#ifdef LIBMESH_USE_REAL_NUMBERS
174
175
177
182
183
184 const unsigned N = A.
m();
185
186
187
188
189
190
191 for (unsigned eigenval=0; eigenval<N; ++eigenval)
192 {
193
194 if (std::abs(lambda_imag(eigenval)) < tol*tol)
195 {
196
198 for (unsigned i=0; i<N; ++i)
199 {
200 rhs(i) = lambda_real(eigenval) * VL(i, eigenval);
201 for (unsigned j=0; j<N; ++j)
202 lhs(i) += A(j, i) * VL(j, eigenval);
203 }
204
205
206
207 lhs -= rhs;
208 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
209 }
210 else
211 {
212
213
214
215
216
217
218
219
220
221
222
223
225 for (unsigned i=0; i<N; ++i)
226 {
227 rhs(i) = lambda_real(eigenval) * VL(i, eigenval) + lambda_imag(eigenval) * VL(i, eigenval+1);
228 for (unsigned j=0; j<N; ++j)
229 lhs(i) += A(j, i) * VL(j, eigenval);
230 }
231
232 lhs -= rhs;
233 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
234
235
236
237
238
239
240
241
242 lhs.zero();
243 rhs.zero();
244 for (unsigned i=0; i<N; ++i)
245 {
246 rhs(i) = -lambda_imag(eigenval) * VL(i, eigenval) + lambda_real(eigenval) * VL(i, eigenval+1);
247 for (unsigned j=0; j<N; ++j)
248 lhs(i) += A(j, i) * VL(j, eigenval+1);
249 }
250
251 lhs -= rhs;
252 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
253
254
255
256
257
258
259
260
261
262
263 eigenval += 1;
264 }
265 }
266
267
268
269
270
271
272 for (unsigned eigenval=0; eigenval<N; ++eigenval)
273 {
274
275 if (std::abs(lambda_imag(eigenval)) < tol*tol)
276 {
277
279 for (unsigned i=0; i<N; ++i)
280 {
281 rhs(i) = lambda_real(eigenval) * VR(i, eigenval);
282 for (unsigned j=0; j<N; ++j)
283 lhs(i) += A(i, j) * VR(j, eigenval);
284 }
285
286 lhs -= rhs;
287 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
288 }
289 else
290 {
291
292
293
294
295
296
297
298
299
300
301
302
304 for (unsigned i=0; i<N; ++i)
305 {
306 rhs(i) = lambda_real(eigenval) * VR(i, eigenval) - lambda_imag(eigenval) * VR(i, eigenval+1);
307 for (unsigned j=0; j<N; ++j)
308 lhs(i) += A(i, j) * VR(j, eigenval);
309 }
310
311 lhs -= rhs;
312 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
313
314
315 lhs.zero();
316 rhs.zero();
317 for (unsigned i=0; i<N; ++i)
318 {
319 rhs(i) = lambda_imag(eigenval) * VR(i, eigenval) + lambda_real(eigenval) * VR(i, eigenval+1);
320 for (unsigned j=0; j<N; ++j)
321 lhs(i) += A(i, j) * VR(j, eigenval+1);
322 }
323
324 lhs -= rhs;
325 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(), std::sqrt(tol)*tol);
326
327
328
329
330 eigenval += 1;
331 }
332 }
333
334
337
338
339 std::sort(true_lambda_real.begin(), true_lambda_real.end());
340 std::sort(true_lambda_imag.begin(), true_lambda_imag.end());
341
342
343 for (
unsigned i=0; i<lambda_real.
size(); ++i)
344 {
345
346
347
348
349
350 LIBMESH_ASSERT_FP_EQUAL(true_lambda_real[i], lambda_real(i), std::sqrt(tol)*tol);
351 LIBMESH_ASSERT_FP_EQUAL(true_lambda_imag[i], lambda_imag(i), std::sqrt(tol)*tol);
352 }
353#endif
354 }
void evd_left_and_right(DenseVector< T > &lambda_real, DenseVector< T > &lambda_imag, DenseMatrix< T > &VL, DenseMatrix< T > &VR)
Compute the eigenvalues (both real and imaginary parts) as well as the left and right eigenvectors of...
std::vector< T > & get_values()