From 59596329064fdd9a2439ab5eacd8ed52a84aa616 Mon Sep 17 00:00:00 2001 From: cluke Date: Thu, 17 Nov 2022 13:00:43 +0100 Subject: [PATCH 01/11] ADD: lowImpedanceThreshold is now a parameter in LfNetworkParameters, OpenLoadFlowParameters and AcEquationSystemCreationParameters Signed-off-by: cluke --- .../openloadflow/OpenLoadFlowParameters.java | 21 ++++++++++++++++++- .../AcEquationSystemCreationParameters.java | 19 +++++++++++++++-- .../network/LfNetworkParameters.java | 13 ++++++++++++ .../OpenLoadFlowProviderTest.java | 4 ++-- ...NonImpedantBranchWithBreakerIssueTest.java | 4 ++-- src/test/resources/debug-parameters.json | 1 + 6 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java index b8fac2a827..7ea3c452a0 100644 --- a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java +++ b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java @@ -95,6 +95,8 @@ public class OpenLoadFlowParameters extends AbstractExtension properties) { .ifPresent(prop -> this.setTransformerVoltageControlMode(TransformerVoltageControlMode.valueOf(prop))); Optional.ofNullable(properties.get(DC_POWER_FACTOR_NAME)) .ifPresent(prop -> this.setDcPowerFactor(Double.parseDouble(prop))); + Optional.ofNullable(properties.get(LOW_IMPEDANCE_THRESHOLD_NAME)) + .ifPresent(prop -> this.setLowImpedanceThreshold(Double.parseDouble(prop))); Optional.ofNullable(properties.get(MIN_PLAUSIBLE_TARGET_VOLTAGE_NAME)) .ifPresent(prop -> this.setMinPlausibleTargetVoltage(Double.parseDouble(prop))); Optional.ofNullable(properties.get(MAX_PLAUSIBLE_TARGET_VOLTAGE_NAME)) @@ -501,6 +518,7 @@ public String toString() { ", voltageInitModeOverride=" + voltageInitModeOverride + ", transformerVoltageControlMode=" + transformerVoltageControlMode + ", dcPowerFactor=" + dcPowerFactor + + ", lowImpedanceThreshold=" + lowImpedanceThreshold + ", minPlausibleTargetVoltage=" + minPlausibleTargetVoltage + ", maxPlausibleTargetVoltage=" + maxPlausibleTargetVoltage + ", minRealisticVoltage=" + minRealisticVoltage + @@ -631,6 +649,7 @@ static LfNetworkParameters getNetworkParameters(LoadFlowParameters parameters, O .setVoltagePerReactivePowerControl(parametersExt.isVoltagePerReactivePowerControl()) .setReactivePowerRemoteControl(parametersExt.hasReactivePowerRemoteControl()) .setDc(parameters.isDc()) + .setLowImpedanceThreshold(parametersExt.getLowImpedanceThreshold()) .setShuntVoltageControl(parameters.isShuntCompensatorVoltageControlOn()) .setReactiveLimits(!parameters.isNoGeneratorReactiveLimits()) .setHvdcAcEmulation(parameters.isHvdcAcEmulation()) @@ -662,7 +681,7 @@ public static AcLoadFlowParameters createAcParameters(LoadFlowParameters paramet var networkParameters = getNetworkParameters(parameters, parametersExt, slackBusSelector, connectivityFactory, breakers); - var equationSystemCreationParameters = new AcEquationSystemCreationParameters(forceA1Var); + var equationSystemCreationParameters = new AcEquationSystemCreationParameters(forceA1Var, parametersExt.getLowImpedanceThreshold()); VoltageInitializer voltageInitializer = getExtendedVoltageInitializer(parameters, parametersExt, networkParameters, matrixFactory, reporter); diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java index 0ef3607f2b..f9b51e0d39 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java @@ -6,6 +6,8 @@ */ package com.powsybl.openloadflow.ac.equations; +import com.powsybl.openloadflow.network.LfNetworkParameters; + /** * @author Geoffroy Jamgotchian */ @@ -13,22 +15,35 @@ public class AcEquationSystemCreationParameters { private final boolean forceA1Var; + private double lowImpedanceThreshold; + public AcEquationSystemCreationParameters() { - this(false); + this(false, LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); } - public AcEquationSystemCreationParameters(boolean forceA1Var) { + public AcEquationSystemCreationParameters(boolean forceA1Var, double lowImpedanceThreshold) { this.forceA1Var = forceA1Var; + this.lowImpedanceThreshold = lowImpedanceThreshold; } public boolean isForceA1Var() { return forceA1Var; } + public double getLowImpedanceThreshold() { + return lowImpedanceThreshold; + } + + public AcEquationSystemCreationParameters setLowImpedanceThreshold(double lowImpedanceThreshold) { + this.lowImpedanceThreshold = lowImpedanceThreshold; + return this; + } + @Override public String toString() { return "AcEquationSystemCreationParameters(" + "forceA1Var=" + forceA1Var + + ", lowImpedanceThreshold=" + lowImpedanceThreshold + ')'; } } diff --git a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java index 9cf12c0eb3..57c66bc0d2 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java @@ -29,6 +29,8 @@ public class LfNetworkParameters { public static final double MAX_PLAUSIBLE_TARGET_VOLTAGE_DEFAULT_VALUE = 1.2; + public static final double LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE = Math.pow(10, -8); // in per unit + public static final OpenLoadFlowParameters.ReactiveRangeCheckMode REACTIVE_RANGE_CHECK_MODE_DEFAULT_VALUE = OpenLoadFlowParameters.ReactiveRangeCheckMode.MAX; private SlackBusSelector slackBusSelector = new FirstSlackBusSelector(); @@ -71,6 +73,8 @@ public class LfNetworkParameters { private double minPlausibleTargetVoltage = MIN_PLAUSIBLE_TARGET_VOLTAGE_DEFAULT_VALUE; + private double lowImpedanceThreshold = LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE; + private double maxPlausibleTargetVoltage = MAX_PLAUSIBLE_TARGET_VOLTAGE_DEFAULT_VALUE; private Set loaderPostProcessorSelection = Collections.emptySet(); @@ -266,6 +270,15 @@ public LfNetworkParameters setMaxPlausibleTargetVoltage(double maxPlausibleTarge return this; } + public double getLowImpedanceThreshold() { + return lowImpedanceThreshold; + } + + public LfNetworkParameters setLowImpedanceThreshold(double lowImpedanceThreshold) { + this.lowImpedanceThreshold = lowImpedanceThreshold; + return this; + } + public OpenLoadFlowParameters.ReactiveRangeCheckMode getReactiveRangeCheckMode() { return reactiveRangeCheckMode; } diff --git a/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java b/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java index 9fa8d99f2a..f1857d718b 100644 --- a/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java +++ b/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java @@ -58,7 +58,7 @@ void testDcParameters() { void testAcParameters() { Network network = Mockito.mock(Network.class); AcLoadFlowParameters acParameters = OpenLoadFlowParameters.createAcParameters(network, new LoadFlowParameters().setReadSlackBus(true), new OpenLoadFlowParameters(), new DenseMatrixFactory(), new EvenShiloachGraphDecrementalConnectivityFactory<>(), Reporter.NO_OP, false, false); - assertEquals("AcLoadFlowParameters(networkParameters=LfNetworkParameters(slackBusSelector=NetworkSlackBusSelector, connectivityFactory=EvenShiloachGraphDecrementalConnectivityFactory, generatorVoltageRemoteControl=true, minImpedance=false, twtSplitShuntAdmittance=false, breakers=false, plausibleActivePowerLimit=5000.0, addRatioToLinesWithDifferentNominalVoltageAtBothEnds=true, computeMainConnectedComponentOnly=true, countriesToBalance=[], distributedOnConformLoad=false, phaseControl=false, transformerVoltageControl=false, voltagePerReactivePowerControl=false, reactivePowerRemoteControl=false, dc=false, reactiveLimits=true, hvdcAcEmulation=true, minPlausibleTargetVoltage=0.8, maxPlausibleTargetVoltage=1.2, loaderPostProcessorSelection=[], reactiveRangeCheckMode=MAX), equationSystemCreationParameters=AcEquationSystemCreationParameters(forceA1Var=false), newtonRaphsonParameters=NewtonRaphsonParameters(maxIteration=30, minRealisticVoltage=0.5, maxRealisticVoltage=1.5, stoppingCriteria=DefaultNewtonRaphsonStoppingCriteria), outerLoops=[DistributedSlackOuterLoop, ReactiveLimitsOuterLoop], matrixFactory=DenseMatrixFactory, voltageInitializer=UniformValueVoltageInitializer)", + assertEquals("AcLoadFlowParameters(networkParameters=LfNetworkParameters(slackBusSelector=NetworkSlackBusSelector, connectivityFactory=EvenShiloachGraphDecrementalConnectivityFactory, generatorVoltageRemoteControl=true, minImpedance=false, twtSplitShuntAdmittance=false, breakers=false, plausibleActivePowerLimit=5000.0, addRatioToLinesWithDifferentNominalVoltageAtBothEnds=true, computeMainConnectedComponentOnly=true, countriesToBalance=[], distributedOnConformLoad=false, phaseControl=false, transformerVoltageControl=false, voltagePerReactivePowerControl=false, reactivePowerRemoteControl=false, dc=false, reactiveLimits=true, hvdcAcEmulation=true, minPlausibleTargetVoltage=0.8, maxPlausibleTargetVoltage=1.2, loaderPostProcessorSelection=[], reactiveRangeCheckMode=MAX), equationSystemCreationParameters=AcEquationSystemCreationParameters(forceA1Var=false, lowImpedanceThreshold=1.0E-8), newtonRaphsonParameters=NewtonRaphsonParameters(maxIteration=30, minRealisticVoltage=0.5, maxRealisticVoltage=1.5, stoppingCriteria=DefaultNewtonRaphsonStoppingCriteria), outerLoops=[DistributedSlackOuterLoop, ReactiveLimitsOuterLoop], matrixFactory=DenseMatrixFactory, voltageInitializer=UniformValueVoltageInitializer)", acParameters.toString()); } @@ -86,7 +86,7 @@ void testGetExtendedVoltageInitializer() { @Test void specificParametersTest() { OpenLoadFlowProvider provider = new OpenLoadFlowProvider(); - assertEquals(21, provider.getSpecificParametersNames().size()); + assertEquals(22, provider.getSpecificParametersNames().size()); LoadFlowParameters parameters = new LoadFlowParameters(); provider.loadSpecificParameters(Collections.emptyMap()) diff --git a/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java b/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java index 0185192dcf..43bec3e2f1 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java @@ -37,7 +37,7 @@ void busBreakerAndNonImpedantBranchIssue() { network.getGenerator("G2").newMinMaxReactiveLimits().setMaxQ(100).setMinQ(-100).add(); LfNetworkParameters networkParameters = new LfNetworkParameters() .setBreakers(true); - AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false); + AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false, networkParameters.getLowImpedanceThreshold()); NewtonRaphsonParameters newtonRaphsonParameters = new NewtonRaphsonParameters(); LfNetwork lfNetwork = Networks.load(network, networkParameters).get(0); AcLoadFlowParameters acLoadFlowParameters = new AcLoadFlowParameters(networkParameters, equationSystemCreationParameters, @@ -61,7 +61,7 @@ void busBreakerAndNonImpedantBranchIssueRef() { Network network = NodeBreakerNetworkFactory.create3barsAndJustOneVoltageLevel(); LfNetworkParameters networkParameters = new LfNetworkParameters(); LfNetwork lfNetwork = Networks.load(network, networkParameters).get(0); - AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false); + AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false, networkParameters.getLowImpedanceThreshold()); NewtonRaphsonParameters newtonRaphsonParameters = new NewtonRaphsonParameters(); AcLoadFlowParameters acLoadFlowParameters = new AcLoadFlowParameters(networkParameters, equationSystemCreationParameters, newtonRaphsonParameters, Collections.emptyList(), diff --git a/src/test/resources/debug-parameters.json b/src/test/resources/debug-parameters.json index f8d7a0f707..02983b2897 100644 --- a/src/test/resources/debug-parameters.json +++ b/src/test/resources/debug-parameters.json @@ -33,6 +33,7 @@ "voltageInitModeOverride" : "NONE", "transformerVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", "dcPowerFactor" : 1.0, + "lowImpedanceThreshold" : 1.0E-8, "minPlausibleTargetVoltage" : 0.8, "maxPlausibleTargetVoltage" : 1.2, "minRealisticVoltage" : 0.5, From 2b2ac0affb65b78b031ceee3ad4b56f1e762cb5e Mon Sep 17 00:00:00 2001 From: cluke Date: Thu, 17 Nov 2022 14:33:17 +0100 Subject: [PATCH 02/11] ADD: lowImpedanceThreshold is now a parameter in VoltageMagnitudeInitializer Signed-off-by: cluke --- .../openloadflow/FullVoltageInitializer.java | 6 +++--- .../ac/VoltageMagnitudeInitializer.java | 8 ++++---- .../ac/outerloop/AcloadFlowEngine.java | 2 +- .../openloadflow/dc/DcValueVoltageInitializer.java | 2 +- .../util/PreviousValueVoltageInitializer.java | 2 +- .../util/UniformValueVoltageInitializer.java | 2 +- .../network/util/VoltageInitializer.java | 2 +- .../openloadflow/FullVoltageInitializerTest.java | 2 +- .../ac/VoltageMagnitudeInitializerTest.java | 14 +++++++------- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java index 8ab1661ddf..7b63d7e9fa 100644 --- a/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java @@ -32,9 +32,9 @@ public FullVoltageInitializer(VoltageMagnitudeInitializer magnitudeInitializer, } @Override - public void prepare(LfNetwork network) { - magnitudeInitializer.prepare(network); - angleInitializer.prepare(network); + public void prepare(LfNetwork network, double lowImpedanceThreshold) { + magnitudeInitializer.prepare(network, lowImpedanceThreshold); + angleInitializer.prepare(network, lowImpedanceThreshold); } @Override diff --git a/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java b/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java index 9310c597ca..216bd0aac1 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java @@ -87,7 +87,7 @@ public static final class InitVmBusEquationTerm extends AbstractBusEquationTerm< private final TDoubleArrayList der; - public InitVmBusEquationTerm(LfBus bus, VariableSet variableSet) { + public InitVmBusEquationTerm(LfBus bus, VariableSet variableSet, double lowImpedanceThreshold) { super(bus); Map> neighbors = bus.findNeighbors(); @@ -108,7 +108,7 @@ public InitVmBusEquationTerm(LfBus bus, VariableSet variable double r = 0; for (LfBranch neighborBranch : neighborBranches) { PiModel piModel = neighborBranch.getPiModel(); - double x = Math.max(Math.abs(piModel.getX()), LfBranch.LOW_IMPEDANCE_THRESHOLD); // to void issue with negative reactances + double x = Math.max(Math.abs(piModel.getX()), lowImpedanceThreshold); // to avoid issues with negative reactances b += 1 / x; r += neighborBranch.getBus1() == bus ? 1 / piModel.getR1() : piModel.getR1(); } @@ -181,7 +181,7 @@ private static void initTarget(Equation } @Override - public void prepare(LfNetwork network) { + public void prepare(LfNetwork network, double lowImpedanceThreshold) { Stopwatch stopwatch = Stopwatch.createStarted(); // create the equation system: @@ -202,7 +202,7 @@ public void prepare(LfNetwork network) { .addTerm(v); } else { equationSystem.createEquation(bus.getNum(), InitVmEquationType.BUS_ZERO) - .addTerm(new InitVmBusEquationTerm(bus, equationSystem.getVariableSet())) + .addTerm(new InitVmBusEquationTerm(bus, equationSystem.getVariableSet(), lowImpedanceThreshold)) .addTerm(v.minus()); } } diff --git a/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java b/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java index 1a179eaa94..c66f8e7671 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java +++ b/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java @@ -86,7 +86,7 @@ public AcLoadFlowResult run() { // in case of a DC voltage initializer, an DC equation system in created and equations are attached // to the network. It is important that DC init is done before AC equation system is created by // calling ACLoadContext.getEquationSystem to avoid DC equations overwrite AC ones in the network. - voltageInitializer.prepare(context.getNetwork()); + voltageInitializer.prepare(context.getNetwork(), context.getParameters().getNetworkParameters().getLowImpedanceThreshold()); RunningContext runningContext = new RunningContext(); NewtonRaphson newtonRaphson = new NewtonRaphson(context.getNetwork(), diff --git a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java index 9160eeb0a3..adb4f2f59f 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java @@ -46,7 +46,7 @@ public DcValueVoltageInitializer(LfNetworkParameters networkParameters, boolean } @Override - public void prepare(LfNetwork network) { + public void prepare(LfNetwork network, double lowImpedanceThreshold) { // in case of distributed slack, we need to save and restore generators and loads target p which might have been // modified by slack distribution, so that AC load flow can restart from original state List busStates = distributedSlack ? ElementState.save(network.getBuses(), BusDcState::save) : null; diff --git a/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java index bd6986e258..943d07219c 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java @@ -28,7 +28,7 @@ public PreviousValueVoltageInitializer(boolean defaultToUniformValue) { } @Override - public void prepare(LfNetwork network) { + public void prepare(LfNetwork network, double lowImpedanceThreshold) { // nothing to do } diff --git a/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java index cac0a6afcb..08d25bdff9 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java @@ -15,7 +15,7 @@ public class UniformValueVoltageInitializer implements VoltageInitializer { @Override - public void prepare(LfNetwork network) { + public void prepare(LfNetwork network, double lowImpedanceThreshold) { // nothing to do } diff --git a/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java index dadc3e2219..88449c0b88 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java @@ -14,7 +14,7 @@ */ public interface VoltageInitializer { - void prepare(LfNetwork network); + void prepare(LfNetwork network, double lowImpedanceThreshold); double getMagnitude(LfBus bus); diff --git a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java index bca05d0c57..9ebff4d6a3 100644 --- a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java @@ -41,7 +41,7 @@ void testEsgTuto1() { true, matrixFactory, Reporter.NO_OP)); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "VLGEN_0", 1.020833, 0); assertBusVoltage(lfNetwork, initializer, "VLHV1_0", 1.074561, -2.511475); assertBusVoltage(lfNetwork, initializer, "VLHV2_0", 1.074561, -6.439649); diff --git a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java index 7c76fbd19f..7dd0b99210 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java @@ -44,7 +44,7 @@ void testEsgTuto1() { Network network = EurostagTutorialExample1Factory.create(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "VLGEN_0", 1.020833, 0); assertBusVoltage(lfNetwork, initializer, "VLHV1_0", 1.074561, 0); assertBusVoltage(lfNetwork, initializer, "VLHV2_0", 1.074561, 0); @@ -56,7 +56,7 @@ void testIeee14() { Network network = IeeeCdfNetworkFactory.create14(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -79,7 +79,7 @@ void testZeroImpedanceBranch() { network.getLine("L9-14-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -102,7 +102,7 @@ void testZeroImpedanceBranchConnectedToPvBus() { network.getLine("L6-11-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -142,7 +142,7 @@ void testParallelBranch() { .add(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -164,7 +164,7 @@ void testZeroImpedanceLoop() { Network network = Importers.importData("XIIDM", new ResourceDataSource("init_v_zero_imp_loop", new ResourceSet("/", "init_v_zero_imp_loop.xiidm")), null); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "B_0", 0.982318, 0); assertBusVoltage(lfNetwork, initializer, "D_0", 0.982318, 0); assertBusVoltage(lfNetwork, initializer, "F_0", 0.982315, 0); @@ -198,7 +198,7 @@ void testWithTransformerVoltageControl() { .setTransformerVoltageControl(true); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), networkParameters).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(true, new DenseMatrixFactory()); - initializer.prepare(lfNetwork); + initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); From 7ad64abecb68f71da7144c2fc3fb8da31b5056ce Mon Sep 17 00:00:00 2001 From: cluke Date: Thu, 17 Nov 2022 14:56:20 +0100 Subject: [PATCH 03/11] ADD: lowImpedanceThreshold is now a parameter in DcEquationSystemCreationParameters *** There are CAIOTODO's to handle Signed-off-by: cluke --- .../openloadflow/OpenLoadFlowParameters.java | 3 ++- .../ac/equations/AcEquationSystem.java | 4 ++-- .../ac/equations/AcEquationSystemUpdater.java | 3 ++- .../openloadflow/dc/DcValueVoltageInitializer.java | 2 +- .../dc/equations/DcEquationSystem.java | 3 +-- .../DcEquationSystemCreationParameters.java | 14 +++++++++++++- .../com/powsybl/openloadflow/network/LfBranch.java | 2 +- .../powsybl/openloadflow/network/LfNetwork.java | 3 ++- .../network/impl/AbstractLfBranch.java | 6 +++--- .../network/impl/LfNetworkLoaderImpl.java | 3 ++- .../network/util/ZeroImpedanceFlows.java | 3 ++- .../openloadflow/sensi/DcSensitivityAnalysis.java | 3 ++- .../openloadflow/dc/DcLoadFlowMatrixTest.java | 3 ++- .../openloadflow/equations/EquationSystemTest.java | 2 +- 14 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java index 7ea3c452a0..ff94d0ae31 100644 --- a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java +++ b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java @@ -744,7 +744,8 @@ public static DcLoadFlowParameters createDcParameters(LoadFlowParameters paramet var equationSystemCreationParameters = new DcEquationSystemCreationParameters(true, false, forcePhaseControlOffAndAddAngle1Var, - parameters.isDcUseTransformerRatio()); + parameters.isDcUseTransformerRatio(), + parametersExt.getLowImpedanceThreshold()); return new DcLoadFlowParameters(networkParameters, equationSystemCreationParameters, diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java index 934d1e6ef0..12b8736675 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java @@ -247,7 +247,7 @@ private static List> createReactive List> terms = new ArrayList<>(); for (LfBranch branch : controllerBus.getBranches()) { EquationTerm q; - if (branch.isZeroImpedanceBranch(false)) { + if (branch.isZeroImpedanceBranch(false, creationParameters.getLowImpedanceThreshold())) { if (!branch.isSpanningTreeEdge()) { continue; } @@ -739,7 +739,7 @@ private static void createBranchEquations(LfBranch branch, EquationSystem equationSystem, AcEquationSystemCreationParameters creationParameters) { // create zero and non zero impedance branch equations - if (branch.isZeroImpedanceBranch(false)) { + if (branch.isZeroImpedanceBranch(false, creationParameters.getLowImpedanceThreshold())) { if (branch.isSpanningTreeEdge()) { createNonImpedantBranch(branch, branch.getBus1(), branch.getBus2(), equationSystem); } diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java index 72d3ea70d6..1bf4bf9a2a 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java @@ -45,7 +45,8 @@ public void onShuntVoltageControlChange(LfShunt controllerShunt, boolean newVolt } private void updateElementEquations(LfElement element, boolean enable) { - if (element instanceof LfBranch && ((LfBranch) element).isZeroImpedanceBranch(false)) { + double lowImpedanceThreshold = 1.0E-8; // CAIOTODO + if (element instanceof LfBranch && ((LfBranch) element).isZeroImpedanceBranch(false, lowImpedanceThreshold)) { LfBranch branch = (LfBranch) element; if (branch.isSpanningTreeEdge()) { // depending on the switch status, we activate either v1 = v2, ph1 = ph2 equations diff --git a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java index adb4f2f59f..bb714afef1 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java @@ -52,7 +52,7 @@ public void prepare(LfNetwork network, double lowImpedanceThreshold) { List busStates = distributedSlack ? ElementState.save(network.getBuses(), BusDcState::save) : null; DcLoadFlowParameters parameters = new DcLoadFlowParameters(networkParameters, - new DcEquationSystemCreationParameters(false, false, false, useTransformerRatio), + new DcEquationSystemCreationParameters(false, false, false, useTransformerRatio, lowImpedanceThreshold), matrixFactory, distributedSlack, balanceType, diff --git a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java index 7bbbc6c3a7..fc44686a58 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java +++ b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java @@ -108,11 +108,10 @@ private static void createImpedantBranch(EquationSystem equationSystem, DcEquationSystemCreationParameters creationParameters) { List nonImpedantBranches = new ArrayList<>(); - for (LfBranch branch : network.getBranches()) { LfBus bus1 = branch.getBus1(); LfBus bus2 = branch.getBus2(); - if (branch.isZeroImpedanceBranch(true)) { + if (branch.isZeroImpedanceBranch(true, creationParameters.getLowImpedanceThreshold())) { if (bus1 != null && bus2 != null) { nonImpedantBranches.add(branch); } diff --git a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java index e05444f07b..c1d9d17400 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java +++ b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java @@ -23,12 +23,15 @@ public class DcEquationSystemCreationParameters { private final boolean useTransformerRatio; + private double lowImpedanceThreshold; + public DcEquationSystemCreationParameters(boolean updateFlows, boolean indexTerms, boolean forcePhaseControlOffAndAddAngle1Var, - boolean useTransformerRatio) { + boolean useTransformerRatio, double lowImpedanceThreshold) { this.updateFlows = updateFlows; this.indexTerms = indexTerms; this.forcePhaseControlOffAndAddAngle1Var = forcePhaseControlOffAndAddAngle1Var; this.useTransformerRatio = useTransformerRatio; + this.lowImpedanceThreshold = lowImpedanceThreshold; } public boolean isUpdateFlows() { @@ -47,6 +50,15 @@ public boolean isUseTransformerRatio() { return useTransformerRatio; } + public double getLowImpedanceThreshold() { + return lowImpedanceThreshold; + } + + public DcEquationSystemCreationParameters setLowImpedanceThreshold(double lowImpedanceThreshold) { + this.lowImpedanceThreshold = lowImpedanceThreshold; + return this; + } + @Override public String toString() { return "DcEquationSystemCreationParameters(" + diff --git a/src/main/java/com/powsybl/openloadflow/network/LfBranch.java b/src/main/java/com/powsybl/openloadflow/network/LfBranch.java index 120d89697d..e14a307685 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfBranch.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfBranch.java @@ -141,7 +141,7 @@ default List getLimits2(LimitType type) { double computeApparentPower2(); - boolean isZeroImpedanceBranch(boolean dc); + boolean isZeroImpedanceBranch(boolean dc, double lowImpedanceThreshold); void setSpanningTreeEdge(boolean spanningTreeEdge); diff --git a/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java b/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java index 1febf6fa31..048dab5c09 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java @@ -518,7 +518,8 @@ public static List load(T network, LfNetworkLoader networkLoad * @return the zero-impedance subgraph */ public Graph createZeroImpedanceSubGraph(boolean dc) { - return createSubGraph(branch -> branch.isZeroImpedanceBranch(dc) + double lowImpedanceThreshold = 1.0E-8; // CAIOTODO + return createSubGraph(branch -> branch.isZeroImpedanceBranch(dc, lowImpedanceThreshold) && branch.getBus1() != null && branch.getBus2() != null); } diff --git a/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java b/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java index 8715e6ee35..d4d656bde3 100644 --- a/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java +++ b/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java @@ -244,11 +244,11 @@ public double computeApparentPower2() { } @Override - public boolean isZeroImpedanceBranch(boolean dc) { + public boolean isZeroImpedanceBranch(boolean dc, double lowImpedanceThreshold) { if (dc) { - return FastMath.abs(piModel.getX()) < LOW_IMPEDANCE_THRESHOLD; + return FastMath.abs(piModel.getX()) < lowImpedanceThreshold; } else { - return piModel.getZ() < LOW_IMPEDANCE_THRESHOLD; + return piModel.getZ() < lowImpedanceThreshold; } } diff --git a/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java b/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java index 620623cd50..320a76ed5b 100644 --- a/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java +++ b/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java @@ -318,11 +318,12 @@ public void visitHvdcConverterStation(HvdcConverterStation converterStation) private static void addBranch(LfNetwork lfNetwork, LfBranch lfBranch, LfNetworkLoadingReport report, boolean dc) { boolean connectedToSameBus = lfBranch.getBus1() == lfBranch.getBus2(); + double lowImpedanceThreshold = 1.0E-8; // CAIOTODO if (connectedToSameBus) { LOGGER.trace("Discard branch '{}' because connected to same bus at both ends", lfBranch.getId()); report.branchesDiscardedBecauseConnectedToSameBusAtBothEnds++; } else { - if (lfBranch.isZeroImpedanceBranch(dc)) { + if (lfBranch.isZeroImpedanceBranch(dc, lowImpedanceThreshold)) { LOGGER.trace("Branch {} is non impedant", lfBranch.getId()); report.nonImpedantBranches++; } diff --git a/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java b/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java index d81d0b8ce1..edd3c670c4 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java @@ -131,8 +131,9 @@ private PQ balanceWithImpedance(LfBus bus, boolean dc) { PQ balancePQ = new PQ(-bus.getP().eval(), -bus.getQ().eval()); // only lines with impedance + double lowImpedanceThreshold = 1.0E-8; // CAIOTODO List adjacentBranchesWithImpedance = bus.getBranches().stream() - .filter(branch -> !branch.isZeroImpedanceBranch(dc)).collect(Collectors.toList()); + .filter(branch -> !branch.isZeroImpedanceBranch(dc, lowImpedanceThreshold)).collect(Collectors.toList()); adjacentBranchesWithImpedance.forEach(branch -> { PQ branchFlow = getBranchFlow(branch, bus); diff --git a/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java b/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java index 9c76ba9084..01322f30d8 100644 --- a/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java +++ b/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java @@ -217,7 +217,8 @@ private static DcLoadFlowParameters createDcLoadFlowParameters(LfNetworkParamete var equationSystemCreationParameters = new DcEquationSystemCreationParameters(true, true, true, - lfParameters.isDcUseTransformerRatio()); + lfParameters.isDcUseTransformerRatio(), + networkParameters.getLowImpedanceThreshold()); return new DcLoadFlowParameters(networkParameters, equationSystemCreationParameters, diff --git a/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java b/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java index f0b9783618..bb2460599a 100644 --- a/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java +++ b/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java @@ -20,6 +20,7 @@ import com.powsybl.openloadflow.network.FirstSlackBusSelector; import com.powsybl.openloadflow.network.LfBus; import com.powsybl.openloadflow.network.LfNetwork; +import com.powsybl.openloadflow.network.LfNetworkParameters; import com.powsybl.openloadflow.network.impl.Networks; import com.powsybl.openloadflow.network.util.UniformValueVoltageInitializer; import org.junit.jupiter.api.Test; @@ -57,7 +58,7 @@ void buildDcMatrix() { List lfNetworks = Networks.load(network, new FirstSlackBusSelector()); LfNetwork mainNetwork = lfNetworks.get(0); - DcEquationSystemCreationParameters creationParameters = new DcEquationSystemCreationParameters(true, false, false, true); + DcEquationSystemCreationParameters creationParameters = new DcEquationSystemCreationParameters(true, false, false, true, new LfNetworkParameters().getLowImpedanceThreshold()); EquationSystem equationSystem = DcEquationSystem.create(mainNetwork, creationParameters); for (LfBus b : mainNetwork.getBuses()) { diff --git a/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java b/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java index dd84ea46a6..62ef4976e1 100644 --- a/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java +++ b/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java @@ -173,7 +173,7 @@ void writeDcSystemTest() { List lfNetworks = Networks.load(EurostagTutorialExample1Factory.create(), new FirstSlackBusSelector()); LfNetwork network = lfNetworks.get(0); - EquationSystem equationSystem = DcEquationSystem.create(network, new DcEquationSystemCreationParameters(true, false, false, true)); + EquationSystem equationSystem = DcEquationSystem.create(network, new DcEquationSystemCreationParameters(true, false, false, true, new LfNetworkParameters().getLowImpedanceThreshold())); String ref = String.join(System.lineSeparator(), "bus_target_φ0 = φ0", "bus_target_p1 = dc_p_2(φ0, φ1) + dc_p_1(φ1, φ2) + dc_p_1(φ1, φ2)", From 72d56ea0e8c1a488fc1d834dd4219f700de7caa5 Mon Sep 17 00:00:00 2001 From: cluke Date: Thu, 17 Nov 2022 15:33:56 +0100 Subject: [PATCH 04/11] ADD: lowImpedanceThreshold in ZeroImpedanceFlows *** There are CAIOTODO's to handle Signed-off-by: cluke --- .../openloadflow/OpenLoadFlowProvider.java | 10 +++---- .../openloadflow/network/LfNetwork.java | 3 +-- .../network/impl/LfNetworkLoaderImpl.java | 27 +++++++++---------- .../network/util/ZeroImpedanceFlows.java | 11 ++++---- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java index c2bd424725..539535ec74 100644 --- a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java +++ b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java @@ -127,7 +127,7 @@ private LoadFlowResult runAc(Network network, LoadFlowParameters parameters, Rep parameters.isDistributedSlack() && (parameters.getBalanceType() == LoadFlowParameters.BalanceType.PROPORTIONAL_TO_LOAD || parameters.getBalanceType() == LoadFlowParameters.BalanceType.PROPORTIONAL_TO_CONFORM_LOAD) && parametersExt.isLoadPowerFactorConstant(), parameters.isDc()); // zero or low impedance branch flows computation - computeZeroImpedanceFlows(result.getNetwork(), parameters.isDc()); + computeZeroImpedanceFlows(result.getNetwork(), parameters.isDc(), parametersExt.getLowImpedanceThreshold()); } LoadFlowResult.ComponentResult.Status status; @@ -159,11 +159,11 @@ private LoadFlowResult runAc(Network network, LoadFlowParameters parameters, Rep return new LoadFlowResultImpl(ok, Collections.emptyMap(), null, componentResults); } - private void computeZeroImpedanceFlows(LfNetwork network, boolean dc) { - Graph zeroImpedanceSubGraph = network.createZeroImpedanceSubGraph(dc); + private void computeZeroImpedanceFlows(LfNetwork network, boolean dc, double lowImpedanceThreshold) { + Graph zeroImpedanceSubGraph = network.createZeroImpedanceSubGraph(dc, lowImpedanceThreshold); if (!zeroImpedanceSubGraph.vertexSet().isEmpty()) { SpanningTreeAlgorithm.SpanningTree spanningTree = new KruskalMinimumSpanningTree<>(zeroImpedanceSubGraph).getSpanningTree(); - new ZeroImpedanceFlows(zeroImpedanceSubGraph, spanningTree).compute(dc); + new ZeroImpedanceFlows(zeroImpedanceSubGraph, spanningTree).compute(dc, lowImpedanceThreshold); } } @@ -197,7 +197,7 @@ private LoadFlowResult.ComponentResult processResult(Network network, DcLoadFlow false, true); // zero or low impedance branch flows computation - computeZeroImpedanceFlows(pResult.getNetwork(), true); + computeZeroImpedanceFlows(pResult.getNetwork(), true, OpenLoadFlowParameters.get(parameters).getLowImpedanceThreshold()); } return new LoadFlowResultImpl.ComponentResultImpl( diff --git a/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java b/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java index 048dab5c09..40f57f3f1e 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java @@ -517,8 +517,7 @@ public static List load(T network, LfNetworkLoader networkLoad * The graph is intentionally not cached as a parameter so far, to avoid the complexity of invalidating it if changes occur * @return the zero-impedance subgraph */ - public Graph createZeroImpedanceSubGraph(boolean dc) { - double lowImpedanceThreshold = 1.0E-8; // CAIOTODO + public Graph createZeroImpedanceSubGraph(boolean dc, double lowImpedanceThreshold) { return createSubGraph(branch -> branch.isZeroImpedanceBranch(dc, lowImpedanceThreshold) && branch.getBus1() != null && branch.getBus2() != null); } diff --git a/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java b/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java index 320a76ed5b..6ed359fca7 100644 --- a/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java +++ b/src/main/java/com/powsybl/openloadflow/network/impl/LfNetworkLoaderImpl.java @@ -316,9 +316,8 @@ public void visitHvdcConverterStation(HvdcConverterStation converterStation) return lfBus; } - private static void addBranch(LfNetwork lfNetwork, LfBranch lfBranch, LfNetworkLoadingReport report, boolean dc) { + private static void addBranch(LfNetwork lfNetwork, LfBranch lfBranch, LfNetworkLoadingReport report, boolean dc, double lowImpedanceThreshold) { boolean connectedToSameBus = lfBranch.getBus1() == lfBranch.getBus2(); - double lowImpedanceThreshold = 1.0E-8; // CAIOTODO if (connectedToSameBus) { LOGGER.trace("Discard branch '{}' because connected to same bus at both ends", lfBranch.getId()); report.branchesDiscardedBecauseConnectedToSameBusAtBothEnds++; @@ -337,7 +336,7 @@ private static void createBranches(List lfBuses, LfNetwork lfNetwork, Loa LfBus lfBus1 = getLfBus(branch.getTerminal1(), lfNetwork, parameters.isBreakers()); LfBus lfBus2 = getLfBus(branch.getTerminal2(), lfNetwork, parameters.isBreakers()); LfBranchImpl lfBranch = LfBranchImpl.create(branch, lfNetwork, lfBus1, lfBus2, parameters.isTwtSplitShuntAdmittance(), parameters.isAddRatioToLinesWithDifferentNominalVoltageAtBothEnds(), report); - addBranch(lfNetwork, lfBranch, report, parameters.isDc()); + addBranch(lfNetwork, lfBranch, report, parameters.isDc(), parameters.getLowImpedanceThreshold()); postProcessors.forEach(pp -> pp.onBranchAdded(branch, lfBranch)); } @@ -348,7 +347,7 @@ private static void createBranches(List lfBuses, LfNetwork lfNetwork, Loa lfBuses.add(lfBus2); LfBus lfBus1 = getLfBus(danglingLine.getTerminal(), lfNetwork, parameters.isBreakers()); LfBranch lfBranch = LfDanglingLineBranch.create(danglingLine, lfNetwork, lfBus1, lfBus2); - addBranch(lfNetwork, lfBranch, report, parameters.isDc()); + addBranch(lfNetwork, lfBranch, report, parameters.isDc(), parameters.getLowImpedanceThreshold()); postProcessors.forEach(pp -> { pp.onBusAdded(danglingLine, lfBus2); pp.onBranchAdded(danglingLine, lfBranch); @@ -364,9 +363,9 @@ private static void createBranches(List lfBuses, LfNetwork lfNetwork, Loa LfLegBranch lfBranch1 = LfLegBranch.create(lfNetwork, lfBus1, lfBus0, t3wt, t3wt.getLeg1(), parameters.isTwtSplitShuntAdmittance()); LfLegBranch lfBranch2 = LfLegBranch.create(lfNetwork, lfBus2, lfBus0, t3wt, t3wt.getLeg2(), parameters.isTwtSplitShuntAdmittance()); LfLegBranch lfBranch3 = LfLegBranch.create(lfNetwork, lfBus3, lfBus0, t3wt, t3wt.getLeg3(), parameters.isTwtSplitShuntAdmittance()); - addBranch(lfNetwork, lfBranch1, report, parameters.isDc()); - addBranch(lfNetwork, lfBranch2, report, parameters.isDc()); - addBranch(lfNetwork, lfBranch3, report, parameters.isDc()); + addBranch(lfNetwork, lfBranch1, report, parameters.isDc(), parameters.getLowImpedanceThreshold()); + addBranch(lfNetwork, lfBranch2, report, parameters.isDc(), parameters.getLowImpedanceThreshold()); + addBranch(lfNetwork, lfBranch3, report, parameters.isDc(), parameters.getLowImpedanceThreshold()); postProcessors.forEach(pp -> { pp.onBusAdded(t3wt, lfBus0); pp.onBranchAdded(t3wt, lfBranch1); @@ -433,7 +432,7 @@ private static void createTransformersVoltageControls(LfNetwork lfNetwork, boole } private static void createSwitches(List switches, LfNetwork lfNetwork, List postProcessors, - LfNetworkLoadingReport report, boolean dc) { + LfNetworkLoadingReport report, boolean dc, double lowImpedanceThreshold) { if (switches != null) { for (Switch sw : switches) { VoltageLevel vl = sw.getVoltageLevel(); @@ -442,18 +441,18 @@ private static void createSwitches(List switches, LfNetwork lfNetwork, L LfBus lfBus1 = lfNetwork.getBusById(bus1.getId()); LfBus lfBus2 = lfNetwork.getBusById(bus2.getId()); LfSwitch lfSwitch = new LfSwitch(lfNetwork, lfBus1, lfBus2, sw); - addBranch(lfNetwork, lfSwitch, report, dc); + addBranch(lfNetwork, lfSwitch, report, dc, lowImpedanceThreshold); postProcessors.forEach(pp -> pp.onBranchAdded(sw, lfSwitch)); } } } private static void fixAllVoltageControls(LfNetwork lfNetwork, boolean minImpedance, boolean transformerVoltageControl, - boolean dc) { + boolean dc, double lowImpedanceThreshold) { // If min impedance is set, there is no zero-impedance branch if (!minImpedance) { // Merge the discrete voltage control in each zero impedance connected set - List> connectedSets = new ConnectivityInspector<>(lfNetwork.createZeroImpedanceSubGraph(dc)).connectedSets(); + List> connectedSets = new ConnectivityInspector<>(lfNetwork.createZeroImpedanceSubGraph(dc, lowImpedanceThreshold)).connectedSets(); connectedSets.forEach(connectedSet -> mergeVoltageControls(connectedSet, transformerVoltageControl)); } } @@ -747,18 +746,18 @@ private LfNetwork create(int numCC, int numSC, List buses, List swi } if (parameters.isBreakers()) { - createSwitches(switches, lfNetwork, postProcessors, report, parameters.isDc()); + createSwitches(switches, lfNetwork, postProcessors, report, parameters.isDc(), parameters.getLowImpedanceThreshold()); } if (!parameters.isDc()) { // Fixing voltage controls need to be done after creating switches, as the zero-impedance graph is changed with switches fixAllVoltageControls(lfNetwork, parameters.isMinImpedance(), parameters.isTransformerVoltageControl(), - parameters.isDc()); + parameters.isDc(), parameters.getLowImpedanceThreshold()); } if (!parameters.isMinImpedance()) { // create zero impedance equations only on minimum spanning forest calculated from zero impedance sub graph - Graph zeroImpedanceSubGraph = lfNetwork.createZeroImpedanceSubGraph(parameters.isDc()); + Graph zeroImpedanceSubGraph = lfNetwork.createZeroImpedanceSubGraph(parameters.isDc(), parameters.getLowImpedanceThreshold()); if (!zeroImpedanceSubGraph.vertexSet().isEmpty()) { SpanningTreeAlgorithm.SpanningTree spanningTree = new KruskalMinimumSpanningTree<>(zeroImpedanceSubGraph).getSpanningTree(); for (LfBranch branch : spanningTree.getEdges()) { diff --git a/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java b/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java index edd3c670c4..079b51c67d 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/ZeroImpedanceFlows.java @@ -35,7 +35,7 @@ public ZeroImpedanceFlows(Graph zeroImpedanceSubGraph, Spanning this.tree = spanningTree; } - public void compute(boolean dc) { + public void compute(boolean dc, double lowImpedanceThreshold) { Set processed = new HashSet<>(); graph.vertexSet().forEach(lfBus -> { @@ -43,7 +43,7 @@ public void compute(boolean dc) { return; } TreeByLevels treeByLevels = new TreeByLevels(graph, tree, lfBus); - treeByLevels.updateFlows(dc); + treeByLevels.updateFlows(dc, lowImpedanceThreshold); processed.addAll(treeByLevels.getProcessedLfBuses()); }); @@ -104,7 +104,7 @@ private static LfBus getOtherSideBus(LfBranch branch, LfBus bus) { return branch.getBus1().equals(bus) ? branch.getBus2() : branch.getBus1(); } - private void updateFlows(boolean dc) { + private void updateFlows(boolean dc, double lowImpedanceThreshold) { Map descendantZeroImpedanceFlow = new HashMap<>(); // traverse the tree from leaves to root @@ -112,7 +112,7 @@ private void updateFlows(boolean dc) { int level = levels.size() - 1; while (level >= 1) { levels.get(level).forEach(bus -> { - PQ balance = balanceWithImpedance(bus, dc); + PQ balance = balanceWithImpedance(bus, dc, lowImpedanceThreshold); PQ z0flow = getDescendantZeroImpedanceFlow(descendantZeroImpedanceFlow, bus); PQ branchFlow = balance.add(z0flow); @@ -124,14 +124,13 @@ private void updateFlows(boolean dc) { } } - private PQ balanceWithImpedance(LfBus bus, boolean dc) { + private PQ balanceWithImpedance(LfBus bus, boolean dc, double lowImpedanceThreshold) { // balance considering injections and flow from lines with impedance // take care of the sign PQ balancePQ = new PQ(-bus.getP().eval(), -bus.getQ().eval()); // only lines with impedance - double lowImpedanceThreshold = 1.0E-8; // CAIOTODO List adjacentBranchesWithImpedance = bus.getBranches().stream() .filter(branch -> !branch.isZeroImpedanceBranch(dc, lowImpedanceThreshold)).collect(Collectors.toList()); From 02527c32c9e510a0a19341fc9c9ab06163259ea6 Mon Sep 17 00:00:00 2001 From: cluke Date: Thu, 17 Nov 2022 15:43:04 +0100 Subject: [PATCH 05/11] ADD: lowImpedanceThreshold in AcEquationSystemUpdater *** There are CAIOTODO's to handle Signed-off-by: cluke --- .../powsybl/openloadflow/ac/equations/AcEquationSystem.java | 2 +- .../openloadflow/ac/equations/AcEquationSystemUpdater.java | 6 ++++-- .../com/powsybl/openloadflow/network/impl/LfSwitchTest.java | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java index 12b8736675..ebede41f44 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java @@ -776,7 +776,7 @@ public static EquationSystem create(LfNetwork ne EquationSystemPostProcessor.findAll().forEach(pp -> pp.onCreate(equationSystem)); - network.addListener(new AcEquationSystemUpdater(equationSystem)); + network.addListener(new AcEquationSystemUpdater(equationSystem, creationParameters.getLowImpedanceThreshold())); return equationSystem; } diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java index 1bf4bf9a2a..e8a9fc2288 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemUpdater.java @@ -19,8 +19,11 @@ public class AcEquationSystemUpdater extends AbstractLfNetworkListener { private final EquationSystem equationSystem; - public AcEquationSystemUpdater(EquationSystem equationSystem) { + private final double lowImpedanceThreshold; + + public AcEquationSystemUpdater(EquationSystem equationSystem, double lowImpedanceThreshold) { this.equationSystem = Objects.requireNonNull(equationSystem); + this.lowImpedanceThreshold = lowImpedanceThreshold; } @Override @@ -45,7 +48,6 @@ public void onShuntVoltageControlChange(LfShunt controllerShunt, boolean newVolt } private void updateElementEquations(LfElement element, boolean enable) { - double lowImpedanceThreshold = 1.0E-8; // CAIOTODO if (element instanceof LfBranch && ((LfBranch) element).isZeroImpedanceBranch(false, lowImpedanceThreshold)) { LfBranch branch = (LfBranch) element; if (branch.isSpanningTreeEdge()) { diff --git a/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java b/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java index b92d718ed5..ef68d9d993 100644 --- a/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java +++ b/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java @@ -17,7 +17,6 @@ import com.powsybl.openloadflow.equations.EquationTerm; import com.powsybl.openloadflow.equations.VariableSet; import com.powsybl.openloadflow.graph.EvenShiloachGraphDecrementalConnectivityFactory; -import com.powsybl.openloadflow.network.LfBranch; import com.powsybl.openloadflow.network.LfNetwork; import com.powsybl.openloadflow.network.NodeBreakerNetworkFactory; import org.junit.jupiter.api.BeforeEach; @@ -68,7 +67,7 @@ void getterTest() { @Test void setterTest() { - lfSwitch.getPiModel().setX(LfBranch.LOW_IMPEDANCE_THRESHOLD); //FIXME + lfSwitch.getPiModel().setX(acLoadFlowParameters.getNetworkParameters().getLowImpedanceThreshold()); VariableSet variableSet = new VariableSet<>(); EquationTerm p1 = new ClosedBranchSide1ActiveFlowEquationTerm(lfSwitch, lfSwitch.getBus1(), lfSwitch.getBus2(), variableSet, false, false); From 9782ed0fb8a1af56b1bac9483adc4a01100e5bbc Mon Sep 17 00:00:00 2001 From: cluke Date: Thu, 17 Nov 2022 15:50:12 +0100 Subject: [PATCH 06/11] ADD: all occurrences of LOW_IMPEDANCE_THRESHOLD have been substituted by a lowImpedanceThreshold parameter from either OpenLoadFlowParameters, LfNetworkParameters, AcEquationSystemCreationParameters, DcEquationSystemCreationParameters Signed-off-by: cluke --- .../java/com/powsybl/openloadflow/network/LfBranch.java | 4 +--- .../java/com/powsybl/openloadflow/network/LfNetwork.java | 6 +++--- .../powsybl/openloadflow/network/impl/AbstractLfBranch.java | 6 +++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/network/LfBranch.java b/src/main/java/com/powsybl/openloadflow/network/LfBranch.java index e14a307685..9708edc832 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfBranch.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfBranch.java @@ -21,8 +21,6 @@ */ public interface LfBranch extends LfElement { - double LOW_IMPEDANCE_THRESHOLD = Math.pow(10, -8); // in per unit - enum BranchType { LINE, TRANSFO_2, @@ -176,5 +174,5 @@ static double getDiscretePhaseControlTarget(LfBranch branch, DiscretePhaseContro boolean isConnectedAtBothSides(); - void setMinZ(boolean dc); + void setMinZ(boolean dc, double lowImpedanceThreshold); } diff --git a/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java b/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java index 40f57f3f1e..8a22611a23 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfNetwork.java @@ -451,10 +451,10 @@ public void reportBalance(Reporter reporter) { this, activeGeneration, activeLoad, reactiveGeneration, reactiveLoad); } - public void fix(boolean minImpedance, boolean dc) { + public void fix(boolean minImpedance, boolean dc, double lowImpedanceThreshold) { if (minImpedance) { for (LfBranch branch : branches) { - branch.setMinZ(dc); + branch.setMinZ(dc, lowImpedanceThreshold); } } } @@ -500,7 +500,7 @@ public static List load(T network, LfNetworkLoader networkLoad List lfNetworks = networkLoader.load(network, parameters, reporter); for (LfNetwork lfNetwork : lfNetworks) { Reporter reporterNetwork = Reports.createPostLoadingProcessingReporter(lfNetwork.getReporter()); - lfNetwork.fix(parameters.isMinImpedance(), parameters.isDc()); + lfNetwork.fix(parameters.isMinImpedance(), parameters.isDc(), parameters.getLowImpedanceThreshold()); lfNetwork.validate(parameters.isDc(), reporterNetwork); if (lfNetwork.isValid()) { lfNetwork.reportSize(reporterNetwork); diff --git a/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java b/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java index d4d656bde3..9161caee22 100644 --- a/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java +++ b/src/main/java/com/powsybl/openloadflow/network/impl/AbstractLfBranch.java @@ -287,9 +287,9 @@ public boolean isConnectedAtBothSides() { } @Override - public void setMinZ(boolean dc) { - if (piModel.setMinZ(LOW_IMPEDANCE_THRESHOLD, dc)) { - LOGGER.trace("Branch {} has a low impedance, set to min {}", getId(), LOW_IMPEDANCE_THRESHOLD); + public void setMinZ(boolean dc, double lowImpedanceThreshold) { + if (piModel.setMinZ(lowImpedanceThreshold, dc)) { + LOGGER.trace("Branch {} has a low impedance, set to min {}", getId(), lowImpedanceThreshold); } } } From e1910b9bb442e6d150a95feff69153a13cd4224d Mon Sep 17 00:00:00 2001 From: cluke Date: Fri, 18 Nov 2022 10:47:50 +0100 Subject: [PATCH 07/11] FIX: write the constant value of lowImpedanceThreshold (1.0E-8) in tests Signed-off-by: cluke --- .../openloadflow/FullVoltageInitializerTest.java | 2 +- .../ac/VoltageMagnitudeInitializerTest.java | 14 +++++++------- .../openloadflow/dc/DcLoadFlowMatrixTest.java | 3 +-- .../openloadflow/equations/EquationSystemTest.java | 2 +- .../openloadflow/network/impl/LfSwitchTest.java | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java index 9ebff4d6a3..47b2796d90 100644 --- a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java @@ -41,7 +41,7 @@ void testEsgTuto1() { true, matrixFactory, Reporter.NO_OP)); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "VLGEN_0", 1.020833, 0); assertBusVoltage(lfNetwork, initializer, "VLHV1_0", 1.074561, -2.511475); assertBusVoltage(lfNetwork, initializer, "VLHV2_0", 1.074561, -6.439649); diff --git a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java index 7dd0b99210..c504976ed6 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java @@ -44,7 +44,7 @@ void testEsgTuto1() { Network network = EurostagTutorialExample1Factory.create(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "VLGEN_0", 1.020833, 0); assertBusVoltage(lfNetwork, initializer, "VLHV1_0", 1.074561, 0); assertBusVoltage(lfNetwork, initializer, "VLHV2_0", 1.074561, 0); @@ -56,7 +56,7 @@ void testIeee14() { Network network = IeeeCdfNetworkFactory.create14(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -79,7 +79,7 @@ void testZeroImpedanceBranch() { network.getLine("L9-14-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -102,7 +102,7 @@ void testZeroImpedanceBranchConnectedToPvBus() { network.getLine("L6-11-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -142,7 +142,7 @@ void testParallelBranch() { .add(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -164,7 +164,7 @@ void testZeroImpedanceLoop() { Network network = Importers.importData("XIIDM", new ResourceDataSource("init_v_zero_imp_loop", new ResourceSet("/", "init_v_zero_imp_loop.xiidm")), null); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "B_0", 0.982318, 0); assertBusVoltage(lfNetwork, initializer, "D_0", 0.982318, 0); assertBusVoltage(lfNetwork, initializer, "F_0", 0.982315, 0); @@ -198,7 +198,7 @@ void testWithTransformerVoltageControl() { .setTransformerVoltageControl(true); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), networkParameters).get(0); VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(true, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, new LfNetworkParameters().getLowImpedanceThreshold()); + initializer.prepare(lfNetwork, 1.0E-8); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); diff --git a/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java b/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java index bb2460599a..b19e8a2104 100644 --- a/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java +++ b/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java @@ -20,7 +20,6 @@ import com.powsybl.openloadflow.network.FirstSlackBusSelector; import com.powsybl.openloadflow.network.LfBus; import com.powsybl.openloadflow.network.LfNetwork; -import com.powsybl.openloadflow.network.LfNetworkParameters; import com.powsybl.openloadflow.network.impl.Networks; import com.powsybl.openloadflow.network.util.UniformValueVoltageInitializer; import org.junit.jupiter.api.Test; @@ -58,7 +57,7 @@ void buildDcMatrix() { List lfNetworks = Networks.load(network, new FirstSlackBusSelector()); LfNetwork mainNetwork = lfNetworks.get(0); - DcEquationSystemCreationParameters creationParameters = new DcEquationSystemCreationParameters(true, false, false, true, new LfNetworkParameters().getLowImpedanceThreshold()); + DcEquationSystemCreationParameters creationParameters = new DcEquationSystemCreationParameters(true, false, false, true, 1.0E-8); EquationSystem equationSystem = DcEquationSystem.create(mainNetwork, creationParameters); for (LfBus b : mainNetwork.getBuses()) { diff --git a/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java b/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java index 62ef4976e1..89331cf9cb 100644 --- a/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java +++ b/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java @@ -173,7 +173,7 @@ void writeDcSystemTest() { List lfNetworks = Networks.load(EurostagTutorialExample1Factory.create(), new FirstSlackBusSelector()); LfNetwork network = lfNetworks.get(0); - EquationSystem equationSystem = DcEquationSystem.create(network, new DcEquationSystemCreationParameters(true, false, false, true, new LfNetworkParameters().getLowImpedanceThreshold())); + EquationSystem equationSystem = DcEquationSystem.create(network, new DcEquationSystemCreationParameters(true, false, false, true, 1.0E-8)); String ref = String.join(System.lineSeparator(), "bus_target_φ0 = φ0", "bus_target_p1 = dc_p_2(φ0, φ1) + dc_p_1(φ1, φ2) + dc_p_1(φ1, φ2)", diff --git a/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java b/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java index ef68d9d993..52023239e3 100644 --- a/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java +++ b/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java @@ -67,7 +67,7 @@ void getterTest() { @Test void setterTest() { - lfSwitch.getPiModel().setX(acLoadFlowParameters.getNetworkParameters().getLowImpedanceThreshold()); + lfSwitch.getPiModel().setX(1.0E-8); VariableSet variableSet = new VariableSet<>(); EquationTerm p1 = new ClosedBranchSide1ActiveFlowEquationTerm(lfSwitch, lfSwitch.getBus1(), lfSwitch.getBus2(), variableSet, false, false); From 59a2097434b0c9417641a09bfaf3449e18880d86 Mon Sep 17 00:00:00 2001 From: cluke Date: Fri, 18 Nov 2022 12:33:57 +0100 Subject: [PATCH 08/11] FIX: add lowImpedanceThreshold to the constructor of VoltageMagnitudeInitializer Signed-off-by: cluke --- .../openloadflow/FullVoltageInitializer.java | 6 ++-- .../openloadflow/OpenLoadFlowParameters.java | 7 +++-- .../ac/VoltageMagnitudeInitializer.java | 7 +++-- .../AcEquationSystemCreationParameters.java | 7 +---- .../ac/outerloop/AcloadFlowEngine.java | 2 +- .../dc/DcValueVoltageInitializer.java | 5 +++- .../DcEquationSystemCreationParameters.java | 7 +---- .../network/LfNetworkParameters.java | 4 +++ .../util/PreviousValueVoltageInitializer.java | 2 +- .../util/UniformValueVoltageInitializer.java | 2 +- .../network/util/VoltageInitializer.java | 2 +- .../FullVoltageInitializerTest.java | 4 +-- .../ac/VoltageMagnitudeInitializerTest.java | 28 +++++++++---------- 13 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java index 7b63d7e9fa..8ab1661ddf 100644 --- a/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/FullVoltageInitializer.java @@ -32,9 +32,9 @@ public FullVoltageInitializer(VoltageMagnitudeInitializer magnitudeInitializer, } @Override - public void prepare(LfNetwork network, double lowImpedanceThreshold) { - magnitudeInitializer.prepare(network, lowImpedanceThreshold); - angleInitializer.prepare(network, lowImpedanceThreshold); + public void prepare(LfNetwork network) { + magnitudeInitializer.prepare(network); + angleInitializer.prepare(network); } @Override diff --git a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java index ff94d0ae31..feb082c5f7 100644 --- a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java +++ b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java @@ -363,6 +363,9 @@ public double getLowImpedanceThreshold() { } public OpenLoadFlowParameters setLowImpedanceThreshold(double lowImpedanceThreshold) { + if (lowImpedanceThreshold <= 0) { + throw new PowsyblException("lowImpedanceThreshold must be greater than 0"); + } this.lowImpedanceThreshold = lowImpedanceThreshold; return this; } @@ -613,10 +616,10 @@ static VoltageInitializer getExtendedVoltageInitializer(LoadFlowParameters param return getVoltageInitializer(parameters, networkParameters, matrixFactory, reporter); case VOLTAGE_MAGNITUDE: - return new VoltageMagnitudeInitializer(parameters.isTransformerVoltageControlOn(), matrixFactory); + return new VoltageMagnitudeInitializer(parameters.isTransformerVoltageControlOn(), matrixFactory, networkParameters.getLowImpedanceThreshold()); case FULL_VOLTAGE: - return new FullVoltageInitializer(new VoltageMagnitudeInitializer(parameters.isTransformerVoltageControlOn(), matrixFactory), + return new FullVoltageInitializer(new VoltageMagnitudeInitializer(parameters.isTransformerVoltageControlOn(), matrixFactory, networkParameters.getLowImpedanceThreshold()), new DcValueVoltageInitializer(networkParameters, parameters.isDistributedSlack(), parameters.getBalanceType(), diff --git a/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java b/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java index 216bd0aac1..572dc34b12 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializer.java @@ -34,6 +34,8 @@ public class VoltageMagnitudeInitializer implements VoltageInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(VoltageMagnitudeInitializer.class); + private final double lowImpedanceThreshold; + public enum InitVmEquationType implements Quantity { BUS_TARGET_V("v", ElementType.BUS), BUS_ZERO("bus_z", ElementType.BUS); @@ -157,9 +159,10 @@ protected String getName() { private final MatrixFactory matrixFactory; - public VoltageMagnitudeInitializer(boolean transformerVoltageControlOn, MatrixFactory matrixFactory) { + public VoltageMagnitudeInitializer(boolean transformerVoltageControlOn, MatrixFactory matrixFactory, double lowImpedanceThreshold) { this.transformerVoltageControlOn = transformerVoltageControlOn; this.matrixFactory = Objects.requireNonNull(matrixFactory); + this.lowImpedanceThreshold = lowImpedanceThreshold; } private static void initTarget(Equation equation, LfNetwork network, double[] targets) { @@ -181,7 +184,7 @@ private static void initTarget(Equation } @Override - public void prepare(LfNetwork network, double lowImpedanceThreshold) { + public void prepare(LfNetwork network) { Stopwatch stopwatch = Stopwatch.createStarted(); // create the equation system: diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java index f9b51e0d39..9b30786c2a 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java @@ -15,7 +15,7 @@ public class AcEquationSystemCreationParameters { private final boolean forceA1Var; - private double lowImpedanceThreshold; + private final double lowImpedanceThreshold; public AcEquationSystemCreationParameters() { this(false, LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); @@ -34,11 +34,6 @@ public double getLowImpedanceThreshold() { return lowImpedanceThreshold; } - public AcEquationSystemCreationParameters setLowImpedanceThreshold(double lowImpedanceThreshold) { - this.lowImpedanceThreshold = lowImpedanceThreshold; - return this; - } - @Override public String toString() { return "AcEquationSystemCreationParameters(" + diff --git a/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java b/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java index c66f8e7671..1a179eaa94 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java +++ b/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcloadFlowEngine.java @@ -86,7 +86,7 @@ public AcLoadFlowResult run() { // in case of a DC voltage initializer, an DC equation system in created and equations are attached // to the network. It is important that DC init is done before AC equation system is created by // calling ACLoadContext.getEquationSystem to avoid DC equations overwrite AC ones in the network. - voltageInitializer.prepare(context.getNetwork(), context.getParameters().getNetworkParameters().getLowImpedanceThreshold()); + voltageInitializer.prepare(context.getNetwork()); RunningContext runningContext = new RunningContext(); NewtonRaphson newtonRaphson = new NewtonRaphson(context.getNetwork(), diff --git a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java index bb714afef1..7256c3bfaa 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java @@ -35,6 +35,8 @@ public class DcValueVoltageInitializer implements VoltageInitializer { private final Reporter reporter; + private final double lowImpedanceThreshold; + public DcValueVoltageInitializer(LfNetworkParameters networkParameters, boolean distributedSlack, LoadFlowParameters.BalanceType balanceType, boolean useTransformerRatio, MatrixFactory matrixFactory, Reporter reporter) { this.networkParameters = Objects.requireNonNull(networkParameters); @@ -43,10 +45,11 @@ public DcValueVoltageInitializer(LfNetworkParameters networkParameters, boolean this.useTransformerRatio = useTransformerRatio; this.matrixFactory = Objects.requireNonNull(matrixFactory); this.reporter = Objects.requireNonNull(reporter); + this.lowImpedanceThreshold = networkParameters.getLowImpedanceThreshold(); } @Override - public void prepare(LfNetwork network, double lowImpedanceThreshold) { + public void prepare(LfNetwork network) { // in case of distributed slack, we need to save and restore generators and loads target p which might have been // modified by slack distribution, so that AC load flow can restart from original state List busStates = distributedSlack ? ElementState.save(network.getBuses(), BusDcState::save) : null; diff --git a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java index c1d9d17400..76937f411b 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java +++ b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java @@ -23,7 +23,7 @@ public class DcEquationSystemCreationParameters { private final boolean useTransformerRatio; - private double lowImpedanceThreshold; + private final double lowImpedanceThreshold; public DcEquationSystemCreationParameters(boolean updateFlows, boolean indexTerms, boolean forcePhaseControlOffAndAddAngle1Var, boolean useTransformerRatio, double lowImpedanceThreshold) { @@ -54,11 +54,6 @@ public double getLowImpedanceThreshold() { return lowImpedanceThreshold; } - public DcEquationSystemCreationParameters setLowImpedanceThreshold(double lowImpedanceThreshold) { - this.lowImpedanceThreshold = lowImpedanceThreshold; - return this; - } - @Override public String toString() { return "DcEquationSystemCreationParameters(" + diff --git a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java index 57c66bc0d2..c8a54b8ea0 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java @@ -6,6 +6,7 @@ */ package com.powsybl.openloadflow.network; +import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.Country; import com.powsybl.openloadflow.OpenLoadFlowParameters; import com.powsybl.openloadflow.graph.EvenShiloachGraphDecrementalConnectivityFactory; @@ -275,6 +276,9 @@ public double getLowImpedanceThreshold() { } public LfNetworkParameters setLowImpedanceThreshold(double lowImpedanceThreshold) { + if (lowImpedanceThreshold <= 0) { + throw new PowsyblException("lowImpedanceThreshold must be greater than 0"); + } this.lowImpedanceThreshold = lowImpedanceThreshold; return this; } diff --git a/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java index 943d07219c..bd6986e258 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/PreviousValueVoltageInitializer.java @@ -28,7 +28,7 @@ public PreviousValueVoltageInitializer(boolean defaultToUniformValue) { } @Override - public void prepare(LfNetwork network, double lowImpedanceThreshold) { + public void prepare(LfNetwork network) { // nothing to do } diff --git a/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java index 08d25bdff9..cac0a6afcb 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/UniformValueVoltageInitializer.java @@ -15,7 +15,7 @@ public class UniformValueVoltageInitializer implements VoltageInitializer { @Override - public void prepare(LfNetwork network, double lowImpedanceThreshold) { + public void prepare(LfNetwork network) { // nothing to do } diff --git a/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java index 88449c0b88..dadc3e2219 100644 --- a/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/network/util/VoltageInitializer.java @@ -14,7 +14,7 @@ */ public interface VoltageInitializer { - void prepare(LfNetwork network, double lowImpedanceThreshold); + void prepare(LfNetwork network); double getMagnitude(LfBus bus); diff --git a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java index 47b2796d90..6a7565ddd5 100644 --- a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java @@ -34,14 +34,14 @@ void testEsgTuto1() { SlackBusSelector slackBusSelector = new FirstSlackBusSelector(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), slackBusSelector).get(0); MatrixFactory matrixFactory = new DenseMatrixFactory(); - FullVoltageInitializer initializer = new FullVoltageInitializer(new VoltageMagnitudeInitializer(false, matrixFactory), + FullVoltageInitializer initializer = new FullVoltageInitializer(new VoltageMagnitudeInitializer(false, matrixFactory, 1.0E-8), new DcValueVoltageInitializer(new LfNetworkParameters().setSlackBusSelector(slackBusSelector), false, LoadFlowParameters.BalanceType.PROPORTIONAL_TO_GENERATION_P_MAX, true, matrixFactory, Reporter.NO_OP)); - initializer.prepare(lfNetwork, 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VLGEN_0", 1.020833, 0); assertBusVoltage(lfNetwork, initializer, "VLHV1_0", 1.074561, -2.511475); assertBusVoltage(lfNetwork, initializer, "VLHV2_0", 1.074561, -6.439649); diff --git a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java index c504976ed6..8de6c5bb2b 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java @@ -43,8 +43,8 @@ public static void assertBusVoltage(LfNetwork network, VoltageInitializer initia void testEsgTuto1() { Network network = EurostagTutorialExample1Factory.create(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VLGEN_0", 1.020833, 0); assertBusVoltage(lfNetwork, initializer, "VLHV1_0", 1.074561, 0); assertBusVoltage(lfNetwork, initializer, "VLHV2_0", 1.074561, 0); @@ -55,8 +55,8 @@ void testEsgTuto1() { void testIeee14() { Network network = IeeeCdfNetworkFactory.create14(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -78,8 +78,8 @@ void testZeroImpedanceBranch() { Network network = IeeeCdfNetworkFactory.create14(); network.getLine("L9-14-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -101,8 +101,8 @@ void testZeroImpedanceBranchConnectedToPvBus() { Network network = IeeeCdfNetworkFactory.create14(); network.getLine("L6-11-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -141,8 +141,8 @@ void testParallelBranch() { .setB2(0) .add(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); @@ -163,8 +163,8 @@ void testParallelBranch() { void testZeroImpedanceLoop() { Network network = Importers.importData("XIIDM", new ResourceDataSource("init_v_zero_imp_loop", new ResourceSet("/", "init_v_zero_imp_loop.xiidm")), null); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "B_0", 0.982318, 0); assertBusVoltage(lfNetwork, initializer, "D_0", 0.982318, 0); assertBusVoltage(lfNetwork, initializer, "F_0", 0.982315, 0); @@ -197,8 +197,8 @@ void testWithTransformerVoltageControl() { LfNetworkParameters networkParameters = new LfNetworkParameters() .setTransformerVoltageControl(true); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), networkParameters).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(true, new DenseMatrixFactory()); - initializer.prepare(lfNetwork, 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(true, new DenseMatrixFactory(), 1.0E-8); + initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); assertBusVoltage(lfNetwork, initializer, "VL3_0", 1.01, 0); From a19d57b1ecb0ee29b7e6309c4d667d7d3b749972 Mon Sep 17 00:00:00 2001 From: cluke Date: Fri, 18 Nov 2022 12:53:47 +0100 Subject: [PATCH 09/11] FIX: put lowImpedanceThreshold at the end of the parameter's list Signed-off-by: cluke --- .../openloadflow/OpenLoadFlowParameters.java | 53 ++++++++++--------- .../network/LfNetworkParameters.java | 4 +- src/test/resources/debug-parameters.json | 2 +- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java index feb082c5f7..ec59cba463 100644 --- a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java +++ b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java @@ -95,8 +95,6 @@ public class OpenLoadFlowParameters extends AbstractExtension SPECIFIC_PARAMETERS_NAMES = List.of(SLACK_BUS_SELECTION_PARAM_NAME, SLACK_BUSES_IDS_PARAM_NAME, LOW_IMPEDANCE_BRANCH_MODE_PARAM_NAME, @@ -123,12 +123,12 @@ public class OpenLoadFlowParameters extends AbstractExtension properties) { .ifPresent(prop -> this.setTransformerVoltageControlMode(TransformerVoltageControlMode.valueOf(prop))); Optional.ofNullable(properties.get(DC_POWER_FACTOR_NAME)) .ifPresent(prop -> this.setDcPowerFactor(Double.parseDouble(prop))); - Optional.ofNullable(properties.get(LOW_IMPEDANCE_THRESHOLD_NAME)) - .ifPresent(prop -> this.setLowImpedanceThreshold(Double.parseDouble(prop))); Optional.ofNullable(properties.get(MIN_PLAUSIBLE_TARGET_VOLTAGE_NAME)) .ifPresent(prop -> this.setMinPlausibleTargetVoltage(Double.parseDouble(prop))); Optional.ofNullable(properties.get(MAX_PLAUSIBLE_TARGET_VOLTAGE_NAME)) @@ -499,6 +497,8 @@ public OpenLoadFlowParameters update(Map properties) { .ifPresent(prop -> this.setMaxRealisticVoltage(Double.parseDouble(prop))); Optional.ofNullable(properties.get(REACTIVE_RANGE_CHECK_MODE_NAME)) .ifPresent(prop -> this.setReactiveRangeCheckMode(ReactiveRangeCheckMode.valueOf(prop))); + Optional.ofNullable(properties.get(LOW_IMPEDANCE_THRESHOLD_NAME)) + .ifPresent(prop -> this.setLowImpedanceThreshold(Double.parseDouble(prop))); return this; } @@ -521,12 +521,12 @@ public String toString() { ", voltageInitModeOverride=" + voltageInitModeOverride + ", transformerVoltageControlMode=" + transformerVoltageControlMode + ", dcPowerFactor=" + dcPowerFactor + - ", lowImpedanceThreshold=" + lowImpedanceThreshold + ", minPlausibleTargetVoltage=" + minPlausibleTargetVoltage + ", maxPlausibleTargetVoltage=" + maxPlausibleTargetVoltage + ", minRealisticVoltage=" + minRealisticVoltage + ", maxRealisticVoltage=" + maxRealisticVoltage + ", reactiveRangeCheckMode=" + reactiveRangeCheckMode + + ", lowImpedanceThreshold=" + lowImpedanceThreshold + ')'; } @@ -652,13 +652,13 @@ static LfNetworkParameters getNetworkParameters(LoadFlowParameters parameters, O .setVoltagePerReactivePowerControl(parametersExt.isVoltagePerReactivePowerControl()) .setReactivePowerRemoteControl(parametersExt.hasReactivePowerRemoteControl()) .setDc(parameters.isDc()) - .setLowImpedanceThreshold(parametersExt.getLowImpedanceThreshold()) .setShuntVoltageControl(parameters.isShuntCompensatorVoltageControlOn()) .setReactiveLimits(!parameters.isNoGeneratorReactiveLimits()) .setHvdcAcEmulation(parameters.isHvdcAcEmulation()) .setMinPlausibleTargetVoltage(parametersExt.getMinPlausibleTargetVoltage()) .setMaxPlausibleTargetVoltage(parametersExt.getMaxPlausibleTargetVoltage()) - .setReactiveRangeCheckMode(parametersExt.getReactiveRangeCheckMode()); + .setReactiveRangeCheckMode(parametersExt.getReactiveRangeCheckMode()) + .setLowImpedanceThreshold(parametersExt.getLowImpedanceThreshold()); } public static AcLoadFlowParameters createAcParameters(Network network, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, @@ -742,7 +742,8 @@ public static DcLoadFlowParameters createDcParameters(LoadFlowParameters paramet .setHvdcAcEmulation(false) // FIXME .setMinPlausibleTargetVoltage(parametersExt.getMinPlausibleTargetVoltage()) .setMaxPlausibleTargetVoltage(parametersExt.getMaxPlausibleTargetVoltage()) - .setReactiveRangeCheckMode(ReactiveRangeCheckMode.MAX); // not useful for DC. + .setReactiveRangeCheckMode(ReactiveRangeCheckMode.MAX) // not useful for DC. + .setLowImpedanceThreshold(parametersExt.getLowImpedanceThreshold()); var equationSystemCreationParameters = new DcEquationSystemCreationParameters(true, false, diff --git a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java index c8a54b8ea0..a198c4e65c 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java @@ -74,14 +74,14 @@ public class LfNetworkParameters { private double minPlausibleTargetVoltage = MIN_PLAUSIBLE_TARGET_VOLTAGE_DEFAULT_VALUE; - private double lowImpedanceThreshold = LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE; - private double maxPlausibleTargetVoltage = MAX_PLAUSIBLE_TARGET_VOLTAGE_DEFAULT_VALUE; private Set loaderPostProcessorSelection = Collections.emptySet(); private OpenLoadFlowParameters.ReactiveRangeCheckMode reactiveRangeCheckMode = REACTIVE_RANGE_CHECK_MODE_DEFAULT_VALUE; + private double lowImpedanceThreshold = LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE; + public SlackBusSelector getSlackBusSelector() { return slackBusSelector; } diff --git a/src/test/resources/debug-parameters.json b/src/test/resources/debug-parameters.json index 02983b2897..b9a5570637 100644 --- a/src/test/resources/debug-parameters.json +++ b/src/test/resources/debug-parameters.json @@ -33,11 +33,11 @@ "voltageInitModeOverride" : "NONE", "transformerVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", "dcPowerFactor" : 1.0, - "lowImpedanceThreshold" : 1.0E-8, "minPlausibleTargetVoltage" : 0.8, "maxPlausibleTargetVoltage" : 1.2, "minRealisticVoltage" : 0.5, "maxRealisticVoltage" : 1.5, + "lowImpedanceThreshold" : 1.0E-8, "reactiveRangeCheckMode" : "MAX" } } From 6f3f718f5caffda19a91d8b3b7af441ed669926f Mon Sep 17 00:00:00 2001 From: cluke Date: Fri, 18 Nov 2022 16:37:59 +0100 Subject: [PATCH 10/11] ADD: add test lowImpedanceThreshold Signed-off-by: cluke --- .../openloadflow/OpenLoadFlowParametersTest.java | 13 +++++++++++++ src/test/resources/configLowImpedanceThreshold.yml | 2 ++ 2 files changed, 15 insertions(+) create mode 100644 src/test/resources/configLowImpedanceThreshold.yml diff --git a/src/test/java/com/powsybl/openloadflow/OpenLoadFlowParametersTest.java b/src/test/java/com/powsybl/openloadflow/OpenLoadFlowParametersTest.java index bc23d03281..d3f3daf019 100644 --- a/src/test/java/com/powsybl/openloadflow/OpenLoadFlowParametersTest.java +++ b/src/test/java/com/powsybl/openloadflow/OpenLoadFlowParametersTest.java @@ -210,6 +210,19 @@ void testPlausibleTargetVoltage() { assertEquals(30.0, network.getGenerator("GEN").getRegulatingTerminal().getBusView().getBus().getV(), DELTA_MISMATCH); } + @Test + void testLowImpedanceThreshold() throws IOException { + Path cfgDir = Files.createDirectory(fileSystem.getPath("config")); + Path cfgFile = cfgDir.resolve("configLowImpedanceThreshold.yml"); + + Files.copy(getClass().getResourceAsStream("/configLowImpedanceThreshold.yml"), cfgFile); + PlatformConfig platformConfig = new PlatformConfig(new YamlModuleConfigRepository(cfgFile), cfgDir); + + LoadFlowParameters parameters = LoadFlowParameters.load(platformConfig); + OpenLoadFlowParameters olfParameters = parameters.getExtension(OpenLoadFlowParameters.class); + assertEquals(1.0E-2, olfParameters.getLowImpedanceThreshold()); + } + @Test void testUpdateParameters() { Map parametersMap = new HashMap<>(); diff --git a/src/test/resources/configLowImpedanceThreshold.yml b/src/test/resources/configLowImpedanceThreshold.yml new file mode 100644 index 0000000000..e7a157c7a0 --- /dev/null +++ b/src/test/resources/configLowImpedanceThreshold.yml @@ -0,0 +1,2 @@ +open-loadflow-default-parameters: + lowImpedanceThreshold: 1.0E-2 From 71f73aae048ef1e7a989b981f5f586474f5a79e2 Mon Sep 17 00:00:00 2001 From: Geoffroy Jamgotchian Date: Mon, 28 Nov 2022 20:18:28 +0100 Subject: [PATCH 11/11] Refactor Signed-off-by: Geoffroy Jamgotchian --- .../openloadflow/OpenLoadFlowParameters.java | 5 +- .../openloadflow/OpenLoadFlowProvider.java | 24 ++++---- .../ac/equations/AcEquationSystem.java | 58 +++++++++++-------- .../AcEquationSystemCreationParameters.java | 14 +---- .../ac/outerloop/AcLoadFlowContext.java | 3 +- .../openloadflow/dc/DcLoadFlowEngine.java | 3 +- .../dc/DcValueVoltageInitializer.java | 5 +- .../dc/equations/DcEquationSystem.java | 10 ++-- .../DcEquationSystemCreationParameters.java | 9 +-- .../network/LfNetworkParameters.java | 1 + .../sensi/DcSensitivityAnalysis.java | 6 +- .../FullVoltageInitializerTest.java | 2 +- .../OpenLoadFlowProviderTest.java | 4 +- ...NonImpedantBranchWithBreakerIssueTest.java | 4 +- .../ac/VoltageMagnitudeInitializerTest.java | 14 ++--- .../openloadflow/dc/DcLoadFlowMatrixTest.java | 7 ++- .../equations/EquationSystemTest.java | 2 +- .../network/impl/LfSwitchTest.java | 3 +- 18 files changed, 86 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java index ae8611f712..c7acd0b87e 100644 --- a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java +++ b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java @@ -661,7 +661,7 @@ public static AcLoadFlowParameters createAcParameters(LoadFlowParameters paramet var networkParameters = getNetworkParameters(parameters, parametersExt, slackBusSelector, connectivityFactory, breakers); - var equationSystemCreationParameters = new AcEquationSystemCreationParameters(forceA1Var, parametersExt.getLowImpedanceThreshold()); + var equationSystemCreationParameters = new AcEquationSystemCreationParameters(forceA1Var); VoltageInitializer voltageInitializer = getExtendedVoltageInitializer(parameters, parametersExt, networkParameters, matrixFactory, reporter); @@ -724,8 +724,7 @@ public static DcLoadFlowParameters createDcParameters(LoadFlowParameters paramet var equationSystemCreationParameters = new DcEquationSystemCreationParameters(true, false, forcePhaseControlOffAndAddAngle1Var, - parameters.isDcUseTransformerRatio(), - parametersExt.getLowImpedanceThreshold()); + parameters.isDcUseTransformerRatio()); return new DcLoadFlowParameters(networkParameters, equationSystemCreationParameters, diff --git a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java index 539535ec74..453e2c88b3 100644 --- a/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java +++ b/src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java @@ -33,6 +33,7 @@ import com.powsybl.openloadflow.network.LfBranch; import com.powsybl.openloadflow.network.LfBus; import com.powsybl.openloadflow.network.LfNetwork; +import com.powsybl.openloadflow.network.LfNetworkParameters; import com.powsybl.openloadflow.network.impl.LfNetworkLoaderImpl; import com.powsybl.openloadflow.network.impl.Networks; import com.powsybl.openloadflow.util.*; @@ -178,18 +179,19 @@ private LoadFlowResult runDc(Network network, LoadFlowParameters parameters, Rep Networks.resetState(network); - List componentsResult = results.stream().map(r -> processResult(network, r, parameters)).collect(Collectors.toList()); + List componentsResult = results.stream().map(r -> processResult(network, r, parameters, dcParameters.getNetworkParameters())).collect(Collectors.toList()); boolean ok = results.stream().anyMatch(r -> r.getStatus() == LoadFlowResult.ComponentResult.Status.CONVERGED); return new LoadFlowResultImpl(ok, Collections.emptyMap(), null, componentsResult); } - private LoadFlowResult.ComponentResult processResult(Network network, DcLoadFlowResult pResult, LoadFlowParameters parameters) { - if (pResult.getStatus() == LoadFlowResult.ComponentResult.Status.CONVERGED && parameters.isWriteSlackBus()) { + private LoadFlowResult.ComponentResult processResult(Network network, DcLoadFlowResult result, LoadFlowParameters parameters, + LfNetworkParameters networkParameters) { + if (result.getStatus() == LoadFlowResult.ComponentResult.Status.CONVERGED && parameters.isWriteSlackBus()) { SlackTerminal.reset(network); } - if (pResult.getStatus() == LoadFlowResult.ComponentResult.Status.CONVERGED) { - pResult.getNetwork().updateState(false, + if (result.getStatus() == LoadFlowResult.ComponentResult.Status.CONVERGED) { + result.getNetwork().updateState(false, parameters.isWriteSlackBus(), parameters.isPhaseShifterRegulationOn(), parameters.isTransformerVoltageControlOn(), @@ -197,16 +199,16 @@ private LoadFlowResult.ComponentResult processResult(Network network, DcLoadFlow false, true); // zero or low impedance branch flows computation - computeZeroImpedanceFlows(pResult.getNetwork(), true, OpenLoadFlowParameters.get(parameters).getLowImpedanceThreshold()); + computeZeroImpedanceFlows(result.getNetwork(), true, networkParameters.getLowImpedanceThreshold()); } return new LoadFlowResultImpl.ComponentResultImpl( - pResult.getNetwork().getNumCC(), - pResult.getNetwork().getNumSC(), - pResult.getStatus(), + result.getNetwork().getNumCC(), + result.getNetwork().getNumSC(), + result.getStatus(), 0, - pResult.getNetwork().getSlackBus().getId(), - pResult.getSlackBusActivePowerMismatch() * PerUnit.SB, + result.getNetwork().getSlackBus().getId(), + result.getSlackBusActivePowerMismatch() * PerUnit.SB, Double.NaN); } diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java index ebede41f44..666c261686 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystem.java @@ -25,7 +25,8 @@ private AcEquationSystem() { private static void createBusEquation(LfBus bus, EquationSystem equationSystem, - AcEquationSystemCreationParameters creationParameters) { + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { var p = equationSystem.createEquation(bus, AcEquationType.BUS_TARGET_P); bus.setP(p); var q = equationSystem.createEquation(bus, AcEquationType.BUS_TARGET_Q); @@ -38,7 +39,7 @@ private static void createBusEquation(LfBus bus, p.setActive(false); } - createGeneratorControlEquations(bus, equationSystem, creationParameters); + createGeneratorControlEquations(bus, equationSystem, creationParameters, lowImpedanceThreshold); createShuntEquations(bus, equationSystem); @@ -59,22 +60,24 @@ private static void createBusEquation(LfBus bus, private static void createBusesEquations(LfNetwork network, EquationSystem equationSystem, - AcEquationSystemCreationParameters creationParameters) { + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { for (LfBus bus : network.getBuses()) { - createBusEquation(bus, equationSystem, creationParameters); + createBusEquation(bus, equationSystem, creationParameters, lowImpedanceThreshold); } } private static void createGeneratorControlEquations(LfBus bus, EquationSystem equationSystem, - AcEquationSystemCreationParameters creationParameters) { + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { bus.getVoltageControl() .ifPresent(voltageControl -> { if (bus.isVoltageControlled()) { if (voltageControl.isVoltageControlLocal()) { - createLocalVoltageControlEquation(bus, equationSystem, creationParameters); + createLocalVoltageControlEquation(bus, equationSystem, creationParameters, lowImpedanceThreshold); } else { - createRemoteVoltageControlEquations(voltageControl, equationSystem, creationParameters); + createRemoteVoltageControlEquations(voltageControl, equationSystem, creationParameters, lowImpedanceThreshold); } updateGeneratorVoltageControl(voltageControl, equationSystem); } @@ -83,7 +86,8 @@ private static void createGeneratorControlEquations(LfBus bus, private static void createLocalVoltageControlEquation(LfBus bus, EquationSystem equationSystem, - AcEquationSystemCreationParameters creationParameters) { + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { EquationTerm vTerm = equationSystem.getVariable(bus.getNum(), AcVariableType.BUS_V) .createTerm(); bus.setCalculatedV(vTerm); @@ -96,7 +100,7 @@ private static void createLocalVoltageControlEquation(LfBus bus, // which is modeled here with: V + slope * (sum_branch qBranch) = TargetV - slope * qLoads + slope * qGenerators equationSystem.createEquation(bus, AcEquationType.BUS_TARGET_V_WITH_SLOPE) .addTerm(vTerm) - .addTerms(createReactiveTerms(bus, equationSystem.getVariableSet(), creationParameters) + .addTerms(createReactiveTerms(bus, equationSystem.getVariableSet(), creationParameters, lowImpedanceThreshold) .stream() .map(term -> term.multiply(slope)) .collect(Collectors.toList())); @@ -153,7 +157,8 @@ private static void createShuntEquations(LfBus bus, EquationSystem equationSystem, - AcEquationSystemCreationParameters creationParameters) { + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { LfBus controlledBus = voltageControl.getControlledBus(); // create voltage equation at voltage controlled bus @@ -173,12 +178,12 @@ private static void createRemoteVoltageControlEquations(VoltageControl voltageCo // which can be rewritten in a more simple way // 0 = (qPercent_i - 1) * q_i + qPercent_i * sum_j(q_j) where j are all the voltage controller buses except i Equation zero = equationSystem.createEquation(controllerBus, AcEquationType.DISTR_Q) - .addTerms(createReactiveTerms(controllerBus, equationSystem.getVariableSet(), creationParameters).stream() + .addTerms(createReactiveTerms(controllerBus, equationSystem.getVariableSet(), creationParameters, lowImpedanceThreshold).stream() .map(term -> term.multiply(() -> controllerBus.getRemoteVoltageControlReactivePercent() - 1)) .collect(Collectors.toList())); for (LfBus otherControllerBus : voltageControl.getControllerBuses()) { if (otherControllerBus != controllerBus) { - zero.addTerms(createReactiveTerms(otherControllerBus, equationSystem.getVariableSet(), creationParameters).stream() + zero.addTerms(createReactiveTerms(otherControllerBus, equationSystem.getVariableSet(), creationParameters, lowImpedanceThreshold).stream() .map(term -> term.multiply(controllerBus::getRemoteVoltageControlReactivePercent)) .collect(Collectors.toList())); } @@ -243,11 +248,13 @@ static void updateRemoteVoltageControlEquations(VoltageControl voltageControl, E } private static List> createReactiveTerms(LfBus controllerBus, - VariableSet variableSet, AcEquationSystemCreationParameters creationParameters) { + VariableSet variableSet, + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { List> terms = new ArrayList<>(); for (LfBranch branch : controllerBus.getBranches()) { EquationTerm q; - if (branch.isZeroImpedanceBranch(false, creationParameters.getLowImpedanceThreshold())) { + if (branch.isZeroImpedanceBranch(false, lowImpedanceThreshold)) { if (!branch.isSpanningTreeEdge()) { continue; } @@ -736,10 +743,11 @@ private static void createHvdcAcEmulationEquations(LfHvdc hvdc, EquationSystem equationSystem, - AcEquationSystemCreationParameters creationParameters) { + EquationSystem equationSystem, + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { // create zero and non zero impedance branch equations - if (branch.isZeroImpedanceBranch(false, creationParameters.getLowImpedanceThreshold())) { + if (branch.isZeroImpedanceBranch(false, lowImpedanceThreshold)) { if (branch.isSpanningTreeEdge()) { createNonImpedantBranch(branch, branch.getBus1(), branch.getBus2(), equationSystem); } @@ -750,25 +758,27 @@ private static void createBranchEquations(LfBranch branch, private static void createBranchesEquations(LfNetwork network, EquationSystem equationSystem, - AcEquationSystemCreationParameters creationParameters) { + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { for (LfBranch branch : network.getBranches()) { - createBranchEquations(branch, equationSystem, creationParameters); + createBranchEquations(branch, equationSystem, creationParameters, lowImpedanceThreshold); } } public static EquationSystem create(LfNetwork network) { - return create(network, new AcEquationSystemCreationParameters()); + return create(network, new AcEquationSystemCreationParameters(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); } public static EquationSystem create(LfNetwork network, - AcEquationSystemCreationParameters creationParameters) { + AcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { Objects.requireNonNull(network); Objects.requireNonNull(creationParameters); EquationSystem equationSystem = new EquationSystem<>(true); - createBusesEquations(network, equationSystem, creationParameters); - createBranchesEquations(network, equationSystem, creationParameters); + createBusesEquations(network, equationSystem, creationParameters, lowImpedanceThreshold); + createBranchesEquations(network, equationSystem, creationParameters, lowImpedanceThreshold); for (LfHvdc hvdc : network.getHvdcs()) { createHvdcAcEmulationEquations(hvdc, equationSystem); @@ -776,7 +786,7 @@ public static EquationSystem create(LfNetwork ne EquationSystemPostProcessor.findAll().forEach(pp -> pp.onCreate(equationSystem)); - network.addListener(new AcEquationSystemUpdater(equationSystem, creationParameters.getLowImpedanceThreshold())); + network.addListener(new AcEquationSystemUpdater(equationSystem, lowImpedanceThreshold)); return equationSystem; } diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java index 9b30786c2a..0ef3607f2b 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AcEquationSystemCreationParameters.java @@ -6,8 +6,6 @@ */ package com.powsybl.openloadflow.ac.equations; -import com.powsybl.openloadflow.network.LfNetworkParameters; - /** * @author Geoffroy Jamgotchian */ @@ -15,30 +13,22 @@ public class AcEquationSystemCreationParameters { private final boolean forceA1Var; - private final double lowImpedanceThreshold; - public AcEquationSystemCreationParameters() { - this(false, LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); + this(false); } - public AcEquationSystemCreationParameters(boolean forceA1Var, double lowImpedanceThreshold) { + public AcEquationSystemCreationParameters(boolean forceA1Var) { this.forceA1Var = forceA1Var; - this.lowImpedanceThreshold = lowImpedanceThreshold; } public boolean isForceA1Var() { return forceA1Var; } - public double getLowImpedanceThreshold() { - return lowImpedanceThreshold; - } - @Override public String toString() { return "AcEquationSystemCreationParameters(" + "forceA1Var=" + forceA1Var + - ", lowImpedanceThreshold=" + lowImpedanceThreshold + ')'; } } diff --git a/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcLoadFlowContext.java b/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcLoadFlowContext.java index 3fae7b87d5..7df9bad98b 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcLoadFlowContext.java +++ b/src/main/java/com/powsybl/openloadflow/ac/outerloop/AcLoadFlowContext.java @@ -49,7 +49,8 @@ public AcLoadFlowParameters getParameters() { public EquationSystem getEquationSystem() { if (equationSystem == null) { - equationSystem = AcEquationSystem.create(network, parameters.getEquationSystemCreationParameters()); + equationSystem = AcEquationSystem.create(network, parameters.getEquationSystemCreationParameters(), + parameters.getNetworkParameters().getLowImpedanceThreshold()); } return equationSystem; } diff --git a/src/main/java/com/powsybl/openloadflow/dc/DcLoadFlowEngine.java b/src/main/java/com/powsybl/openloadflow/dc/DcLoadFlowEngine.java index 88bbab5bc0..317245e6f4 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/DcLoadFlowEngine.java +++ b/src/main/java/com/powsybl/openloadflow/dc/DcLoadFlowEngine.java @@ -66,7 +66,8 @@ public List run(Reporter reporter) { } private DcLoadFlowResult run(Reporter reporter, LfNetwork network) { - EquationSystem equationSystem = DcEquationSystem.create(network, parameters.getEquationSystemCreationParameters()); + EquationSystem equationSystem = DcEquationSystem.create(network, parameters.getEquationSystemCreationParameters(), + parameters.getNetworkParameters().getLowImpedanceThreshold()); LoadFlowResult.ComponentResult.Status status = LoadFlowResult.ComponentResult.Status.FAILED; try (JacobianMatrix j = new JacobianMatrix<>(equationSystem, parameters.getMatrixFactory())) { diff --git a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java index 7256c3bfaa..9160eeb0a3 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java +++ b/src/main/java/com/powsybl/openloadflow/dc/DcValueVoltageInitializer.java @@ -35,8 +35,6 @@ public class DcValueVoltageInitializer implements VoltageInitializer { private final Reporter reporter; - private final double lowImpedanceThreshold; - public DcValueVoltageInitializer(LfNetworkParameters networkParameters, boolean distributedSlack, LoadFlowParameters.BalanceType balanceType, boolean useTransformerRatio, MatrixFactory matrixFactory, Reporter reporter) { this.networkParameters = Objects.requireNonNull(networkParameters); @@ -45,7 +43,6 @@ public DcValueVoltageInitializer(LfNetworkParameters networkParameters, boolean this.useTransformerRatio = useTransformerRatio; this.matrixFactory = Objects.requireNonNull(matrixFactory); this.reporter = Objects.requireNonNull(reporter); - this.lowImpedanceThreshold = networkParameters.getLowImpedanceThreshold(); } @Override @@ -55,7 +52,7 @@ public void prepare(LfNetwork network) { List busStates = distributedSlack ? ElementState.save(network.getBuses(), BusDcState::save) : null; DcLoadFlowParameters parameters = new DcLoadFlowParameters(networkParameters, - new DcEquationSystemCreationParameters(false, false, false, useTransformerRatio, lowImpedanceThreshold), + new DcEquationSystemCreationParameters(false, false, false, useTransformerRatio), matrixFactory, distributedSlack, balanceType, diff --git a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java index fc44686a58..fee553af74 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java +++ b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystem.java @@ -106,12 +106,13 @@ private static void createImpedantBranch(EquationSystem equationSystem, - DcEquationSystemCreationParameters creationParameters) { + DcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { List nonImpedantBranches = new ArrayList<>(); for (LfBranch branch : network.getBranches()) { LfBus bus1 = branch.getBus1(); LfBus bus2 = branch.getBus2(); - if (branch.isZeroImpedanceBranch(true, creationParameters.getLowImpedanceThreshold())) { + if (branch.isZeroImpedanceBranch(true, lowImpedanceThreshold)) { if (bus1 != null && bus2 != null) { nonImpedantBranches.add(branch); } @@ -136,11 +137,12 @@ private static void createBranches(LfNetwork network, EquationSystem create(LfNetwork network, DcEquationSystemCreationParameters creationParameters) { + public static EquationSystem create(LfNetwork network, DcEquationSystemCreationParameters creationParameters, + double lowImpedanceThreshold) { EquationSystem equationSystem = new EquationSystem<>(creationParameters.isIndexTerms()); createBuses(network, equationSystem); - createBranches(network, equationSystem, creationParameters); + createBranches(network, equationSystem, creationParameters, lowImpedanceThreshold); EquationSystemPostProcessor.findAll().forEach(pp -> pp.onCreate(equationSystem)); diff --git a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java index 76937f411b..e05444f07b 100644 --- a/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java +++ b/src/main/java/com/powsybl/openloadflow/dc/equations/DcEquationSystemCreationParameters.java @@ -23,15 +23,12 @@ public class DcEquationSystemCreationParameters { private final boolean useTransformerRatio; - private final double lowImpedanceThreshold; - public DcEquationSystemCreationParameters(boolean updateFlows, boolean indexTerms, boolean forcePhaseControlOffAndAddAngle1Var, - boolean useTransformerRatio, double lowImpedanceThreshold) { + boolean useTransformerRatio) { this.updateFlows = updateFlows; this.indexTerms = indexTerms; this.forcePhaseControlOffAndAddAngle1Var = forcePhaseControlOffAndAddAngle1Var; this.useTransformerRatio = useTransformerRatio; - this.lowImpedanceThreshold = lowImpedanceThreshold; } public boolean isUpdateFlows() { @@ -50,10 +47,6 @@ public boolean isUseTransformerRatio() { return useTransformerRatio; } - public double getLowImpedanceThreshold() { - return lowImpedanceThreshold; - } - @Override public String toString() { return "DcEquationSystemCreationParameters(" + diff --git a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java index 7824f66f6b..667b6af53b 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java @@ -314,6 +314,7 @@ public String toString() { ", maxPlausibleTargetVoltage=" + maxPlausibleTargetVoltage + ", loaderPostProcessorSelection=" + loaderPostProcessorSelection + ", reactiveRangeCheckMode=" + reactiveRangeCheckMode + + ", lowImpedanceThreshold=" + lowImpedanceThreshold + ')'; } } diff --git a/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java b/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java index 568d09310c..833fe355ab 100644 --- a/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java +++ b/src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java @@ -217,8 +217,7 @@ private static DcLoadFlowParameters createDcLoadFlowParameters(LfNetworkParamete var equationSystemCreationParameters = new DcEquationSystemCreationParameters(true, true, true, - lfParameters.isDcUseTransformerRatio(), - networkParameters.getLowImpedanceThreshold()); + lfParameters.isDcUseTransformerRatio()); return new DcLoadFlowParameters(networkParameters, equationSystemCreationParameters, @@ -833,7 +832,8 @@ public void analyse(Network network, List contingencies, var dcLoadFlowParameters = createDcLoadFlowParameters(lfNetworkParameters, matrixFactory, lfParameters); // create DC equation system for sensitivity analysis - EquationSystem equationSystem = DcEquationSystem.create(lfNetwork, dcLoadFlowParameters.getEquationSystemCreationParameters()); + EquationSystem equationSystem = DcEquationSystem.create(lfNetwork, dcLoadFlowParameters.getEquationSystemCreationParameters(), + dcLoadFlowParameters.getNetworkParameters().getLowImpedanceThreshold()); // next we only work with valid factors var validFactorHolder = writeInvalidFactors(allFactorHolder, resultWriter); diff --git a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java index 6a7565ddd5..1309078600 100644 --- a/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/FullVoltageInitializerTest.java @@ -34,7 +34,7 @@ void testEsgTuto1() { SlackBusSelector slackBusSelector = new FirstSlackBusSelector(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), slackBusSelector).get(0); MatrixFactory matrixFactory = new DenseMatrixFactory(); - FullVoltageInitializer initializer = new FullVoltageInitializer(new VoltageMagnitudeInitializer(false, matrixFactory, 1.0E-8), + FullVoltageInitializer initializer = new FullVoltageInitializer(new VoltageMagnitudeInitializer(false, matrixFactory, LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE), new DcValueVoltageInitializer(new LfNetworkParameters().setSlackBusSelector(slackBusSelector), false, LoadFlowParameters.BalanceType.PROPORTIONAL_TO_GENERATION_P_MAX, diff --git a/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java b/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java index 0fcb9dd3cb..d7994922c4 100644 --- a/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java +++ b/src/test/java/com/powsybl/openloadflow/OpenLoadFlowProviderTest.java @@ -50,7 +50,7 @@ void test() { void testDcParameters() { Network network = Mockito.mock(Network.class); DcLoadFlowParameters dcParameters = OpenLoadFlowParameters.createDcParameters(network, new LoadFlowParameters().setReadSlackBus(true), new OpenLoadFlowParameters(), new DenseMatrixFactory(), new EvenShiloachGraphDecrementalConnectivityFactory<>(), true); - assertEquals("DcLoadFlowParameters(networkParameters=LfNetworkParameters(slackBusSelector=NetworkSlackBusSelector, connectivityFactory=EvenShiloachGraphDecrementalConnectivityFactory, generatorVoltageRemoteControl=false, minImpedance=false, twtSplitShuntAdmittance=false, breakers=false, plausibleActivePowerLimit=5000.0, computeMainConnectedComponentOnly=true, countriesToBalance=[], distributedOnConformLoad=false, phaseControl=false, transformerVoltageControl=false, voltagePerReactivePowerControl=false, reactivePowerRemoteControl=false, dc=true, reactiveLimits=false, hvdcAcEmulation=false, minPlausibleTargetVoltage=0.8, maxPlausibleTargetVoltage=1.2, loaderPostProcessorSelection=[], reactiveRangeCheckMode=MAX), equationSystemCreationParameters=DcEquationSystemCreationParameters(updateFlows=true, indexTerms=false, forcePhaseControlOffAndAddAngle1Var=true, useTransformerRatio=true), matrixFactory=DenseMatrixFactory, distributedSlack=true, balanceType=PROPORTIONAL_TO_GENERATION_P_MAX, setVToNan=true)", + assertEquals("DcLoadFlowParameters(networkParameters=LfNetworkParameters(slackBusSelector=NetworkSlackBusSelector, connectivityFactory=EvenShiloachGraphDecrementalConnectivityFactory, generatorVoltageRemoteControl=false, minImpedance=false, twtSplitShuntAdmittance=false, breakers=false, plausibleActivePowerLimit=5000.0, computeMainConnectedComponentOnly=true, countriesToBalance=[], distributedOnConformLoad=false, phaseControl=false, transformerVoltageControl=false, voltagePerReactivePowerControl=false, reactivePowerRemoteControl=false, dc=true, reactiveLimits=false, hvdcAcEmulation=false, minPlausibleTargetVoltage=0.8, maxPlausibleTargetVoltage=1.2, loaderPostProcessorSelection=[], reactiveRangeCheckMode=MAX, lowImpedanceThreshold=1.0E-8), equationSystemCreationParameters=DcEquationSystemCreationParameters(updateFlows=true, indexTerms=false, forcePhaseControlOffAndAddAngle1Var=true, useTransformerRatio=true), matrixFactory=DenseMatrixFactory, distributedSlack=true, balanceType=PROPORTIONAL_TO_GENERATION_P_MAX, setVToNan=true)", dcParameters.toString()); } @@ -58,7 +58,7 @@ void testDcParameters() { void testAcParameters() { Network network = Mockito.mock(Network.class); AcLoadFlowParameters acParameters = OpenLoadFlowParameters.createAcParameters(network, new LoadFlowParameters().setReadSlackBus(true), new OpenLoadFlowParameters(), new DenseMatrixFactory(), new EvenShiloachGraphDecrementalConnectivityFactory<>(), Reporter.NO_OP, false, false); - assertEquals("AcLoadFlowParameters(networkParameters=LfNetworkParameters(slackBusSelector=NetworkSlackBusSelector, connectivityFactory=EvenShiloachGraphDecrementalConnectivityFactory, generatorVoltageRemoteControl=true, minImpedance=false, twtSplitShuntAdmittance=false, breakers=false, plausibleActivePowerLimit=5000.0, computeMainConnectedComponentOnly=true, countriesToBalance=[], distributedOnConformLoad=false, phaseControl=false, transformerVoltageControl=false, voltagePerReactivePowerControl=false, reactivePowerRemoteControl=false, dc=false, reactiveLimits=true, hvdcAcEmulation=true, minPlausibleTargetVoltage=0.8, maxPlausibleTargetVoltage=1.2, loaderPostProcessorSelection=[], reactiveRangeCheckMode=MAX), equationSystemCreationParameters=AcEquationSystemCreationParameters(forceA1Var=false, lowImpedanceThreshold=1.0E-8), newtonRaphsonParameters=NewtonRaphsonParameters(maxIteration=30, minRealisticVoltage=0.5, maxRealisticVoltage=1.5, stoppingCriteria=DefaultNewtonRaphsonStoppingCriteria), outerLoops=[DistributedSlackOuterLoop, ReactiveLimitsOuterLoop], matrixFactory=DenseMatrixFactory, voltageInitializer=UniformValueVoltageInitializer)", + assertEquals("AcLoadFlowParameters(networkParameters=LfNetworkParameters(slackBusSelector=NetworkSlackBusSelector, connectivityFactory=EvenShiloachGraphDecrementalConnectivityFactory, generatorVoltageRemoteControl=true, minImpedance=false, twtSplitShuntAdmittance=false, breakers=false, plausibleActivePowerLimit=5000.0, computeMainConnectedComponentOnly=true, countriesToBalance=[], distributedOnConformLoad=false, phaseControl=false, transformerVoltageControl=false, voltagePerReactivePowerControl=false, reactivePowerRemoteControl=false, dc=false, reactiveLimits=true, hvdcAcEmulation=true, minPlausibleTargetVoltage=0.8, maxPlausibleTargetVoltage=1.2, loaderPostProcessorSelection=[], reactiveRangeCheckMode=MAX, lowImpedanceThreshold=1.0E-8), equationSystemCreationParameters=AcEquationSystemCreationParameters(forceA1Var=false), newtonRaphsonParameters=NewtonRaphsonParameters(maxIteration=30, minRealisticVoltage=0.5, maxRealisticVoltage=1.5, stoppingCriteria=DefaultNewtonRaphsonStoppingCriteria), outerLoops=[DistributedSlackOuterLoop, ReactiveLimitsOuterLoop], matrixFactory=DenseMatrixFactory, voltageInitializer=UniformValueVoltageInitializer)", acParameters.toString()); } diff --git a/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java b/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java index 43bec3e2f1..0185192dcf 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/NonImpedantBranchWithBreakerIssueTest.java @@ -37,7 +37,7 @@ void busBreakerAndNonImpedantBranchIssue() { network.getGenerator("G2").newMinMaxReactiveLimits().setMaxQ(100).setMinQ(-100).add(); LfNetworkParameters networkParameters = new LfNetworkParameters() .setBreakers(true); - AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false, networkParameters.getLowImpedanceThreshold()); + AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false); NewtonRaphsonParameters newtonRaphsonParameters = new NewtonRaphsonParameters(); LfNetwork lfNetwork = Networks.load(network, networkParameters).get(0); AcLoadFlowParameters acLoadFlowParameters = new AcLoadFlowParameters(networkParameters, equationSystemCreationParameters, @@ -61,7 +61,7 @@ void busBreakerAndNonImpedantBranchIssueRef() { Network network = NodeBreakerNetworkFactory.create3barsAndJustOneVoltageLevel(); LfNetworkParameters networkParameters = new LfNetworkParameters(); LfNetwork lfNetwork = Networks.load(network, networkParameters).get(0); - AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false, networkParameters.getLowImpedanceThreshold()); + AcEquationSystemCreationParameters equationSystemCreationParameters = new AcEquationSystemCreationParameters(false); NewtonRaphsonParameters newtonRaphsonParameters = new NewtonRaphsonParameters(); AcLoadFlowParameters acLoadFlowParameters = new AcLoadFlowParameters(networkParameters, equationSystemCreationParameters, newtonRaphsonParameters, Collections.emptyList(), diff --git a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java index d17b8b59f2..8c1bdaf5a9 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/VoltageMagnitudeInitializerTest.java @@ -43,7 +43,7 @@ public static void assertBusVoltage(LfNetwork network, VoltageInitializer initia void testEsgTuto1() { Network network = EurostagTutorialExample1Factory.create(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VLGEN_0", 1.020833, 0); assertBusVoltage(lfNetwork, initializer, "VLHV1_0", 1.074561, 0); @@ -55,7 +55,7 @@ void testEsgTuto1() { void testIeee14() { Network network = IeeeCdfNetworkFactory.create14(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); @@ -78,7 +78,7 @@ void testZeroImpedanceBranch() { Network network = IeeeCdfNetworkFactory.create14(); network.getLine("L9-14-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); @@ -101,7 +101,7 @@ void testZeroImpedanceBranchConnectedToPvBus() { Network network = IeeeCdfNetworkFactory.create14(); network.getLine("L6-11-1").setX(0); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); @@ -141,7 +141,7 @@ void testParallelBranch() { .setB2(0) .add(); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); @@ -163,7 +163,7 @@ void testParallelBranch() { void testZeroImpedanceLoop() { Network network = Importers.importData("XIIDM", new ResourceDataSource("init_v_zero_imp_loop", new ResourceSet("/", "init_v_zero_imp_loop.xiidm")), null); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), new FirstSlackBusSelector()).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(false, new DenseMatrixFactory(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "B_0", 0.982318, 0); assertBusVoltage(lfNetwork, initializer, "D_0", 0.982318, 0); @@ -197,7 +197,7 @@ void testWithTransformerVoltageControl() { LfNetworkParameters networkParameters = new LfNetworkParameters() .setTransformerVoltageControl(true); LfNetwork lfNetwork = LfNetwork.load(network, new LfNetworkLoaderImpl(), networkParameters).get(0); - VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(true, new DenseMatrixFactory(), 1.0E-8); + VoltageMagnitudeInitializer initializer = new VoltageMagnitudeInitializer(true, new DenseMatrixFactory(), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); initializer.prepare(lfNetwork); assertBusVoltage(lfNetwork, initializer, "VL1_0", 1.06, 0); assertBusVoltage(lfNetwork, initializer, "VL2_0", 1.045, 0); diff --git a/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java b/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java index b19e8a2104..57d3288302 100644 --- a/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java +++ b/src/test/java/com/powsybl/openloadflow/dc/DcLoadFlowMatrixTest.java @@ -20,6 +20,7 @@ import com.powsybl.openloadflow.network.FirstSlackBusSelector; import com.powsybl.openloadflow.network.LfBus; import com.powsybl.openloadflow.network.LfNetwork; +import com.powsybl.openloadflow.network.LfNetworkParameters; import com.powsybl.openloadflow.network.impl.Networks; import com.powsybl.openloadflow.network.util.UniformValueVoltageInitializer; import org.junit.jupiter.api.Test; @@ -57,8 +58,8 @@ void buildDcMatrix() { List lfNetworks = Networks.load(network, new FirstSlackBusSelector()); LfNetwork mainNetwork = lfNetworks.get(0); - DcEquationSystemCreationParameters creationParameters = new DcEquationSystemCreationParameters(true, false, false, true, 1.0E-8); - EquationSystem equationSystem = DcEquationSystem.create(mainNetwork, creationParameters); + DcEquationSystemCreationParameters creationParameters = new DcEquationSystemCreationParameters(true, false, false, true); + EquationSystem equationSystem = DcEquationSystem.create(mainNetwork, creationParameters, LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); for (LfBus b : mainNetwork.getBuses()) { equationSystem.createEquation(b.getNum(), DcEquationType.BUS_TARGET_P); @@ -106,7 +107,7 @@ void buildDcMatrix() { lfNetworks = Networks.load(network, new FirstSlackBusSelector()); mainNetwork = lfNetworks.get(0); - equationSystem = DcEquationSystem.create(mainNetwork, creationParameters); + equationSystem = DcEquationSystem.create(mainNetwork, creationParameters, LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); j = new JacobianMatrix<>(equationSystem, matrixFactory).getMatrix(); diff --git a/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java b/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java index 89331cf9cb..703cdf1ae2 100644 --- a/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java +++ b/src/test/java/com/powsybl/openloadflow/equations/EquationSystemTest.java @@ -173,7 +173,7 @@ void writeDcSystemTest() { List lfNetworks = Networks.load(EurostagTutorialExample1Factory.create(), new FirstSlackBusSelector()); LfNetwork network = lfNetworks.get(0); - EquationSystem equationSystem = DcEquationSystem.create(network, new DcEquationSystemCreationParameters(true, false, false, true, 1.0E-8)); + EquationSystem equationSystem = DcEquationSystem.create(network, new DcEquationSystemCreationParameters(true, false, false, true), LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); String ref = String.join(System.lineSeparator(), "bus_target_φ0 = φ0", "bus_target_p1 = dc_p_2(φ0, φ1) + dc_p_1(φ1, φ2) + dc_p_1(φ1, φ2)", diff --git a/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java b/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java index 52023239e3..db7fb272c6 100644 --- a/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java +++ b/src/test/java/com/powsybl/openloadflow/network/impl/LfSwitchTest.java @@ -18,6 +18,7 @@ import com.powsybl.openloadflow.equations.VariableSet; import com.powsybl.openloadflow.graph.EvenShiloachGraphDecrementalConnectivityFactory; import com.powsybl.openloadflow.network.LfNetwork; +import com.powsybl.openloadflow.network.LfNetworkParameters; import com.powsybl.openloadflow.network.NodeBreakerNetworkFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -67,7 +68,7 @@ void getterTest() { @Test void setterTest() { - lfSwitch.getPiModel().setX(1.0E-8); + lfSwitch.getPiModel().setX(LfNetworkParameters.LOW_IMPEDANCE_THRESHOLD_DEFAULT_VALUE); VariableSet variableSet = new VariableSet<>(); EquationTerm p1 = new ClosedBranchSide1ActiveFlowEquationTerm(lfSwitch, lfSwitch.getBus1(), lfSwitch.getBus2(), variableSet, false, false);