33#ifndef OPENSWMM_ENGINE_2D_ARKODE_SURFACE_SOLVER_HPP
34#define OPENSWMM_ENGINE_2D_ARKODE_SURFACE_SOLVER_HPP
49typedef struct SUNContext_* SUNContext;
50typedef struct _generic_N_Vector* N_Vector;
51typedef struct _generic_SUNLinearSolver* SUNLinearSolver;
55class ArkodeSurfaceSolver;
56#if defined(OPENSWMM_HAVE_HYPRE)
67struct ArkodeSolverContext {
68 MeshData* mesh =
nullptr;
69 SurfaceStateData* state =
nullptr;
70 SolverOptions2D* opts =
nullptr;
71 ArkodeSurfaceSolver* solver =
nullptr;
72 bool amg_active =
false;
80 ArkodeSurfaceSolver();
81 ~ArkodeSurfaceSolver()
override;
83 ArkodeSurfaceSolver(
const ArkodeSurfaceSolver&) =
delete;
84 ArkodeSurfaceSolver& operator=(
const ArkodeSurfaceSolver&) =
delete;
86 ArkodeSurfaceSolver(ArkodeSurfaceSolver&& o)
noexcept;
87 ArkodeSurfaceSolver& operator=(ArkodeSurfaceSolver&& o)
noexcept;
89 void initialize(MeshData& mesh, SurfaceStateData& state,
90 SolverOptions2D& opts)
override;
92 double advance(
double t_current,
double t_target)
override;
94 void reinitialize(
double t0)
override;
96 void finalize()
override;
98 long last_num_steps() const noexcept
override {
return last_nsteps_; }
100 double last_step_size() const noexcept
override {
return last_h_; }
102 const std::vector<double>& last_coupling_exchange() const noexcept
override {
103 return last_coupling_exchange_;
106 bool is_initialized() const noexcept
override {
return arkode_mem_ !=
nullptr; }
109 void* arkode_mem_ =
nullptr;
110 SUNLinearSolver ls_ =
nullptr;
111 N_Vector y_ =
nullptr;
112 N_Vector abstol_ =
nullptr;
113 SUNContext sun_ctx_ =
nullptr;
115 ArkodeSolverContext ctx_;
117 long last_nsteps_ = 0;
118 double last_h_ = 0.0;
125 std::vector<double> coupling_accum_start_;
126 std::vector<double> last_coupling_exchange_;
135 InertialEdges edges_;
144 bool gravity_explicit_ =
true;
151 std::vector<double> prec_dV_;
152 std::vector<double> prec_wq_;
155 std::vector<double> precond_diag_;
157#if defined(OPENSWMM_HAVE_HYPRE)
158 std::unique_ptr<HypreAmgPreconditioner> amg_precond_;
167 static int fe_fn(
double t, N_Vector
y, N_Vector ydot,
void* user_data);
170 static int fi_fn(
double t, N_Vector
y, N_Vector ydot,
void* user_data);
174 static int fe_inertial_fn(
double t, N_Vector
y, N_Vector ydot,
void* user_data);
178 static int fi_inertial_fn(
double t, N_Vector
y, N_Vector ydot,
void* user_data);
183 static int psetup_inertial_fn(
double t, N_Vector
y, N_Vector fy,
184 int jok,
int* jcurPtr,
double gamma,
188 static int psolve_inertial_fn(
double t, N_Vector
y, N_Vector fy,
189 N_Vector r, N_Vector z,
190 double gamma,
double delta,
int lr,
194 static int psetup_fn(
double t, N_Vector
y, N_Vector fy,
195 int jok,
int* jcurPtr,
double gamma,
199 static int psolve_fn(
double t, N_Vector
y, N_Vector fy,
200 N_Vector r, N_Vector z,
201 double gamma,
double delta,
int lr,
Backend-neutral interface for the 2D surface-routing time integrator.
Unique interior-edge structure for the local-inertial momentum DOFs.
Structure-of-Arrays (SoA) storage for 2D triangular mesh geometry.
Configuration options for the 2D surface routing solver.
Structure-of-Arrays (SoA) storage for 2D surface routing state.
BoomerAMG preconditioner over the 2D diffusion Newton matrix.
Definition HypreAmgPreconditioner.hpp:42
Abstract time integrator for the 2D surface-routing ODE system.
Definition ISurfaceSolver.hpp:49
Definition NodeCoupling.cpp:15
MomentumType
Surface-momentum closure for the 2D flux.
Definition SolverOptions2D.hpp:97
double * y
Definition odesolve.c:28