Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The model definition for the reservoir can be configured in a model file that follows the Integrated Reservoir Model schema. The model options are described below.

Schema


An For reference, an example Integrated Reservoir Model file is attached.

...

general

In the general section of the reservoir model, a missingValue element needs to be configured. It is important to match the missingValue as defined in the Delft-FEWS General Adapter configuration for the model run.

...

The Level Pool method is a well known method for reservoir routing. in FEWS the method described in Applied Hydrology from V.T.Chow (1988) is used. The level pool routing method is also referred to as Storage routing, the Storage-Indication method, or the Modified Puls method. Level Pool routing is a procedure for calculating the outflow hydrograph form a reservoir with a horizontal water surface, given its inflow hydrograph and storage-release characteristics.  The level pool routing method is sometimes also referred to as Storage routing, the Storage-Indication method, or the Modified Puls method. For this reservoir model, the method described in Applied Hydrology from V.T.Chow (1988) is used.  

The reservoir routing procedure in the Level Pool method is as follows:The reservoir routing procedure in the Level Pool method is as follows:

We define the value G is a function of Storage and Outflow, defined as G[S] = 2*S/Δt + O

where:

  • S represents the reservoir storage
  • O represents the reservoir release
  • Δt represents the time step

For each row in the the uncontrolledOutlet capacityCharacteristics outletTable, we can now precompute a G[S] value. This allows the model to look up the release O for a given G.

The level pool method makes use of the following relations, that follow from the water balance equations (details in the handbook):

K[t] = G[t-1] - 2*O[t-1]

G[t]= ( I[t-1] + I[t] )+K[t]

 For the computation, we loop over all time intervals from t=0 to t=tend.

  1. If t=0
    1. Use the state values as provided in the input files. If either a level, or a storage are provided, look up the equivalent value.
    2. In case both level and storage are provided, use the lookup value to determine any inconsistencies. If found, the level is used as the basis and the storage at t=0 is recalculated
    3. no computation takes place at t=0
  2. If t=1 then
    1. K[1] = 2*S[0]/Δt - O[0] (inital storage and release values are known)
    2. G[1] is computed with G[1]= ( I[0] + I[1] )+K[1]
    3. Compute outlet O[1] by linear linearly interpolating the precomputed table using O(S) and G(S).
    4. In case an outlet O_input[1] timeseries is provided as part of the inputs, set O[1] = O_input[1]
    5. Compute storage S([1) ] = S([0) ] + Δt* ( I[1] - O[1] )
  3. If t>1 then
    1. K[t] = G[t-1] - 2*O[t-1]
    2. G[t] is computed with G[t]= ( I[t-1] + I[t] )+K[t]
    3. Compute outlet O([t) ] by linear linearly interpolating the precomputed table using O(S) and G(S).
    4. In case an outlet O_input[t] timeseries is provided as part of the inputs, set O[t] = O_input[t]
    5. Compute storage S([t) ] = S([t-1) ] + Δt* ( I[t] - O[t] )

When the A model that is configured to use the level-pool method is run in debug mode, the diagnostics will write the values for G and K for each timestep in the the diagnostics when run in debug mode.

backwardEulerMethod

The backward Backward Euler reservoir routing scheme is an implicit scheme that uses the backward difference approximation for the derivative. The equation for the backward Euler reservoir routing scheme can be written as follows:

S[t+1] = S[t] + Δt* ( I[t+1] - O[t+1,S[t]] )

where:

  • S[t+1] represents the reservoir storage at the next time step (n+1)
  • S[t] represents the reservoir storage at the current time step (n).
  • Δt represents the time step.
  • I[t+1] is the inflow into the reservoir at the next time step (n+1).
  • O[ t+1, S[t] ] is the reservoir release at the next time step (n+1), based on the storage-release relation using S[t] for the lookup input.
dynamicInterpolation

When the dynamicInterpolation element is set to true, the level/storage and level/outlet tables are inteprolated dynamically (every timestep) interpolated , to the precise value, using the elevationInterpolationMethod. In this case, the elevationInterval element is ignored. 

...

Linear interpolation is the only available interpolation method

elevationInterval

The elevationInterval or is the elevation resolution at which the configured level/storage and level/outlet tables need to be recalculated to achieve a higher granularity. Note that the level output at each timestep is processed to that specific elevationInterval. When the model looks up a value needs to be determined from the table, the largest entry that is still precalculated table elements smaller than the precalculated table elements is lookup value will be used (i.e. the model always rounds down). The consequence is that reservoir inflows/releases at a timestep that result in level/storage changes that are smaller than the interval/resolution will not be taken into account. The model does not perform any shadow accounting to keep track of these volumes. This means that the model will generally underestimate the flow when dynamicInterpolation element is set to false, and water balance will not be closedbe closed for that run type. For larger reservoirs (more volume per unit water disk) the elevationInterval needs to be set to higher resolutions to account for this

storageCharacteristics

The storageCharacteristic storageTable contains a storage-level lookup table that is strictly increasing. Note that this table should have the identical storage inputs as the capacityCharacteristics outletTable from the uncontrolledOutlet.

uncontrolledOutlet

The uncontrolledOutlet element contains capacityCharacteristics outletTable which relates storage-release. Note that this table should have the identical storage inputs as the storageCharacteristic storageTable.

The <input><release> element can be set to the timeseries variable that can overwrite (take precedence) the lookup value for the releaseoutlet. This means that for a given timestep, if the release outlet input timeseries (e.g. QIn) contains a value, this release is applied.

The <output><release> element determines where the resulting release timeseries is saved to.

input / output variables and files

In the input section, the model input variables will be configured. The model will look for the required variables in the parameter field of the PI timeseries (see idMapping). The Reservoir Model code will try to parse the configured model variables (like IIn, QOut, etc) from the parameterId of the PI timeseries, the locationId is not used. In the output section, the model output variables will be configured. When writing the output timeseries, the locationId used in the import PI xml files will be used as the locationId in the output PI xml files. The output model variableId's will be used as the parameter in the timeseries.

...

  • importState.xml
    • level values, or (HIn)
    • storage values (SIn)
  • import.xml
    • inflow (IIn)
    • release outlet (optional) (QIn)

Note that for the suggested variableId's in the provided example, the postfix In and Out are used to denote if the series are Inputs for, or Outputs from the model.

The startDateTime and endDateTime in the run_info file are used by the model to determine the start (startDateTime) and end (endDateTime) of the model run. The model will pick the starting (state) value for level/storage (level has precedent in case of an inconsistency), inflow, release outlet from the inputTimeSeriesFiles at the specific . If datetime. The model will first check for a state level value. If a starting level value is missing in the input, the model will use the starting storage value. If both starting level/storage cannot be determined from the input files, the model will throw an error.  Inflow Inflow and release outlet values at the starting time are not required at the first timestep and these values will not be used for storage calculations (no calculation at the first timestep). When they these values are not foundprovided as inputs, a value of 0 is usedassumed (and written to the output).

The following output timeseries file is suggested:

...

In case state functionality is configured in the run_info file (inputStateDescriptionFile is defined), the model will also write (all) the outputs to the write location as defined in the stateLocation file (e.g. exportState.xml)

...

Reservoir Model specifics

  • The model Integrated Reservoir Model can be considered "timestep ending", similar the the timestep definition of Delft-FEWS.
  • No calculations/processing is performed at the first timestep (t=0, startDateTime as set in the run_info.xml file)

...