From ce1309fb9949380cd75245a3cf8d3f0a55dff688 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 13 Jan 2025 15:39:09 +0100 Subject: [PATCH 1/5] Added support for topologies without transformers and slack grids with multiple nodes --- CHANGELOG.md | 1 + .../ie3/simona/agent/grid/DBFSAlgorithm.scala | 51 +----- .../edu/ie3/simona/agent/grid/GridAgent.scala | 14 +- .../simona/agent/grid/GridAgentMessages.scala | 1 + .../simona/agent/grid/PowerFlowSupport.scala | 68 +++++++ .../sim/setup/SimonaStandaloneSetup.scala | 12 +- .../agent/grid/DBFSMockGridAgents.scala | 2 +- .../agent/grid/PowerFlowSupportSpec.scala | 168 +++++++++++++++++- 8 files changed, 261 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 416c701666..73b83b1448 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Create `CITATION.cff` [#1035](https://github.com/ie3-institute/simona/issues/1035) - Introduce ThermalDemandWrapper [#1049](https://github.com/ie3-institute/simona/issues/1049) - Added Marius Staudt to list of reviewers [#1057](https://github.com/ie3-institute/simona/issues/1057) +- Added support for topologies without transformers and slack grids with multiple nodes [#1099](https://github.com/ie3-institute/simona/issues/1099) ### Changed - Adapted to changed data source in PSDM [#435](https://github.com/ie3-institute/simona/issues/435) diff --git a/src/main/scala/edu/ie3/simona/agent/grid/DBFSAlgorithm.scala b/src/main/scala/edu/ie3/simona/agent/grid/DBFSAlgorithm.scala index d0a23ea6da..ae5140899d 100644 --- a/src/main/scala/edu/ie3/simona/agent/grid/DBFSAlgorithm.scala +++ b/src/main/scala/edu/ie3/simona/agent/grid/DBFSAlgorithm.scala @@ -6,7 +6,7 @@ package edu.ie3.simona.agent.grid -import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.linalg.DenseVector import breeze.math.Complex import edu.ie3.datamodel.graph.SubGridGate import edu.ie3.powerflow.model.FailureCause.CalculationFailed @@ -806,7 +806,7 @@ trait DBFSAlgorithm extends PowerFlowSupport with GridResultsSupport { * @return * a [[Behavior]] */ - private def checkPowerDifferences( + private[grid] def checkPowerDifferences( gridAgentBaseData: GridAgentBaseData )(implicit constantData: GridAgentConstantData, @@ -817,50 +817,11 @@ trait DBFSAlgorithm extends PowerFlowSupport with GridResultsSupport { ctx.log.debug("Starting the power differences check ...") val currentSweepNo = gridAgentBaseData.currentSweepNo - val gridModel = gridAgentBaseData.gridEnv.gridModel - - /* This is the highest grid agent, therefore no data is received for the slack node. Suppress, that it is looked - * up in the empty store. */ - val (operationPoint, slackNodeVoltages) = composeOperatingPoint( - gridModel.gridComponents.nodes, - gridModel.gridComponents.transformers, - gridModel.gridComponents.transformers3w, - gridModel.nodeUuidToIndexMap, + slackGridPF( + gridAgentBaseData.gridEnv.gridModel, gridAgentBaseData.receivedValueStore, - gridModel.mainRefSystem, - targetVoltageFromReceivedData = false, - ) - - /* Regarding the power flow result of this grid, there are two cases. If this is the "highest" grid in a - * simulation without a three winding transformer, the grid consists of only one node, and we can mock the power - * flow results. If there is a three winding transformer apparent, we actually have to perform power flow - * calculations, as the high voltage branch of the transformer is modeled here. */ - (if (gridModel.gridComponents.transformers3w.isEmpty) { - val nodeData = operationPoint.map(StateData(_)) - ValidNewtonRaphsonPFResult(-1, nodeData, DenseMatrix(0d, 0d)) - } else { - ctx.log.debug( - "This grid contains a three winding transformer. Perform power flow calculations before assessing the power deviations." - ) - newtonRaphsonPF( - gridModel, - gridAgentBaseData.powerFlowParams.maxIterations, - operationPoint, - slackNodeVoltages, - )(gridAgentBaseData.powerFlowParams.epsilon)(ctx.log) match { - case validPowerFlowResult: ValidNewtonRaphsonPFResult => - ctx.log.debug( - "{}", - composeValidNewtonRaphsonPFResultVoltagesDebugString( - validPowerFlowResult, - gridModel, - ), - ) - validPowerFlowResult - case result: PowerFlowResult.FailedPowerFlowResult => - result - } - }) match { + gridAgentBaseData.powerFlowParams, + )(ctx.log) match { case validResult: ValidNewtonRaphsonPFResult => val updatedGridAgentBaseData: GridAgentBaseData = gridAgentBaseData diff --git a/src/main/scala/edu/ie3/simona/agent/grid/GridAgent.scala b/src/main/scala/edu/ie3/simona/agent/grid/GridAgent.scala index c9bca30ce1..f7e82f854c 100644 --- a/src/main/scala/edu/ie3/simona/agent/grid/GridAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/grid/GridAgent.scala @@ -81,25 +81,30 @@ object GridAgent extends DBFSAlgorithm { simonaConfig: SimonaConfig, ): Behavior[Request] = Behaviors.receiveMessagePartial { - case CreateGridAgent(gridAgentInitData, unlockKey) => + case CreateGridAgent(gridAgentInitData, unlockKey, onlyOneSubGrid) => constantData.environmentRefs.scheduler ! ScheduleActivation( constantData.activationAdapter, INIT_SIM_TICK, Some(unlockKey), ) - initializing(gridAgentInitData, simonaConfig) + initializing(gridAgentInitData, simonaConfig, onlyOneSubGrid) } private def initializing( gridAgentInitData: GridAgentInitData, simonaConfig: SimonaConfig, + onlyOneSubGrid: Boolean, )(implicit constantData: GridAgentConstantData, buffer: StashBuffer[Request], ): Behavior[Request] = Behaviors.receivePartial { case (ctx, WrappedActivation(Activation(INIT_SIM_TICK))) => // fail fast sanity checks - failFast(gridAgentInitData, SimonaActorNaming.actorName(ctx.self)) + failFast( + gridAgentInitData, + SimonaActorNaming.actorName(ctx.self), + onlyOneSubGrid, + ) ctx.log.debug( s"Inferior Subnets: {}; Inferior Subnet Nodes: {}", @@ -227,9 +232,10 @@ object GridAgent extends DBFSAlgorithm { private def failFast( gridAgentInitData: GridAgentInitData, actorName: String, + onlyOneSubGrid: Boolean, ): Unit = { if ( - gridAgentInitData.superiorGridGates.isEmpty && gridAgentInitData.inferiorGridGates.isEmpty + gridAgentInitData.superiorGridGates.isEmpty && gridAgentInitData.inferiorGridGates.isEmpty && !onlyOneSubGrid ) throw new GridAgentInitializationException( s"$actorName has neither superior nor inferior grids! This can either " + diff --git a/src/main/scala/edu/ie3/simona/agent/grid/GridAgentMessages.scala b/src/main/scala/edu/ie3/simona/agent/grid/GridAgentMessages.scala index 288add1bd9..e024cfe3f6 100644 --- a/src/main/scala/edu/ie3/simona/agent/grid/GridAgentMessages.scala +++ b/src/main/scala/edu/ie3/simona/agent/grid/GridAgentMessages.scala @@ -34,6 +34,7 @@ object GridAgentMessages { final case class CreateGridAgent( gridAgentInitData: GridAgentInitData, unlockKey: ScheduleKey, + onlyOneSubGrid: Boolean = false, ) extends GridAgent.InternalRequest /** Trigger used inside of [[edu.ie3.simona.agent.grid.DBFSAlgorithm]] to diff --git a/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala b/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala index c43700466c..8f3da56cf7 100644 --- a/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala +++ b/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala @@ -6,6 +6,7 @@ package edu.ie3.simona.agent.grid +import breeze.linalg.DenseMatrix import breeze.math.Complex import edu.ie3.powerflow.NewtonRaphsonPF import edu.ie3.powerflow.model.NodeData.{PresetData, StateData} @@ -611,4 +612,71 @@ trait PowerFlowSupport { ) } } + + /** Calculates the power flow for the grid that contains the slack node. + * @param gridModel model of the slack grid + * @param receivedValueStore received values + * @param powerFlowParams parameters for the power flow calculation + * @param log for logging + * @return power flow results + */ + protected final def slackGridPF( + gridModel: GridModel, + receivedValueStore: ReceivedValuesStore, + powerFlowParams: PowerFlowParams, + )(implicit log: Logger): PowerFlowResult = { + /* This is the highest grid agent, therefore no data is received for the slack node. Suppress, that it is looked + * up in the empty store. */ + val (operationPoint, slackNodeVoltages) = composeOperatingPoint( + gridModel.gridComponents.nodes, + gridModel.gridComponents.transformers, + gridModel.gridComponents.transformers3w, + gridModel.nodeUuidToIndexMap, + receivedValueStore, + gridModel.mainRefSystem, + targetVoltageFromReceivedData = false, + ) + + def superiorPowerFlow: PowerFlowResult = + newtonRaphsonPF( + gridModel, + powerFlowParams.maxIterations, + operationPoint, + slackNodeVoltages, + )(powerFlowParams.epsilon) match { + case validPowerFlowResult: ValidNewtonRaphsonPFResult => + log.debug( + "{}", + composeValidNewtonRaphsonPFResultVoltagesDebugString( + validPowerFlowResult, + gridModel, + ), + ) + validPowerFlowResult + case result: PowerFlowResult.FailedPowerFlowResult => + result + } + + /* Regarding the power flow result of this grid, there are two cases. If this is the "highest" grid in a + * simulation without a three winding transformer, the grid consists of only one node, and we can mock the power + * flow results. If there is a three winding transformer apparent, we actually have to perform power flow + * calculations, as the high voltage branch of the transformer is modeled here. */ + gridModel.gridComponents.transformers3w.isEmpty match { + case true if gridModel.gridComponents.nodes.size == 1 => + val nodeData = operationPoint.map(StateData(_)) + ValidNewtonRaphsonPFResult(-1, nodeData, DenseMatrix(0d, 0d)) + + case true => + log.warn( + "This grid contains a more than just a slack node. Perform power flow calculations before assessing the power deviations." + ) + superiorPowerFlow + + case false => + log.debug( + "This grid contains a three winding transformer. Perform power flow calculations before assessing the power deviations." + ) + superiorPowerFlow + } + } } diff --git a/src/main/scala/edu/ie3/simona/sim/setup/SimonaStandaloneSetup.scala b/src/main/scala/edu/ie3/simona/sim/setup/SimonaStandaloneSetup.scala index 3e62408033..0894ad3978 100644 --- a/src/main/scala/edu/ie3/simona/sim/setup/SimonaStandaloneSetup.scala +++ b/src/main/scala/edu/ie3/simona/sim/setup/SimonaStandaloneSetup.scala @@ -108,9 +108,13 @@ class SimonaStandaloneSetup( ) /* build the initialization data */ - subGridTopologyGraph + val subGrids = subGridTopologyGraph .vertexSet() .asScala + + val onlyOneSubGrid = subGrids.size == 1 + + subGrids .zip(keys) .map { case (subGridContainer, key) => /* Get all connections to superior and inferior sub grids */ @@ -140,7 +144,11 @@ class SimonaStandaloneSetup( thermalGrids, ) - currentActorRef ! CreateGridAgent(gridAgentInitData, key) + currentActorRef ! CreateGridAgent( + gridAgentInitData, + key, + onlyOneSubGrid, + ) currentActorRef } diff --git a/src/test/scala/edu/ie3/simona/agent/grid/DBFSMockGridAgents.scala b/src/test/scala/edu/ie3/simona/agent/grid/DBFSMockGridAgents.scala index c1f5a1e885..0a914ab763 100644 --- a/src/test/scala/edu/ie3/simona/agent/grid/DBFSMockGridAgents.scala +++ b/src/test/scala/edu/ie3/simona/agent/grid/DBFSMockGridAgents.scala @@ -103,7 +103,7 @@ trait DBFSMockGridAgents extends UnitSpec { def expectSlackVoltageRequest( expectedSweepNo: Int ): ActorRef[GridAgent.Request] = - gaProbe.expectMessageType[GridAgent.Request] match { + gaProbe.expectMessageType[GridAgent.Request](10.seconds) match { case requestSlackVoltageMessage: SlackVoltageRequest => requestSlackVoltageMessage.currentSweepNo shouldBe expectedSweepNo requestSlackVoltageMessage.nodeUuids should have size nodeUuids.size diff --git a/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala b/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala index 2ba7d1da07..3aa1441c36 100644 --- a/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala @@ -6,14 +6,31 @@ package edu.ie3.simona.agent.grid +import edu.ie3.datamodel.models.input.MeasurementUnitInput +import edu.ie3.datamodel.models.input.connector.{ + SwitchInput, + Transformer2WInput, + Transformer3WInput, +} +import edu.ie3.datamodel.models.input.container.{ + RawGridElements, + SubGridContainer, +} +import edu.ie3.powerflow.model.PowerFlowResult import edu.ie3.powerflow.model.PowerFlowResult.SuccessFullPowerFlowResult.ValidNewtonRaphsonPFResult import edu.ie3.simona.agent.grid.GridAgentMessages.Responses.{ ExchangePower, ExchangeVoltage, } -import edu.ie3.simona.model.grid.GridModel -import edu.ie3.simona.test.common.UnitSpec -import edu.ie3.simona.test.common.model.grid.BasicGridWithSwitches +import edu.ie3.simona.config.SimonaConfig.Simona +import edu.ie3.simona.model.grid.{GridModel, RefSystem} +import edu.ie3.simona.test.common.model.grid.{ + BasicGridWithSwitches, + DbfsTestGrid, +} +import edu.ie3.simona.test.common.{ConfigTestData, UnitSpec} +import edu.ie3.simona.util.TestGridFactory +import edu.ie3.util.TimeUtil import edu.ie3.util.quantities.QuantityUtils.RichQuantityDouble import edu.ie3.util.scala.quantities.Megavars import org.apache.pekko.actor.testkit.typed.scaladsl.{ @@ -24,10 +41,14 @@ import org.apache.pekko.actor.typed.ActorRef import org.slf4j.{Logger, LoggerFactory} import squants.electro.Kilovolts import squants.energy.Megawatts +import squants.{Dimensionless, Each} import tech.units.indriya.ComparableQuantity -import java.time.ZonedDateTime +import java.time.{Duration, ZonedDateTime} +import java.util.UUID import javax.measure.quantity.Angle +import scala.jdk.CollectionConverters.SetHasAsJava +import scala.language.implicitConversions /** Tests power flow on a grid with switches on two branches, where depending on * whether switches are opened or closed, current flows through one or both of @@ -366,4 +387,143 @@ class PowerFlowSupportSpec } } + "PowerFlowSupport" should { + implicit val tolerance: Dimensionless = Each(1e-12) + + val powerFlowParams = PowerFlowParams( + 1e-5, + Vector(1e-12), + 50, + Duration.ofMinutes(30), + stopOnFailure = true, + ) + + "perform the power flow for the slack grid correctly" in { + val withMvPowerFlowResults: Map[UUID, Dimensionless] = { + val (gridModel, receivedValueStore) = TestData.withMv + + val (operationPoint, slackNodeVoltages) = composeOperatingPoint( + gridModel.gridComponents.nodes, + gridModel.gridComponents.transformers, + gridModel.gridComponents.transformers3w, + gridModel.nodeUuidToIndexMap, + receivedValueStore, + gridModel.mainRefSystem, + targetVoltageFromReceivedData = false, + ) + + val pf = newtonRaphsonPF( + gridModel, + 50, + operationPoint, + slackNodeVoltages, + )(Vector(1e-12)) match { + case result: PowerFlowResult.SuccessFullPowerFlowResult => + result + case _: PowerFlowResult.FailedPowerFlowResult => + fail() + } + + val indexMap = gridModel.nodeUuidToIndexMap.map { case (uuid, i) => + (i, uuid) + } + pf.nodeData.map(n => indexMap(n.index) -> Each(n.voltage.abs)).toMap + } + + val onlyLvPowerFlowResults: Map[UUID, Dimensionless] = { + val (gridModel, receivedValueStore) = TestData.onlyLv + + val pf = slackGridPF( + gridModel, + receivedValueStore, + powerFlowParams, + ) match { + case result: PowerFlowResult.SuccessFullPowerFlowResult => + result + case _: PowerFlowResult.FailedPowerFlowResult => + fail() + } + + val indexMap = gridModel.nodeUuidToIndexMap.map { case (uuid, i) => + (i, uuid) + } + pf.nodeData.map(n => indexMap(n.index) -> Each(n.voltage.abs)).toMap + + } + + onlyLvPowerFlowResults.foreach { case (uuid, result) => + withMvPowerFlowResults(uuid) should approximate(result)(tolerance) + } + } + } + + object TestData extends DbfsTestGrid with ConfigTestData { + val time: Simona.Time = simonaConfig.simona.time + + implicit def toZoneDateTime(time: String): ZonedDateTime = + TimeUtil.withDefaults.toZonedDateTime(time) + + implicit def toGridModel( + subGridContainer: SubGridContainer + ): GridModel = + GridModel( + subGridContainer, + RefSystem("2000 MVA", "110 kV"), + time.startDateTime, + time.endDateTime, + simonaConfig, + ) + + val withMv: (GridModel, ReceivedValuesStore) = { + val gridModel = TestGridFactory.createSubGrid( + gridName = "centerGrid", + subgrid = 1, + rawGridElements = new RawGridElements( + Set(supNodeA, node1, node2, node3, node4).asJava, + Set(line1To2, line2To3, line1To4).asJava, + Set(transformer1).asJava, + Set.empty[Transformer3WInput].asJava, + Set.empty[SwitchInput].asJava, + Set.empty[MeasurementUnitInput].asJava, + ), + ) + + val receivedValueStore = ReceivedValuesStore.empty( + Map.empty, + Map.empty, + Vector(supNodeA.getUuid), + ) + + (gridModel, receivedValueStore) + } + + val onlyLv: (GridModel, ReceivedValuesStore) = { + val updatedNode1 = + node1.copy().slack(true).vTarget(0.9999984268502677.asPu).build() + val gridModel = TestGridFactory.createSubGrid( + gridName = "centerGrid", + subgrid = 1, + rawGridElements = new RawGridElements( + Set(updatedNode1, node2, node3, node4).asJava, + Set( + line1To2.copy().nodeA(updatedNode1).build(), + line2To3, + line1To4.copy().nodeB(updatedNode1).build(), + ).asJava, + Set.empty[Transformer2WInput].asJava, + Set.empty[Transformer3WInput].asJava, + Set.empty[SwitchInput].asJava, + Set.empty[MeasurementUnitInput].asJava, + ), + ) + + val receivedValueStore = ReceivedValuesStore.empty( + Map.empty, + Map.empty, + Vector.empty, + ) + + (gridModel, receivedValueStore) + } + } } From 1d76883f19dcf00f837c2718feb7438549678288 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 14 Jan 2025 08:30:16 +0100 Subject: [PATCH 2/5] fmt --- .../simona/agent/grid/PowerFlowSupport.scala | 15 ++++++++----- .../edu/ie3/simona/io/grid/GridProvider.scala | 21 ------------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala b/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala index 8f3da56cf7..64500945d3 100644 --- a/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala +++ b/src/main/scala/edu/ie3/simona/agent/grid/PowerFlowSupport.scala @@ -614,11 +614,16 @@ trait PowerFlowSupport { } /** Calculates the power flow for the grid that contains the slack node. - * @param gridModel model of the slack grid - * @param receivedValueStore received values - * @param powerFlowParams parameters for the power flow calculation - * @param log for logging - * @return power flow results + * @param gridModel + * model of the slack grid + * @param receivedValueStore + * received values + * @param powerFlowParams + * parameters for the power flow calculation + * @param log + * for logging + * @return + * power flow results */ protected final def slackGridPF( gridModel: GridModel, diff --git a/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala b/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala index 0b11d732ca..81075c2ae8 100644 --- a/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala +++ b/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala @@ -52,27 +52,6 @@ object GridProvider extends LazyLogging { // checks the grid container and throws exception if there is an error ValidationUtils.check(jointGridContainer) - // check slack node location - val slackSubGrid = jointGridContainer.getSubGridTopologyGraph - .vertexSet() - .asScala - .filter(_.getRawGrid.getNodes.asScala.exists(_.isSlack)) - .maxByOption( - _.getPredominantVoltageLevel.getNominalVoltage.getValue - .doubleValue() - ) - .getOrElse( - throw new InvalidGridException( - "There is no slack node present in the grid." - ) - ) - - if (slackSubGrid.getRawGrid.getNodes.size() > 1) { - throw new SourceException( - "There are too many nodes in the slack grid. This is currently not support." - ) - } - jointGridContainer case None => throw new RuntimeException( From 03faed0b972902d89cd5544667227d02293b1996 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 14 Jan 2025 08:31:31 +0100 Subject: [PATCH 3/5] fmt --- src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala b/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala index 81075c2ae8..b4998c78a1 100644 --- a/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala +++ b/src/main/scala/edu/ie3/simona/io/grid/GridProvider.scala @@ -7,7 +7,6 @@ package edu.ie3.simona.io.grid import com.typesafe.scalalogging.LazyLogging -import edu.ie3.datamodel.exceptions.{InvalidGridException, SourceException} import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.source.csv.{ CsvJointGridContainerSource, @@ -23,7 +22,6 @@ import edu.ie3.simona.config.SimonaConfig import java.nio.file.Path import scala.jdk.CollectionConverters._ -import scala.util.{Failure, Success, Try} /** Takes [[edu.ie3.simona.config.SimonaConfig.Simona.Input.Grid.Datasource]] as * input and provides a [[JointGridContainer]] based on the configuration incl. From 4cb32fbbaf1cedcbae82cc6b23fbb5c0983136aa Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 21 Jan 2025 12:49:35 +0100 Subject: [PATCH 4/5] Addressing reviewer's comments. --- .../ie3/simona/agent/grid/PowerFlowSupportSpec.scala | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala b/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala index 3aa1441c36..272a1b9d67 100644 --- a/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala @@ -400,7 +400,7 @@ class PowerFlowSupportSpec "perform the power flow for the slack grid correctly" in { val withMvPowerFlowResults: Map[UUID, Dimensionless] = { - val (gridModel, receivedValueStore) = TestData.withMv + val (gridModel, receivedValueStore) = TestData.withEHV val (operationPoint, slackNodeVoltages) = composeOperatingPoint( gridModel.gridComponents.nodes, @@ -430,8 +430,8 @@ class PowerFlowSupportSpec pf.nodeData.map(n => indexMap(n.index) -> Each(n.voltage.abs)).toMap } - val onlyLvPowerFlowResults: Map[UUID, Dimensionless] = { - val (gridModel, receivedValueStore) = TestData.onlyLv + val onlyHvPowerFlowResults: Map[UUID, Dimensionless] = { + val (gridModel, receivedValueStore) = TestData.onlyHV val pf = slackGridPF( gridModel, @@ -451,7 +451,7 @@ class PowerFlowSupportSpec } - onlyLvPowerFlowResults.foreach { case (uuid, result) => + onlyHvPowerFlowResults.foreach { case (uuid, result) => withMvPowerFlowResults(uuid) should approximate(result)(tolerance) } } @@ -474,7 +474,7 @@ class PowerFlowSupportSpec simonaConfig, ) - val withMv: (GridModel, ReceivedValuesStore) = { + val withEHV: (GridModel, ReceivedValuesStore) = { val gridModel = TestGridFactory.createSubGrid( gridName = "centerGrid", subgrid = 1, @@ -497,7 +497,7 @@ class PowerFlowSupportSpec (gridModel, receivedValueStore) } - val onlyLv: (GridModel, ReceivedValuesStore) = { + val onlyHV: (GridModel, ReceivedValuesStore) = { val updatedNode1 = node1.copy().slack(true).vTarget(0.9999984268502677.asPu).build() val gridModel = TestGridFactory.createSubGrid( From d3f99a2ae6cacc632a3cbcb7d231debd93655421 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 28 Jan 2025 16:09:42 +0100 Subject: [PATCH 5/5] Fixed naming of a value in `PowerFlowSupportSpec`. --- .../edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala b/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala index 272a1b9d67..d909ec4d61 100644 --- a/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/grid/PowerFlowSupportSpec.scala @@ -399,7 +399,7 @@ class PowerFlowSupportSpec ) "perform the power flow for the slack grid correctly" in { - val withMvPowerFlowResults: Map[UUID, Dimensionless] = { + val withEhvPowerFlowResults: Map[UUID, Dimensionless] = { val (gridModel, receivedValueStore) = TestData.withEHV val (operationPoint, slackNodeVoltages) = composeOperatingPoint( @@ -452,7 +452,7 @@ class PowerFlowSupportSpec } onlyHvPowerFlowResults.foreach { case (uuid, result) => - withMvPowerFlowResults(uuid) should approximate(result)(tolerance) + withEhvPowerFlowResults(uuid) should approximate(result)(tolerance) } } }