Cantera
Install
User Guide
Examples
Reference
Develop
Community
4.0.0a2
Toggle main menu visibility
Loading...
Searching...
No Matches
AdaptivePreconditioner.cpp
Go to the documentation of this file.
1
//! @file AdaptivePreconditioner.cpp
2
3
// This file is part of Cantera. See License.txt in the top-level directory or
4
// at https://cantera.org/license.txt for license and copyright information.
5
6
#include "
cantera/base/global.h
"
7
#include "
cantera/numerics/AdaptivePreconditioner.h
"
8
9
namespace
Cantera
10
{
11
12
AdaptivePreconditioner::AdaptivePreconditioner()
13
{
14
setPreconditionerSide
(
"right"
);
15
}
16
17
void
AdaptivePreconditioner::stateAdjustment
(span<double> state) {
18
// Only keep positive composition based on given tol
19
for
(
size_t
i = 0; i < state.size(); i++) {
20
state[i] = std::max(state[i],
m_atol
);
21
}
22
}
23
24
void
AdaptivePreconditioner::initialize
(
size_t
networkSize)
25
{
26
EigenSparseJacobian::initialize
(networkSize);
27
// don't use legacy rate constants
28
use_legacy_rate_constants
(
false
);
29
// setting default ILUT parameters
30
if
(
m_drop_tol
== 0) {
31
setIlutDropTol
(1e-12);
32
}
33
if
(
m_drop_tol
== 0) {
34
setIlutFillFactor
(
static_cast<
int
>
(
m_dim
) / 2);
35
}
36
// update initialized status
37
m_init
=
true
;
38
}
39
40
void
AdaptivePreconditioner::factorize
()
41
{
42
if
(
m_prune_precon
) {
43
prunePreconditioner
();
44
}
45
// compress sparse matrix structure
46
m_matrix
.makeCompressed();
47
// analyze and factorize
48
m_solver
.compute(
m_matrix
);
49
// check for errors
50
if
(
m_solver
.info() != Eigen::Success) {
51
throw
CanteraError
(
"AdaptivePreconditioner::factorize"
,
52
"error code: {}"
,
static_cast<
int
>
(
m_solver
.info()));
53
}
54
}
55
56
void
AdaptivePreconditioner::prunePreconditioner
()
57
{
58
for
(
int
k=0; k<
m_matrix
.outerSize(); ++k) {
59
for
(Eigen::SparseMatrix<double>::InnerIterator it(
m_matrix
, k); it;
60
++it) {
61
if
(std::abs(it.value()) <
m_threshold
&& it.row() != it.col()) {
62
it.valueRef() = 0;
63
}
64
}
65
}
66
}
67
68
void
AdaptivePreconditioner::solve
(span<const double> rhs_vector, span<double> output)
69
{
70
// creating vectors in the form of Ax=b
71
Eigen::Map<const Eigen::VectorXd> bVector(rhs_vector.data(), rhs_vector.size());
72
Eigen::Map<Eigen::VectorXd> xVector(output.data(), output.size());
73
// solve for xVector
74
xVector =
m_solver
.solve(bVector);
75
if
(
m_solver
.info() != Eigen::Success) {
76
throw
CanteraError
(
"AdaptivePreconditioner::solve"
,
77
"error code: {}"
,
static_cast<
int
>
(
m_solver
.info()));
78
}
79
}
80
81
}
AdaptivePreconditioner.h
Declarations for the class AdaptivePreconditioner which is a child class of SystemJacobian for precon...
Cantera::AdaptivePreconditioner::m_solver
Eigen::IncompleteLUT< double > m_solver
Solver used in solving the linear system.
Definition
AdaptivePreconditioner.h:79
Cantera::AdaptivePreconditioner::setIlutDropTol
void setIlutDropTol(double droptol)
Set drop tolerance for ILUT.
Definition
AdaptivePreconditioner.h:59
Cantera::AdaptivePreconditioner::m_drop_tol
double m_drop_tol
ILUT drop tolerance.
Definition
AdaptivePreconditioner.h:76
Cantera::AdaptivePreconditioner::m_prune_precon
double m_prune_precon
Bool set whether to prune the matrix or not.
Definition
AdaptivePreconditioner.h:86
Cantera::AdaptivePreconditioner::m_threshold
double m_threshold
Minimum value a non-diagonal element must be to be included in the preconditioner.
Definition
AdaptivePreconditioner.h:83
Cantera::AdaptivePreconditioner::factorize
void factorize() override
Factorize the system matrix.
Definition
AdaptivePreconditioner.cpp:40
Cantera::AdaptivePreconditioner::stateAdjustment
void stateAdjustment(span< double > state) override
Adjust the state vector based on the preconditioner, e.g., Adaptive preconditioning uses a strictly p...
Definition
AdaptivePreconditioner.cpp:17
Cantera::AdaptivePreconditioner::solve
void solve(span< const double > rhs_vector, span< double > output) override
Solve a linear system using the system matrix M.
Definition
AdaptivePreconditioner.cpp:68
Cantera::AdaptivePreconditioner::initialize
void initialize(size_t networkSize) override
Called during setup for any processes that need to be completed prior to setup functions used in sund...
Definition
AdaptivePreconditioner.cpp:24
Cantera::AdaptivePreconditioner::setIlutFillFactor
void setIlutFillFactor(int fillFactor)
Set the fill factor for ILUT solver.
Definition
AdaptivePreconditioner.h:66
Cantera::AdaptivePreconditioner::prunePreconditioner
void prunePreconditioner()
Prune preconditioner elements.
Definition
AdaptivePreconditioner.cpp:56
Cantera::CanteraError
Base class for exceptions thrown by Cantera classes.
Definition
ctexceptions.h:66
Cantera::EigenSparseJacobian::initialize
void initialize(size_t networkSize) override
Called during setup for any processes that need to be completed prior to setup functions used in sund...
Definition
EigenSparseJacobian.cpp:12
Cantera::EigenSparseJacobian::m_matrix
Eigen::SparseMatrix< double > m_matrix
Container that is the sparse preconditioner.
Definition
EigenSparseJacobian.h:54
Cantera::SystemJacobian::m_dim
size_t m_dim
Dimension of the system.
Definition
SystemJacobian.h:200
Cantera::SystemJacobian::setPreconditionerSide
virtual void setPreconditionerSide(const string &preconSide)
For iterative solvers, set the side where the preconditioner is applied.
Definition
SystemJacobian.h:75
Cantera::SystemJacobian::m_init
bool m_init
bool saying whether or not the system is initialized
Definition
SystemJacobian.h:206
Cantera::SystemJacobian::m_atol
double m_atol
Absolute tolerance of the ODE solver.
Definition
SystemJacobian.h:209
global.h
This file contains definitions for utility functions and text for modules, inputfiles and logging,...
Cantera::use_legacy_rate_constants
void use_legacy_rate_constants(bool legacy)
Set definition used for rate constant calculation.
Definition
global.cpp:102
Cantera
Namespace for the Cantera kernel.
Definition
AnyMap.cpp:595
src
numerics
AdaptivePreconditioner.cpp
Generated by
1.17.0