107 #ifdef LIBMESH_USE_REAL_NUMBERS 118 const unsigned N = A.
m();
125 for (
unsigned eigenval=0; eigenval<N; ++eigenval)
128 if (
std::abs(lambda_imag(eigenval)) < tol*tol)
132 for (
unsigned i=0; i<N; ++i)
134 rhs(i) = lambda_real(eigenval) * VL(i, eigenval);
135 for (
unsigned j=0; j<N; ++j)
136 lhs(i) += A(j, i) * VL(j, eigenval);
142 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
159 for (
unsigned i=0; i<N; ++i)
161 rhs(i) = lambda_real(eigenval) * VL(i, eigenval) + lambda_imag(eigenval) * VL(i, eigenval+1);
162 for (
unsigned j=0; j<N; ++j)
163 lhs(i) += A(j, i) * VL(j, eigenval);
167 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
178 for (
unsigned i=0; i<N; ++i)
180 rhs(i) = -lambda_imag(eigenval) * VL(i, eigenval) + lambda_real(eigenval) * VL(i, eigenval+1);
181 for (
unsigned j=0; j<N; ++j)
182 lhs(i) += A(j, i) * VL(j, eigenval+1);
186 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
206 for (
unsigned eigenval=0; eigenval<N; ++eigenval)
209 if (
std::abs(lambda_imag(eigenval)) < tol*tol)
213 for (
unsigned i=0; i<N; ++i)
215 rhs(i) = lambda_real(eigenval) * VR(i, eigenval);
216 for (
unsigned j=0; j<N; ++j)
217 lhs(i) += A(i, j) * VR(j, eigenval);
221 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
238 for (
unsigned i=0; i<N; ++i)
240 rhs(i) = lambda_real(eigenval) * VR(i, eigenval) - lambda_imag(eigenval) * VR(i, eigenval+1);
241 for (
unsigned j=0; j<N; ++j)
242 lhs(i) += A(i, j) * VR(j, eigenval);
246 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
251 for (
unsigned i=0; i<N; ++i)
253 rhs(i) = lambda_imag(eigenval) * VR(i, eigenval) + lambda_real(eigenval) * VR(i, eigenval+1);
254 for (
unsigned j=0; j<N; ++j)
255 lhs(i) += A(i, j) * VR(j, eigenval+1);
259 LIBMESH_ASSERT_FP_EQUAL(0., lhs.l2_norm(),
std::sqrt(tol)*tol);
273 std::sort(true_lambda_real.begin(), true_lambda_real.end());
274 std::sort(true_lambda_imag.begin(), true_lambda_imag.end());
277 for (
unsigned i=0; i<lambda_real.
size(); ++i)
284 LIBMESH_ASSERT_FP_EQUAL(true_lambda_real[i], lambda_real(i),
std::sqrt(tol)*tol);
285 LIBMESH_ASSERT_FP_EQUAL(true_lambda_imag[i], lambda_imag(i),
std::sqrt(tol)*tol);
std::vector< T > & get_values()
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...
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
virtual unsigned int size() const override final
Defines a dense vector for use in Finite Element-type computations.