26 #ifndef OOMPH_TRILINOS_EIGEN_SOLVER_HEADER
27 #define OOMPH_TRILINOS_EIGEN_SOLVER_HEADER
36 #include "AnasaziOutputManager.hpp"
37 #include "AnasaziBasicOutputManager.hpp"
38 #include "AnasaziConfigDefs.hpp"
39 #include "AnasaziOperator.hpp"
40 #include "AnasaziMultiVec.hpp"
41 #include "AnasaziBasicEigenproblem.hpp"
42 #include "AnasaziBlockKrylovSchurSolMgr.hpp"
56 static Teuchos::RCP<oomph::DoubleMultiVector>
Clone(
64 static Teuchos::RCP<oomph::DoubleMultiVector>
CloneCopy(
74 static Teuchos::RCP<oomph::DoubleMultiVector>
CloneCopy(
82 static Teuchos::RCP<oomph::DoubleMultiVector>
CloneCopy(
113 static Teuchos::RCP<const oomph::DoubleMultiVector>
CloneView(
124 static Teuchos::RCP<oomph::DoubleMultiVector>
CloneView(
135 static Teuchos::RCP<oomph::DoubleMultiVector>
CloneView(
144 return static_cast<int>(mv.
nrow());
150 return static_cast<int>(mv.
nvector());
157 const Teuchos::SerialDenseMatrix<int, double>&
B,
168 int mv_n_vector = mv.
nvector();
169 int A_n_vector =
A.nvector();
171 int n_row_local =
A.nrow_local();
174 for (
int i = 0;
i < n_row_local; ++
i)
176 for (
int j = 0;
j < mv_n_vector;
j++)
179 for (
int k = 0;
k < A_n_vector;
k++)
195 const unsigned n_vector =
A.nvector();
196 const unsigned n_row_local =
A.nrow_local();
197 for (
unsigned v = 0;
v < n_vector;
v++)
199 for (
unsigned i = 0;
i < n_row_local;
i++)
217 const std::vector<double>&
alpha)
219 const unsigned n_vector = mv.
nvector();
221 for (
unsigned v = 0;
v < n_vector;
v++)
223 for (
unsigned i = 0;
i < n_row_local;
i++)
236 Teuchos::SerialDenseMatrix<int, double>&
B)
238 const unsigned A_nvec =
A.nvector();
239 const unsigned A_nrow_local =
A.nrow_local();
240 const unsigned mv_nvec = mv.
nvector();
243 for (
unsigned v1 = 0;
v1 < A_nvec;
v1++)
245 for (
unsigned v2 = 0;
v2 < mv_nvec;
v2++)
248 for (
unsigned i = 0;
i < A_nrow_local;
i++)
258 if (
A.distributed() &&
259 A.distribution_pt()->communicator_pt()->nproc() > 1)
261 const int n_total_val = A_nvec * mv_nvec;
263 double b[n_total_val];
264 double b2[n_total_val];
266 for (
unsigned v1 = 0;
v1 < A_nvec;
v1++)
268 for (
unsigned v2 = 0;
v2 < mv_nvec;
v2++)
271 b2[count] =
b[count];
282 A.distribution_pt()->communicator_pt()->mpi_comm());
285 for (
unsigned v1 = 0;
v1 < A_nvec;
v1++)
287 for (
unsigned v2 = 0;
v2 < mv_nvec;
v2++)
289 B(
v1,
v2) = b2[count];
304 std::vector<double>&
b)
315 std::vector<double>& normvec)
332 const std::vector<int>& index,
336 const unsigned n_index = index.size();
342 for (
unsigned v = 0;
v < n_index;
v++)
344 for (
unsigned i = 0;
i < n_row_local;
i++)
346 mv(index[
v],
i) =
A(
v,
i);
364 const Teuchos::Range1D& index,
368 const unsigned n_index = index.size();
374 unsigned range_index = index.lbound();
375 for (
unsigned v = 0;
v < n_index;
v++)
377 for (
unsigned i = 0;
i < n_row_local;
i++)
379 mv(range_index,
i) =
A(
v,
i);
398 const unsigned n_vector = mv.
nvector();
400 for (
unsigned v = 0;
v < n_vector;
v++)
402 for (
unsigned i = 0;
i < n_row_local;
i++)
404 mv(
v,
i) = Teuchos::ScalarTraits<double>::random();
466 oomph::DoubleMultiVector,
506 const double&
sigma = 0.0)
526 const unsigned n_vec =
x.nvector();
527 const unsigned n_row_local =
x.nrow_local();
545 for (
unsigned i = 0;
i < n_row_local;
i++)
551 for (
unsigned v = 1;
v < n_vec; ++
v)
558 for (
unsigned i = 0;
i < n_row_local;
i++)
574 typedef Teuchos::ScalarTraits<ST>
SCT;
575 typedef SCT::magnitudeType
MT;
576 typedef Anasazi::MultiVec<ST>
MV;
577 typedef Anasazi::Operator<ST>
OP;
578 typedef Anasazi::MultiVecTraits<ST, MV>
MVT;
579 typedef Anasazi::OperatorTraits<ST, MV, OP>
OPT;
622 Anasazi::Warnings + Anasazi::FinalSummary + Anasazi::TimingDetails;
627 << Anasazi::Anasazi_Version() << std::endl
664 Vector<std::complex<double>>& eigenvalue,
674 Teuchos::RCP<DoubleMultiVector> initial = Teuchos::rcp(
676 Anasazi::MultiVecTraits<double, DoubleMultiVector>::MvRandom(*initial);
679 Teuchos::RCP<DoubleMultiVectorOperator> Op_pt =
684 Teuchos::RCP<Anasazi::BasicEigenproblem<
double,
687 anasazi_pt = Teuchos::rcp(
688 new Anasazi::BasicEigenproblem<
double,
694 anasazi_pt->setHermitian(
false);
697 anasazi_pt->setNEV(n_eval);
700 if (anasazi_pt->setProblem() !=
true)
702 oomph_info <<
"Anasazi::BasicEigenproblem::setProblem() had an error."
704 <<
"End Result: TEST FAILED" << std::endl;
712 Anasazi::Warnings + Anasazi::FinalSummary + Anasazi::TimingDetails;
714 Teuchos::ParameterList MyPL;
715 MyPL.set(
"Which",
"LM");
716 MyPL.set(
"Block Size", 1);
718 MyPL.set(
"Maximum Restarts", 500);
719 MyPL.set(
"Orthogonalization",
"DGKS");
720 MyPL.set(
"Verbosity", verbosity);
721 MyPL.set(
"Convergence Tolerance", tol);
722 Anasazi::BlockKrylovSchurSolMgr<
double,
725 BKS(anasazi_pt, MyPL);
728 Anasazi::ReturnType
ret = BKS.solve();
729 bool testFailed =
false;
730 if (
ret != Anasazi::Converged)
741 Anasazi::Eigensolution<double, DoubleMultiVector> sol =
742 anasazi_pt->getSolution();
743 std::vector<Anasazi::Value<double>> evals = sol.Evals;
744 Teuchos::RCP<DoubleMultiVector> evecs = sol.Evecs;
746 eigenvalue.resize(evals.size());
747 eigenvector.resize(evals.size());
749 for (
unsigned i = 0;
i < evals.size();
i++)
752 double a = evals[
i].realpart;
753 double b = evals[
i].imagpart;
754 double det =
a *
a +
b *
b;
755 eigenvalue[
i] = std::complex<double>(
a / det +
Sigma, -
b / det);
758 eigenvector[
i].build(evecs->distribution_pt());
763 eigenvector[
i][
n] = (*evecs)(
i,
n);
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
Map< RowVectorXf > v2(M2.data(), M2.size())
M1<< 1, 2, 3, 4, 5, 6, 7, 8, 9;Map< RowVectorXf > v1(M1.data(), M1.size())
Scalar * b
Definition: benchVecAdd.cpp:17
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:49
Matrix< SCALARB, Dynamic, Dynamic, opt_B > B
Definition: bench_gemm.cpp:48
static Teuchos::RCP< oomph::DoubleMultiVector > CloneCopy(const oomph::DoubleMultiVector &mv)
Creates a deep copy of the DoubleMultiVector mv return Reference-counted pointer to the new DoubleMul...
Definition: trilinos_eigen_solver.h:64
static int GetVecLength(const oomph::DoubleMultiVector &mv)
Obtain the global length of the vector.
Definition: trilinos_eigen_solver.h:142
static Teuchos::RCP< oomph::DoubleMultiVector > CloneCopy(const oomph::DoubleMultiVector &mv, const std::vector< int > &index)
Creates a new oomph::DoubleMultiVector and (deep) copies the contents of the vectors in index into th...
Definition: trilinos_eigen_solver.h:74
static void MvTransMv(const double alpha, const oomph::DoubleMultiVector &A, const oomph::DoubleMultiVector &mv, Teuchos::SerialDenseMatrix< int, double > &B)
Compute a dense matrix B through the matrix-matrix multiply .
Definition: trilinos_eigen_solver.h:233
static void MvTimesMatAddMv(const double alpha, const oomph::DoubleMultiVector &A, const Teuchos::SerialDenseMatrix< int, double > &B, const double beta, oomph::DoubleMultiVector &mv)
Update mv with .
Definition: trilinos_eigen_solver.h:154
static void MvPrint(const oomph::DoubleMultiVector &mv, std::ostream &os)
Print the mv multi-vector to the os output stream.
Definition: trilinos_eigen_solver.h:425
static Teuchos::RCP< oomph::DoubleMultiVector > CloneView(oomph::DoubleMultiVector &mv, const Teuchos::Range1D &index)
Creates a new oomph::DoubleMultiVector that contains shallow copies of selected entries of the oomph:...
Definition: trilinos_eigen_solver.h:135
static void SetBlock(const oomph::DoubleMultiVector &A, const Teuchos::Range1D &index, oomph::DoubleMultiVector &mv)
Deep copy of A into specified columns of mv.
Definition: trilinos_eigen_solver.h:363
static Teuchos::RCP< oomph::DoubleMultiVector > CloneViewNonConst(oomph::DoubleMultiVector &mv, const std::vector< int > &index)
Creates a new oomph::DoubleMultiVector that contains shallow copies of selected entries of the oomph:...
Definition: trilinos_eigen_solver.h:92
static void MvScale(oomph::DoubleMultiVector &mv, const std::vector< double > &alpha)
Scale each element of the i-th vector in mv with alpha[i].
Definition: trilinos_eigen_solver.h:216
static void MvScale(oomph::DoubleMultiVector &mv, const double alpha)
Scale each element of the vectors in mv with alpha.
Definition: trilinos_eigen_solver.h:208
static Teuchos::RCP< const oomph::DoubleMultiVector > CloneView(const oomph::DoubleMultiVector &mv, const std::vector< int > &index)
Creates a new oomph::DoubleMultiVector that contains shallow copies of selected entries of the oomph:...
Definition: trilinos_eigen_solver.h:113
static void MvAddMv(const double alpha, const oomph::DoubleMultiVector &A, const double beta, const oomph::DoubleMultiVector &B, oomph::DoubleMultiVector &mv)
Replace mv with .
Definition: trilinos_eigen_solver.h:189
static Teuchos::RCP< oomph::DoubleMultiVector > Clone(const oomph::DoubleMultiVector &mv, const int numvecs)
Creates a new empty DoubleMultiVector containing numvecs columns. Return a reference-counted pointer ...
Definition: trilinos_eigen_solver.h:56
static int GetNumberVecs(const oomph::DoubleMultiVector &mv)
Obtain the number of vectors in the multivector.
Definition: trilinos_eigen_solver.h:148
static void SetBlock(const oomph::DoubleMultiVector &A, const std::vector< int > &index, oomph::DoubleMultiVector &mv)
Copy the vectors in A to a set of vectors in mv indicated by the indices given in index.
Definition: trilinos_eigen_solver.h:331
static Teuchos::RCP< oomph::DoubleMultiVector > CloneViewNonConst(oomph::DoubleMultiVector &mv, const Teuchos::Range1D &index)
Creates a new oomph::DoubleMultiVector that contains shallow copies of selected entries of the oomph:...
Definition: trilinos_eigen_solver.h:102
static void MvNorm(const oomph::DoubleMultiVector &mv, std::vector< double > &normvec)
Compute the 2-norm of each individual vector of mv. Upon return, normvec[i] holds the value of ,...
Definition: trilinos_eigen_solver.h:314
static Teuchos::RCP< oomph::DoubleMultiVector > CloneView(oomph::DoubleMultiVector &mv, const std::vector< int > &index)
Creates a new oomph::DoubleMultiVector that contains shallow copies of selected entries of the oomph:...
Definition: trilinos_eigen_solver.h:124
static void MvDot(const oomph::DoubleMultiVector &mv, const oomph::DoubleMultiVector &A, std::vector< double > &b)
Compute a vector b where the components are the individual dot-products of the i-th columns of A and ...
Definition: trilinos_eigen_solver.h:302
static void MvRandom(oomph::DoubleMultiVector &mv)
Replace the vectors in mv with random vectors.
Definition: trilinos_eigen_solver.h:396
static Teuchos::RCP< oomph::DoubleMultiVector > CloneCopy(const oomph::DoubleMultiVector &mv, const Teuchos::Range1D &index)
Deep copy of specified columns of oomph::DoubleMultiVector return Reference-counted pointer to the ne...
Definition: trilinos_eigen_solver.h:82
static void MvInit(oomph::DoubleMultiVector &mv, const double alpha=Teuchos::ScalarTraits< double >::zero())
Replace each element of the vectors in mv with alpha.
Definition: trilinos_eigen_solver.h:411
static void Assign(const oomph::DoubleMultiVector &A, oomph::DoubleMultiVector &mv)
mv := A
Definition: trilinos_eigen_solver.h:388
static void Apply(const oomph::DoubleMultiVectorOperator &Op, const oomph::DoubleMultiVector &x, oomph::DoubleMultiVector &y)
Matrix operator application method.
Definition: trilinos_eigen_solver.h:471
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Class for the Anasazi eigensolver.
Definition: trilinos_eigen_solver.h:571
void track_eigenvalue_magnitude()
Set the magnitude to be the quantity of interest.
Definition: trilinos_eigen_solver.h:793
LinearSolver * Default_linear_solver_pt
Pointer to a default linear solver.
Definition: trilinos_eigen_solver.h:588
Anasazi::OutputManager< ST > * Output_manager_pt
Pointer to output manager.
Definition: trilinos_eigen_solver.h:582
Teuchos::ScalarTraits< ST > SCT
Definition: trilinos_eigen_solver.h:574
void get_eigenvalues_right_of_shift()
Set the desired eigenvalues to be right of the shift.
Definition: trilinos_eigen_solver.h:775
int Spectrum
Definition: trilinos_eigen_solver.h:593
Anasazi::OperatorTraits< ST, MV, OP > OPT
Definition: trilinos_eigen_solver.h:579
virtual ~ANASAZI()
Destructor, delete the linear solver.
Definition: trilinos_eigen_solver.h:635
bool Compute_eigenvectors
Boolean to indicate whether or not to compute the eigenvectors.
Definition: trilinos_eigen_solver.h:606
int NArnoldi
Number of Arnoldi vectors to compute.
Definition: trilinos_eigen_solver.h:596
LinearSolver * Linear_solver_pt
Pointer to a linear solver.
Definition: trilinos_eigen_solver.h:585
int & narnoldi()
Access function for the number of Arnoldi vectors.
Definition: trilinos_eigen_solver.h:638
const int & narnoldi() const
Access function for the number of Arnoldi vectors (const version)
Definition: trilinos_eigen_solver.h:644
double ST
Definition: trilinos_eigen_solver.h:573
double Sigma
Set the shifted value.
Definition: trilinos_eigen_solver.h:599
void disable_compute_eigenvectors()
Set to disable the computation of the eigenvectors.
Definition: trilinos_eigen_solver.h:656
LinearSolver *const & linear_solver_pt() const
Return a pointer to the linear solver object (const version)
Definition: trilinos_eigen_solver.h:805
void track_eigenvalue_real_part()
Set the real part to be the quantity of interest (default)
Definition: trilinos_eigen_solver.h:781
SCT::magnitudeType MT
Definition: trilinos_eigen_solver.h:575
void get_eigenvalues_left_of_shift()
Set the desired eigenvalues to be left of the shift.
Definition: trilinos_eigen_solver.h:769
Anasazi::MultiVec< ST > MV
Definition: trilinos_eigen_solver.h:576
void enable_compute_eigenvectors()
Set to enable the computation of the eigenvectors (default)
Definition: trilinos_eigen_solver.h:650
void track_eigenvalue_imaginary_part()
Set the imaginary part fo the quantity of interest.
Definition: trilinos_eigen_solver.h:787
Anasazi::MultiVecTraits< ST, MV > MVT
Definition: trilinos_eigen_solver.h:578
bool Small
Definition: trilinos_eigen_solver.h:603
ANASAZI(const ANASAZI &)
Empty copy constructor.
Definition: trilinos_eigen_solver.h:632
Anasazi::Operator< ST > OP
Definition: trilinos_eigen_solver.h:577
LinearSolver *& linear_solver_pt()
Return a pointer to the linear solver object.
Definition: trilinos_eigen_solver.h:799
void solve_eigenproblem(Problem *const &problem_pt, const int &n_eval, Vector< std::complex< double >> &eigenvalue, Vector< DoubleVector > &eigenvector)
Solve the eigen problem.
Definition: trilinos_eigen_solver.h:662
ANASAZI()
Constructor.
Definition: trilinos_eigen_solver.h:611
Definition: matrices.h:888
void multiply(const DoubleVector &x, DoubleVector &soln) const
Multiply the matrix by the vector x: soln=Ax.
Definition: matrices.cc:1782
unsigned nrow() const
access function to the number of global rows.
Definition: linear_algebra_distribution.h:463
unsigned nrow_local() const
access function for the num of local rows on this processor.
Definition: linear_algebra_distribution.h:469
Definition: trilinos_eigen_solver.h:443
DoubleMultiVectorOperator()
Empty constructor.
Definition: trilinos_eigen_solver.h:446
virtual ~DoubleMultiVectorOperator()
virtual destructor
Definition: trilinos_eigen_solver.h:449
virtual void apply(const DoubleMultiVector &x, DoubleMultiVector &y) const =0
The apply interface.
Definition: double_multi_vector.h:56
void output(std::ostream &outfile) const
output the contents of the vector
Definition: double_multi_vector.h:704
void initialise(const double &initial_value)
initialise the whole vector with value v
Definition: double_multi_vector.h:364
void dot(const DoubleMultiVector &vec, std::vector< double > &result) const
compute the 2 norm of this vector
Definition: double_multi_vector.h:809
void norm(std::vector< double > &result) const
compute the 2 norm of this vector
Definition: double_multi_vector.h:889
unsigned nvector() const
Return the number of vectors.
Definition: double_multi_vector.h:211
Definition: double_vector.h:58
Definition: eigen_solver.h:61
double Sigma_real
Definition: eigen_solver.h:65
Definition: linear_solver.h:68
virtual void solve(Problem *const &problem_pt, DoubleVector &result)=0
virtual void enable_resolve()
Definition: linear_solver.h:135
virtual void resolve(const DoubleVector &rhs, DoubleVector &result)
Definition: linear_solver.h:225
void disable_doc_time()
Disable documentation of solve times.
Definition: linear_solver.h:116
Definition: matrices.h:74
Class for the shift invert operation.
Definition: trilinos_eigen_solver.h:489
double Sigma
Definition: trilinos_eigen_solver.h:498
void apply(const DoubleMultiVector &x, DoubleMultiVector &y) const
The apply interface.
Definition: trilinos_eigen_solver.h:524
ProblemBasedShiftInvertOperator(Problem *const &problem_pt, LinearSolver *const &linear_solver_pt, const double &sigma=0.0)
Definition: trilinos_eigen_solver.h:504
CRDoubleMatrix * AsigmaM_pt
Definition: trilinos_eigen_solver.h:501
LinearSolver * Linear_solver_pt
Definition: trilinos_eigen_solver.h:495
CRDoubleMatrix * M_pt
Definition: trilinos_eigen_solver.h:501
Problem * Problem_pt
Definition: trilinos_eigen_solver.h:492
Definition: problem.h:151
LinearAlgebraDistribution *const & dof_distribution_pt() const
Return the pointer to the dof distribution (read-only)
Definition: problem.h:1668
virtual void get_eigenproblem_matrices(CRDoubleMatrix &mass_matrix, CRDoubleMatrix &main_matrix, const double &shift=0.0)
Definition: problem.cc:8368
LinearSolver *& linear_solver_pt()
Return a pointer to the linear solver object.
Definition: problem.h:1466
Definition: oomph-lib/src/generic/Vector.h:58
#define X
Definition: icosphere.cpp:20
Scalar * y
Definition: level1_cplx_impl.h:128
Eigen::DenseIndex ret
Definition: level1_cplx_impl.h:43
RealScalar alpha
Definition: level1_cplx_impl.h:151
const Scalar * a
Definition: level2_cplx_impl.h:32
Scalar beta
Definition: level2_cplx_impl.h:36
char char char int int * k
Definition: level2_impl.h:374
Definition: trilinos_eigen_solver.h:45
int sigma
Definition: calibrate.py:179
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
list x
Definition: plotDoE.py:28
EIGEN_DONT_INLINE Scalar zero()
Definition: svd_common.h:232
const char Y
Definition: test/EulerAngles.cpp:32
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2