OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
ImplicitNetworkSolver.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 "NetworkMeshData.hpp"
16#include "FvKernels.hpp"
17#include "NativeGmres.hpp"
18#include <array>
19
20namespace openswmm::fv {
21
32public:
34 struct Problem {
35 const NetworkMeshData* mesh = nullptr;
36 std::vector<double> old_area, old_discharge;
37 // Optional accepted depth, to retain head precision in a stiff slot.
38 // Its closure area must equal old_area exactly; history remains Aold.
39 std::vector<double> initial_depth;
40 // One entry per mesh node. NaN means an unknown head (or an
41 // inactive virtual node); finite means a prescribed absolute head.
42 std::vector<double> fixed_head, initial_head;
43 // Required when physical storage exists: accepted volumes (ft3), one
44 // per node, zero for non-storage nodes. Storage initial_head is the
45 // accepted old head and must reproduce old_node_volume exactly through
46 // the mesh curve. It is never algebraically reinitialized. Prescribed
47 // storage heads and depths above min(full_depth, table top) are rejected.
48 std::vector<double> old_node_volume;
49 // Rates, ft3/s, positive INTO the system. Empty means zero. Cell
50 // sources carry zero momentum. Virtual-node lateral allocation must
51 // already be explicit in cell_lateral; a virtual node cannot own it.
52 std::vector<double> node_lateral, cell_lateral;
54 // Wet mode admits no dry cells or reconstructed sides, even during
55 // line search. This is a rejection bound, never a depth/volume clamp.
56 double minimum_wet_depth = .01;
57 double minimum_slot_excess = .01, maximum_depth = 100.0;
58 };
59 struct Trial {
60 std::vector<double> depth, discharge, head;
61 };
66 struct Evaluation {
67 // Cell rows: integrated volume (ft3) and momentum (ft4/s).
68 // junction: instantaneous signed inflows + lateral (ft3/s), including
69 // physical storage inflows. Only ordinary unknown heads balance to zero.
70 // storage: Vnew - Vold - dt*inflow (ft3); zero at non-storage nodes.
71 std::vector<double> volume, momentum, junction;
72 std::vector<double> storage, node_volume;
73 std::vector<FaceReceipt> faces; // ONE shared mass receipt per face
74 };
75 struct Endpoint : Trial {
76 std::vector<double> area;
77 std::vector<double> node_volume; // physical storage only; others zero
78 std::vector<FaceReceipt> faces;
79 };
80 struct Matrix {
81 std::vector<std::size_t> row;
82 std::vector<int> column;
83 std::vector<double> value;
84 bool apply(const double* x, double* y) const;
85 };
88 std::vector<double> residual, row_scale, column_scale;
89 // Appended head row order, after interleaved cell (h,Q) rows.
90 std::vector<int> nodes;
91 };
105 bool enabled = false, symbolic_reused = false, symbolic_rebuilt = false;
106 bool cache_released = false;
107 std::size_t retained_bytes = 0; // pattern + numeric buffers + Krylov capacities
108 };
109
112 public:
113 std::size_t bytes() const;
114 void release();
115
116 private:
118 bool matches(const Matrix&, Preconditioner, std::size_t pairs) const;
119 std::size_t factorBytes() const;
120 bool valid_ = false;
122 std::size_t pairs_ = 0;
123 std::vector<std::size_t> source_row_, row_, diagonal_, scatter_;
124 std::vector<int> source_column_, column_;
125 std::vector<double> scalar_lu_;
126 std::vector<std::array<double, 4>> block_lu_, inverses_;
127 NativeGmres gmres_;
128 };
130 bool used = false; // attempted; may fail before factorization completes
131 int blocks = 0, failed_block = -1;
132 std::size_t entries = 0; // 1/2-variable blocks, not scalar nonzeros
134 };
136 int dense_limit = 128; // retained scalar unknowns; never a large fallback
137 std::size_t max_schur_entries = 1000000;
138 std::size_t workspace_limit_bytes = 64 * 1024 * 1024;
139 bool reduced_gmres_only = false;
140 bool tree_interface = false; // opt-in exact 1/2-variable leaf elimination
142 Preconditioner::ScalarIlu0; // static solveCondensed selection
143 };
175 struct Controls {
177 double absolute_volume = 1.e-11, relative_volume = 1.e-12;
178 double absolute_momentum = 1.e-11, relative_momentum = 1.e-12;
179 double absolute_junction = 1.e-11, relative_junction = 1.e-12;
180 double difference_step = 1.e-4;
182 LinearMethod method = LinearMethod::FullGmres; // preserve the comparator
183 // Applies to full, reduced/core and fallback solves; overrides the
184 // nested static-API selection when called through solve().
186 bool reuse_linear_workspace = false; // instance-owned, opt-in; fresh numeric factors
188 };
198 struct Result {
201 double scaled_residual = 0.0;
204 double max_storage_residual = 0.0; // ft3; uses volume tolerances
206 std::vector<LinearResult> linear_history; // every attempted correction
207 bool converged() const { return status == Status::Converged; }
208 };
209
212 static bool residual(const Problem&, const Trial&, double dt, Evaluation&);
215 static bool linearize(const Problem&, const Trial&, double dt, double step, Linearization&);
219 static LinearResult solveLinear(const Matrix&, const std::vector<double>& rhs,
220 const NativeGmres::Controls&, std::vector<double>&,
221 LinearWorkspace* = nullptr);
228 static LinearResult solveBlockLinear(const Matrix&, const std::vector<double>& rhs,
229 std::size_t cell_blocks, const NativeGmres::Controls&,
230 std::vector<double>&, LinearWorkspace* = nullptr);
238 static LinearResult solveCondensed(const NetworkMeshData&, const Matrix&,
239 const std::vector<double>& rhs, const NativeGmres::Controls&,
240 const CondensationControls&, bool allow_fallback,
241 std::vector<double>&, LinearWorkspace* = nullptr);
244 static bool initializeHeads(const Problem&, Trial&, double tolerance);
246 Result solve(const Problem&, double dt, const Controls&, Endpoint&);
247 std::size_t linearWorkspaceBytes() const { return linear_workspace_.bytes(); }
248 void clearLinearWorkspace() { linear_workspace_.release(); }
249
250private:
251 LinearWorkspace linear_workspace_;
252};
253} // 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 ImplicitNetworkSolver.hpp:111
void release()
Definition NativeLinearWorkspace.cpp:26
std::size_t bytes() const
Definition NativeLinearWorkspace.cpp:23
friend class ImplicitNetworkSolver
Definition ImplicitNetworkSolver.hpp:117
Definition ImplicitNetworkSolver.hpp:31
Status
Definition ImplicitNetworkSolver.hpp:189
@ LinearFailure
Definition ImplicitNetworkSolver.hpp:193
@ LineSearchFailed
Definition ImplicitNetworkSolver.hpp:194
@ NonFinite
Definition ImplicitNetworkSolver.hpp:196
@ InitializationFailure
Definition ImplicitNetworkSolver.hpp:192
@ IterationLimit
Definition ImplicitNetworkSolver.hpp:195
@ InvalidInput
Definition ImplicitNetworkSolver.hpp:191
@ Converged
Definition ImplicitNetworkSolver.hpp:190
static LinearResult solveBlockLinear(const Matrix &, const std::vector< double > &rhs, std::size_t cell_blocks, const NativeGmres::Controls &, std::vector< double > &, LinearWorkspace *=nullptr)
Definition NativeBlockIlu.cpp:86
CondensationStatus
Definition ImplicitNetworkSolver.hpp:92
@ MemoryLimit
Definition ImplicitNetworkSolver.hpp:99
@ BlockPivot
Definition ImplicitNetworkSolver.hpp:97
@ InterfaceFailure
Definition ImplicitNetworkSolver.hpp:100
@ UnsupportedStencil
Definition ImplicitNetworkSolver.hpp:96
@ NotAttempted
Definition ImplicitNetworkSolver.hpp:93
@ InvalidInput
Definition ImplicitNetworkSolver.hpp:95
@ Converged
Definition ImplicitNetworkSolver.hpp:94
@ FillLimit
Definition ImplicitNetworkSolver.hpp:98
@ ReconstructionFailure
Definition ImplicitNetworkSolver.hpp:101
LinearMethod
Definition ImplicitNetworkSolver.hpp:174
@ CondensedOnly
Definition ImplicitNetworkSolver.hpp:174
@ FullGmres
Definition ImplicitNetworkSolver.hpp:174
@ CondensedThenGmres
Definition ImplicitNetworkSolver.hpp:174
static bool linearize(const Problem &, const Trial &, double dt, double step, Linearization &)
Definition ImplicitNetworkSolver.cpp:454
std::size_t linearWorkspaceBytes() const
Definition ImplicitNetworkSolver.hpp:247
static LinearResult solveLinear(const Matrix &, const std::vector< double > &rhs, const NativeGmres::Controls &, std::vector< double > &, LinearWorkspace *=nullptr)
Definition ImplicitNetworkSolver.cpp:671
Result solve(const Problem &, double dt, const Controls &, Endpoint &)
Failure leaves Endpoint unchanged; no post-convergence water/Q repairs.
Definition ImplicitNetworkSolver.cpp:872
Regime
Definition ImplicitNetworkSolver.hpp:33
@ BoundedWetSlot
Definition ImplicitNetworkSolver.hpp:33
@ PressurizedOnly
Definition ImplicitNetworkSolver.hpp:33
Preconditioner
Definition ImplicitNetworkSolver.hpp:103
@ BlockIlu0
Definition ImplicitNetworkSolver.hpp:103
@ ScalarIlu0
Definition ImplicitNetworkSolver.hpp:103
static bool initializeHeads(const Problem &, Trial &, double tolerance)
Definition ImplicitNetworkSolver.cpp:804
static LinearResult solveCondensed(const NetworkMeshData &, const Matrix &, const std::vector< double > &rhs, const NativeGmres::Controls &, const CondensationControls &, bool allow_fallback, std::vector< double > &, LinearWorkspace *=nullptr)
Definition NativeConduitCondensation.cpp:934
void clearLinearWorkspace()
Definition ImplicitNetworkSolver.hpp:248
static bool residual(const Problem &, const Trial &, double dt, Evaluation &)
Definition ImplicitNetworkSolver.cpp:395
Definition NativeGmres.hpp:25
Definition AcceptedWaterVolumes.hpp:8
double * y
Definition odesolve.c:37
Definition ImplicitNetworkSolver.hpp:129
bool used
Definition ImplicitNetworkSolver.hpp:130
std::size_t entries
Definition ImplicitNetworkSolver.hpp:132
double minimum_pivot_ratio
Definition ImplicitNetworkSolver.hpp:133
double largest_shift
Definition ImplicitNetworkSolver.hpp:133
int failed_block
Definition ImplicitNetworkSolver.hpp:131
int blocks
Definition ImplicitNetworkSolver.hpp:131
Definition ImplicitNetworkSolver.hpp:135
std::size_t workspace_limit_bytes
Definition ImplicitNetworkSolver.hpp:138
bool tree_interface
Definition ImplicitNetworkSolver.hpp:140
bool reduced_gmres_only
Definition ImplicitNetworkSolver.hpp:139
int dense_limit
Definition ImplicitNetworkSolver.hpp:136
std::size_t max_schur_entries
Definition ImplicitNetworkSolver.hpp:137
Preconditioner preconditioner
Definition ImplicitNetworkSolver.hpp:141
Definition ImplicitNetworkSolver.hpp:144
int eliminated
Definition ImplicitNetworkSolver.hpp:146
BlockIluDiagnostics reduced_block_ilu
Definition ImplicitNetworkSolver.hpp:156
WorkspaceDiagnostics reduced_workspace
Definition ImplicitNetworkSolver.hpp:157
double minimum_leaf_pivot_ratio
Definition ImplicitNetworkSolver.hpp:154
std::size_t core_entries
Definition ImplicitNetworkSolver.hpp:153
double full_tolerance
Definition ImplicitNetworkSolver.hpp:149
double reduced_true_residual
Definition ImplicitNetworkSolver.hpp:149
double minimum_interface_pivot_ratio
Definition ImplicitNetworkSolver.hpp:148
int tree_eliminated
Definition ImplicitNetworkSolver.hpp:152
std::size_t schur_entries
Definition ImplicitNetworkSolver.hpp:147
bool used_tree
Definition ImplicitNetworkSolver.hpp:151
int retained
Definition ImplicitNetworkSolver.hpp:146
CondensationStatus status
Definition ImplicitNetworkSolver.hpp:145
double full_true_residual
Definition ImplicitNetworkSolver.hpp:149
bool used_reduced_gmres
Definition ImplicitNetworkSolver.hpp:150
int unsafe_leaf_pivots
Definition ImplicitNetworkSolver.hpp:152
int core_scalars
Definition ImplicitNetworkSolver.hpp:152
double minimum_block_pivot_ratio
Definition ImplicitNetworkSolver.hpp:148
int failed_cell
Definition ImplicitNetworkSolver.hpp:146
double core_true_residual
Definition ImplicitNetworkSolver.hpp:154
int failed_interface_pivot
Definition ImplicitNetworkSolver.hpp:146
NativeGmres::Result reduced
Definition ImplicitNetworkSolver.hpp:155
bool used_dense
Definition ImplicitNetworkSolver.hpp:150
std::size_t peak_workspace_bytes
Definition ImplicitNetworkSolver.hpp:147
Definition ImplicitNetworkSolver.hpp:175
LinearMethod method
Definition ImplicitNetworkSolver.hpp:182
int max_backtracks
Definition ImplicitNetworkSolver.hpp:176
int max_newton
Definition ImplicitNetworkSolver.hpp:176
double relative_momentum
Definition ImplicitNetworkSolver.hpp:178
Preconditioner preconditioner
Definition ImplicitNetworkSolver.hpp:185
double relative_volume
Definition ImplicitNetworkSolver.hpp:177
double absolute_volume
Definition ImplicitNetworkSolver.hpp:177
double relative_junction
Definition ImplicitNetworkSolver.hpp:179
CondensationControls condensation
Definition ImplicitNetworkSolver.hpp:187
double absolute_momentum
Definition ImplicitNetworkSolver.hpp:178
NativeGmres::Controls linear
Definition ImplicitNetworkSolver.hpp:181
double absolute_junction
Definition ImplicitNetworkSolver.hpp:179
bool reuse_linear_workspace
Definition ImplicitNetworkSolver.hpp:186
double difference_step
Definition ImplicitNetworkSolver.hpp:180
Definition ImplicitNetworkSolver.hpp:75
std::vector< double > area
Definition ImplicitNetworkSolver.hpp:76
std::vector< double > node_volume
Definition ImplicitNetworkSolver.hpp:77
std::vector< FaceReceipt > faces
Definition ImplicitNetworkSolver.hpp:78
Definition ImplicitNetworkSolver.hpp:66
std::vector< FaceReceipt > faces
Definition ImplicitNetworkSolver.hpp:73
std::vector< double > storage
Definition ImplicitNetworkSolver.hpp:72
std::vector< double > volume
Definition ImplicitNetworkSolver.hpp:71
std::vector< double > junction
Definition ImplicitNetworkSolver.hpp:71
std::vector< double > node_volume
Definition ImplicitNetworkSolver.hpp:72
std::vector< double > momentum
Definition ImplicitNetworkSolver.hpp:71
Definition ImplicitNetworkSolver.hpp:62
double correction_right
Definition ImplicitNetworkSolver.hpp:64
double correction_left
Definition ImplicitNetworkSolver.hpp:64
kernels::FaceFlux flux
Definition ImplicitNetworkSolver.hpp:63
Definition ImplicitNetworkSolver.hpp:159
bool fallback
Definition ImplicitNetworkSolver.hpp:166
bool converged() const
Definition ImplicitNetworkSolver.hpp:167
std::size_t preconditioner_bytes
Definition ImplicitNetworkSolver.hpp:162
CondensationDiagnostics condensation
Definition ImplicitNetworkSolver.hpp:163
WorkspaceDiagnostics workspace
Definition ImplicitNetworkSolver.hpp:165
BlockIluDiagnostics block_ilu
Definition ImplicitNetworkSolver.hpp:164
int shifted_pivots
Definition ImplicitNetworkSolver.hpp:161
NativeGmres::Result gmres
Definition ImplicitNetworkSolver.hpp:160
Definition ImplicitNetworkSolver.hpp:86
std::vector< double > row_scale
Definition ImplicitNetworkSolver.hpp:88
std::vector< int > nodes
Definition ImplicitNetworkSolver.hpp:90
std::vector< double > column_scale
Definition ImplicitNetworkSolver.hpp:88
Matrix matrix
Definition ImplicitNetworkSolver.hpp:87
std::vector< double > residual
Definition ImplicitNetworkSolver.hpp:88
Definition ImplicitNetworkSolver.hpp:80
std::vector< double > value
Definition ImplicitNetworkSolver.hpp:83
std::vector< int > column
Definition ImplicitNetworkSolver.hpp:82
bool apply(const double *x, double *y) const
Definition ImplicitNetworkSolver.cpp:658
std::vector< std::size_t > row
Definition ImplicitNetworkSolver.hpp:81
Definition ImplicitNetworkSolver.hpp:34
std::vector< double > old_discharge
Definition ImplicitNetworkSolver.hpp:36
std::vector< double > cell_lateral
Definition ImplicitNetworkSolver.hpp:52
std::vector< double > old_area
Definition ImplicitNetworkSolver.hpp:36
double minimum_wet_depth
Definition ImplicitNetworkSolver.hpp:56
std::vector< double > old_node_volume
Definition ImplicitNetworkSolver.hpp:48
double maximum_depth
Definition ImplicitNetworkSolver.hpp:57
Regime regime
Definition ImplicitNetworkSolver.hpp:53
std::vector< double > initial_depth
Definition ImplicitNetworkSolver.hpp:39
double minimum_slot_excess
Definition ImplicitNetworkSolver.hpp:57
std::vector< double > initial_head
Definition ImplicitNetworkSolver.hpp:42
const NetworkMeshData * mesh
Definition ImplicitNetworkSolver.hpp:35
std::vector< double > fixed_head
Definition ImplicitNetworkSolver.hpp:42
std::vector< double > node_lateral
Definition ImplicitNetworkSolver.hpp:52
Definition ImplicitNetworkSolver.hpp:198
double max_momentum_residual
Definition ImplicitNetworkSolver.hpp:202
int backtracks
Definition ImplicitNetworkSolver.hpp:200
Status status
Definition ImplicitNetworkSolver.hpp:199
double max_volume_residual
Definition ImplicitNetworkSolver.hpp:202
int gmres_iterations
Definition ImplicitNetworkSolver.hpp:200
double max_storage_residual
Definition ImplicitNetworkSolver.hpp:204
LinearResult last_linear
Definition ImplicitNetworkSolver.hpp:205
int newton_iterations
Definition ImplicitNetworkSolver.hpp:200
double max_junction_residual
Definition ImplicitNetworkSolver.hpp:203
double scaled_residual
Definition ImplicitNetworkSolver.hpp:201
bool converged() const
Definition ImplicitNetworkSolver.hpp:207
std::vector< LinearResult > linear_history
Definition ImplicitNetworkSolver.hpp:206
Definition ImplicitNetworkSolver.hpp:59
std::vector< double > head
Definition ImplicitNetworkSolver.hpp:60
std::vector< double > discharge
Definition ImplicitNetworkSolver.hpp:60
std::vector< double > depth
Definition ImplicitNetworkSolver.hpp:60
Definition ImplicitNetworkSolver.hpp:104
bool symbolic_rebuilt
Definition ImplicitNetworkSolver.hpp:105
bool cache_released
Definition ImplicitNetworkSolver.hpp:106
std::size_t retained_bytes
Definition ImplicitNetworkSolver.hpp:107
bool enabled
Definition ImplicitNetworkSolver.hpp:105
bool symbolic_reused
Definition ImplicitNetworkSolver.hpp:105
Definition NativeGmres.hpp:28
Definition NativeGmres.hpp:45
SoA mesh geometry and topology for the FV network solver.
Definition NetworkMeshData.hpp:123
Result of a face flux evaluation.
Definition FvKernels.hpp:259