ADR-0009: Reactive power, voltage control, shunts and fixed transfers complete the power-flow network; power-flow inputs are ignored where no power flow runs¶
- Status: accepted
- Date: 2026-10-24
Context¶
ADR-0008 made the AC network canonical for an active-power flow: voltage
levels, line and transformer impedances, one fixed active dispatch per
injection, a slack. That is enough to see angles, active flows and the
voltage sag they cause, but not what a distribution planner checks next:
reactive power, which decides voltage magnitudes, voltage-controlled
generation, compensation at a node, and controlled DC transfers between
AC buses. PyPSA solves all of these in pf() (q_set on loads, generators
and storage units, control: PV with the bus v_mag_pu_set,
ShuntImpedance, p_set on a Link between AC buses, line b/g,
transformer phase_shift). Reaching them through native.pypsa works for
constants only, is unvalidated, and cannot add a component MEME does not
emit.
The same decision has to settle what the other targets do with these
inputs. ADR-0008 rejected dispatch in every optimization mode and merely
warned about electrical parameters. The consumer's workflow is one model
sent twice, to a planning target and to the power flow, and a rejection on
the planning side forces a second, stripped copy of the payload for no
gain: an optimization decides dispatch and never reads reactive set-points,
so ignoring them changes nothing in its result.
Decision¶
The power-flow network gains four groups of fields, each on the entity it
physically belongs to, each read only in mode power_flow, each mapped onto
one PyPSA attribute:
- Technology
electrical(overridable per node):reactive_dispatch(MVAr per timestep,q_set) orpower_factorwith optionalleading(the emitter derives Q from the active set-point in the component's own direction: a load consumes, a generator supplies),controlpqorpv(supply only;pvholds its bus atvoltage_setpoint), andvoltage_setpoint(pu) forpvgenerators and the slack. Conversion technologies carry no reactive fields: a PyPSA Link transfers active power only. - Node
electrical.shunt(g,bin siemens): oneShuntImpedanceat the node's AC bus. - Transmission
dispatch(MW fromfromtoto): a controlled transfer on an arc without impedance, PyPSA's model of an HVDC link. An electricity arc in a power flow needs eitherelectricalordispatch, never both: a line's flow is a result. - Branch refinements in
transmission.electrical:bandg(line shunt admittance),phase_shift(transformer, degrees), andr_per_length/x_per_lengthas the alternative tor/x, multiplied bydistanceat emission. Cable-type catalogues stay outside MEME: the consumer resolves the type, MEME takes values.
Every power-flow input — dispatch on technologies and arcs, the
electrical blocks on nodes, arcs and technologies — is ignored with one
warning wherever no power flow runs: on Calliope and AdOpT-NET0, which
have no such concept, and on PyPSA in every optimization mode. The warning
names the fields and the entities, so nothing is dropped silently, and the
planning payload and the power-flow payload may be the same document. This
supersedes the rejection of dispatch in optimization modes that ADR-0008
introduced. Mode power_flow itself stays rejected on targets without the
capability: a run cannot be ignored.
Inside a power flow the gates tighten instead: a reactive set-point and a
power factor are mutually exclusive; pv control is for supply
technologies; a voltage_setpoint needs pv control or the slack; all
set-points at one bus must agree; method: linear reports that reactive
quantities and voltage control play no part in a DC solve.
Consequences¶
- A planner can hold voltages, see reactive flows and compensation effects, and model HVDC ties, all through canonical fields with validation and goldens; the result folder gains the reactive tables and the shunt tables.
- The consumer sends one model to both calls and reads the warning list on the planning side as a routing table of what that target ignored.
- The derived-Q path (
power_factor) is computed by the emitter per snapshot, so a series active set-point yields a seriesq_set; the two ways to give Q cannot drift apart because only one may be present. - Still out of scope: DC sub-networks (buses of carrier
DCwith lines), tap changers and SVCs that act during the solve, time-varying voltage set-points, and anythingpf()does not model.tap_side, the transformermodeland line derating stay native-only. - ADR-0008 is amended, not rewritten: its dispatch-rejection consequence is superseded by this record.