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