Angle monitoring#

Introduction#

Some CRAC files can define voltage angle constraints on network elements.
These are constraints that monitor that the current voltage angle difference between two network elements does not exceed a given threshold.
OpenRAO allows modelling these constraints in AngleCnec objects.
However, modelling the impact of remedial actions on angle values is highly complex and non-linear. This is why CASTOR does not inherently support angle constraints.
The AngleMonitoring package allows monitoring angle values after a RAO has been run, and activating re-dispatch remedial actions in case of constrained elements.

Angle monitoring

The Java API#

You can easily call the angle monitoring module using the JAVA API:

  1. Build an AngleMonitoring object using one of two constructors. If you have a CIM GLSK document at hand:

public AngleMonitoring(Crac crac, Network network, RaoResult raoResult, CimGlskDocument cimGlskDocument, OffsetDateTime glskOffsetDateTime)

With:

  • crac: the CRAC object used for the RAO, and containing AngleCnecs to be monitored.

  • network: the network to be monitored.

  • raoResult: the RaoResult object containing selected remedial actions (that shall be applied on the network before monitoring angle values)

  • cimGlskDocument: the CIM GLSK document that will allow proper application of re-dispatch remedial actions.

  • glskOffsetDateTime: the timestamp for which the computation is made, as it is necessary to correctly read relevant values from the CIM GLSK file.

Otherwise, you can still run the angle monitoring algorithm, which will automatically generate a proportional-to-target-power GLSK for its internal functioning (ie in order to re-dispatch lost generation when generator-tripping remedial actions are activated):

public AngleMonitoring(Crac crac, Network network, RaoResult raoResult, Set<Country> glskCountries)

With:

  • crac: the CRAC object used for the RAO, and containing AngleCnecs to be monitored.

  • network: the network to be monitored.

  • raoResult: the RaoResult object containing selected remedial actions (that shall be applied on the network before monitoring angle values)

  • glskCountries: the countries which might need re-dispatching, for which the algorithm should generate a proportional GLSK

  1. Run the monitoring algorithm using the constructed object’s following method:

public RaoResult runAndUpdateRaoResult(String loadFlowProvider, LoadFlowParameters loadFlowParameters, int numberOfLoadFlowsInParallel)

With:

  • loadFlowProvider: the name of the load-flow computer to use. This should refer to a PowSyBl load flow provider implementation

  • loadFlowParameters: the PowSyBl LoadFlowParameters object to configure load-flow computation.

  • numberOfLoadFlowsInParallel: the number of contingencies to monitor in parallel, allowing a maximum utilization of your computing resources (set it to your number of available CPUs).

💡 NOTE
For now, only CIM GLSK format is supported by the angle monitoring module

Here is a (almost) complete example:

Crac crac = ...
Network network = ...
RaoResult raoResult = Rao.find(...).run(...)
CimGlskDocument glsk = ...
LoadFlowParameters loadFlowParameters = ...
RaoResult raoResultWithAngleMonitoring = new AngleMonitoring(crac, network, raoResult, ...).runAndUpdateRaoResult("OpenLoadFlow", loadFlowParameters, 2);

The angle monitoring result#

The method presented above generates a new RAO result object, which is equivalent to the initial one, augmented by the relevant results of the angle monitoring algorithm :

The angle monitoring algorithm#

Here is a detailed description of how the angle monitoring algorithm operates:

  • Apply optimal preventive remedial actions from RaoResult on the network

  • From the CRAC, get the set of states on which AngleCnecs exist

  • For each of these states, monitor angles:

    • Use a new copy of the network

    • If the state is not preventive,

      • apply the contingency on the network

      • from the RaoResult, apply on the network the optimal remedial actions decided by the RAO (automatic and curative)

    • Compute load-flow

      • If it diverges, return the following content for this state, then move on to the next state:

        • the angles of the angle CNECs equal to NaN

        • no applied remedial actions

        • status DIVERGENT

    • Compute the angles for all angle CNECs, as the maximum phase difference between the 2 voltage levels (1)

      • Angle in degrees = 180 / pi * (max(angle on buses of exporting voltage level) - min(angle on buses of importing voltage level))

    • Compare the angles to their thresholds. For the AngleCnecs that have an angle overshoot, get the associated remedial actions (2)

      • If the AngleCnec has no associated RA, then the angle constraint cannot be remedied: move on to the next AngleCnec.

      • If the state is preventive, do not apply any PRA (it would be incoherent with the RAO results). Move on to the next state.

      • For every RA:

        • If the remedial action is not a network action, do not apply it (if it’s a RangeAction, we cannot know which set-point to use). Move on to the next RA.

        • If the RA is a network action, apply it on the network.

    • If any injection-set-point RA was applied, create and apply the re-dispatch that shall compensate the loss of generation / load (3):

      • The amount of power to re-dispatch is the net sum (generation - load) of power generations & loads affected by the RAs, before changing the set-points

      • The GLSK to use shall be the same as the one used for the whole process

      • Exclude from the re-dispatching all the generators & loads that were modified by an injection-set-point RA, since they should not be affected

    • If any RA was applied, recompute the load-flow

      • If it diverges, return the following content for this state, then move on to the next state:

        • the angles of the AngleCnecs equal to what was computed in step (1)

        • no applied remedial actions

        • security DIVERGENT

    • Re-compute all angle values (4)

    • Create an intermediary result, with angles computed in (4), list of applied remedial actions in (2), and secure flag set to SECURE if there is no more overshoot (after re-verifying thresholds)

  • Assemble all the state-specific result in one overall result and update the RAO result object

Angle monitoring algorithm

The output logs#

In the logs, the start and end of different steps are logged:

  • Start and end of the angle monitoring algorithm

  • Start and end of the monitoring of each state (preventive or post-contingency)

  • Start and end of each load-flow computation

Also, the following information is logged:

  • Applied remedial actions to relieve angle constraints

  • At the end of each state monitoring, the list of remaining angle constraints

  • At the end of the monitoring algorithm, the list of remaining angle constraints

Example 1:
In this example, a curative constraint (after contingency “Co-1”) induces the implementation of a CRA, but this CRA is not enough to solve the constraint.

INFO  c.p.o.commons.logs.RaoBusinessLogs - ----- Angle monitoring [start]
INFO  c.p.openrao.commons.logs.TechnicalLogs - Using base network 'urn:uuid:4f4a3f29-6892-49ea-bfc1-92051973c799' on variant 'InitialState'
INFO  c.p.o.commons.logs.RaoBusinessLogs - -- Monitoring angles at state "Co-1 - curative" [start]
INFO  c.p.openrao.commons.logs.TechnicalLogs - Load-flow computation [start]
INFO  c.p.openrao.commons.logs.TechnicalLogs - Load-flow computation [end]
INFO  c.p.o.commons.logs.RaoBusinessLogs - Applying the following remedial action(s) in order to reduce constraints on CNEC "AngleCnec1": RA-1
INFO  c.p.o.commons.logs.RaoBusinessLogs - Redispatching 108.0 MW in BE [start]
INFO  c.p.o.commons.logs.RaoBusinessLogs - Redispatching 108.0 MW in BE [end]
INFO  c.p.o.commons.logs.RaoBusinessLogs - Redispatching 150.0 MW in NL [start]
INFO  c.p.o.commons.logs.RaoBusinessLogs - Redispatching 150.0 MW in NL [end]
INFO  c.p.openrao.commons.logs.TechnicalLogs - Load-flow computation [start]
INFO  c.p.openrao.commons.logs.TechnicalLogs - Load-flow computation [end]
INFO  c.p.o.commons.logs.RaoBusinessLogs - Some AngleCnecs are not secure:
INFO  c.p.o.commons.logs.RaoBusinessLogs - AngleCnec AngleCnec1 (with importing network element _d77b61ef-61aa-4b22-95f6-b56ca080788d and exporting network element _8d8a82ba-b5b0-4e94-861a-192af055f2b8) at state Co-1 - curative has an angle of 5°.
INFO  c.p.o.commons.logs.RaoBusinessLogs - -- Monitoring angles at state "Co-1 - curative" [end]
INFO  c.p.o.commons.logs.RaoBusinessLogs - -- Monitoring angles at state "Co-2 - curative" [start]
INFO  c.p.openrao.commons.logs.TechnicalLogs - Load-flow computation [start]
INFO  c.p.openrao.commons.logs.TechnicalLogs - Load-flow computation [end]
INFO  c.p.o.commons.logs.RaoBusinessLogs - All AngleCnecs are secure.
INFO  c.p.o.commons.logs.RaoBusinessLogs - -- Monitoring angles at state "Co-2 - curative" [end]
INFO  c.p.o.commons.logs.RaoBusinessLogs - Some AngleCnecs are not secure:
INFO  c.p.o.commons.logs.RaoBusinessLogs - AngleCnec AngleCnec1 (with importing network element _d77b61ef-61aa-4b22-95f6-b56ca080788d and exporting network element _8d8a82ba-b5b0-4e94-861a-192af055f2b8) at state Co-1 - curative has an angle of 5°.
INFO  c.p.o.commons.logs.RaoBusinessLogs - ----- Angle monitoring [end]