Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CGMES: remove extension for Control Areas, use IIDM Area #3149

Open
wants to merge 37 commits into
base: main
Choose a base branch
from

Conversation

zamarrenolm
Copy link
Member

@zamarrenolm zamarrenolm commented Sep 20, 2024

Please check if the PR fulfills these requirements

  • The commit message follows our guidelines
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)

Does this PR already have an issue describing the problem?

What kind of change does this PR introduce?

Update

What is the current behavior?

Information from CGMES control areas is stored using an extension to the Network Model (CgmesControlArea).

What is the new behavior (if this is a feature change)?
Information from CGMES control areas is stored using native IIDM objects of class Area.
CGMES pTolerance attribute is stored as a property.
The ENTSO-E attribute IdentifiedObject.energyIdentCodeEic is stored as an alias.

Does this PR introduce a breaking change or deprecate an API?

  • Yes
  • No

If yes, please check if the following requirements are fulfilled

  • The Breaking Change or Deprecated label has been added
  • The migration steps are described in the following section

What changes might users need to make in their application due to this PR? (migration steps)

Previously, during export, if the CgmesControlArea extension was not present in the exported network, a new one was created and a control area representing the whole network was added to it, with the terminals of all dangling lines defined as its tie flows. As a result, the CGMES export always had a control area of type interchange.

After this PR, no control area is automatically created during export. The export process itself will not add, remove or change the attributes of the objects in the IIDM model.

If the user wants to define a control area interchange based on the whole network, it can do it programmatically using the following line of code:

new CgmesExport().createDefaultControlAreaInterchange(network);

It is located in the CgmesExport exporter because the creation of a default area involves potential access to reference data (boundaries) and using some export parameters that the user may have already configured. The relevant data: the sourcing actor (that determines its region and the corresponding EIC code), the consideration of boundary nodes (and associated tie flows) as AC or DC. Also, the user can provide some of the parameters explicitly, if needed. As an example, including the final call to CGMES export:

Properties exportParams = new Properties();
exportParams.put(CgmesImport.BOUNDARY_LOCATION, "....");
exportParams.put(CgmesExport.NAMING_STRATEGY, NamingStrategyFactory.CGMES);

new CgmesExport().createDefaultControlAreaInterchange(network, exportParams);
network.write("CGMES", exportParams, outputPath);

Other information:

  • Check if the balancing adjustment mechanism has to be updated (in powsybl-entsoe) and adapt it if needed
  • Adapt UCTE import/export

@zamarrenolm zamarrenolm marked this pull request as ready for review October 25, 2024 12:09
@zamarrenolm zamarrenolm requested a review from rcourtier October 25, 2024 13:41
Comment on lines 165 to 167
// Remove Areas
expected.getAreaStream().map(Area::getId).toList().forEach(a -> expected.getArea(a).remove());
actual.getAreaStream().map(Area::getId).toList().forEach(a -> actual.getArea(a).remove());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can actually remove that, areas can now be compared.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

areas kept during comparison, change 9ca9e0a

// Explicit creation of a default control area
new CgmesExport().createDefaultControlAreaInterchange(network);

// Check that exported files now have a control area definition
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you actually check that the default control area is present in the iidm network (so before exporting)?
That would highlight the fact that the area isn't created during the export process (thus a CGMES export is not necessary to create the default area).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

checked, change fda0105

Comment on lines 698 to 705
network.write("CGMES", null, tmpDirWithCA.resolve(baseName));
Network networkWithCA = Network.read(new GenericReadOnlyDataSource(tmpDirWithCA, baseName));
assertEquals(1, networkWithCA.getAreaCount());
Area areaExported = networkWithCA.getAreas().iterator().next();
assertEquals(1, areaExported.getAreaBoundaryStream().count());
assertEquals(-50, areaExported.getInterchangeTarget().orElse(Double.NaN));
// No default value for tolerance
assertNull(areaExported.getProperty(CgmesNames.P_TOLERANCE));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise, I recommend to not export and reimport, but rather read the exported files:

Suggested change
network.write("CGMES", null, tmpDirWithCA.resolve(baseName));
Network networkWithCA = Network.read(new GenericReadOnlyDataSource(tmpDirWithCA, baseName));
assertEquals(1, networkWithCA.getAreaCount());
Area areaExported = networkWithCA.getAreas().iterator().next();
assertEquals(1, areaExported.getAreaBoundaryStream().count());
assertEquals(-50, areaExported.getInterchangeTarget().orElse(Double.NaN));
// No default value for tolerance
assertNull(areaExported.getProperty(CgmesNames.P_TOLERANCE));
eqFile = ConversionUtil.writeCgmesProfile(network, "EQ", tmpDir);
String sshFile = ConversionUtil.writeCgmesProfile(network, "SSH", tmpDir);
assertTrue(eqFile.contains("<cim:ControlArea rdf:ID=\"_dangling-line_N_CA\">"));
assertTrue(sshFile.contains("<cim:ControlArea.netInterchange>-50</cim:ControlArea.netInterchange>"));
// No default value for tolerance
assertFalse(sshFile.contains("cim:ControlArea.pTolerance"));

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Waiting for review
Development

Successfully merging this pull request may close these issues.

5 participants