Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Hot Start File save-during-simulation feature #393

Merged
merged 10 commits into from
Jul 13, 2023
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
8 changes: 8 additions & 0 deletions src/solver/include/toolkit.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,14 @@ EXPORT_TOOLKIT int swmm_getSimulationAnalysisSetting(SM_SimOption type, int *val
*/
EXPORT_TOOLKIT int swmm_getSimulationParam(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 @@ -92,6 +92,12 @@ typedef enum {
SM_LATFLOWTOL = 13 /**< Tolerance for steady nodal inflow */
} 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
abhiramm7 marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,75 @@ EXPORT_TOOLKIT int swmm_getSimulationParam(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