WarpX
Loading...
Searching...
No Matches
JacobianFunctionMF.H
Go to the documentation of this file.
1/* Copyright 2024 Justin Angus
2 *
3 * This file is part of WarpX.
4 *
5 * License: BSD-3-Clause-LBNL
6 */
7#ifndef JacobianFunctionMF_H_
8#define JacobianFunctionMF_H_
9
10#include "LinearFunction.H"
11#include "CurlCurlMLMGPC.H"
12#include "MatrixPC.H"
13#include "JacobiPC.H"
14#include "Utils/TextMsg.H"
15#include <AMReX_Config.H>
16#include <string>
17
24
25template <class T, class Ops>
27{
28 public:
29
30 using RT = typename T::value_type;
31
32 JacobianFunctionMF() = default;
34
35 // Default move and copy operations
39 JacobianFunctionMF& operator=(JacobianFunctionMF&&) noexcept = default;
40
41 void apply ( T& a_dF, const T& a_dU ) override;
42
43 inline
44 void precond ( T& a_U, const T& a_X ) override
45 {
46 if (m_usePreCond) {
47 a_U.zero();
48 m_preCond->Apply(a_U, a_X);
49 } else {
50 a_U.Copy(a_X);
51 }
52 }
53
54 inline
55 void updatePreCondMat ( const T& a_X ) override
56 {
57 if (m_usePreCond) { m_preCond->Update(a_X); }
58 }
59
60 inline
65 int& a_n, int& a_ncols_max ) override
66 {
68 m_preCond->getPCMatrix(a_ridx_g, a_nnz, a_cidx_g, a_aij, a_n, a_ncols_max);
69 }
70
71
72 T makeVecLHS () const override;
73 T makeVecRHS () const override;
74
75 inline
76 bool isDefined() const { return m_is_defined; }
77
78 [[nodiscard]] inline
79 bool usePreconditioner() const { return m_usePreCond; }
80
81 inline
82 void setBaseSolution ( const T& a_U )
83 {
84 m_Y0.Copy(a_U);
85 m_normY0 = this->norm2(m_Y0);
86 }
87
88 inline
89 void setBaseRHS ( const T& a_R )
90 {
91 m_R0.Copy(a_R);
92 }
93
94 inline
95 void setJFNKEps ( RT a_eps )
96 {
97 m_epsJFNK = a_eps;
98 }
99
100 inline
101 void setIsLinear ( bool a_isLinear )
102 {
103 m_is_linear = a_isLinear;
104 }
105
106 inline
107 void curTime ( RT a_time )
108 {
109 m_cur_time = a_time;
110 if (m_usePreCond) { m_preCond->CurTime(a_time); }
111 }
112
113 inline
114 void curTimeStep ( RT a_dt )
115 {
116 m_dt = a_dt;
117 if (m_usePreCond) { m_preCond->CurTimeStep(a_dt); }
118 }
119
120 inline
121 void printParams () const
122 {
124 m_preCond->printParameters();
125 }
126 }
127
128 void define( const T&, Ops*, const PreconditionerType& ) override;
129
130 inline
131 PreconditionerType pcType () const override { return m_pc_type; }
132
133 private:
134
135 bool m_is_defined = false;
136 bool m_is_linear = false;
137 bool m_usePreCond = false;
138 RT m_epsJFNK = RT(1.0e-6);
141
143
145 Ops* m_ops = nullptr;
146 std::unique_ptr<Preconditioner<T,Ops>> m_preCond = nullptr;
147};
148
149template <class T, class Ops>
151 Ops* a_ops,
152 const PreconditionerType& a_pc_type )
153{
154 BL_PROFILE("JacobianFunctionMF::::define()");
155 m_Z.Define(a_U);
156 m_Y0.Define(a_U);
157 m_R0.Define(a_U);
158 m_R.Define(a_U);
159
160 m_ops = a_ops;
161
162 m_usePreCond = (a_pc_type != PreconditionerType::none);
163 if (m_usePreCond) {
164 m_pc_type = a_pc_type;
166 m_preCond = std::make_unique<CurlCurlMLMGPC<T,Ops>>();
168 m_preCond = std::make_unique<JacobiPC<T,Ops>>();
169 } else {
170 m_preCond = std::make_unique<MatrixPC<T,Ops>>();
172 }
173 m_preCond->Define(a_U, a_ops);
174 }
175
176 m_is_defined = true;
177}
178
179template <class T, class Ops>
181{
182 BL_PROFILE("JacobianFunctionMF::::makeVecRHS()");
183 T x;
184 x.Define(m_R);
185 return x;
186}
187
188template <class T, class Ops>
190{
191 BL_PROFILE("JacobianFunctionMF::::makeVecLHS()");
192 T x;
193 x.Define(m_R);
194 return x;
195}
196
197template <class T, class Ops>
198void JacobianFunctionMF<T,Ops>::apply (T& a_dF, const T& a_dU)
199{
200 BL_PROFILE("JacobianFunctionMF::apply()");
201 using namespace amrex::literals;
202 RT const normY = this->norm2(a_dU); // always 1 when called from GMRES
203
205 isDefined(),
206 "JacobianFunction::apply() called on undefined JacobianFunction");
207
208 if (normY < 1.0e-15) { a_dF.zero(); }
209 else {
210
211 RT eps;
212 if (m_is_linear) {
213 eps = 1.0_rt;
214 } else {
215 /* eps = error_rel * sqrt(1 + ||Y0||) / ||dU||
216 * M. Pernice and H. F. Walker, "NITSOL: A Newton Iterative Solver for
217 * Nonlinear Systems", SIAM J. Sci. Stat. Comput., 1998, vol 19,
218 * pp. 302--318. */
219 if (m_normY0==0.0) { eps = m_epsJFNK * this->norm2(m_R0) / normY; }
220 else {
221 // m_epsJFNK * sqrt(1.0 + m_normY0) / normY
222 // above commonly used form not recommend for poorly scaled Y0
223 eps = m_epsJFNK * m_normY0 / normY;
224 }
225 }
226 const RT eps_inv = 1.0_rt/eps;
227
228 m_Z.linComb( 1.0, m_Y0, eps, a_dU ); // Z = Y0 + eps*dU
229 m_ops->ComputeRHS(m_R, m_Z, m_cur_time, -1, true );
230
231 // F(Y) = Y - b - R(Y) ==> dF = dF/dY*dU = [1 - dR/dY]*dU
232 // = dU - (R(Z)-R(Y0))/eps
233 a_dF.linComb( 1.0, a_dU, eps_inv, m_R0 );
234 a_dF.increment(m_R,-eps_inv);
235
236 }
237
238}
239
240#endif
#define BL_PROFILE(a)
#define AMREX_ALWAYS_ASSERT(EX)
PreconditionerType
Types for preconditioners for field solvers.
Definition Preconditioner.H:22
@ none
Definition Preconditioner.H:22
@ pc_jacobi
Definition Preconditioner.H:22
@ pc_curl_curl_mlmg
Definition Preconditioner.H:22
#define WARPX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition TextMsg.H:13
std::unique_ptr< Preconditioner< T, Ops > > m_preCond
Definition JacobianFunctionMF.H:146
RT m_cur_time
Definition JacobianFunctionMF.H:140
bool m_is_defined
Definition JacobianFunctionMF.H:135
void updatePreCondMat(const T &a_X) override
update preconditioner
Definition JacobianFunctionMF.H:55
T m_R0
Definition JacobianFunctionMF.H:144
void setBaseRHS(const T &a_R)
Definition JacobianFunctionMF.H:89
void setBaseSolution(const T &a_U)
Definition JacobianFunctionMF.H:82
bool isDefined() const
Definition JacobianFunctionMF.H:76
~JacobianFunctionMF()=default
bool usePreconditioner() const
Definition JacobianFunctionMF.H:79
void setIsLinear(bool a_isLinear)
Definition JacobianFunctionMF.H:101
T m_Z
Definition JacobianFunctionMF.H:144
void precond(T &a_U, const T &a_X) override
apply the preconditioner on a given vector of type T
Definition JacobianFunctionMF.H:44
void define(const T &, Ops *, const PreconditionerType &) override
define the linear function object
Definition JacobianFunctionMF.H:150
JacobianFunctionMF(const JacobianFunctionMF &)=default
RT m_normY0
Definition JacobianFunctionMF.H:139
JacobianFunctionMF()=default
void curTimeStep(RT a_dt)
Definition JacobianFunctionMF.H:114
RT m_dt
Definition JacobianFunctionMF.H:140
void curTime(RT a_time)
Definition JacobianFunctionMF.H:107
T makeVecLHS() const override
make LHS vector
Definition JacobianFunctionMF.H:189
void apply(Vec &a_dF, const Vec &a_dU) override
Definition JacobianFunctionMF.H:198
PreconditionerType pcType() const override
returns the preconditioner type
Definition JacobianFunctionMF.H:131
bool m_is_linear
Definition JacobianFunctionMF.H:136
JacobianFunctionMF & operator=(const JacobianFunctionMF &)=default
T m_Y0
Definition JacobianFunctionMF.H:144
void printParams() const
Definition JacobianFunctionMF.H:121
void setJFNKEps(RT a_eps)
Definition JacobianFunctionMF.H:95
RT m_epsJFNK
Definition JacobianFunctionMF.H:138
typename T::value_type RT
Definition JacobianFunctionMF.H:30
Ops * m_ops
Definition JacobianFunctionMF.H:145
void getPCMatrix(amrex::Gpu::DeviceVector< int > &a_ridx_g, amrex::Gpu::DeviceVector< int > &a_nnz, amrex::Gpu::DeviceVector< int > &a_cidx_g, amrex::Gpu::DeviceVector< RT > &a_aij, int &a_n, int &a_ncols_max) override
get sparse matrix representation of preconditioner
Definition JacobianFunctionMF.H:61
T makeVecRHS() const override
make RHS vector
Definition JacobianFunctionMF.H:180
bool m_usePreCond
Definition JacobianFunctionMF.H:137
JacobianFunctionMF(JacobianFunctionMF &&) noexcept=default
T m_R
Definition JacobianFunctionMF.H:144
PreconditionerType m_pc_type
Definition JacobianFunctionMF.H:142
RT norm2(const T &a_U)
compute 2-norm of a vector
Definition LinearFunction.H:107
LinearFunction()=default
default constructor
PODVector< T, ArenaAllocator< T > > DeviceVector
std::string getEnumNameString(T const &v)