G+Smo  25.01.0
Geometry + Simulation Modules
 
Loading...
Searching...
No Matches
gsFlowLinSystSolver.h
Go to the documentation of this file.
1
12#pragma once
13
17#include <gsSolver/gsGMRes.h>
18
19namespace gismo
20{
21
25template<class T, int MatOrder>
27{
28
29protected: // *** Class members ***
30
31 const gsFlowSolverParams<T>& m_paramsRef;
32 gsStopwatch m_clock;
33 T m_setupT, m_solveT;
34
35
36public: // *** Constructor/destructor ***
37
40 m_paramsRef(params)
41 {
42 m_setupT = 0;
43 m_solveT = 0;
44 }
45
46 virtual ~gsFlowLinSystSolver()
47 { }
48
49
50protected: // *** Member functions ***
51
54
56 T stopwatchStop();
57
58
59public: // *** Member functions ***
60
64
69 virtual void applySolver(const gsSparseMatrix<T, MatOrder>& mat, const gsMatrix<T>& rhs, gsMatrix<T>& solution)
71
80 virtual void applySolver(const gsSparseMatrix<T, MatOrder>& mat, const gsMatrix<T>& rhs, gsMatrix<T>& solution, real_t alpha_u, real_t alpha_p, index_t usize, index_t pdofs);
81
82
83public: // *** Getters ***
84
86 virtual const T getSolverSetupTime() const { return m_setupT; }
87
89 virtual const T getSolveTime() const { return m_solveT; }
90
91
92}; // gsFlowLinSystSolver
93
94// ===================================================================================================================
95// ===================================================================================================================
96
100template<class T, int MatOrder>
102{
103
104public:
106
107
108protected: // *** Class members ***
109
110#ifdef GISMO_WITH_PARDISO
111 typename gsSparseSolver<T>::PardisoLU m_solver;
112#else
113 typename gsSparseSolver<T>::LU m_solver;
114#endif
115
116
117protected: // *** Base class members ***
118
119 using Base::m_paramsRef;
120 using Base::m_setupT;
121 using Base::m_solveT;
124
125
126public: // *** Constructor/destructor ***
127
130 Base(params)
131 {
132 #ifdef GISMO_WITH_PARDISO
133 pardisoSetup<T>(m_solver);
134 #endif
135 }
136
137
138public: // *** Member functions ***
139
141 virtual void setupSolver(const gsSparseMatrix<T, MatOrder>& mat);
142
145 virtual void applySolver(const gsSparseMatrix<T, MatOrder>& mat, const gsMatrix<T>& rhs, gsMatrix<T>& solution);
146
147
148}; // gsFlowLinSystSolver_direct
149
150// ===================================================================================================================
151
156template<class T, int MatOrder, class SolverType>
158{
159
160public:
162
163
164protected: // *** Class members ***
165
166 typename gsLinearOperator<T>::Ptr m_precPtr;
167 std::vector<index_t> m_linIterVector;
168
169
170protected: // *** Base class members ***
171
172 using Base::m_paramsRef;
173 using Base::m_setupT;
174 using Base::m_solveT;
177
178
179public: // *** Constructor/destructor ***
180
183 Base(params)
184 { }
185
186
187public: // *** Member functions ***
188
191 { }
192
194 virtual void setupPreconditioner(const gsSparseMatrix<T, MatOrder>& mat);
195
198 virtual void applySolver(const gsSparseMatrix<T, MatOrder>& mat, const gsMatrix<T>& rhs, gsMatrix<T>& solution);
199
200
201public: // *** Getters/setters ***
202
204 std::vector<index_t> getLinIterVector() const { return m_linIterVector; }
205
208 {
209 index_t linIterSum = 0;
210
211 for (size_t i = 0; i < m_linIterVector.size(); i++)
212 linIterSum += m_linIterVector[i];
213
214 return (T)linIterSum / m_linIterVector.size();
215 }
216
217}; // gsFlowLinSystSolver_iter
218
219// ===================================================================================================================
220
225template<class T, int MatOrder, class SolverType>
226class gsFlowLinSystSolver_iterSP: public gsFlowLinSystSolver_iter<T, MatOrder, SolverType>
227{
228
229public:
231
232
233protected: // *** Class members ***
234
235 std::string m_precType;
236 gsOptionList m_precOpt;
237 const gsINSAssembler<T, MatOrder>* m_assemblerPtr;
238 std::map<std::string, gsSparseMatrix<T, MatOrder> > m_matrices;
239 std::vector<index_t> m_linIterVector;
240
241
242protected: // *** Base class members ***
243
244 using Base::m_precPtr;
245 using Base::m_paramsRef;
246 using Base::m_setupT;
247 using Base::m_solveT;
250
251
252public: // *** Constructor/destructor ***
253
256 Base(params), m_assemblerPtr(assemblerPtr)
257 {
258 m_precType = m_paramsRef.options().getString("lin.precType");
259 m_precOpt = m_paramsRef.precOptions();
260 m_precOpt.addInt("dim", "Problem dimension", m_assemblerPtr->getTarDim());
261 m_precOpt.addReal("visc", "Viscosity", m_paramsRef.getPde().viscosity());
262 m_precOpt.addInt("udofs", "Number of velocity dofs", m_assemblerPtr->getUdofs());
263 m_precOpt.addInt("pdofs", "Number of pressure dofs", m_assemblerPtr->getPdofs());
264 }
265
266
267public: // *** Member functions ***
268
270 virtual void setupPreconditioner(const gsSparseMatrix<T, MatOrder>& mat);
271
272}; // gsFlowLinSystSolver_iterSP
273
274// ===================================================================================================================
275// ===================================================================================================================
276
277template<class T, int MatOrder, class SolverType = gsGMRes<T> >
278gsFlowLinSystSolver<T, MatOrder>* createLinSolver(const gsFlowSolverParams<T>& params, const gsFlowAssemblerBase<T, MatOrder>* assemblerPtr = NULL)
279{
280 const gsINSAssembler<T, MatOrder>* INSassembPtr = dynamic_cast< const gsINSAssembler<T, MatOrder>* >(assemblerPtr);
281
282 std::string type = params.options().getString("lin.solver");
283
284 if (type == "direct")
286 else if (type == "iter" && INSassembPtr == NULL) // assembler is not an INS assembler
288 else if (type == "iter" && INSassembPtr != NULL) // assembler is an INS assembler
289 return new gsFlowLinSystSolver_iterSP<T, MatOrder, SolverType>(params, INSassembPtr);
290 // else if (type == _"petsc")
291 // return new gsFlowLinSystSolver_PETSc<T, MatOrder>(params);
292 else
293 {
294 gsInfo << "Invalid linear system solver type, using direct.\n";
296 }
297
298}
299
300} // namespace gismo
301
302#ifndef GISMO_BUILD_LIB
303#include GISMO_HPP_HEADER(gsFlowLinSystSolver.hpp)
304#endif
A base class for all assemblers in gsIncompressibleFlow.
Definition gsFlowAssemblerBase.h:25
short_t getTarDim() const
Returns the target dimension.
Definition gsFlowAssemblerBase.h:149
Direct solver for linear systems inside the incompressible flow solvers (classes derived from gsFlowS...
Definition gsFlowLinSystSolver.h:102
virtual void applySolver(const gsSparseMatrix< T, MatOrder > &mat, const gsMatrix< T > &rhs, gsMatrix< T > &solution)
Solve the linear system.
Definition gsFlowLinSystSolver.hpp:86
gsFlowLinSystSolver_direct(const gsFlowSolverParams< T > &params)
Constructor.
Definition gsFlowLinSystSolver.h:129
virtual void setupSolver(const gsSparseMatrix< T, MatOrder > &mat)
Setup the linear solver for a given matrix.
Definition gsFlowLinSystSolver.hpp:75
G+Smo/Eigen iterative solver for saddle-point linear systems inside the incompressible flow solvers (...
Definition gsFlowLinSystSolver.h:227
virtual void setupPreconditioner(const gsSparseMatrix< T, MatOrder > &mat)
Setup the preconditioner for a given matrix.
Definition gsFlowLinSystSolver.hpp:138
gsFlowLinSystSolver_iterSP(const gsFlowSolverParams< T > &params, const gsINSAssembler< T, MatOrder > *assemblerPtr)
Constructor.
Definition gsFlowLinSystSolver.h:255
G+Smo/Eigen iterative solver for linear systems inside the incompressible flow solvers (classes deriv...
Definition gsFlowLinSystSolver.h:158
std::vector< index_t > getLinIterVector() const
Returns vector of iteration counts of the linear solver for each call of applySolver().
Definition gsFlowLinSystSolver.h:204
gsFlowLinSystSolver_iter(const gsFlowSolverParams< T > &params)
Constructor.
Definition gsFlowLinSystSolver.h:182
virtual void setupPreconditioner(const gsSparseMatrix< T, MatOrder > &mat)
Setup the preconditioner for a given matrix.
Definition gsFlowLinSystSolver.hpp:103
T stopwatchStop()
Stop measuring time (decides whether to use gsStopwatch or MPI_Wtime)
Definition gsFlowLinSystSolver.hpp:37
virtual void setupSolver(const gsSparseMatrix< T, MatOrder > &mat)
Setup the linear solver for a given matrix (nothing happens here).
Definition gsFlowLinSystSolver.h:190
T stopwatchStart()
Start measuring time (decides whether to use gsStopwatch or MPI_Wtime)
Definition gsFlowLinSystSolver.hpp:19
T getAvgLinIterations() const
Returns the average iteration count of the linear solver per applySolver() call.
Definition gsFlowLinSystSolver.h:207
virtual void applySolver(const gsSparseMatrix< T, MatOrder > &mat, const gsMatrix< T > &rhs, gsMatrix< T > &solution)
Solve the linear system.
Definition gsFlowLinSystSolver.hpp:113
Interface for classes solving linear systems inside the incompressible flow solvers (classes derived ...
Definition gsFlowLinSystSolver.h:27
gsFlowLinSystSolver(const gsFlowSolverParams< T > &params)
Constructor.
Definition gsFlowLinSystSolver.h:39
virtual void applySolver(const gsSparseMatrix< T, MatOrder > &mat, const gsMatrix< T > &rhs, gsMatrix< T > &solution)
Solve the linear system.
Definition gsFlowLinSystSolver.h:69
virtual const T getSolveTime() const
Returns the total time spent on solving of the linear systems.
Definition gsFlowLinSystSolver.h:89
T stopwatchStop()
Stop measuring time (decides whether to use gsStopwatch or MPI_Wtime)
Definition gsFlowLinSystSolver.hpp:37
virtual void setupSolver(const gsSparseMatrix< T, MatOrder > &mat)
Setup the linear solver for a given matrix.
Definition gsFlowLinSystSolver.h:62
virtual const T getSolverSetupTime() const
Returns the total time spent on linear solver setup.
Definition gsFlowLinSystSolver.h:86
T stopwatchStart()
Start measuring time (decides whether to use gsStopwatch or MPI_Wtime)
Definition gsFlowLinSystSolver.hpp:19
A class that holds all parameters needed by the incompressible flow solver.
Definition gsFlowSolverParams.h:34
gsOptionList & options()
Returns a reference to the INS solver option list.
Definition gsFlowSolverParams.h:185
A base class for incompressible Navier-Stokes assemblers.
Definition gsINSAssembler.h:27
index_t getPdofs() const
Returns the number of pressure DOFs.
Definition gsINSAssembler.h:205
index_t getUdofs() const
Returns the number of velocity DOFs (one velocity component).
Definition gsINSAssembler.h:202
memory::shared_ptr< gsLinearOperator > Ptr
Shared pointer for gsLinearOperator.
Definition gsLinearOperator.h:33
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
Class which holds a list of parameters/options, and provides easy access to them.
Definition gsOptionList.h:33
void addInt(const std::string &label, const std::string &desc, const index_t &value)
Adds a option named label, with description desc and value value.
Definition gsOptionList.cpp:201
std::string getString(const std::string &label) const
Reads value for option label from options.
Definition gsOptionList.cpp:27
void addReal(const std::string &label, const std::string &desc, const Real &value)
Adds a option named label, with description desc and value value.
Definition gsOptionList.cpp:211
Sparse matrix class, based on gsEigen::SparseMatrix.
Definition gsSparseMatrix.h:139
#define index_t
Definition gsConfig.h:32
#define GISMO_NO_IMPLEMENTATION
Definition gsDebug.h:129
#define gsInfo
Definition gsDebug.h:43
A class that holds all parameters needed by the incompressible flow solver.
Preconditioned iterative solver using the generalized minimal residual method.
The G+Smo namespace, containing all definitions for the library.