Datatypes#

The API has a defined set of internal datatypes to represent input and output data. Some are basic datatypes, and some are structured types to represent more complex data.

Integer#

A standard integer number. This type is also used for binary settings, where it is limited to 1 and 0.

Example: module ID number#

To set the module ID number for new_module in a prodrisk session called ps to 100:
ps.model.module['new_module'].number.set(100)
To get the module ID number of the module as a variable:
mod_number = ps.model.module['new_module'].number.get()

Float#

A standard 8-byte float value (i.e., double precision).

Example: reservoir volume#

To set the reservoir volume for new_module in a prodrisk session called ps to 65.3 Mm^3^:
ps.model.module['new_module'].rsvMax.set(65.3)
To get the reservoir volume of the module as a variable:
rsv_max = ps.model.module['new_module'].rsvMax.get()

String#

A standard string, with attribute-dependent maximum length.

Example: plant name#

To set the plant name for new_module in a prodrisk session called ps to ‘hydro_plant’:
ps.model.module['new_module'].plantName.set('hydro_plant')
To get the plant name of the module as a variable:
plant_name = ps.model.module['new_module'].plantName.get()

List of integer values#

Data consisting of multiple integer values is passed / returned as a python List object, where each element is an integer value. The length of the list depends on the attribute.

Example: module topology#

To set the topology for new_module in a prodrisk session called ps to modules with the ID numbers 101, 102, and 103:
ps.model.module['new_module'].plantName.set([101, 102, 103])
To get the topology of the module as a variable:
mod_topology = ps.model.module['new_module'].topology.get()

List of double values#

Data consisting of multiple integer values is passed / returned as a python List object, where each element is a float value. Input can also be given as a numpy array. The length of the list depends on the attribute.

Example: reservoir reference levels#

To set the reservoir reference levels for new_module in a prodrisk session called ps to the values 45.4 Mm^3^, 55.3 Mm^3^, and 62.7 Mm^3^:
ps.model.module['new_module'].reservoirReferenceLevels.set([45.4, 55.3, 62.7])
To get the reservoir reference levels as a variable:
rsv_ref_vol = ps.model.module['new_module'].reservoirReferenceLevels.get()

Table / xy curve#

Relation of two quantities given by discrete set of values. This datatype is represented as a pandas Series, where the two quantities are stored as index and data/values. Both index and data values are of type float and can be passed as a list or a numpy array. In addition, the name of the Series must be set. The name can be used as a label for this data set, but has no impact on the calculations.

Example: PQ curve#

We set the PQ curve for new_module in a prodrisk session called ps to the generated powers 0, 10, 20, 30 MW at the corresponding flow rates 0, 8.1, 16.5, 25.5 m^3^/s. We can use, e.g., the head that this PQ curve is refering to as a label, say 138 m.

import numpy as np
import pandas as pd
...
P = np.array([0, 10, 20, 30])
Q = np.array([0, 8.1, 16.5, 25.5])
pq_curve = pd.Series(name=138, index=P, data=Q)
ps.model.module['new_module'].PQcurve.set(pq_curve)

To read out the PQ curve again:

pq_curve = ps.model.module['new_module'].PQcurve.get()
P = pq_curve.index
Q = pq_curve.values

Note that one has to set data in the pandas Series constructor, but use values to access this data later.

List of tables#

A list of tables is represented by a list of pandas Series. Each element of the list works as described above. This datatype is also used to manage lists of double arrays (e.g., cut coefficients), in which case only the values of each Series have a meaning, while the index is filled with zeros.

Example: end value tables#

To set the end values with a set of aggregated water value tables for the area my_area in a prodrisk session called ps, we create a list of pandas Series, assuming for simplicity that we have the water values in an array watervalue_1 for price level 1 etc.

import numpy as np
import pandas as pd
...
end_val_1 = pd.Series(name='price_level_1', index=np.linspace(100,0,51), data=watervalue_1)
...
end_val_7 = pd.Series(name='price_level_7', index=np.linspace(100,0,51), data=watervalue_7)
ps.area['my_area'].waterValue.set([end_val_1, end_val_2, end_val_3, end_val_4, end_val_5, end_val_6, end_val_7])

Time series#

This dataype describes deterministic time-dependent data. It is represented by a pandas Series, where the index contains the time as pandas Timestamp and the time-dependent values are given as data. It is recommended that the time axis is always set up relative to the start time of the simulation, using the sessions start_time property and pandas Timedelta.

Example: minimum flow restriction#

To set the minimum flow for new_module in a prodrisk session called ps to 3 m^3^/s from week 20 to week 34 in the simulation and 0 otherwise:

include pandas as pd
...
ps.model.module['new_module'].set(pd.Series(index=[ps.start_time + pd.Timedelta(weeks=w) for w in [1,20,35]], data=[0,3,0]))

Stochastic time series#

This dataype describes stochastic time-dependent data, i.e., one time series per scenario. It is represented by a pandas DataFrame, where the index contains the time as pandas Timestamp and the time-dependent values are given as data. It is recommended that the time axis is always set up relative to the start time of the simulation, using the sessions start_time property and pandas Timedelta. Each scenario is stored as one column in the DataFrame.

Example: calculated reservoir trajectories#

To get the reservoir filling of new_module in a prodrisk session called ps as a function of time for each scenario and access specifically results for the first scenario:

...
ps.run()
...
vol = ps.model.module['new_module'].reservoirVolume.get()
scenario_0 = vol[0]   # this is a pandas Series