OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
ImplicitReachSolver.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 Caleb Buahin
3
12
13#pragma once
14
15#include <array>
16#include <vector>
17
18#include "NetworkMeshData.hpp"
19#include "FvKernels.hpp"
20#include "NativeGmres.hpp"
21
22namespace openswmm::fv {
23
30public:
31 using Pair = std::array<double, 2>;
32 using Block = std::array<double, 4>; // row major
33 struct Problem {
34 const NetworkMeshData* mesh = nullptr;
35 std::vector<double> old_area, old_discharge;
36 // NaN denotes a wall; finite values are depths over the flat bed (ft).
37 double left_depth = 0.0, right_depth = 0.0;
38 double lower_depth = 0.0, upper_depth = 0.0;
39 };
40 struct Endpoint {
41 std::vector<double> area, discharge, depth;
42 std::vector<kernels::FaceFlux> faces;
43 };
47 int failed_block = -1;
48 // Elimination pivot/row-scale ratio, NOT a condition-number estimate.
49 double minimum_pivot_ratio = 1.0;
50 };
66 struct Controls {
67 int max_newton = 30, max_backtracks = 24;
68 double absolute_volume = 1.e-11, relative_volume = 1.e-12;
69 double absolute_momentum = 1.e-11, relative_momentum = 1.e-12;
70 // Local finite-difference Jacobian for the first reference prototype;
71 // all trial residuals re-evaluate the real closure and HLL selections.
72 double difference_step = 1.e-4;
74 };
99 std::vector<Block> lower, diagonal, upper;
100 std::vector<Pair> residual, row_scale;
102 };
103
127 static bool residual(const Problem& p, const std::vector<Pair>& trial, double dt,
128 std::vector<Pair>& output,
129 std::vector<kernels::FaceFlux>* faces = nullptr);
154 static bool linearize(const Problem& p, const std::vector<Pair>& trial, double dt,
155 double difference_step, Linearization& out);
173 static bool solveBlocks(const Linearization& l, const std::vector<Pair>& rhs,
174 std::vector<Pair>& output, double& relative_residual,
175 BlockDiagnostics* diagnostics = nullptr);
195 static LinearResult solveLinear(const Linearization& l, const std::vector<Pair>& rhs,
196 const LinearControls& controls, std::vector<Pair>& output);
221 Result solve(const Problem& p, double dt, const Controls& controls, Endpoint& output);
222};
223} // namespace openswmm::fv
Single-source scalar kernels for the explicit FV 1D network solver.
Native GMRES iteration for finite-volume linear systems.
SoA storage for the 1D finite-volume network mesh and its state.
Definition ImplicitReachSolver.hpp:29
static LinearResult solveLinear(const Linearization &l, const std::vector< Pair > &rhs, const LinearControls &controls, std::vector< Pair > &output)
Solve the original scaled reach system with structured elimination or fixed right-preconditioned GMRE...
Definition ImplicitReachSolver.cpp:419
Result solve(const Problem &p, double dt, const Controls &controls, Endpoint &output)
Solve one supported implicit reach timestep with bounded Newton/backtracking.
Definition ImplicitReachSolver.cpp:585
Status
Definition ImplicitReachSolver.hpp:75
@ LinearFailure
Definition ImplicitReachSolver.hpp:79
@ LineSearchFailed
Definition ImplicitReachSolver.hpp:80
@ NonFinite
Definition ImplicitReachSolver.hpp:78
@ IterationLimit
Definition ImplicitReachSolver.hpp:81
@ InvalidInput
Definition ImplicitReachSolver.hpp:77
@ Converged
Definition ImplicitReachSolver.hpp:76
static bool linearize(const Problem &p, const std::vector< Pair > &trial, double dt, double difference_step, Linearization &out)
Build the scaled local block-tridiagonal finite-difference Jacobian.
Definition ImplicitReachSolver.cpp:280
std::array< double, 2 > Pair
Definition ImplicitReachSolver.hpp:31
Preconditioner
Definition ImplicitReachSolver.hpp:45
@ BlockLine
Definition ImplicitReachSolver.hpp:45
@ BlockJacobi
Definition ImplicitReachSolver.hpp:45
LinearMethod
Definition ImplicitReachSolver.hpp:44
@ GmresOnly
Definition ImplicitReachSolver.hpp:44
@ StructuredOnly
Definition ImplicitReachSolver.hpp:44
@ StructuredThenGmres
Definition ImplicitReachSolver.hpp:44
static bool solveBlocks(const Linearization &l, const std::vector< Pair > &rhs, std::vector< Pair > &output, double &relative_residual, BlockDiagnostics *diagnostics=nullptr)
Solve the scaled block-tridiagonal system with native two-by-two Thomas elimination.
Definition ImplicitReachSolver.cpp:349
std::array< double, 4 > Block
Definition ImplicitReachSolver.hpp:32
static bool residual(const Problem &p, const std::vector< Pair > &trial, double dt, std::vector< Pair > &output, std::vector< kernels::FaceFlux > *faces=nullptr)
Evaluate backward-Euler integrated volume and momentum residuals.
Definition ImplicitReachSolver.cpp:253
Definition Controls.cpp:47
Definition AcceptedWaterVolumes.hpp:8
Definition ImplicitReachSolver.hpp:46
double minimum_pivot_ratio
Definition ImplicitReachSolver.hpp:49
int failed_block
Definition ImplicitReachSolver.hpp:47
Definition ImplicitReachSolver.hpp:66
double difference_step
Definition ImplicitReachSolver.hpp:72
double relative_momentum
Definition ImplicitReachSolver.hpp:69
double absolute_momentum
Definition ImplicitReachSolver.hpp:69
double absolute_volume
Definition ImplicitReachSolver.hpp:68
int max_backtracks
Definition ImplicitReachSolver.hpp:67
int max_newton
Definition ImplicitReachSolver.hpp:67
LinearControls linear
Definition ImplicitReachSolver.hpp:73
double relative_volume
Definition ImplicitReachSolver.hpp:68
Definition ImplicitReachSolver.hpp:40
std::vector< double > depth
Definition ImplicitReachSolver.hpp:41
std::vector< kernels::FaceFlux > faces
Definition ImplicitReachSolver.hpp:42
std::vector< double > discharge
Definition ImplicitReachSolver.hpp:41
std::vector< double > area
Definition ImplicitReachSolver.hpp:41
Definition ImplicitReachSolver.hpp:51
Preconditioner preconditioner
Definition ImplicitReachSolver.hpp:53
LinearMethod method
Definition ImplicitReachSolver.hpp:52
NativeGmres::Controls gmres
Definition ImplicitReachSolver.hpp:54
Definition ImplicitReachSolver.hpp:56
NativeGmres::Result gmres
Definition ImplicitReachSolver.hpp:63
BlockDiagnostics direct
Definition ImplicitReachSolver.hpp:62
double maximum_preconditioner_shift
Definition ImplicitReachSolver.hpp:60
bool converged
Definition ImplicitReachSolver.hpp:57
std::size_t wrapper_bytes
Definition ImplicitReachSolver.hpp:61
int shifted_preconditioner_blocks
Definition ImplicitReachSolver.hpp:59
bool used_gmres
Definition ImplicitReachSolver.hpp:57
double relative_residual
Definition ImplicitReachSolver.hpp:64
int identity_preconditioner_blocks
Definition ImplicitReachSolver.hpp:58
bool fallback
Definition ImplicitReachSolver.hpp:57
Definition ImplicitReachSolver.hpp:98
std::vector< Block > diagonal
Definition ImplicitReachSolver.hpp:99
std::vector< Block > lower
Definition ImplicitReachSolver.hpp:99
Pair column_scale
Definition ImplicitReachSolver.hpp:101
std::vector< Pair > residual
Definition ImplicitReachSolver.hpp:100
std::vector< Block > upper
Definition ImplicitReachSolver.hpp:99
std::vector< Pair > row_scale
Definition ImplicitReachSolver.hpp:100
Definition ImplicitReachSolver.hpp:33
std::vector< double > old_discharge
Definition ImplicitReachSolver.hpp:35
std::vector< double > old_area
Definition ImplicitReachSolver.hpp:35
double right_depth
Definition ImplicitReachSolver.hpp:37
const NetworkMeshData * mesh
Definition ImplicitReachSolver.hpp:34
double upper_depth
Definition ImplicitReachSolver.hpp:38
double left_depth
Definition ImplicitReachSolver.hpp:37
double lower_depth
Definition ImplicitReachSolver.hpp:38
Definition ImplicitReachSolver.hpp:83
int gmres_solves
Definition ImplicitReachSolver.hpp:89
int linear_fallbacks
Definition ImplicitReachSolver.hpp:89
double scaled_residual
Definition ImplicitReachSolver.hpp:86
double linear_relative_residual
Definition ImplicitReachSolver.hpp:88
bool converged() const
Report whether the nonlinear reach residual passed every physical budget.
Definition ImplicitReachSolver.hpp:96
int gmres_iterations
Definition ImplicitReachSolver.hpp:89
int backtracks
Definition ImplicitReachSolver.hpp:85
int newton_iterations
Definition ImplicitReachSolver.hpp:85
std::size_t max_gmres_workspace_bytes
Definition ImplicitReachSolver.hpp:90
double max_momentum_residual
Definition ImplicitReachSolver.hpp:87
LinearResult last_linear
Definition ImplicitReachSolver.hpp:91
Status status
Definition ImplicitReachSolver.hpp:84
double max_volume_residual
Definition ImplicitReachSolver.hpp:87
Definition NativeGmres.hpp:28
Definition NativeGmres.hpp:45
SoA mesh geometry and topology for the FV network solver.
Definition NetworkMeshData.hpp:123