Skip to content

Commit

Permalink
Merge pull request #393 from pyswmm/dev_breadcrumbs
Browse files Browse the repository at this point in the history
Adding Hot Start File save-during-simulation feature
  • Loading branch information
bemcdonnell authored Jul 13, 2023
2 parents 033a9f7 + 87d6ea8 commit 6e092a1
Show file tree
Hide file tree
Showing 15 changed files with 1,223 additions and 6 deletions.
12 changes: 6 additions & 6 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [windows-2022, ubuntu-20.04, macos-10.15]
os: [windows-2022, ubuntu-20.04, macos-13.4]
requirements: [requirements-swmm.txt]
include:
- os: windows-2022
Expand Down Expand Up @@ -58,9 +58,9 @@ jobs:
shell: bash
working-directory: ./ci-tools/linux

- os: macos-10.15
- os: macos-13.4
sys_pkgs: brew install libomp #boost
boost_platform_version: 10.15
boost_platform_version: 13.4
boost_toolsit: clang
build_unit_test: make.zsh -t -g "Xcode"
build_reg_test: make.zsh -g "Xcode"
Expand Down Expand Up @@ -111,19 +111,19 @@ jobs:
# install boost on mac and linux
- name: Install required system packages on mac and linux
run: ${{ matrix.sys_pkgs }}
if: ${{ runner.os == 'macOS' }}
if: ${{ runner.os == 'macOS' }}

# boost takes a while to install on windows, so try to cache
- name: Install boost
# if: ${{runner.os == 'Windows'}}
# if: ${{runner.os == 'Windows'}}
uses: MarkusJx/[email protected]
id: install-boost
with:
# REQUIRED: Specify the required boost version
# A list of supported versions can be found here:
# https://github.com/MarkusJx/prebuilt-boost/blob/main/versions-manifest.json
boost_version: 1.81.0
link: shared
link: shared
# OPTIONAL: Specify a custon install location
# boost_install_dir: C:\some_directory
# OPTIONAL: Specify a platform version
Expand Down
9 changes: 9 additions & 0 deletions src/solver/include/toolkit.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,15 @@ EXPORT_TOOLKIT int swmm_getSimulationParam(SM_SimSetting type, double *value);
@return Error code
*/
EXPORT_TOOLKIT int swmm_setSimulationParam(SM_SimSetting type, double value);

/**
@brief Use/override a hotstart file before the simulation starts.
@param type The property type code (see @ref SM_HotStart)
@param hsfile The file name of the hot start file that the user would like to use.
@return Error code
*/
EXPORT_TOOLKIT int swmm_hotstart(SM_HotStart type, const char *hsfile);

/**
@brief Gets Object Count
@param type Option code (see @ref SM_ObjectType)
Expand Down
6 changes: 6 additions & 0 deletions src/solver/include/toolkit_enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@ typedef enum {
SM_THREADS = 14 /**< Number of Threads for this process */
} SM_SimSetting;

/// Hot Start File Manager
typedef enum {
SM_HOTSTART_USE = 0, /**< Use Hotstart File */
SM_HOTSTART_SAVE = 1 /**< Save Hotstart File */
} SM_HotStart;

/// Node property codes
typedef enum {
SM_INVERTEL = 0, /**< Invert Elevation */
Expand Down
1 change: 1 addition & 0 deletions src/solver/include/toolkit_error.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ enum ToolkitErrorType {
ERR_TKAPI_UNDEFINED_LID = 2010,
ERR_TKAPI_MEMORY = 2011,
ERR_TKAPI_NO_INLET = 2012,
ERR_TKAPI_SIM_RUNNING = 2013,

TKMAXERRMSG = 3000
};
1 change: 1 addition & 0 deletions src/solver/include/toolkit_errors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ ERR(2009, "\n API Key Error: Invalid Lid Unit Index")
ERR(2010, "\n API Key Error: Undefined Subcatchment Lid")
ERR(2011, "\n API Key Error: No memory allocated for return value")
ERR(2012, "\n API Key Error: Specified link is not assigned an inlet")
ERR(2013, "\n API Key Error: Simulation Already Started or Running.")
69 changes: 69 additions & 0 deletions src/solver/toolkit.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,75 @@ EXPORT_TOOLKIT int swmm_setSimulationParam(SM_SimSetting type, double value)
return error_code;
}

EXPORT_TOOLKIT int swmm_hotstart(SM_HotStart type, const char *hsfile)
///
/// Input: type = Hotstart option USE/SAVE (SM_HotStart)
/// hotstart = file ID name (able to overwrite)
/// Return API Error
/// Purpose: Allows selecting a HSF to use or save
{
int error_code = 0;
// Check if Open
if(swmm_IsOpenFlag() == FALSE)
{
error_code = ERR_TKAPI_INPUTNOTOPEN;
}
// Check if Simulation is Started
else if (swmm_IsStartedFlag() == TRUE && type == SM_HOTSTART_USE)
{
error_code = ERR_TKAPI_SIM_RUNNING;
}
// Check if Simulation is NOT started
else if (swmm_IsStartedFlag() == FALSE && type == SM_HOTSTART_SAVE)
{
error_code = ERR_TKAPI_SIM_NRUNNING;
}
else
{
switch(type)
{
case SM_HOTSTART_USE:
{
// Fhotstart1 is the file to to be read
char fl_name[MAXFNAME];
sstrncpy(fl_name, hsfile, MAXFNAME);
Fhotstart1.mode = USE_FILE;
sstrncpy(Fhotstart1.name, fl_name, MAXFNAME);
break;
}
case SM_HOTSTART_SAVE:
{
// Storing Existing INP set HSFs
TFile tmpHotstart1 = Fhotstart1;
TFile tmpHotstart2 = Fhotstart2;
int _fl1_info = Fhotstart1.mode;
int _fl2_info = Fhotstart2.mode;
// Create info for New HSF
Fhotstart1.mode = NO_FILE;
Fhotstart2.mode = SAVE_FILE;
sstrncpy(Fhotstart2.name, hsfile, MAXFNAME);
// Saving Data
if (hotstart_open())
{
hotstart_close();
// Replacing INP set HSFs
Fhotstart2 = tmpHotstart2;
Fhotstart1 = tmpHotstart1;
Fhotstart1.mode = _fl1_info;
Fhotstart2.mode = _fl2_info;
}
else
{
error_code = ERR_HOTSTART_FILE_OPEN;
}
break;
}
default: error_code = ERR_TKAPI_OUTBOUNDS; break;
}
}
return error_code;
}

EXPORT_TOOLKIT int swmm_countObjects(SM_ObjectType type, int *count)
///
/// Input: type = object type (Based on SM_ObjectType enum)
Expand Down
1 change: 1 addition & 0 deletions tests/solver/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ set(solver_test_srcs
test_solver.cpp
test_stats.cpp
test_inlets_and_drains.cpp
test_toolkit_hotstart.cpp
# ADD NEW TEST SUITES TO EXISTING TOOLKIT TEST MODULE
)

Expand Down
217 changes: 217 additions & 0 deletions tests/solver/data/hotstart/Simulation1.inp
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
[TITLE]
;;Project Title/Notes
Example 1

[OPTIONS]
;;Option Value
FLOW_UNITS CFS
INFILTRATION HORTON
FLOW_ROUTING DYNWAVE
LINK_OFFSETS DEPTH
MIN_SLOPE 0
ALLOW_PONDING NO
SKIP_STEADY_STATE NO

START_DATE 01/01/1998
START_TIME 00:00:00
REPORT_START_DATE 01/01/1998
REPORT_START_TIME 00:00:00
END_DATE 01/02/1998
END_TIME 12:00:00
SWEEP_START 1/1
SWEEP_END 12/31
DRY_DAYS 5
REPORT_STEP 01:00:00
WET_STEP 00:15:00
DRY_STEP 01:00:00
ROUTING_STEP 0:01:00

INERTIAL_DAMPING PARTIAL
NORMAL_FLOW_LIMITED BOTH
FORCE_MAIN_EQUATION H-W
VARIABLE_STEP 0.75
LENGTHENING_STEP 0
MIN_SURFAREA 0
MAX_TRIALS 0
HEAD_TOLERANCE 0
SYS_FLOW_TOL 5
LAT_FLOW_TOL 5
;MINIMUM_STEP 0.5
THREADS 1

[FILES]
SAVE HOTSTART INFILE_Simulation1.hsf

[EVAPORATION]
;;Data Source Parameters
;;-------------- ----------------
CONSTANT 0.0
DRY_ONLY NO

[RAINGAGES]
;;Name Format Interval SCF Source
;;-------------- --------- ------ ------ ----------
RG1 INTENSITY 1:00 1.0 TIMESERIES TS1

[SUBCATCHMENTS]
;;Name Rain Gage Outlet Area %Imperv Width %Slope CurbLen SnowPack
;;-------------- ---------------- ---------------- -------- -------- -------- -------- -------- ----------------
1 RG1 9 10 50 500 0.01 0
2 RG1 10 10 50 500 0.01 0
3 RG1 13 5 50 500 0.01 0
4 RG1 22 5 50 500 0.01 0
5 RG1 15 15 50 500 0.01 0
6 RG1 23 12 10 500 0.01 0
7 RG1 19 4 10 500 0.01 0
8 RG1 18 10 10 500 0.01 0

[SUBAREAS]
;;Subcatchment N-Imperv N-Perv S-Imperv S-Perv PctZero RouteTo PctRouted
;;-------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 0.001 0.10 0.05 0.05 25 OUTLET
2 0.001 0.10 0.05 0.05 25 OUTLET
3 0.001 0.10 0.05 0.05 25 OUTLET
4 0.001 0.10 0.05 0.05 25 OUTLET
5 0.001 0.10 0.05 0.05 25 OUTLET
6 0.001 0.10 0.05 0.05 25 OUTLET
7 0.001 0.10 0.05 0.05 25 OUTLET
8 0.001 0.10 0.05 0.05 25 OUTLET

[INFILTRATION]
;;Subcatchment MaxRate MinRate Decay DryTime MaxInfil
;;-------------- ---------- ---------- ---------- ---------- ----------
1 0.35 0.25 4.14 0.50 0
2 0.7 0.3 4.14 0.50 0
3 0.7 0.3 4.14 0.50 0
4 0.7 0.3 4.14 0.50 0
5 0.7 0.3 4.14 0.50 0
6 0.7 0.3 4.14 0.50 0
7 0.7 0.3 4.14 0.50 0
8 0.7 0.3 4.14 0.50 0

[JUNCTIONS]
;;Name Elevation MaxDepth InitDepth SurDepth Aponded
;;-------------- ---------- ---------- ---------- ---------- ----------
9 1000 3 0 0 0
10 995 3 0 0 0
13 995 3 0 0 0
14 990 3 0 0 0
15 987 3 0 0 0
16 985 3 0 0 0
17 980 3 0 0 0
19 1010 3 0 0 0
20 1005 3 0 0 0
21 990 3 0 0 0
22 987 3 0 0 0
23 990 3 0 0 0
24 984 3 0 0 0

[OUTFALLS]
;;Name Elevation Type Stage Data Gated Route To
;;-------------- ---------- ---------- ---------------- -------- ----------------
18 975 FREE NO

[CONDUITS]
;;Name From Node To Node Length Roughness InOffset OutOffset InitFlow MaxFlow
;;-------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ----------
1 9 10 400 0.01 0 0 0 0
4 19 20 200 0.01 0 0 0 0
5 20 21 200 0.01 0 0 0 0
6 10 21 400 0.01 0 1 0 0
7 21 22 300 0.01 1 1 0 0
8 22 16 300 0.01 0 0 0 0
10 17 18 400 0.01 0 0 0 0
11 13 14 400 0.01 0 0 0 0
12 14 15 400 0.01 0 0 0 0
13 15 16 400 0.01 0 0 0 0
14 23 24 400 0.01 0 0 0 0
15 16 24 100 0.01 0 0 0 0
16 24 17 400 0.01 0 0 0 0

[XSECTIONS]
;;Link Shape Geom1 Geom2 Geom3 Geom4 Barrels Culvert
;;-------------- ------------ ---------------- ---------- ---------- ---------- ---------- ----------
1 CIRCULAR 1.5 0 0 0 1
4 CIRCULAR 1 0 0 0 1
5 CIRCULAR 1 0 0 0 1
6 CIRCULAR 1 0 0 0 1
7 CIRCULAR 2 0 0 0 1
8 CIRCULAR 2 0 0 0 1
10 CIRCULAR 2 0 0 0 1
11 CIRCULAR 1.5 0 0 0 1
12 CIRCULAR 1.5 0 0 0 1
13 CIRCULAR 1.5 0 0 0 1
14 CIRCULAR 1 0 0 0 1
15 CIRCULAR 2 0 0 0 1
16 CIRCULAR 2 0 0 0 1

[POLLUTANTS]
;;Name Units Crain Cgw Crdii Kdecay SnowOnly Co-Pollutant Co-Frac Cdwf Cinit
;;-------------- ------ ---------- ---------- ---------- ---------- ---------- ---------------- ---------- ---------- ----------
TSS MG/L 0.0 0.0 0 0.0 NO * 0.0 0 0
Lead UG/L 0.0 0.0 0 0.0 NO TSS 0.2 0 0

[LANDUSES]
;; Sweeping Fraction Last
;;Name Interval Available Swept
;;-------------- ---------- ---------- ----------
Residential
Undeveloped

[COVERAGES]
;;Subcatchment Land Use Percent
;;-------------- ---------------- ----------
1 Residential 100.00
2 Residential 50.00
2 Undeveloped 50.00
3 Residential 100.00
4 Residential 50.00
4 Undeveloped 50.00
5 Residential 100.00
6 Undeveloped 100.00
7 Undeveloped 100.00
8 Undeveloped 100.00

[LOADINGS]
;;Subcatchment Pollutant Buildup
;;-------------- ---------------- ----------

[BUILDUP]
;;Land Use Pollutant Function Coeff1 Coeff2 Coeff3 Per Unit
;;-------------- ---------------- ---------- ---------- ---------- ---------- ----------
Residential TSS SAT 50 0 2 AREA
Residential Lead NONE 0 0 0 AREA
Undeveloped TSS SAT 100 0 3 AREA
Undeveloped Lead NONE 0 0 0 AREA

[WASHOFF]
;;Land Use Pollutant Function Coeff1 Coeff2 SweepRmvl BmpRmvl
;;-------------- ---------------- ---------- ---------- ---------- ---------- ----------
Residential TSS EXP 0.1 1 0 0
Residential Lead EMC 0 0 0 0
Undeveloped TSS EXP 0.1 0.7 0 0
Undeveloped Lead EMC 0 0 0 0

[TIMESERIES]
;;Name Date Time Value
;;-------------- ---------- ---------- ----------
;RAINFALL
TS1 0:00 0.0
TS1 1:00 0.25
TS1 2:00 0.5
TS1 3:00 0.8
TS1 4:00 0.4
TS1 5:00 0.1
TS1 6:00 0.0
TS1 27:00 0.0
TS1 28:00 0.4
TS1 29:00 0.2
TS1 30:00 0.0

[REPORT]
;;Reporting Options
INPUT NO
CONTROLS NO
SUBCATCHMENTS ALL
NODES ALL
LINKS ALL
Loading

0 comments on commit 6e092a1

Please sign in to comment.