Skip to content

Commit

Permalink
Remove LoadsVariation::VariationMode
Browse files Browse the repository at this point in the history
Add Proportional Scalable loads
Config maven.yml

Signed-off-by: lisrte <[email protected]>
Lisrte committed Jan 6, 2025
1 parent 1e8faf2 commit d073157
Showing 18 changed files with 231 additions and 85 deletions.
11 changes: 10 additions & 1 deletion .github/workflows/maven.yml
Original file line number Diff line number Diff line change
@@ -18,7 +18,16 @@ jobs:

steps:
- name: Checkout sources
uses: actions/checkout@v1
uses: actions/checkout@v4
with:
path: main

- name: Checkout powsybl-core branch
uses: actions/checkout@v4
with:
repository: powsybl/powsybl-core
ref: refs/heads/scalable_access
path: powsybl-core

- name: Set up JDK 17
uses: actions/setup-java@v1
Original file line number Diff line number Diff line change
@@ -72,7 +72,7 @@ void testIeee14() {
assertEquals(27, result.getCurves().size());
DoubleTimeSeries ts1 = result.getCurve("_GEN____1_SM_generator_UStatorPu");
assertEquals("_GEN____1_SM_generator_UStatorPu", ts1.getMetadata().getName());
assertEquals(192, ts1.toArray().length);
assertEquals(258, ts1.toArray().length);
assertEquals(14, result.getFinalStateValues().size());
assertEquals(1.046227, result.getFinalStateValues().get("NETWORK__BUS___10_TN_Upu_value"));
List<TimelineEvent> timeLine = result.getTimeLine();
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.powsybl.dynawo.DynawoSimulationConstants;
import com.powsybl.dynawo.commons.DynawoConstants;
import com.powsybl.dynawo.margincalculation.loadsvariation.LoadVariationAreaAutomationSystem;
import com.powsybl.dynawo.margincalculation.loadsvariation.LoadsProportionalScalable;
import com.powsybl.dynawo.margincalculation.loadsvariation.LoadsVariation;
import com.powsybl.dynawo.DynawoSimulationContext;
import com.powsybl.dynawo.DynawoSimulationParameters;
@@ -22,9 +23,12 @@
import com.powsybl.dynawo.algorithms.ContingencyEventModels;
import com.powsybl.dynawo.algorithms.ContingencyEventModelsFactory;
import com.powsybl.dynawo.xml.DydDataSupplier;
import com.powsybl.iidm.modification.scalable.Scalable;
import com.powsybl.iidm.modification.scalable.ScalingParameters;
import com.powsybl.iidm.network.Network;

import java.util.*;
import java.util.function.BiConsumer;

/**
* @author Laurent Issertial <laurent.issertial at rte-france.com>
@@ -60,7 +64,10 @@ public MarginCalculationContext(Network network, String workingVariantId,
this.marginCalculationParameters = parameters;
double contingenciesStartTime = parameters.getContingenciesStartTime();
this.contingencyEventModels = ContingencyEventModelsFactory.createFrom(contingencies, this, macroConnectionsAdder, contingenciesStartTime, reportNode);
this.loadVariationArea = new LoadVariationAreaAutomationSystem(loadsVariations, parameters.getLoadIncreaseStartTime(), parameters.getLoadIncreaseStopTime());
this.loadVariationArea = new LoadVariationAreaAutomationSystem(loadsVariations,
parameters.getLoadIncreaseStartTime(),
parameters.getLoadIncreaseStopTime(),
getScalableConfig(network));

macroConnectionsAdder.setMacroConnectorAdder(loadVariationMacroConnectorsMap::computeIfAbsent);
macroConnectionsAdder.setMacroConnectAdder(loadVariationMacroConnectList::add);
@@ -104,4 +111,11 @@ public String getParFileName() {
}
};
}

private static BiConsumer<LoadsProportionalScalable, Double> getScalableConfig(Network network) {
ScalingParameters scalingParameters = new ScalingParameters()
.setScalingConvention(Scalable.ScalingConvention.LOAD)
.setConstantPowerFactor(true);
return (s, v) -> s.scale(network, v, scalingParameters);
}
}
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@
import com.powsybl.dynawo.algorithms.AbstractDynawoAlgorithmsHandler;
import com.powsybl.dynawo.algorithms.xml.ContingenciesDydXml;
import com.powsybl.dynawo.algorithms.xml.ContingenciesParXml;
import com.powsybl.dynawo.margincalculation.results.MarginCalculationReport;
import com.powsybl.dynawo.margincalculation.results.MarginCalculationResult;
import com.powsybl.dynawo.margincalculation.results.XmlMarginCalculationResultParser;
import com.powsybl.dynawo.margincalculation.xml.MultipleJobsXml;

@@ -26,19 +26,19 @@
/**
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
public class MarginCalculationHandler extends AbstractDynawoAlgorithmsHandler<MarginCalculationReport, MarginCalculationContext> {
public class MarginCalculationHandler extends AbstractDynawoAlgorithmsHandler<MarginCalculationResult, MarginCalculationContext> {

public MarginCalculationHandler(MarginCalculationContext context, Command command, ReportNode reportNode) {
super(context, command, reportNode);
}

@Override
public MarginCalculationReport after(Path workingDir, ExecutionReport report) throws IOException {
public MarginCalculationResult after(Path workingDir, ExecutionReport report) throws IOException {
super.after(workingDir, report);
context.getNetwork().getVariantManager().setWorkingVariant(context.getWorkingVariantId());
Path resultsFile = workingDir.resolve(AGGREGATED_RESULTS);
new XmlMarginCalculationResultParser().parse(resultsFile);
return new MarginCalculationReport(new XmlMarginCalculationResultParser().parse(resultsFile));
return new MarginCalculationResult(new XmlMarginCalculationResultParser().parse(resultsFile));
}

@Override
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
import com.powsybl.dynawo.commons.DynawoUtil;
import com.powsybl.dynawo.commons.PowsyblDynawoVersion;
import com.powsybl.dynawo.margincalculation.loadsvariation.supplier.LoadsVariationSupplier;
import com.powsybl.dynawo.margincalculation.results.MarginCalculationReport;
import com.powsybl.dynawo.margincalculation.results.MarginCalculationResult;
import com.powsybl.dynawo.models.utils.BlackBoxSupplierUtils;
import com.powsybl.dynawo.algorithms.DynawoAlgorithmsConfig;
import com.powsybl.iidm.network.Network;
@@ -52,7 +52,7 @@ public MarginCalculationProvider(DynawoAlgorithmsConfig config) {
this.config = Objects.requireNonNull(config);
}

public CompletableFuture<MarginCalculationReport> run(Network network, String workingVariantId,
public CompletableFuture<MarginCalculationResult> run(Network network, String workingVariantId,
DynamicModelsSupplier dynamicModelsSupplier,
ContingenciesProvider contingenciesProvider,
LoadsVariationSupplier loadsVariationSupplier,
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/**
* Copyright (c) 2024, 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.dynawo.margincalculation.loadsvariation;

import com.powsybl.iidm.modification.scalable.LoadScalable;
import com.powsybl.iidm.network.Load;

/**
* The scaled P and Q are not set in the given load but kept in properties, contrary to {@link LoadScalable}
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
public class CalculatedLoadScalable extends LoadScalable implements CalculatedPower {

private Double calculatedP0 = Double.NaN;
private Double calculatedQ0 = Double.NaN;

CalculatedLoadScalable(String id) {
super(id);
}

@Override
protected void setP0(Load l, double value) {
calculatedP0 = value;
}

@Override
protected double getP0(Load l) {
return calculatedP0.isNaN() ? l.getP0() : calculatedP0;
}

@Override
protected void setQ0(Load l, double value) {
calculatedQ0 = value;
}

@Override
protected double getQ0(Load l) {
return calculatedQ0.isNaN() ? l.getQ0() : calculatedQ0;
}

@Override
public Double getCalculatedP0() {
return calculatedP0;
}

@Override
public Double getCalculatedQ0() {
return calculatedQ0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/**
* Copyright (c) 2025, 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.dynawo.margincalculation.loadsvariation;

/**
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
public interface CalculatedPower {

Double getCalculatedP0();

Double getCalculatedQ0();
}
Original file line number Diff line number Diff line change
@@ -19,6 +19,7 @@

import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

import static com.powsybl.dynawo.parameters.ParameterType.DOUBLE;
@@ -36,12 +37,16 @@ public class LoadVariationAreaAutomationSystem extends AbstractPureDynamicBlackB
private final List<LoadsVariation> loadsVariations;
private final double loadIncreaseStartTime;
private final double loadIncreaseStopTime;
private final BiConsumer<LoadsProportionalScalable, Double> scalingConfig;

public LoadVariationAreaAutomationSystem(List<LoadsVariation> loadsVariations, double loadIncreaseStartTime, double loadIncreaseStopTime) {
public LoadVariationAreaAutomationSystem(List<LoadsVariation> loadsVariations, double loadIncreaseStartTime,
double loadIncreaseStopTime,
BiConsumer<LoadsProportionalScalable, Double> scalingConfig) {
super(ID, PAR_ID, MODEL_CONFIG);
this.loadsVariations = Objects.requireNonNull(loadsVariations);
this.loadIncreaseStartTime = loadIncreaseStartTime;
this.loadIncreaseStopTime = loadIncreaseStopTime;
this.scalingConfig = scalingConfig;
}

@Override
@@ -63,12 +68,13 @@ private List<VarConnection> getVarConnectionsWith(ControllableLoadModel connecte
@Override
public void createDynamicModelParameters(DynawoSimulationContext context, Consumer<ParametersSet> parametersAdder) {
ParametersSet paramSet = new ParametersSet(getParameterSetId());
//TODO calc delta
int index = 0;
for (LoadsVariation lv : loadsVariations) {
for (Load load : lv.loads()) {
paramSet.addParameter("deltaP_load_" + index, DOUBLE, String.valueOf(1));
paramSet.addParameter("deltaQ_load_" + index, DOUBLE, String.valueOf(1));
LoadsProportionalScalable proportionalScalable = new LoadsProportionalScalable(lv.loads());
scalingConfig.accept(proportionalScalable, lv.variationValue());
for (CalculatedPower load : proportionalScalable.getLoadScalable()) {
paramSet.addParameter("deltaP_load_" + index, DOUBLE, String.valueOf(load.getCalculatedP0()));
paramSet.addParameter("deltaQ_load_" + index, DOUBLE, String.valueOf(load.getCalculatedQ0()));
index++;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* Copyright (c) 2024, 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.dynawo.margincalculation.loadsvariation;

import com.powsybl.iidm.modification.scalable.ProportionalScalable;
import com.powsybl.iidm.network.Load;

import java.util.List;

import static com.powsybl.iidm.modification.scalable.ProportionalScalable.DistributionMode.PROPORTIONAL_TO_P0;

/**
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
*/
public class LoadsProportionalScalable extends ProportionalScalable {

public LoadsProportionalScalable(List<Load> loads) {
super(loads, i ->
new CalculatedLoadScalable(i.getId()), PROPORTIONAL_TO_P0, -Double.MAX_VALUE, Double.MAX_VALUE);
}

public List<CalculatedPower> getLoadScalable() {
return getScalables().stream().map(CalculatedPower.class::cast).toList();
}
}
Original file line number Diff line number Diff line change
@@ -14,10 +14,5 @@
/**
* @author Laurent Issertial <laurent.issertial at rte-france.com>
*/
public record LoadsVariation(List<Load> loads, double variationValue, VariationMode variationMode) {

//TODO complete
public enum VariationMode {
PROPORTIONAL
}
public record LoadsVariation(List<Load> loads, double variationValue) {
}
Original file line number Diff line number Diff line change
@@ -29,7 +29,6 @@ public class LoadsVariationBuilder {

private final BuilderEquipmentsList<Load> loads;
private double variationValue = Double.NaN;
private LoadsVariation.VariationMode mode;

public LoadsVariationBuilder(Network network, ReportNode reportNode) {
this.network = Objects.requireNonNull(network);
@@ -38,22 +37,22 @@ public LoadsVariationBuilder(Network network, ReportNode reportNode) {
}

public LoadsVariationBuilder loads(String... loadIds) {
loads.addEquipments(loadIds, network::getLoad);
loads.addEquipments(loadIds, this::getConnectedLoad);
return this;
}

public LoadsVariationBuilder loads(Collection<String> loadIds) {
loads.addEquipments(loadIds, network::getLoad);
loads.addEquipments(loadIds, this::getConnectedLoad);
return this;
}

public LoadsVariationBuilder variationValue(double variationValue) {
this.variationValue = variationValue;
return this;
private Load getConnectedLoad(String loadId) {
Load load = network.getLoad(loadId);
return load != null && load.getTerminal().isConnected() ? load : null;
}

public LoadsVariationBuilder variationMode(LoadsVariation.VariationMode mode) {
this.mode = mode;
public LoadsVariationBuilder variationValue(double variationValue) {
this.variationValue = variationValue;
return this;
}

@@ -63,10 +62,6 @@ protected void checkData() {
BuilderReports.reportFieldNotSet(reportNode, "variationValue");
isInstantiable = false;
}
if (mode == null) {
BuilderReports.reportFieldNotSet(reportNode, "variationMode");
isInstantiable = false;
}
}

private boolean isInstantiable() {
@@ -78,6 +73,6 @@ private boolean isInstantiable() {
}

public LoadsVariation build() {
return isInstantiable() ? new LoadsVariation(loads.getEquipments(), variationValue, mode) : null;
return isInstantiable() ? new LoadsVariation(loads.getEquipments(), variationValue) : null;
}
}
Original file line number Diff line number Diff line change
@@ -52,32 +52,15 @@ private LoadsVariationBuilder parseLoadsVariationBuilder(JsonParser parser) {
JsonUtil.parseObject(parser, name -> {
boolean handled = true;
switch (name) {
case "loadsIds" -> {
List<String> loadsIds = new ArrayList<>();
JsonUtil.parseObjectArray(parser, loadsIds::add, this::parseLoadsIds);
loadsVariationBuilder.loads(loadsIds);
case "loadsIds" -> loadsVariationBuilder.loads(JsonUtil.parseStringArray(parser));
case "variationValue" -> {
parser.nextToken();
loadsVariationBuilder.variationValue(parser.getDoubleValue());
}
case "variationValue" -> loadsVariationBuilder.variationValue(Double.parseDouble(parser.nextTextValue()));
case "variationMode" -> loadsVariationBuilder.variationMode(LoadsVariation.VariationMode.valueOf(parser.nextTextValue()));
default -> handled = false;
}
return handled;
});
return loadsVariationBuilder;
}

//TODO check json model
private String parseLoadsIds(JsonParser parser) {
var temp = new Object() {
String loadId;
};
JsonUtil.parseObject(parser, name -> {
if (name.equals("id")) {
temp.loadId = parser.nextTextValue();
return true;
}
return false;
});
return temp.loadId;
}
}
Loading

0 comments on commit d073157

Please sign in to comment.