OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
NonlinearPressureStorage.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 <vector>
16
17#include "FvKernels.hpp"
18
19namespace openswmm::fv {
20
25public:
26 struct Row {
27 // Null geometry means a zero-storage algebraic junction. Real node
28 // storage curves, TPA, wet/dry switches and active sets are not supported.
29 const FvGeometry* geometry = nullptr;
30 double length = 0.0; // ft, positive for cells
31 double bed = 0.0; // ft
32 double old_head = 0.0; // ft, initial Newton guess
33 double source = 0.0; // cfs INTO row, includes frozen q* divergence
34 double lower_head = 0.0; // admissible bounds, not post-solve clamps
35 double upper_head = 0.0;
36 double old_area = 0.0; // ft^2, conserved cell state, NOT h->A inversion
37 };
38 struct Edge {
39 int left = -1;
40 int right = -1; // -1: prescribed boundary
41 double conductance = 0.0; // cfs/ft, frozen and strictly positive
42 double boundary_head = 0.0; // used only if right == -1
43 };
44 struct Controls {
45 int max_newton = 40;
46 int max_linear = 400;
48 double absolute_volume = 1.e-10; // ft^3, per row
49 double relative_volume = 1.e-12; // scale = max(1 ft^3, old V, dt |source|)
50 double linear_relative = 1.e-12;
51 double linear_absolute = 1.e-14; // ft^3, Euclidean residual norm
52 };
65 struct Result {
70 int backtracks = 0;
71 double max_volume_residual = 0.0; // ft^3
72 double sum_absolute_residual = 0.0; // ft^3
73 double scaled_residual = 0.0; // <= 1 required, independently recomputed
74 double linear_residual = 0.0; // true ||b - J delta||_2, last linear solve
75 double linear_tolerance = 0.0;
80 bool converged() const noexcept { return status == Status::Converged; }
81 };
82
106 Result solve(const std::vector<Row>& rows, const std::vector<Edge>& edges, double dt,
107 const Controls& controls, std::vector<double>& output_heads);
108
109private:
110 // Persistent O(rows + edges) workspace; no per-iteration allocations.
111 std::vector<double> head_, trial_, residual_, trial_residual_, budget_;
112 std::vector<double> diag_, delta_, r_, z_, p_, ap_, weight_;
113 std::vector<int> parent_;
114 std::vector<unsigned char> anchored_;
115};
116
117} // namespace openswmm::fv
Single-source scalar kernels for the explicit FV 1D network solver.
Definition NonlinearPressureStorage.hpp:24
Status
Definition NonlinearPressureStorage.hpp:53
@ EndpointResidualFailure
Definition NonlinearPressureStorage.hpp:63
@ LineSearchFailed
Definition NonlinearPressureStorage.hpp:61
@ NonlinearIterationLimit
Definition NonlinearPressureStorage.hpp:62
@ LinearResidualFailure
Definition NonlinearPressureStorage.hpp:60
@ NonFinite
Definition NonlinearPressureStorage.hpp:57
@ LinearIterationLimit
Definition NonlinearPressureStorage.hpp:59
@ UnanchoredComponent
Definition NonlinearPressureStorage.hpp:56
@ LinearBreakdown
Definition NonlinearPressureStorage.hpp:58
@ InvalidInput
Definition NonlinearPressureStorage.hpp:55
@ Converged
Definition NonlinearPressureStorage.hpp:54
Result solve(const std::vector< Row > &rows, const std::vector< Edge > &edges, double dt, const Controls &controls, std::vector< double > &output_heads)
Solve frozen-conductance nonlinear slot-storage continuity for candidate heads.
Definition NonlinearPressureStorage.cpp:22
Definition Controls.cpp:47
Definition AcceptedWaterVolumes.hpp:8
Cross-section closure for one conduit's cell chain.
Definition NetworkMeshData.hpp:71
Definition NonlinearPressureStorage.hpp:44
double linear_absolute
Definition NonlinearPressureStorage.hpp:51
double absolute_volume
Definition NonlinearPressureStorage.hpp:48
int max_newton
Definition NonlinearPressureStorage.hpp:45
int max_linear
Definition NonlinearPressureStorage.hpp:46
int max_backtracks
Definition NonlinearPressureStorage.hpp:47
double linear_relative
Definition NonlinearPressureStorage.hpp:50
double relative_volume
Definition NonlinearPressureStorage.hpp:49
Definition NonlinearPressureStorage.hpp:38
int right
Definition NonlinearPressureStorage.hpp:40
double boundary_head
Definition NonlinearPressureStorage.hpp:42
double conductance
Definition NonlinearPressureStorage.hpp:41
int left
Definition NonlinearPressureStorage.hpp:39
Definition NonlinearPressureStorage.hpp:65
int residual_evaluations
Definition NonlinearPressureStorage.hpp:69
double max_volume_residual
Definition NonlinearPressureStorage.hpp:71
int newton_iterations
Definition NonlinearPressureStorage.hpp:67
bool converged() const noexcept
Test whether independently recomputed endpoint residuals passed acceptance.
Definition NonlinearPressureStorage.hpp:80
double linear_residual
Definition NonlinearPressureStorage.hpp:74
int linear_iterations
Definition NonlinearPressureStorage.hpp:68
double scaled_residual
Definition NonlinearPressureStorage.hpp:73
Status status
Definition NonlinearPressureStorage.hpp:66
int backtracks
Definition NonlinearPressureStorage.hpp:70
double linear_tolerance
Definition NonlinearPressureStorage.hpp:75
double sum_absolute_residual
Definition NonlinearPressureStorage.hpp:72
Definition NonlinearPressureStorage.hpp:26
double old_head
Definition NonlinearPressureStorage.hpp:32
double old_area
Definition NonlinearPressureStorage.hpp:36
const FvGeometry * geometry
Definition NonlinearPressureStorage.hpp:29
double upper_head
Definition NonlinearPressureStorage.hpp:35
double source
Definition NonlinearPressureStorage.hpp:33
double length
Definition NonlinearPressureStorage.hpp:30
double bed
Definition NonlinearPressureStorage.hpp:31
double lower_head
Definition NonlinearPressureStorage.hpp:34