From 1e8be2ff379bce217cbc350b30ea9e897374dcee Mon Sep 17 00:00:00 2001 From: visr Date: Fri, 10 Nov 2023 12:13:25 +0000 Subject: [PATCH] deploy: a7ca763063aac955582df5792c8bcc76b6f3812b --- build/index.html | 254 +++++++++--------- core/equations.html | 2 +- .../figure-html/cell-2-output-2.png | Bin 34764 -> 34764 bytes python/examples.html | 2 +- .../figure-html/cell-16-output-2.png | Bin 63468 -> 63468 bytes .../figure-html/cell-26-output-2.png | Bin 78092 -> 78092 bytes .../figure-html/cell-27-output-2.png | Bin 150382 -> 150382 bytes .../figure-html/cell-38-output-2.png | Bin 50066 -> 50066 bytes .../figure-html/cell-41-output-1.png | Bin 51033 -> 51033 bytes .../figure-html/cell-52-output-2.png | Bin 53930 -> 53930 bytes .../figure-html/cell-55-output-1.png | Bin 70691 -> 70672 bytes search.json | 4 +- 12 files changed, 131 insertions(+), 131 deletions(-) diff --git a/build/index.html b/build/index.html index 300fa2fcf..d2c4d6664 100644 --- a/build/index.html +++ b/build/index.html @@ -262,11 +262,11 @@

solve!
  • BMI.finalize
  • -

    source

    +

    source

    # Ribasim.configModule.

    module config

    Ribasim.config is a submodule of Ribasim to handle the configuration of a Ribasim model. It is implemented using the Configurations package. A full configuration is represented by Config, which is the main API. Ribasim.config is a submodule mainly to avoid name clashes between the configuration sections and the rest of Ribasim.

    -

    source

    +

    source

    @@ -275,7 +275,7 @@

    # Ribasim.AllocationModelType.

    Store information for a subnetwork used for allocation.

    nodeid: All the IDs of the nodes that are in this subnetwork nodeidmapping: Mapping Dictionary; modelnodeid => AGnodeid where such a correspondence exists (all AG node ids are in the values) nodeidmappinginverse: The inverse of nodeidmapping, Dictionary; AG node ID => model node ID allocgraphedgeidsuserdemand: AG user node ID => AG user inflow edge ID Source edge mapping: AG source node ID => subnetwork source edge ID graphallocation: The graph used for the allocation problems capacity: The capacity per edge of the allocation graph, as constrained by nodes that have a maxflowrate problem: The JuMP.jl model for solving the allocation problem Δtallocation: The time interval between consecutive allocation solves

    -

    source

    +

    source

    # Ribasim.AllocationModelMethod.

    Construct the JuMP.jl problem for allocation.

    Definitions

    @@ -287,7 +287,7 @@

    source

    +

    source

    # Ribasim.BasinType.

    Requirements:

      @@ -297,24 +297,24 @@

      source

      +

      source

      # Ribasim.ConnectivityType.

      Store the connectivity information

      graphflow, graphcontrol: directed graph with vertices equal to ids flow: store the flow on every flow edge edgeidsflow, edgeidscontrol: get the external edge id from (src, dst) edgeconnectiontypeflow, edgeconnectiontypescontrol: get (srcnodetype, dstnodetype) from edge id

      if autodiff T = DiffCache{SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Float64}} else T = SparseMatrixCSC{Float64, Int} end

      -

      source

      +

      source

      # Ribasim.DiscreteControlType.

      nodeid: node ID of the DiscreteControl node; these are not unique but repeated by the amount of conditions of this DiscreteControl node listenfeatureid: the ID of the node/edge being condition on variable: the name of the variable in the condition greaterthan: The threshold value in the condition conditionvalue: The current value of each condition controlstate: Dictionary: node ID => (control state, control state start) logic_mapping: Dictionary: (control node ID, truth state) => control state record: Namedtuple with discrete control information for results

      -

      source

      +

      source

      # Ribasim.FlatVectorType.

      struct FlatVector{T} <: AbstractVector{T}

      A FlatVector is an AbstractVector that iterates the T of a Vector{Vector{T}}.

      Each inner vector is assumed to be of equal length.

      It is similar to Iterators.flatten, though that doesn’t work with the Tables.Column interface, which needs length and getindex support.

      -

      source

      +

      source

      # Ribasim.FlowBoundaryType.

      nodeid: node ID of the FlowBoundary node active: whether this node is active and thus contributes flow flowrate: target flow rate

      -

      source

      +

      source

      # Ribasim.FractionalFlowType.

      Requirements:

        @@ -323,10 +323,10 @@

        source

        +

        source

        # Ribasim.LevelBoundaryType.

        node_id: node ID of the LevelBoundary node active: whether this node is active level: the fixed level of this ‘infinitely big basin’

        -

        source

        +

        source

        # Ribasim.LinearResistanceType.

        Requirements:

          @@ -334,7 +334,7 @@

          source

          +

          source

          # Ribasim.ManningResistanceType.

          This is a simple Manning-Gauckler reach connection.

            @@ -364,39 +364,39 @@

            source

            +

            source

            # Ribasim.ModelType.

            Model(config_path::AbstractString)
             Model(config::Config)

            Initialize a Model.

            The Model struct is an initialized model, combined with the Config used to create it and saved results. The Basic Model Interface (BMI) is implemented on the Model. A Model can be created from the path to a TOML configuration file, or a Config object.

            -

            source

            +

            source

            # Ribasim.OutletType.

            nodeid: node ID of the Outlet node active: whether this node is active and thus contributes flow flowrate: target flow rate minflowrate: The minimal flow rate of the outlet maxflowrate: The maximum flow rate of the outlet controlmapping: dictionary from (nodeid, controlstate) to target flow rate ispid_controlled: whether the flow rate of this outlet is governed by PID control

            -

            source

            +

            source

            # Ribasim.PidControlType.

            PID control currently only supports regulating basin levels.

            nodeid: node ID of the PidControl node active: whether this node is active and thus sets flow rates listennodeid: the id of the basin being controlled pidparams: a vector interpolation for parameters changing over time. The parameters are respectively target, proportional, integral, derivative, where the last three are the coefficients for the PID equation. error: the current error; basintarget - currentlevel

            -

            source

            +

            source

            # Ribasim.PumpType.

            nodeid: node ID of the Pump node active: whether this node is active and thus contributes flow flowrate: target flow rate minflowrate: The minimal flow rate of the pump maxflowrate: The maximum flow rate of the pump controlmapping: dictionary from (nodeid, controlstate) to target flow rate ispid_controlled: whether the flow rate of this pump is governed by PID control

            -

            source

            +

            source

            # Ribasim.TabulatedRatingCurveType.

            struct TabulatedRatingCurve{C}

            Rating curve from level to discharge. The rating curve is a lookup table with linear interpolation in between. Relation can be updated in time, which is done by moving data from the time field into the tables, which is done in the update_tabulated_rating_curve callback.

            Type parameter C indicates the content backing the StructVector, which can be a NamedTuple of Vectors or Arrow Primitives, and is added to avoid type instabilities.

            nodeid: node ID of the TabulatedRatingCurve node active: whether this node is active and thus contributes flows tables: The current Q(h) relationships time: The time table used for updating the tables controlmapping: dictionary from (nodeid, controlstate) to Q(h) and/or active state

            -

            source

            +

            source

            # Ribasim.TerminalType.

            node_id: node ID of the Terminal node

            -

            source

            +

            source

            # Ribasim.UserType.

            demand: water flux demand of user per priority over time active: whether this node is active and thus demands water allocated: water flux currently allocated to user per priority returnfactor: the factor in [0,1] of how much of the abstracted water is given back to the system minlevel: The level of the source basin below which the user does not abstract priorities: All used priority values. Each user has a demand for all these priorities, which is always 0.0 if it is not provided explicitly.

            -

            source

            +

            source

            # Ribasim.config.ConfigMethod.

            Config(config_path::AbstractString; kwargs...)

            Parse a TOML file to a Config. Keys can be overruled using keyword arguments. To overrule keys from a subsection, e.g. dt from the solver section, use underscores: solver_dt.

            -

            source

            +

            source

            @@ -405,116 +405,116 @@

            # BasicModelInterface.finalizeMethod.

            BMI.finalize(model::Model)::Model

            Write all results to the configured files.

            -

            source

            +

            source

            # BasicModelInterface.initializeMethod.

            BMI.initialize(T::Type{Model}, config_path::AbstractString)::Model

            Initialize a Model from the path to the TOML configuration file.

            -

            source

            +

            source

            # BasicModelInterface.initializeMethod.

            BMI.initialize(T::Type{Model}, config::Config)::Model

            Initialize a Model from a Config.

            -

            source

            +

            source

            # CommonSolve.solve!Method.

            solve!(model::Model)::ODESolution

            Solve a Model until the configured endtime.

            -

            source

            +

            source

            # Ribasim.add_constraints_basin_allocation!Method.

            Add the basin allocation constraints to the allocation problem; the allocations to the basins are bounded from above by the basin demand (these are set before each allocation solve). The constraint indices are allocation graph basin node IDs.

            Constraint: allocation to basin <= basin demand

            -

            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 the allocation graph edge IDs.

            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 allocgraph user node IDs.

            Constraint: sum(flows out of node node) <= flows into node + flow from storage and vertical fluxes

            -

            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 the allocation graph source node IDs.

            Constraint: flow over source edge <= source flow in subnetwork

            -

            source

            +

            source

            # Ribasim.add_constraints_user_allocation!Method.

            Add the user allocation constraints to the allocation problem: The flow to a user is bounded from above by the demand of the user.

            -

            source

            +

            source

            # Ribasim.add_constraints_user_returnflow!Method.

            Add the user returnflow constraints to the allocation problem. The constraint indices are allocation graph user node IDs.

            Constraint: outflow from user = return factor * inflow to user

            -

            source

            +

            source

            # Ribasim.add_objective_function!Method.

            Add the objective function to be maximized to the allocation problem. Objective function: Sum of flows to the users.

            -

            source

            +

            source

            # Ribasim.add_variables_allocation_basin!Method.

            Add the basin allocation variables A_basin to the allocation problem. The variable indices are the allocation graph basin node IDs. Non-negativivity constraints are also immediately added to the basin allocation variables.

            -

            source

            +

            source

            # Ribasim.add_variables_flow!Method.

            Add the flow variables F to the allocation problem. The variable indices are the allocation graph edge IDs. Non-negativivity constraints are also immediately added to the flow variables.

            -

            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.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 users.

            -

            source

            +

            source

            # Ribasim.allocation_graphMethod.

            Build the graph used for the allocation problem.

            -

            source

            +

            source

            # Ribasim.allocation_problemMethod.

            Construct the allocation problem for the current subnetwork as a JuMP.jl model.

            -

            source

            +

            source

            # Ribasim.assign_allocations!Method.

            Assign the allocations to the users as determined by the solution of the allocation problem.

            -

            source

            +

            source

            # Ribasim.avoid_using_own_returnflow!Method.

            Remove user return flow edges that are upstream of the user itself, and collect the IDs of the allocation graph node IDs of the users that do not have this problem.

            -

            source

            +

            source

            # Ribasim.basin_bottomMethod.

            Return the bottom elevation of the basin with index i, or nothing if it doesn’t exist

            -

            source

            +

            source

            # Ribasim.basin_bottomsMethod.

            Get the bottom on both ends of a node. If only one has a bottom, use that for both.

            -

            source

            +

            source

            # Ribasim.basin_tableMethod.

            Create the basin result table from the saved data

            -

            source

            +

            source

            # Ribasim.create_callbacksMethod.

            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_graphMethod.

            Return a directed graph, and a mapping from source and target nodes to edge fid.

            -

            source

            +

            source

            # Ribasim.create_storage_tablesMethod.

            Read the Basin / profile table and return all area and level and computed storage values

            -

            source

            +

            source

            # Ribasim.datetime_sinceMethod.

            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.datetimesMethod.

            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_conditionMethod.

            Listens for changes in condition truths.

            -

            source

            +

            source

            # Ribasim.discrete_control_tableMethod.

            Create a discrete control result table from the saved data

            -

            source

            +

            source

            # Ribasim.expand_logic_mappingMethod.

            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 allocgraph edges in several ways:

              @@ -522,26 +522,26 @@

              source

              +

              source

              # Ribasim.findlastgroupMethod.

              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.

              #                         1 2 3 4 5 6 7 8 9
               Ribasim.findlastgroup(2, [5,4,2,2,5,2,2,2,1])
               # output
               6:8
              -

              source

              +

              source

              # Ribasim.findsortedMethod.

              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_tableMethod.

              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)
              @@ -569,91 +569,91 @@

              source

              +

              source

              # Ribasim.formulate_flow!Method.

              Directed graph: outflow is positive!

              -

              source

              +

              source

              # Ribasim.get_area_and_levelMethod.

              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_compressorMethod.

              Get the compressor based on the Results section

              -

              source

              +

              source

              # Ribasim.get_fractional_flow_connected_basinsMethod.

              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_prototypeMethod.

              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_levelMethod.

              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_node_id_mappingMethod.

              Get:

              • The mapping from subnetwork node IDs to allocation graph node IDs
              • The mapping from allocation graph source node IDs to subnetwork source edge IDs
              -

              source

              +

              source

              # Ribasim.get_node_in_out_edgesMethod.

              Get two dictionaries, where:

              • The first one gives the IDs of the inedges for each node ID in the graph
              • The second one gives the IDs of the outedges for each node ID in the graph
              -

              source

              +

              source

              # Ribasim.get_scalar_interpolationMethod.

              Linear interpolation of a scalar with constant extrapolation.

              -

              source

              +

              source

              # Ribasim.get_storage_from_levelMethod.

              Get the storage of a basin from its level.

              -

              source

              +

              source

              # Ribasim.get_storages_and_levelsMethod.

              Get the storage and level of all basins as matrices of nbasin × ntime

              -

              source

              +

              source

              # Ribasim.get_storages_from_levelsMethod.

              Compute the storages of the basins based on the water level of the basins.

              -

              source

              +

              source

              # Ribasim.get_tstopsMethod.

              From an iterable of DateTimes, find the times the solver needs to stop

              -

              source

              +

              source

              # Ribasim.get_valueMethod.

              Get a value for a condition. Currently supports getting levels from basins and flows from flow boundaries.

              -

              source

              +

              source

              # Ribasim.id_indexMethod.

              Get the index of an ID in a set of indices.

              -

              source

              +

              source

              # Ribasim.input_pathMethod.

              Construct a path relative to both the TOML directory and the optional input_dir

              -

              source

              +

              source

              # Ribasim.is_flow_constrainingMethod.

              Whether the given node node is flow constraining by having a maximum flow rate.

              -

              source

              +

              source

              # Ribasim.is_flow_direction_constrainingMethod.

              Whether the given node is flow direction constraining (only in direction of edges).

              -

              source

              +

              source

              # Ribasim.load_dataMethod.

              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_structvectorMethod.

              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.nodefieldsMethod.

              Get all node fieldnames of the parameter object.

              -

              source

              +

              source

              # Ribasim.nodetypeMethod.

              From a SchemaVersion(“ribasim.flowboundary.static”, 1) return (:FlowBoundary, :static)

              -

              source

              +

              source

              # Ribasim.parse_static_and_timeMethod.

              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.path_exists_in_graphMethod.

              Find out whether a path exists between a start node and end node in the given graph.

              -

              source

              +

              source

              # Ribasim.process_allocation_graph_edges!Method.

              For the composite allocgraph edges:

                @@ -661,77 +661,77 @@

                source

                +

                source

                # Ribasim.profile_storageMethod.

                Calculate a profile storage by integrating the areas over the levels

                -

                source

                +

                source

                # Ribasim.qh_interpolationMethod.

                From a table with columns nodeid, discharge (Q) and level (h), create a LinearInterpolation from level to discharge for a given nodeid.

                -

                source

                +

                source

                # Ribasim.reduction_factorMethod.

                Function that goes smoothly from 0 to 1 in the interval [0,threshold], and is constant outside this interval.

                -

                source

                +

                source

                # Ribasim.results_pathMethod.

                Construct a path relative to both the TOML directory and the optional results_dir

                -

                source

                +

                source

                # Ribasim.runMethod.

                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 BMI.finalize.

                -

                source

                +

                source

                # Ribasim.save_flowMethod.

                Copy the current flow to the SavedValues

                -

                source

                +

                source

                # Ribasim.scalar_interpolation_derivativeMethod.

                Derivative of scalar interpolation.

                -

                source

                +

                source

                # Ribasim.seconds_sinceMethod.

                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_demands_priority!Method.

                Set the demands of the users of the current time and priority in the allocation problem.

                -

                source

                +

                source

                # Ribasim.set_source_flows!Method.

                Set the source flows as capacities on edges in the AG.

                -

                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 NaN, 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.timestepsMethod.

                Get all saved times in seconds since start

                -

                source

                +

                source

                # Ribasim.update_allocation!Method.

                Solve the allocation problem for all users and assign allocated abstractions to user nodes.

                -

                source

                +

                source

                # Ribasim.update_basinMethod.

                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_controlMethod.

                Check:

                  @@ -739,41 +739,41 @@

                  source

                  +

                  source

                  # Ribasim.valid_edge_typesMethod.

                  Check that only supported edge types are declared.

                  -

                  source

                  +

                  source

                  # Ribasim.valid_edgesMethod.

                  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_ratesMethod.

                  Test whether static or discrete controlled flow rates are indeed non-negative.

                  -

                  source

                  +

                  source

                  # Ribasim.valid_fractional_flowMethod.

                  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_neighborsMethod.

                  Test for each node given its node type whether it has an allowed number of flow/control inneighbors and outneighbors

                  -

                  source

                  +

                  source

                  # Ribasim.valid_profilesMethod.

                  Check whether the profile data has no repeats in the levels and the areas start positive.

                  -

                  source

                  +

                  source

                  # Ribasim.valid_sourcesMethod.

                  The source nodes must only have one outneighbor.

                  -

                  source

                  +

                  source

                  # Ribasim.water_balance!Method.

                  The right hand side function of the system of ODEs set up by Ribasim.

                  -

                  source

                  +

                  source

                  # Ribasim.write_arrowMethod.

                  Write a result table to disk as an Arrow file

                  -

                  source

                  +

                  source

                  # Ribasim.config.algorithmMethod.

                  Create an OrdinaryDiffEqAlgorithm from solver config

                  -

                  source

                  +

                  source

                  # Ribasim.config.snake_caseMethod.

                  Convert a string from CamelCase to snake_case.

                  -

                  source

                  +

                  source

                  @@ -794,7 +794,7 @@

                  source

                  +

                  source

                  @@ -802,10 +802,10 @@

                  1.5 Macros

                  # Ribasim.config.@addfieldsMacro.

                  Add fieldnames with Union{String, Nothing} type to struct expression. Requires (option?) use before it.

                  -

                  source

                  +

                  source

                  # Ribasim.config.@addnodetypesMacro.

                  Add all TableOption subtypes as fields to struct expression. Requires (option?) use before it.

                  -

                  source

                  +

                  source

                  @@ -815,8 +815,8 @@

                  Ribasim.Ribasim
                • Ribasim.config
                • Ribasim.config.algorithms
                • -
                • Ribasim.AllocationModel
                • Ribasim.AllocationModel
                • +
                • Ribasim.AllocationModel
                • Ribasim.Basin
                • Ribasim.Connectivity
                • Ribasim.DiscreteControl
                • @@ -835,8 +835,8 @@

                  Ribasim.User
                • Ribasim.config.Config
                • BasicModelInterface.finalize
                • -
                • BasicModelInterface.initialize
                • BasicModelInterface.initialize
                • +
                • BasicModelInterface.initialize
                • CommonSolve.solve!
                • Ribasim.add_constraints_basin_allocation!
                • Ribasim.add_constraints_capacity!
                • @@ -918,10 +918,10 @@

                  Ribasim.timesteps
                • 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_jac_prototype!
                • Ribasim.update_tabulated_rating_curve!
                • Ribasim.valid_discrete_control
                • Ribasim.valid_edge_types
                • diff --git a/core/equations.html b/core/equations.html index 06f680959..b7dc5ecca 100644 --- a/core/equations.html +++ b/core/equations.html @@ -423,7 +423,7 @@

                  <>:31: SyntaxWarning: invalid escape sequence '\p'
                   <>:31: SyntaxWarning: invalid escape sequence '\p'
                  -/tmp/ipykernel_4998/665069857.py:31: SyntaxWarning: invalid escape sequence '\p'
                  +/tmp/ipykernel_5010/665069857.py:31: SyntaxWarning: invalid escape sequence '\p'
                     ax.set_ylabel("$\phi(x;p)$", fontsize=fontsize)
                  diff --git a/core/equations_files/figure-html/cell-2-output-2.png b/core/equations_files/figure-html/cell-2-output-2.png index 6273d07be0def48ba8ab0c891ecdc8aa2bc3bb69..cccb19ddf571d307d643a61bf200a1195f3b9050 100644 GIT binary patch delta 43 ycmX@p&vd4rX@ZBGp^idENl8JmmA-y%Vo52 Update the basi ax = df_flow.pivot_table(index="time", columns="edge", values="flow_m3d").plot() ax.legend(bbox_to_anchor=(1.3, 1), title="Edge")
                  -
                  <matplotlib.legend.Legend at 0x7f140e6540b0>
                  +
                  <matplotlib.legend.Legend at 0x7fe3e9708b30>

                  diff --git a/python/examples_files/figure-html/cell-16-output-2.png b/python/examples_files/figure-html/cell-16-output-2.png index 66c9028305017660fd4d657a7e8becd149755884..ae221b401997c284f7d4e52313db932e5cdf0242 100644 GIT binary patch delta 43 zcmaF!p83st<_R8hhB^uvB_##LR{Hw6i6sR&`6W4-NqYH3>H3$}2-|E-Yx@oWjzAJQ delta 43 zcmaF!p83st<_R8h2098EB_##LR{Hw6i6sR&`6W4-NqYH3>H4M{x31op*7h9$k5Ce^ diff --git a/python/examples_files/figure-html/cell-26-output-2.png b/python/examples_files/figure-html/cell-26-output-2.png index e5070347df9f362acb19107dfd018479f288ff2e..5eeed32bf673e2fc3c9147770612825c6c43a29d 100644 GIT binary patch delta 46 zcmeBq#M1MKWrByCp^idENl8JmmA-y%Vo5H3$}2-`HKwWcv{O=IHl F1_0g45=H<3 delta 49 zcmaDijq}|!&IulJ2098EB_##LR{Hw6i6sR&`6W4-NqYH3>H4M{x2|qXYfWR^n#RQ8 F4FKV)621Tc diff --git a/python/examples_files/figure-html/cell-38-output-2.png b/python/examples_files/figure-html/cell-38-output-2.png index 287ee7a89db96af826b70b4aa5fbb031307308bf..3859a34d691c2b1ac862a24ef0400d76f6ca280c 100644 GIT binary patch delta 43 zcmbQ#&OE7|d4h+Wp^idENl8JmmA-y%Vo5H3$}2-|E-bGZZnV8;-; delta 43 zcmZ3rlzG)s<_R8h2098EB_##LR{Hw6i6sR&`6W4-NqYH3>H4M{x31op=5h%DVb>8d diff --git a/python/examples_files/figure-html/cell-55-output-1.png b/python/examples_files/figure-html/cell-55-output-1.png index 01ff0b3e1b9727e839046da635555eae65ba0667..300189c18246e6cf6632dd0de30757043615d8d5 100644 GIT binary patch literal 70672 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 rI2ESXCI!Z;e`adEN53v-QPDVWwW;5^+in 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�|VLIi{yLq4P4d`GUrqAmQMdkFexdWW1lvE_v%>xL}{#rMQHI zRrm~yp9w?ct5F5e+Lz@KhK*K4Wj8DFyGs4FrEYF+>7GA}#s16URKwzI26{l|>>%Fn z0=|sCTu3&*KBICkY^6O;YXD_|=QtLP*tpXgewd=OU{bgd!+@n}yHl)BBT^B5gLkAs zOvNXz6|B`!Yak`)Xj zaFegn#cls`-7WGvy&IEh@Wn*m>qg=D;NMhY(&0a!tV^sXLHKBCnM&_S z-vQJ9fdM-5$W6vrHn+BN+Yq*9`?IA%uZBNFC6OBs)mkq;+_2{S%ZJomofQV{N|xo4 zJA9L2kL?(~&if(59%e1_LAsSN3qN9iBGZ#YoV5!%e9yJ!oOP4$#!;+S#uxyP(GHW~ z6-LC7=gYV;G?>cu!;9Al^ztm~IQ#(Xosv4kYYaK2|MDTp9Hv~;^h++qp-R=1FluZx z2MgOwS67u}p~Rv@hC7t=17F@3d1`It*i8P6zL~9~Uu9c9JwNZ$$B%|M+o@QPr2$sy z4$S%y%xaJiWi& z_W!Rkpko&Y`6VvF8qw^Scmdb^vn2TG)Rn$Y--s-q@Gq!bUi-qQ>6KlQ)oT zLi13Onty5rxnL>zb|;Z4s}6+1DJv#RbeEi4Gd7fg6}s2hgtk*w4;ioNP7RqmA)S?f zdVP0J?qHe!cq)+-I5_nHs`gflS|EJsYYp#*Gf<{^1gg+Fr~s6+aYyc-h=+;2ecY%# zW(jKsQ2p0&$+ct;gGPW8d@onkcf<|auKZZqk=Ez;KljqtwuV|HlDU+aEeQ34gRg(~ z9Y~G3!k}-Ruu}qu-O0!>g{v-0&8aqqz7@;+PEwKy2D=csK?qy>*&kSxY)%iX3Z_x2 z3b~Ef@KmADIfjO>hdU%1p%!u+5akol{qr#v-c;@;s-amQ2;0+@&`_Al3@ai%(!YH9 z!ujk9DlAj&AT^ZYb;r94O8VbjwWhLed=87tR--&MoRU|FV36pm~;f%9fBNDeFSVVTzG6QK_@S-Bh_&A($I1d16Jqu|v` z*c>=+^HB5(?-cu`kcKX>DnPmn7Q8_9&d`jmBUts(kC0uTE-+)Ukksw?{8>NU4~a!C zvY>L?!Y^0!;INHxTZ?Z;Y{1ezV}IJ~n^CIW4x`@uo3!XvD>+4^+!z{-2FGkv!L7a6c?vSUW@h`j5h1 zV&j^N@a(!*Qi05IP1r9m<3z_}wd9N5^6#A+vpqH1V}cnhZKPrPVagNr9EGidR@dT|QY*@VseeG&P~At~x|>5!q1`a2!)N7;ri=i`iTeS$W8 zZT^bAx8a%*yqDK5C*LA~@12Jacfl!^L}DG02@KUUF)}jBorM~<_Yh}HvI9ArqxJ){(n{?{qKS}F7p4rN-9M->x9fq(W$m4`sprNzv^#J J+-Ujx{{hCOg#-Wq literal 70691 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 DC$Q+v diff --git a/search.json b/search.json index 481da5e38..eb8cc7071 100644 --- a/search.json +++ b/search.json @@ -277,7 +277,7 @@ "href": "python/examples.html", "title": "Examples", "section": "", - "text": "1 Basic model with static forcing\n\nfrom pathlib import Path\n\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport ribasim\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\n \"node_id\": [1, 1, 3, 3, 6, 6, 9, 9],\n \"area\": [0.01, 1000.0] * 4,\n \"level\": [0.0, 1.0] * 4,\n }\n)\n\n# Convert steady forcing to m/s\n# 2 mm/d precipitation, 1 mm/d evaporation\nseconds_in_day = 24 * 3600\nprecipitation = 0.002 / seconds_in_day\nevaporation = 0.001 / seconds_in_day\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [0],\n \"drainage\": [0.0],\n \"potential_evaporation\": [evaporation],\n \"infiltration\": [0.0],\n \"precipitation\": [precipitation],\n \"urban_runoff\": [0.0],\n }\n)\nstatic = static.iloc[[0, 0, 0, 0]]\nstatic[\"node_id\"] = [1, 3, 6, 9]\n\nbasin = ribasim.Basin(profile=profile, static=static)\n\nSetup linear resistance:\n\nlinear_resistance = ribasim.LinearResistance(\n static=pd.DataFrame(\n data={\"node_id\": [10, 12], \"resistance\": [5e3, (3600.0 * 24) / 100.0]}\n )\n)\n\nSetup Manning resistance:\n\nmanning_resistance = ribasim.ManningResistance(\n static=pd.DataFrame(\n data={\n \"node_id\": [2],\n \"length\": [900.0],\n \"manning_n\": [0.04],\n \"profile_width\": [6.0],\n \"profile_slope\": [3.0],\n }\n )\n)\n\nSet up a rating curve node:\n\n# Discharge: lose 1% of storage volume per day at storage = 1000.0.\nq1000 = 1000.0 * 0.01 / seconds_in_day\n\nrating_curve = ribasim.TabulatedRatingCurve(\n static=pd.DataFrame(\n data={\n \"node_id\": [4, 4],\n \"level\": [0.0, 1.0],\n \"discharge\": [0.0, q1000],\n }\n )\n)\n\nSetup fractional flows:\n\nfractional_flow = ribasim.FractionalFlow(\n static=pd.DataFrame(\n data={\n \"node_id\": [5, 8, 13],\n \"fraction\": [0.3, 0.6, 0.1],\n }\n )\n)\n\nSetup pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": [7],\n \"flow_rate\": [0.5 / 3600],\n }\n )\n)\n\nSetup level boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [11, 17],\n \"level\": [0.5, 1.5],\n }\n )\n)\n\nSetup flow boundary:\n\nflow_boundary = ribasim.FlowBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [15, 16],\n \"flow_rate\": [1e-4, 1e-4],\n }\n )\n)\n\nSetup terminal:\n\nterminal = ribasim.Terminal(\n static=pd.DataFrame(\n data={\n \"node_id\": [14],\n }\n )\n)\n\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: Basin,\n (1.0, 0.0), # 2: ManningResistance\n (2.0, 0.0), # 3: Basin\n (3.0, 0.0), # 4: TabulatedRatingCurve\n (3.0, 1.0), # 5: FractionalFlow\n (3.0, 2.0), # 6: Basin\n (4.0, 1.0), # 7: Pump\n (4.0, 0.0), # 8: FractionalFlow\n (5.0, 0.0), # 9: Basin\n (6.0, 0.0), # 10: LinearResistance\n (2.0, 2.0), # 11: LevelBoundary\n (2.0, 1.0), # 12: LinearResistance\n (3.0, -1.0), # 13: FractionalFlow\n (3.0, -2.0), # 14: Terminal\n (3.0, 3.0), # 15: FlowBoundary\n (0.0, 1.0), # 16: FlowBoundary\n (6.0, 1.0), # 17: LevelBoundary\n ]\n)\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_id, node_type = ribasim.Node.get_node_ids_and_types(\n basin,\n manning_resistance,\n rating_curve,\n pump,\n fractional_flow,\n linear_resistance,\n level_boundary,\n flow_boundary,\n terminal,\n)\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(node_id, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array(\n [1, 2, 3, 4, 4, 5, 6, 8, 7, 9, 11, 12, 4, 13, 15, 16, 10], dtype=np.int64\n)\nto_id = np.array(\n [2, 3, 4, 5, 8, 6, 7, 9, 9, 10, 12, 3, 13, 14, 6, 1, 17], dtype=np.int64\n)\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\n \"from_node_id\": from_id,\n \"to_node_id\": to_id,\n \"edge_type\": len(from_id) * [\"flow\"],\n },\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n level_boundary=level_boundary,\n flow_boundary=flow_boundary,\n pump=pump,\n linear_resistance=linear_resistance,\n manning_resistance=manning_resistance,\n tabulated_rating_curve=rating_curve,\n fractional_flow=fractional_flow,\n terminal=terminal,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2021-01-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nWrite the model to a TOML and GeoPackage:\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"basic\")\n\n\n\n2 Update the basic model with transient forcing\nThis assumes you have already created the basic model with static forcing.\n\nimport numpy as np\nimport pandas as pd\nimport ribasim\nimport xarray as xr\n\n\nmodel = ribasim.Model.from_toml(datadir / \"basic/ribasim.toml\")\n\n\ntime = pd.date_range(model.starttime, model.endtime)\nday_of_year = time.day_of_year.to_numpy()\nseconds_per_day = 24 * 60 * 60\nevaporation = (\n (-1.0 * np.cos(day_of_year / 365.0 * 2 * np.pi) + 1.0) * 0.0025 / seconds_per_day\n)\nrng = np.random.default_rng(seed=0)\nprecipitation = (\n rng.lognormal(mean=-1.0, sigma=1.7, size=time.size) * 0.001 / seconds_per_day\n)\n\nWe’ll use xarray to easily broadcast the values.\n\ntimeseries = (\n pd.DataFrame(\n data={\n \"node_id\": 1,\n \"time\": time,\n \"drainage\": 0.0,\n \"potential_evaporation\": evaporation,\n \"infiltration\": 0.0,\n \"precipitation\": precipitation,\n \"urban_runoff\": 0.0,\n }\n )\n .set_index(\"time\")\n .to_xarray()\n)\n\nbasin_ids = model.basin.static[\"node_id\"].to_numpy()\nbasin_nodes = xr.DataArray(\n np.ones(len(basin_ids)), coords={\"node_id\": basin_ids}, dims=[\"node_id\"]\n)\nforcing = (timeseries * basin_nodes).to_dataframe().reset_index()\n\n\nstate = pd.DataFrame(\n data={\n \"node_id\": basin_ids,\n \"level\": 1.4,\n \"concentration\": 0.0,\n }\n)\n\n\nmodel.basin.time = forcing\nmodel.basin.state = state\n\n\nmodel.write(datadir / \"basic_transient\")\n\nNow run the model with ribasim basic-transient/ribasim.toml. After running the model, read back the results:\n\ndf_basin = pd.read_feather(datadir / \"basic_transient/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\ndf_basin_wide[\"level\"].plot()\n\n<Axes: xlabel='time'>\n\n\n\n\n\n\ndf_flow = pd.read_feather(datadir / \"basic_transient/results/flow.arrow\")\ndf_flow[\"edge\"] = list(zip(df_flow.from_node_id, df_flow.to_node_id))\ndf_flow[\"flow_m3d\"] = df_flow.flow * 86400\nax = df_flow.pivot_table(index=\"time\", columns=\"edge\", values=\"flow_m3d\").plot()\nax.legend(bbox_to_anchor=(1.3, 1), title=\"Edge\")\n\n<matplotlib.legend.Legend at 0x7f140e6540b0>\n\n\n\n\n\n\ntype(df_flow)\n\npandas.core.frame.DataFrame\n\n\n\n\n3 Model with discrete control\nThe model constructed below consists of a single basin which slowly drains trough a TabulatedRatingCurve, but is held within a range around a target level (setpoint) by two connected pumps. These two pumps behave like a reversible pump. When pumping can be done in only one direction, and the other direction is only possible under gravity, use an Outlet for that direction.\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: Basin\n (1.0, 1.0), # 2: Pump\n (1.0, -1.0), # 3: Pump\n (2.0, 0.0), # 4: LevelBoundary\n (-1.0, 0.0), # 5: TabulatedRatingCurve\n (-2.0, 0.0), # 6: Terminal\n (1.0, 0.0), # 7: DiscreteControl\n ]\n)\n\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_type = [\n \"Basin\",\n \"Pump\",\n \"Pump\",\n \"LevelBoundary\",\n \"TabulatedRatingCurve\",\n \"Terminal\",\n \"DiscreteControl\",\n]\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array([1, 3, 4, 2, 1, 5, 7, 7], dtype=np.int64)\nto_id = np.array([3, 4, 2, 1, 5, 6, 2, 3], dtype=np.int64)\n\nedge_type = 6 * [\"flow\"] + 2 * [\"control\"]\n\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\"from_node_id\": from_id, \"to_node_id\": to_id, \"edge_type\": edge_type},\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\n \"node_id\": [1, 1],\n \"area\": [1000.0, 1000.0],\n \"level\": [0.0, 1.0],\n }\n)\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [1],\n \"drainage\": [0.0],\n \"potential_evaporation\": [0.0],\n \"infiltration\": [0.0],\n \"precipitation\": [0.0],\n \"urban_runoff\": [0.0],\n }\n)\n\nstate = pd.DataFrame(data={\"node_id\": [1], \"level\": [20.0]})\n\nbasin = ribasim.Basin(profile=profile, static=static, state=state)\n\nSetup the discrete control:\n\ncondition = pd.DataFrame(\n data={\n \"node_id\": 3 * [7],\n \"listen_feature_id\": 3 * [1],\n \"variable\": 3 * [\"level\"],\n \"greater_than\": [5.0, 10.0, 15.0], # min, setpoint, max\n }\n)\n\nlogic = pd.DataFrame(\n data={\n \"node_id\": 5 * [7],\n \"truth_state\": [\"FFF\", \"U**\", \"T*F\", \"**D\", \"TTT\"],\n \"control_state\": [\"in\", \"in\", \"none\", \"out\", \"out\"],\n }\n)\n\ndiscrete_control = ribasim.DiscreteControl(condition=condition, logic=logic)\n\nThe above control logic can be summarized as follows: - If the level gets above the maximum, activate the control state “out” until the setpoint is reached; - If the level gets below the minimum, active the control state “in” until the setpoint is reached; - Otherwise activate the control state “none”.\nSetup the pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": 3 * [2] + 3 * [3],\n \"control_state\": 2 * [\"none\", \"in\", \"out\"],\n \"flow_rate\": [0.0, 2e-3, 0.0, 0.0, 0.0, 2e-3],\n }\n )\n)\n\nThe pump data defines the following:\n\n\n\nControl state\nPump #2 flow rate (m/s)\nPump #3 flow rate (m/s)\n\n\n\n\n“none”\n0.0\n0.0\n\n\n“in”\n2e-3\n0.0\n\n\n“out”\n0.0\n2e-3\n\n\n\nSetup the level boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(data={\"node_id\": [4], \"level\": [10.0]})\n)\n\nSetup the rating curve:\n\nrating_curve = ribasim.TabulatedRatingCurve(\n static=pd.DataFrame(\n data={\"node_id\": 2 * [5], \"level\": [2.0, 15.0], \"discharge\": [0.0, 1e-3]}\n )\n)\n\nSetup the terminal:\n\nterminal = ribasim.Terminal(static=pd.DataFrame(data={\"node_id\": [6]}))\n\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n pump=pump,\n level_boundary=level_boundary,\n tabulated_rating_curve=rating_curve,\n terminal=terminal,\n discrete_control=discrete_control,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2021-01-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nListen edges are plotted with a dashed line since they are not present in the “Edge / static” schema but only in the “Control / condition” schema.\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"level_setpoint_with_minmax\")\n\nNow run the model with level_setpoint_with_minmax/ribasim.toml. After running the model, read back the results:\n\nfrom matplotlib.dates import date2num\n\ndf_basin = pd.read_feather(datadir / \"level_setpoint_with_minmax/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\n\nax = df_basin_wide[\"level\"].plot()\n\ngreater_than = model.discrete_control.condition.greater_than\n\nax.hlines(\n greater_than,\n df_basin.time[0],\n df_basin.time.max(),\n lw=1,\n ls=\"--\",\n color=\"k\",\n)\n\ndf_control = pd.read_feather(\n datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n)\n\ny_min, y_max = ax.get_ybound()\nax.fill_between(df_control.time[:2], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\nax.fill_between(df_control.time[2:4], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\n\nax.set_xticks(\n date2num(df_control.time).tolist(),\n df_control.control_state.tolist(),\n rotation=50,\n)\n\nax.set_yticks(greater_than, [\"min\", \"setpoint\", \"max\"])\nax.set_ylabel(\"level\")\nplt.show()\n\n\n\n\nThe highlighted regions show where a pump is active.\nLet’s print an overview of what happened with control:\n\nmodel.print_discrete_control_record(\n datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n)\n\n0. At 2020-01-01 00:00:00 the control node with ID 7 reached truth state TTT:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level > 10.0\n For node ID 1 (Basin): level > 15.0\n\n This yielded control state \"out\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.002\n\n1. At 2020-02-09 01:17:29.324000 the control node with ID 7 reached truth state TFF:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level < 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"none\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.0\n\n2. At 2020-07-05 13:24:51.165000 the control node with ID 7 reached truth state FFF:\n For node ID 1 (Basin): level < 5.0\n For node ID 1 (Basin): level < 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"in\":\n For node ID 2 (Pump): flow_rate = 0.002\n For node ID 3 (Pump): flow_rate = 0.0\n\n3. At 2020-08-11 11:49:59.015000 the control node with ID 7 reached truth state TTF:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level > 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"none\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.0\n\n\n\nNote that crossing direction specific truth states (containing “U”, “D”) are not present in this overview even though they are part of the control logic. This is because in the control logic for this model these truth states are only used to sustain control states, while the overview only shows changes in control states.\n\n\n4 Model with PID control\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: FlowBoundary\n (1.0, 0.0), # 2: Basin\n (2.0, 0.5), # 3: Pump\n (3.0, 0.0), # 4: LevelBoundary\n (1.5, 1.0), # 5: PidControl\n (2.0, -0.5), # 6: outlet\n (1.5, -1.0), # 7: PidControl\n ]\n)\n\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_type = [\n \"FlowBoundary\",\n \"Basin\",\n \"Pump\",\n \"LevelBoundary\",\n \"PidControl\",\n \"Outlet\",\n \"PidControl\",\n]\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array([1, 2, 3, 4, 6, 5, 7], dtype=np.int64)\nto_id = np.array([2, 3, 4, 6, 2, 3, 6], dtype=np.int64)\n\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\n \"from_node_id\": from_id,\n \"to_node_id\": to_id,\n \"edge_type\": 5 * [\"flow\"] + 2 * [\"control\"],\n },\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\"node_id\": [2, 2], \"level\": [0.0, 1.0], \"area\": [1000.0, 1000.0]}\n)\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [2],\n \"drainage\": [0.0],\n \"potential_evaporation\": [0.0],\n \"infiltration\": [0.0],\n \"precipitation\": [0.0],\n \"urban_runoff\": [0.0],\n }\n)\n\nstate = pd.DataFrame(\n data={\n \"node_id\": [2],\n \"level\": [6.0],\n }\n)\n\nbasin = ribasim.Basin(profile=profile, static=static, state=state)\n\nSetup the pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": [3],\n \"flow_rate\": [0.0], # Will be overwritten by PID controller\n }\n )\n)\n\nSetup the outlet:\n\noutlet = ribasim.Outlet(\n static=pd.DataFrame(\n data={\n \"node_id\": [6],\n \"flow_rate\": [0.0], # Will be overwritten by PID controller\n }\n )\n)\n\nSetup flow boundary:\n\nflow_boundary = ribasim.FlowBoundary(\n static=pd.DataFrame(data={\"node_id\": [1], \"flow_rate\": [1e-3]})\n)\n\nSetup flow boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [4],\n \"level\": [1.0], # Not relevant\n }\n )\n)\n\nSetup PID control:\n\npid_control = ribasim.PidControl(\n time=pd.DataFrame(\n data={\n \"node_id\": 4 * [5, 7],\n \"time\": [\n \"2020-01-01 00:00:00\",\n \"2020-01-01 00:00:00\",\n \"2020-05-01 00:00:00\",\n \"2020-05-01 00:00:00\",\n \"2020-07-01 00:00:00\",\n \"2020-07-01 00:00:00\",\n \"2020-12-01 00:00:00\",\n \"2020-12-01 00:00:00\",\n ],\n \"listen_node_id\": 4 * [2, 2],\n \"target\": [5.0, 5.0, 5.0, 5.0, 7.5, 7.5, 7.5, 7.5],\n \"proportional\": 4 * [-1e-3, 1e-3],\n \"integral\": 4 * [-1e-7, 1e-7],\n \"derivative\": 4 * [0.0, 0.0],\n }\n )\n)\n\nNote that the coefficients for the pump and the outlet are equal in magnitude but opposite in sign. This way the pump and the outlet equally work towards the same goal, while having opposite effects on the controlled basin due to their connectivity to this basin.\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n flow_boundary=flow_boundary,\n level_boundary=level_boundary,\n pump=pump,\n outlet=outlet,\n pid_control=pid_control,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2020-12-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nWrite the model to a TOML and GeoPackage:\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"pid_control\")\n\nNow run the model with ribasim pid_control/ribasim.toml. After running the model, read back the results:\n\nfrom matplotlib.dates import date2num\n\ndf_basin = pd.read_feather(datadir / \"pid_control/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\nax = df_basin_wide[\"level\"].plot()\nax.set_ylabel(\"level [m]\")\n\n# Plot target level\ntarget_levels = model.pid_control.time.target.to_numpy()[::2]\ntimes = date2num(model.pid_control.time.time)[::2]\nax.plot(times, target_levels, color=\"k\", ls=\":\", label=\"target level\")\npass" + "text": "1 Basic model with static forcing\n\nfrom pathlib import Path\n\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport ribasim\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\n \"node_id\": [1, 1, 3, 3, 6, 6, 9, 9],\n \"area\": [0.01, 1000.0] * 4,\n \"level\": [0.0, 1.0] * 4,\n }\n)\n\n# Convert steady forcing to m/s\n# 2 mm/d precipitation, 1 mm/d evaporation\nseconds_in_day = 24 * 3600\nprecipitation = 0.002 / seconds_in_day\nevaporation = 0.001 / seconds_in_day\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [0],\n \"drainage\": [0.0],\n \"potential_evaporation\": [evaporation],\n \"infiltration\": [0.0],\n \"precipitation\": [precipitation],\n \"urban_runoff\": [0.0],\n }\n)\nstatic = static.iloc[[0, 0, 0, 0]]\nstatic[\"node_id\"] = [1, 3, 6, 9]\n\nbasin = ribasim.Basin(profile=profile, static=static)\n\nSetup linear resistance:\n\nlinear_resistance = ribasim.LinearResistance(\n static=pd.DataFrame(\n data={\"node_id\": [10, 12], \"resistance\": [5e3, (3600.0 * 24) / 100.0]}\n )\n)\n\nSetup Manning resistance:\n\nmanning_resistance = ribasim.ManningResistance(\n static=pd.DataFrame(\n data={\n \"node_id\": [2],\n \"length\": [900.0],\n \"manning_n\": [0.04],\n \"profile_width\": [6.0],\n \"profile_slope\": [3.0],\n }\n )\n)\n\nSet up a rating curve node:\n\n# Discharge: lose 1% of storage volume per day at storage = 1000.0.\nq1000 = 1000.0 * 0.01 / seconds_in_day\n\nrating_curve = ribasim.TabulatedRatingCurve(\n static=pd.DataFrame(\n data={\n \"node_id\": [4, 4],\n \"level\": [0.0, 1.0],\n \"discharge\": [0.0, q1000],\n }\n )\n)\n\nSetup fractional flows:\n\nfractional_flow = ribasim.FractionalFlow(\n static=pd.DataFrame(\n data={\n \"node_id\": [5, 8, 13],\n \"fraction\": [0.3, 0.6, 0.1],\n }\n )\n)\n\nSetup pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": [7],\n \"flow_rate\": [0.5 / 3600],\n }\n )\n)\n\nSetup level boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [11, 17],\n \"level\": [0.5, 1.5],\n }\n )\n)\n\nSetup flow boundary:\n\nflow_boundary = ribasim.FlowBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [15, 16],\n \"flow_rate\": [1e-4, 1e-4],\n }\n )\n)\n\nSetup terminal:\n\nterminal = ribasim.Terminal(\n static=pd.DataFrame(\n data={\n \"node_id\": [14],\n }\n )\n)\n\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: Basin,\n (1.0, 0.0), # 2: ManningResistance\n (2.0, 0.0), # 3: Basin\n (3.0, 0.0), # 4: TabulatedRatingCurve\n (3.0, 1.0), # 5: FractionalFlow\n (3.0, 2.0), # 6: Basin\n (4.0, 1.0), # 7: Pump\n (4.0, 0.0), # 8: FractionalFlow\n (5.0, 0.0), # 9: Basin\n (6.0, 0.0), # 10: LinearResistance\n (2.0, 2.0), # 11: LevelBoundary\n (2.0, 1.0), # 12: LinearResistance\n (3.0, -1.0), # 13: FractionalFlow\n (3.0, -2.0), # 14: Terminal\n (3.0, 3.0), # 15: FlowBoundary\n (0.0, 1.0), # 16: FlowBoundary\n (6.0, 1.0), # 17: LevelBoundary\n ]\n)\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_id, node_type = ribasim.Node.get_node_ids_and_types(\n basin,\n manning_resistance,\n rating_curve,\n pump,\n fractional_flow,\n linear_resistance,\n level_boundary,\n flow_boundary,\n terminal,\n)\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(node_id, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array(\n [1, 2, 3, 4, 4, 5, 6, 8, 7, 9, 11, 12, 4, 13, 15, 16, 10], dtype=np.int64\n)\nto_id = np.array(\n [2, 3, 4, 5, 8, 6, 7, 9, 9, 10, 12, 3, 13, 14, 6, 1, 17], dtype=np.int64\n)\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\n \"from_node_id\": from_id,\n \"to_node_id\": to_id,\n \"edge_type\": len(from_id) * [\"flow\"],\n },\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n level_boundary=level_boundary,\n flow_boundary=flow_boundary,\n pump=pump,\n linear_resistance=linear_resistance,\n manning_resistance=manning_resistance,\n tabulated_rating_curve=rating_curve,\n fractional_flow=fractional_flow,\n terminal=terminal,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2021-01-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nWrite the model to a TOML and GeoPackage:\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"basic\")\n\n\n\n2 Update the basic model with transient forcing\nThis assumes you have already created the basic model with static forcing.\n\nimport numpy as np\nimport pandas as pd\nimport ribasim\nimport xarray as xr\n\n\nmodel = ribasim.Model.from_toml(datadir / \"basic/ribasim.toml\")\n\n\ntime = pd.date_range(model.starttime, model.endtime)\nday_of_year = time.day_of_year.to_numpy()\nseconds_per_day = 24 * 60 * 60\nevaporation = (\n (-1.0 * np.cos(day_of_year / 365.0 * 2 * np.pi) + 1.0) * 0.0025 / seconds_per_day\n)\nrng = np.random.default_rng(seed=0)\nprecipitation = (\n rng.lognormal(mean=-1.0, sigma=1.7, size=time.size) * 0.001 / seconds_per_day\n)\n\nWe’ll use xarray to easily broadcast the values.\n\ntimeseries = (\n pd.DataFrame(\n data={\n \"node_id\": 1,\n \"time\": time,\n \"drainage\": 0.0,\n \"potential_evaporation\": evaporation,\n \"infiltration\": 0.0,\n \"precipitation\": precipitation,\n \"urban_runoff\": 0.0,\n }\n )\n .set_index(\"time\")\n .to_xarray()\n)\n\nbasin_ids = model.basin.static[\"node_id\"].to_numpy()\nbasin_nodes = xr.DataArray(\n np.ones(len(basin_ids)), coords={\"node_id\": basin_ids}, dims=[\"node_id\"]\n)\nforcing = (timeseries * basin_nodes).to_dataframe().reset_index()\n\n\nstate = pd.DataFrame(\n data={\n \"node_id\": basin_ids,\n \"level\": 1.4,\n \"concentration\": 0.0,\n }\n)\n\n\nmodel.basin.time = forcing\nmodel.basin.state = state\n\n\nmodel.write(datadir / \"basic_transient\")\n\nNow run the model with ribasim basic-transient/ribasim.toml. After running the model, read back the results:\n\ndf_basin = pd.read_feather(datadir / \"basic_transient/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\ndf_basin_wide[\"level\"].plot()\n\n<Axes: xlabel='time'>\n\n\n\n\n\n\ndf_flow = pd.read_feather(datadir / \"basic_transient/results/flow.arrow\")\ndf_flow[\"edge\"] = list(zip(df_flow.from_node_id, df_flow.to_node_id))\ndf_flow[\"flow_m3d\"] = df_flow.flow * 86400\nax = df_flow.pivot_table(index=\"time\", columns=\"edge\", values=\"flow_m3d\").plot()\nax.legend(bbox_to_anchor=(1.3, 1), title=\"Edge\")\n\n<matplotlib.legend.Legend at 0x7fe3e9708b30>\n\n\n\n\n\n\ntype(df_flow)\n\npandas.core.frame.DataFrame\n\n\n\n\n3 Model with discrete control\nThe model constructed below consists of a single basin which slowly drains trough a TabulatedRatingCurve, but is held within a range around a target level (setpoint) by two connected pumps. These two pumps behave like a reversible pump. When pumping can be done in only one direction, and the other direction is only possible under gravity, use an Outlet for that direction.\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: Basin\n (1.0, 1.0), # 2: Pump\n (1.0, -1.0), # 3: Pump\n (2.0, 0.0), # 4: LevelBoundary\n (-1.0, 0.0), # 5: TabulatedRatingCurve\n (-2.0, 0.0), # 6: Terminal\n (1.0, 0.0), # 7: DiscreteControl\n ]\n)\n\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_type = [\n \"Basin\",\n \"Pump\",\n \"Pump\",\n \"LevelBoundary\",\n \"TabulatedRatingCurve\",\n \"Terminal\",\n \"DiscreteControl\",\n]\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array([1, 3, 4, 2, 1, 5, 7, 7], dtype=np.int64)\nto_id = np.array([3, 4, 2, 1, 5, 6, 2, 3], dtype=np.int64)\n\nedge_type = 6 * [\"flow\"] + 2 * [\"control\"]\n\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\"from_node_id\": from_id, \"to_node_id\": to_id, \"edge_type\": edge_type},\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\n \"node_id\": [1, 1],\n \"area\": [1000.0, 1000.0],\n \"level\": [0.0, 1.0],\n }\n)\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [1],\n \"drainage\": [0.0],\n \"potential_evaporation\": [0.0],\n \"infiltration\": [0.0],\n \"precipitation\": [0.0],\n \"urban_runoff\": [0.0],\n }\n)\n\nstate = pd.DataFrame(data={\"node_id\": [1], \"level\": [20.0]})\n\nbasin = ribasim.Basin(profile=profile, static=static, state=state)\n\nSetup the discrete control:\n\ncondition = pd.DataFrame(\n data={\n \"node_id\": 3 * [7],\n \"listen_feature_id\": 3 * [1],\n \"variable\": 3 * [\"level\"],\n \"greater_than\": [5.0, 10.0, 15.0], # min, setpoint, max\n }\n)\n\nlogic = pd.DataFrame(\n data={\n \"node_id\": 5 * [7],\n \"truth_state\": [\"FFF\", \"U**\", \"T*F\", \"**D\", \"TTT\"],\n \"control_state\": [\"in\", \"in\", \"none\", \"out\", \"out\"],\n }\n)\n\ndiscrete_control = ribasim.DiscreteControl(condition=condition, logic=logic)\n\nThe above control logic can be summarized as follows: - If the level gets above the maximum, activate the control state “out” until the setpoint is reached; - If the level gets below the minimum, active the control state “in” until the setpoint is reached; - Otherwise activate the control state “none”.\nSetup the pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": 3 * [2] + 3 * [3],\n \"control_state\": 2 * [\"none\", \"in\", \"out\"],\n \"flow_rate\": [0.0, 2e-3, 0.0, 0.0, 0.0, 2e-3],\n }\n )\n)\n\nThe pump data defines the following:\n\n\n\nControl state\nPump #2 flow rate (m/s)\nPump #3 flow rate (m/s)\n\n\n\n\n“none”\n0.0\n0.0\n\n\n“in”\n2e-3\n0.0\n\n\n“out”\n0.0\n2e-3\n\n\n\nSetup the level boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(data={\"node_id\": [4], \"level\": [10.0]})\n)\n\nSetup the rating curve:\n\nrating_curve = ribasim.TabulatedRatingCurve(\n static=pd.DataFrame(\n data={\"node_id\": 2 * [5], \"level\": [2.0, 15.0], \"discharge\": [0.0, 1e-3]}\n )\n)\n\nSetup the terminal:\n\nterminal = ribasim.Terminal(static=pd.DataFrame(data={\"node_id\": [6]}))\n\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n pump=pump,\n level_boundary=level_boundary,\n tabulated_rating_curve=rating_curve,\n terminal=terminal,\n discrete_control=discrete_control,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2021-01-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nListen edges are plotted with a dashed line since they are not present in the “Edge / static” schema but only in the “Control / condition” schema.\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"level_setpoint_with_minmax\")\n\nNow run the model with level_setpoint_with_minmax/ribasim.toml. After running the model, read back the results:\n\nfrom matplotlib.dates import date2num\n\ndf_basin = pd.read_feather(datadir / \"level_setpoint_with_minmax/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\n\nax = df_basin_wide[\"level\"].plot()\n\ngreater_than = model.discrete_control.condition.greater_than\n\nax.hlines(\n greater_than,\n df_basin.time[0],\n df_basin.time.max(),\n lw=1,\n ls=\"--\",\n color=\"k\",\n)\n\ndf_control = pd.read_feather(\n datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n)\n\ny_min, y_max = ax.get_ybound()\nax.fill_between(df_control.time[:2], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\nax.fill_between(df_control.time[2:4], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\n\nax.set_xticks(\n date2num(df_control.time).tolist(),\n df_control.control_state.tolist(),\n rotation=50,\n)\n\nax.set_yticks(greater_than, [\"min\", \"setpoint\", \"max\"])\nax.set_ylabel(\"level\")\nplt.show()\n\n\n\n\nThe highlighted regions show where a pump is active.\nLet’s print an overview of what happened with control:\n\nmodel.print_discrete_control_record(\n datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n)\n\n0. At 2020-01-01 00:00:00 the control node with ID 7 reached truth state TTT:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level > 10.0\n For node ID 1 (Basin): level > 15.0\n\n This yielded control state \"out\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.002\n\n1. At 2020-02-09 01:17:29.324000 the control node with ID 7 reached truth state TFF:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level < 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"none\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.0\n\n2. At 2020-07-05 13:24:51.165000 the control node with ID 7 reached truth state FFF:\n For node ID 1 (Basin): level < 5.0\n For node ID 1 (Basin): level < 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"in\":\n For node ID 2 (Pump): flow_rate = 0.002\n For node ID 3 (Pump): flow_rate = 0.0\n\n3. At 2020-08-11 11:49:59.015000 the control node with ID 7 reached truth state TTF:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level > 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"none\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.0\n\n\n\nNote that crossing direction specific truth states (containing “U”, “D”) are not present in this overview even though they are part of the control logic. This is because in the control logic for this model these truth states are only used to sustain control states, while the overview only shows changes in control states.\n\n\n4 Model with PID control\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: FlowBoundary\n (1.0, 0.0), # 2: Basin\n (2.0, 0.5), # 3: Pump\n (3.0, 0.0), # 4: LevelBoundary\n (1.5, 1.0), # 5: PidControl\n (2.0, -0.5), # 6: outlet\n (1.5, -1.0), # 7: PidControl\n ]\n)\n\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_type = [\n \"FlowBoundary\",\n \"Basin\",\n \"Pump\",\n \"LevelBoundary\",\n \"PidControl\",\n \"Outlet\",\n \"PidControl\",\n]\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array([1, 2, 3, 4, 6, 5, 7], dtype=np.int64)\nto_id = np.array([2, 3, 4, 6, 2, 3, 6], dtype=np.int64)\n\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\n \"from_node_id\": from_id,\n \"to_node_id\": to_id,\n \"edge_type\": 5 * [\"flow\"] + 2 * [\"control\"],\n },\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\"node_id\": [2, 2], \"level\": [0.0, 1.0], \"area\": [1000.0, 1000.0]}\n)\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [2],\n \"drainage\": [0.0],\n \"potential_evaporation\": [0.0],\n \"infiltration\": [0.0],\n \"precipitation\": [0.0],\n \"urban_runoff\": [0.0],\n }\n)\n\nstate = pd.DataFrame(\n data={\n \"node_id\": [2],\n \"level\": [6.0],\n }\n)\n\nbasin = ribasim.Basin(profile=profile, static=static, state=state)\n\nSetup the pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": [3],\n \"flow_rate\": [0.0], # Will be overwritten by PID controller\n }\n )\n)\n\nSetup the outlet:\n\noutlet = ribasim.Outlet(\n static=pd.DataFrame(\n data={\n \"node_id\": [6],\n \"flow_rate\": [0.0], # Will be overwritten by PID controller\n }\n )\n)\n\nSetup flow boundary:\n\nflow_boundary = ribasim.FlowBoundary(\n static=pd.DataFrame(data={\"node_id\": [1], \"flow_rate\": [1e-3]})\n)\n\nSetup flow boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [4],\n \"level\": [1.0], # Not relevant\n }\n )\n)\n\nSetup PID control:\n\npid_control = ribasim.PidControl(\n time=pd.DataFrame(\n data={\n \"node_id\": 4 * [5, 7],\n \"time\": [\n \"2020-01-01 00:00:00\",\n \"2020-01-01 00:00:00\",\n \"2020-05-01 00:00:00\",\n \"2020-05-01 00:00:00\",\n \"2020-07-01 00:00:00\",\n \"2020-07-01 00:00:00\",\n \"2020-12-01 00:00:00\",\n \"2020-12-01 00:00:00\",\n ],\n \"listen_node_id\": 4 * [2, 2],\n \"target\": [5.0, 5.0, 5.0, 5.0, 7.5, 7.5, 7.5, 7.5],\n \"proportional\": 4 * [-1e-3, 1e-3],\n \"integral\": 4 * [-1e-7, 1e-7],\n \"derivative\": 4 * [0.0, 0.0],\n }\n )\n)\n\nNote that the coefficients for the pump and the outlet are equal in magnitude but opposite in sign. This way the pump and the outlet equally work towards the same goal, while having opposite effects on the controlled basin due to their connectivity to this basin.\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n flow_boundary=flow_boundary,\n level_boundary=level_boundary,\n pump=pump,\n outlet=outlet,\n pid_control=pid_control,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2020-12-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nWrite the model to a TOML and GeoPackage:\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"pid_control\")\n\nNow run the model with ribasim pid_control/ribasim.toml. After running the model, read back the results:\n\nfrom matplotlib.dates import date2num\n\ndf_basin = pd.read_feather(datadir / \"pid_control/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\nax = df_basin_wide[\"level\"].plot()\nax.set_ylabel(\"level [m]\")\n\n# Plot target level\ntarget_levels = model.pid_control.time.target.to_numpy()[::2]\ntimes = date2num(model.pid_control.time.time)[::2]\nax.plot(times, target_levels, color=\"k\", ls=\":\", label=\"target level\")\npass" }, { "objectID": "python/reference/utils.connectivity_from_geometry.html", @@ -830,7 +830,7 @@ "href": "core/equations.html#sec-reduction_factor", "title": "Equations", "section": "2.1 The reduction factor", - "text": "2.1 The reduction factor\nAt several points in the equations below a reduction factor is used. This is a term that makes certain transitions more smooth, for instance when a pump stops providing water when its source basin dries up. The reduction factor is given by\n\\[\\begin{align}\n \\phi(x; p) =\n \\begin{cases}\n 0 &\\text{if}\\quad x < 0 \\\\\n -2 \\left(\\frac{x}{p}\\right)^3 + 3\\left(\\frac{x}{p}\\right)^2 &\\text{if}\\quad 0 \\le x \\le p \\\\\n 1 &\\text{if}\\quad x > p\n \\end{cases}\n\\end{align}\\]\nHere \\(p > 0\\) is the threshold value which determines the interval \\([0,p]\\) of the smooth transition between \\(0\\) and \\(1\\), see the plot below.\n\n\nCode\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ndef f(x, p = 3):\n x_scaled = x / p\n phi = (-2 * x_scaled + 3) * x_scaled**2\n phi = np.where(x < 0, 0, phi)\n phi = np.where(x > p, 1, phi)\n\n return phi\n\nfontsize = 15\np = 3\nN = 100\nx_min = -1\nx_max = 4\nx = np.linspace(x_min,x_max,N)\nphi = f(x,p)\n\nfig,ax = plt.subplots(dpi=80)\nax.plot(x,phi)\n\ny_lim = ax.get_ylim()\n\nax.set_xticks([0,p], [0,\"$p$\"], fontsize=fontsize)\nax.set_yticks([0,1], [0,1], fontsize=fontsize)\nax.hlines([0,1],x_min,x_max, color = \"k\", ls = \":\", zorder=-1)\nax.vlines([0,p], *y_lim, color = \"k\", ls = \":\")\nax.set_xlim(x_min,x_max)\nax.set_xlabel(\"$x$\", fontsize=fontsize)\nax.set_ylabel(\"$\\phi(x;p)$\", fontsize=fontsize)\nax.set_ylim(y_lim)\n\nfig.tight_layout()\nplt.show()\n\n\n<>:31: SyntaxWarning: invalid escape sequence '\\p'\n<>:31: SyntaxWarning: invalid escape sequence '\\p'\n/tmp/ipykernel_4998/665069857.py:31: SyntaxWarning: invalid escape sequence '\\p'\n ax.set_ylabel(\"$\\phi(x;p)$\", fontsize=fontsize)" + "text": "2.1 The reduction factor\nAt several points in the equations below a reduction factor is used. This is a term that makes certain transitions more smooth, for instance when a pump stops providing water when its source basin dries up. The reduction factor is given by\n\\[\\begin{align}\n \\phi(x; p) =\n \\begin{cases}\n 0 &\\text{if}\\quad x < 0 \\\\\n -2 \\left(\\frac{x}{p}\\right)^3 + 3\\left(\\frac{x}{p}\\right)^2 &\\text{if}\\quad 0 \\le x \\le p \\\\\n 1 &\\text{if}\\quad x > p\n \\end{cases}\n\\end{align}\\]\nHere \\(p > 0\\) is the threshold value which determines the interval \\([0,p]\\) of the smooth transition between \\(0\\) and \\(1\\), see the plot below.\n\n\nCode\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ndef f(x, p = 3):\n x_scaled = x / p\n phi = (-2 * x_scaled + 3) * x_scaled**2\n phi = np.where(x < 0, 0, phi)\n phi = np.where(x > p, 1, phi)\n\n return phi\n\nfontsize = 15\np = 3\nN = 100\nx_min = -1\nx_max = 4\nx = np.linspace(x_min,x_max,N)\nphi = f(x,p)\n\nfig,ax = plt.subplots(dpi=80)\nax.plot(x,phi)\n\ny_lim = ax.get_ylim()\n\nax.set_xticks([0,p], [0,\"$p$\"], fontsize=fontsize)\nax.set_yticks([0,1], [0,1], fontsize=fontsize)\nax.hlines([0,1],x_min,x_max, color = \"k\", ls = \":\", zorder=-1)\nax.vlines([0,p], *y_lim, color = \"k\", ls = \":\")\nax.set_xlim(x_min,x_max)\nax.set_xlabel(\"$x$\", fontsize=fontsize)\nax.set_ylabel(\"$\\phi(x;p)$\", fontsize=fontsize)\nax.set_ylim(y_lim)\n\nfig.tight_layout()\nplt.show()\n\n\n<>:31: SyntaxWarning: invalid escape sequence '\\p'\n<>:31: SyntaxWarning: invalid escape sequence '\\p'\n/tmp/ipykernel_5010/665069857.py:31: SyntaxWarning: invalid escape sequence '\\p'\n ax.set_ylabel(\"$\\phi(x;p)$\", fontsize=fontsize)" }, { "objectID": "core/equations.html#precipitation",