LIMEX plugin
All Classes Functions Variables Typedefs Modules
linear_implicit_timestep.h
1/*
2 * SPDX-FileCopyrightText: Copyright (c) 2014-2025: G-CSC, Goethe University Frankfurt
3 * SPDX-License-Identifier: LicenseRef-UG4-LGPL-3.0
4 *
5 * Author: Arne Naegel
6 *
7 * This file is part of UG4.
8 *
9 * UG4 is free software: you can redistribute it and/or modify it under the
10 * terms of the GNU Lesser General Public License version 3 (as published by the
11 * Free Software Foundation) with the following additional attribution
12 * requirements (according to LGPL/GPL v3 §7):
13 *
14 * (1) The following notice must be displayed in the Appropriate Legal Notices
15 * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
16 *
17 * (2) The following notice must be displayed at a prominent place in the
18 * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
19 *
20 * (3) The following bibliography is recommended for citation and must be
21 * preserved in all covered files:
22 * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
23 * parallel geometric multigrid solver on hierarchically distributed grids.
24 * Computing and visualization in science 16, 4 (2013), 151-164"
25 * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
26 * flexible software system for simulating pde based models on high performance
27 * computers. Computing and visualization in science 16, 4 (2013), 165-179"
28 *
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU Lesser General Public License for more details.
33 */
34
35#ifndef LIMEX_H_
36#define LIMEX_H_
37
38// extern libraries
39#include <vector>
40#include <cmath>
41
42// ug libraries
43#include "common/common.h"
44#include "common/util/smart_pointer.h"
45
46#include "lib_disc/time_disc/time_disc_interface.h"
47#include "lib_disc/assemble_interface.h"
48#include "lib_disc/operator/non_linear_operator/assembled_non_linear_operator.h"
49#include "lib_disc/operator/linear_operator/assembled_linear_operator.h"
50
51#include "lib_algebra/algebra_template_define_helper.h"
52#include "lib_algebra/operator/debug_writer.h"
53
54namespace ug{
55
59
71template <class TAlgebra>
73: public ITimeDiscretization<TAlgebra>,
74 public DebugWritingObject<TAlgebra>
75
76{
77public:
79 typedef ITimeDiscretization<TAlgebra> base_type;
80
82 typedef TAlgebra algebra_type;
83
85 typedef typename algebra_type::matrix_type matrix_type;
86
88 typedef typename algebra_type::vector_type vector_type;
89
91 typedef IDomainDiscretization<algebra_type> domain_discretization_type;
92
93public:
95 LinearImplicitEuler(SmartPtr<IDomainDiscretization<algebra_type> > spDD)
96 : ITimeDiscretization<TAlgebra>(spDD),
97 m_pPrevSol(NULL),
98 m_dt(0.0),
99 m_futureTime(0.0),
100 m_spMatrixJDisc(spDD), m_spMatrixJOp(SPNULL), m_bMatrixJNeedsUpdate(true), m_useLinearMode(false),
101 m_spGammaDisc(SPNULL), m_spGammaOp(SPNULL), m_bGammaNeedsUpdate(true),
102 m_useCachedMatrices(true)
103 {}
104
106 LinearImplicitEuler(SmartPtr<IDomainDiscretization<algebra_type> > spDefectDisc,
107 SmartPtr<IDomainDiscretization<algebra_type> > spMatrixJDisc)
108 : ITimeDiscretization<TAlgebra>(spDefectDisc),
109 m_pPrevSol(NULL),
110 m_dt(0.0),
111 m_futureTime(0.0),
112 m_spMatrixJDisc(spMatrixJDisc), m_spMatrixJOp(SPNULL), m_bMatrixJNeedsUpdate(true), m_useLinearMode(false),
113 m_spGammaDisc(SPNULL), m_spGammaOp(SPNULL), m_bGammaNeedsUpdate(true),
114 m_useCachedMatrices(true)
115 {}
116
118 LinearImplicitEuler(SmartPtr<IDomainDiscretization<algebra_type> > spDefectDisc,
119 SmartPtr<IDomainDiscretization<algebra_type> > spMatrixJDisc,
120 SmartPtr<IDomainDiscretization<algebra_type> > spGammaDisc)
121 : ITimeDiscretization<TAlgebra>(spDefectDisc),
122 m_pPrevSol(NULL),
123 m_dt(0.0),
124 m_futureTime(0.0),
125 m_spMatrixJDisc(spMatrixJDisc), m_spMatrixJOp(SPNULL), m_bMatrixJNeedsUpdate(true), m_useLinearMode(false),
126 m_spGammaDisc(spGammaDisc), m_spGammaOp(SPNULL), m_bGammaNeedsUpdate(true),
127 m_useCachedMatrices(true)
128 {}
129
132
133public:
135 virtual size_t num_prev_steps() const {return m_prevSteps;}
136
138 virtual void prepare_step(SmartPtr<VectorTimeSeries<vector_type> > prevSol,
139 number dt);
140
142 virtual void prepare_step_elem(SmartPtr<VectorTimeSeries<vector_type> > prevSol,
143 number dt, const GridLevel& gl);
144
146 virtual void finish_step(SmartPtr<VectorTimeSeries<vector_type> > currSol) {};
147
149 virtual void finish_step_elem(SmartPtr<VectorTimeSeries<vector_type> > currSol,
150 const GridLevel& gl);
151
152 virtual number future_time() const {return m_futureTime;}
153
154public:
155
157 void assemble_jacobian(matrix_type& J, const vector_type& u, const GridLevel& gl);
158
160 void assemble_defect(vector_type& d, const vector_type& u, const GridLevel& gl);
161
163 void assemble_linear(matrix_type& A, vector_type& b, const GridLevel& gl);
164
165 void assemble_rhs(vector_type& b, const vector_type& u, const GridLevel& gl);
166
167 void assemble_rhs(vector_type& b, const GridLevel& gl);
168
169 void adjust_solution(vector_type& u, const GridLevel& gl);
170
171 virtual size_t num_stages() const {return 1;};
172 virtual void set_stage(size_t stage) {};
173
174
176 void enable_linear_mode() { m_useLinearMode = true; }
177 void disable_linear_mode() { m_useLinearMode = false; }
178 bool use_linear_mode() const { return m_useLinearMode; }
179
180 void enable_matrix_cache() { m_useCachedMatrices = true; }
181 void disable_matrix_cache() { m_useCachedMatrices = false; }
182 void set_matrix_cache(bool useCache) { m_useCachedMatrices = useCache; }
183
184protected:
185
186 virtual number update_scaling(std::vector<number>& vSM,
187 std::vector<number>& vSA,
188 number dt, number currentTime,
189 ConstSmartPtr<VectorTimeSeries<vector_type> > prevSol)
190
191 {
192 // resize scaling factors
193 vSM.resize(1);
194 vSM[0] = 1.0;
195
196 vSA.resize(1);
197 vSA[0] = dt;
198
199 return currentTime + dt;
200 }
201
202 static const size_t m_prevSteps=1;
203 std::vector<number> m_vScaleMass;
204 std::vector<number> m_vScaleStiff;
205
206 SmartPtr<VectorTimeSeries<vector_type> > m_pPrevSol;
207 number m_dt;
209
210 // discretization for defect
211 using base_type::m_spDomDisc;
212
213
214 // constant matrix $$ \tau J$$
215 SmartPtr<IDomainDiscretization<algebra_type> > m_spMatrixJDisc;
216 SmartPtr<AssembledLinearOperator<algebra_type> > m_spMatrixJOp;
217 bool m_bMatrixJNeedsUpdate;
218 bool m_useLinearMode;
219
220 // Matrix: $\Gamma[u0, u0']$
221 SmartPtr<IDomainDiscretization<algebra_type> > m_spGammaDisc;
222 SmartPtr<AssembledLinearOperator<algebra_type> > m_spGammaOp;
223 bool m_bGammaNeedsUpdate;
224
225 SmartPtr<matrix_type> m_spMatrixCacheMk;
226
227 bool m_useCachedMatrices;
228
229public:
230
233 {
234 m_spMatrixCacheMk = SPNULL;
235 m_bMatrixJNeedsUpdate = true;
237 }
238
241 { m_spGammaOp = SPNULL; m_bGammaNeedsUpdate = true; }
242
243 void set_gamma_disc(SmartPtr<IDomainDiscretization<algebra_type> > spGammaDisc)
244 {m_spGammaDisc = spGammaDisc;}
245
246 using DebugWritingObject<TAlgebra>::set_debug;
247
248protected:
249 using DebugWritingObject<TAlgebra>::write_debug;
250 using DebugWritingObject<TAlgebra>::debug_writer;
251
252};
253
254// end group limex
256
257} // namespace ug
258#endif
ITimeDiscretization< algebra_type > base_type
Definition linear_implicit_timestep.h:79
static const size_t m_prevSteps
Definition linear_implicit_timestep.h:202
void assemble_jacobian(matrix_type &J, const vector_type &u, const GridLevel &gl)
Meant to assemble J(u) c = d(u), but abused here... (u not used!)
Definition linear_implicit_timestep.cpp:197
SmartPtr< AssembledLinearOperator< algebra_type > > m_spGammaOp
Definition linear_implicit_timestep.h:222
algebra_type::vector_type vector_type
Definition linear_implicit_timestep.h:88
algebra_type algebra_type
Definition linear_implicit_timestep.h:82
LinearImplicitEuler(SmartPtr< IDomainDiscretization< algebra_type > > spDD)
CTOR.
Definition linear_implicit_timestep.h:95
std::vector< number > m_vScaleMass
Definition linear_implicit_timestep.h:203
void enable_linear_mode()
Some simplifications for linear systems. (In this case, the mass matrix is not re-assembled....
Definition linear_implicit_timestep.h:176
LinearImplicitEuler(SmartPtr< IDomainDiscretization< algebra_type > > spDefectDisc, SmartPtr< IDomainDiscretization< algebra_type > > spMatrixJDisc, SmartPtr< IDomainDiscretization< algebra_type > > spGammaDisc)
CTOR.
Definition linear_implicit_timestep.h:118
IDomainDiscretization< algebra_type > domain_discretization_type
Definition linear_implicit_timestep.h:91
virtual size_t num_prev_steps() const
Definition linear_implicit_timestep.h:135
virtual ~LinearImplicitEuler()
DTOR.
Definition linear_implicit_timestep.h:131
SmartPtr< IDomainDiscretization< algebra_type > > m_spGammaDisc
Definition linear_implicit_timestep.h:221
void assemble_linear(matrix_type &A, vector_type &b, const GridLevel &gl)
Should return (M+tau A) delta = tau f.
Definition linear_implicit_timestep.cpp:382
number m_futureTime
Definition linear_implicit_timestep.h:208
SmartPtr< AssembledLinearOperator< algebra_type > > m_spMatrixJOp
Definition linear_implicit_timestep.h:216
virtual void prepare_step(SmartPtr< VectorTimeSeries< vector_type > > prevSol, number dt)
Definition linear_implicit_timestep.cpp:52
void assemble_defect(vector_type &d, const vector_type &u, const GridLevel &gl)
Meant to assemble d(u), but abused here... (u not used!)
Definition linear_implicit_timestep.cpp:307
LinearImplicitEuler(SmartPtr< IDomainDiscretization< algebra_type > > spDefectDisc, SmartPtr< IDomainDiscretization< algebra_type > > spMatrixJDisc)
CTOR.
Definition linear_implicit_timestep.h:106
void invalidate()
Invalidate all cached operators.
Definition linear_implicit_timestep.h:232
virtual void finish_step(SmartPtr< VectorTimeSeries< vector_type > > currSol)
Definition linear_implicit_timestep.h:146
algebra_type::matrix_type matrix_type
Definition linear_implicit_timestep.h:85
number m_dt
Definition linear_implicit_timestep.h:207
virtual void finish_step_elem(SmartPtr< VectorTimeSeries< vector_type > > currSol, const GridLevel &gl)
Definition linear_implicit_timestep.cpp:165
virtual void prepare_step_elem(SmartPtr< VectorTimeSeries< vector_type > > prevSol, number dt, const GridLevel &gl)
Definition linear_implicit_timestep.cpp:104
SmartPtr< VectorTimeSeries< vector_type > > m_pPrevSol
Definition linear_implicit_timestep.h:206
void invalidate_gamma()
Invalidate Gamma operator.
Definition linear_implicit_timestep.h:240
std::vector< number > m_vScaleStiff
Definition linear_implicit_timestep.h:204