OpenSWMM Engine  6.0.0-alpha.1
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.1)
Loading...
Searching...
No Matches
XSectBatch.hpp File Reference

Cross-section geometry — unified batch + per-element API. More...

#include <vector>
#include <cstddef>
#include <cstdint>
#include <cmath>
Include dependency graph for XSectBatch.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  openswmm::XSectParams
 
struct  openswmm::ShapeGroup
 SoA parameter block for all links of one cross-section shape. More...
 
class  openswmm::XSectGroups
 Shape-grouped cross-section manager for batch computation. More...
 

Namespaces

namespace  openswmm
 
namespace  openswmm::xsect
 
namespace  openswmm::xsect_batch
 

Macros

#define OPENSWMM_RESTRICT   __restrict__
 

Enumerations

enum class  openswmm::XSectShape : int {
  openswmm::DUMMY = 0 ,
  openswmm::CIRCULAR = 1 ,
  openswmm::FILLED_CIRCULAR = 2 ,
  openswmm::RECT_CLOSED = 3 ,
  openswmm::RECT_OPEN = 4 ,
  openswmm::TRAPEZOIDAL = 5 ,
  openswmm::TRIANGULAR = 6 ,
  openswmm::PARABOLIC = 7 ,
  openswmm::POWERFUNC = 8 ,
  openswmm::RECT_TRIANG = 9 ,
  openswmm::RECT_ROUND = 10 ,
  openswmm::MOD_BASKET = 11 ,
  openswmm::HORIZ_ELLIPSE = 12 ,
  openswmm::VERT_ELLIPSE = 13 ,
  openswmm::ARCH = 14 ,
  openswmm::EGGSHAPED = 15 ,
  openswmm::HORSESHOE = 16 ,
  openswmm::GOTHIC = 17 ,
  openswmm::CATENARY = 18 ,
  openswmm::SEMIELLIPTICAL = 19 ,
  openswmm::BASKETHANDLE = 20 ,
  openswmm::SEMICIRCULAR = 21 ,
  openswmm::IRREGULAR = 22 ,
  openswmm::CUSTOM = 23 ,
  openswmm::FORCE_MAIN = 24 ,
  openswmm::STREET_XSECT = 25
}
 

Functions

double openswmm::xsect::getAofY (const XSectParams &xs, double y)
 
double openswmm::xsect::getRofY (const XSectParams &xs, double y)
 
double openswmm::xsect::getWofY (const XSectParams &xs, double y)
 
double openswmm::xsect::getYofA (const XSectParams &xs, double a)
 
double openswmm::xsect::getSofA (const XSectParams &xs, double a)
 
double openswmm::xsect::getRofA (const XSectParams &xs, double a)
 
double openswmm::xsect::getdSdA (const XSectParams &xs, double a)
 
double openswmm::xsect::getAofS (const XSectParams &xs, double s_factor)
 
double openswmm::xsect::getAmax (const XSectParams &xs)
 
double openswmm::xsect::getYcrit (const XSectParams &xs, double q)
 
bool openswmm::xsect::isOpen (int type)
 
int openswmm::xsect::setParams (XSectParams &xs, int type, const double p[], double ucf)
 
double openswmm::xsect::lookup (double x, const double *table, int n_items)
 
double openswmm::xsect::invLookup (double y, const double *table, int n_items)
 
int openswmm::xsect::locate (double y, const double *table, int n)
 
double openswmm::xsect::getYcircular (double alpha)
 
double openswmm::xsect::getScircular (double alpha)
 
void openswmm::xsect_batch::area_circular (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_full, const double *OPENSWMM_RESTRICT a_full, double *OPENSWMM_RESTRICT area, int count)
 Batch area for CIRCULAR/FORCE_MAIN — lookup table interpolation.
 
void openswmm::xsect_batch::area_rect (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT w_max, double *OPENSWMM_RESTRICT area, int count)
 Batch area for RECT_CLOSED / RECT_OPEN: area = depth * w_max.
 
void openswmm::xsect_batch::area_trapezoidal (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_bot, const double *OPENSWMM_RESTRICT s_bot, double *OPENSWMM_RESTRICT area, int count)
 Batch area for TRAPEZOIDAL: area = (y_bot + s_bot * depth) * depth.
 
void openswmm::xsect_batch::area_triangular (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT s_bot, double *OPENSWMM_RESTRICT area, int count)
 Batch area for TRIANGULAR: area = s_bot * depth^2.
 
void openswmm::xsect_batch::area_parabolic (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT r_bot, double *OPENSWMM_RESTRICT area, int count)
 Batch area for PARABOLIC: area = (4/3) * r_bot * depth^(3/2).
 
void openswmm::xsect_batch::area_powerfunc (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT s_bot, const double *OPENSWMM_RESTRICT r_bot, double *OPENSWMM_RESTRICT area, int count)
 Batch area for POWERFUNC: area = r_bot * depth^(s_bot+1).
 
void openswmm::xsect_batch::area_tabulated (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_full, const double *OPENSWMM_RESTRICT a_full, const double *table, int table_size, double *OPENSWMM_RESTRICT area, int count)
 Batch area for any tabulated shape (egg, horseshoe, arch, ellipse, etc.).
 
void openswmm::xsect_batch::area_inv_tabulated (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_full, const double *OPENSWMM_RESTRICT a_full, const double *table, int table_size, double *OPENSWMM_RESTRICT area, int count)
 Batch area for shapes using invLookup (gothic, catenary, semielliptical, semicircular).
 
void openswmm::xsect_batch::hydrad_circular (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_full, const double *OPENSWMM_RESTRICT r_full, double *OPENSWMM_RESTRICT hydrad, int count)
 
void openswmm::xsect_batch::hydrad_trapezoidal (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_bot, const double *OPENSWMM_RESTRICT s_bot, const double *OPENSWMM_RESTRICT r_bot, double *OPENSWMM_RESTRICT hydrad, int count)
 
void openswmm::xsect_batch::hydrad_triangular (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT s_bot, const double *OPENSWMM_RESTRICT r_bot, double *OPENSWMM_RESTRICT hydrad, int count)
 
void openswmm::xsect_batch::hydrad_rect (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT w_max, double *OPENSWMM_RESTRICT hydrad, int count)
 
void openswmm::xsect_batch::hydrad_tabulated (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_full, const double *OPENSWMM_RESTRICT r_full, const double *table, int table_size, double *OPENSWMM_RESTRICT hydrad, int count)
 
void openswmm::xsect_batch::width_circular (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_full, const double *OPENSWMM_RESTRICT w_max, double *OPENSWMM_RESTRICT width, int count)
 
void openswmm::xsect_batch::width_trapezoidal (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_bot, const double *OPENSWMM_RESTRICT s_bot, double *OPENSWMM_RESTRICT width, int count)
 
void openswmm::xsect_batch::width_triangular (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT s_bot, double *OPENSWMM_RESTRICT width, int count)
 
void openswmm::xsect_batch::width_rect (const double *OPENSWMM_RESTRICT w_max, double *OPENSWMM_RESTRICT width, int count)
 
void openswmm::xsect_batch::width_tabulated (const double *OPENSWMM_RESTRICT depth, const double *OPENSWMM_RESTRICT y_full, const double *OPENSWMM_RESTRICT w_max, const double *table, int table_size, double *OPENSWMM_RESTRICT width, int count)
 

Detailed Description

Cross-section geometry — unified batch + per-element API.

This is the SINGLE cross-section header for the new engine. It provides:

  1. Shape enum + XSectParams struct — data types for cross-sections
  2. Per-element functions (xsect:: namespace) — used by C API, hot start, KW/DW solvers for single-conduit queries
  3. Batch API (XSectGroups, xsect_batch::) — shape-grouped SoA for the routing hot loop; groups links by shape, computes over contiguous arrays with no branching

Routing hot loop (batch):

XSectGroups groups;
groups.build(ctx); // once, at init
groups.computeAreas(link_depths, link_areas);
groups.computeHydRad(link_depths, link_hydrad);
groups.computeWidths(link_depths, link_widths);
See also
SIMD.hpp — SIMD abstraction layer
xsect_tables.hpp — lookup table data (internal)
Note
Legacy reference: src/legacy/engine/xsect.c
Author
Caleb Buahin caleb.nosp@m..bua.nosp@m.hin@g.nosp@m.mail.nosp@m..com
License\n MIT License

Macro Definition Documentation

◆ OPENSWMM_RESTRICT

#define OPENSWMM_RESTRICT   __restrict__