OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
Node.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2//
3// Copyright 2026 Caleb Buahin
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
31
32#ifndef OPENSWMM_NODE_HPP
33#define OPENSWMM_NODE_HPP
34
35#include "../core/Constants.hpp"
36#include "../data/NodeData.hpp"
37#include "../data/TableData.hpp"
38
39namespace openswmm {
40
42struct NodeSubtypes; // relational storage/outfall/divider side-tables (optional source)
43
44namespace node {
45
46// ============================================================================
47// Per-element functions (for C API / single-object queries)
48// ============================================================================
49
71double getVolume(const NodeData& nodes, int idx, double depth, TableData* tables = nullptr,
72 int unit_sys = 0, const NodeSubtypes* subs = nullptr);
73
94double getSurfArea(const NodeData& nodes, int idx, double depth, TableData* tables = nullptr,
95 int unit_sys = 0, const NodeSubtypes* subs = nullptr);
96
116double getPondedArea(const NodeData& nodes, int idx, double depth, TableData* tables = nullptr,
117 int unit_sys = 0, const NodeSubtypes* subs = nullptr);
118
132double getMaxOutflow(const NodeData& nodes, int idx, double q, double dt);
133
143double getOverflow(double new_volume, double full_volume, double dt);
144
155double storeVolume(const NodeData& nodes, int idx);
156
172double storeVolume(const NodeData& nodes, int idx, double depth, double volume);
173
199double getDepth(const NodeData& nodes, int idx, double volume, TableData* tables = nullptr,
200 int unit_sys = 0, const NodeSubtypes* subs = nullptr);
201
209inline double getHead(double invert_elev, double depth) {
210 return invert_elev + depth;
211}
212
213// ============================================================================
214// Batch functions (for routing hot loop)
215// ============================================================================
216
227void computeHeads(const double* invert, const double* depth, double* head, int n);
228
244void computeVolumes(const NodeData& nodes, const double* depth, double* volume,
245 const NodeSubtypes* subs = nullptr);
246
260void computeOverflows(const double* new_volume, const double* full_volume, double* overflow,
261 double dt, int n);
262
263} // namespace node
264
265// Constants now consolidated in core/Constants.hpp
266
267} // namespace openswmm
268
269#endif // OPENSWMM_NODE_HPP
Global physical, numerical, and model constants for OpenSWMM Engine.
Structure-of-Arrays (SoA) storage for all node types.
Time series and rating curve data with bidirectional cursor.
Definition Node.cpp:38
double getPondedArea(const NodeData &nodes, int idx, double depth, TableData *tables, int unit_sys, const NodeSubtypes *subs)
Select an above-rim ponded area or the raw storage surface area.
Definition Node.cpp:410
void computeVolumes(const NodeData &nodes, const double *depth, double *volume, const NodeSubtypes *subs)
Evaluate every node volume with US-unit, table-free scalar geometry.
Definition Node.cpp:496
double getHead(double invert_elev, double depth)
Compute hydraulic head by adding node invert and depth.
Definition Node.hpp:209
void computeOverflows(const double *new_volume, const double *full_volume, double *overflow, double dt, int n)
Compute per-node overflow from excess native volumes.
Definition Node.cpp:508
double getSurfArea(const NodeData &nodes, int idx, double depth, TableData *tables, int unit_sys, const NodeSubtypes *subs)
Evaluate the raw derivative of storage volume with depth.
Definition Node.cpp:335
double storeVolume(const NodeData &nodes, int idx, double depth, double volume)
Evaluate a transport store using an explicit depth and booked volume.
Definition Node.cpp:460
void computeHeads(const double *invert, const double *depth, double *head, int n)
Add native invert elevation and depth elementwise.
Definition Node.cpp:486
double getOverflow(double new_volume, double full_volume, double dt)
Convert excess node water volume into a timestep overflow rate.
Definition Node.cpp:453
double getMaxOutflow(const NodeData &nodes, int idx, double q, double dt)
Limit a proposed nonnegative withdrawal by legacy node storage availability.
Definition Node.cpp:429
double getVolume(const NodeData &nodes, int idx, double depth, TableData *tables, int unit_sys, const NodeSubtypes *subs)
Evaluate a node depth-volume relation in native units.
Definition Node.cpp:107
double getDepth(const NodeData &nodes, int idx, double volume, TableData *tables, int unit_sys, const NodeSubtypes *subs)
Convert booked storage volume to depth using native geometry.
Definition Node.cpp:196
Definition ExchangeLaw.hpp:60
Structure-of-Arrays storage for all nodes.
Definition NodeData.hpp:125
Owns the three node subtype side-tables plus the reverse index map.
Definition NodeSubtypes.hpp:535
Central, reentrant simulation context.
Definition SimulationContext.hpp:390