Tutorial 1: Outputs¶
One of the first steps in modeling is to decide what the desired outputs should be. For example, the outputs of a PV power simulation might be hourly energy and the corresponding timestamps. In this tutorial we’ll demonstrate how to specify the outputs for a SimKit model. We use the term outputs to refer to the results from calculations. We’ll explain what the term calculations refers to in the next tutorial, and we’ll define the term models in the last tutorial.
As discussed in Getting Started there are two styles for specifying
SimKit parameters. First we’ll show the preferred method to specify output
parameters using OutputParameter
as attributes
in a subclass of Output
. Later we’ll also show
how to specify output parameters in a JSON file.
Outputs Class¶
We’ll need to create a new Python module inside the pvpower
package created
by running simkit-quickstart
. We can actually define all of our SimKit
parameters in this file. Let’s call the new module performance.py
. Inside
the new module, we’ll have to import the Output
class so we can create a subclass called PVPowerOutputs
to hold our output
specifications. We also import OutputParameter
to specify outputs like hourly energy and the corresponding hourly timeseries.
We can also specify attributes like “units” and “size” for each output
parameter. Copy the following snippet into the PV power performance.py
module to specify the rest of the output parameters.
"""
PV power performance simulation
"""
from simkit.core.outputs import Output, OutputParameter
class PVPowerOutputs(Output):
"""
Outputs for PV Power demo
"""
timestamps = OutputParameter(isconstant=True, size=8761)
hourly_energy = OutputParameter(
isconstant=True,
timeseries="hourly_timeseries",
units="Wh",
size=8760
)
# timestamps corresponding to hourly energy
hourly_timeseries = OutputParameter(
isconstant=True,units="Wh", size=8760
)
monthly_energy = OutputParameter(
isconstant=True, units="Wh", size=12
)
annual_energy = OutputParameter(isconstant=True, units="Wh")
Outputs Registry¶
When the model is initialized, the outputs from all output subclasses in the model are stored together in a dictionary called the output registry. When the simulation is executed, the output values are stored and retrieved from the registry as needed. The last tutorial will explain more about SimKit registries and how they’re used.
Output Attributes¶
In the PVPowerOutputs
snippet above each output is specified as a class
attribute set to an instance of an OutputParameter
that has arguments like
units, initial value and size. The arguments of an OutputParameter
represent
the attributes of that output parameter and are also stored in the output
registry. The following attributes can be passed to as arguments to
OutputParameter
:
Attribute |
Description |
---|---|
units |
output units |
init |
initial value |
size |
array size |
isconstant |
constant value flag |
isproperty |
material property flag |
timeseries |
name of corresponding timeseries output |
Attributes can be skipped or set to None
if necessary. If the attributes are
passed as positional arguments, then the order corresponds to table above;
keyword arguments can be passed to OutputParameter
in any order.
There are also some output attributes such as uncertainty and variance that are
calculated during the simulation and therefore should not be passed as arguments
to OutputParameter
. The following attributes are generated by SimKit:
Attribute |
Description |
---|---|
uncertainty |
square roots of variance diagonal components |
variance |
dictionary of covariance between formula outputs |
jacobian |
dictionary of sensitivities between formula inputs and outputs |
output_source |
name of the class in which outputs were specified |
Material Property Flag¶
Outputs of dynamic calculations that represent a material property remain at the
last value when the calculation is skipped because a simulation threshold is
exceeded. For example, PV performance degradation is an output that is a
material property. When performance is not calculated, for example at night, the
accumulated degradation remains at the last calculated value. On the other hand
PV cell power is not a material property; when not calculatd it would revert to
a default value. Set the isproperty
attribute to true to indicate that an
output parameter is a material property.
Constant Value Flag and Timeseries¶
Constant values do not change during dynamic calculations. This flag has no effect on static calculations and is only used in dynamic calculations to resize outputs for writing files.
The timeseries output attribute is optional and is not currently used in
SimKit. However it can be used to indicate the index of an output that is a
timeseries perhaps making generation of a pandas.DataFrame
easier.
Parameter File¶
The alternate style of specifying output parameters for each calculation is to
use a JSON file to list the desired outputs and their attributes in a file in
the outputs
folder of the project.
For example create PVPower/outputs/pvpower.json
and paste the following
snippet:
{
"timestamps": {"isconstant": true, "size": 8761},
"hourly_energy": {
"isconstant": true,
"timeseries": "hourly_timeseries",
"units": "W*h",
"size": 8760
},
"hourly_timeseries": {
"isconstant": true, "units": "W*h", "size": 8760
},
"monthly_energy": {
"isconstant": true, "units": "W*h", "size": 12
},
"annual_energy": {"isconstant": true, "units": "W*h"}
}
To tell SimKit to use these outputs, we need to create a new Python module in
the pvpower
package, let’s call it performance.py
like in the example
above, and specify the file and path to the output parameter file in a
Output
subclass:
from simkit.core.outputs import Output
import os
from pvpower import PROJ_PATH
class PVPowerOutputs(Output):
"""Outputs for PV Power demo"""
class Meta:
outputs_file = 'pvpower.json'
outputs_path = os.path.join(PROJ_PATH, 'outputs')