A component library#
Several files each say part of a spec and compose into one. The surface
declares what the components share. Each component file declares its own math
against the surface, and merge makes the spec.
Every file here loads and prints on its own, so the unit you pick from is the
unit you can read.
The components couple through one flow variable per port, Port_p, so the
solved flow at every port can be read back. Where no one reads that flow, a
sum that each component adds a term to needs no variable of its own.
Compose a spec from several files
shows that way.
The names are PyPSA's, spelled Component_attribute as
the PyPSA rungs spell them, and the math prints in the symbols
those pages use. The spec is cut to dispatch: one build, no availability
profile, no ramp limits.
The layout#
examples/library/
surface.yaml one flow per port, one balance per bus
generator.yaml PyPSA's Generator
load.yaml PyPSA's Load
variants/
commitment.yaml a patch over the composition, not a peer
| Page | What it shows |
|---|---|
| The coupling surface | the surface, and the sign convention |
| Generators | a file that reads Port_p and prices its output |
| Loads | a file with no variable of its own |
| The composed spec | what merge returns, and the math it prints with each variant |
Rules of the layout#
- One file per thing you would pick on its own.
mergetakes a whole fragment or none of it, so a spec with no storage never mentions storage. - Every component file is written against one surface.
- Every name carries the component class it belongs to.
mergedoes not rename.Generator_andLoad_keep the files apart, and the surface ownsPort_,portandbus. - A fragment is what a system has. A patch is how a component is
formulated. A second kind of component is a peer, and
mergecomposes it. A different formulation of one component edits declarations that already exist, andoverridelays it over the composition.
The variant#
variants/commitment.yaml makes the generator a committed unit. It adds a
binary, lifts the upper bound the capacity gave Generator_p, and caps output
with a constraint instead.
It edits Generator_p, which generator.yaml introduces, and names
Generator_p_nom, which generator.yaml declares. So it is not a spec, and
to_spec refuses it on its own. It is laid over the composition:
The composed spec carries the patch and the math it makes, in a tab of its own. That tab is the only place the patch can be read as math.