svMultiPhysics
Loading...
Searching...
No Matches
trilinos_impl.h
1// SPDX-FileCopyrightText: Copyright (c) Stanford University, The Regents of the University of California, and others.
2// SPDX-License-Identifier: BSD-3-Clause
3
4#ifndef TRILINOS_LINEAR_SOLVER_H
5#define TRILINOS_LINEAR_SOLVER_H
6/*!
7 \file trilinos_linear_solver.h
8 \brief wrap Trilinos solver functions
9*/
10
11/**************************************************************/
12/* Includes */
13/**************************************************************/
14
15#include <stdio.h>
16#include <vector>
17#include <iostream>
18#include "mpi.h"
19#include <time.h>
20#include <numeric>
21
22// Theuchos includes
23#include "Teuchos_RCP.hpp"
24#include "Teuchos_DefaultComm.hpp"
25#include <Teuchos_Time.hpp>
26
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"
32
33// Kokkos includes
34// #include "KokkosCompat_KokkosSerialWrapperNode.hpp" // For Node type
35
36// Tpetra includes
37#include "Tpetra_Core.hpp" // For Tpetra::initialize, finalize
38#include "Tpetra_Map.hpp" // For Tpetra::Map
39#include "Tpetra_CrsMatrix.hpp" // If you use Tpetra::CrsMatrix
40#include "Tpetra_MultiVector.hpp"
41#include "Tpetra_Map_decl.hpp"
42#include "NOX_TpetraTypedefs.hpp"
43
44//Belos includes
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"
56
57//Ifpack2 includes
58#include "Ifpack2_Factory.hpp"
59
60// MueLu includes
61#include "MueLu_CreateTpetraPreconditioner.hpp"
62
63/**************************************************************/
64/* Types Definitions */
65/**************************************************************/
66/* Scalar types aliases */
67using Scalar_d = double;
68using Scalar_i = int;
69using Scalar_c = std::complex<double>;
70
71/* Ordinals and node aliases */
72using LO = int;
73using GO = int;
74using Node = Tpetra::Map<>::node_type;
75
76/* Tpetra type aliases */
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>;
85
86/* Belos aliases */
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>;
93
94/* IFPACK2 preconditioner aliases */
95using Ifpack2_Preconditioner = Ifpack2::Preconditioner<Scalar_d, LO, GO, Node>;
96
97/* MueLu preconditioner aliases */
98using MueLu_Preconditioner = Tpetra_Operator;
99
100/**************************************************************/
101/* Macro Definitions */
102/**************************************************************/
103
104// Define linear solver as following naming in FSILS_struct
105#define TRILINOS_CG_SOLVER 798
106#define TRILINOS_GMRES_SOLVER 797
107#define TRILINOS_BICGSTAB_SOLVER 795
108
109// Define preconditioners as following naming in FSILS_struct
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
118
119/// @brief Initialize all Epetra types we need separate from Fortran
121{
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;
133
134 Teuchos::RCP<Tpetra_Operator> MueluPrec;
135 Teuchos::RCP<Ifpack2_Preconditioner> ifpackPrec;
136 Trilinos() : MueluPrec(nullptr), ifpackPrec(nullptr) {}
137};
138
139/**
140 * \class TrilinosMatVec
141 * \brief This class implements the pure virtual class Epetra_Operator for the
142 * AztecOO iterative solve which only uses the Apply() method to compute
143 * the matrix vector product
144 */
145class TrilinosMatVec: public Tpetra_Operator
146{
147public:
148
149 /** Define matrix vector operation at each iteration of the linear solver
150 * adds on the coupled neuman boundary contribution to the matrix
151 *
152 * \param x vector to be applied on the operator
153 * \param y result of sparse matrix vector multiplication
154 */
155 TrilinosMatVec(const Teuchos::RCP<Trilinos>& trilinos) : trilinos_(trilinos) {}
156
157 /* Y = beta * Y + alpha * A^mode * X */
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;
162
163 /*
164 Returns the map describing the layout of the domain vector space.
165 This map defines the distribution of the input vectors to the operator.
166 */
167 Teuchos::RCP<const Tpetra_Map> getDomainMap() const override
168 {
169 return trilinos_->K->getDomainMap();
170 }
171
172 /*
173 Returns the map describing the layout of the range vector space.
174 This map defines the distribution of the output vectors from the operator.
175 */
176 Teuchos::RCP<const Tpetra_Map> getRangeMap() const override
177 {
178 return trilinos_->K->getRangeMap();
179 }
180
181 private:
182 Teuchos::RCP<Trilinos> trilinos_;
183};// class TrilinosMatVec
184
185// --- Functions to be called in fortran -------------------------------------
186
187#ifdef __cplusplus
188 extern "C"
189 {
190#endif
191 /// Give function definitions which will be called through fortran
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,
194 const Vector<int>& ltgUnsorted, const Vector<int>& rowPtr, const Vector<int>& colInd,
195 const int dof, const int cpp_index, const int proc_id, const int numCoupledNeumannBC);
196
197 /**
198 * \param v coeff in the scalar product
199 * \param isCoupledBC determines if coupled resistance BC is turned on
200 */
201 void trilinos_bc_create_(const Teuchos::RCP<Trilinos> &trilinos_, const std::vector<Array<double>> &v_list, bool &isCoupledBC);
202
203 void trilinos_doassem_(const Teuchos::RCP<Trilinos> &trilinos_, int &numNodesPerElement, const int *eqN,
204 const double *lK, double *lR);
205
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,
210 int &precondType);
211
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);
216
217#ifdef __cplusplus /* this brace matches the one on the extern "C" line */
218 }
219#endif
220
221// --- Define functions to only be called in C++ ------------------------------
222void setPreconditioner(const Teuchos::RCP<Trilinos> &trilinos_, int precondType,
223 Teuchos::RCP<Belos_LinearProblem>& BelosProblem);
224
225void setMueLuPreconditioner(Teuchos::RCP<MueLu_Preconditioner>& MueLuPrec,
226 const Teuchos::RCP<Tpetra_CrsMatrix>& A);
227
228void checkDiagonalIsZero(const Teuchos::RCP<Trilinos> &trilinos_);
229
230void constructJacobiScaling(const Teuchos::RCP<Trilinos> &trilinos_, const double *dirW,
231 Tpetra_Vector &diagonal);
232
233// --- Debugging functions ----------------------------------------------------
234void printMatrixToFile(const Teuchos::RCP<Trilinos> &trilinos_);
235
236void printRHSToFile(const Teuchos::RCP<Trilinos> &trilinos_);
237
238void printSolutionToFile(const Teuchos::RCP<Trilinos> &trilinos_);
239
240#endif //TRILINOS_LINEAR_SOLVER_H
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