numerics 0.1.0
Loading...
Searching...
No Matches
implicit.hpp
Go to the documentation of this file.
1/// @file ode/implicit.hpp
2/// @brief Implicit time integration via a user-supplied LinearSolver.
3///
4/// advance(u, solver, params) -- fixed-step backward Euler, no
5/// observer advance(u, solver, params, obs) -- same, with step callback
6///
7/// The field type is constrained by the VecField concept (core/concepts.hpp):
8/// any object exposing .vec() -> Vector& works (Vector itself, ScalarField2D,
9/// ScalarField3D, ...). This keeps ode/ independent of the fields/ module while
10/// supporting all types.
11/// @todo Add Crank-Nicolson, BDF2, and IMEX step drivers with explicit mass
12/// matrix/operator hooks.
13#pragma once
14
15#include "core/concepts.hpp"
16#include "core/vector.hpp"
18
19namespace num {
20namespace ode {
21
22/// Parameters for fixed-step implicit integration.
24 int nstep; ///< number of time steps
25 double dt; ///< step size (reported to observer as t)
26};
27
28/// Advance u by nstep implicit steps using solver.
29/// obs(step, t, u) is called at step 0 (initial) and after each solve.
30template<VecField Field, typename Observer>
31void advance(Field& u, const LinearSolver& solver, ImplicitParams p, Observer&& obs) {
32 obs(0, 0.0, u);
33 for (int s = 0; s < p.nstep; ++s) {
34 Vector rhs = u.vec();
35 solver(rhs, u.vec());
36 obs(s + 1, (s + 1) * p.dt, u);
37 }
38}
39
40/// Overload without observer.
41template<VecField Field>
42void advance(Field& u, const LinearSolver& solver, ImplicitParams p) {
43 for (int s = 0; s < p.nstep; ++s) {
44 Vector rhs = u.vec();
45 solver(rhs, u.vec());
46 }
47}
48
49} // namespace ode
50} // namespace num
BasicVector & vec()
Definition vector.hpp:85
Storage and operator concepts for numerical routines.
Universal linear solver callable type.
void advance(Field &u, const LinearSolver &solver, ImplicitParams p, Observer &&obs)
Definition implicit.hpp:31
std::function< SolverResult(const Vector &rhs, Vector &x)> LinearSolver
Callable that solves .
Parameters for fixed-step implicit integration.
Definition implicit.hpp:23
double dt
step size (reported to observer as t)
Definition implicit.hpp:25
int nstep
number of time steps
Definition implicit.hpp:24
Dense vector storage and operations.