Load-flow validation

The load-flow validation aims at ensuring the consistency of load-flow results, and, more generally of any steady state
(that may be found with an optimal power flow or as the final state of a long dynamic simulation), with respect to a set of rules that
describes what is an *acceptable* load-flow result. On the most abstract level, a load-flow result is *acceptable* if it
describes a feasible steady-state of a power system given its physics and its logics. More practically, generations of
practitioners have set quasi-standard ways to describe them that allows to define precise rules.

Overall, tests should never be too tight and leniency is preferred to tightness in case approximations are needed or in case expectations are unclear (typically when the input data is inconsistent). For example, there is a switch to test only the main component because it is not clear what to expect from load flow results on small connected components.

Another important global setting is the `ok-missing-values`

parameter, which determines if is OK to have missing
values or `NaN`

. Normally, it should be set to false but it may be useful in the cases where the power flow results are
incomplete.

This documentation explains the tests done. The documentation of the load-flow validation command, including all its parameters can be found here.

The first law of Kirchhoff must be satisfied for every bus for active and reactive power:

If one value is missing, the test is OK.

If the result contains only the voltages (phase and angle), `com.powsybl.loadflow.resultscompletion.LoadFlowResultsCompletion`

can be used to compute the flows from the voltages in order to validate the rule, with the
run-computation option.

Lines and two windings transformers are converted into a universal branch:

```
V1*exp(j*theta1) rho1*exp(j*alpha1) r+j*x rho2*exp(j*alpha2) V2*exp(j*theta2)
(P1,Q1)-> ____O/O__________________________-----__________________________O/O_____ <-(P2,Q2)
| ----- |
g1+j*b1 |_| |_| g2+j*b2
| |
_|_ _|_
_ _
. .
```

- Power-flow results:
- and : Magnitude (kV) and angle () of the voltage at the connection buses 1 and 2 respectively.
- and : Active power (MW) and reactive power (MVAr) injected in the branch on each side.

- Characteristics:
- and : Magnitude (no unit) and angle () of the ideal transformers ratios on each side.
- and : Complex shunt impedance on each side (S).
- : Complex series impedance .

Thanks to Kirchhoff laws (see line and 2-winding transformer documentation), estimations of powers are computed according to the voltages and the characteristics of the branch:

The test of the branch is OK if:

For a branch that is disconnected on one end (for example end 2), then . As a result, it is possible to recompute which are usually not returned by power-flows and which are not stored in node-breaker IIDM format. Then, the same tests are done.

In case of missing results (usually the powers , , , which are not mandatory), the test is
always OK if `ok-missing-values = true`

and NOK if `false`

. In case the voltages are available but not the powers, the
`com.powsybl.loadflow.resultscompletion.LoadFlowResultsCompletion`

can recompute them using the validation equations (meaning
that the branch validation tests will always be OK but it allows to perform the bus validation tests).

To be implemented, based on a conversion into 3 two-windings transformers.

In case of an imbalance between the sum of generator active power setpoints on one side and consumption and losses on the other side, the generation of some units has to be adjusted. Note that, if it is allowed to modify the setpoints (for example if the results were computed by an Optimal Power Flow and not a Power Flow), there should be no imbalance left. Therefore, the adjustment should be done with a rather simple method (typically, simpler than a merit order based on marginal costs). Basically, the adjustment is therefore done on the generators connected to the slack node because this is the simplest solution from a mathematical point of view. However, this has many drawbacks, in particular in case of a large imbalance. This is why other schemes have been developed, called “distributed slack nodes”. Loads could be adjusted, but this is generally not the case as load is usually considered as inflexible. Generators are usually adjusted proportionally to a shift key to be defined. Three keys have been retained for the validation ( is a generator):

- mode : Proportional to
- mode : Proportional to
- mode : Proportional to

is a participation factor. In the current validation scheme, . It is binary: either the unit participates or not.

As the load-flow results do not include the key used nor the participation factor, they have to be inferred. To do so, a first iteration is done on units that deviate significantly. For each of these units, assuming one mode, the proportion factor can be estimated. If deviations are perfect, the proportion factor estimated for the right mode will be the same for all the deviating units for which is strictly and . Therefore, the inferred deviation is the one for which the standard deviation of the estimated proportion factor is the lowest.

Once the mode is determined, the new target can be computed for each unit. The following check is done:

If the voltage regulation is deactivated, it is expected that:

If the voltage regulation is activated, the generator is modeled as a node: the voltage target should be reached except if reactive bounds are hit (PV mode). If the reactive bounds are hit, the reactive power should be equal to a limit. Mathematically speaking, one of the following 3 conditions should be met:

There are a few tricks to handle special cases:

- if , then the values are switched to recover a meaningfull interval if
`noRequirementIfReactiveBoundInversion = false`

- in case of a missing value, the corresponding test is OK
- and are function of . If is outside , no test is done.

To be implemented, with tests similar to generators with voltage regulation.

A shunt is expected not to generate or absorb active power:

A shunt is expected to generate reactive power according to the number of actived section and to the susceptance per section:

Static VAR Compensator behave like generators producing 0 active power except that their reactive bounds are expressed in susceptance, so that they are voltage dependent.

MW

- If the regulation mode is
`OFF`

, then MVar - If the regulation mode is
`REACTIVE_POWER`

, it behaves like a generator without voltage regulation - If the regulation mode is
`VOLTAGE`

, it behaves like a generator with voltage regulation with the following bounds (dependent on the voltage, which is not the case for generators): and

To be done.

VSC converter stations behave like generators with the additional constraints that the sum of active power on converter stations paired by a cable is equal to the losses on the converter stations plus the losses on the cable.

To be done.

Ratio tap transformers have a tap with a finite discrete number of position that allows to change its characteristics, especially the transformer ratio. Let’s assume that the logic is based on deadband: if the deviation between the measurement and the setpoint is higher than the deadband width, the tap position is increased or decreased by one unit.

As a result, a state is a steady state only if the regulated value is within the deadband or if the tap position is at minimum or maximum. To check this assertion, an upper bound of the deadband value is needed. Generally, the value of the deadband is not know available in data models. Usual load flow solvers simply consider a continuous tap that is rounded afterwards. As a result, one should compute an upper bound of the effect of the rounding. Under the usual situation where the low voltage (side one) is controlled, the maximum effect is expected if the high voltage is fixed (usually it decreases) and if the network connected to the low voltage is an antenna. If the transformer is perfect, the equations are:

With the current tap `tap`

, and if the regulated side is side `TWO`

:

With the next tap, the new voltage would be:

We can therefore compute approximately the voltage increments corresponding to and .

We then assume the *deadband* of the regulation to be equal to the voltage increase/decrease that can be performed with
taps and :

Finally, we check that the voltage deviation stays inside the deadband.

- If , meaning that the voltage is too low, it should be checked if the deviation would be smaller by increasing V2, i.e. the following condition should be satisfied:
- If , meaning that the voltage is too high, it should be checked if the deviation would be smaller by decreasing V2, i.e. the following condition should be satisfied:

The test is done only if the regulated voltage is on one end of the transformer and it always returns OK if the controlled voltage is remote.

- 2018 iPST-day: Steady-state validation