# BasicModelInterface.finalize
— Method .
BMI.finalize (model:: Model ):: Model
Write all results to the configured files.
-source
+source
# BasicModelInterface.initialize
— Method .
BMI.initialize (T:: Type{Model} , config_path:: AbstractString ):: Model
Initialize a Model
from the path to the TOML configuration file.
-source
+source
# CommonSolve.solve!
— Method .
solve! (model:: Model ):: ODESolution
Solve a Model until the configured endtime
.
-source
+source
# Ribasim.add_basin_term!
— Method .
Add a term to the expression of the objective function corresponding to the demand of a basin.
-source
+source
# Ribasim.add_constraints_absolute_value!
— Method .
Minimizing |expr| can be achieved by introducing a new variable exprabs and posing the following constraints: expr abs >= expr expr_abs >= -expr
-source
+source
# Ribasim.add_constraints_absolute_value_basin!
— Method .
Add constraints so that variables Fabs basin act as the absolute value of the expression comparing flow to a basin to its demand.
-source
+source
# Ribasim.add_constraints_absolute_value_user_demand!
— Method .
Add constraints so that variables Fabs user_demand act as the absolute value of the expression comparing flow to a UserDemand to its demand.
-source
+source
# Ribasim.add_constraints_basin_flow!
— Method .
Add the Basin flow constraints to the allocation problem. The constraint indices are the Basin node IDs.
Constraint: flow out of basin <= basin capacity
-source
+source
# Ribasim.add_constraints_capacity!
— Method .
Add the flow capacity constraints to the allocation problem. Only finite capacities get a constraint. The constraint indices are (edgesource id, edgedst id).
Constraint: flow over edge <= edge capacity
-source
+source
# Ribasim.add_constraints_flow_conservation!
— Method .
Add the flow conservation constraints to the allocation problem. The constraint indices are UserDemand node IDs.
Constraint: sum(flows out of node node) == flows into node + flow from storage and vertical fluxes
-source
+source
# Ribasim.add_constraints_fractional_flow!
— Method .
Add the fractional flow constraints to the allocation problem. The constraint indices are allocation edges over a fractional flow node.
Constraint: flow after fractional_flow node <= fraction * inflow
-source
+source
# Ribasim.add_constraints_source!
— Method .
Add the source constraints to the allocation problem. The actual threshold values will be set before each allocation solve. The constraint indices are (edgesource id, edgedst id).
Constraint: flow over source edge <= source flow in subnetwork
-source
+source
# Ribasim.add_constraints_user_demand_returnflow!
— Method .
Add the UserDemand returnflow constraints to the allocation problem. The constraint indices are UserDemand node IDs.
Constraint: outflow from userdemand <= return factor inflow to user*demand
-source
+source
# Ribasim.add_flow!
— Method .
Add the given flow q to the flow over the edge on the horizontal (self-loop) edge from id to id.
-source
+source
# Ribasim.add_flow!
— Method .
Add the given flow q to the existing flow over the edge between the given nodes.
-source
+source
# Ribasim.add_objective_term!
— Function .
Add a term to the objective function given by the objective type, depending in the provided flow variable and the associated demand.
-source
+source
# Ribasim.add_subnetwork_connections!
— Method .
Add the edges connecting the main network work to a subnetwork to both the main network and subnetwork allocation network.
-source
+source
# Ribasim.add_user_demand_term!
— Method .
Add a term to the expression of the objective function corresponding to the demand of a UserDemand.
-source
+source
# Ribasim.add_variables_absolute_value!
— Method .
Certain allocation distribution types use absolute values in the objective function. Since most optimization packages do not support the absolute value function directly, New variables are introduced that act as the absolute value of an expression by posing the appropriate constraints.
-source
+source
# Ribasim.add_variables_basin!
— Method .
Add the variables for supply/demand of a basin to the problem. The variable indices are the node_ids of the basins in the subnetwork.
-source
+source
# Ribasim.add_variables_flow!
— Method .
Add the flow variables F to the allocation problem. The variable indices are (edgesource id, edgedst id). Non-negativivity constraints are also immediately added to the flow variables.
-source
+source
# Ribasim.adjust_basin_capacities!
— Method .
Set the values of the basin outflows. 2 cases:
Before the first allocation solve, set the capacities to their full capacity if there is surplus storage;
Before an allocation solve, subtract the flow used by allocation for the previous priority from the capacities.
-source
+source
# Ribasim.adjust_edge_capacities!
— Method .
Set the values of the edge capacities. 2 cases:
Before the first allocation solve, set the edge capacities to their full capacity;
Before an allocation solve, subtract the flow used by allocation for the previous priority from the edge capacities.
-source
+source
# Ribasim.adjust_source_capacities!
— Method .
Adjust the source flows.
-source
+source
# Ribasim.all_neighbor_labels_type
— Method .
Get the in- and outneighbor node IDs of the given node ID (label) over the given edge type in the graph.
-source
+source
# Ribasim.allocate!
— Method .
Update the allocation optimization problem for the given subnetwork with the problem state and flows, solve the allocation problem and assign the results to the UserDemand.
-source
+source
# Ribasim.allocation_graph
— Method .
Build the graph used for the allocation problem.
-source
+source
# Ribasim.allocation_graph_used_nodes!
— Method .
Find all nodes in the subnetwork which will be used in the allocation network. Some nodes are skipped to optimize allocation optimization.
-source
+source
# Ribasim.allocation_path_exists_in_graph
— Method .
Find out whether a path exists between a start node and end node in the given allocation network.
-source
+source
# Ribasim.allocation_problem
— Method .
Construct the allocation problem for the current subnetwork as a JuMP.jl model.
-source
+source
# Ribasim.allocation_table
— Method .
Create an allocation result table for the saved data
-source
+source
# Ribasim.assign_allocations!
— Method .
Assign the allocations to the UserDemand as determined by the solution of the allocation problem.
-source
+source
# Ribasim.avoid_using_own_returnflow!
— Method .
Remove allocation UserDemand return flow edges that are upstream of the UserDemand itself.
-source
+source
# Ribasim.basin_bottom
— Method .
Return the bottom elevation of the basin with index i, or nothing if it doesn’t exist
-source
+source
# Ribasim.basin_bottoms
— Method .
Get the bottom on both ends of a node. If only one has a bottom, use that for both.
-source
+source
# Ribasim.basin_table
— Method .
Create the basin result table from the saved data
-source
+source
# Ribasim.create_callbacks
— Method .
Create the different callbacks that are used to store results and feed the simulation with new data. The different callbacks are combined to a CallbackSet that goes to the integrator. Returns the CallbackSet and the SavedValues for flow.
-source
+source
# Ribasim.create_graph
— Method .
Return a directed metagraph with data of nodes (NodeMetadata): NodeMetadata
and data of edges (EdgeMetadata): EdgeMetadata
-source
+source
# Ribasim.create_storage_tables
— Method .
Read the Basin / profile table and return all area and level and computed storage values
-source
+source
# Ribasim.datetime_since
— Method .
datetime_since (t:: Real , t0:: DateTime ):: DateTime
Convert a Real that represents the seconds passed since the simulation start to the nearest DateTime. This is used to convert between the solver’s inner float time, and the calendar.
-source
+source
# Ribasim.datetimes
— Method .
Get all saved times as a Vector{DateTime}
-source
+source
# Ribasim.discrete_control_affect!
— Method .
Change parameters based on the control logic.
-source
+source
# Ribasim.discrete_control_affect_downcrossing!
— Method .
An downcrossing means that a condition (always greater than) becomes false.
-source
+source
# Ribasim.discrete_control_affect_upcrossing!
— Method .
An upcrossing means that a condition (always greater than) becomes true.
-source
+source
# Ribasim.discrete_control_condition
— Method .
Listens for changes in condition truths.
-source
+source
# Ribasim.discrete_control_table
— Method .
Create a discrete control result table from the saved data
-source
+source
# Ribasim.expand_logic_mapping
— Method .
Replace the truth states in the logic mapping which contain wildcards with all possible explicit truth states.
-source
+source
# Ribasim.find_allocation_graph_edges!
— Method .
This loop finds allocation network edges in several ways:
Between allocation network nodes whose equivalent in the subnetwork are directly connected
Between allocation network nodes whose equivalent in the subnetwork are connected with one or more allocation network nodes in between
-source
+source
# Ribasim.find_subnetwork_connections!
— Method .
Find the edges from the main network to a subnetwork.
-source
+source
# Ribasim.findlastgroup
— Method .
For an element id
and a vector of elements ids
, get the range of indices of the last consecutive block of id
. Returns the empty range 1:0
if id
is not in ids
.
-source
+source
# Ribasim.findsorted
— Method .
Find the index of element x in a sorted collection a. Returns the index of x if it exists, or nothing if it doesn’t. If x occurs more than once, throw an error.
-source
+source
# Ribasim.flow_table
— Method .
Create a flow result table from the saved data
-source
+source
# Ribasim.formulate_basins!
— Method .
Smoothly let the evaporation flux go to 0 when at small water depths Currently at less than 0.1 m.
-source
+source
# Ribasim.formulate_flow!
— Method .
Directed graph: outflow is positive!
-source
+source
# Ribasim.formulate_flow!
— Method .
Conservation of energy for two basins, a and b:
h_a + v_a^2 / (2 * g) = h_b + v_b^2 / (2 * g) + S_f * L + C / 2 * g * (v_b^2 - v_a^2)
@@ -641,16 +641,16 @@ source
+source
# Ribasim.formulate_flow!
— Method .
Directed graph: outflow is positive!
-source
+source
# Ribasim.get_area_and_level
— Method .
Compute the area and level of a basin given its storage. Also returns darea/dlevel as it is needed for the Jacobian.
-source
+source
# Ribasim.get_basin_capacity
— Method .
Get the capacity of the basin, i.e. the maximum flow that can be abstracted from the basin if it is in a state of surplus storage (0 if no reference levels are provided by a level_demand node). Storages are converted to flows by dividing by the allocation timestep.
-source
+source
# Ribasim.get_basin_data
— Method .
Get several variables associated with a basin:
@@ -660,135 +660,135 @@ source
+source
# Ribasim.get_basin_demand
— Method .
Get the demand of the basin, i.e. how large a flow the basin needs to get to its minimum target level (0 if no reference levels are provided by a level_demand node). Storages are converted to flows by dividing by the allocation timestep.
-source
+source
# Ribasim.get_chunk_sizes
— Method .
Get the chunk sizes for DiffCache; differentiation w.r.t. u and t (the latter only if a Rosenbrock algorithm is used).
-source
+source
# Ribasim.get_compressor
— Method .
Get the compressor based on the Results section
-source
+source
# Ribasim.get_flow
— Method .
Get the flow over the given horizontal (selfloop) edge (val is needed for get_tmp from ForwardDiff.jl).
-source
+source
# Ribasim.get_flow
— Method .
Get the flow over the given edge (val is needed for get_tmp from ForwardDiff.jl).
-source
+source
# Ribasim.get_fractional_flow_connected_basins
— Method .
Get the node type specific indices of the fractional flows and basins, that are consecutively connected to a node of given id.
-source
+source
# Ribasim.get_jac_prototype
— Method .
Get a sparse matrix whose sparsity matches the sparsity of the Jacobian of the ODE problem. All nodes are taken into consideration, also the ones that are inactive.
In Ribasim the Jacobian is typically sparse because each state only depends on a small number of other states.
Note: the name ‘prototype’ does not mean this code is a prototype, it comes from the naming convention of this sparsity structure in the differentialequations.jl docs.
-source
+source
# Ribasim.get_level
— Method .
Get the current water level of a node ID. The ID can belong to either a Basin or a LevelBoundary. storage: tells ForwardDiff whether this call is for differentiation or not
-source
+source
# Ribasim.get_scalar_interpolation
— Method .
Linear interpolation of a scalar with constant extrapolation.
-source
+source
# Ribasim.get_storage_from_level
— Method .
Get the storage of a basin from its level.
-source
+source
# Ribasim.get_storages_and_levels
— Method .
Get the storage and level of all basins as matrices of nbasin × ntime
-source
+source
# Ribasim.get_storages_from_levels
— Method .
Compute the storages of the basins based on the water level of the basins.
-source
+source
# Ribasim.get_tstops
— Method .
From an iterable of DateTimes, find the times the solver needs to stop
-source
+source
# Ribasim.get_value
— Method .
Get a value for a condition. Currently supports getting levels from basins and flows from flow boundaries.
-source
+source
# Ribasim.id_index
— Method .
Get the index of an ID in a set of indices.
-source
+source
# Ribasim.indicate_allocation_flow!
— Method .
Add to the edge metadata that the given edge is used for allocation flow. If the edge does not exist, it is created.
-source
+source
# Ribasim.inflow_id
— Method .
Get the unique inneighbor over a flow edge.
-source
+source
# Ribasim.inflow_ids
— Method .
Get the inneighbors over flow edges.
-source
+source
# Ribasim.inflow_ids_allocation
— Method .
Get the inneighbors of the given ID such that the connecting edge is an allocation flow edge.
-source
+source
# Ribasim.inneighbor_labels_type
— Method .
Get the inneighbor node IDs of the given node ID (label) over the given edge type in the graph.
-source
+source
# Ribasim.inoutflow_ids
— Method .
Get the in- and outneighbors over flow edges.
-source
+source
# Ribasim.integrate_flows!
— Method .
Integrate flows over the last timestep
-source
+source
# Ribasim.is_allocation_source
— Method .
Find out whether the given edge is a source for an allocation network.
-source
+source
# Ribasim.is_current_module
— Method .
is_current_module (log:: LogMessageType ):: Bool
Returns true if the log message is from the current module or a submodule.
See https:// github.com/ JuliaLogging/ LoggingExtras.jl/ blob/ d35e7c8cfc197853ee336ace17182e6ed36dca24/ src/ CompositionalLoggers/ earlyfiltered.jl#L39
for the information available in log.
-source
+source
# Ribasim.is_flow_constraining
— Method .
Whether the given node node is flow constraining by having a maximum flow rate.
-source
+source
# Ribasim.is_flow_direction_constraining
— Method .
Whether the given node is flow direction constraining (only in direction of edges).
-source
+source
# Ribasim.load_data
— Method .
load_data (db:: DB , config:: Config , nodetype:: Symbol , kind:: Symbol ):: Union{Table, Query, Nothing}
Load data from Arrow files if available, otherwise the database. Returns either an Arrow.Table
, SQLite.Query
or nothing
if the data is not present.
-source
+source
# Ribasim.load_structvector
— Method .
load_structvector (db:: DB , config:: Config , :: Type{T} ):: StructVector{T}
Load data from Arrow files if available, otherwise the database. Always returns a StructVector of the given struct type T, which is empty if the table is not found. This function validates the schema, and enforces the required sort order.
-source
+source
# Ribasim.low_storage_factor
— Method .
If id is a Basin with storage below the threshold, return a reduction factor != 1
-source
+source
# Ribasim.main
— Method .
main (toml_path:: AbstractString ):: Cint
main (ARGS :: Vector{String} ):: Cint
main ():: Cint
This is the main entry point of the application. Performs argument parsing and sets up logging for both terminal and file. Calls Ribasim.run() and handles exceptions to convert to exit codes.
-source
+source
# Ribasim.metadata_from_edge
— Method .
Get the metadata of an edge in the graph from an edge of the underlying DiGraph.
-source
+source
# Ribasim.nodefields
— Method .
Get all node fieldnames of the parameter object.
-source
+source
# Ribasim.nodetype
— Method .
From a SchemaVersion(“ribasim.flowboundary.static”, 1) return (:FlowBoundary, :static)
-source
+source
# Ribasim.outflow_id
— Method .
Get the unique outneighbor over a flow edge.
-source
+source
# Ribasim.outflow_ids
— Method .
Get the outneighbors over flow edges.
-source
+source
# Ribasim.outflow_ids_allocation
— Method .
Get the outneighbors of the given ID such that the connecting edge is an allocation flow edge.
-source
+source
# Ribasim.outneighbor_labels_type
— Method .
Get the outneighbor node IDs of the given node ID (label) over the given edge type in the graph.
-source
+source
# Ribasim.parse_static_and_time
— Method .
Process the data in the static and time tables for a given node type. The ‘defaults’ named tuple dictates how missing data is filled in. ‘time_interpolatables’ is a vector of Symbols of parameter names for which a time interpolation (linear) object must be constructed. The control mapping for DiscreteControl is also constructed in this function. This function currently does not support node states that are defined by more than one row in a table, as is the case for TabulatedRatingCurve.
-source
+source
# Ribasim.pkgversion
— Method .
Get the package version of a given module
-source
+source
# Ribasim.process_allocation_graph_edges!
— Method .
For the composite allocation network edges:
@@ -796,95 +796,95 @@ source
+source
# Ribasim.profile_storage
— Method .
Calculate a profile storage by integrating the areas over the levels
-source
+source
# Ribasim.qh_interpolation
— Method .
From a table with columns nodeid, flow rate (Q) and level (h), create a LinearInterpolation from level to flow rate for a given node_id.
-source
+source
# Ribasim.reduction_factor
— Method .
Function that goes smoothly from 0 to 1 in the interval [0,threshold], and is constant outside this interval.
-source
+source
# Ribasim.run
— Method .
run (config_file:: AbstractString ):: Model
run (config:: Config ):: Model
Run a Model
, given a path to a TOML configuration file, or a Config object. Running a model includes initialization, solving to the end with [
solve!](@ref)
and writing results with write_results
.
-source
+source
# Ribasim.save_allocation_flows!
— Method .
Save the allocation flows per basin and physical edge.
-source
+source
# Ribasim.save_demands_and_allocations!
— Method .
Save the demands and allocated flows for UserDemand and Basin. Note: Basin supply (negative demand) is only saved for the first priority.
-source
+source
# Ribasim.save_flow
— Method .
Compute the average flows over the last saveat interval and write them to SavedValues
-source
+source
# Ribasim.save_subgrid_level
— Method .
Interpolate the levels and save them to SavedValues
-source
+source
# Ribasim.scalar_interpolation_derivative
— Method .
Derivative of scalar interpolation.
-source
+source
# Ribasim.seconds_since
— Method .
seconds_since (t:: DateTime , t0:: DateTime ):: Float64
Convert a DateTime to a float that is the number of seconds since the start of the simulation. This is used to convert between the solver’s inner float time, and the calendar.
-source
+source
# Ribasim.set_current_value!
— Method .
From a timeseries table time
, load the most recent applicable data into table
. table
must be a NamedTuple of vectors with all variables that must be loaded. The most recent applicable data is non-NaN data for a given ID that is on or before t
.
-source
+source
# Ribasim.set_flow!
— Method .
Set the given flow q on the horizontal (self-loop) edge from id to id.
-source
+source
# Ribasim.set_flow!
— Method .
Set the given flow q over the edge between the given nodes.
-source
+source
# Ribasim.set_fractional_flow_in_allocation!
— Method .
Update the fractional flow fractions in an allocation problem.
-source
+source
# Ribasim.set_initial_discrete_controlled_parameters!
— Method .
Set parameters of nodes that are controlled by DiscreteControl to the values corresponding to the initial state of the model.
-source
+source
# Ribasim.set_is_pid_controlled!
— Method .
Set ispid controlled to true for those pumps and outlets that are PID controlled
-source
+source
# Ribasim.set_objective_priority!
— Method .
Set the objective for the given priority. For an objective with absolute values this also involves adjusting constraints.
-source
+source
# Ribasim.set_static_value!
— Method .
Load data from a source table static
into a destination table
. Data is matched based on the node_id, which is sorted.
-source
+source
# Ribasim.set_table_row!
— Method .
Update table
at row index i
, with the values of a given row. table
must be a NamedTuple of vectors with all variables that must be loaded. The row must contain all the column names that are present in the table. If a value is missing, it is not set.
-source
+source
# Ribasim.sorted_table!
— Method .
Depending on if a table can be sorted, either sort it or assert that it is sorted.
Tables loaded from the database into memory can be sorted. Tables loaded from Arrow files are memory mapped and can therefore not be sorted.
-source
+source
# Ribasim.tsaves
— Method .
Get all saved times in seconds since start
-source
+source
# Ribasim.update_allocation!
— Method .
Solve the allocation problem for all demands and assign allocated abstractions.
-source
+source
# Ribasim.update_basin
— Method .
Load updates from ‘Basin / time’ into the parameters
-source
+source
# Ribasim.update_jac_prototype!
— Method .
Method for nodes that do not contribute to the Jacobian
-source
+source
# Ribasim.update_jac_prototype!
— Method .
The controlled basin affects itself and the basins upstream and downstream of the controlled pump affect eachother if there is a basin upstream of the pump. The state for the integral term and the controlled basin affect eachother, and the same for the integral state and the basin upstream of the pump if it is indeed a basin.
-source
+source
# Ribasim.update_jac_prototype!
— Method .
If both the unique node upstream and the unique node downstream of these nodes are basins, then these directly depend on eachother and affect the Jacobian 2x Basins always depend on themselves.
-source
+source
# Ribasim.update_jac_prototype!
— Method .
If both the unique node upstream and the nodes down stream (or one node further if a fractional flow is in between) are basins, then the downstream basin depends on the upstream basin(s) and affect the Jacobian as many times as there are downstream basins Upstream basins always depend on themselves.
-source
+source
# Ribasim.update_tabulated_rating_curve!
— Method .
Load updates from ‘TabulatedRatingCurve / time’ into the parameters
-source
+source
# Ribasim.valid_discrete_control
— Method .
Check:
@@ -892,60 +892,60 @@ source
+source
# Ribasim.valid_edge_types
— Method .
Check that only supported edge types are declared.
-source
+source
# Ribasim.valid_edges
— Method .
Test for each node given its node type whether the nodes that
are downstream (‘down-edge’) of this node are of an allowed type
-source
+source
# Ribasim.valid_flow_rates
— Method .
Test whether static or discrete controlled flow rates are indeed non-negative.
-source
+source
# Ribasim.valid_fractional_flow
— Method .
Check that nodes that have fractional flow outneighbors do not have any other type of outneighbor, that the fractions leaving a node add up to ≈1 and that the fractions are non-negative.
-source
+source
# Ribasim.valid_n_neighbors
— Method .
Test for each node given its node type whether it has an allowed number of flow/control inneighbors and outneighbors
-source
+source
# Ribasim.valid_profiles
— Method .
Check whether the profile data has no repeats in the levels and the areas start positive.
-source
+source
# Ribasim.valid_sources
— Method .
The source nodes must only have one allocation outneighbor and no allocation inneighbors.
-source
+source
# Ribasim.valid_subgrid
— Method .
Validate the entries for a single subgrid element.
-source
+source
# Ribasim.water_balance!
— Method .
The right hand side function of the system of ODEs set up by Ribasim.
-source
+source
# Ribasim.write_arrow
— Method .
Write a result table to disk as an Arrow file
-source
+source
# Ribasim.write_results
— Method .
write_results (model:: Model ):: Model
Write all results to the Arrow files as specified in the model configuration.
-source
+source
# Ribasim.config.algorithm
— Method .
Create an OrdinaryDiffEqAlgorithm from solver config
-source
+source
# Ribasim.config.convert_dt
— Method .
Convert the dt from our Config to SciML stepsize control arguments
-source
+source
# Ribasim.config.convert_saveat
— Method .
Convert the saveat Float64 from our Config to SciML’s saveat
-source
+source
# Ribasim.config.input_path
— Method .
Construct a path relative to both the TOML directory and the optional input_dir
-source
+source
# Ribasim.config.results_path
— Method .
Construct a path relative to both the TOML directory and the optional results_dir
-source
+source
# Ribasim.config.snake_case
— Method .
Convert a string from CamelCase to snake_case.
-source
+source
@@ -966,7 +966,7 @@ source
+source
@@ -974,10 +974,10 @@ Macros
# Ribasim.config.@addfields
— Macro .
Add fieldnames with Union{String, Nothing} type to struct expression. Requires (option? ) use before it.
-source
+source
# Ribasim.config.@addnodetypes
— Macro .
Add all TableOption subtypes as fields to struct expression. Requires (option? ) use before it.
-source
+source
@@ -988,8 +988,8 @@ Ribasim.config
Ribasim.config.algorithms
Ribasim.Allocation
-Ribasim.AllocationModel
Ribasim.AllocationModel
+Ribasim.AllocationModel
Ribasim.Basin
Ribasim.DiscreteControl
Ribasim.EdgeMetadata
@@ -1072,16 +1072,16 @@ Ribasim.flow_table
Ribasim.formulate_basins!
Ribasim.formulate_flow!
-Ribasim.formulate_flow!
Ribasim.formulate_flow!
+Ribasim.formulate_flow!
Ribasim.get_area_and_level
Ribasim.get_basin_capacity
Ribasim.get_basin_data
Ribasim.get_basin_demand
Ribasim.get_chunk_sizes
Ribasim.get_compressor
-Ribasim.get_flow
Ribasim.get_flow
+Ribasim.get_flow
Ribasim.get_fractional_flow_connected_basins
Ribasim.get_jac_prototype
Ribasim.get_level
@@ -1128,8 +1128,8 @@ Ribasim.scalar_interpolation_derivative
Ribasim.seconds_since
Ribasim.set_current_value!
-Ribasim.set_flow!
Ribasim.set_flow!
+Ribasim.set_flow!
Ribasim.set_fractional_flow_in_allocation!
Ribasim.set_initial_discrete_controlled_parameters!
Ribasim.set_is_pid_controlled!
@@ -1141,8 +1141,8 @@ Ribasim.update_allocation!
Ribasim.update_basin
Ribasim.update_jac_prototype!
-Ribasim.update_jac_prototype!
Ribasim.update_jac_prototype!
+Ribasim.update_jac_prototype!
Ribasim.update_jac_prototype!
Ribasim.update_tabulated_rating_curve!
Ribasim.valid_discrete_control
diff --git a/core/allocation.html b/core/allocation.html
index 3895d5b54..5c23a61f7 100644
--- a/core/allocation.html
+++ b/core/allocation.html
@@ -564,7 +564,7 @@ Solving the all
Example
The following is an example of an optimization problem for the example shown here :
-
+
Code
using Ribasim
@@ -589,45 +589,45 @@ println (p.allocation.allocation_models[1 ].problem)
-
Min F_abs_user_demand[UserDemand #3] + F_abs_user_demand[UserDemand #6] + F_abs_user_demand[UserDemand #13] + F_abs_basin[Basin #2] + F_abs_basin[Basin #5] + F_abs_basin[Basin #12]
+Min F_abs_user_demand[UserDemand #3] + F_abs_user_demand[UserDemand #13] + F_abs_user_demand[UserDemand #6] + F_abs_basin[Basin #2] + F_abs_basin[Basin #12] + F_abs_basin[Basin #5]
Subject to
- flow_conservation[Basin #2] : F[(Basin #2, UserDemand #3)] - F[(Basin #5, Basin #2)] - F[(FlowBoundary #1, Basin #2)] + F[(Basin #2, Basin #5)] + F_basin_in[Basin #2] - F_basin_out[Basin #2] = 0
- flow_conservation[Basin #5] : F[(Basin #5, Basin #2)] + F[(Basin #5, TabulatedRatingCurve #7)] + F[(Basin #5, UserDemand #6)] - F[(Basin #2, Basin #5)] + F_basin_in[Basin #5] - F_basin_out[Basin #5] = 0
- flow_conservation[Basin #12] : F[(Basin #12, UserDemand #13)] - F[(TabulatedRatingCurve #7, Basin #12)] + F_basin_in[Basin #12] - F_basin_out[Basin #12] = 0
+ flow_conservation[Basin #2] : F[(Basin #2, UserDemand #3)] - F[(FlowBoundary #1, Basin #2)] + F[(Basin #2, Basin #5)] - F[(Basin #5, Basin #2)] + F_basin_in[Basin #2] - F_basin_out[Basin #2] = 0
+ flow_conservation[Basin #12] : -F[(TabulatedRatingCurve #7, Basin #12)] + F[(Basin #12, UserDemand #13)] + F_basin_in[Basin #12] - F_basin_out[Basin #12] = 0
+ flow_conservation[Basin #5] : F[(Basin #5, TabulatedRatingCurve #7)] - F[(Basin #2, Basin #5)] + F[(Basin #5, UserDemand #6)] + F[(Basin #5, Basin #2)] + F_basin_in[Basin #5] - F_basin_out[Basin #5] = 0
abs_positive_user_demand[UserDemand #3] : -F[(Basin #2, UserDemand #3)] + F_abs_user_demand[UserDemand #3] ≥ -1.5
- abs_positive_user_demand[UserDemand #6] : -F[(Basin #5, UserDemand #6)] + F_abs_user_demand[UserDemand #6] ≥ 0
abs_positive_user_demand[UserDemand #13] : -F[(Basin #12, UserDemand #13)] + F_abs_user_demand[UserDemand #13] ≥ 0
+ abs_positive_user_demand[UserDemand #6] : -F[(Basin #5, UserDemand #6)] + F_abs_user_demand[UserDemand #6] ≥ 0
abs_negative_user_demand[UserDemand #3] : F[(Basin #2, UserDemand #3)] + F_abs_user_demand[UserDemand #3] ≥ 1.5
- abs_negative_user_demand[UserDemand #6] : F[(Basin #5, UserDemand #6)] + F_abs_user_demand[UserDemand #6] ≥ 0
abs_negative_user_demand[UserDemand #13] : F[(Basin #12, UserDemand #13)] + F_abs_user_demand[UserDemand #13] ≥ 0
+ abs_negative_user_demand[UserDemand #6] : F[(Basin #5, UserDemand #6)] + F_abs_user_demand[UserDemand #6] ≥ 0
abs_positive_basin[Basin #2] : -F_basin_in[Basin #2] + F_abs_basin[Basin #2] ≥ 0
- abs_positive_basin[Basin #5] : -F_basin_in[Basin #5] + F_abs_basin[Basin #5] ≥ 0
abs_positive_basin[Basin #12] : -F_basin_in[Basin #12] + F_abs_basin[Basin #12] ≥ 0
+ abs_positive_basin[Basin #5] : -F_basin_in[Basin #5] + F_abs_basin[Basin #5] ≥ 0
abs_negative_basin[Basin #2] : F_basin_in[Basin #2] + F_abs_basin[Basin #2] ≥ 0
- abs_negative_basin[Basin #5] : F_basin_in[Basin #5] + F_abs_basin[Basin #5] ≥ 0
abs_negative_basin[Basin #12] : F_basin_in[Basin #12] + F_abs_basin[Basin #12] ≥ 0
+ abs_negative_basin[Basin #5] : F_basin_in[Basin #5] + F_abs_basin[Basin #5] ≥ 0
source[(FlowBoundary #1, Basin #2)] : F[(FlowBoundary #1, Basin #2)] ≤ 1
return_flow[UserDemand #13] : F[(UserDemand #13, Terminal #10)] ≤ 0
fractional_flow[(TabulatedRatingCurve #7, Basin #12)] : -0.4 F[(Basin #5, TabulatedRatingCurve #7)] + F[(TabulatedRatingCurve #7, Basin #12)] ≤ 0
basin_outflow[Basin #2] : F_basin_out[Basin #2] ≤ 0
- basin_outflow[Basin #5] : F_basin_out[Basin #5] ≤ 0
basin_outflow[Basin #12] : F_basin_out[Basin #12] ≤ 0
- F[(UserDemand #13, Terminal #10)] ≥ 0
- F[(Basin #2, UserDemand #3)] ≥ 0
- F[(Basin #5, Basin #2)] ≥ 0
- F[(Basin #12, UserDemand #13)] ≥ 0
- F[(FlowBoundary #1, Basin #2)] ≥ 0
+ basin_outflow[Basin #5] : F_basin_out[Basin #5] ≤ 0
F[(TabulatedRatingCurve #7, Terminal #10)] ≥ 0
F[(Basin #5, TabulatedRatingCurve #7)] ≥ 0
- F[(Basin #5, UserDemand #6)] ≥ 0
+ F[(Basin #2, UserDemand #3)] ≥ 0
F[(TabulatedRatingCurve #7, Basin #12)] ≥ 0
+ F[(FlowBoundary #1, Basin #2)] ≥ 0
+ F[(Basin #12, UserDemand #13)] ≥ 0
+ F[(UserDemand #13, Terminal #10)] ≥ 0
F[(Basin #2, Basin #5)] ≥ 0
+ F[(Basin #5, UserDemand #6)] ≥ 0
+ F[(Basin #5, Basin #2)] ≥ 0
F_basin_in[Basin #2] ≥ 0
- F_basin_in[Basin #5] ≥ 0
F_basin_in[Basin #12] ≥ 0
+ F_basin_in[Basin #5] ≥ 0
F_basin_out[Basin #2] ≥ 0
- F_basin_out[Basin #5] ≥ 0
F_basin_out[Basin #12] ≥ 0
+ F_basin_out[Basin #5] ≥ 0
diff --git a/core/equations.html b/core/equations.html
index f6ab2a155..c549181e7 100644
--- a/core/equations.html
+++ b/core/equations.html
@@ -427,7 +427,7 @@
Here \(p > 0\) is the threshold value which determines the interval \([0,p]\) of the smooth transition between \(0\) and \(1\) , see the plot below.
-
+
Code
import numpy as np
diff --git a/core/validation.html b/core/validation.html
index 65fdf3499..0db90461c 100644
--- a/core/validation.html
+++ b/core/validation.html
@@ -262,7 +262,7 @@ Validation
Connectivity
In the table below, each column shows which node types are allowed to be downstream (or ‘down-control’) of the node type at the top of the column.
-
+
Code
using Ribasim
@@ -546,7 +546,7 @@ Connectivity
Neighbor amounts
The table below shows for each node type between which bounds the amount of in- and outneighbors must be, for both flow and control edges.
-
+
Code
flow_in_min = Vector {String} ()
diff --git a/python/examples_files/figure-html/cell-59-output-1.png b/python/examples_files/figure-html/cell-59-output-1.png
index 54374cc991515bd6fc5f5b3f29a373150bdbfbcc..baad4bc0ba8284b7fd3a485ade56812b2b92e95c 100644
GIT binary patch
literal 181874
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 oCu_h*WH_fgV>
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