Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions java/pypowsybl/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,18 @@
<groupId>com.powsybl</groupId>
<artifactId>powsybl-dynawo-simulation</artifactId>
</dependency>
<dependency>
<groupId>com.powsybl</groupId>
<artifactId>powsybl-dynawo-extensions-api</artifactId>
</dependency>
<dependency>
<groupId>com.powsybl</groupId>
<artifactId>powsybl-dynawo-extensions-impl</artifactId>
</dependency>
<dependency>
<groupId>com.powsybl</groupId>
<artifactId>powsybl-dynawo-extensions-serde</artifactId>
</dependency>
<dependency>
<groupId>com.powsybl</groupId>
<artifactId>powsybl-entsoe-commons</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/**
* Copyright (c) 2022, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.dataframe.dynamic.extensions;

import com.powsybl.commons.PowsyblException;
import com.powsybl.dataframe.SeriesMetadata;
import com.powsybl.dataframe.network.adders.AbstractSimpleAdder;
import com.powsybl.dataframe.network.adders.SeriesUtils;
import com.powsybl.dataframe.update.StringSeries;
import com.powsybl.dataframe.update.UpdatingDataframe;
import com.powsybl.dynawo.extensions.api.generator.connection.GeneratorConnectionLevel;
import com.powsybl.dynawo.extensions.api.generator.connection.GeneratorConnectionLevelAdder;
import com.powsybl.iidm.network.Generator;
import com.powsybl.iidm.network.Network;

import java.util.Collections;
import java.util.List;

/**
* @author Gautier Bureau {@literal <gautier.bureau at rte-france.com>}
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
public class GeneratorConnectionLevelDataframeAdder extends AbstractSimpleAdder {

private static final List<SeriesMetadata> METADATA = List.of(
SeriesMetadata.stringIndex("id"),
SeriesMetadata.strings("level")
);

@Override
public List<List<SeriesMetadata>> getMetadata() {
return Collections.singletonList(METADATA);
}

private static class GeneratorConnectionLevelSeries {

private final StringSeries id;
private final StringSeries level;

GeneratorConnectionLevelSeries(UpdatingDataframe dataframe) {
this.id = dataframe.getStrings("id");
this.level = dataframe.getStrings("level");
}

void create(Network network, int row) {
String generatorId = this.id.get(row);
Generator g = network.getGenerator(generatorId);
if (g == null) {
throw new PowsyblException("Invalid generator id : could not find " + generatorId);
}
var adder = g.newExtension(GeneratorConnectionLevelAdder.class);
SeriesUtils.applyIfPresent(level, row, l -> adder.withLevel(GeneratorConnectionLevel.GeneratorConnectionLevelType.valueOf(l)));
adder.add();
}
}

@Override
public void addElements(Network network, UpdatingDataframe dataframe) {
GeneratorConnectionLevelSeries series = new GeneratorConnectionLevelSeries(dataframe);
for (int row = 0; row < dataframe.getRowCount(); row++) {
series.create(network, row);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/**
* Copyright (c) 2021-2022, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.dataframe.dynamic.extensions;

import com.google.auto.service.AutoService;
import com.powsybl.commons.PowsyblException;
import com.powsybl.dataframe.network.ExtensionInformation;
import com.powsybl.dataframe.network.NetworkDataframeMapper;
import com.powsybl.dataframe.network.NetworkDataframeMapperBuilder;
import com.powsybl.dataframe.network.adders.NetworkElementAdder;
import com.powsybl.dataframe.network.extensions.AbstractSingleDataframeNetworkExtension;
import com.powsybl.dataframe.network.extensions.NetworkExtensionDataframeProvider;
import com.powsybl.dynawo.extensions.api.generator.connection.GeneratorConnectionLevel;
import com.powsybl.iidm.network.Generator;
import com.powsybl.iidm.network.Network;

import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

/**
* @author Gautier Bureau {@literal <gautier.bureau at rte-france.com>}
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
@AutoService(NetworkExtensionDataframeProvider.class)
public class GeneratorConnectionLevelDataframeProvider extends AbstractSingleDataframeNetworkExtension {

@Override
public String getExtensionName() {
return GeneratorConnectionLevel.NAME;
}

@Override
public ExtensionInformation getExtensionInformation() {
return new ExtensionInformation(GeneratorConnectionLevel.NAME,
"Provides information, for dynamic simulation only, about the characteristics of a Synchronized generator",
"index : id (str), " +
"level (str)");
}

private Stream<GeneratorConnectionLevel> itemsStream(Network network) {
return network.getGeneratorStream()
.map(g -> (GeneratorConnectionLevel) g.getExtension(GeneratorConnectionLevel.class))
.filter(Objects::nonNull);
}

private GeneratorConnectionLevel getOrThrow(Network network, String id) {
Generator gen = network.getGenerator(id);
if (gen == null) {
throw new PowsyblException("Generator '" + id + "' not found");
}
GeneratorConnectionLevel sgp = gen.getExtension(GeneratorConnectionLevel.class);
if (sgp == null) {
throw new PowsyblException("Generator '" + id + "' has no GeneratorConnectionLevel extension");
}
return sgp;
}

@Override
public NetworkDataframeMapper createMapper() {
return NetworkDataframeMapperBuilder.ofStream(this::itemsStream, this::getOrThrow)
.stringsIndex("id", ext -> ext.getExtendable().getId())
.enums("level", GeneratorConnectionLevel.GeneratorConnectionLevelType.class, GeneratorConnectionLevel::getLevel, GeneratorConnectionLevel::setLevel)
.build();
}

@Override
public void removeExtensions(Network network, List<String> ids) {
ids.stream().filter(Objects::nonNull)
.map(network::getGenerator)
.filter(Objects::nonNull)
.forEach(g -> g.removeExtension(GeneratorConnectionLevel.class));
}

@Override
public NetworkElementAdder createAdder() {
return new GeneratorConnectionLevelDataframeAdder();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/**
* Copyright (c) 2022, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.dataframe.dynamic.extensions;

import com.powsybl.commons.PowsyblException;
import com.powsybl.dataframe.SeriesMetadata;
import com.powsybl.dataframe.network.adders.AbstractSimpleAdder;
import com.powsybl.dataframe.network.adders.SeriesUtils;
import com.powsybl.dataframe.update.IntSeries;
import com.powsybl.dataframe.update.StringSeries;
import com.powsybl.dataframe.update.UpdatingDataframe;
import com.powsybl.dynawo.extensions.api.generator.SynchronizedGeneratorPropertiesAdder;
import com.powsybl.iidm.network.Generator;
import com.powsybl.iidm.network.Network;

import java.util.Collections;
import java.util.List;

/**
* @author Gautier Bureau {@literal <gautier.bureau at rte-france.com>}
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
public class SynchronizedGeneratorPropertiesDataframeAdder extends AbstractSimpleAdder {

private static final List<SeriesMetadata> METADATA = List.of(
SeriesMetadata.stringIndex("id"),
SeriesMetadata.strings("type"),
SeriesMetadata.booleans("rpcl2")
);

@Override
public List<List<SeriesMetadata>> getMetadata() {
return Collections.singletonList(METADATA);
}

private static class SynchronizedGeneratorPropertiesSeries {

private final StringSeries id;
private final StringSeries type;
private final IntSeries rpcl2;

SynchronizedGeneratorPropertiesSeries(UpdatingDataframe dataframe) {
this.id = dataframe.getStrings("id");
this.type = dataframe.getStrings("type");
this.rpcl2 = dataframe.getInts("rpcl2");
}

void create(Network network, int row) {
String generatorId = this.id.get(row);
Generator g = network.getGenerator(generatorId);
if (g == null) {
throw new PowsyblException("Invalid generator id : could not find " + generatorId);
}
var adder = g.newExtension(SynchronizedGeneratorPropertiesAdder.class);
SeriesUtils.applyIfPresent(type, row, adder::withType);
SeriesUtils.applyBooleanIfPresent(rpcl2, row, adder::withRpcl2);
adder.add();
}
}

@Override
public void addElements(Network network, UpdatingDataframe dataframe) {
SynchronizedGeneratorPropertiesSeries series = new SynchronizedGeneratorPropertiesSeries(dataframe);
for (int row = 0; row < dataframe.getRowCount(); row++) {
series.create(network, row);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* Copyright (c) 2021-2022, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.dataframe.dynamic.extensions;

import com.google.auto.service.AutoService;
import com.powsybl.commons.PowsyblException;
import com.powsybl.dataframe.network.ExtensionInformation;
import com.powsybl.dataframe.network.NetworkDataframeMapper;
import com.powsybl.dataframe.network.NetworkDataframeMapperBuilder;
import com.powsybl.dataframe.network.adders.NetworkElementAdder;
import com.powsybl.dataframe.network.extensions.AbstractSingleDataframeNetworkExtension;
import com.powsybl.dataframe.network.extensions.NetworkExtensionDataframeProvider;
import com.powsybl.dynawo.extensions.api.generator.RpclType;
import com.powsybl.dynawo.extensions.api.generator.SynchronizedGeneratorProperties;
import com.powsybl.iidm.network.Generator;
import com.powsybl.iidm.network.Network;

import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

/**
* @author Gautier Bureau {@literal <gautier.bureau at rte-france.com>}
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
@AutoService(NetworkExtensionDataframeProvider.class)
public class SynchronizedGeneratorPropertiesDataframeProvider extends AbstractSingleDataframeNetworkExtension {

@Override
public String getExtensionName() {
return SynchronizedGeneratorProperties.NAME;
}

@Override
public ExtensionInformation getExtensionInformation() {
return new ExtensionInformation(SynchronizedGeneratorProperties.NAME,
"Provides information, for dynamic simulation only, about the characteristics of a Synchronized generator",
"index : id (str), " +
"type (str), " +
"rpcl2 (bool)");
}

private Stream<SynchronizedGeneratorProperties> itemsStream(Network network) {
return network.getGeneratorStream()
.map(g -> (SynchronizedGeneratorProperties) g.getExtension(SynchronizedGeneratorProperties.class))
.filter(Objects::nonNull);
}

private SynchronizedGeneratorProperties getOrThrow(Network network, String id) {
Generator gen = network.getGenerator(id);
if (gen == null) {
throw new PowsyblException("Generator '" + id + "' not found");
}
SynchronizedGeneratorProperties sgp = gen.getExtension(SynchronizedGeneratorProperties.class);
if (sgp == null) {
throw new PowsyblException("Generator '" + id + "' has no SynchronizedGeneratorProperties extension");
}
return sgp;
}

@Override
public NetworkDataframeMapper createMapper() {
return NetworkDataframeMapperBuilder.ofStream(this::itemsStream, this::getOrThrow)
.stringsIndex("id", ext -> ext.getExtendable().getId())
.strings("type", sgp -> String.valueOf(sgp.getType()), SynchronizedGeneratorProperties::setType)
.booleans("rpcl2", SynchronizedGeneratorProperties::isRpcl2, (sgp, b) -> sgp.setRpcl(b ? RpclType.RPCL2 : RpclType.NONE))
.build();
}

@Override
public void removeExtensions(Network network, List<String> ids) {
ids.stream().filter(Objects::nonNull)
.map(network::getGenerator)
.filter(Objects::nonNull)
.forEach(g -> g.removeExtension(SynchronizedGeneratorProperties.class));
}

@Override
public NetworkElementAdder createAdder() {
return new SynchronizedGeneratorPropertiesDataframeAdder();
}

}
Loading