Loading [MathJax]/extensions/tex2jax.js
Plugins
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
time_integrator.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: Copyright (c) 2014: G-CSC, Goethe University Frankfurt
3 * SPDX-License-Identifier: LicenseRef-UG4-LGPL-3.0
4 *
5 * Author: Arne Naegel, Andreas Kreienbuehl
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 __H__LIMEX__TIME_INTEGRATOR_HPP__
36#define __H__LIMEX__TIME_INTEGRATOR_HPP__
37
38#if __cplusplus >= 201103L
39#define OVERRIDE override
40#else
41#define OVERRIDE
42#endif
43
44// std headers.
45#include <string>
46
47// UG4 headers
52#include "lib_disc/assemble_interface.h" // TODO: missing IAssemble in following file:
61#include "lib_disc/function_spaces/grid_function_util.h" // SaveVectorForConnectionViewer
62#include "lib_disc/function_spaces/interpolate.h" //Interpolate
63#include "lib_disc/function_spaces/integrate.h" //Integral
64#include "lib_disc/function_spaces/grid_function.h" //GridFunction
65
66
67// Plugin headers
68#include "time_extrapolation.h"
69#include "../limex_tools.h"
70
71namespace ug {
72
74template<class TDomain, class TAlgebra>
76 : public IOperator< GridFunction<TDomain, TAlgebra> >,
77 public TimeIntegratorSubject<TDomain, TAlgebra>
78{
79 public:
80
81 typedef TAlgebra algebra_type;
82 typedef typename TAlgebra::vector_type vector_type;
83 typedef typename TAlgebra::matrix_type matrix_type;
84
85
86 typedef TDomain domain_type;
88
89 protected:
90 double m_dt;
93
95
97
98
99 public:
100 // constructor
102 : m_dt(1.0), m_lower_tim(0.0), m_upper_tim(0.0), m_precisionBound(1e-10), m_bNoLogOut(false)
103 {}
104
106 virtual ~ITimeIntegrator() {};
107
109
120 virtual void init(grid_function_type const& u)
121 {
122 // UG_ASSERT(m_spDomainDisc.valid(), "TimeIntegrator<TDomain, TAlgebra>::init: m_spDomainDisc invalid.");
123 // m_spTimeDisc = make_sp(new time_disc_type(m_spDomainDisc, m_theta));
124 }
125
126
128
133 void init()
134 { UG_THROW("Please init with grid function!"); }
135
137
138 /* This method is used to prepare the in- and output vector used later in apply.
139 * It can be called, after the init method has been called at least once.
140 * The prepare method is e.g. used to set dirichlet values.
141 */
143
145
147 { UG_THROW("Fix interfaces!"); }
148
150
152 void set_time_step(double dt)
153 { m_dt = dt; }
154
156 { return m_dt; }
157
158 void set_precision_bound(double precisionBound)
159 { m_precisionBound = precisionBound; return; }
160
161 void set_no_log_out(bool bNoLogOut)
162 { m_bNoLogOut = bNoLogOut; return; }
163
164};
165
166
168template<class TDomain, class TAlgebra>
194
195
197template<class TAlgebra>
211
212
214template<class TDomain, class TAlgebra>
239
240
242template<class TDomain, class TAlgebra>
274
275
277template<class TDomain, class TAlgebra>
279 public ILinearTimeIntegrator<TDomain, TAlgebra>,
280 public ITimeDiscDependentObject<TAlgebra>
281{
282protected:
284
285public:
290
291protected:
292
294
296
297
298public:
300 : base_type(), ITimeDiscDependentObject<TAlgebra>(tDisc1), m_tol(1e-2), m_dtmin(-1.0), m_dtmax(-1.0)
301 {
302 m_spTimeDisc2 = tDisc2;
303 }
304
306 {
307 // call base
309 //m_spTimeDisc2 = make_sp(new typename base_type::time_disc_type(base_type::m_spDomainDisc, base_type::m_theta));
310 }
311
313
314 void set_tol(double tol) {m_tol = tol;}
317};
318
319
321{
322public:
324 : m_dtMin(0.0), m_dtMax(std::numeric_limits<double>::max()), m_redFac(1.0), m_incFac(1.0)
325 {}
326
327 void set_dt_min(double min) { m_dtMin = min; }
328 double get_dt_min() { return m_dtMin; }
329
330 void set_dt_max(double max) { m_dtMax = max; }
331 double get_dt_max() { return m_dtMax; }
332
333 void set_reduction_factor(double dec) { m_redFac = dec; }
334 double get_reduction_factor() { return m_redFac; }
335
336 void set_increase_factor(double inc) { m_incFac = inc; }
337 double get_increase_factor() { return m_incFac; }
338
339 void rescale(double alpha)
340 { m_dtMin*= alpha; m_dtMax*= alpha;}
341
342protected:
345};
346
348template<class TDomain, class TAlgebra>
387
388
390template<class TDomain, class TAlgebra>
392 public INonlinearTimeIntegrator<TDomain, TAlgebra>
393{
394public:
395
398
401
403 {
404 int dstep = 0;
405 auto tpoint = m_timePoints.begin();
406 double tcurr = (tpoint == m_timePoints.end()) ? t1 : (*tpoint);
407 double eps = 1e-8;
408
409 // Perform first step.
410 //this->notify_init_step(u0, dstep, t0, tcurr-t0);
411 bool status = m_wrappedIntegrator->apply(u1, tcurr*(1.0-eps), u0, t0);
412 this->notify_finalize_step(u1, dstep++, tcurr, tcurr-t0);
413
414 // Repeat for all intermediate points.
415 while (tpoint != m_timePoints.end())
416 {
417 tpoint++;
418 double tnext = (tpoint == m_timePoints.end()) ? t1 : (*tpoint);
419
420 // Perform step.
421 //this->notify_init_step(u1, dstep, tcurr, tnext-tcurr);
422 status = status && m_wrappedIntegrator->apply(u1, tnext*(1.0-eps), u1, tcurr);
423 this->notify_finalize_step(u1, dstep++, tnext, tnext-tcurr);
424
425 tcurr = tnext;
426 }
427 this->notify_end(u1, dstep, t1, 0.0);
428 return status;
429 }
430
431 void insert_points (std::vector<double> points)
432 {
433 m_timePoints = points;
434 }
435protected:
437 std::vector<double> m_timePoints;
438};
439
440} // namespace ug
441
443
444#endif /* __H__LIMEX__TIME_INTEGRATOR_HPP__ */
Integrate over a given time interval (for a linear problem)
Definition time_integrator.hpp:246
ConstStepLinearTimeIntegrator(SmartPtr< time_disc_type > tDisc)
Definition time_integrator.hpp:264
base_type::linear_solver_type linear_solver_type
Definition time_integrator.hpp:252
base_type::grid_function_type grid_function_type
Definition time_integrator.hpp:253
void set_num_steps(int steps)
Definition time_integrator.hpp:270
VectorTimeSeries< typename base_type::vector_type > vector_time_series_type
Definition time_integrator.hpp:254
bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)
Definition time_integrator_impl.hpp:135
int m_numSteps
Definition time_integrator.hpp:260
ConstStepLinearTimeIntegrator(SmartPtr< time_disc_type > tDisc, SmartPtr< typename base_type::linear_solver_type > lSolver)
Definition time_integrator.hpp:267
ILinearTimeIntegrator< TDomain, TAlgebra > base_type
Definition time_integrator.hpp:250
ITimeDiscDependentObject< TAlgebra > tdisc_dep_type
Definition time_integrator.hpp:248
ITimeDiscretization< TAlgebra > time_disc_type
Definition time_integrator.hpp:251
This class integrates (t0, t1] with stops at intermediate points tk.
Definition time_integrator.hpp:393
DiscontinuityIntegrator(SmartPtr< base_type > baseIntegrator)
Definition time_integrator.hpp:399
void insert_points(std::vector< double > points)
Definition time_integrator.hpp:431
SmartPtr< base_type > m_wrappedIntegrator
Definition time_integrator.hpp:436
base_type::grid_function_type grid_function_type
Definition time_integrator.hpp:397
INonlinearTimeIntegrator< TDomain, TAlgebra > base_type
Definition time_integrator.hpp:396
bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)
Definition time_integrator.hpp:402
std::vector< double > m_timePoints
Definition time_integrator.hpp:437
Integration of linear systems.
Definition time_integrator.hpp:170
ILinearOperatorInverse< vector_type > linear_solver_type
Definition time_integrator.hpp:175
void set_linear_solver(SmartPtr< linear_solver_type > lSolver)
Definition time_integrator.hpp:187
AssembledLinearOperator< TAlgebra > assembled_operator_type
Definition time_integrator.hpp:176
ILinearTimeIntegrator()
Definition time_integrator.hpp:179
SmartPtr< linear_solver_type > m_spLinearSolver
Definition time_integrator.hpp:191
ITimeIntegrator< TDomain, TAlgebra > base_type
Definition time_integrator.hpp:173
ILinearTimeIntegrator(SmartPtr< linear_solver_type > lSolver)
Definition time_integrator.hpp:182
base_type::vector_type vector_type
Definition time_integrator.hpp:174
Integration of non-linear systems (with bounds on dt)
Definition time_integrator.hpp:351
double get_reduction_factor()
Definition time_integrator.hpp:377
AssembledOperator< TAlgebra > assembled_operator_type
Definition time_integrator.hpp:356
double get_dt_max()
Definition time_integrator.hpp:374
void set_dt_min(double min)
Definition time_integrator.hpp:370
base_type::vector_type vector_type
Definition time_integrator.hpp:354
INonlinearTimeIntegrator()
Definition time_integrator.hpp:358
ITimeIntegrator< TDomain, TAlgebra > base_type
Definition time_integrator.hpp:353
ConstSmartPtr< solver_type > get_solver() const
Definition time_integrator.hpp:364
TimeStepBounds m_dtBounds
Definition time_integrator.hpp:384
IOperatorInverse< vector_type > solver_type
Definition time_integrator.hpp:355
SmartPtr< solver_type > m_spSolver
Definition time_integrator.hpp:383
double get_increase_factor()
Definition time_integrator.hpp:380
void set_increase_factor(double inc)
Definition time_integrator.hpp:379
void set_solver(SmartPtr< solver_type > solver)
Definition time_integrator.hpp:361
void set_reduction_factor(double dec)
Definition time_integrator.hpp:376
SmartPtr< solver_type > get_solver()
Definition time_integrator.hpp:367
double get_dt_min()
Definition time_integrator.hpp:371
void set_dt_max(double max)
Definition time_integrator.hpp:373
ITimeDiscDependentObject.
Definition time_integrator.hpp:199
SmartPtr< time_disc_type > m_spTimeDisc
Definition time_integrator.hpp:209
SmartPtr< time_disc_type > get_time_disc()
Definition time_integrator.hpp:207
ITimeDiscretization< TAlgebra > time_disc_type
Definition time_integrator.hpp:201
ITimeDiscDependentObject(SmartPtr< time_disc_type > spTimeDisc)
Definition time_integrator.hpp:203
Integrates over a given time interval [a,b] with step size dt.
Definition time_integrator.hpp:78
TDomain domain_type
Definition time_integrator.hpp:86
void set_precision_bound(double precisionBound)
Definition time_integrator.hpp:158
void prepare(grid_function_type &u)
prepares functions for application
Definition time_integrator.hpp:142
void init()
init operator
Definition time_integrator.hpp:133
double m_lower_tim
Definition time_integrator.hpp:91
virtual void init(grid_function_type const &u)
init operator depending on a function u
Definition time_integrator.hpp:120
GridFunction< TDomain, TAlgebra > grid_function_type
Definition time_integrator.hpp:87
void set_no_log_out(bool bNoLogOut)
Definition time_integrator.hpp:161
TAlgebra::matrix_type matrix_type
Definition time_integrator.hpp:83
double m_dt
Definition time_integrator.hpp:90
virtual ~ITimeIntegrator()
virtual destructor
Definition time_integrator.hpp:106
bool m_bNoLogOut
Definition time_integrator.hpp:96
void set_time_step(double dt)
Set initial time step.
Definition time_integrator.hpp:152
double m_upper_tim
Definition time_integrator.hpp:92
virtual bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)=0
TAlgebra::vector_type vector_type
Definition time_integrator.hpp:82
double get_time_step()
Definition time_integrator.hpp:155
TAlgebra algebra_type
Definition time_integrator.hpp:81
void apply(grid_function_type &u1, const grid_function_type &u0)
Apply operator.
Definition time_integrator.hpp:146
double m_precisionBound
Definition time_integrator.hpp:94
ITimeIntegrator()
Definition time_integrator.hpp:101
Integrate over a given time interval (for a linear problem)
Definition time_integrator.hpp:219
bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)
Definition time_integrator_impl.hpp:42
ITimeDiscretization< TAlgebra > time_disc_type
Definition time_integrator.hpp:226
ITimeDiscDependentObject< TAlgebra > tdisc_dep_type
Definition time_integrator.hpp:223
base_type::grid_function_type grid_function_type
Definition time_integrator.hpp:227
LinearTimeIntegrator(SmartPtr< time_disc_type > tDisc, SmartPtr< typename base_type::linear_solver_type > lSolver)
Definition time_integrator.hpp:234
VectorTimeSeries< typename base_type::vector_type > vector_time_series_type
Definition time_integrator.hpp:228
ILinearTimeIntegrator< TDomain, TAlgebra > base_type
Definition time_integrator.hpp:225
LinearTimeIntegrator(SmartPtr< time_disc_type > tDisc)
Definition time_integrator.hpp:231
Integrate over a given time interval (for a linear problem)
Definition time_integrator.hpp:281
ITimeDiscDependentObject< TAlgebra > tdisc_dep_type
Definition time_integrator.hpp:283
VectorTimeSeries< typename base_type::vector_type > vector_time_series_type
Definition time_integrator.hpp:289
TimeIntegratorLinearAdaptive(SmartPtr< time_disc_type > tDisc1, SmartPtr< time_disc_type > tDisc2)
Definition time_integrator.hpp:299
double m_tol
Definition time_integrator.hpp:295
void set_time_step_max(number dt)
Definition time_integrator.hpp:316
ITimeDiscretization< TAlgebra > time_disc_type
Definition time_integrator.hpp:287
double m_dtmax
Definition time_integrator.hpp:295
bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)
Definition time_integrator_impl.hpp:229
void set_tol(double tol)
Definition time_integrator.hpp:314
void set_time_step_min(number dt)
Definition time_integrator.hpp:315
void init(grid_function_type const &u)
init operator depending on a function u
Definition time_integrator.hpp:305
double m_dtmin
Definition time_integrator.hpp:295
SmartPtr< time_disc_type > m_spTimeDisc2
Definition time_integrator.hpp:293
ILinearTimeIntegrator< TDomain, TAlgebra > base_type
Definition time_integrator.hpp:286
base_type::grid_function_type grid_function_type
Definition time_integrator.hpp:288
Definition time_integrator.hpp:321
void set_increase_factor(double inc)
Definition time_integrator.hpp:336
double get_reduction_factor()
Definition time_integrator.hpp:334
TimeStepBounds()
Definition time_integrator.hpp:323
void set_dt_min(double min)
Definition time_integrator.hpp:327
void set_dt_max(double max)
Definition time_integrator.hpp:330
double m_incFac
Definition time_integrator.hpp:344
double m_redFac
Definition time_integrator.hpp:344
double m_dtMin
Definition time_integrator.hpp:343
double get_dt_max()
Definition time_integrator.hpp:331
void rescale(double alpha)
Definition time_integrator.hpp:339
void set_reduction_factor(double dec)
Definition time_integrator.hpp:333
double m_dtMax
Definition time_integrator.hpp:343
double get_increase_factor()
Definition time_integrator.hpp:337
double get_dt_min()
Definition time_integrator.hpp:328
#define UG_THROW(msg)
double number