Skip to content

Commit f1ced19

Browse files
James CraigJames Craig
authored andcommitted
v491 - Support for workflow vars with op regimes; :AllowSoilOverfill; recursive :RedirectToFile [BENCHMARKED]
Major changes control variables->workflow variables, with operating regime-based definitions (DemandExpressionHandling.cpp; DEmandOptimization.cpp/.h) -new routine CDemandOptimizer::ParseCondition -report workflow variables in ManagementOptimization.csv -:DefineWorkflowVariable,:WorkflowVarDefinition,:OverrideStageDischargeCurve (ParseManagementFile.cpp) nested :RedirectToFile (ParseHRUFile.cpp;ParseManagementFile.cpp;ParseTimeSeriesFile.cpp) support for :AllowSoilOverfill (CapillaryRise.cpp;Infiltration.cpp;Percolation.cpp;Recharge.cpp;ParseInput.cpp) Update CMakeLists.txt to support LPSOLVE option (with help from M. Krossovski) Moved handling of :OverrideStageDischargeCurve OUTSIDE of :ManagementGoal statements prelim support for reduced memory usage in advection.cpp Report whether observations are available in SubbasinProperties.csv file (StandardOutput.cpp) bug fixes: -support for proper parameters of RAINSNOW_HSPF (found by R. Chlumsky) -correct OW_PET with snow cover as well as PET (for frozen lakes) (OrographicCorrections.cpp) -breaks in :GaugedSubBasinGroup command if invalid syntax (found by R. Chlumsky) (ParseHRUFile.cpp)
1 parent 0a582a1 commit f1ced19

20 files changed

+660
-355
lines changed

CMakeLists.txt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
cmake_minimum_required(VERSION 3.20)
22
# made with help from Zhu Liang-Jun of IGSNRR in Beijing
33
# modified for GitHub by Trevor James Smith of Ouranos in Montreal
4+
# modified for lpsolve support by Maxim Krassovski of DFO
45

56
# optional cmake command line arguments (e.g, "cmake -D COMPILE_LIB=ON" .)
67
option(COMPILE_LIB "If ON, will create a dynamic lib file (default: OFF)" OFF)
78
option(COMPILE_EXE "If ON, will create a executable file (default: ON)" ON)
89
option(PYTHON, "If ON, will create a share library for python (default: OFF)" OFF)
10+
option(LPSOLVE,"If ON, will link to lp_solve optimization library (default: OFF)" OFF)
911

1012
# Setup Project
1113
PROJECT(Raven CXX)
@@ -14,14 +16,15 @@ PROJECT(Raven CXX)
1416
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
1517

1618
# Find NetCDF
17-
find_package(NetCDF)
19+
find_package(NetCDF) #may also be 'netCDF'
20+
find_package(netCDF)
1821
# find header & source
1922
file(GLOB HEADER "src/*.h")
2023
file(GLOB SOURCE "src/*.cpp")
2124

2225
# Create library with Python bindings
2326
# To work, install pybind11, making sure it comes with cmake files (conda install -c conda-forge pybind11)
24-
if (PYTHON)
27+
if(PYTHON)
2528
SET(PYBIND11_NEWPYTHON ON)
2629
find_package(Python COMPONENTS REQUIRED Interpreter Development)
2730
find_package(pybind11 CONFIG REQUIRED)
@@ -44,15 +47,25 @@ if(COMPILE_EXE)
4447
)
4548
target_compile_definitions(Raven PUBLIC STANDALONE)
4649
set_target_properties(Raven PROPERTIES LINKER_LANGUAGE CXX)
50+
if(LPSOLVE)
51+
target_link_directories(Raven PRIVATE lib/lp_solve) # where liblpsolve55.so is located
52+
target_link_libraries(Raven lpsolve55)
53+
add_definitions(-D_LPSOLVE_)
54+
endif()
4755
endif()
56+
4857
source_group("Header Files" FILES ${HEADER})
4958
source_group("Source Files" FILES ${SOURCE})
5059

51-
IF(NETCDF_FOUND)
60+
if(NETCDF_FOUND)
5261
add_definitions(-Dnetcdf)
5362
include_directories(${NetCDF_INCLUDE_DIRS})
5463
target_link_libraries(Raven NetCDF::NetCDF)
55-
ENDIF()
64+
elseif(netCDF_FOUND)
65+
add_definitions(-Dnetcdf)
66+
include_directories(${NetCDF_INCLUDE_DIRS})
67+
target_link_libraries(Raven netcdf)
68+
endif()
5669

5770
# unset cmake variables to avoid polluting the cache
5871
unset(COMPILE_LIB CACHE)

src/Advection.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ CmvAdvection::CmvAdvection(string constit_name,
2525
_constit_ind=pTransModel->GetConstituentIndex(constit_name);
2626

2727
int nAdvConnections =pTransModel->GetNumAdvConnections();
28+
int nWaterStores =pTransModel->GetNumWaterCompartments();
2829
CHydroProcessABC::DynamicSpecifyConnections(3*nAdvConnections+1);//+2 once GW added
30+
//CHydroProcessABC::DynamicSpecifyConnections(nAdvConnections+nWaterStores+1);//+2 once GW added
2931

3032
for (int q=0;q<nAdvConnections;q++) //for regular advection
3133
{
@@ -42,18 +44,29 @@ CmvAdvection::CmvAdvection(string constit_name,
4244
iFrom[2*nAdvConnections+q]=pModel->GetStateVarIndex(CONSTITUENT_SRC,_constit_ind);
4345
iTo [2*nAdvConnections+q]=iTo[q];
4446
}
47+
//for Dirichlet source corrections
48+
//for (int ii = 0; ii < nWaterStores; ii++) {
49+
// iFrom[nAdvConnections+ii]=pModel->GetStateVarIndex(CONSTITUENT_SRC,_constit_ind);
50+
// iTo [nAdvConnections+ii]=pTransModel->GetStorWaterIndex(ii);
51+
// }
52+
4553
//advection into surface water
4654
int iSW=pModel->GetStateVarIndex(SURFACE_WATER);
4755
int m=pTransModel->GetLayerIndex(_constit_ind,iSW);
4856
iFrom[3*nAdvConnections]=pModel->GetStateVarIndex(CONSTITUENT,m);
4957
iTo [3*nAdvConnections]=pModel->GetStateVarIndex(CONSTITUENT_SW,0);
5058

59+
//iFrom[nAdvConnections+nWaterStores]=pModel->GetStateVarIndex(CONSTITUENT,m);
60+
//iTo [nAdvConnections+nWaterStores]=pModel->GetStateVarIndex(CONSTITUENT_SW,0);
61+
5162
//advection into groundwater
5263
//int iGW=pModel->GetStateVarIndex(GROUNDWATER);
5364
//int m=pTransModel->GetLayerIndex(constit_ind,iGW);
5465
//iFrom[3*nAdvConnections+1]=pModel->GetStateVarIndex(CONSTITUENT,m);
5566
//iTo [3*nAdvConnections+1]=pModel->GetStateVarIndex(CONSTITUENT_GW,0);
5667

68+
//iFrom[nAdvConnections+nWaterStores+1]=pModel->GetStateVarIndex(CONSTITUENT,m);
69+
//iTo [nAdvConnections+nWaterStores+1]=pModel->GetStateVarIndex(CONSTITUENT_SW,0);
5770
}
5871

5972
//////////////////////////////////////////////////////////////////
@@ -223,6 +236,8 @@ void CmvAdvection::GetRatesOfChange(const double *state_vars,
223236
mass =sv[iFrom[q]];
224237
dirichlet_mass=Cs*sv[iFromWater]; //Cs*V
225238
rates[nAdvConnections+q]+=(dirichlet_mass-mass)/Options.timestep; //From CONSTITUENT_SRC
239+
//iiFromWater=pTransModel->GetWaterStorIndexFromSVIndex(iFromWater);
240+
//rates[nAdvConnections+iiFromWater]+=(dirichlet_mass-mass)/Options.timestep; //From CONSTITUENT_SRC //JRC: Reduced memory edit (or _aStorIndex[iFromWater])
226241
sv[iFrom[q]]=dirichlet_mass; //override previous mass/enthalpy
227242
}
228243

@@ -237,6 +252,8 @@ void CmvAdvection::GetRatesOfChange(const double *state_vars,
237252
mass =sv[iTo[q]];
238253
dirichlet_mass=Cs*sv[iToWater]; //C*V
239254
rates[2*nAdvConnections+q]+=(dirichlet_mass-mass)/Options.timestep; //From CONSTITUENT_SRC
255+
//iiToWater=pTransModel->GetWaterStorIndexFromSVIndex(iToWater);
256+
//rates[nAdvConnections+iiToWater]+=(dirichlet_mass-mass)/Options.timestep; //From CONSTITUENT_SRC //JRC: Reduced memory edit (or _aStorIndex[iFromWater] of size _nWaterStores)
240257
sv[iTo[q]]=dirichlet_mass; //override previous mass/enthalpy
241258
}
242259

src/CapillaryRise.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,11 @@ void CmvCapillaryRise::ApplyConstraints( const double *storage,
167167
double min_stor=g_min_storage;
168168

169169
//cant remove more than is there
170-
rates[0]=threshMin(rates[0],max(storage[iFrom[0]],min_stor)/Options.timestep,0.0);
170+
rates[0]=min(rates[0],max(storage[iFrom[0]],min_stor)/Options.timestep);
171171

172172
//exceedance of max "to" compartment
173173
//water flow simply slows (or stops) so that receptor will not overfill during tstep
174-
rates[0]=threshMin(rates[0],
175-
(pHRU->GetStateVarMax(iTo[0],storage,Options)-storage[iTo[0]])/Options.timestep,0.0);
174+
if (!Options.allow_soil_overfill){
175+
rates[0]=min(rates[0],(pHRU->GetStateVarMax(iTo[0],storage,Options)-storage[iTo[0]])/Options.timestep);
176+
}
176177
}

0 commit comments

Comments
 (0)