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 observer
5/// advance(u, solver, params, obs) -- same, with step callback
6///
7/// The field type is constrained by the VecField concept: any object exposing
8/// .vec() -> Vector& works (Vector itself, ScalarField2D, ScalarField3D, ...).
9/// This keeps ode/ independent of the fields/ module while supporting all types.
10#pragma once
11
12#include "core/vector.hpp"
14#include <concepts>
15
16namespace num {
17
18template<typename T>
19concept VecField = requires(T& f) {
20 { f.vec() } -> std::same_as<Vector&>;
21};
22
23namespace ode {
24
25/// Parameters for fixed-step implicit integration.
27 int nstep; ///< number of time steps
28 double dt; ///< step size (reported to observer as t)
29};
30
31/// Advance u by nstep implicit steps using solver.
32/// obs(step, t, u) is called at step 0 (initial) and after each solve.
33template<VecField Field, typename Observer>
34void advance(Field& u, const LinearSolver& solver, ImplicitParams p, Observer&& obs) {
35 obs(0, 0.0, u);
36 for (int s = 0; s < p.nstep; ++s) {
37 Vector rhs = u.vec();
38 solver(rhs, u.vec());
39 obs(s + 1, (s + 1) * p.dt, u);
40 }
41}
42
43/// Overload without observer.
44template<VecField Field>
45void advance(Field& u, const LinearSolver& solver, ImplicitParams p) {
46 for (int s = 0; s < p.nstep; ++s) {
47 Vector rhs = u.vec();
48 solver(rhs, u.vec());
49 }
50}
51
52} // namespace ode
53} // namespace num
BasicVector & vec()
Satisfy the VecField concept: a Vector is its own underlying vector.
Definition vector.hpp:83
Universal linear solver callable type.
void advance(Field &u, const LinearSolver &solver, ImplicitParams p, Observer &&obs)
Definition implicit.hpp:34
std::function< SolverResult(const Vector &rhs, Vector &x)> LinearSolver
Parameters for fixed-step implicit integration.
Definition implicit.hpp:26
double dt
step size (reported to observer as t)
Definition implicit.hpp:28
int nstep
number of time steps
Definition implicit.hpp:27
Vector operations.