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"
51 class MultiVecTraits<double,
oomph::DoubleMultiVector>
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(
125 static Teuchos::RCP<oomph::DoubleMultiVector>
CloneView(
136 static Teuchos::RCP<oomph::DoubleMultiVector>
CloneView(
145 return static_cast<int>(mv.
nrow());
152 return static_cast<ptrdiff_t
>(mv.
nrow());
158 return static_cast<int>(mv.
nvector());
165 const Teuchos::SerialDenseMatrix<int, double>& B,
176 int mv_n_vector = mv.
nvector();
182 for (
int i = 0;
i < n_row_local; ++
i)
184 for (
int j = 0; j < mv_n_vector; j++)
187 for (
int k = 0; k < A_n_vector; k++)
189 res += C(k,
i) * B(k, j);
203 const unsigned n_vector = A.
nvector();
205 for (
unsigned v = 0; v < n_vector; v++)
207 for (
unsigned i = 0;
i < n_row_local;
i++)
209 mv(v,
i) = alpha * A(v,
i) + beta * B(v,
i);
225 const std::vector<double>& alpha)
227 const unsigned n_vector = mv.
nvector();
229 for (
unsigned v = 0; v < n_vector; v++)
231 for (
unsigned i = 0;
i < n_row_local;
i++)
233 mv(v,
i) *= alpha[v];
244 Teuchos::SerialDenseMatrix<int, double>& B)
246 const unsigned A_nvec = A.
nvector();
248 const unsigned mv_nvec = mv.
nvector();
251 for (
unsigned v1 = 0; v1 < A_nvec; v1++)
253 for (
unsigned v2 = 0; v2 < mv_nvec; v2++)
256 for (
unsigned i = 0;
i < A_nrow_local;
i++)
258 B(v1, v2) += A(v1,
i) * mv(v2,
i);
269 const int n_total_val = A_nvec * mv_nvec;
271 double b[n_total_val];
272 double b2[n_total_val];
274 for (
unsigned v1 = 0; v1 < A_nvec; v1++)
276 for (
unsigned v2 = 0; v2 < mv_nvec; v2++)
278 b[count] = B(v1, v2);
279 b2[count] = b[count];
293 for (
unsigned v1 = 0; v1 < A_nvec; v1++)
295 for (
unsigned v2 = 0; v2 < mv_nvec; v2++)
297 B(v1, v2) = b2[count];
312 std::vector<double>& b)
323 std::vector<double>& normvec)
340 const std::vector<int>& index,
344 const unsigned n_index = index.size();
350 for (
unsigned v = 0; v < n_index; v++)
352 for (
unsigned i = 0;
i < n_row_local;
i++)
354 mv(index[v],
i) = A(v,
i);
372 const Teuchos::Range1D& index,
376 const unsigned n_index = index.size();
382 unsigned range_index = index.lbound();
383 for (
unsigned v = 0; v < n_index; v++)
385 for (
unsigned i = 0;
i < n_row_local;
i++)
387 mv(range_index,
i) = A(v,
i);
406 const unsigned n_vector = mv.
nvector();
408 for (
unsigned v = 0; v < n_vector; v++)
410 for (
unsigned i = 0;
i < n_row_local;
i++)
412 mv(v,
i) = Teuchos::ScalarTraits<double>::random();
421 const double alpha = Teuchos::ScalarTraits<double>::zero())
440#ifdef HAVE_ANASAZI_TSQR
489 class OperatorTraits<double,
490 oomph::DoubleMultiVector,
530 const double& sigma = 0.0)
580 for (
unsigned v = 1;
v <
n_vec; ++
v)
621 const double& sigma = 0.0)
669 for (
unsigned v = 1;
v <
n_vec; ++
v)
690 typedef Teuchos::ScalarTraits<ST>
SCT;
691 typedef SCT::magnitudeType
MT;
692 typedef Anasazi::MultiVec<ST>
MV;
693 typedef Anasazi::Operator<ST>
OP;
694 typedef Anasazi::MultiVecTraits<ST, MV>
MVT;
695 typedef Anasazi::OperatorTraits<ST, MV, OP>
OPT;
739 << Anasazi::Anasazi_Version() << std::endl
790 Vector<std::complex<double>>& alpha,
804 unsigned n = eigenvalue.
size();
807 for (
unsigned i = 0;
i <
n;
i++)
809 alpha[
i] = eigenvalue[
i];
817 Vector<std::complex<double>>& eigenvalue,
830 Teuchos::RCP<DoubleMultiVector>
initial =
832 Anasazi::MultiVecTraits<double, DoubleMultiVector>::MvRandom(*
initial);
835 Teuchos::RCP<DoubleMultiVectorOperator>
Op_pt;
848 Teuchos::RCP<Anasazi::BasicEigenproblem<
double,
852 new Anasazi::BasicEigenproblem<
double,
866 oomph_info <<
"Anasazi::BasicEigenproblem::setProblem() had an error."
868 <<
"End Result: TEST FAILED" << std::endl;
883 Teuchos::ParameterList
MyPL;
884 MyPL.set(
"Which",
"LM");
885 MyPL.set(
"Block Size", 1);
887 MyPL.set(
"Maximum Restarts", 500);
888 MyPL.set(
"Orthogonalization",
"DGKS");
890 MyPL.set(
"Convergence Tolerance",
tol);
891 Anasazi::BlockKrylovSchurSolMgr<
double,
897 Anasazi::ReturnType
ret =
BKS.solve();
898 if (
ret != Anasazi::Converged)
900 std::string error_message =
"Eigensolver did not converge!\n";
908 Anasazi::Eigensolution<double, DoubleMultiVector>
sol =
910 std::vector<Anasazi::Value<double>>
evals =
sol.Evals;
911 Teuchos::RCP<DoubleMultiVector>
evecs =
sol.Evecs;
930 double a =
evals[
i].realpart;
931 double b =
evals[
i].imagpart;
932 double det = a * a + b * b;
988 oomph_info <<
"Never get here: index_vector[ " <<
i
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:...
static int GetVecLength(const oomph::DoubleMultiVector &mv)
Obtain the global length of the vector.
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...
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...
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:...
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:...
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 .
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 .
static void MvPrint(const oomph::DoubleMultiVector &mv, std::ostream &os)
Print the mv multi-vector to the os output stream.
Anasazi::details::StubTsqrAdapter< MV > tsqr_adaptor_type
TsqrAdaptor specialization for the multivector type MV.
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...
static void SetBlock(const oomph::DoubleMultiVector &A, const Teuchos::Range1D &index, oomph::DoubleMultiVector &mv)
Deep copy of A into specified columns of mv.
static void MvScale(oomph::DoubleMultiVector &mv, const std::vector< double > &alpha)
Scale each element of the i-th vector in mv with alpha[i].
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:...
static void MvScale(oomph::DoubleMultiVector &mv, const double alpha)
Scale each element of the vectors in mv with alpha.
static ptrdiff_t GetGlobalLength(const oomph::DoubleMultiVector &mv)
Return the number of rows in the given multivector. NOTE: Trilinos 13.4.0 uses GetGlobalLength instea...
static void MvAddMv(const double alpha, const oomph::DoubleMultiVector &A, const double beta, const oomph::DoubleMultiVector &B, oomph::DoubleMultiVector &mv)
Replace mv with .
static int GetNumberVecs(const oomph::DoubleMultiVector &mv)
Obtain the number of vectors in the multivector.
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.
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 ,...
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 ...
static void MvRandom(oomph::DoubleMultiVector &mv)
Replace the vectors in mv with random vectors.
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:...
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 ...
static void MvInit(oomph::DoubleMultiVector &mv, const double alpha=Teuchos::ScalarTraits< double >::zero())
Replace each element of the vectors in mv with alpha.
static void Assign(const oomph::DoubleMultiVector &A, oomph::DoubleMultiVector &mv)
mv := A
static void Apply(const oomph::DoubleMultiVectorOperator &Op, const oomph::DoubleMultiVector &x, oomph::DoubleMultiVector &y)
Matrix operator application method.
Class for the Anasazi eigensolver.
LinearSolver * Default_linear_solver_pt
Pointer to a default linear solver.
Anasazi::OutputManager< ST > * Output_manager_pt
Pointer to output manager.
Teuchos::ScalarTraits< ST > SCT
Anasazi::OperatorTraits< ST, MV, OP > OPT
virtual ~ANASAZI()
Destructor, delete the linear solver.
void solve_eigenproblem(Problem *const &problem_pt, const int &n_eval, Vector< std::complex< double > > &eigenvalue, Vector< DoubleVector > &eigenvector_real, Vector< DoubleVector > &eigenvector_imag, const bool &do_adjoint_problem)
Solve the eigen problem.
void solve_eigenproblem(Problem *const &problem_pt, const int &n_eval, Vector< std::complex< double > > &alpha, Vector< double > &beta, Vector< DoubleVector > &eigenvector_real, Vector< DoubleVector > &eigenvector_imag, const bool &do_adjoint_problem)
Solve the real eigenproblem that is assembled by elements in a mesh in a Problem object....
LinearSolver * Linear_solver_pt
Pointer to a linear solver.
LinearSolver *& linear_solver_pt()
Return a pointer to the linear solver object.
Anasazi::MultiVec< ST > MV
Anasazi::MultiVecTraits< ST, MV > MVT
ANASAZI(const ANASAZI &)
Empty copy constructor.
LinearSolver *const & linear_solver_pt() const
Return a pointer to the linear solver object (const version)
Anasazi::Operator< ST > OP
Class for the adjoing problem shift invert operation.
CRDoubleMatrix * AsigmaM_pt
Problem * Problem_pt
Pointer to the problem.
AdjointProblemBasedShiftInvertOperator(Problem *const &problem_pt, LinearSolver *const &linear_solver_pt, const double &sigma=0.0)
void apply(const DoubleMultiVector &x, DoubleMultiVector &y) const
Now specify how to apply the operator.
double Sigma
Storage for the shift.
LinearSolver * Linear_solver_pt
Pointer to the linear solver used.
CRDoubleMatrix * M_pt
Storage for the matrices.
A class for compressed row matrices. This is a distributable object.
void multiply(const DoubleVector &x, DoubleVector &soln) const
Multiply the matrix by the vector x: soln=Ax.
void get_matrix_transpose(CRDoubleMatrix *result) const
Returns the transpose of this matrix.
bool distributed() const
distribution is serial or distributed
unsigned nrow() const
access function to the number of global rows.
unsigned nrow_local() const
access function for the num of local rows on this processor.
LinearAlgebraDistribution * distribution_pt() const
access to the LinearAlgebraDistribution
Base class for Oomph-lib's Vector Operator classes that will be used with the DoubleMultiVector.
DoubleMultiVectorOperator()
Empty constructor.
virtual ~DoubleMultiVectorOperator()
virtual destructor
virtual void apply(const DoubleMultiVector &x, DoubleMultiVector &y) const =0
The apply interface.
A multi vector in the mathematical sense, initially developed for linear algebra type applications....
void output(std::ostream &outfile) const
output the contents of the vector
void initialise(const double &initial_value)
initialise the whole vector with value v
void dot(const DoubleMultiVector &vec, std::vector< double > &result) const
compute the 2 norm of this vector
void norm(std::vector< double > &result) const
compute the 2 norm of this vector
unsigned nvector() const
Return the number of vectors.
DoubleVector & doublevector(const unsigned &i)
access to the DoubleVector representatoin
A vector in the mathematical sense, initially developed for linear algebra type applications....
Base class for all EigenProblem solves. This simply defines standard interfaces so that different sol...
double Sigma_real
Double value that represents the real part of the shift in shifted eigensolvers.
double size() const
Calculate the size of the element (length, area, volume,...) in Eulerian computational coordinates....
Describes the distribution of a distributable linear algebra type object. Typically this is a contain...
OomphCommunicator * communicator_pt() const
const access to the communicator pointer
Base class for all linear solvers. This merely defines standard interfaces for linear solvers,...
virtual void solve(Problem *const &problem_pt, DoubleVector &result)=0
Solver: Takes pointer to problem and returns the results vector which contains the solution of the li...
virtual void enable_resolve()
Enable resolve (i.e. store matrix and/or LU decomposition, say) Virtual so it can be overloaded to pe...
virtual void resolve(const DoubleVector &rhs, DoubleVector &result)
Resolve the system defined by the last assembled jacobian and the rhs vector. Solution is returned in...
void disable_doc_time()
Disable documentation of solve times.
An OomphLibError object which should be thrown when an run-time error is encountered....
Class for the shift invert operation.
void apply(const DoubleMultiVector &x, DoubleMultiVector &y) const
The apply interface.
ProblemBasedShiftInvertOperator(Problem *const &problem_pt, LinearSolver *const &linear_solver_pt, const double &sigma=0.0)
CRDoubleMatrix * AsigmaM_pt
LinearSolver * Linear_solver_pt
////////////////////////////////////////////////////////////////// //////////////////////////////////...
virtual void get_eigenproblem_matrices(CRDoubleMatrix &mass_matrix, CRDoubleMatrix &main_matrix, const double &shift=0.0)
Get the matrices required by a eigensolver. If the shift parameter is non-zero the second matrix will...
LinearAlgebraDistribution *const & dof_distribution_pt() const
Return the pointer to the dof distribution (read-only)
void create_new_linear_algebra_distribution(LinearAlgebraDistribution *&dist_pt)
Get new linear algebra distribution (you're in charge of deleting it!)
LinearSolver *& linear_solver_pt()
Return a pointer to the linear solver object.
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
A slight extension to the standard template vector class so that we can include "graceful" array rang...
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
OomphInfo oomph_info
Single (global) instantiation of the OomphInfo object – this is used throughout the library as a "rep...