4#ifndef TRILINOS_LINEAR_SOLVER_H
5#define TRILINOS_LINEAR_SOLVER_H
23#include "Teuchos_RCP.hpp"
24#include "Teuchos_DefaultComm.hpp"
25#include <Teuchos_Time.hpp>
27#include "Kokkos_Core.hpp"
28#include "Tpetra_KokkosCompat_ClassicNodeAPI_Wrapper.hpp"
29#include "Xpetra_TpetraCrsMatrix.hpp"
30#include "MueLu_TpetraOperator.hpp"
31#include "Xpetra_Matrix.hpp"
37#include "Tpetra_Core.hpp"
38#include "Tpetra_Map.hpp"
39#include "Tpetra_CrsMatrix.hpp"
40#include "Tpetra_MultiVector.hpp"
41#include "Tpetra_Map_decl.hpp"
42#include "NOX_TpetraTypedefs.hpp"
45#include "BelosSolverFactory_Tpetra.hpp"
46#include "BelosLinearProblem.hpp"
47#include "BelosBlockGmresSolMgr.hpp"
48#include "BelosBiCGStabSolMgr.hpp"
49#include "BelosPseudoBlockCGSolMgr.hpp"
50#include "BelosSolverFactory.hpp"
51#include "BelosStatusTestResNorm.hpp"
52#include "BelosStatusTestMaxIters.hpp"
53#include "BelosStatusTestGenResNorm.hpp"
54#include <BelosStatusTestImpResNorm.hpp>
55#include "BelosStatusTestCombo.hpp"
58#include "Ifpack2_Factory.hpp"
61#include "MueLu_CreateTpetraPreconditioner.hpp"
67using Scalar_d = double;
69using Scalar_c = std::complex<double>;
74using Node = Tpetra::Map<>::node_type;
77using Tpetra_Map = Tpetra::Map<LO, GO, Node>;
78using Tpetra_CrsMatrix = Tpetra::CrsMatrix<Scalar_d, LO, GO, Node>;
79using Tpetra_BlockCrsMatrix = Tpetra::BlockCrsMatrix<Scalar_d, LO, GO, Node>;
80using Tpetra_MultiVector = Tpetra::MultiVector<Scalar_d, LO, GO, Node>;
81using Tpetra_Vector = Tpetra::Vector<Scalar_d, LO, GO, Node>;
82using Tpetra_Import = Tpetra::Import<LO, GO, Node>;
83using Tpetra_CrsGraph = Tpetra::CrsGraph<LO, GO, Node>;
84using Tpetra_Operator = Tpetra::Operator<Scalar_d, LO, GO, Node>;
87using Belos_LinearProblem = Belos::LinearProblem<Scalar_d, Tpetra_MultiVector, Tpetra_Operator>;
88using Belos_SolverFactory = Belos::TpetraSolverFactory<Scalar_d, Tpetra_MultiVector, Tpetra_Operator>;
89using Belos_SolverManager = Belos::SolverManager<Scalar_d, Tpetra_MultiVector, Tpetra_Operator>;
90using Belos_StatusTestGenResNorm = Belos::StatusTestGenResNorm<Scalar_d, Tpetra_MultiVector, Tpetra_Operator>;
91using Belos_StatusTestCombo = Belos::StatusTestCombo<Scalar_d, Tpetra_MultiVector, Tpetra_Operator>;
92using Belos_StatusTestMaxIters = Belos::StatusTestMaxIters<Scalar_d, Tpetra_MultiVector, Tpetra_Operator>;
95using Ifpack2_Preconditioner = Ifpack2::Preconditioner<Scalar_d, LO, GO, Node>;
98using MueLu_Preconditioner = Tpetra_Operator;
105#define TRILINOS_CG_SOLVER 798
106#define TRILINOS_GMRES_SOLVER 797
107#define TRILINOS_BICGSTAB_SOLVER 795
110#define NO_PRECONDITIONER 700
111#define TRILINOS_DIAGONAL_PRECONDITIONER 702
112#define TRILINOS_BLOCK_JACOBI_PRECONDITIONER 703
113#define TRILINOS_ILU_PRECONDITIONER 704
114#define TRILINOS_ILUT_PRECONDITIONER 705
115#define TRILINOS_RILUK0_PRECONDITIONER 706
116#define TRILINOS_RILUK1_PRECONDITIONER 707
117#define TRILINOS_ML_PRECONDITIONER 708
122 Teuchos::RCP<const Tpetra_Map> Map;
123 Teuchos::RCP<const Tpetra_Map> ghostMap;
124 Teuchos::RCP<Tpetra_MultiVector> F;
125 Teuchos::RCP<Tpetra_MultiVector> ghostF;
126 Teuchos::RCP<Tpetra_CrsMatrix> K;
127 Teuchos::RCP<Tpetra_Vector> X;
128 Teuchos::RCP<Tpetra_Vector> ghostX;
129 Teuchos::RCP<Tpetra_Import> Importer;
130 std::vector<Teuchos::RCP<Tpetra_MultiVector>> bdryVec_list;
131 Teuchos::RCP<const Teuchos::Comm<int>> comm;
132 Teuchos::RCP<Tpetra_CrsGraph> K_graph;
134 Teuchos::RCP<Tpetra_Operator> MueluPrec;
135 Teuchos::RCP<Ifpack2_Preconditioner> ifpackPrec;
136 Trilinos() : MueluPrec(
nullptr), ifpackPrec(
nullptr) {}
158 void apply(
const Tpetra_MultiVector& X, Tpetra_MultiVector& Y,
159 Teuchos::ETransp mode = Teuchos::NO_TRANS,
160 Scalar_d alpha = Teuchos::ScalarTraits< Scalar_d >::one(),
161 Scalar_d beta = Teuchos::ScalarTraits<Scalar_d>::zero())
const override;
167 Teuchos::RCP<const Tpetra_Map> getDomainMap()
const override
169 return trilinos_->K->getDomainMap();
176 Teuchos::RCP<const Tpetra_Map> getRangeMap()
const override
178 return trilinos_->K->getRangeMap();
182 Teuchos::RCP<Trilinos> trilinos_;
192 void trilinos_lhs_create(
const Teuchos::RCP<Trilinos> &trilinos_,
const int numGlobalNodes,
const int numLocalNodes,
193 const int numGhostAndLocalNodes,
const int nnz,
const Vector<int>& ltgSorted,
195 const int dof,
const int cpp_index,
const int proc_id,
const int numCoupledNeumannBC);
201 void trilinos_bc_create_(
const Teuchos::RCP<Trilinos> &trilinos_,
const std::vector<Array<double>> &v_list,
bool &isCoupledBC);
203 void trilinos_doassem_(
const Teuchos::RCP<Trilinos> &trilinos_,
int &numNodesPerElement,
const int *eqN,
204 const double *lK,
double *lR);
206 void trilinos_global_solve_(
const Teuchos::RCP<Trilinos> &trilinos_,
const double *Val,
const double *RHS,
207 double *x,
const double *dirW,
double &resNorm,
double &initNorm,
208 int &numIters,
double &solverTime,
double &dB,
bool &converged,
209 int &
lsType,
double &relTol,
int &maxIters,
int &kspace,
212 void trilinos_solve_(
const Teuchos::RCP<Trilinos> &trilinos_,
double *x,
const double *dirW,
double &resNorm,
213 double &initNorm,
int &numIters,
double &solverTime,
214 double &dB,
bool &converged,
int &
lsType,
double &relTol,
215 int &maxIters,
int &kspace,
int &precondType,
bool &isFassem);
222void setPreconditioner(
const Teuchos::RCP<Trilinos> &trilinos_,
int precondType,
223 Teuchos::RCP<Belos_LinearProblem>& BelosProblem);
225void setMueLuPreconditioner(Teuchos::RCP<MueLu_Preconditioner>& MueLuPrec,
226 const Teuchos::RCP<Tpetra_CrsMatrix>& A);
228void checkDiagonalIsZero(
const Teuchos::RCP<Trilinos> &trilinos_);
230void constructJacobiScaling(
const Teuchos::RCP<Trilinos> &trilinos_,
const double *dirW,
231 Tpetra_Vector &diagonal);
234void printMatrixToFile(
const Teuchos::RCP<Trilinos> &trilinos_);
236void printRHSToFile(
const Teuchos::RCP<Trilinos> &trilinos_);
238void printSolutionToFile(
const Teuchos::RCP<Trilinos> &trilinos_);
This class implements the pure virtual class Epetra_Operator for the AztecOO iterative solve which on...
Definition trilinos_impl.h:146
TrilinosMatVec(const Teuchos::RCP< Trilinos > &trilinos)
Definition trilinos_impl.h:155
void apply(const Tpetra_MultiVector &X, Tpetra_MultiVector &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar_d alpha=Teuchos::ScalarTraits< Scalar_d >::one(), Scalar_d beta=Teuchos::ScalarTraits< Scalar_d >::zero()) const override
Definition trilinos_impl.cpp:65
The Vector template class is used for storing int and double data.
Definition Vector.h:23
Linear system of equations solver type.
Definition ComMod.h:652
Initialize all Epetra types we need separate from Fortran.
Definition trilinos_impl.h:121