diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..182819f0a1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,77 @@ +# © 2024. TU Dortmund University, +# Institute of Energy Systems, Energy Efficiency and Energy Economics, +# Research group Distribution grid planning and operation +# + +name: CI + +on: + push: + paths-ignore: + - 'docs/**' + branches: + - main + - dev + - 'hotfix/*' + - 'rel/*' + - 'dependabot/*' + pull_request: + branches: + - main + - dev + +jobs: + buildAndTest: + runs-on: ubuntu-latest + + steps: + - name: Checkout Source + uses: actions/checkout@v4 + with: + fetch-depth: 1 + ref: ${{ github.event.pull_request.head.ref || github.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 17 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Build Project + run: ./gradlew --refresh-dependencies clean assemble spotlessCheck + + - name: Run Tests + run: ./gradlew test reportScoverage checkScoverage + + - name: Build Scala-Docs + run: ./gradlew scaladoc + + - name: SonarQube + run: | + ./gradlew sonar \ + -Dsonar.projectKey=${{ vars.SONAR_PROJECT_KEY }} \ + -Dsonar.host.url=${{ vars.SONAR_HOST_URL }} \ + -Dsonar.login=${{ secrets.SONAR_TOKEN }} + + SONAR_STATUS_URL="${{ vars.SONAR_HOST_URL }}/api/qualitygates/project_status?projectKey=${{ vars.SONAR_PROJECT_KEY }}" + QUALITY_GATE_STATUS=$(curl -s -u "${{ secrets.SONAR_TOKEN }}:" "$SONAR_STATUS_URL" | jq -r '.projectStatus.status') + + echo "Quality Gate Status: $QUALITY_GATE_STATUS" + if [ "$QUALITY_GATE_STATUS" != "OK" ]; then + echo "Quality Gate failed!" + exit 1 + fi + + - name: Deploy + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: | + ./gradlew publish\ + -Puser=${{ secrets.MAVENCENTRAL_USER }} \ + -Ppassword=${{ secrets.MAVENCENTRAL_PASS }} \ + -Psigning.keyId=${{ secrets.MAVENCENTRAL_SIGNINGKEYID }} \ + -Psigning.password=${{ secrets.MAVENCENTRAL_SIGNINGPASS }} \ + -Psigning.secretKeyRingFile=${{ secrets.MAVENCENTRAL_SIGNINGKEY }} diff --git a/CHANGELOG.md b/CHANGELOG.md index e058148ba0..2841667cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added weatherData HowTo for Copernicus ERA5 data [#967](https://github.com/ie3-institute/simona/issues/967) - Add some quote to 'printGoodbye' [#997](https://github.com/ie3-institute/simona/issues/997) - Add unapply method for ThermalHouseResults [#934](https://github.com/ie3-institute/simona/issues/934) +- Added `ApparentPower` to differentiate between different power types [#794](https://github.com/ie3-institute/simona/issues/794) - Integration test for thermal grids [#878](https://github.com/ie3-institute/simona/issues/878) ### Changed @@ -100,6 +101,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated `ExtEvSimulationClasses` [#898](https://github.com/ie3-institute/simona/issues/898) - Refactoring of `ThermalGrid.energyGrid` to distinguish between demand of house and storage [#928](https://github.com/ie3-institute/simona/issues/928) - Refactoring to use zeroKW and zeroKWH in thermal grid unit tests [#1023](https://github.com/ie3-institute/simona/issues/1023) +- Refactor `ResultFileHierarchy` [#1031](https://github.com/ie3-institute/simona/issues/1031) ### Fixed - Fix rendering of references in documentation [#505](https://github.com/ie3-institute/simona/issues/505) @@ -136,6 +138,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix filter for thermal result checking for lastTick not for currentTick [#1008](https://github.com/ie3-institute/simona/issues/1008) - Fixed `CHANGELOG` entry for issue ([#103](https://github.com/ie3-institute/simona/issues/103)) [#941](https://github.com/ie3-institute/simona/issues/941) - Fix grammar and spelling in docs and comments [#1022](https://github.com/ie3-institute/simona/issues/1022) +- Fix some minor issues and findings from inspections [#1019](https://github.com/ie3-institute/simona/issues/1019) +- Fix initialisation freezing on empty primary data [#981](https://github.com/ie3-institute/simona/issues/981) ## [3.0.0] - 2023-08-07 diff --git a/Jenkinsfile b/Jenkinsfile index f8320f0960..84b3073e05 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -111,7 +111,7 @@ node { sh 'java -version' - gradle('--refresh-dependencies spotlessCheck pmdMain pmdTest', projectName) + gradle('--refresh-dependencies spotlessCheck test', projectName) sh(script: """set +x && cd $projectName""" + ''' set +x; ./gradlew javadoc''', returnStdout: true) } @@ -421,9 +421,6 @@ def publishReports(String relativeProjectDir) { // publish test reports publishHTML([allowMissing: true, alwaysLinkToLastBuild: true, escapeUnderscores: false, keepAll: true, reportDir: relativeProjectDir + '/build/reports/tests/allTests', reportFiles: 'index.html', reportName: "${relativeProjectDir}_java_tests_report", reportTitles: '']) - // publish pmd report for main project only - publishHTML([allowMissing: true, alwaysLinkToLastBuild: true, escapeUnderscores: false, keepAll: true, reportDir: relativeProjectDir + '/build/reports/pmd', reportFiles: 'main.html', reportName: "${relativeProjectDir}_pmd_report", reportTitles: '']) - // publish scalatest reports for main project only (currently the only one with scala sources!) publishHTML([allowMissing: false, alwaysLinkToLastBuild: true, escapeUnderscores: false, keepAll: true, reportDir: relativeProjectDir + '/build/reports/tests/scalatest', reportFiles: 'index.html', reportName: "${relativeProjectDir}_scala_tests_report", reportTitles: '']) diff --git a/build.gradle b/build.gradle index 01935529d3..f611c25268 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,6 @@ plugins { id 'scala' // scala support id 'signing' id 'maven-publish' // publish to a maven repo (local or mvn central, has to be defined) - id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '6.25.0'// code format id "com.github.ben-manes.versions" version '0.51.0' id "de.undercouch.download" version "5.6.0" // downloads plugin @@ -45,7 +44,6 @@ java { targetCompatibility = javaVersion } -apply from: scriptsLocation + 'pmd.gradle' apply from: scriptsLocation + 'spotless.gradle' apply from: scriptsLocation + 'checkJavaVersion.gradle' apply from: scriptsLocation + 'tscfg.gradle' // config tasks diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index fcef71943b..4b84f2dcf4 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -3,5 +3,5 @@ sphinx-rtd-theme==3.0.2 sphinxcontrib-plantuml==0.30 myst-parser==4.0.0 markdown-it-py==3.0.0 -sphinx-hoverxref==1.4.1 +sphinx-hoverxref==1.4.2 sphinxcontrib-bibtex==2.6.3 diff --git a/gradle/scripts/pmd.gradle b/gradle/scripts/pmd.gradle deleted file mode 100644 index ca0094c798..0000000000 --- a/gradle/scripts/pmd.gradle +++ /dev/null @@ -1,7 +0,0 @@ -// pmd is a code check tool, working on source code - -pmd { - consoleOutput = true - toolVersion = "6.21.0" - rulesMinimumPriority = 2 -} diff --git a/gradle/scripts/sonarqube.gradle b/gradle/scripts/sonarqube.gradle index 80a9db4fd1..501bbbdc72 100644 --- a/gradle/scripts/sonarqube.gradle +++ b/gradle/scripts/sonarqube.gradle @@ -34,8 +34,6 @@ sonarqube { } // sonarqube task dependencies -project.tasks["sonarqube"].dependsOn "pmdMain" -project.tasks["sonarqube"].dependsOn "pmdTest" project.tasks["sonarqube"].dependsOn "test" project.tasks["sonarqube"].dependsOn "reportScoverage" project.tasks["sonarqube"].dependsOn "checkScoverage" diff --git a/src/main/scala/edu/ie3/simona/agent/em/EmAgent.scala b/src/main/scala/edu/ie3/simona/agent/em/EmAgent.scala index 3d98612c18..4168da3955 100644 --- a/src/main/scala/edu/ie3/simona/agent/em/EmAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/em/EmAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.em import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.result.system.{EmResult, FlexOptionsResult} -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.statedata.BaseStateData.FlexControlledData import edu.ie3.simona.config.SimonaConfig.EmRuntimeConfig import edu.ie3.simona.event.ResultEvent @@ -409,7 +409,7 @@ object EmAgent { // After initialization, there are no results yet. val maybeResult = inactiveCore.getResults .reduceOption { (power1, power2) => - ApparentPower(power1.p + power2.p, power1.q + power2.q) + ComplexPower(power1.p + power2.p, power1.q + power2.q) } maybeResult.foreach { result => diff --git a/src/main/scala/edu/ie3/simona/agent/em/EmDataCore.scala b/src/main/scala/edu/ie3/simona/agent/em/EmDataCore.scala index cb8a73294d..a851f8ff69 100644 --- a/src/main/scala/edu/ie3/simona/agent/em/EmDataCore.scala +++ b/src/main/scala/edu/ie3/simona/agent/em/EmDataCore.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.em import edu.ie3.simona.agent.em.EmAgent.Actor import edu.ie3.simona.agent.em.FlexCorrespondenceStore.WithTime -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.exceptions.CriticalFailureException import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage._ import edu.ie3.simona.util.SimonaConstants.INIT_SIM_TICK @@ -163,7 +163,7 @@ object EmDataCore { /** Returns relevant results for all connected agents. */ - def getResults: Iterable[ApparentPower] = + def getResults: Iterable[ComplexPower] = correspondences.store.values.flatMap(_.receivedResult.map(_.get)) } diff --git a/src/main/scala/edu/ie3/simona/agent/em/FlexCorrespondenceStore.scala b/src/main/scala/edu/ie3/simona/agent/em/FlexCorrespondenceStore.scala index 5d69a5190a..8d4a12445c 100644 --- a/src/main/scala/edu/ie3/simona/agent/em/FlexCorrespondenceStore.scala +++ b/src/main/scala/edu/ie3/simona/agent/em/FlexCorrespondenceStore.scala @@ -10,7 +10,7 @@ import edu.ie3.simona.agent.em.FlexCorrespondenceStore.{ FlexCorrespondence, WithTime, } -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage.{ IssueFlexControl, ProvideFlexOptions, @@ -88,7 +88,7 @@ final case class FlexCorrespondenceStore( */ def updateResult( modelUuid: UUID, - result: ApparentPower, + result: ComplexPower, tick: Long, ): FlexCorrespondenceStore = updateCorrespondence( @@ -124,7 +124,7 @@ object FlexCorrespondenceStore { final case class FlexCorrespondence( receivedFlexOptions: Option[WithTime[ProvideFlexOptions]] = None, issuedCtrlMsg: Option[WithTime[IssueFlexControl]] = None, - receivedResult: Option[WithTime[ApparentPower]] = None, + receivedResult: Option[WithTime[ComplexPower]] = None, ) /** Wrapper that allows storing a tick with an object diff --git a/src/main/scala/edu/ie3/simona/agent/grid/GridResultsSupport.scala b/src/main/scala/edu/ie3/simona/agent/grid/GridResultsSupport.scala index 8d6d4adcfe..59f0248f81 100644 --- a/src/main/scala/edu/ie3/simona/agent/grid/GridResultsSupport.scala +++ b/src/main/scala/edu/ie3/simona/agent/grid/GridResultsSupport.scala @@ -201,8 +201,9 @@ private[grid] trait GridResultsSupport { * @return * a set of [[PartialTransformer3wResult]] s */ - def buildTransformer3wResults(transformers3w: Set[Transformer3wModel])( - implicit + private def buildTransformer3wResults( + transformers3w: Set[Transformer3wModel] + )(implicit sweepValueStoreData: Map[UUID, SweepValueStoreData], iNominal: ElectricCurrent, timestamp: ZonedDateTime, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentals.scala index 3a8e9b30ea..9bbb1b806b 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentals.scala @@ -23,8 +23,8 @@ import edu.ie3.simona.agent.participant.ParticipantAgent.StartCalculationTrigger import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals.RelevantResultValues import edu.ie3.simona.agent.participant.data.Data import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, - ApparentPowerAndHeat, + ComplexPower, + ComplexPowerAndHeat, EnrichableData, PrimaryDataWithApparentPower, } @@ -138,9 +138,8 @@ protected trait ParticipantAgentFundamentals[ /* Confirm final initialization */ releaseTick() - senderToMaybeTick._2.foreach { tick => - scheduler ! Completion(self.toTyped, Some(tick)) - } + scheduler ! Completion(self.toTyped, senderToMaybeTick._2) + goto(Idle) using stateData } @@ -799,7 +798,7 @@ protected trait ParticipantAgentFundamentals[ flexStateData.emAgent ! FlexResult( baseStateData.modelUuid, - result.primaryData.toApparentPower, + result.primaryData.toComplexPower, ) flexStateData.emAgent ! FlexCompletion( @@ -1081,7 +1080,7 @@ protected trait ParticipantAgentFundamentals[ goto(Idle) using updatedBaseStateData } - def pollNextActivationTrigger( + private def pollNextActivationTrigger( baseStateData: BaseStateData[PD] ): Option[Long] = { /* Determine what comes next: An additional activation or new data - or both at once */ @@ -1278,7 +1277,7 @@ protected trait ParticipantAgentFundamentals[ * @return * Option on a possible fast state change */ - final def determineFastReply( + private final def determineFastReply( baseStateData: BaseStateData[PD], mostRecentRequest: Option[(Long, PD)], requestTick: Long, @@ -1655,7 +1654,7 @@ protected trait ParticipantAgentFundamentals[ * @return * Averaged result */ - def determineAverageResult( + private def determineAverageResult( baseStateData: BaseStateData[PD], tickToResult: Map[Long, PD], windowStartTick: Long, @@ -1739,8 +1738,8 @@ protected trait ParticipantAgentFundamentals[ baseStateData.foreseenDataTicks, ) - averageResult.toApparentPower match { - case ApparentPower(p, q) => + averageResult.toComplexPower match { + case ComplexPower(p, q) => stay() using nextStateData replying AssetPowerChangedMessage(p, q) } } @@ -1757,7 +1756,7 @@ protected trait ParticipantAgentFundamentals[ * @param outputConfig * Configuration of the output behaviour */ - protected def announceSimulationResult( + private def announceSimulationResult( baseStateData: BaseStateData[PD], tick: Long, result: AccompaniedSimulationResult[PD], @@ -1888,7 +1887,7 @@ protected trait ParticipantAgentFundamentals[ * @return * The equivalent event */ - def buildResultEvent( + private def buildResultEvent( baseStateData: BaseStateData[PD], tick: Long, result: PD, @@ -1909,7 +1908,7 @@ protected trait ParticipantAgentFundamentals[ * @return * Optionally wrapped event */ - def buildResultEvent[R <: ResultEntity]( + private def buildResultEvent[R <: ResultEntity]( result: R ): Option[ResultEvent] = result match { case thermalUnitResult: ThermalUnitResult => @@ -2002,14 +2001,14 @@ object ParticipantAgentFundamentals { * The averaged apparent power */ def averageApparentPower( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ] = None, log: LoggingAdapter, - ): ApparentPower = { + ): ComplexPower = { val p = QuantityUtil.average[Power, Energy]( tickToResults.map { case (tick, pd) => tick -> pd.p @@ -2033,8 +2032,8 @@ object ParticipantAgentFundamentals { case Some(qFunc) => // NOTE: The type conversion to Megawatts is done to satisfy the methods type constraints // and is undone after unpacking the results - tick -> Megawatts(qFunc(pd.toApparentPower.p).toMegavars) - case None => tick -> Megawatts(pd.toApparentPower.q.toMegavars) + tick -> Megawatts(qFunc(pd.toComplexPower.p).toMegavars) + case None => tick -> Megawatts(pd.toComplexPower.q.toMegavars) } }, windowStart, @@ -2050,7 +2049,7 @@ object ParticipantAgentFundamentals { zeroMVAr } - ApparentPower(p, q) + ComplexPower(p, q) } /** Determine the average apparent power within the given tick window @@ -2067,20 +2066,20 @@ object ParticipantAgentFundamentals { * The averaged apparent power */ def averageApparentPowerAndHeat( - tickToResults: Map[Long, ApparentPowerAndHeat], + tickToResults: Map[Long, ComplexPowerAndHeat], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ] = None, log: LoggingAdapter, - ): ApparentPowerAndHeat = { + ): ComplexPowerAndHeat = { - val tickToResultsApparentPower: Map[Long, ApparentPower] = + val tickToResultsApparentPower: Map[Long, ComplexPower] = tickToResults.map { case (tick, pd) => ( tick, - ApparentPower(Megawatts(pd.p.toMegawatts), Megavars(pd.q.toMegavars)), + ComplexPower(Megawatts(pd.p.toMegawatts), Megavars(pd.q.toMegavars)), ) } @@ -2108,7 +2107,7 @@ object ParticipantAgentFundamentals { zeroMW } - ApparentPowerAndHeat(apparentPower.p, apparentPower.q, qDot) + ComplexPowerAndHeat(apparentPower.p, apparentPower.q, qDot) } } diff --git a/src/main/scala/edu/ie3/simona/agent/participant/data/Data.scala b/src/main/scala/edu/ie3/simona/agent/participant/data/Data.scala index cb56e1af92..7da7b04c5c 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/data/Data.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/data/Data.scala @@ -7,13 +7,13 @@ package edu.ie3.simona.agent.participant.data import edu.ie3.datamodel.models.value._ -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.quantities.interfaces.EnergyPrice -import edu.ie3.util.scala.quantities.{Kilovars, Megavars, ReactivePower} -import squants.energy.{Power, Kilowatts, Megawatts} -import tech.units.indriya.ComparableQuantity import edu.ie3.util.scala.quantities.DefaultQuantities._ +import edu.ie3.util.scala.quantities.{Kilovars, ReactivePower} +import squants.energy.{Kilowatts, Power} +import tech.units.indriya.ComparableQuantity import java.time.ZonedDateTime import scala.jdk.OptionConverters.RichOptional @@ -36,7 +36,7 @@ object Data { */ sealed trait PrimaryData extends Data { val p: Power - def toApparentPower: ApparentPower + def toComplexPower: ComplexPower } object PrimaryData { @@ -61,7 +61,7 @@ object Data { val qDot: Power } - val ZERO_POWER: ApparentPower = ApparentPower(zeroMW, zeroMVAr) + val ZERO_POWER: ComplexPower = ComplexPower(zeroMW, zeroMVAr) /** Active power as participant simulation result * @@ -70,15 +70,15 @@ object Data { */ final case class ActivePower(override val p: Power) extends PrimaryData - with EnrichableData[ApparentPower] { - override def toApparentPower: ApparentPower = - ApparentPower( + with EnrichableData[ComplexPower] { + override def toComplexPower: ComplexPower = + ComplexPower( p, zeroMVAr, ) - override def add(q: ReactivePower): ApparentPower = - ApparentPower(p, q) + override def add(q: ReactivePower): ComplexPower = + ComplexPower(p, q) } /** Active and Reactive power as participant simulation result @@ -88,13 +88,13 @@ object Data { * @param q * Reactive power */ - final case class ApparentPower( + final case class ComplexPower( override val p: Power, override val q: ReactivePower, - ) extends PrimaryDataWithApparentPower[ApparentPower] { - override def toApparentPower: ApparentPower = this + ) extends PrimaryDataWithApparentPower[ComplexPower] { + override def toComplexPower: ComplexPower = this - override def withReactivePower(q: ReactivePower): ApparentPower = + override def withReactivePower(q: ReactivePower): ComplexPower = copy(q = q) } @@ -110,15 +110,15 @@ object Data { override val qDot: Power, ) extends PrimaryData with Heat - with EnrichableData[ApparentPowerAndHeat] { - override def toApparentPower: ApparentPower = - ApparentPower( + with EnrichableData[ComplexPowerAndHeat] { + override def toComplexPower: ComplexPower = + ComplexPower( p, zeroMVAr, ) - override def add(q: ReactivePower): ApparentPowerAndHeat = - ApparentPowerAndHeat(p, q, qDot) + override def add(q: ReactivePower): ComplexPowerAndHeat = + ComplexPowerAndHeat(p, q, qDot) } /** Apparent power and heat demand as participant simulation result @@ -130,16 +130,16 @@ object Data { * @param qDot * Heat demand */ - final case class ApparentPowerAndHeat( + final case class ComplexPowerAndHeat( override val p: Power, override val q: ReactivePower, override val qDot: Power, - ) extends PrimaryDataWithApparentPower[ApparentPowerAndHeat] + ) extends PrimaryDataWithApparentPower[ComplexPowerAndHeat] with Heat { - override def toApparentPower: ApparentPower = - ApparentPower(p, q) + override def toComplexPower: ComplexPower = + ComplexPower(p, q) - override def withReactivePower(q: ReactivePower): ApparentPowerAndHeat = + override def withReactivePower(q: ReactivePower): ComplexPowerAndHeat = copy(q = q) } @@ -150,7 +150,7 @@ object Data { (hs.getP.toScala, hs.getQ.toScala, hs.getHeatDemand.toScala) match { case (Some(p), Some(q), Some(qDot)) => Success( - ApparentPowerAndHeat( + ComplexPowerAndHeat( Kilowatts( p.to(PowerSystemUnits.KILOWATT).getValue.doubleValue ), @@ -173,7 +173,7 @@ object Data { (s.getP.toScala, s.getQ.toScala) match { case (Some(p), Some(q)) => Success( - ApparentPower( + ComplexPower( Kilowatts( p.to(PowerSystemUnits.KILOWATT).getValue.doubleValue ), diff --git a/src/main/scala/edu/ie3/simona/agent/participant/data/primary/PrimaryDataService.scala b/src/main/scala/edu/ie3/simona/agent/participant/data/primary/PrimaryDataService.scala index 33cb4b7519..92c4e510d3 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/data/primary/PrimaryDataService.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/data/primary/PrimaryDataService.scala @@ -6,10 +6,10 @@ package edu.ie3.simona.agent.participant.data.primary -import org.apache.pekko.actor.ActorRef import edu.ie3.simona.agent.participant.data.Data.PrimaryData -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.data.DataService +import org.apache.pekko.actor.ActorRef /** Enum-like trait to denote possible external data sources for systems */ @@ -23,5 +23,5 @@ object PrimaryDataService { * actor reference of the actual source */ final case class DummyPrimaryService(override val actorRef: ActorRef) - extends PrimaryDataService[ApparentPower] + extends PrimaryDataService[ComplexPower] } diff --git a/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgent.scala b/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgent.scala index cdab067fa7..5b37ae70e3 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.participant.evcs import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, ZERO_POWER, } import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService @@ -46,7 +46,7 @@ object EvcsAgent { initStateData: ParticipantInitializeStateData[ EvcsInput, EvcsRuntimeConfig, - ApparentPower, + ComplexPower, ], listener: Iterable[ActorRef], ): Props = @@ -68,26 +68,26 @@ class EvcsAgent( initStateData: ParticipantInitializeStateData[ EvcsInput, EvcsRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends ParticipantAgent[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], EvcsInput, EvcsRuntimeConfig, EvcsModel, ](scheduler, initStateData) with EvcsAgentFundamentals { - override val alternativeResult: ApparentPower = ZERO_POWER + override val alternativeResult: ComplexPower = ZERO_POWER when(Idle) { case Event( EvFreeLotsRequest(tick), modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -99,7 +99,7 @@ class EvcsAgent( case Event( DepartingEvsRequest(tick, departingEvs), modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -116,11 +116,11 @@ class EvcsAgent( case Event( EvFreeLotsRequest(tick), - stateData: DataCollectionStateData[ApparentPower], + stateData: DataCollectionStateData[ComplexPower], ) => stateData.baseStateData match { case modelStateData: BaseStateData.ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -135,11 +135,11 @@ class EvcsAgent( case Event( DepartingEvsRequest(tick, departingEvs), - stateData: DataCollectionStateData[ApparentPower], + stateData: DataCollectionStateData[ComplexPower], ) => stateData.baseStateData match { case modelStateData: BaseStateData.ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -168,13 +168,13 @@ class EvcsAgent( * The averaged result */ override def averageResults( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ], - ): ApparentPower = + ): ComplexPower = ParticipantAgentFundamentals.averageApparentPower( tickToResults, windowStart, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgentFundamentals.scala index 8894a511ff..9cf2f747d8 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/evcs/EvcsAgentFundamentals.scala @@ -16,7 +16,7 @@ import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.grid.GridAgentMessages.AssetPowerChangedMessage import edu.ie3.simona.agent.participant.ParticipantAgent.getAndCheckNodalVoltage import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.data.Data.SecondaryData import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorExtEvDataService @@ -70,17 +70,17 @@ import scala.reflect.{ClassTag, classTag} protected trait EvcsAgentFundamentals extends ParticipantAgentFundamentals[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], EvcsInput, EvcsRuntimeConfig, EvcsModel, ] { this: EvcsAgent => - override protected val pdClassTag: ClassTag[ApparentPower] = - classTag[ApparentPower] + override protected val pdClassTag: ClassTag[ComplexPower] = + classTag[ComplexPower] /** Determines the needed base state data in dependence of the foreseen * simulation mode of the agent. @@ -117,7 +117,7 @@ protected trait EvcsAgentFundamentals outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -138,7 +138,7 @@ protected trait EvcsAgentFundamentals ) ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -185,7 +185,7 @@ protected trait EvcsAgentFundamentals override protected def createInitialState( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -199,7 +199,7 @@ protected trait EvcsAgentFundamentals override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -238,7 +238,7 @@ protected trait EvcsAgentFundamentals def handleControlledPowerChange( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -248,7 +248,7 @@ protected trait EvcsAgentFundamentals setPower: Power, ): ( EvcsState, - AccompaniedSimulationResult[ApparentPower], + AccompaniedSimulationResult[ComplexPower], FlexChangeIndicator, ) = { /* Calculate the power */ @@ -259,7 +259,7 @@ protected trait EvcsAgentFundamentals voltage, ) val result = AccompaniedSimulationResult( - ApparentPower(setPower, reactivePower), + ComplexPower(setPower, reactivePower), Seq.empty[ResultEntity], ) @@ -276,14 +276,14 @@ protected trait EvcsAgentFundamentals override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, ], EvcsState, Dimensionless, - ) => ApparentPower = + ) => ComplexPower = (_, _, _, _) => throw new InvalidRequestException( "Evcs model cannot be run without secondary data." @@ -312,7 +312,7 @@ protected trait EvcsAgentFundamentals */ override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -320,7 +320,7 @@ protected trait EvcsAgentFundamentals lastModelState: EvcsState, tick: Long, scheduler: ActorRef, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = { + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = { /* extract EV data from secondary data, which should have been requested and received before */ baseStateData.receivedSecondaryDataStore .getOrElse(tick, Map.empty) @@ -353,7 +353,7 @@ protected trait EvcsAgentFundamentals protected def handleFreeLotsRequest( tick: Long, modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -387,13 +387,13 @@ protected trait EvcsAgentFundamentals tick: Long, requestedDepartingEvs: Seq[UUID], baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, ], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -484,12 +484,12 @@ protected trait EvcsAgentFundamentals tick: Long, scheduler: ActorRef, modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, ], - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = { + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = { val relevantData = createCalcRelevantData(modelBaseStateData, tick) @@ -567,12 +567,12 @@ protected trait EvcsAgentFundamentals */ override def determineReply( requestTick: Long, - baseStateData: BaseStateData[ApparentPower], - mostRecentRequest: Option[(Long, ApparentPower)], + baseStateData: BaseStateData[ComplexPower], + mostRecentRequest: Option[(Long, ComplexPower)], nodalVoltage: squants.Dimensionless, updatedVoltageValueStore: ValueStore[squants.Dimensionless], - alternativeResult: ApparentPower, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = { + alternativeResult: ComplexPower, + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = { /* No fast reply possible --> Some calculations have to be made */ mostRecentRequest match { case Some((lastRequestTick, _)) if lastRequestTick > requestTick => @@ -584,7 +584,7 @@ protected trait EvcsAgentFundamentals /* Repetitive request for the same tick, but with different voltage */ baseStateData match { case modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -628,7 +628,7 @@ protected trait EvcsAgentFundamentals val updatedBaseStateData = baseStateData match { case modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -695,15 +695,15 @@ protected trait EvcsAgentFundamentals */ override def handleCalculatedResult( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, ], - result: AccompaniedSimulationResult[ApparentPower], + result: AccompaniedSimulationResult[ComplexPower], currentTick: Long, ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -730,7 +730,7 @@ protected trait EvcsAgentFundamentals baseStateData.copy( resultValueStore = updatedResultValueStore ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, @@ -757,12 +757,12 @@ protected trait EvcsAgentFundamentals lastState: EvcsState, currentTick: Long, modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, EvcsRelevantData, EvcsState, EvcsModel, ], - ): ValueStore[ApparentPower] = { + ): ValueStore[ComplexPower] = { val voltage = modelBaseStateData.voltageValueStore .last(currentTick) @@ -794,7 +794,7 @@ protected trait EvcsAgentFundamentals ValueStore.updateValueStore( resultValueStore, result.getTime.toTick(modelBaseStateData.startDate), - ApparentPower( + ComplexPower( Megawatts(result.getP.to(MEGAWATT).getValue.doubleValue), Megavars(result.getQ.to(MEGAVAR).getValue.doubleValue), ), @@ -816,7 +816,7 @@ protected trait EvcsAgentFundamentals override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPower, + result: ComplexPower, ): SystemParticipantResult = new EvcsResult( dateTime, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgent.scala b/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgent.scala index 9b5b681f90..38826657e2 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.participant.fixedfeedin import edu.ie3.datamodel.models.input.system.FixedFeedInInput import edu.ie3.simona.agent.participant.ParticipantAgent -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.statedata.ParticipantStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.ParticipantInitializeStateData import edu.ie3.simona.config.SimonaConfig.FixedFeedInRuntimeConfig @@ -23,7 +23,7 @@ object FixedFeedInAgent { initStateData: ParticipantInitializeStateData[ FixedFeedInInput, FixedFeedInRuntimeConfig, - ApparentPower, + ComplexPower, ], listener: Iterable[ActorRef], ): Props = @@ -42,14 +42,14 @@ class FixedFeedInAgent( initStateData: ParticipantInitializeStateData[ FixedFeedInInput, FixedFeedInRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends ParticipantAgent[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], FixedFeedInInput, FixedFeedInRuntimeConfig, FixedFeedInModel, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgentFundamentals.scala index 0b8845d80c..2ed0495610 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/fixedfeedin/FixedFeedInAgentFundamentals.scala @@ -16,7 +16,7 @@ import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.participant.ParticipantAgent.getAndCheckNodalVoltage import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, ZERO_POWER, } import edu.ie3.simona.agent.participant.data.Data.SecondaryData @@ -65,18 +65,18 @@ import scala.reflect.{ClassTag, classTag} protected trait FixedFeedInAgentFundamentals extends ParticipantAgentFundamentals[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], FixedFeedInInput, FixedFeedInRuntimeConfig, FixedFeedInModel, ] { this: FixedFeedInAgent => - override protected val pdClassTag: ClassTag[ApparentPower] = - classTag[ApparentPower] - override val alternativeResult: ApparentPower = ZERO_POWER + override protected val pdClassTag: ClassTag[ComplexPower] = + classTag[ComplexPower] + override val alternativeResult: ComplexPower = ZERO_POWER /** Determines the needed base state data in dependence of the foreseen * simulation mode of the agent. @@ -113,7 +113,7 @@ protected trait FixedFeedInAgentFundamentals outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, @@ -145,7 +145,7 @@ protected trait FixedFeedInAgentFundamentals ).filterNot(_ == lastTickInSimulation) ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, @@ -190,7 +190,7 @@ protected trait FixedFeedInAgentFundamentals override protected def createInitialState( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, @@ -199,7 +199,7 @@ protected trait FixedFeedInAgentFundamentals override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, @@ -225,7 +225,7 @@ protected trait FixedFeedInAgentFundamentals def handleControlledPowerChange( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, @@ -235,7 +235,7 @@ protected trait FixedFeedInAgentFundamentals setPower: squants.Power, ): ( ConstantState.type, - AccompaniedSimulationResult[ApparentPower], + AccompaniedSimulationResult[ComplexPower], FlexChangeIndicator, ) = { /* Calculate result */ @@ -246,7 +246,7 @@ protected trait FixedFeedInAgentFundamentals voltage, ) val result = AccompaniedSimulationResult( - ApparentPower(setPower, reactivePower), + ComplexPower(setPower, reactivePower), Seq.empty[ResultEntity], ) @@ -259,17 +259,17 @@ protected trait FixedFeedInAgentFundamentals override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, ], ConstantState.type, Dimensionless, - ) => ApparentPower = ( + ) => ComplexPower = ( currentTick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, @@ -314,7 +314,7 @@ protected trait FixedFeedInAgentFundamentals */ override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, FixedFeedInModel, @@ -322,7 +322,7 @@ protected trait FixedFeedInAgentFundamentals lastModelState: ConstantState.type, currentTick: Long, scheduler: ActorRef, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = throw new InvalidRequestException( "Request to calculate power with secondary data cannot be processed in a fixed feed in agent." ) @@ -341,13 +341,13 @@ protected trait FixedFeedInAgentFundamentals * The averaged result */ override def averageResults( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ] = None, - ): ApparentPower = + ): ComplexPower = ParticipantAgentFundamentals.averageApparentPower( tickToResults, windowStart, @@ -370,7 +370,7 @@ protected trait FixedFeedInAgentFundamentals override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPower, + result: ComplexPower, ): SystemParticipantResult = new FixedFeedInResult( dateTime, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgent.scala b/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgent.scala index 0be0c2877b..7861575ef5 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.participant.hp import edu.ie3.datamodel.models.input.system.HpInput import edu.ie3.simona.agent.participant.ParticipantAgent -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPowerAndHeat +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPowerAndHeat import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorWeatherService import edu.ie3.simona.agent.participant.statedata.ParticipantStateData @@ -24,7 +24,7 @@ object HpAgent { initStateData: ParticipantInitializeStateData[ HpInput, HpRuntimeConfig, - ApparentPowerAndHeat, + ComplexPowerAndHeat, ], listener: Iterable[ActorRef], ): Props = @@ -46,15 +46,15 @@ class HpAgent( initStateData: ParticipantInitializeStateData[ HpInput, HpRuntimeConfig, - ApparentPowerAndHeat, + ComplexPowerAndHeat, ], override val listener: Iterable[ActorRef], ) extends ParticipantAgent[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, ParticipantStateData[ - ApparentPowerAndHeat + ComplexPowerAndHeat ], HpInput, HpRuntimeConfig, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgentFundamentals.scala index 365820ec3c..e9fad2c6f3 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/hp/HpAgentFundamentals.scala @@ -15,7 +15,7 @@ import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.participant.ParticipantAgent.getAndCheckNodalVoltage import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals import edu.ie3.simona.agent.participant.data.Data -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPowerAndHeat +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPowerAndHeat import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService import edu.ie3.simona.agent.participant.hp.HpAgent.neededServices import edu.ie3.simona.agent.participant.statedata.BaseStateData.{ @@ -64,18 +64,18 @@ import scala.reflect.{ClassTag, classTag} trait HpAgentFundamentals extends ParticipantAgentFundamentals[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, - ParticipantStateData[ApparentPowerAndHeat], + ParticipantStateData[ComplexPowerAndHeat], HpInput, HpRuntimeConfig, HpModel, ] { this: HpAgent => - override protected val pdClassTag: ClassTag[ApparentPowerAndHeat] = - classTag[ApparentPowerAndHeat] - override val alternativeResult: ApparentPowerAndHeat = ApparentPowerAndHeat( + override protected val pdClassTag: ClassTag[ComplexPowerAndHeat] = + classTag[ComplexPowerAndHeat] + override val alternativeResult: ComplexPowerAndHeat = ComplexPowerAndHeat( zeroMW, zeroMVAr, zeroMW, @@ -88,14 +88,14 @@ trait HpAgentFundamentals override val calculateModelPowerFunc: ( Long, BaseStateData.ParticipantModelBaseStateData[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, HpModel, ], HpState, Dimensionless, - ) => ApparentPowerAndHeat = + ) => ComplexPowerAndHeat = (_, _, _, _) => throw new InvalidRequestException( "Heat pump model cannot be run without secondary data." @@ -103,7 +103,7 @@ trait HpAgentFundamentals override protected def createInitialState( baseStateData: BaseStateData.ParticipantModelBaseStateData[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, HpModel, @@ -139,7 +139,7 @@ trait HpAgentFundamentals def handleControlledPowerChange( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, HpModel, @@ -149,7 +149,7 @@ trait HpAgentFundamentals setPower: squants.Power, ): ( HpState, - AccompaniedSimulationResult[ApparentPowerAndHeat], + AccompaniedSimulationResult[ComplexPowerAndHeat], FlexChangeIndicator, ) = { /* Determine needed information */ @@ -220,7 +220,7 @@ trait HpAgentFundamentals */ override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: BaseStateData.ParticipantModelBaseStateData[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, HpModel, @@ -228,7 +228,7 @@ trait HpAgentFundamentals lastModelState: HpState, currentTick: Long, scheduler: ActorRef, - ): FSM.State[AgentState, ParticipantStateData[ApparentPowerAndHeat]] = { + ): FSM.State[AgentState, ParticipantStateData[ComplexPowerAndHeat]] = { /* Determine needed information */ val voltage = @@ -331,7 +331,7 @@ trait HpAgentFundamentals outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): BaseStateData.ParticipantModelBaseStateData[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, HpModel, @@ -360,7 +360,7 @@ trait HpAgentFundamentals ) ParticipantModelBaseStateData[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, HpModel, @@ -399,7 +399,7 @@ trait HpAgentFundamentals override protected def createCalcRelevantData( baseStateData: BaseStateData.ParticipantModelBaseStateData[ - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpRelevantData, HpState, HpModel, @@ -486,13 +486,13 @@ trait HpAgentFundamentals * The averaged result */ override def averageResults( - tickToResults: Map[Long, ApparentPowerAndHeat], + tickToResults: Map[Long, ComplexPowerAndHeat], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ], - ): ApparentPowerAndHeat = + ): ComplexPowerAndHeat = ParticipantAgentFundamentals.averageApparentPowerAndHeat( tickToResults, windowStart, @@ -515,7 +515,7 @@ trait HpAgentFundamentals override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPowerAndHeat, + result: ComplexPowerAndHeat, ): SystemParticipantResult = new HpResult( dateTime, uuid, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgent.scala b/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgent.scala index 338547efbc..67607acbf1 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.participant.load import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.simona.agent.participant.ParticipantAgent -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.load.LoadAgentFundamentals.{ FixedLoadAgentFundamentals, ProfileLoadAgentFundamentals, @@ -36,7 +36,7 @@ object LoadAgent { initStateData: ParticipantInitializeStateData[ LoadInput, LoadRuntimeConfig, - ApparentPower, + ComplexPower, ], listener: Iterable[ActorRef], ): Props = @@ -58,7 +58,7 @@ object LoadAgent { initStateData: ParticipantInitializeStateData[ LoadInput, LoadRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends LoadAgent[ @@ -72,7 +72,7 @@ object LoadAgent { initStateData: ParticipantInitializeStateData[ LoadInput, LoadRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends LoadAgent[ @@ -86,7 +86,7 @@ object LoadAgent { initStateData: ParticipantInitializeStateData[ LoadInput, LoadRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends LoadAgent[ @@ -108,14 +108,14 @@ abstract class LoadAgent[LD <: LoadRelevantData, LM <: LoadModel[LD]]( initStateData: ParticipantInitializeStateData[ LoadInput, LoadRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends ParticipantAgent[ - ApparentPower, + ComplexPower, LD, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], LoadInput, LoadRuntimeConfig, LM, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgentFundamentals.scala index f7cb1d695e..e01c463115 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/load/LoadAgentFundamentals.scala @@ -16,7 +16,7 @@ import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.participant.ParticipantAgent.getAndCheckNodalVoltage import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, ZERO_POWER, } import edu.ie3.simona.agent.participant.data.Data.SecondaryData @@ -76,18 +76,18 @@ import scala.reflect.{ClassTag, classTag} protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ LD ]] extends ParticipantAgentFundamentals[ - ApparentPower, + ComplexPower, LD, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], LoadInput, LoadRuntimeConfig, LM, ] { this: LoadAgent[LD, LM] => - override protected val pdClassTag: ClassTag[ApparentPower] = - classTag[ApparentPower] - override val alternativeResult: ApparentPower = ZERO_POWER + override protected val pdClassTag: ClassTag[ComplexPower] = + classTag[ComplexPower] + override val alternativeResult: ComplexPower = ZERO_POWER /** Determines the needed base state data in dependence of the foreseen * simulation mode of the agent. @@ -124,7 +124,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, LD, ConstantState.type, LM, @@ -174,7 +174,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ SortedSet.empty[Long] } - ParticipantModelBaseStateData[ApparentPower, LD, ConstantState.type, LM]( + ParticipantModelBaseStateData[ComplexPower, LD, ConstantState.type, LM]( simulationStartDate, simulationEndDate, model, @@ -231,7 +231,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ override protected def createInitialState( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, LD, ConstantState.type, LM, @@ -255,7 +255,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ def handleControlledPowerChange( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, LD, ConstantState.type, LM, @@ -265,7 +265,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ setPower: squants.Power, ): ( ConstantState.type, - AccompaniedSimulationResult[ApparentPower], + AccompaniedSimulationResult[ComplexPower], FlexChangeIndicator, ) = { /* Calculate result */ @@ -276,7 +276,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ voltage, ) val result = AccompaniedSimulationResult( - ApparentPower(setPower, reactivePower), + ComplexPower(setPower, reactivePower), Seq.empty[ResultEntity], ) @@ -298,7 +298,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ * * @param baseStateData * The base state data with collected secondary data - * @param maybeLastModelState + * @param lastModelState * Optional last model state * @param currentTick * Tick, the trigger belongs to @@ -309,7 +309,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ */ override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, LD, ConstantState.type, LM, @@ -317,7 +317,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ lastModelState: ConstantState.type, currentTick: Long, scheduler: ActorRef, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = throw new InconsistentStateException( s"Load model is not able to calculate power with secondary data." ) @@ -336,13 +336,13 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ * The averaged result */ override def averageResults( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ] = None, - ): ApparentPower = + ): ComplexPower = ParticipantAgentFundamentals.averageApparentPower( tickToResults, windowStart, @@ -365,7 +365,7 @@ protected trait LoadAgentFundamentals[LD <: LoadRelevantData, LM <: LoadModel[ override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPower, + result: ComplexPower, ): SystemParticipantResult = new LoadResult( dateTime, @@ -406,7 +406,7 @@ object LoadAgentFundamentals { override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedLoadRelevantData.type, ConstantState.type, FixedLoadModel, @@ -422,17 +422,17 @@ object LoadAgentFundamentals { override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedLoadRelevantData.type, ConstantState.type, FixedLoadModel, ], ConstantState.type, Dimensionless, - ) => ApparentPower = ( + ) => ComplexPower = ( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedLoadRelevantData.type, ConstantState.type, FixedLoadModel, @@ -470,7 +470,7 @@ object LoadAgentFundamentals { override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, ProfileRelevantData, ConstantState.type, ProfileLoadModel, @@ -488,14 +488,14 @@ object LoadAgentFundamentals { override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, ProfileRelevantData, ConstantState.type, ProfileLoadModel, ], ConstantState.type, Dimensionless, - ) => ApparentPower = (tick, baseStateData, _, voltage) => { + ) => ComplexPower = (tick, baseStateData, _, voltage) => { val profileRelevantData = createCalcRelevantData(baseStateData, tick) @@ -530,7 +530,7 @@ object LoadAgentFundamentals { override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, RandomRelevantData, ConstantState.type, RandomLoadModel, @@ -548,14 +548,14 @@ object LoadAgentFundamentals { override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, RandomRelevantData, ConstantState.type, RandomLoadModel, ], ConstantState.type, Dimensionless, - ) => ApparentPower = (tick, baseStateData, _, voltage) => { + ) => ComplexPower = (tick, baseStateData, _, voltage) => { val profileRelevantData = createCalcRelevantData(baseStateData, tick) diff --git a/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgent.scala b/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgent.scala index bf6f5db3b7..a46f7478a8 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.participant.pv import edu.ie3.datamodel.models.input.system.PvInput import edu.ie3.simona.agent.participant.ParticipantAgent -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorWeatherService import edu.ie3.simona.agent.participant.statedata.ParticipantStateData @@ -25,7 +25,7 @@ object PvAgent { initStateData: ParticipantInitializeStateData[ PvInput, PvRuntimeConfig, - ApparentPower, + ComplexPower, ], listener: Iterable[ActorRef], ): Props = @@ -54,14 +54,14 @@ class PvAgent( initStateData: ParticipantInitializeStateData[ PvInput, PvRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends ParticipantAgent[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], PvInput, PvRuntimeConfig, PvModel, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgentFundamentals.scala index 52f0a76e24..b7107d6233 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/pv/PvAgentFundamentals.scala @@ -16,7 +16,7 @@ import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.participant.ParticipantAgent.getAndCheckNodalVoltage import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, ZERO_POWER, } import edu.ie3.simona.agent.participant.data.Data.SecondaryData @@ -67,18 +67,18 @@ import scala.reflect.{ClassTag, classTag} protected trait PvAgentFundamentals extends ParticipantAgentFundamentals[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], PvInput, PvRuntimeConfig, PvModel, ] { this: PvAgent => - override protected val pdClassTag: ClassTag[ApparentPower] = - classTag[ApparentPower] - override val alternativeResult: ApparentPower = ZERO_POWER + override protected val pdClassTag: ClassTag[ComplexPower] = + classTag[ComplexPower] + override val alternativeResult: ComplexPower = ZERO_POWER /** Determines the needed base state data in dependence of the foreseen * simulation mode of the agent. @@ -115,7 +115,7 @@ protected trait PvAgentFundamentals outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, PvModel, @@ -136,7 +136,7 @@ protected trait PvAgentFundamentals ) ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, PvModel, @@ -181,7 +181,7 @@ protected trait PvAgentFundamentals override protected def createInitialState( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, PvModel, @@ -191,7 +191,7 @@ protected trait PvAgentFundamentals override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, PvModel, @@ -263,7 +263,7 @@ protected trait PvAgentFundamentals override def handleControlledPowerChange( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, PvModel, @@ -273,7 +273,7 @@ protected trait PvAgentFundamentals setPower: squants.Power, ): ( ConstantState.type, - AccompaniedSimulationResult[ApparentPower], + AccompaniedSimulationResult[ComplexPower], FlexChangeIndicator, ) = { /* Calculate result */ @@ -284,7 +284,7 @@ protected trait PvAgentFundamentals voltage, ) val result = AccompaniedSimulationResult( - ApparentPower(setPower, reactivePower), + ComplexPower(setPower, reactivePower), Seq.empty[ResultEntity], ) @@ -301,14 +301,14 @@ protected trait PvAgentFundamentals override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, PvModel, ], ConstantState.type, Dimensionless, - ) => ApparentPower = + ) => ComplexPower = (_, _, _, _) => throw new InvalidRequestException( "Pv model cannot be run without secondary data." @@ -337,7 +337,7 @@ protected trait PvAgentFundamentals */ override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, PvRelevantData, ConstantState.type, PvModel, @@ -345,7 +345,7 @@ protected trait PvAgentFundamentals lastModelState: ConstantState.type, currentTick: Long, scheduler: ActorRef, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = { + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = { val voltage = getAndCheckNodalVoltage(baseStateData, currentTick) @@ -384,13 +384,13 @@ protected trait PvAgentFundamentals * The averaged result */ override def averageResults( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ] = None, - ): ApparentPower = + ): ComplexPower = ParticipantAgentFundamentals.averageApparentPower( tickToResults, windowStart, @@ -413,7 +413,7 @@ protected trait PvAgentFundamentals override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPower, + result: ComplexPower, ): SystemParticipantResult = new PvResult( dateTime, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/statedata/BaseStateData.scala b/src/main/scala/edu/ie3/simona/agent/participant/statedata/BaseStateData.scala index 9627ee1578..b6ebd99841 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/statedata/BaseStateData.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/statedata/BaseStateData.scala @@ -68,8 +68,9 @@ trait BaseStateData[+PD <: PrimaryDataWithApparentPower[PD]] val resultValueStore: ValueStore[PD] /** A store, holding information of the lastly requested and provided results. - * The request from the grid always targets at [[ApparentPower]], but for the - * sake of traceability, the whole averaged result ist stored + * The request from the grid always targets at + * [[edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower]], + * but for the sake of traceability, the whole averaged result ist stored */ val requestValueStore: ValueStore[PD] diff --git a/src/main/scala/edu/ie3/simona/agent/participant/statedata/ParticipantStateData.scala b/src/main/scala/edu/ie3/simona/agent/participant/statedata/ParticipantStateData.scala index 95d8df3fcf..786caf63b0 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/statedata/ParticipantStateData.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/statedata/ParticipantStateData.scala @@ -29,7 +29,7 @@ object ParticipantStateData { /** Data for the state, in which the agent is not initialized, yet. *

IMPORTANT: Needs to be an empty case class due to typing

*/ - final class ParticipantUninitializedStateData[+PD <: PrimaryData]() + final class ParticipantUninitializedStateData[+PD <: PrimaryData] extends UninitializedStateData[PD] object ParticipantUninitializedStateData { diff --git a/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgent.scala b/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgent.scala index f38328ea3b..84eda8c92b 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.participant.storage import edu.ie3.datamodel.models.input.system.StorageInput import edu.ie3.simona.agent.participant.ParticipantAgent -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.statedata.ParticipantStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.ParticipantInitializeStateData import edu.ie3.simona.config.SimonaConfig.StorageRuntimeConfig @@ -25,7 +25,7 @@ object StorageAgent { initStateData: ParticipantInitializeStateData[ StorageInput, StorageRuntimeConfig, - ApparentPower, + ComplexPower, ], listener: Iterable[ActorRef], ): Props = @@ -50,14 +50,14 @@ class StorageAgent( initStateData: ParticipantInitializeStateData[ StorageInput, StorageRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends ParticipantAgent[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], StorageInput, StorageRuntimeConfig, StorageModel, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgentFundamentals.scala index 574cbbfbf7..bfa312e68a 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/storage/StorageAgentFundamentals.scala @@ -17,7 +17,7 @@ import edu.ie3.simona.agent.participant.ParticipantAgent.getAndCheckNodalVoltage import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals import edu.ie3.simona.agent.participant.data.Data import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, ZERO_POWER, } import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService @@ -65,19 +65,19 @@ import scala.reflect.{ClassTag, classTag} trait StorageAgentFundamentals extends ParticipantAgentFundamentals[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], StorageInput, StorageRuntimeConfig, StorageModel, ] { this: StorageAgent => - override val alternativeResult: ApparentPower = ZERO_POWER + override val alternativeResult: ComplexPower = ZERO_POWER - override protected val pdClassTag: ClassTag[ApparentPower] = - classTag[ApparentPower] + override protected val pdClassTag: ClassTag[ComplexPower] = + classTag[ComplexPower] /** Abstract definition, individual implementations found in individual agent * fundamental classes @@ -93,7 +93,7 @@ trait StorageAgentFundamentals outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): BaseStateData.ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, @@ -113,7 +113,7 @@ trait StorageAgentFundamentals ) ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, @@ -162,7 +162,7 @@ trait StorageAgentFundamentals override protected def createInitialState( baseStateData: BaseStateData.ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, @@ -175,7 +175,7 @@ trait StorageAgentFundamentals override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, @@ -187,14 +187,14 @@ trait StorageAgentFundamentals override val calculateModelPowerFunc: ( Long, BaseStateData.ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, ], StorageState, Dimensionless, - ) => ApparentPower = + ) => ComplexPower = (_, _, _, _) => throw new InvalidRequestException( "Storage model cannot be run without secondary data." @@ -202,7 +202,7 @@ trait StorageAgentFundamentals override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, @@ -216,13 +216,13 @@ trait StorageAgentFundamentals ) override def averageResults( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ], - ): ApparentPower = ParticipantAgentFundamentals.averageApparentPower( + ): ComplexPower = ParticipantAgentFundamentals.averageApparentPower( tickToResults, windowStart, windowEnd, @@ -233,7 +233,7 @@ trait StorageAgentFundamentals override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPower, + result: ComplexPower, ): SystemParticipantResult = new StorageResult( dateTime, uuid, @@ -256,15 +256,15 @@ trait StorageAgentFundamentals */ override protected def handleCalculatedResult( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, ], - result: AccompaniedSimulationResult[ApparentPower], + result: AccompaniedSimulationResult[ComplexPower], currentTick: Long, ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, @@ -325,7 +325,7 @@ trait StorageAgentFundamentals override def handleControlledPowerChange( tick: Long, baseStateData: BaseStateData.ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, StorageRelevantData, StorageState, StorageModel, @@ -335,7 +335,7 @@ trait StorageAgentFundamentals setPower: Power, ): ( StorageState, - AccompaniedSimulationResult[ApparentPower], + AccompaniedSimulationResult[ComplexPower], FlexChangeIndicator, ) = { val (updatedState, flexChangeIndicator) = @@ -350,9 +350,9 @@ trait StorageAgentFundamentals voltage, ) - val apparentPower = ApparentPower(updatedSetPower, reactivePower) + val apparentPower = ComplexPower(updatedSetPower, reactivePower) - val result: AccompaniedSimulationResult[ApparentPower] = + val result: AccompaniedSimulationResult[ComplexPower] = AccompaniedSimulationResult(apparentPower, Seq.empty[ResultEntity]) (updatedState, result, flexChangeIndicator) diff --git a/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgent.scala b/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgent.scala index 957d48a28f..f8858ded76 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgent.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgent.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.agent.participant.wec import edu.ie3.datamodel.models.input.system.WecInput import edu.ie3.simona.agent.participant.ParticipantAgent -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorWeatherService import edu.ie3.simona.agent.participant.statedata.ParticipantStateData @@ -25,7 +25,7 @@ object WecAgent { initStateData: ParticipantInitializeStateData[ WecInput, WecRuntimeConfig, - ApparentPower, + ComplexPower, ], listener: Iterable[ActorRef], ): Props = @@ -54,14 +54,14 @@ class WecAgent( initStateData: ParticipantInitializeStateData[ WecInput, WecRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef], ) extends ParticipantAgent[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], WecInput, WecRuntimeConfig, WecModel, diff --git a/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgentFundamentals.scala b/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgentFundamentals.scala index 5b43263925..1cbe2e7cf3 100644 --- a/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgentFundamentals.scala +++ b/src/main/scala/edu/ie3/simona/agent/participant/wec/WecAgentFundamentals.scala @@ -16,7 +16,7 @@ import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.participant.ParticipantAgent._ import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, ZERO_POWER, } import edu.ie3.simona.agent.participant.data.Data.SecondaryData @@ -62,18 +62,18 @@ import scala.reflect.{ClassTag, classTag} protected trait WecAgentFundamentals extends ParticipantAgentFundamentals[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], WecInput, WecRuntimeConfig, WecModel, ] { this: WecAgent => - override protected val pdClassTag: ClassTag[ApparentPower] = - classTag[ApparentPower] - override val alternativeResult: ApparentPower = ZERO_POWER + override protected val pdClassTag: ClassTag[ComplexPower] = + classTag[ComplexPower] + override val alternativeResult: ComplexPower = ZERO_POWER /** Determines the needed base state data in dependence of the foreseen * simulation mode of the agent. @@ -110,7 +110,7 @@ protected trait WecAgentFundamentals outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -131,7 +131,7 @@ protected trait WecAgentFundamentals ) ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -176,7 +176,7 @@ protected trait WecAgentFundamentals override protected def createInitialState( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -186,7 +186,7 @@ protected trait WecAgentFundamentals override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -239,7 +239,7 @@ protected trait WecAgentFundamentals def handleControlledPowerChange( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -249,7 +249,7 @@ protected trait WecAgentFundamentals setPower: squants.Power, ): ( ConstantState.type, - AccompaniedSimulationResult[ApparentPower], + AccompaniedSimulationResult[ComplexPower], FlexChangeIndicator, ) = { /* Calculate result */ @@ -260,7 +260,7 @@ protected trait WecAgentFundamentals voltage, ) val result = AccompaniedSimulationResult( - ApparentPower(setPower, reactivePower), + ComplexPower(setPower, reactivePower), Seq.empty[ResultEntity], ) @@ -277,18 +277,18 @@ protected trait WecAgentFundamentals override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, ], ConstantState.type, Dimensionless, - ) => ApparentPower = + ) => ComplexPower = ( _: Long, _: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -323,7 +323,7 @@ protected trait WecAgentFundamentals */ override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -331,7 +331,7 @@ protected trait WecAgentFundamentals lastModelState: ConstantState.type, currentTick: Long, scheduler: ActorRef, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = { + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = { val voltage = getAndCheckNodalVoltage(baseStateData, currentTick) @@ -370,13 +370,13 @@ protected trait WecAgentFundamentals * The averaged result */ override def averageResults( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ Power => ReactivePower ] = None, - ): ApparentPower = + ): ComplexPower = ParticipantAgentFundamentals.averageApparentPower( tickToResults, windowStart, @@ -399,7 +399,7 @@ protected trait WecAgentFundamentals override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPower, + result: ComplexPower, ): SystemParticipantResult = new WecResult( dateTime, diff --git a/src/main/scala/edu/ie3/simona/config/ArgsParser.scala b/src/main/scala/edu/ie3/simona/config/ArgsParser.scala index 183aa8149c..e79c6b94ce 100644 --- a/src/main/scala/edu/ie3/simona/config/ArgsParser.scala +++ b/src/main/scala/edu/ie3/simona/config/ArgsParser.scala @@ -148,11 +148,11 @@ object ArgsParser extends LazyLogging { // sealed trait for cluster type sealed trait ClusterType - case object MasterNode extends ClusterType { + private case object MasterNode extends ClusterType { override def toString = "master" } - case object SeedNode extends ClusterType { + private case object SeedNode extends ClusterType { override def toString = "worker" } diff --git a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala index 8192814ae3..0eaa7e30ba 100644 --- a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala +++ b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala @@ -785,29 +785,29 @@ case object ConfigFailFast extends LazyLogging { /** Check the suitability of storage config parameters. * - * @param StorageRuntimeConfig + * @param storageRuntimeConfig * RuntimeConfig of Storages */ private def checkStoragesConfig( - storageConfig: SimonaConfig.Simona.Runtime.Participant.Storage + storageRuntimeConfig: SimonaConfig.Simona.Runtime.Participant.Storage ): Unit = { if ( - storageConfig.defaultConfig.initialSoc < 0.0 || storageConfig.defaultConfig.initialSoc > 1.0 + storageRuntimeConfig.defaultConfig.initialSoc < 0.0 || storageRuntimeConfig.defaultConfig.initialSoc > 1.0 ) throw new RuntimeException( s"StorageRuntimeConfig: Default initial SOC needs to be between 0.0 and 1.0." ) if ( - storageConfig.defaultConfig.targetSoc.exists( + storageRuntimeConfig.defaultConfig.targetSoc.exists( _ < 0.0 - ) || storageConfig.defaultConfig.targetSoc.exists(_ > 1.0) + ) || storageRuntimeConfig.defaultConfig.targetSoc.exists(_ > 1.0) ) throw new RuntimeException( s"StorageRuntimeConfig: Default target SOC needs to be between 0.0 and 1.0." ) - storageConfig.individualConfigs.foreach { config => + storageRuntimeConfig.individualConfigs.foreach { config => if (config.initialSoc < 0.0 || config.initialSoc > 1.0) throw new RuntimeException( s"StorageRuntimeConfig: ${config.uuids} initial SOC needs to be between 0.0 and 1.0." diff --git a/src/main/scala/edu/ie3/simona/event/listener/ResultEventListener.scala b/src/main/scala/edu/ie3/simona/event/listener/ResultEventListener.scala index 8e7dd12abd..d9c910ef1a 100644 --- a/src/main/scala/edu/ie3/simona/event/listener/ResultEventListener.scala +++ b/src/main/scala/edu/ie3/simona/event/listener/ResultEventListener.scala @@ -88,7 +88,7 @@ object ResultEventListener extends Transformer3wResultSupport { filePathFuture.map { fileName => val finalFileName = - fileName match { + fileName.toString match { case name if name.endsWith(".csv.gz") && enableCompression => name.replace(".gz", "") case name if name.endsWith(".csv") => name diff --git a/src/main/scala/edu/ie3/simona/logging/logback/LogbackConfiguration.scala b/src/main/scala/edu/ie3/simona/logging/logback/LogbackConfiguration.scala index 3d236a1f41..9f95df1c2c 100644 --- a/src/main/scala/edu/ie3/simona/logging/logback/LogbackConfiguration.scala +++ b/src/main/scala/edu/ie3/simona/logging/logback/LogbackConfiguration.scala @@ -16,16 +16,16 @@ import ch.qos.logback.core.filter.Filter import com.typesafe.scalalogging.LazyLogging import org.slf4j.LoggerFactory -import java.io.File +import java.nio.file.Path import scala.jdk.CollectionConverters._ object LogbackConfiguration extends LazyLogging { - def default(logPath: String): Unit = { + def default(logPath: Path): Unit = { LoggerFactory.getILoggerFactory match { case loggerContext: LoggerContext => val rootLogger = loggerContext.getLogger("root") - val log = logPath.concat(File.separator).concat("simona.log") + val log = logPath.resolve("simona.log") // stop all appenders rootLogger.iteratorForAppenders().asScala.foreach(_.stop()) /* Identify the filters of existing rolling file appender */ @@ -58,7 +58,7 @@ object LogbackConfiguration extends LazyLogging { } private def fileAppender( - logPath: String, + logPath: Path, appenderName: String, maybeFilterList: Option[Seq[Filter[ILoggingEvent]]], loggerContext: LoggerContext, @@ -70,7 +70,7 @@ object LogbackConfiguration extends LazyLogging { layoutEncoder.start() val fileAppender = new FileAppender[ILoggingEvent] - fileAppender.setFile(logPath) + fileAppender.setFile(logPath.toString) fileAppender.setEncoder(layoutEncoder) fileAppender.setContext(loggerContext) fileAppender.setName(appenderName) diff --git a/src/main/scala/edu/ie3/simona/main/RunSimona.scala b/src/main/scala/edu/ie3/simona/main/RunSimona.scala index b08db66361..3ba0c8f9aa 100644 --- a/src/main/scala/edu/ie3/simona/main/RunSimona.scala +++ b/src/main/scala/edu/ie3/simona/main/RunSimona.scala @@ -57,7 +57,7 @@ trait RunSimona[T <: SimonaSetup] extends LazyLogging { private def printGoodbye( successful: Boolean, - outputPath: String = "", + logOutputDir: Path, ): Unit = { val myWords = Array( "\"Vielleicht ist heute ein besonders guter Tag zum Sterben.\" - Worf (in Star Trek: Der erste Kontakt)", @@ -78,7 +78,7 @@ trait RunSimona[T <: SimonaSetup] extends LazyLogging { // to ensure that the link to the log is printed last Thread.sleep(1000) - val path = Path.of(outputPath).resolve("simona.log").toUri + val path = logOutputDir.resolve("simona.log").toUri logger.error( s"Simulation stopped due to the occurrence of an error! The full log can be found here: $path" diff --git a/src/main/scala/edu/ie3/simona/model/grid/LineModel.scala b/src/main/scala/edu/ie3/simona/model/grid/LineModel.scala index 7c643a2298..0a592ccb68 100644 --- a/src/main/scala/edu/ie3/simona/model/grid/LineModel.scala +++ b/src/main/scala/edu/ie3/simona/model/grid/LineModel.scala @@ -77,7 +77,7 @@ final case class LineModel( * branch conductance g_ij between node A and B of the element in p.u. */ override def gij(): squants.Dimensionless = - super.gij() * (amount) + super.gij() * amount /** see [[PiEquivalentCircuit.g0()]] * diff --git a/src/main/scala/edu/ie3/simona/model/grid/TransformerTapping.scala b/src/main/scala/edu/ie3/simona/model/grid/TransformerTapping.scala index a1679a54f2..d199923de8 100644 --- a/src/main/scala/edu/ie3/simona/model/grid/TransformerTapping.scala +++ b/src/main/scala/edu/ie3/simona/model/grid/TransformerTapping.scala @@ -45,6 +45,7 @@ trait TransformerTapping { /** Increase transformer tap position by the provided delta value * * @param deltaTap + * number of tap positions to increase */ def incrTapPos(deltaTap: Int = 1): Unit = tapRatio = transformerTappingModel.incrTapPos(deltaTap) @@ -52,6 +53,7 @@ trait TransformerTapping { /** Decrease transformer tap position by the provided delta value * * @param deltaTap + * number of tap positions to decrease */ def decrTapPos(deltaTap: Int = 1): Unit = tapRatio = transformerTappingModel.decrTapPos(deltaTap) diff --git a/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatParticipant.scala b/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatParticipant.scala index eb51174cb5..b9476aae14 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatParticipant.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatParticipant.scala @@ -6,7 +6,7 @@ package edu.ie3.simona.model.participant -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPowerAndHeat +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPowerAndHeat import edu.ie3.util.scala.quantities.DefaultQuantities._ import squants.{Dimensionless, Power} @@ -14,13 +14,13 @@ trait ApparentPowerAndHeatParticipant[ CD <: CalcRelevantData, MS <: ModelState, ] { - this: SystemParticipant[CD, ApparentPowerAndHeat, MS] => + this: SystemParticipant[CD, ComplexPowerAndHeat, MS] => override def calculatePower( tick: Long, voltage: Dimensionless, modelState: MS, data: CD, - ): ApparentPowerAndHeat = { + ): ComplexPowerAndHeat = { val apparentPower = calculateApparentPower(tick, voltage, modelState, data) val heat = @@ -29,7 +29,7 @@ trait ApparentPowerAndHeatParticipant[ else zeroMW - ApparentPowerAndHeat(apparentPower.p, apparentPower.q, heat) + ComplexPowerAndHeat(apparentPower.p, apparentPower.q, heat) } /** Calculate the heat of the asset. As for electrical assets, positive values diff --git a/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerParticipant.scala b/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerParticipant.scala index d1d71a58ac..e630c7fb5c 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerParticipant.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/ApparentPowerParticipant.scala @@ -6,16 +6,16 @@ package edu.ie3.simona.model.participant -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import squants.Dimensionless trait ApparentPowerParticipant[CD <: CalcRelevantData, MS <: ModelState] { - this: SystemParticipant[CD, ApparentPower, MS] => + this: SystemParticipant[CD, ComplexPower, MS] => override def calculatePower( tick: Long, voltage: Dimensionless, modelState: MS, data: CD, - ): ApparentPower = + ): ComplexPower = calculateApparentPower(tick, voltage, modelState, data) } diff --git a/src/main/scala/edu/ie3/simona/model/participant/BMModel.scala b/src/main/scala/edu/ie3/simona/model/participant/BMModel.scala index e1c9ed715a..6f93742eeb 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/BMModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/BMModel.scala @@ -6,7 +6,7 @@ package edu.ie3.simona.model.participant -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.model.participant.BMModel.BMCalcRelevantData import edu.ie3.simona.model.participant.ModelState.ConstantState import edu.ie3.simona.model.participant.control.QControl @@ -14,7 +14,7 @@ import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage.ProvideFlexOptio import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMinMaxFlexOptions import edu.ie3.util.scala.OperationInterval import edu.ie3.util.scala.quantities.DefaultQuantities._ -import edu.ie3.util.scala.quantities.EnergyPrice +import edu.ie3.util.scala.quantities.{ApparentPower, EnergyPrice} import squants.energy.Megawatts import squants.{Dimensionless, Money, Power, Temperature} @@ -29,8 +29,8 @@ final case class BMModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, - cosPhi: Double, + sRated: ApparentPower, + cosPhiRated: Double, private val node: String, private val isCostControlled: Boolean, private val opex: Money, @@ -38,7 +38,7 @@ final case class BMModel( private val loadGradient: Double, ) extends SystemParticipant[ BMCalcRelevantData, - ApparentPower, + ComplexPower, ConstantState.type, ]( uuid, @@ -46,7 +46,7 @@ final case class BMModel( operationInterval, qControl, sRated, - cosPhi, + cosPhiRated, ) with ApparentPowerParticipant[BMCalcRelevantData, ConstantState.type] { @@ -59,7 +59,7 @@ final case class BMModel( voltage: Dimensionless, modelState: ConstantState.type, data: BMCalcRelevantData, - ): ApparentPower = { + ): ComplexPower = { val result = super.calculatePower(tick, voltage, modelState, data) _lastPower = Some(result.p) @@ -195,9 +195,9 @@ final case class BMModel( isCostControlled && avgOpex.value.doubleValue() < feedInTariff.value .doubleValue() ) - sRated * cosPhi * (-1) + sRated.toActivePower(cosPhiRated) * -1 else - sRated * usage * eff * cosPhi * (-1) + sRated.toActivePower(cosPhiRated) * usage * eff * -1 } /** Applies the load gradient to the electrical output @@ -212,12 +212,12 @@ final case class BMModel( _lastPower match { case None => pEl case Some(lastPowerVal) => - val pElDeltaMaxAbs = sRated * cosPhi * loadGradient + val pElDeltaMaxAbs = sRated.toActivePower(cosPhiRated) * loadGradient pEl - lastPowerVal match { case pElDelta if pElDelta > pElDeltaMaxAbs => lastPowerVal + pElDeltaMaxAbs - case pElDelta if pElDelta < (pElDeltaMaxAbs * (-1)) => + case pElDelta if pElDelta < (pElDeltaMaxAbs * -1) => lastPowerVal - pElDeltaMaxAbs case _ => pEl diff --git a/src/main/scala/edu/ie3/simona/model/participant/ChpModel.scala b/src/main/scala/edu/ie3/simona/model/participant/ChpModel.scala index c0336b0ddc..e48909bd91 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/ChpModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/ChpModel.scala @@ -7,7 +7,7 @@ package edu.ie3.simona.model.participant import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.model.SystemComponent import edu.ie3.simona.model.participant.ChpModel._ import edu.ie3.simona.model.participant.ModelState.ConstantState @@ -17,8 +17,12 @@ import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage.ProvideFlexOptio import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMinMaxFlexOptions import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval -import edu.ie3.util.scala.quantities.DefaultQuantities import edu.ie3.util.scala.quantities.DefaultQuantities._ +import edu.ie3.util.scala.quantities.{ + ApparentPower, + DefaultQuantities, + Kilovoltamperes, +} import squants.energy.Kilowatts import squants.{Energy, Power, Seconds, Time} @@ -50,11 +54,11 @@ final case class ChpModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, pThermal: Power, storage: ThermalStorage with MutableStorage, -) extends SystemParticipant[ChpRelevantData, ApparentPower, ConstantState.type]( +) extends SystemParticipant[ChpRelevantData, ComplexPower, ConstantState.type]( uuid, id, operationInterval, @@ -64,7 +68,7 @@ final case class ChpModel( ) with ApparentPowerParticipant[ChpRelevantData, ConstantState.type] { - val pRated: Power = sRated * cosPhiRated + val pRated: Power = sRated.toActivePower(cosPhiRated) /** As this is a state-full model (with respect to the current operation * condition and its thermal storage), the power calculation operates on the @@ -387,9 +391,9 @@ object ChpModel { scaledInput.getId, operationInterval, qControl, - Kilowatts( + Kilovoltamperes( scaledInput.getType.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ), diff --git a/src/main/scala/edu/ie3/simona/model/participant/FixedFeedInModel.scala b/src/main/scala/edu/ie3/simona/model/participant/FixedFeedInModel.scala index d5cd82c731..0501fcb025 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/FixedFeedInModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/FixedFeedInModel.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.model.participant import com.typesafe.scalalogging.LazyLogging import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.config.SimonaConfig import edu.ie3.simona.model.SystemComponent import edu.ie3.simona.model.participant.CalcRelevantData.FixedRelevantData @@ -18,8 +18,8 @@ import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage.ProvideFlexOptio import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMinMaxFlexOptions import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval +import edu.ie3.util.scala.quantities.{ApparentPower, Kilovoltamperes} import squants.Power -import squants.energy.Kilowatts import java.time.ZonedDateTime import java.util.UUID @@ -44,11 +44,11 @@ final case class FixedFeedInModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, ) extends SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ]( uuid, @@ -71,8 +71,7 @@ final case class FixedFeedInModel( override def calculateActivePower( modelState: ConstantState.type, data: FixedRelevantData.type = FixedRelevantData, - ): Power = - sRated * (-1) * cosPhiRated + ): Power = sRated.toActivePower(cosPhiRated) * -1 override def determineFlexOptions( data: FixedRelevantData.type, @@ -115,9 +114,9 @@ object FixedFeedInModel extends LazyLogging { scaledInput.getId, operationInterval, QControl.apply(scaledInput.getqCharacteristics), - Kilowatts( + Kilovoltamperes( scaledInput.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ), diff --git a/src/main/scala/edu/ie3/simona/model/participant/HpModel.scala b/src/main/scala/edu/ie3/simona/model/participant/HpModel.scala index 87bef06b5a..5e7f96b657 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/HpModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/HpModel.scala @@ -7,7 +7,7 @@ package edu.ie3.simona.model.participant import edu.ie3.datamodel.models.input.system.HpInput -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPowerAndHeat +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPowerAndHeat import edu.ie3.simona.model.SystemComponent import edu.ie3.simona.model.participant.HpModel.{HpRelevantData, HpState} import edu.ie3.simona.model.participant.control.QControl @@ -21,6 +21,7 @@ import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMin import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval import edu.ie3.util.scala.quantities.DefaultQuantities._ +import edu.ie3.util.scala.quantities.{ApparentPower, Kilovoltamperes} import squants.energy.{Energy, KilowattHours, Kilowatts} import squants.{Power, Temperature} @@ -55,13 +56,13 @@ final case class HpModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, pThermal: Power, thermalGrid: ThermalGrid, ) extends SystemParticipant[ HpRelevantData, - ApparentPowerAndHeat, + ComplexPowerAndHeat, HpState, ]( uuid, @@ -73,8 +74,7 @@ final case class HpModel( ) with ApparentPowerAndHeatParticipant[HpRelevantData, HpState] { - private val pRated: Power = - sRated * cosPhiRated + private val pRated: Power = sRated.toActivePower(cosPhiRated) /** As this is a state-full model (with respect to the current operation * condition and inner temperature), the power calculation operates on the @@ -364,7 +364,7 @@ final case class HpModel( updatedHpState.activePower val upperBoundary = if (canOperate) - sRated * cosPhiRated + sRated.toActivePower(cosPhiRated) else zeroKW @@ -399,7 +399,7 @@ final case class HpModel( setPower: Power, ): (HpState, FlexChangeIndicator) = { /* If the setpoint value is above 50 % of the electrical power, turn on the heat pump otherwise turn it off */ - val turnOn = setPower > (sRated * cosPhiRated * 0.5) + val turnOn = setPower > (sRated.toActivePower(cosPhiRated) * 0.5) val ( thermalEnergyDemandHouse, @@ -466,9 +466,9 @@ object HpModel { scaledInput.getId, operationInterval, qControl, - Kilowatts( + Kilovoltamperes( scaledInput.getType.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ), @@ -575,9 +575,9 @@ object HpModel { scaledInput.getId, operationInterval, qControl, - Kilowatts( + Kilovoltamperes( scaledInput.getType.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ), diff --git a/src/main/scala/edu/ie3/simona/model/participant/PvModel.scala b/src/main/scala/edu/ie3/simona/model/participant/PvModel.scala index 78508c91d5..5d83478da0 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/PvModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/PvModel.scala @@ -7,7 +7,7 @@ package edu.ie3.simona.model.participant import edu.ie3.datamodel.models.input.system.PvInput -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.model.SystemComponent import edu.ie3.simona.model.participant.ModelState.ConstantState import edu.ie3.simona.model.participant.PvModel.PvRelevantData @@ -18,7 +18,6 @@ import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval import edu.ie3.util.scala.quantities._ import squants._ -import squants.energy.Kilowatts import squants.space.{Degrees, SquareMeters} import squants.time.Minutes import tech.units.indriya.unit.Units._ @@ -33,7 +32,7 @@ final case class PvModel private ( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, private val lat: Angle, private val lon: Angle, @@ -42,7 +41,7 @@ final case class PvModel private ( private val alphaE: Angle, private val gammaE: Angle, private val moduleSurface: Area = SquareMeters(1d), -) extends SystemParticipant[PvRelevantData, ApparentPower, ConstantState.type]( +) extends SystemParticipant[PvRelevantData, ComplexPower, ConstantState.type]( uuid, id, operationInterval, @@ -55,15 +54,16 @@ final case class PvModel private ( /** Override sMax as the power output of a pv unit could become easily up to * 10% higher than the sRated value found in the technical sheets */ - override val sMax: Power = sRated * 1.1 + override val sMax: ApparentPower = sRated * 1.1 /** Permissible maximum active power feed in (therefore negative) */ - protected val pMax: Power = sMax * cosPhiRated * -1d + protected val pMax: Power = sMax.toActivePower(cosPhiRated) * -1d /** Reference yield at standard testing conditions (STC) */ private val yieldSTC = WattsPerSquareMeter(1000d) - private val activationThreshold = sRated * cosPhiRated * 0.001 * -1d + private val activationThreshold = + sRated.toActivePower(cosPhiRated) * 0.001 * -1d /** Calculate the active power behaviour of the model * @@ -241,7 +241,7 @@ final case class PvModel private ( /** Calculates the sunrise hour angle omegaSR given omegaSS. */ private val calcSunriseAngleOmegaSR = - (omegaSS: Angle) => omegaSS * (-1) + (omegaSS: Angle) => omegaSS * -1 /** Calculates the solar altitude angle alphaS which represents the angle * between the horizontal and the line to the sun, that is, the complement of @@ -691,9 +691,8 @@ final case class PvModel private ( eTotalInWhPerSM * moduleSurface.toSquareMeters * etaConv.toEach * (genCorr * tempCorr) /* Calculate the foreseen active power output without boundary condition adaptions */ - val proposal = sRated * (-1) * ( - actYield / irradiationSTC - ) * cosPhiRated + val proposal = + sRated.toActivePower(cosPhiRated) * -1 * (actYield / irradiationSTC) /* Do sanity check, if the proposed feed in is above the estimated maximum to be apparent active power of the plant */ if (proposal < pMax) @@ -771,9 +770,9 @@ object PvModel { scaledInput.getId, operationInterval, QControl(scaledInput.getqCharacteristics), - Kilowatts( + Kilovoltamperes( scaledInput.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ), diff --git a/src/main/scala/edu/ie3/simona/model/participant/StorageModel.scala b/src/main/scala/edu/ie3/simona/model/participant/StorageModel.scala index 82744e7824..0c730a962b 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/StorageModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/StorageModel.scala @@ -7,7 +7,7 @@ package edu.ie3.simona.model.participant import edu.ie3.datamodel.models.input.system.StorageInput -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.model.SystemComponent import edu.ie3.simona.model.participant.StorageModel.{ RefTargetSocParams, @@ -20,6 +20,7 @@ import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMin import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval import edu.ie3.util.scala.quantities.DefaultQuantities._ +import edu.ie3.util.scala.quantities.{ApparentPower, Kilovoltamperes} import squants.energy.{KilowattHours, Kilowatts} import squants.{Dimensionless, Each, Energy, Power, Seconds} @@ -31,14 +32,14 @@ final case class StorageModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, eStorage: Energy, pMax: Power, eta: Dimensionless, initialSoc: Double, targetSoc: Option[Double], -) extends SystemParticipant[StorageRelevantData, ApparentPower, StorageState]( +) extends SystemParticipant[StorageRelevantData, ComplexPower, StorageState]( uuid, id, operationInterval, @@ -103,7 +104,7 @@ final case class StorageModel( voltage: Dimensionless, modelState: StorageState, data: StorageRelevantData, - ): ApparentPower = + ): ComplexPower = throw new NotImplementedError( "Storage model cannot calculate power without flexibility control." ) @@ -354,9 +355,9 @@ object StorageModel { scaledInput.getId, operationInterval, QControl.apply(scaledInput.getqCharacteristics), - Kilowatts( + Kilovoltamperes( scaledInput.getType.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ), diff --git a/src/main/scala/edu/ie3/simona/model/participant/SystemParticipant.scala b/src/main/scala/edu/ie3/simona/model/participant/SystemParticipant.scala index f245923356..1aa4377f8e 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/SystemParticipant.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/SystemParticipant.scala @@ -7,7 +7,7 @@ package edu.ie3.simona.model.participant import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, PrimaryDataWithApparentPower, } import edu.ie3.simona.model.SystemComponent @@ -15,13 +15,9 @@ import edu.ie3.simona.model.participant.control.QControl import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage.ProvideFlexOptions import edu.ie3.util.scala.OperationInterval import edu.ie3.util.scala.quantities.DefaultQuantities._ -import edu.ie3.util.scala.quantities.{ - DefaultQuantities, - Megavars, - ReactivePower, -} +import edu.ie3.util.scala.quantities._ import squants.Dimensionless -import squants.energy.{Kilowatts, Power} +import squants.energy.Power import java.util.UUID @@ -55,7 +51,7 @@ abstract class SystemParticipant[ id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, ) extends SystemComponent(uuid, id, operationInterval) { @@ -64,7 +60,7 @@ abstract class SystemParticipant[ * overwritten if the system participant's apparent power can be higher than * sRated. */ - protected val sMax: Power = sRated + protected val sMax: ApparentPower = sRated /** Calculate the power behaviour based on the given data. * @@ -102,17 +98,17 @@ abstract class SystemParticipant[ voltage: Dimensionless, modelState: MS, data: CD, - ): ApparentPower = { + ): ComplexPower = { if (isInOperation(tick)) { val activePower = calculateActivePower(modelState, data) val reactivePower = calculateReactivePower(activePower, voltage) - ApparentPower( + ComplexPower( activePower, reactivePower, ) } else { - ApparentPower( + ComplexPower( DefaultQuantities.zeroMW, DefaultQuantities.zeroMVAr, ) @@ -212,7 +208,7 @@ abstract class SystemParticipant[ reactivePower: ReactivePower, ): ReactivePower = { { - val apparentPower: Power = Kilowatts( + val apparentPower: ApparentPower = Kilovoltamperes( Math .sqrt( Math.pow(activePower.toKilowatts, 2) + Math @@ -232,8 +228,8 @@ abstract class SystemParticipant[ s"in correspondence to the existing active power $activePower." ) - val powerSquaredDifference = Math.pow(sMax.toMegawatts, 2) - - Math.pow(activePower.toMegawatts, 2) + val powerSquaredDifference = Math.pow(sMax.toMegavoltamperes, 2) - Math + .pow(activePower.toMegawatts, 2) if (powerSquaredDifference < 0) { logger.warn( diff --git a/src/main/scala/edu/ie3/simona/model/participant/WecModel.scala b/src/main/scala/edu/ie3/simona/model/participant/WecModel.scala index 4ecc4e5b5b..50f26708e7 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/WecModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/WecModel.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.model.participant import edu.ie3.datamodel.models.input.system.WecInput import edu.ie3.datamodel.models.input.system.characteristic.WecCharacteristicInput -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.model.SystemComponent import edu.ie3.simona.model.participant.ModelState.ConstantState import edu.ie3.simona.model.participant.WecModel.{ @@ -23,8 +23,9 @@ import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMin import edu.ie3.util.quantities.PowerSystemUnits._ import edu.ie3.util.scala.OperationInterval import edu.ie3.util.scala.quantities.DefaultQuantities._ +import edu.ie3.util.scala.quantities.{ApparentPower, Kilovoltamperes} import squants._ -import squants.energy.{Kilowatts, Watts} +import squants.energy.Watts import squants.mass.{Kilograms, KilogramsPerCubicMeter} import squants.motion.{MetersPerSecond, Pressure} import squants.space.SquareMeters @@ -60,11 +61,11 @@ final case class WecModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, rotorArea: Area, betzCurve: WecCharacteristic, -) extends SystemParticipant[WecRelevantData, ApparentPower, ConstantState.type]( +) extends SystemParticipant[WecRelevantData, ComplexPower, ConstantState.type]( uuid, id, operationInterval, @@ -95,7 +96,7 @@ final case class WecModel( wecData: WecRelevantData, ): Power = { val activePower = determinePower(wecData) - val pMax = sMax * cosPhiRated + val pMax = sMax.toActivePower(cosPhiRated) (if (activePower > pMax) { logger.warn( @@ -274,8 +275,8 @@ object WecModel { scaledInput.getId, operationInterval, QControl(scaledInput.getqCharacteristics), - Kilowatts( - scaledInput.getType.getsRated.to(KILOWATT).getValue.doubleValue + Kilovoltamperes( + scaledInput.getType.getsRated.to(KILOVOLTAMPERE).getValue.doubleValue ), scaledInput.getType.getCosPhiRated, SquareMeters( diff --git a/src/main/scala/edu/ie3/simona/model/participant/control/QControl.scala b/src/main/scala/edu/ie3/simona/model/participant/control/QControl.scala index 391d4bca7c..7c998cbc4e 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/control/QControl.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/control/QControl.scala @@ -13,7 +13,7 @@ import edu.ie3.simona.model.system.Characteristic import edu.ie3.simona.model.system.Characteristic.XYPair import edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.util.scala.quantities.DefaultQuantities._ -import edu.ie3.util.scala.quantities.{Megavars, ReactivePower} +import edu.ie3.util.scala.quantities.{ApparentPower, Megavars, ReactivePower} import squants.{Dimensionless, Each, Power} import tech.units.indriya.AbstractUnit @@ -44,7 +44,7 @@ sealed trait QControl { * The function */ def activeToReactivePowerFunc( - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, nodalVoltage: Dimensionless, ): Power => ReactivePower @@ -117,7 +117,7 @@ object QControl { * The function */ override def activeToReactivePowerFunc( - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, nodalVoltage: Dimensionless, ): Power => ReactivePower = { activePower: Power => @@ -169,19 +169,19 @@ object QControl { * The function */ override def activeToReactivePowerFunc( - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, nodalVoltage: Dimensionless, ): Power => ReactivePower = { activePower: Power => + // Q = sqrt(S^2 - P^2) val qMaxFromP = Megavars( - sqrt( - pow(sRated.toMegawatts, 2) - - pow(activePower.toMegawatts, 2) - ) + sqrt(pow(sRated.toMegavoltamperes, 2) - pow(activePower.toMegawatts, 2)) ) - val qFromCharacteristic = - q(nodalVoltage, Megavars((sRated * sin(acos(cosPhiRated))).toMegawatts)) + val qFromCharacteristic = q( + nodalVoltage, + sRated.toReactivePower(cosPhiRated), + ) qMaxPossible(qMaxFromP, qFromCharacteristic) } @@ -244,13 +244,13 @@ object QControl { * The function */ override def activeToReactivePowerFunc( - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, nodalVoltage: Dimensionless, ): Power => ReactivePower = { activePower: Power => /* cosphi( P / P_N ) = cosphi( P / (S_N * cosphi_rated) ) */ val pInPu = - activePower / (sRated * cosPhiRated) + activePower / sRated.toActivePower(cosPhiRated) val instantCosPhi = cosPhi(Each(pInPu)) _cosPhiMultiplication(instantCosPhi.value.doubleValue, activePower) } diff --git a/src/main/scala/edu/ie3/simona/model/participant/evcs/EvModelWrapper.scala b/src/main/scala/edu/ie3/simona/model/participant/evcs/EvModelWrapper.scala index f928af2fcf..7883557dbe 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/evcs/EvModelWrapper.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/evcs/EvModelWrapper.scala @@ -9,7 +9,8 @@ package edu.ie3.simona.model.participant.evcs import edu.ie3.simona.api.data.ev.model.EvModel import edu.ie3.util.quantities.PowerSystemUnits._ import edu.ie3.util.quantities.QuantityUtils.RichQuantityDouble -import squants.energy.{KilowattHours, Kilowatts} +import squants.Power +import squants.energy.{Energy, KilowattHours, Kilowatts} import java.util.UUID @@ -26,19 +27,23 @@ import java.util.UUID * The wrapped [[EvModel]] */ final case class EvModelWrapper( - storedEnergy: squants.Energy, + storedEnergy: Energy, private val original: EvModel, ) { def uuid: UUID = original.getUuid def id: String = original.getId - lazy val sRatedAc: squants.Power = - Kilowatts(original.getSRatedAC.to(KILOWATT).getValue.doubleValue) - lazy val sRatedDc: squants.Power = - Kilowatts(original.getSRatedDC.to(KILOWATT).getValue.doubleValue) - lazy val eStorage: squants.Energy = KilowattHours( + + lazy val pRatedAc: Power = Kilowatts( + original.getSRatedAC.to(KILOWATT).getValue.doubleValue + ) + lazy val pRatedDc: Power = Kilowatts( + original.getSRatedDC.to(KILOWATT).getValue.doubleValue + ) + lazy val eStorage: Energy = KilowattHours( original.getEStorage.to(KILOWATTHOUR).getValue.doubleValue ) + def departureTick: Long = original.getDepartureTick /** Unwrapping the original [[EvModel]] while also updating the diff --git a/src/main/scala/edu/ie3/simona/model/participant/evcs/EvcsModel.scala b/src/main/scala/edu/ie3/simona/model/participant/evcs/EvcsModel.scala index 57a8f4c883..30b3f0a249 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/evcs/EvcsModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/evcs/EvcsModel.scala @@ -11,7 +11,7 @@ import edu.ie3.datamodel.models.ElectricCurrentType import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.`type`.evcslocation.EvcsLocationType import edu.ie3.datamodel.models.result.system.{EvResult, EvcsResult} -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.model.SystemComponent import edu.ie3.simona.model.participant.control.QControl import edu.ie3.simona.model.participant.evcs.EvcsModel._ @@ -32,6 +32,7 @@ import edu.ie3.util.quantities.PowerSystemUnits._ import edu.ie3.util.quantities.QuantityUtils.RichQuantityDouble import edu.ie3.util.scala.OperationInterval import edu.ie3.util.scala.quantities.DefaultQuantities._ +import edu.ie3.util.scala.quantities.{ApparentPower, Kilovoltamperes} import squants.energy.Kilowatts import squants.time.Seconds import squants.{Dimensionless, Energy, Power} @@ -73,7 +74,7 @@ final case class EvcsModel( operationInterval: OperationInterval, simulationStartDate: ZonedDateTime, qControl: QControl, - sRated: Power, + sRated: ApparentPower, currentType: ElectricCurrentType, cosPhiRated: Double, chargingPoints: Int, @@ -81,7 +82,7 @@ final case class EvcsModel( vehicle2grid: Boolean, strategy: ChargingStrategy.Value, lowestEvSoc: Double, -) extends SystemParticipant[EvcsRelevantData, ApparentPower, EvcsState]( +) extends SystemParticipant[EvcsRelevantData, ComplexPower, EvcsState]( uuid, id, operationInterval, @@ -500,12 +501,12 @@ final case class EvcsModel( ): Power = { val evPower = currentType match { case ElectricCurrentType.AC => - ev.sRatedAc + ev.pRatedAc case ElectricCurrentType.DC => - ev.sRatedDc + ev.pRatedDc } /* Limit the charging power to the minimum of ev's and evcs' permissible power */ - evPower.min(sRated) + evPower.min(sRated.toActivePower(1.0)) } override def calculatePower( @@ -513,7 +514,7 @@ final case class EvcsModel( voltage: Dimensionless, modelState: EvcsState, data: EvcsRelevantData, - ): ApparentPower = + ): ComplexPower = throw new NotImplementedError( "Use calculateNewScheduling() or chargeEv() instead." ) @@ -750,7 +751,7 @@ final case class EvcsModel( if (setPower > zeroKW) maxPower else - maxPower * (-1) + maxPower * -1 val chargingTicks = calcFlexOptionsChange(ev, power) val endTick = Math.min(currentTick + chargingTicks, ev.departureTick) @@ -819,7 +820,7 @@ final case class EvcsModel( (targetEnergy - ev.storedEnergy) / power } else - (ev.storedEnergy - (ev.eStorage * lowestEvSoc)) / (power * (-1)) + (ev.storedEnergy - (ev.eStorage * lowestEvSoc)) / (power * -1) Math.round(timeUntilFullOrEmpty.toSeconds) } @@ -928,7 +929,7 @@ final case class EvcsModel( * @param chargingPoints * max number of charging points available at this CS */ - def validateArrivals( + private def validateArrivals( lastEvs: Seq[EvModelWrapper], arrivals: Seq[EvModelWrapper], chargingPoints: Int, @@ -1066,8 +1067,8 @@ object EvcsModel { operationInterval, simulationStartDate, QControl(scaledInput.getqCharacteristics), - Kilowatts( - scaledInput.getType.getsRated.to(KILOWATT).getValue.doubleValue + Kilovoltamperes( + scaledInput.getType.getsRated.to(KILOVOLTAMPERE).getValue.doubleValue ), scaledInput.getType.getElectricCurrentType, scaledInput.getCosPhiRated, diff --git a/src/main/scala/edu/ie3/simona/model/participant/load/FixedLoadModel.scala b/src/main/scala/edu/ie3/simona/model/participant/load/FixedLoadModel.scala index cc4bc82c65..48ef0d4eb7 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/load/FixedLoadModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/load/FixedLoadModel.scala @@ -17,8 +17,8 @@ import edu.ie3.simona.model.participant.load.LoadReference.{ } import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval +import edu.ie3.util.scala.quantities.{ApparentPower, Kilovoltamperes} import squants.Power -import squants.energy.Kilowatts import squants.time.Days import java.util.UUID @@ -45,7 +45,7 @@ final case class FixedLoadModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, reference: LoadReference, ) extends LoadModel[FixedLoadRelevantData.type]( @@ -95,9 +95,9 @@ object FixedLoadModel { scaledInput.getId, operationInterval, QControl(scaledInput.getqCharacteristics()), - Kilowatts( + Kilovoltamperes( scaledInput.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ), diff --git a/src/main/scala/edu/ie3/simona/model/participant/load/LoadModel.scala b/src/main/scala/edu/ie3/simona/model/participant/load/LoadModel.scala index 183f1dc5ae..6eb5a6fd0d 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/load/LoadModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/load/LoadModel.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.model.participant.load import com.typesafe.scalalogging.LazyLogging import edu.ie3.datamodel.models.input.system.LoadInput -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.model.participant.CalcRelevantData.LoadRelevantData import edu.ie3.simona.model.participant.ModelState.ConstantState import edu.ie3.simona.model.participant.control.QControl @@ -21,7 +21,7 @@ import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage.ProvideFlexOptio import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMinMaxFlexOptions import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval -import squants.energy.Kilowatts +import edu.ie3.util.scala.quantities.{ApparentPower, Kilovoltamperes} import squants.{Energy, Power} import java.util.UUID @@ -36,9 +36,9 @@ abstract class LoadModel[D <: LoadRelevantData]( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, -) extends SystemParticipant[D, ApparentPower, ConstantState.type]( +) extends SystemParticipant[D, ComplexPower, ConstantState.type]( uuid, id, operationInterval, @@ -89,14 +89,14 @@ object LoadModel extends LazyLogging { inputModel: LoadInput, activePower: Power, safetyFactor: Double = 1d, - ): Power = { - val sRated = Kilowatts( + ): ApparentPower = { + val sRated = Kilovoltamperes( inputModel.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue ) - val pRated = sRated * inputModel.getCosPhiRated + val pRated = sRated.toActivePower(inputModel.getCosPhiRated) val referenceScalingFactor = activePower / pRated sRated * referenceScalingFactor * safetyFactor } @@ -132,10 +132,12 @@ object LoadModel extends LazyLogging { profileMaxPower: Power, profileEnergyScaling: Energy, safetyFactor: Double = 1d, - ): Power = { - (profileMaxPower / inputModel.getCosPhiRated) * ( + ): ApparentPower = { + val power = (profileMaxPower / inputModel.getCosPhiRated) * ( energyConsumption / profileEnergyScaling ) * safetyFactor + + Kilovoltamperes(power.toKilowatts) } } diff --git a/src/main/scala/edu/ie3/simona/model/participant/load/profile/LoadProfileStore.scala b/src/main/scala/edu/ie3/simona/model/participant/load/profile/LoadProfileStore.scala index 63e4a0d4a5..209d9349c8 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/load/profile/LoadProfileStore.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/load/profile/LoadProfileStore.scala @@ -18,6 +18,7 @@ import edu.ie3.simona.model.participant.load.profile.LoadProfileStore.{ } import edu.ie3.simona.model.participant.load.{DayType, profile} import org.apache.commons.csv.CSVFormat +import squants.Power import squants.energy.{KilowattHours, Watts} import java.io.{InputStreamReader, Reader} @@ -88,7 +89,7 @@ class LoadProfileStore private (val reader: Reader) { */ def maxPower( loadProfile: StandardLoadProfile - ): squants.Power = { + ): Power = { maxParamMap.get(loadProfile) match { case Some(value) => Watts(value) diff --git a/src/main/scala/edu/ie3/simona/model/participant/load/profile/ProfileLoadModel.scala b/src/main/scala/edu/ie3/simona/model/participant/load/profile/ProfileLoadModel.scala index e94f50867f..e30390bb74 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/load/profile/ProfileLoadModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/load/profile/ProfileLoadModel.scala @@ -15,6 +15,7 @@ import edu.ie3.simona.model.participant.load.LoadReference._ import edu.ie3.simona.model.participant.load.profile.ProfileLoadModel.ProfileRelevantData import edu.ie3.simona.model.participant.load.{LoadModel, LoadReference} import edu.ie3.util.scala.OperationInterval +import edu.ie3.util.scala.quantities.ApparentPower import squants.Power import java.time.ZonedDateTime @@ -44,7 +45,7 @@ final case class ProfileLoadModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, loadProfile: StandardLoadProfile, reference: LoadReference, diff --git a/src/main/scala/edu/ie3/simona/model/participant/load/random/RandomLoadModel.scala b/src/main/scala/edu/ie3/simona/model/participant/load/random/RandomLoadModel.scala index 4409d62cf2..bb0d95a9c8 100644 --- a/src/main/scala/edu/ie3/simona/model/participant/load/random/RandomLoadModel.scala +++ b/src/main/scala/edu/ie3/simona/model/participant/load/random/RandomLoadModel.scala @@ -17,6 +17,7 @@ import edu.ie3.simona.model.participant.load.random.RandomLoadModel.RandomReleva import edu.ie3.simona.model.participant.load.{DayType, LoadModel, LoadReference} import edu.ie3.util.TimeUtil import edu.ie3.util.scala.OperationInterval +import edu.ie3.util.scala.quantities.ApparentPower import squants.Power import squants.energy.{KilowattHours, Kilowatts, Watts} @@ -50,7 +51,7 @@ final case class RandomLoadModel( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, reference: LoadReference, ) extends LoadModel[RandomRelevantData]( @@ -168,7 +169,7 @@ object RandomLoadModel { * active power. * * @return - * Reference power to use for later model calculations + * Reference active power to use for later model calculations */ private val randomMaxPower: Power = Watts(159d) diff --git a/src/main/scala/edu/ie3/simona/ontology/messages/flex/FlexibilityMessage.scala b/src/main/scala/edu/ie3/simona/ontology/messages/flex/FlexibilityMessage.scala index 9a946de85e..662c11e2d2 100644 --- a/src/main/scala/edu/ie3/simona/ontology/messages/flex/FlexibilityMessage.scala +++ b/src/main/scala/edu/ie3/simona/ontology/messages/flex/FlexibilityMessage.scala @@ -8,7 +8,7 @@ package edu.ie3.simona.ontology.messages.flex import edu.ie3.datamodel.models.input.AssetInput import edu.ie3.simona.agent.em.EmAgent -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.scheduler.ScheduleLock.ScheduleKey import org.apache.pekko.actor.typed.ActorRef import squants.Power @@ -128,7 +128,7 @@ object FlexibilityMessage { */ final case class FlexResult( override val modelUuid: UUID, - result: ApparentPower, + result: ComplexPower, ) extends FlexResponse /** Message sent by flex options providers indicating that the diff --git a/src/main/scala/edu/ie3/simona/ontology/messages/services/PrimaryDataMessage.scala b/src/main/scala/edu/ie3/simona/ontology/messages/services/PrimaryDataMessage.scala index 4721af5f2f..f78e1f5fe4 100644 --- a/src/main/scala/edu/ie3/simona/ontology/messages/services/PrimaryDataMessage.scala +++ b/src/main/scala/edu/ie3/simona/ontology/messages/services/PrimaryDataMessage.scala @@ -6,7 +6,7 @@ package edu.ie3.simona.ontology.messages.services -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.ontology.messages.services.ServiceMessage.ProvisionMessage import org.apache.pekko.actor.ActorRef @@ -14,7 +14,7 @@ sealed trait PrimaryDataMessage object PrimaryDataMessage { - /** Provides primary data in the form of [[ApparentPower]] + /** Provides primary data in the form of [[ComplexPower]] * * @param tick * Tick, the data belongs to @@ -27,8 +27,8 @@ object PrimaryDataMessage { final case class ApparentPowerProvisionMessage( override val tick: Long, override val serviceRef: ActorRef, - override val data: ApparentPower, + override val data: ComplexPower, override val nextDataTick: Option[Long], - ) extends ProvisionMessage[ApparentPower] + ) extends ProvisionMessage[ComplexPower] with PrimaryDataMessage } diff --git a/src/main/scala/edu/ie3/simona/service/primary/PrimaryServiceWorker.scala b/src/main/scala/edu/ie3/simona/service/primary/PrimaryServiceWorker.scala index bd09c0b81b..b20fdd834c 100644 --- a/src/main/scala/edu/ie3/simona/service/primary/PrimaryServiceWorker.scala +++ b/src/main/scala/edu/ie3/simona/service/primary/PrimaryServiceWorker.scala @@ -20,6 +20,7 @@ import edu.ie3.simona.agent.participant.data.Data.PrimaryData.RichValue import edu.ie3.simona.config.SimonaConfig.Simona.Input.Primary.SqlParams import edu.ie3.simona.exceptions.InitializationException import edu.ie3.simona.exceptions.WeatherServiceException.InvalidRegistrationRequestException +import edu.ie3.simona.exceptions.agent.ServiceRegistrationException import edu.ie3.simona.ontology.messages.services.ServiceMessage import edu.ie3.simona.ontology.messages.services.ServiceMessage.RegistrationResponseMessage.RegistrationSuccessfulMessage import edu.ie3.simona.service.ServiceStateData.{ @@ -131,32 +132,47 @@ final case class PrimaryServiceWorker[V <: Value]( s"Provided init data '${unsupported.getClass.getSimpleName}' for primary service are invalid!" ) ) - }).map { case (source, simulationStart) => + }).flatMap { case (source, simulationStart) => implicit val startDateTime: ZonedDateTime = simulationStart val (maybeNextTick, furtherActivationTicks) = SortedDistinctSeq( // Note: The whole data set is used here, which might be inefficient depending on the source implementation. source.getTimeSeries.getEntries.asScala - .filter { timeBasedValue => - val dateTime = timeBasedValue.getTime - dateTime.isEqual(simulationStart) || dateTime.isAfter( - simulationStart - ) - } .map(timeBasedValue => timeBasedValue.getTime.toTick) + .filter(_ >= 0L) .toSeq .sorted ).pop - /* Set up the state data and determine the next activation tick. */ - val initializedStateData = - PrimaryServiceInitializedStateData( - maybeNextTick, - furtherActivationTicks, - simulationStart, - source, - ) - (initializedStateData, maybeNextTick) + (maybeNextTick, furtherActivationTicks) match { + case (Some(tick), furtherActivationTicks) if tick == 0L => + /* Set up the state data and determine the next activation tick. */ + val initializedStateData = + PrimaryServiceInitializedStateData( + maybeNextTick, + furtherActivationTicks, + simulationStart, + source, + ) + + Success(initializedStateData, maybeNextTick) + + case (Some(tick), _) if tick > 0L => + /* The start of the data needs to be at the first tick of the simulation. */ + Failure( + new ServiceRegistrationException( + s"The data for the timeseries '${source.getTimeSeries.getUuid}' starts after the start of this simulation (tick: $tick)! This is not allowed!" + ) + ) + + case _ => + /* No data for the simulation. */ + Failure( + new ServiceRegistrationException( + s"No appropriate data found within simulation time range in timeseries '${source.getTimeSeries.getUuid}'!" + ) + ) + } } } diff --git a/src/main/scala/edu/ie3/simona/service/weather/SampleWeatherSource.scala b/src/main/scala/edu/ie3/simona/service/weather/SampleWeatherSource.scala index 2e2dd58c7c..0db3ded44c 100644 --- a/src/main/scala/edu/ie3/simona/service/weather/SampleWeatherSource.scala +++ b/src/main/scala/edu/ie3/simona/service/weather/SampleWeatherSource.scala @@ -185,55 +185,56 @@ object SampleWeatherSource { // these lists contain the hourly weather values for each first of the month of 2011 + january // 2012 at coordinate id 213089 - val diffuseRadiation: Vector[Double] = Vector(0, 0, 0, 0, 0, 1.18179e-12, - 4.42315e-11, 0.0585938, 1.94141, 15.1172, 74.8438, 89.0469, 104.062, - 131.211, 98.3984, 74.5664, 9.52576e-10, 5.61295e-09, 3.74196e-09, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4.3031e-12, 1.26833e-10, 0.123047, 21.7734, 44.8906, 62.5, - 116.304, 121.279, 124.103, 127.578, 126.474, 122.366, 72.7656, 50.4609, - 33.6406, 1.95692e-12, 9.96252e-13, 6.64168e-13, 0, 0, 0, 0, 0, 0, - 4.6561e-11, 0.179688, 7.00781, 70.375, 85.0805, 96.5268, 131.642, 134.801, - 136.495, 137.11, 133.496, 127.942, 95.6875, 79.7031, 57.375, 2.50246e-10, - 1.27398e-10, 8.49321e-11, 0, 0, 0, 0, 0, 0, 4.6561e-11, 0.179688, 7.00781, - 70.375, 85.0805, 96.5268, 131.642, 134.801, 136.495, 137.11, 133.496, - 127.942, 95.6875, 79.7031, 57.375, 2.50246e-10, 1.27398e-10, 8.49321e-11, 0, - 0, 0, 0, 0, 3.01617e-13, 0.320312, 9.46875, 31.536, 137.816, 144.761, - 148.295, 159.991, 179.943, 161.786, 167.365, 187.983, 186.71, 190.492, - 153.12, 109.372, 8.79227e-11, 4.47606e-11, 2.98404e-11, 0, 0, 0, 0, 0, - 0.0214844, 5.28906, 34.5625, 64.5749, 145.311, 158.575, 177.106, 203.842, - 208.607, 192.496, 153.726, 150.415, 146.707, 122.146, 112.221, 99.3091, - 32.2031, 16.3906, 10.9297, 0, 0, 0, 0, 0, 0.046875, 9.05859, 30.9102, - 49.6208, 111.284, 119.403, 126.256, 148.362, 150.649, 151.829, 151.844, - 149.184, 145.261, 123.728, 114.725, 103.147, 43.0547, 21.9219, 14.6133, 0, - 0, 0, 0, 0, 1.2934e-11, 0.460938, 13.4727, 40.0492, 144.359, 178.505, - 200.116, 217.874, 243.675, 270.285, 324.789, 288.28, 246.589, 213.373, - 161.242, 131.508, 27.2734, 13.8828, 9.25781, 0, 0, 0, 0, 0, 2.57911e-13, - 1.14858e-09, 0.28125, 10.9336, 98.3691, 119.471, 122.866, 142.176, 228.197, - 257.473, 168.816, 187.572, 185.407, 173.508, 128.359, 98.2266, 1.78996e-10, - 6.29864e-10, 1.1817e-09, 0, 0, 0, 0, 0, 0, 5.39019e-11, 0.0664062, 2.85742, - 73.9453, 94.8518, 100.687, 124.047, 126.782, 127.841, 125.49, 120.944, - 114.361, 73.6172, 52.5547, 35.0352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.2974e-13, - 4.56214e-11, 0.0996094, 18.0625, 45.7656, 73.1016, 143.159, 158.414, - 171.997, 164.156, 149.156, 124.133, 17.2539, 8.78516, 5.85547, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4.99714e-11, 6.15368e-10, 0.464844, 13.3242, 29.8594, - 83.7578, 88.2578, 90.0703, 86.3281, 78.0234, 64.9609, 7.0161e-09, - 4.42477e-09, 2.94985e-09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.71801e-10, - 0.0546875, 1.91406, 17.5312, 69.7578, 86.0391, 87.2578, 102.062, 78.9297, - 64.0508, 4.10171e-09, 7.74083e-09, 1.05629e-08, 0, 0, 0, 0, 0) + private val diffuseRadiation: Vector[Double] = Vector(0, 0, 0, 0, 0, + 1.18179e-12, 4.42315e-11, 0.0585938, 1.94141, 15.1172, 74.8438, 89.0469, + 104.062, 131.211, 98.3984, 74.5664, 9.52576e-10, 5.61295e-09, 3.74196e-09, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.3031e-12, 1.26833e-10, 0.123047, 21.7734, + 44.8906, 62.5, 116.304, 121.279, 124.103, 127.578, 126.474, 122.366, + 72.7656, 50.4609, 33.6406, 1.95692e-12, 9.96252e-13, 6.64168e-13, 0, 0, 0, + 0, 0, 0, 4.6561e-11, 0.179688, 7.00781, 70.375, 85.0805, 96.5268, 131.642, + 134.801, 136.495, 137.11, 133.496, 127.942, 95.6875, 79.7031, 57.375, + 2.50246e-10, 1.27398e-10, 8.49321e-11, 0, 0, 0, 0, 0, 0, 4.6561e-11, + 0.179688, 7.00781, 70.375, 85.0805, 96.5268, 131.642, 134.801, 136.495, + 137.11, 133.496, 127.942, 95.6875, 79.7031, 57.375, 2.50246e-10, + 1.27398e-10, 8.49321e-11, 0, 0, 0, 0, 0, 3.01617e-13, 0.320312, 9.46875, + 31.536, 137.816, 144.761, 148.295, 159.991, 179.943, 161.786, 167.365, + 187.983, 186.71, 190.492, 153.12, 109.372, 8.79227e-11, 4.47606e-11, + 2.98404e-11, 0, 0, 0, 0, 0, 0.0214844, 5.28906, 34.5625, 64.5749, 145.311, + 158.575, 177.106, 203.842, 208.607, 192.496, 153.726, 150.415, 146.707, + 122.146, 112.221, 99.3091, 32.2031, 16.3906, 10.9297, 0, 0, 0, 0, 0, + 0.046875, 9.05859, 30.9102, 49.6208, 111.284, 119.403, 126.256, 148.362, + 150.649, 151.829, 151.844, 149.184, 145.261, 123.728, 114.725, 103.147, + 43.0547, 21.9219, 14.6133, 0, 0, 0, 0, 0, 1.2934e-11, 0.460938, 13.4727, + 40.0492, 144.359, 178.505, 200.116, 217.874, 243.675, 270.285, 324.789, + 288.28, 246.589, 213.373, 161.242, 131.508, 27.2734, 13.8828, 9.25781, 0, 0, + 0, 0, 0, 2.57911e-13, 1.14858e-09, 0.28125, 10.9336, 98.3691, 119.471, + 122.866, 142.176, 228.197, 257.473, 168.816, 187.572, 185.407, 173.508, + 128.359, 98.2266, 1.78996e-10, 6.29864e-10, 1.1817e-09, 0, 0, 0, 0, 0, 0, + 5.39019e-11, 0.0664062, 2.85742, 73.9453, 94.8518, 100.687, 124.047, + 126.782, 127.841, 125.49, 120.944, 114.361, 73.6172, 52.5547, 35.0352, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3.2974e-13, 4.56214e-11, 0.0996094, 18.0625, 45.7656, + 73.1016, 143.159, 158.414, 171.997, 164.156, 149.156, 124.133, 17.2539, + 8.78516, 5.85547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.99714e-11, 6.15368e-10, + 0.464844, 13.3242, 29.8594, 83.7578, 88.2578, 90.0703, 86.3281, 78.0234, + 64.9609, 7.0161e-09, 4.42477e-09, 2.94985e-09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6.71801e-10, 0.0546875, 1.91406, 17.5312, 69.7578, 86.0391, 87.2578, + 102.062, 78.9297, 64.0508, 4.10171e-09, 7.74083e-09, 1.05629e-08, 0, 0, 0, + 0, 0) - val directRadiation: Vector[Double] = Vector(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0.03125, 0.34375, 0.171875, 0.117188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0.0136719, 3.625, 36.7266, 83.5, 278.094, 312.328, 333.422, 350.391, - 314.328, 266.484, 80.1172, 43.6875, 29.125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0.0234375, 1.3125, 83.7109, 146.523, 211.234, 448.781, 481.25, 499.109, - 505.359, 469.375, 420.406, 187.695, 126.977, 84.8438, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0.0234375, 1.3125, 83.7109, 146.523, 211.234, 448.781, 481.25, + private val directRadiation: Vector[Double] = Vector(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0.03125, 0.34375, 0.171875, 0.117188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0.0136719, 3.625, 36.7266, 83.5, 278.094, 312.328, 333.422, + 350.391, 314.328, 266.484, 80.1172, 43.6875, 29.125, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.0234375, 1.3125, 83.7109, 146.523, 211.234, 448.781, 481.25, 499.109, 505.359, 469.375, 420.406, 187.695, 126.977, 84.8438, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0.0234375, 0.898438, 12.6953, 110.062, 183.016, 262.141, - 527.344, 517.719, 426.094, 559.203, 326.797, 230.422, 43.25, 62.9062, - 41.9453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.210938, 6.19531, 23.0156, 219.234, - 278.797, 324.406, 536.797, 559.438, 600.734, 657.719, 622.281, 573.391, - 346.172, 279.25, 215.422, 9.6875, 4.92969, 3.28906, 0, 0, 0, 0, 0, 0, - 0.773438, 19.5391, 59.8203, 275.453, 342.297, 406.078, 630.578, 658.984, + 0, 0, 0, 0, 0, 0, 0.0234375, 1.3125, 83.7109, 146.523, 211.234, 448.781, + 481.25, 499.109, 505.359, 469.375, 420.406, 187.695, 126.977, 84.8438, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0.0234375, 0.898438, 12.6953, 110.062, 183.016, + 262.141, 527.344, 517.719, 426.094, 559.203, 326.797, 230.422, 43.25, + 62.9062, 41.9453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.210938, 6.19531, 23.0156, + 219.234, 278.797, 324.406, 536.797, 559.438, 600.734, 657.719, 622.281, + 573.391, 346.172, 279.25, 215.422, 9.6875, 4.92969, 3.28906, 0, 0, 0, 0, 0, + 0, 0.773438, 19.5391, 59.8203, 275.453, 342.297, 406.078, 630.578, 658.984, 674.172, 675.344, 641.859, 596.781, 376.188, 309.078, 243.672, 21.9141, 11.1562, 7.4375, 0, 0, 0, 0, 0, 0, 0, 0.0703125, 2.64062, 5.46875, 19.1094, 49.7969, 217.547, 295.953, 307.719, 316.812, 332.766, 294.828, 131.562, diff --git a/src/main/scala/edu/ie3/simona/sim/setup/ExtSimLoader.scala b/src/main/scala/edu/ie3/simona/sim/setup/ExtSimLoader.scala index 4275ab7d33..f876cc09eb 100644 --- a/src/main/scala/edu/ie3/simona/sim/setup/ExtSimLoader.scala +++ b/src/main/scala/edu/ie3/simona/sim/setup/ExtSimLoader.scala @@ -20,7 +20,7 @@ object ExtSimLoader extends LazyLogging { private val extSimPath = "input" + java.io.File.separator + "ext_sim" - def getStandardDirectory: File = { + private def getStandardDirectory: File = { val workingDir = new File(System.getProperty("user.dir")) if (!workingDir.isDirectory) throw new IOException("Error when accessing working directory.") diff --git a/src/main/scala/edu/ie3/simona/sim/setup/SetupHelper.scala b/src/main/scala/edu/ie3/simona/sim/setup/SetupHelper.scala index d5b21a99a7..1b2d2df7e7 100644 --- a/src/main/scala/edu/ie3/simona/sim/setup/SetupHelper.scala +++ b/src/main/scala/edu/ie3/simona/sim/setup/SetupHelper.scala @@ -143,7 +143,7 @@ trait SetupHelper extends LazyLogging { * @return * The actor reference of the sub grid to look for */ - def getActorRef( + private def getActorRef( subGridToActorRefMap: Map[Int, ActorRef[GridAgent.Request]], currentSubGrid: Int, queriedSubGrid: Int, @@ -167,7 +167,7 @@ trait SetupHelper extends LazyLogging { * @return * The reference system to use */ - def getRefSystem( + private def getRefSystem( configRefSystems: ConfigRefSystems, subGridContainer: SubGridContainer, ): RefSystem = { @@ -202,17 +202,13 @@ trait SetupHelper extends LazyLogging { /** Build the result file hierarchy based on the provided configuration file. * The provided type safe config must be able to be parsed as * [[SimonaConfig]], otherwise an exception is thrown + * * @param config * the configuration file - * @param createDirs - * if directories of the result file hierarchy should be created or not * @return * the resulting result file hierarchy */ - def buildResultFileHierarchy( - config: TypesafeConfig, - createDirs: Boolean = true, - ): ResultFileHierarchy = { + def buildResultFileHierarchy(config: TypesafeConfig): ResultFileHierarchy = { val simonaConfig = SimonaConfig(config) @@ -220,7 +216,7 @@ trait SetupHelper extends LazyLogging { val modelsToWrite = SetupHelper.allResultEntitiesToWrite(simonaConfig.simona.output) - val resultFileHierarchy = ResultFileHierarchy( + ResultFileHierarchy( simonaConfig.simona.output.base.dir, simonaConfig.simona.simulationName, ResultEntityPathConfig( @@ -230,15 +226,10 @@ trait SetupHelper extends LazyLogging { simonaConfig.simona.simulationName, ), ), + config = Some(config), addTimeStampToOutputDir = simonaConfig.simona.output.base.addTimestampToOutputDir, - createDirs = createDirs, ) - - // copy config data to output directory - ResultFileHierarchy.prepareDirectories(config, resultFileHierarchy) - - resultFileHierarchy } } @@ -252,7 +243,7 @@ object SetupHelper { * @return * Set of [[ResultEntity]] classes */ - def allResultEntitiesToWrite( + private def allResultEntitiesToWrite( outputConfig: SimonaConfig.Simona.Output ): Set[Class[_ <: ResultEntity]] = GridOutputConfigUtil( diff --git a/src/main/scala/edu/ie3/simona/sim/setup/SimonaSetup.scala b/src/main/scala/edu/ie3/simona/sim/setup/SimonaSetup.scala index 4a2d8abd42..4c452a4c3c 100644 --- a/src/main/scala/edu/ie3/simona/sim/setup/SimonaSetup.scala +++ b/src/main/scala/edu/ie3/simona/sim/setup/SimonaSetup.scala @@ -21,6 +21,8 @@ import org.apache.pekko.actor.typed.ActorRef import org.apache.pekko.actor.typed.scaladsl.ActorContext import org.apache.pekko.actor.{ActorRef => ClassicRef} +import java.nio.file.Path + /** Trait that can be used to set up a customized simona simulation by providing * implementations for all setup information required by a * [[edu.ie3.simona.sim.SimonaSim]]. Most of the time, using or extending @@ -40,7 +42,7 @@ trait SimonaSetup { /** Directory of the log output. */ - def logOutputDir: String + def logOutputDir: Path /** Creates the runtime event listener * 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 65d47863cf..55848d2ced 100644 --- a/src/main/scala/edu/ie3/simona/sim/setup/SimonaStandaloneSetup.scala +++ b/src/main/scala/edu/ie3/simona/sim/setup/SimonaStandaloneSetup.scala @@ -50,6 +50,7 @@ import org.apache.pekko.actor.typed.scaladsl.adapter.{ } import org.apache.pekko.actor.{ActorRef => ClassicRef} +import java.nio.file.Path import java.util.UUID import java.util.concurrent.LinkedBlockingQueue import scala.jdk.CollectionConverters._ @@ -68,7 +69,7 @@ class SimonaStandaloneSetup( override val args: Array[String], ) extends SimonaSetup { - override def logOutputDir: String = resultFileHierarchy.logOutputDir + override def logOutputDir: Path = resultFileHierarchy.logOutputDir override def gridAgents( context: ActorContext[_], diff --git a/src/main/scala/edu/ie3/simona/util/CollectionUtils.scala b/src/main/scala/edu/ie3/simona/util/CollectionUtils.scala index c5e2b45beb..6f737a0d1b 100644 --- a/src/main/scala/edu/ie3/simona/util/CollectionUtils.scala +++ b/src/main/scala/edu/ie3/simona/util/CollectionUtils.scala @@ -79,7 +79,7 @@ object CollectionUtils { * otherwise */ @tailrec - def isSorted[T](list: List[T])(implicit ord: Ordering[T]): Boolean = + private def isSorted[T](list: List[T])(implicit ord: Ordering[T]): Boolean = list match { case Nil => true // an empty list is sorted case _ :: Nil => true // a single-element list is sorted diff --git a/src/main/scala/edu/ie3/simona/util/ResultFileHierarchy.scala b/src/main/scala/edu/ie3/simona/util/ResultFileHierarchy.scala index 3c1028be2b..3dc207d350 100644 --- a/src/main/scala/edu/ie3/simona/util/ResultFileHierarchy.scala +++ b/src/main/scala/edu/ie3/simona/util/ResultFileHierarchy.scala @@ -7,7 +7,7 @@ package edu.ie3.simona.util import java.io.{BufferedWriter, File, FileWriter} -import java.nio.file.{Files, Paths} +import java.nio.file.{Files, Path, Paths} import java.text.SimpleDateFormat import com.typesafe.config.{ConfigRenderOptions, Config => TypesafeConfig} import com.typesafe.scalalogging.LazyLogging @@ -20,130 +20,135 @@ import edu.ie3.simona.exceptions.FileHierarchyException import edu.ie3.simona.io.result.ResultSinkType import edu.ie3.simona.io.result.ResultSinkType.Csv import edu.ie3.simona.logging.logback.LogbackConfiguration -import edu.ie3.simona.util.ResultFileHierarchy.ResultEntityPathConfig import edu.ie3.util.io.FileIOUtils import org.apache.commons.io.FilenameUtils._ import scala.jdk.OptionConverters.RichOptional -/** Represents the output directory where the results will be materialized. If - * new directories are added please remember to add them to the dirsToBeCreated - * Vector if they should be created. Otherwise, they will not be created! - * - * @version 0.1 - * @since 12.01.20 +/** Represents the output directory where the results will be materialized. */ -final case class ResultFileHierarchy( - private val outputDir: String, - private val simulationName: String, - private val resultEntityPathConfig: ResultEntityPathConfig, - private val configureLogger: String => Unit = LogbackConfiguration.default, - private val addTimeStampToOutputDir: Boolean = true, - private val createDirs: Boolean = false, -) extends LazyLogging { +final case class ResultFileHierarchy private ( + runOutputDir: Path, + rawOutputDataFilePaths: Map[Class[_ <: ResultEntity], Path], + configOutputDir: Path, + logOutputDir: Path, + tmpDir: Path, + resultSinkType: ResultSinkType, + resultEntitiesToConsider: Set[Class[_ <: ResultEntity]], +) - private val fileSeparator: String = File.separator - - val runStartTimeUTC: String = - new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new java.util.Date()) - - val baseOutputDir: String = buildBaseOutputDir - - val runOutputDir: String = buildRunOutputDir +object ResultFileHierarchy extends LazyLogging { - val configOutputDir: String = - runOutputDir.concat(fileSeparator).concat("configs") + /** Creates the [[ResultFileHierarchy]] and relevant directories + */ + def apply( + outputDir: String, + simulationName: String, + resultEntityPathConfig: ResultEntityPathConfig, + configureLogger: Path => Unit = LogbackConfiguration.default, + config: Option[TypesafeConfig] = None, + addTimeStampToOutputDir: Boolean = true, + ): ResultFileHierarchy = { + + val runStartTimeUTC = Option.when(addTimeStampToOutputDir)( + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new java.util.Date()) + ) - val rawOutputDataDir: String = - runOutputDir.concat(fileSeparator).concat("rawOutputData") + val baseOutputDir = buildBaseOutputDir(outputDir) - val logOutputDir: String = - runOutputDir.concat(fileSeparator).concat("log") + val runOutputDir = buildRunOutputDir( + baseOutputDir, + simulationName, + runStartTimeUTC, + ) - val resultSinkType: ResultSinkType = resultEntityPathConfig.resultSinkType + val configOutputDir = runOutputDir.resolve("configs") + val rawOutputDataDir = runOutputDir.resolve("rawOutputData") + val logOutputDir = runOutputDir.resolve("log") + val tmpDir = runOutputDir.resolve("tmp") - val resultEntitiesToConsider: Set[Class[_ <: ResultEntity]] = - resultEntityPathConfig.resultEntitiesToConsider + val resultSinkType: ResultSinkType = resultEntityPathConfig.resultSinkType - val rawOutputDataFilePaths: Map[Class[_ <: ResultEntity], String] = { - resultSinkType match { - case csv: Csv => - resultEntityPathConfig.resultEntitiesToConsider - .map(resultEntityClass => - ( - resultEntityClass, - ResultFileHierarchy.buildRawOutputFilePath( + val rawOutputDataFilePaths: Map[Class[_ <: ResultEntity], Path] = { + resultSinkType match { + case csv: Csv => + resultEntityPathConfig.resultEntitiesToConsider + .map(resultEntityClass => + ( resultEntityClass, - csv, - rawOutputDataDir, - fileSeparator, - ), + ResultFileHierarchy.buildRawOutputFilePath( + resultEntityClass, + csv, + rawOutputDataDir, + ), + ) ) - ) - .toMap - case _ => - Map.empty + .toMap + case _ => + Map.empty + } } - } - - val graphOutputDir: String = - runOutputDir.concat(fileSeparator).concat("graphs") - val kpiOutputDir: String = runOutputDir.concat(fileSeparator).concat("kpi") - - val tmpDir: String = runOutputDir.concat(fileSeparator).concat("tmp") + val dirsToBeCreated = Seq( + baseOutputDir, + runOutputDir, + configOutputDir, + rawOutputDataDir, + logOutputDir, + tmpDir, + ) - private val dirsToBeCreated: Vector[String] = Vector( - baseOutputDir, - runOutputDir, - configOutputDir, - rawOutputDataDir, - graphOutputDir, - kpiOutputDir, - tmpDir, - logOutputDir, - ) + val resultFileHierarchy = ResultFileHierarchy( + runOutputDir, + rawOutputDataFilePaths, + configOutputDir, + logOutputDir, + tmpDir, + resultSinkType, + resultEntityPathConfig.resultEntitiesToConsider, + ) + prepareDirectories( + baseOutputDir, + dirsToBeCreated, + resultFileHierarchy, + config, + ) - // needs to be the latest call because otherwise the values are null as they are not initialized yet - if (createDirs) - ResultFileHierarchy.createOutputDirectories(this) + // needs to be done after dir creation + configureLogger(logOutputDir) - // needs to be done after dir creation - configureLogger(logOutputDir) + resultFileHierarchy + } - /** Builds the base output directory string + /** Builds the base output directory * * @return - * the filepath string to the directory + * the filepath of the directory */ - private def buildBaseOutputDir: String = { - + private def buildBaseOutputDir( + outputDir: String + ): Path = { // clean file string if necessary val cleanedBaseOutputDir = { val normalizedOutputDir = normalize(outputDir) - (fileSeparator + "$").r.replaceAllIn(normalizedOutputDir, "") + (File.separator + "$").r.replaceAllIn(normalizedOutputDir, "") } - // create base output dir if non-existent - Paths.get(cleanedBaseOutputDir).toFile.getAbsolutePath + Paths.get(cleanedBaseOutputDir) } - /** Builds the output directory string for this specific run - * - * @return + /** Builds the output directory for this specific run */ - private def buildRunOutputDir: String = { + private def buildRunOutputDir( + baseOutputDir: Path, + simulationName: String, + runStartTimeUTC: Option[String], + ): Path = { val optionalSuffix = - if (addTimeStampToOutputDir) s"_$runStartTimeUTC" else "" - baseOutputDir - .concat(fileSeparator) - .concat(simulationName) - .concat(optionalSuffix) - } + runStartTimeUTC.map(pattern => s"_$pattern").getOrElse("") -} - -object ResultFileHierarchy extends LazyLogging { + baseOutputDir.resolve(s"$simulationName$optionalSuffix") + } /** @param resultEntitiesToConsider * [[ResultEntity]] s to consider to be written out @@ -161,8 +166,6 @@ object ResultFileHierarchy extends LazyLogging { * the csv sink type parameters * @param rawOutputDataDir * the directory of the raw output data - * @param fileSeparator - * the file separator to be used * @return * an absolute file path as string for the provided model class incl. file * name + extension @@ -170,9 +173,8 @@ object ResultFileHierarchy extends LazyLogging { private def buildRawOutputFilePath( modelClass: Class[_ <: ResultEntity], csvSink: Csv, - rawOutputDataDir: String, - fileSeparator: String, - ): String = { + rawOutputDataDir: Path, + ): Path = { val fileEnding = if (csvSink.fileFormat.startsWith(".")) csvSink.fileFormat @@ -192,64 +194,72 @@ object ResultFileHierarchy extends LazyLogging { ) } - rawOutputDataDir - .concat(fileSeparator) - .concat(filename.toString) - .concat(fileEnding) + rawOutputDataDir.resolve(s"${filename.toString}$fileEnding") } /** Prepares the output directories to be ready to hold the output data. This * includes creating the run directory with all subsequent directories as * well as copying the simulation configuration to the output dir * - * @param config + * @param baseOutputDir + * The base output directory + * @param dirsToBeCreated + * The directories that need to be created + * @param maybeConfig * the config of the current simulation * @param resultFileHierarchy * the output file hierarchy of the current simulation */ - def prepareDirectories( - config: TypesafeConfig, + private def prepareDirectories( + baseOutputDir: Path, + dirsToBeCreated: Seq[Path], resultFileHierarchy: ResultFileHierarchy, + maybeConfig: Option[TypesafeConfig], ): Unit = { // create output directories if they are not present yet if (!runOutputDirExists(resultFileHierarchy)) - ResultFileHierarchy.createOutputDirectories(resultFileHierarchy) + createOutputDirectories( + baseOutputDir, + dirsToBeCreated, + resultFileHierarchy, + ) - logger.info( - "Processing configs for simulation: {}.", - config.getString("simona.simulationName"), - ) + maybeConfig.foreach { config => + logger.info( + "Processing configs for simulation: {}.", + config.getString("simona.simulationName"), + ) - val outFile = - Paths.get(resultFileHierarchy.configOutputDir, "vn_simona.conf").toFile - val bw = new BufferedWriter(new FileWriter(outFile)) - bw.write( - config - .root() - .render( - ConfigRenderOptions - .defaults() - .setOriginComments(false) - .setComments(false) - ) - ) - bw.close() - logger.info("Config '{}' written to '{}'.", outFile.getPath, outFile) + val outFile = + resultFileHierarchy.configOutputDir.resolve("vn_simona.conf").toFile + val bw = new BufferedWriter(new FileWriter(outFile)) + bw.write( + config + .root() + .render( + ConfigRenderOptions + .defaults() + .setOriginComments(false) + .setComments(false) + ) + ) + bw.close() + logger.info("Config '{}' written to '{}'.", outFile.getPath, outFile) + } } /** Checks if the directory of the current run already exists * - * @param outputFileHierarchy + * @param fileHierarchy * the [[ResultFileHierarchy]] that holds information on the run directory * path * @return * true if it exists, false if not */ - def runOutputDirExists(outputFileHierarchy: ResultFileHierarchy): Boolean = { - new File(outputFileHierarchy.runOutputDir).exists() && new File( - outputFileHierarchy.runOutputDir - ).listFiles().length > 0 + def runOutputDirExists(fileHierarchy: ResultFileHierarchy): Boolean = { + val outputDir = fileHierarchy.runOutputDir.toFile + outputDir.exists() && outputDir.listFiles().length > 0 } /** Creates all output directories of the provided [[ResultFileHierarchy]] @@ -257,11 +267,12 @@ object ResultFileHierarchy extends LazyLogging { * @param outputFileHierarchy * the [[ResultFileHierarchy]] the directories should be created for */ - def createOutputDirectories( - outputFileHierarchy: ResultFileHierarchy + private def createOutputDirectories( + baseOutputDir: Path, + dirsToBeCreated: Seq[Path], + outputFileHierarchy: ResultFileHierarchy, ): Unit = { // try to create base output dir - val baseOutputDir = Paths.get(outputFileHierarchy.baseOutputDir) // / check for existence of the provided baseOutputDir, if not create it if (Files.exists(baseOutputDir) && baseOutputDir.toFile.isFile) { throw new FileHierarchyException( @@ -270,17 +281,17 @@ object ResultFileHierarchy extends LazyLogging { } // check if there is data inside the runOutputDir taking into account the provided FileHandling - val runOutputDir = new File(outputFileHierarchy.runOutputDir) + val runOutputDir = outputFileHierarchy.runOutputDir.toFile if (runOutputDir.exists() && runOutputDir.listFiles().length > 0) { // files inside the runOutputDir -> fail throw new FileHierarchyException( - s"The runOutputDir ${outputFileHierarchy.runOutputDir} already exists and is NOT empty! " + + s"The runOutputDir ${outputFileHierarchy.runOutputDir.toString} already exists and is NOT empty! " + s"Please either delete or empty the directory." ) } // create the output directories for the specific run - outputFileHierarchy.dirsToBeCreated.foreach(createDir) + dirsToBeCreated.foreach(createDir) } @@ -289,8 +300,8 @@ object ResultFileHierarchy extends LazyLogging { * @param dir * the full path where the directory should be created (incl. it's name) */ - private def createDir(dir: String): Unit = { - val dirFile = new File(dir) + private def createDir(dir: Path): Unit = { + val dirFile = dir.toFile if (!dirFile.mkdirs() && !dirFile.exists()) throw new FileHierarchyException( "The output directory path " + dir diff --git a/src/main/scala/edu/ie3/util/scala/quantities/ApparentPower.scala b/src/main/scala/edu/ie3/util/scala/quantities/ApparentPower.scala new file mode 100644 index 0000000000..2fe765ce9b --- /dev/null +++ b/src/main/scala/edu/ie3/util/scala/quantities/ApparentPower.scala @@ -0,0 +1,108 @@ +/* + * © 2022. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ + +package edu.ie3.util.scala.quantities + +import squants._ +import squants.energy._ +import squants.time.Time + +import scala.math.{acos, sin} +import scala.util.Try + +/** Class that represents an apparent power. An apparent power is the absolute + * value of the complex power (|S|). + * @param value + * power value + * @param unit + * of the power + */ +final class ApparentPower private ( + val value: Double, + val unit: ApparentPowerUnit, +) extends Quantity[ApparentPower] { + + def dimension: ApparentPower.type = ApparentPower + + def toMillivoltamperes: Double = to(Millivoltamperes) + def toVoltamperes: Double = to(Voltamperes) + def toKilovoltamperes: Double = to(Kilovoltamperes) + def toMegavoltamperes: Double = to(Megavoltamperes) + def toGigavoltamperes: Double = to(Gigavoltamperes) + + /** Method to convert this apparent power into a [[Power]] using a given + * cosPhi. + * @param cosPhi + * cosine of the corresponding angle + * @return + * the resulting active power + */ + def toActivePower(cosPhi: Double): Power = Watts(toVoltamperes * cosPhi) + + /** Method to convert this apparent power into a [[ReactivePower]] using a + * given cosPhi. + * @param cosPhi + * cosine of the corresponding angle + * @return + * the resulting reactive power + */ + def toReactivePower(cosPhi: Double): ReactivePower = { + // Q = |S| * sin(φ), φ = acos(cosPhi) + Vars(toVoltamperes * sin(acos(cosPhi))) + } +} + +object ApparentPower extends Dimension[ApparentPower] { + private[quantities] def apply[A](n: A, unit: ApparentPowerUnit)(implicit + num: Numeric[A] + ) = new ApparentPower(num.toDouble(n), unit) + def apply(energy: Energy, time: Time): ApparentPower = + apply(energy.toWattHours / time.toHours, Voltamperes) + def apply(value: Any): Try[ApparentPower] = parse(value) + + def name = "Power" + def primaryUnit: Voltamperes.type = Voltamperes + def siUnit: Voltamperes.type = Voltamperes + def units: Set[UnitOfMeasure[ApparentPower]] = + Set( + Voltamperes, + Millivoltamperes, + Kilovoltamperes, + Megavoltamperes, + Gigavoltamperes, + ) +} + +trait ApparentPowerUnit + extends UnitOfMeasure[ApparentPower] + with UnitConverter { + def apply[A](n: A)(implicit num: Numeric[A]): ApparentPower = + ApparentPower(n, this) +} + +object Millivoltamperes extends ApparentPowerUnit with SiUnit { + val conversionFactor: Double = MetricSystem.Milli + val symbol = "mVA" +} + +object Voltamperes extends ApparentPowerUnit with PrimaryUnit with SiUnit { + val symbol = "VA" +} + +object Kilovoltamperes extends ApparentPowerUnit with SiUnit { + val conversionFactor: Double = MetricSystem.Kilo + val symbol = "kVA" +} + +object Megavoltamperes extends ApparentPowerUnit with SiUnit { + val conversionFactor: Double = MetricSystem.Mega + val symbol = "MVA" +} + +object Gigavoltamperes extends ApparentPowerUnit with SiUnit { + val conversionFactor: Double = MetricSystem.Giga + val symbol = "GVA" +} diff --git a/src/test/scala/edu/ie3/simona/agent/em/EmAgentSpec.scala b/src/test/scala/edu/ie3/simona/agent/em/EmAgentSpec.scala index fb550a9a77..c0b8f93489 100644 --- a/src/test/scala/edu/ie3/simona/agent/em/EmAgentSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/em/EmAgentSpec.scala @@ -7,7 +7,7 @@ package edu.ie3.simona.agent.em import edu.ie3.datamodel.models.result.system.EmResult -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.config.SimonaConfig.EmRuntimeConfig import edu.ie3.simona.event.ResultEvent import edu.ie3.simona.event.ResultEvent.{ @@ -159,7 +159,7 @@ class EmAgentSpec pvAgent.expectMessage(IssueNoControl(0)) emAgent ! FlexResult( modelUuid = pvInput.getUuid, - result = ApparentPower(Kilowatts(-5d), Kilovars(-0.5d)), + result = ComplexPower(Kilowatts(-5d), Kilovars(-0.5d)), ) emAgent ! FlexCompletion( modelUuid = pvInput.getUuid, @@ -174,7 +174,7 @@ class EmAgentSpec } emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(5d), Kilovars(0.1d)), + result = ComplexPower(Kilowatts(5d), Kilovars(0.1d)), ) emAgent ! FlexCompletion( modelUuid = evcsInput.getUuid, @@ -220,7 +220,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(0d), Kilovars(0d)), + result = ComplexPower(Kilowatts(0d), Kilovars(0d)), ) emAgent ! FlexCompletion(modelUuid = evcsInput.getUuid) @@ -307,7 +307,7 @@ class EmAgentSpec // send completions emAgent ! FlexResult( modelUuid = pvInput.getUuid, - result = ApparentPower(Kilowatts(-5d), Kilovars(-0.5d)), + result = ComplexPower(Kilowatts(-5d), Kilovars(-0.5d)), ) emAgent ! FlexCompletion( modelUuid = pvInput.getUuid, @@ -316,7 +316,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(5d), Kilovars(0.1d)), + result = ComplexPower(Kilowatts(5d), Kilovars(0.1d)), ) scheduler.expectNoMessage() @@ -361,7 +361,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = pvInput.getUuid, - result = ApparentPower(Kilowatts(-3d), Kilovars(-0.06d)), + result = ComplexPower(Kilowatts(-3d), Kilovars(-0.06d)), ) emAgent ! FlexCompletion( @@ -378,7 +378,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(3d), Kilovars(0.06d)), + result = ComplexPower(Kilowatts(3d), Kilovars(0.06d)), ) emAgent ! FlexCompletion( modelUuid = evcsInput.getUuid, @@ -470,7 +470,7 @@ class EmAgentSpec // send completions emAgent ! FlexResult( modelUuid = pvInput.getUuid, - result = ApparentPower(Kilowatts(-5d), Kilovars(-0.5d)), + result = ComplexPower(Kilowatts(-5d), Kilovars(-0.5d)), ) emAgent ! FlexCompletion( modelUuid = pvInput.getUuid, @@ -479,7 +479,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(5d), Kilovars(0.1d)), + result = ComplexPower(Kilowatts(5d), Kilovars(0.1d)), ) scheduler.expectNoMessage() @@ -534,7 +534,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = pvInput.getUuid, - result = ApparentPower(Kilowatts(-3d), Kilovars(-0.06d)), + result = ComplexPower(Kilowatts(-3d), Kilovars(-0.06d)), ) emAgent ! FlexCompletion( modelUuid = pvInput.getUuid @@ -549,7 +549,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(3d), Kilovars(0.06d)), + result = ComplexPower(Kilowatts(3d), Kilovars(0.06d)), ) emAgent ! FlexCompletion( modelUuid = evcsInput.getUuid // revoking tick 600 @@ -696,7 +696,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = pvInput.getUuid, - result = ApparentPower(Kilowatts(-5), Kilovars(-0.5)), + result = ComplexPower(Kilowatts(-5), Kilovars(-0.5)), ) emAgent ! FlexCompletion( modelUuid = pvInput.getUuid, @@ -712,7 +712,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(11), Kilovars(1.1)), + result = ComplexPower(Kilowatts(11), Kilovars(1.1)), ) emAgent ! FlexCompletion( modelUuid = evcsInput.getUuid, @@ -762,7 +762,7 @@ class EmAgentSpec emAgent ! FlexResult( modelUuid = evcsInput.getUuid, - result = ApparentPower(Kilowatts(5.0), Kilovars(0.5)), + result = ComplexPower(Kilowatts(5.0), Kilovars(0.5)), ) emAgent ! FlexCompletion( modelUuid = evcsInput.getUuid, diff --git a/src/test/scala/edu/ie3/simona/agent/grid/GridAgentDataHelperSpec.scala b/src/test/scala/edu/ie3/simona/agent/grid/GridAgentDataHelperSpec.scala index 3e2170cbdc..df1251c266 100644 --- a/src/test/scala/edu/ie3/simona/agent/grid/GridAgentDataHelperSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/grid/GridAgentDataHelperSpec.scala @@ -70,15 +70,15 @@ class GridAgentDataHelperSpec extends UnitSpec with SubGridGateMokka { UUID.fromString("3bcda4b0-2d1a-44f5-95c1-a63ce1d40bed"), 3000, ) - val superiorGridGates = Vector(superiorSubGridGate1) - val centerGridGates = Vector( + val superiorGridGates: Vector[SubGridGate] = Vector(superiorSubGridGate1) + val centerGridGates: Vector[SubGridGate] = Vector( superiorSubGridGate1, superiorSubGridGate2, centerSubGridGate1, centerSubGridGate2, centerSubGridGate3, ) - val inferiorGridGates = Vector(centerSubGridGate1) + val inferiorGridGates: Vector[SubGridGate] = Vector(centerSubGridGate1) val superiorGridId = 1 val superiorGridAgent: TestGridData = diff --git a/src/test/scala/edu/ie3/simona/agent/participant/EvcsAgentModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/EvcsAgentModelCalculationSpec.scala index 9b1502bce4..4d3c444156 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/EvcsAgentModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/EvcsAgentModelCalculationSpec.scala @@ -20,7 +20,7 @@ import edu.ie3.simona.agent.grid.GridAgentMessages.{ AssetPowerUnchangedMessage, } import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorExtEvDataService import edu.ie3.simona.agent.participant.evcs.EvcsAgent import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData @@ -122,7 +122,7 @@ class EvcsAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ EvcsInput, EvcsRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = evcsInputModel, modelConfig = modelConfig, @@ -186,7 +186,7 @@ class EvcsAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ EvcsInput, EvcsRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = evcsInputModel, modelConfig = modelConfig, @@ -315,7 +315,7 @@ class EvcsAgentModelCalculationSpec SortedMap(0L -> Each(1.0)), ) resultValueStore shouldBe ValueStore(resolution) - requestValueStore shouldBe ValueStore[ApparentPower](resolution) + requestValueStore shouldBe ValueStore[ComplexPower](resolution) /* Additional information */ awaitRegistrationResponsesFrom shouldBe Iterable(evService.ref) @@ -394,11 +394,11 @@ class EvcsAgentModelCalculationSpec inside(evcsAgent.stateData) { case baseStateData: ParticipantModelBaseStateData[_, _, _, _] => baseStateData.requestValueStore shouldBe ValueStore[ - ApparentPower + ComplexPower ]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ) @@ -1172,7 +1172,7 @@ class EvcsAgentModelCalculationSpec resultValueStore shouldBe ValueStore( resolution ) - requestValueStore shouldBe ValueStore[ApparentPower]( + requestValueStore shouldBe ValueStore[ComplexPower]( resolution ) case unrecognized => @@ -1355,9 +1355,9 @@ class EvcsAgentModelCalculationSpec maxPower, ) => modelUuid shouldBe evcsInputModelQv.getUuid - referencePower shouldBe ev900.sRatedAc - minPower shouldBe ev900.sRatedAc // battery is empty - maxPower shouldBe ev900.sRatedAc + referencePower shouldBe ev900.pRatedAc + minPower shouldBe ev900.pRatedAc // battery is empty + maxPower shouldBe ev900.pRatedAc } resultListener.expectMsgPF() { case FlexOptionsResultEvent(flexResult) => @@ -1472,9 +1472,9 @@ class EvcsAgentModelCalculationSpec maxPower, ) => modelUuid shouldBe evcsInputModelQv.getUuid - referencePower shouldBe ev4500.sRatedAc - minPower shouldBe ev900.sRatedAc // battery is empty - maxPower shouldBe ev4500.sRatedAc + referencePower shouldBe ev4500.pRatedAc + minPower shouldBe ev900.pRatedAc // battery is empty + maxPower shouldBe ev4500.pRatedAc } resultListener.expectMsgPF() { case FlexOptionsResultEvent(flexResult) => @@ -1522,9 +1522,9 @@ class EvcsAgentModelCalculationSpec maxPower, ) => modelUuid shouldBe evcsInputModelQv.getUuid - referencePower shouldBe ev4500.sRatedAc + referencePower shouldBe ev4500.pRatedAc minPower shouldBe Kilowatts(0.0) // battery is exactly at margin - maxPower shouldBe ev4500.sRatedAc + maxPower shouldBe ev4500.pRatedAc } resultListener.expectMsgPF() { case FlexOptionsResultEvent(flexResult) => @@ -1609,7 +1609,9 @@ class EvcsAgentModelCalculationSpec ) => modelUuid shouldBe evcsInputModelQv.getUuid refPower shouldBe combinedChargingPowerSq - minPower shouldBe ev4500.sRatedAc * -1 // battery of earlier ev is above lowest soc now + + // battery of earlier ev is above lowest soc now + minPower shouldBe ev4500.pRatedAc * -1 maxPower shouldBe combinedChargingPowerSq } @@ -1759,7 +1761,7 @@ class EvcsAgentModelCalculationSpec ) => modelUuid shouldBe evcsInputModelQv.getUuid referencePower shouldBe combinedChargingPowerSq - minPower shouldBe ev4500.sRatedAc * -1 // battery of ev11700 is below lowest soc now + minPower shouldBe ev4500.pRatedAc * -1 // battery of ev11700 is below lowest soc now maxPower shouldBe combinedChargingPowerSq } @@ -1955,9 +1957,9 @@ class EvcsAgentModelCalculationSpec maxPower, ) => modelUuid shouldBe evcsInputModelQv.getUuid - referencePower shouldBe ev4500.sRatedAc + referencePower shouldBe ev4500.pRatedAc minPower shouldBe Kilowatts(0d) - maxPower shouldBe ev4500.sRatedAc + maxPower shouldBe ev4500.pRatedAc } resultListener.expectMsgPF() { case FlexOptionsResultEvent(flexResult) => @@ -2016,7 +2018,7 @@ class EvcsAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ EvcsInput, EvcsRuntimeConfig, - ApparentPower, + ComplexPower, ]( evcsInputModel, modelConfig = modelConfig, diff --git a/src/test/scala/edu/ie3/simona/agent/participant/FixedFeedInAgentModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/FixedFeedInAgentModelCalculationSpec.scala index bdaac6d366..c8bcdd13b5 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/FixedFeedInAgentModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/FixedFeedInAgentModelCalculationSpec.scala @@ -15,7 +15,7 @@ import edu.ie3.simona.agent.grid.GridAgentMessages.{ AssetPowerUnchangedMessage, } import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.fixedfeedin.FixedFeedInAgent import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.{ @@ -105,7 +105,7 @@ class FixedFeedInAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ FixedFeedInInput, FixedFeedInRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = voltageSensitiveInput, modelConfig = modelConfig, @@ -221,7 +221,7 @@ class FixedFeedInAgentModelCalculationSpec SortedMap(0L -> Each(1.0)), ) resultValueStore shouldBe ValueStore(resolution) - requestValueStore shouldBe ValueStore[ApparentPower]( + requestValueStore shouldBe ValueStore[ComplexPower]( resolution ) case _ => @@ -270,11 +270,11 @@ class FixedFeedInAgentModelCalculationSpec inside(fixedFeedAgent.stateData) { case baseStateData: ParticipantModelBaseStateData[_, _, _, _] => baseStateData.requestValueStore shouldBe ValueStore[ - ApparentPower + ComplexPower ]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0d), Megavars(0d), ) @@ -324,7 +324,7 @@ class FixedFeedInAgentModelCalculationSpec baseStateData.resultValueStore.last(0L) match { case Some((tick, entry)) => tick shouldBe 0L - inside(entry) { case ApparentPower(p, q) => + inside(entry) { case ComplexPower(p, q) => p should approximate(Megawatts(-268.603e-6)) q should approximate(Megavars(0.0)) } diff --git a/src/test/scala/edu/ie3/simona/agent/participant/HpAgentModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/HpAgentModelCalculationSpec.scala index afed43b474..9277c58861 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/HpAgentModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/HpAgentModelCalculationSpec.scala @@ -14,7 +14,7 @@ import edu.ie3.simona.agent.grid.GridAgentMessages.{ AssetPowerUnchangedMessage, } import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPowerAndHeat +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPowerAndHeat import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorWeatherService import edu.ie3.simona.agent.participant.hp.HpAgent import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData @@ -116,7 +116,7 @@ class HpAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ HpInput, HpRuntimeConfig, - ApparentPowerAndHeat, + ComplexPowerAndHeat, ]( inputModel = hpInput, modelConfig = modelConfig, @@ -181,7 +181,7 @@ class HpAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ HpInput, HpRuntimeConfig, - ApparentPowerAndHeat, + ComplexPowerAndHeat, ]( inputModel = hpInput, thermalGrid = defaultThermalGrid, @@ -313,7 +313,7 @@ class HpAgentModelCalculationSpec SortedMap(0L -> Each(1.0)), ) resultValueStore shouldBe ValueStore(resolution) - requestValueStore shouldBe ValueStore[ApparentPowerAndHeat]( + requestValueStore shouldBe ValueStore[ComplexPowerAndHeat]( resolution ) @@ -398,11 +398,11 @@ class HpAgentModelCalculationSpec inside(hpAgent.stateData) { case modelBaseStateData: ParticipantModelBaseStateData[_, _, _, _] => modelBaseStateData.requestValueStore shouldBe ValueStore[ - ApparentPowerAndHeat + ComplexPowerAndHeat ]( resolution, SortedMap( - 0L -> ApparentPowerAndHeat( + 0L -> ComplexPowerAndHeat( Megawatts(0.0), Megavars(0.0), Megawatts(0.0), @@ -534,7 +534,7 @@ class HpAgentModelCalculationSpec 0L, fail("Expected a simulation result for tick 900."), ) match { - case ApparentPowerAndHeat(p, q, qDot) => + case ComplexPowerAndHeat(p, q, qDot) => p should approximate(Megawatts(0d)) q should approximate(Megavars(0d)) qDot should approximate(Megawatts(0d)) @@ -662,7 +662,7 @@ class HpAgentModelCalculationSpec 0L, fail("Expected a simulation result for tick 0."), ) match { - case ApparentPowerAndHeat(p, q, qDot) => + case ComplexPowerAndHeat(p, q, qDot) => p should approximate(Megawatts(0d)) q should approximate(Megavars(0d)) qDot should approximate(Megawatts(0d)) diff --git a/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentFixedModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentFixedModelCalculationSpec.scala index a93d492e4b..ddb97cd27b 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentFixedModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentFixedModelCalculationSpec.scala @@ -15,7 +15,7 @@ import edu.ie3.simona.agent.grid.GridAgentMessages.{ AssetPowerUnchangedMessage, } import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.load.LoadAgent.FixedLoadAgent import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.{ @@ -99,7 +99,7 @@ class LoadAgentFixedModelCalculationSpec val initStateData = ParticipantInitializeStateData[ LoadInput, LoadRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = voltageSensitiveInput, modelConfig = modelConfig, @@ -215,7 +215,7 @@ class LoadAgentFixedModelCalculationSpec SortedMap(0L -> Each(1.0)), ) resultValueStore shouldBe ValueStore(resolution) - requestValueStore shouldBe ValueStore[ApparentPower]( + requestValueStore shouldBe ValueStore[ComplexPower]( resolution ) case _ => @@ -264,11 +264,11 @@ class LoadAgentFixedModelCalculationSpec inside(loadAgent.stateData) { case baseStateData: ParticipantModelBaseStateData[_, _, _, _] => baseStateData.requestValueStore shouldBe ValueStore[ - ApparentPower + ComplexPower ]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0d), Megavars(0d), ) @@ -318,7 +318,7 @@ class LoadAgentFixedModelCalculationSpec baseStateData.resultValueStore.last(0L) match { case Some((tick, entry)) => tick shouldBe 0L - inside(entry) { case ApparentPower(p, q) => + inside(entry) { case ComplexPower(p, q) => p should approximate(Megawatts(268.603e-6)) q should approximate(Megavars(0.0)) } diff --git a/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentProfileModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentProfileModelCalculationSpec.scala index 2e9a180fea..6615308552 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentProfileModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/LoadAgentProfileModelCalculationSpec.scala @@ -15,7 +15,7 @@ import edu.ie3.simona.agent.grid.GridAgentMessages.{ AssetPowerUnchangedMessage, } import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.load.LoadAgent.ProfileLoadAgent import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.{ @@ -99,7 +99,7 @@ class LoadAgentProfileModelCalculationSpec val initStateData = ParticipantInitializeStateData[ LoadInput, LoadRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = voltageSensitiveInput, modelConfig = modelConfig, @@ -215,7 +215,7 @@ class LoadAgentProfileModelCalculationSpec SortedMap(0L -> Each(1.0)), ) resultValueStore shouldBe ValueStore(resolution) - requestValueStore shouldBe ValueStore[ApparentPower]( + requestValueStore shouldBe ValueStore[ComplexPower]( resolution ) case _ => @@ -264,11 +264,11 @@ class LoadAgentProfileModelCalculationSpec inside(loadAgent.stateData) { case baseStateData: ParticipantModelBaseStateData[_, _, _, _] => baseStateData.requestValueStore shouldBe ValueStore[ - ApparentPower + ComplexPower ]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0d), Megavars(0d), ) @@ -318,7 +318,7 @@ class LoadAgentProfileModelCalculationSpec baseStateData.resultValueStore.last(0L) match { case Some((tick, entry)) => tick shouldBe 0L - inside(entry) { case ApparentPower(p, q) => + inside(entry) { case ComplexPower(p, q) => p should approximate(Megawatts(84.000938e-6)) q should approximate(Megavars(0.0)) } diff --git a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgent2ListenerSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgent2ListenerSpec.scala index b061ae512d..dcfa3b2cb1 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgent2ListenerSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgent2ListenerSpec.scala @@ -17,7 +17,7 @@ import edu.ie3.simona.agent.participant.ParticipantAgent.{ FinishParticipantSimulation, RequestAssetPowerMessage, } -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.ParticipantInitializeStateData import edu.ie3.simona.config.SimonaConfig import edu.ie3.simona.config.SimonaConfig.BaseRuntimeConfig @@ -87,12 +87,12 @@ class ParticipantAgent2ListenerSpec val initStateData: NotifierConfig => ParticipantInitializeStateData[ SystemParticipantInput, BaseRuntimeConfig, - ApparentPower, + ComplexPower, ] = outputConfig => ParticipantInitializeStateData[ SystemParticipantInput, BaseRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = mockInputModel, modelConfig = mock[BaseRuntimeConfig], diff --git a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentExternalSourceSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentExternalSourceSpec.scala index 27823d38df..041052ee5f 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentExternalSourceSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentExternalSourceSpec.scala @@ -23,8 +23,8 @@ import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessag import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ ActivePower, ActivePowerAndHeat, - ApparentPower, - ApparentPowerAndHeat, + ComplexPower, + ComplexPowerAndHeat, } import edu.ie3.simona.agent.participant.statedata.BaseStateData.FromOutsideBaseStateData import edu.ie3.simona.agent.participant.statedata.DataCollectionStateData @@ -97,7 +97,7 @@ class ParticipantAgentExternalSourceSpec private val mockModel = mock[SystemParticipant[ CalcRelevantData.FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ]] when(mockModel.getUuid).thenReturn(testUUID) @@ -128,7 +128,7 @@ class ParticipantAgentExternalSourceSpec val initStateData = ParticipantInitializeStateData[ SystemParticipantInput, BaseRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = mockInputModel, modelConfig = mock[BaseRuntimeConfig], @@ -216,9 +216,9 @@ class ParticipantAgentExternalSourceSpec mockAgent.stateData match { case baseStateData: FromOutsideBaseStateData[SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower] => + ], ComplexPower] => /* Only check the awaited next data ticks, as the rest has yet been checked */ baseStateData.foreseenDataTicks shouldBe Map( primaryServiceProxy.ref -> Some(4711L) @@ -279,10 +279,10 @@ class ParticipantAgentExternalSourceSpec _, requestValueStore, ) => - requestValueStore shouldBe ValueStore[ApparentPower]( + requestValueStore shouldBe ValueStore[ComplexPower]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ) @@ -322,7 +322,7 @@ class ParticipantAgentExternalSourceSpec ProvidePrimaryDataMessage( 900L, primaryServiceProxy.ref, - ApparentPower( + ComplexPower( Kilowatts(0.0), Kilovars(900.0), ), @@ -336,9 +336,9 @@ class ParticipantAgentExternalSourceSpec case DataCollectionStateData( baseStateData: FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower], + ], ComplexPower], expectedSenders, isYetTriggered, ) => @@ -350,7 +350,7 @@ class ParticipantAgentExternalSourceSpec /* The yet sent data is also registered */ expectedSenders shouldBe Map( primaryServiceProxy.ref -> Some( - ApparentPower( + ComplexPower( Kilowatts(0.0), Kilovars(900.0), ) @@ -376,14 +376,14 @@ class ParticipantAgentExternalSourceSpec mockAgent.stateData match { case baseStateData: FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower] => + ], ComplexPower] => /* The new data is apparent in the result value store */ baseStateData.resultValueStore match { case ValueStore(_, store) => store shouldBe Map( - 900L -> ApparentPower( + 900L -> ComplexPower( Kilowatts(0.0), Kilovars(900.0), ) @@ -426,9 +426,9 @@ class ParticipantAgentExternalSourceSpec case DataCollectionStateData( baseStateData: FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower], + ], ComplexPower], expectedSenders, isYetTriggered, ) => @@ -454,7 +454,7 @@ class ParticipantAgentExternalSourceSpec ProvidePrimaryDataMessage( 900L, primaryServiceProxy.ref, - ApparentPower( + ComplexPower( Kilowatts(0.0), Kilovars(900.0), ), @@ -470,14 +470,14 @@ class ParticipantAgentExternalSourceSpec mockAgent.stateData match { case baseStateData: FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower] => + ], ComplexPower] => /* The new data is apparent in the result value store */ baseStateData.resultValueStore match { case ValueStore(_, store) => store shouldBe Map( - 900L -> ApparentPower( + 900L -> ComplexPower( Kilowatts(0.0), Kilovars(900.0), ) @@ -527,7 +527,7 @@ class ParticipantAgentExternalSourceSpec ProvidePrimaryDataMessage( 900L, primaryServiceProxy.ref, - ApparentPower( + ComplexPower( Kilowatts(0.0), Kilovars(900.0), ), @@ -554,13 +554,13 @@ class ParticipantAgentExternalSourceSpec "correctly determine the reactive power function when trivial reactive power is requested" in { val baseStateData: FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData.FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower] = FromOutsideBaseStateData[SystemParticipant[ + ], ComplexPower] = FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData.FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower]( + ], ComplexPower]( mockModel, defaultSimulationStart, defaultSimulationEnd, @@ -585,13 +585,13 @@ class ParticipantAgentExternalSourceSpec "correctly determine the reactive power function from model when requested" in { val baseStateData: FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData.FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower] = FromOutsideBaseStateData[SystemParticipant[ + ], ComplexPower] = FromOutsideBaseStateData[SystemParticipant[ CalcRelevantData.FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, - ], ApparentPower]( + ], ComplexPower]( mockModel, defaultSimulationStart, defaultSimulationEnd, @@ -635,7 +635,7 @@ class ParticipantAgentExternalSourceSpec ProvidePrimaryDataMessage( 900L, primaryServiceProxy.ref, - ApparentPower( + ComplexPower( Kilowatts(100.0), Kilovars(33.0), ), @@ -651,7 +651,7 @@ class ParticipantAgentExternalSourceSpec ProvidePrimaryDataMessage( 1800L, primaryServiceProxy.ref, - ApparentPower( + ComplexPower( Kilowatts(150.0), Kilovars(49.0), ), @@ -667,7 +667,7 @@ class ParticipantAgentExternalSourceSpec ProvidePrimaryDataMessage( 2700L, primaryServiceProxy.ref, - ApparentPower( + ComplexPower( Kilowatts(200.0), Kilovars(66.0), ), @@ -738,7 +738,7 @@ class ParticipantAgentExternalSourceSpec "fail" in { val data = Map( primaryServiceProxy.ref -> Some( - ApparentPowerAndHeat( + ComplexPowerAndHeat( Kilowatts(0.0), Kilovars(0.0), Kilowatts(0.0), @@ -748,7 +748,7 @@ class ParticipantAgentExternalSourceSpec participantAgent.prepareData(data, reactivePowerFunction) match { case Failure(exception: IllegalStateException) => - exception.getMessage shouldBe "Got the wrong primary data. Expected: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ApparentPower, got: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ApparentPowerAndHeat" + exception.getMessage shouldBe "Got the wrong primary data. Expected: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ComplexPower, got: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ComplexPowerAndHeat" case Failure(exception) => fail(s"Failed with wrong exception:\n\t$exception") case Success(_) => fail("Was meant to fail, but succeeded") @@ -769,7 +769,7 @@ class ParticipantAgentExternalSourceSpec participantAgent.prepareData(data, reactivePowerFunction) match { case Failure(exception: IllegalStateException) => - exception.getMessage shouldBe "Received primary data cannot be enriched to expected data. Expected: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ApparentPower, got: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ActivePowerAndHeat, enriched to: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ApparentPowerAndHeat" + exception.getMessage shouldBe "Received primary data cannot be enriched to expected data. Expected: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ComplexPower, got: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ActivePowerAndHeat, enriched to: edu.ie3.simona.agent.participant.data.Data$PrimaryData$ComplexPowerAndHeat" case Failure(exception) => fail(s"Failed with wrong exception:\n\t$exception") case Success(_) => fail("Was meant to fail, but succeeded") @@ -784,7 +784,7 @@ class ParticipantAgentExternalSourceSpec ) participantAgent.prepareData(data, reactivePowerFunction) match { - case Success(ApparentPower(p, q)) => + case Success(ComplexPower(p, q)) => p should approximate(Megawatts(0.0)) q should approximate(Megavars(0.0)) case Success(value) => @@ -808,7 +808,7 @@ class ParticipantAgentExternalSourceSpec data, (p: squants.Power) => Kilovars(p.toKilowatts * tan(acos(0.9))), ) match { - case Success(ApparentPower(p, q)) => + case Success(ComplexPower(p, q)) => p should approximate(Kilowatts(100.0)) q should approximate(Kilovars(48.43221)) case Success(value) => diff --git a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentalsSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentalsSpec.scala index 10a2652e9d..26058683b3 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentalsSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentFundamentalsSpec.scala @@ -6,16 +6,12 @@ package edu.ie3.simona.agent.participant -import org.apache.pekko.actor.ActorRef.noSender -import org.apache.pekko.actor.{ActorRef, ActorSystem} -import org.apache.pekko.testkit.TestFSMRef -import org.apache.pekko.util.Timeout import breeze.numerics.pow import com.typesafe.config.ConfigFactory import edu.ie3.datamodel.models.input.system.SystemParticipantInput import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.participant.ParticipantAgentFundamentals.RelevantResultValues -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.ParticipantInitializeStateData @@ -27,8 +23,8 @@ import edu.ie3.simona.exceptions.agent.{ InconsistentStateException, } import edu.ie3.simona.model.participant.CalcRelevantData.FixedRelevantData -import edu.ie3.simona.model.participant.SystemParticipant import edu.ie3.simona.model.participant.ModelState.ConstantState +import edu.ie3.simona.model.participant.SystemParticipant import edu.ie3.simona.model.participant.control.QControl.CosPhiFixed import edu.ie3.simona.model.participant.load.FixedLoadModel.FixedLoadRelevantData import edu.ie3.simona.model.participant.load.{FixedLoadModel, LoadReference} @@ -36,13 +32,22 @@ import edu.ie3.simona.test.common.AgentSpec import edu.ie3.simona.test.common.model.participant.LoadTestData import edu.ie3.util.TimeUtil import edu.ie3.util.scala.OperationInterval -import edu.ie3.util.scala.quantities.{Megavars, ReactivePower, Vars} +import edu.ie3.util.scala.quantities.{ + Kilovoltamperes, + Megavars, + ReactivePower, + Vars, +} +import org.apache.pekko.actor.ActorRef.noSender +import org.apache.pekko.actor.{ActorRef, ActorSystem} +import org.apache.pekko.testkit.TestFSMRef +import org.apache.pekko.util.Timeout import org.mockito.Mockito.when import org.scalatest.PrivateMethodTester import org.scalatest.prop.{TableDrivenPropertyChecks, TableFor3, TableFor5} import org.scalatestplus.mockito.MockitoSugar -import squants.{Each, Power} import squants.energy.{Kilowatts, Megawatts, Watts} +import squants.{Each, Power} import java.util.UUID import java.util.concurrent.TimeUnit @@ -77,7 +82,7 @@ class ParticipantAgentFundamentalsSpec /* Get one instance of the mock for participant agent */ private val mockAgentTestRef: TestFSMRef[AgentState, ParticipantStateData[ - ApparentPower + ComplexPower ], ParticipantAgentMock] = TestFSMRef( new ParticipantAgentMock( @@ -85,7 +90,7 @@ class ParticipantAgentFundamentalsSpec initStateData = mock[ParticipantInitializeStateData[ SystemParticipantInput, BaseRuntimeConfig, - ApparentPower, + ComplexPower, ]], ) ) @@ -93,35 +98,35 @@ class ParticipantAgentFundamentalsSpec private val powerValues = Map( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(1.0), Megavars(0.0), ), - 1L -> ApparentPower( + 1L -> ComplexPower( Megawatts(2.0), Megavars(1.0), ), - 3L -> ApparentPower( + 3L -> ComplexPower( Megawatts(3.0), Megavars(2.0), ), - 4L -> ApparentPower( + 4L -> ComplexPower( Megawatts(5.0), Megavars(4.0), ), - 7L -> ApparentPower( + 7L -> ComplexPower( Megawatts(3.0), Megavars(2.0), ), - 8L -> ApparentPower( + 8L -> ComplexPower( Megawatts(6.0), Megavars(5.0), ), - 9L -> ApparentPower( + 9L -> ComplexPower( Megawatts(6.0), Megavars(5.0), ), - 10L -> ApparentPower( + 10L -> ComplexPower( Megawatts(4.0), Megavars(3.0), ), @@ -321,7 +326,7 @@ class ParticipantAgentFundamentalsSpec None, ) apparentPower match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(0.8666666666666667)) q should approximate(Megavars(0.5333333333333334)) } @@ -336,7 +341,7 @@ class ParticipantAgentFundamentalsSpec None, ) apparentPower match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(4.571428571428573)) q should approximate(Megavars(3.571428571428571)) } @@ -351,7 +356,7 @@ class ParticipantAgentFundamentalsSpec None, ) apparentPower match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(4.571428571428573)) q should approximate(Megavars(3.571428571428571)) } @@ -366,7 +371,7 @@ class ParticipantAgentFundamentalsSpec activeToReactivePowerFuncOpt, ) apparentPower match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(0.8666666666666667)) q should approximate(Megavars(2.8666666666666667)) } @@ -381,7 +386,7 @@ class ParticipantAgentFundamentalsSpec activeToReactivePowerFuncOpt, ) apparentPower match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(4.571428571428573)) q should approximate(Megavars(21.71428571428571)) } @@ -396,7 +401,7 @@ class ParticipantAgentFundamentalsSpec activeToReactivePowerFuncOpt, ) apparentPower match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(4.571428571428573)) q should approximate(Megavars(21.71428571428571)) } @@ -409,27 +414,27 @@ class ParticipantAgentFundamentalsSpec val resultValueStore = ValueStore( 900, SortedMap( - 800L -> ApparentPower( + 800L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1000L -> ApparentPower( + 1000L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1200L -> ApparentPower( + 1200L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1400L -> ApparentPower( + 1400L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1600L -> ApparentPower( + 1600L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1800L -> ApparentPower( + 1800L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), @@ -438,7 +443,7 @@ class ParticipantAgentFundamentalsSpec val requestValueStore = ValueStore( 900, SortedMap( - 900L -> ApparentPower( + 900L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ) @@ -454,27 +459,27 @@ class ParticipantAgentFundamentalsSpec 900L, 1800L, Map( - 800L -> ApparentPower( + 800L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1000L -> ApparentPower( + 1000L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1200L -> ApparentPower( + 1200L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1400L -> ApparentPower( + 1400L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1600L -> ApparentPower( + 1600L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), - 1800L -> ApparentPower( + 1800L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ), @@ -488,7 +493,7 @@ class ParticipantAgentFundamentalsSpec val resultValueStore = ValueStore( 900, SortedMap( - 800L -> ApparentPower( + 800L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ) @@ -497,7 +502,7 @@ class ParticipantAgentFundamentalsSpec val requestValueStore = ValueStore( 900, SortedMap( - 900L -> ApparentPower( + 900L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ) @@ -513,7 +518,7 @@ class ParticipantAgentFundamentalsSpec 900L, 1800L, Map( - 800L -> ApparentPower( + 800L -> ComplexPower( Megawatts(0.0), Megavars(0.0), ) @@ -526,7 +531,7 @@ class ParticipantAgentFundamentalsSpec "Determining the applicable nodal voltage" should { "deliver the correct voltage" in { val baseStateData = ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedLoadRelevantData.type, ConstantState.type, FixedLoadModel, @@ -538,7 +543,7 @@ class ParticipantAgentFundamentalsSpec "test_load", OperationInterval(0L, 1800L), CosPhiFixed(0.95), - Kilowatts(100.0), + Kilovoltamperes(100.0), 0.95, LoadReference.ActivePower(Kilowatts(95.0)), ), @@ -563,7 +568,7 @@ class ParticipantAgentFundamentalsSpec "throw an error, if no nodal voltage is available" in { val baseStateData = ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedLoadRelevantData.type, ConstantState.type, FixedLoadModel, @@ -575,7 +580,7 @@ class ParticipantAgentFundamentalsSpec "test_load", OperationInterval(0L, 1800L), CosPhiFixed(0.95), - Kilowatts(100.0), + Kilovoltamperes(100.0), 0.95, LoadReference.ActivePower(Kilowatts(95.0)), ), @@ -615,25 +620,25 @@ case object ParticipantAgentFundamentalsSpec extends MockitoSugar { additionalActivationTicks: SortedSet[Long], foreseenDataTicks: Map[ActorRef, Option[Long]], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, - SystemParticipant[FixedRelevantData.type, ApparentPower, ConstantState.type], + SystemParticipant[FixedRelevantData.type, ComplexPower, ConstantState.type], ] = { val modelMock = mock[SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ]] when(modelMock.getUuid).thenReturn(UUID.randomUUID()) ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ]( diff --git a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentMock.scala b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentMock.scala index 8087993f01..c3c77e2292 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentMock.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/ParticipantAgentMock.scala @@ -6,14 +6,12 @@ package edu.ie3.simona.agent.participant -import org.apache.pekko.actor.{ActorRef, FSM, Props} -import org.apache.pekko.actor.typed.{ActorRef => TypedActorRef} import edu.ie3.datamodel.models.input.system.SystemParticipantInput import edu.ie3.datamodel.models.result.ResultEntity import edu.ie3.datamodel.models.result.system.SystemParticipantResult import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ - ApparentPower, + ComplexPower, ZERO_POWER, } import edu.ie3.simona.agent.participant.data.Data.SecondaryData @@ -45,7 +43,14 @@ import edu.ie3.simona.model.participant.{ } import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage.FlexResponse import edu.ie3.util.quantities.QuantityUtils.RichQuantityDouble -import edu.ie3.util.scala.quantities.{Kilovars, Megavars, ReactivePower} +import edu.ie3.util.scala.quantities.{ + Kilovars, + Kilovoltamperes, + Megavars, + ReactivePower, +} +import org.apache.pekko.actor.typed.{ActorRef => TypedActorRef} +import org.apache.pekko.actor.{ActorRef, FSM, Props} import org.mockito.ArgumentMatchers.any import org.mockito.Mockito import org.mockito.Mockito.doReturn @@ -68,38 +73,38 @@ class ParticipantAgentMock( initStateData: ParticipantInitializeStateData[ SystemParticipantInput, SimonaConfig.BaseRuntimeConfig, - ApparentPower, + ComplexPower, ], override val listener: Iterable[ActorRef] = Iterable.empty[ActorRef], ) extends ParticipantAgent[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], SystemParticipantInput, SimonaConfig.BaseRuntimeConfig, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ](scheduler, initStateData) with ParticipantAgentFundamentals[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, - ParticipantStateData[ApparentPower], + ParticipantStateData[ComplexPower], SystemParticipantInput, SimonaConfig.BaseRuntimeConfig, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ] { - override protected val pdClassTag: ClassTag[ApparentPower] = - classTag[ApparentPower] - override val alternativeResult: ApparentPower = ZERO_POWER + override protected val pdClassTag: ClassTag[ComplexPower] = + classTag[ComplexPower] + override val alternativeResult: ComplexPower = ZERO_POWER /** Partial function, that is able to transfer * [[ParticipantModelBaseStateData]] (holding the actual calculation model) @@ -108,20 +113,20 @@ class ParticipantAgentMock( override val calculateModelPowerFunc: ( Long, ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ], ConstantState.type, squants.Dimensionless, - ) => ApparentPower = (_, _, _, _) => + ) => ComplexPower = (_, _, _, _) => // output different from default (0, 0) - ApparentPower( + ComplexPower( Megawatts(2.0), Megavars(1.0), ) @@ -144,19 +149,19 @@ class ParticipantAgentMock( */ override def calculatePowerWithSecondaryDataAndGoToIdle( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ], modelState: ConstantState.type, currentTick: Long, scheduler: ActorRef, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = throw new InvalidRequestException( "Request to calculate power with secondary data cannot be processed for this mock agent." ) @@ -196,35 +201,35 @@ class ParticipantAgentMock( outputConfig: NotifierConfig, maybeEmAgent: Option[TypedActorRef[FlexResponse]], ): ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, - SystemParticipant[FixedRelevantData.type, ApparentPower, ConstantState.type], + SystemParticipant[FixedRelevantData.type, ComplexPower, ConstantState.type], ] = { val func = CosPhiFixed(0.95).activeToReactivePowerFunc( - Kilowatts(0.0), + Kilovoltamperes(0.0), 0.95d, Each(1.0), ) val participant: SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ] = mock[SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ]] doReturn(func).when(participant).activeToReactivePowerFunc(any()) ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ]( @@ -267,13 +272,13 @@ class ParticipantAgentMock( simulationEndDate: ZonedDateTime, ): SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ] = { val mockModel = mock[SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ]] val uuid = inputModel.electricalInputModel.getUuid @@ -283,12 +288,12 @@ class ParticipantAgentMock( override protected def createInitialState( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ] @@ -297,12 +302,12 @@ class ParticipantAgentMock( override protected def createCalcRelevantData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, FixedRelevantData.type, ConstantState.type, SystemParticipant[ FixedRelevantData.type, - ApparentPower, + ComplexPower, ConstantState.type, ], ], @@ -320,9 +325,9 @@ class ParticipantAgentMock( * [[Idle]] with updated result values */ override def finalizeTickAfterPF( - baseStateData: BaseStateData[ApparentPower], + baseStateData: BaseStateData[ComplexPower], currentTick: Long, - ): FSM.State[AgentState, ParticipantStateData[ApparentPower]] = + ): FSM.State[AgentState, ParticipantStateData[ComplexPower]] = goto(Idle) using baseStateData /** Determine the average result within the given tick window @@ -339,13 +344,13 @@ class ParticipantAgentMock( * The averaged result */ override def averageResults( - tickToResults: Map[Long, ApparentPower], + tickToResults: Map[Long, ComplexPower], windowStart: Long, windowEnd: Long, activeToReactivePowerFuncOpt: Option[ squants.Power => ReactivePower ] = None, - ): ApparentPower = + ): ComplexPower = ParticipantAgentFundamentals.averageApparentPower( tickToResults, windowStart, @@ -368,7 +373,7 @@ class ParticipantAgentMock( override protected def buildResult( uuid: UUID, dateTime: ZonedDateTime, - result: ApparentPower, + result: ComplexPower, ): SystemParticipantResult = new SystemParticipantResult( dateTime, @@ -395,12 +400,12 @@ class ParticipantAgentMock( override def handleControlledPowerChange( tick: Long, baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, CalcRelevantData.FixedRelevantData.type, ModelState.ConstantState.type, SystemParticipant[ CalcRelevantData.FixedRelevantData.type, - ApparentPower, + ComplexPower, ModelState.ConstantState.type, ], ], @@ -409,12 +414,12 @@ class ParticipantAgentMock( setPower: squants.Power, ): ( ModelState.ConstantState.type, - AccompaniedSimulationResult[ApparentPower], + AccompaniedSimulationResult[ComplexPower], FlexChangeIndicator, ) = ( ConstantState, AccompaniedSimulationResult( - ApparentPower( + ComplexPower( Kilowatts(0.0), Kilovars(0.0), ), @@ -446,7 +451,7 @@ class ParticipantAgentMock( nodalVoltage: squants.Dimensionless, model: SystemParticipant[ CalcRelevantData.FixedRelevantData.type, - ApparentPower, + ComplexPower, ModelState.ConstantState.type, ], ): ModelState.ConstantState.type = modelState @@ -458,7 +463,7 @@ object ParticipantAgentMock { initStateData: ParticipantInitializeStateData[ SystemParticipantInput, SimonaConfig.BaseRuntimeConfig, - ApparentPower, + ComplexPower, ], ): Props = Props( diff --git a/src/test/scala/edu/ie3/simona/agent/participant/PvAgentModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/PvAgentModelCalculationSpec.scala index 4d480f154c..071a5fa2c7 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/PvAgentModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/PvAgentModelCalculationSpec.scala @@ -15,7 +15,7 @@ import edu.ie3.simona.agent.grid.GridAgentMessages.{ AssetPowerUnchangedMessage, } import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorWeatherService import edu.ie3.simona.agent.participant.pv.PvAgent import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData @@ -122,7 +122,7 @@ class PvAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ PvInput, PvRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = voltageSensitiveInput, modelConfig = modelConfig, @@ -186,7 +186,7 @@ class PvAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ PvInput, PvRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = voltageSensitiveInput, modelConfig = modelConfig, @@ -314,7 +314,7 @@ class PvAgentModelCalculationSpec SortedMap(0L -> Each(1.0)), ) resultValueStore shouldBe ValueStore(resolution) - requestValueStore shouldBe ValueStore[ApparentPower](resolution) + requestValueStore shouldBe ValueStore[ComplexPower](resolution) /* Additional information */ awaitRegistrationResponsesFrom shouldBe Iterable(weatherService.ref) @@ -397,11 +397,11 @@ class PvAgentModelCalculationSpec inside(pvAgent.stateData) { case baseStateData: ParticipantModelBaseStateData[_, _, _, _] => baseStateData.requestValueStore shouldBe ValueStore[ - ApparentPower + ComplexPower ]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0d), Megavars(0d), ) @@ -509,7 +509,7 @@ class PvAgentModelCalculationSpec 0L, fail("Expected a simulation result for tick 900."), ) match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(0.0)) q should approximate(Megavars(0.0)) } @@ -613,7 +613,7 @@ class PvAgentModelCalculationSpec 0L, fail("Expected a simulation result for tick 0."), ) match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(0.0)) q should approximate(Megavars(0.0)) } diff --git a/src/test/scala/edu/ie3/simona/agent/participant/RichValueSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/RichValueSpec.scala index 5710c15417..0c8b16b35b 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/RichValueSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/RichValueSpec.scala @@ -18,8 +18,8 @@ import edu.ie3.simona.agent.participant.data.Data.PrimaryData import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ ActivePower, ActivePowerAndHeat, - ApparentPower, - ApparentPowerAndHeat, + ComplexPower, + ComplexPowerAndHeat, RichValue, } import edu.ie3.simona.test.common.UnitSpec @@ -116,7 +116,7 @@ class RichValueSpec extends UnitSpec with TableDrivenPropertyChecks { Quantities.getQuantity(50d, PowerSystemUnits.KILOWATT), Quantities.getQuantity(25d, PowerSystemUnits.KILOVAR), ), - ApparentPower( + ComplexPower( Kilowatts(50d), Kilovars(25d), ), @@ -127,7 +127,7 @@ class RichValueSpec extends UnitSpec with TableDrivenPropertyChecks { Quantities.getQuantity(25d, PowerSystemUnits.KILOVAR), Quantities.getQuantity(12.5, PowerSystemUnits.KILOWATT), ), - ApparentPowerAndHeat( + ComplexPowerAndHeat( Kilowatts(50d), Kilovars(25d), Kilowatts(12.5), diff --git a/src/test/scala/edu/ie3/simona/agent/participant/StorageAgentModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/StorageAgentModelCalculationSpec.scala index 06035ed30d..aa4d1984e5 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/StorageAgentModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/StorageAgentModelCalculationSpec.scala @@ -13,7 +13,7 @@ import edu.ie3.datamodel.models.result.system.StorageResult import edu.ie3.simona.agent.ValueStore import edu.ie3.simona.agent.grid.GridAgentMessages.AssetPowerChangedMessage import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData import edu.ie3.simona.agent.participant.statedata.ParticipantStateData.{ ParticipantInitializeStateData, @@ -110,7 +110,7 @@ class StorageAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ StorageInput, StorageRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = storageInputQv, modelConfig = modelConfig, @@ -219,7 +219,7 @@ class StorageAgentModelCalculationSpec resultValueStore shouldBe ValueStore( resolution ) - requestValueStore shouldBe ValueStore[ApparentPower]( + requestValueStore shouldBe ValueStore[ComplexPower]( resolution ) case unrecognized => @@ -271,11 +271,11 @@ class StorageAgentModelCalculationSpec inside(storageAgent.stateData) { case modelBaseStateData: ParticipantModelBaseStateData[_, _, _, _] => modelBaseStateData.requestValueStore shouldBe ValueStore[ - ApparentPower + ComplexPower ]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0d), Megavars(0d), ) diff --git a/src/test/scala/edu/ie3/simona/agent/participant/WecAgentModelCalculationSpec.scala b/src/test/scala/edu/ie3/simona/agent/participant/WecAgentModelCalculationSpec.scala index 2bcac7bc3c..01d8e24c29 100644 --- a/src/test/scala/edu/ie3/simona/agent/participant/WecAgentModelCalculationSpec.scala +++ b/src/test/scala/edu/ie3/simona/agent/participant/WecAgentModelCalculationSpec.scala @@ -15,7 +15,7 @@ import edu.ie3.simona.agent.grid.GridAgentMessages.{ AssetPowerUnchangedMessage, } import edu.ie3.simona.agent.participant.ParticipantAgent.RequestAssetPowerMessage -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPower +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPower import edu.ie3.simona.agent.participant.data.secondary.SecondaryDataService.ActorWeatherService import edu.ie3.simona.agent.participant.statedata.BaseStateData.ParticipantModelBaseStateData import edu.ie3.simona.agent.participant.statedata.DataCollectionStateData @@ -125,7 +125,7 @@ class WecAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ WecInput, WecRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = voltageSensitiveInput, simulationStartDate = simulationStartDate, @@ -193,7 +193,7 @@ class WecAgentModelCalculationSpec val initStateData = ParticipantInitializeStateData[ WecInput, WecRuntimeConfig, - ApparentPower, + ComplexPower, ]( inputModel = voltageSensitiveInput, modelConfig = modelConfig, @@ -291,7 +291,7 @@ class WecAgentModelCalculationSpec SortedMap(0L -> Each(1.0)), ) resultValueStore shouldBe ValueStore(resolution) - requestValueStore shouldBe ValueStore[ApparentPower](resolution) + requestValueStore shouldBe ValueStore[ComplexPower](resolution) /* Additional information */ awaitRegistrationResponsesFrom shouldBe Iterable(weatherService.ref) @@ -315,7 +315,7 @@ class WecAgentModelCalculationSpec wecAgent.stateName shouldBe Idle wecAgent.stateData match { case baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -376,17 +376,17 @@ class WecAgentModelCalculationSpec inside(wecAgent.stateData) { case modelBaseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, ] => modelBaseStateData.requestValueStore shouldBe ValueStore[ - ApparentPower + ComplexPower ]( resolution, SortedMap( - 0L -> ApparentPower( + 0L -> ComplexPower( Megawatts(0d), Megavars(0d), ) @@ -452,7 +452,7 @@ class WecAgentModelCalculationSpec wecAgent.stateData match { case DataCollectionStateData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -488,7 +488,7 @@ class WecAgentModelCalculationSpec wecAgent.stateName shouldBe Idle wecAgent.stateData match { case baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -509,7 +509,7 @@ class WecAgentModelCalculationSpec 900L, fail("Expected a simulation result for tick 900."), ) match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(0.0)) q should approximate(Megavars(0.0)) } @@ -558,7 +558,7 @@ class WecAgentModelCalculationSpec wecAgent.stateData match { case DataCollectionStateData( baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -607,7 +607,7 @@ class WecAgentModelCalculationSpec wecAgent.stateName shouldBe Idle wecAgent.stateData match { case baseStateData: ParticipantModelBaseStateData[ - ApparentPower, + ComplexPower, WecRelevantData, ConstantState.type, WecModel, @@ -628,7 +628,7 @@ class WecAgentModelCalculationSpec 900L, fail("Expected a simulation result for tick 900."), ) match { - case ApparentPower(p, q) => + case ComplexPower(p, q) => p should approximate(Megawatts(0.0)) q should approximate(Megavars(0.0)) } diff --git a/src/test/scala/edu/ie3/simona/event/listener/ResultEventListenerSpec.scala b/src/test/scala/edu/ie3/simona/event/listener/ResultEventListenerSpec.scala index 26c3145945..68caa1706b 100644 --- a/src/test/scala/edu/ie3/simona/event/listener/ResultEventListenerSpec.scala +++ b/src/test/scala/edu/ie3/simona/event/listener/ResultEventListenerSpec.scala @@ -84,7 +84,6 @@ class ResultEventListenerSpec classes, resultSinkType, ), - createDirs = true, ) } @@ -122,14 +121,14 @@ class ResultEventListenerSpec ) // after the creation of the listener, it is expected that a corresponding raw result data file is present - val outputFile = new File( - fileHierarchy.rawOutputDataFilePaths.getOrElse( + val outputFile = fileHierarchy.rawOutputDataFilePaths + .getOrElse( classOf[PvResult], fail( s"Cannot get filepath for raw result file of class '${classOf[PvResult].getSimpleName}' from outputFileHierarchy!'" ), ) - ) + .toFile assert(outputFile.exists) assert(outputFile.isFile) @@ -162,14 +161,14 @@ class ResultEventListenerSpec listenerRef ! ParticipantResultEvent(dummyPvResult) - val outputFile = new File( - specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( + val outputFile = specificOutputFileHierarchy.rawOutputDataFilePaths + .getOrElse( classOf[PvResult], fail( s"Cannot get filepath for raw result file of class '${classOf[PvResult].getSimpleName}' from outputFileHierarchy!'" ), ) - ) + .toFile // wait until output file exists (headers are flushed out immediately): awaitCond( @@ -219,39 +218,37 @@ class ResultEventListenerSpec ) val outputFiles = Map( - dummyNodeResultString -> new File( - specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( + dummyNodeResultString -> specificOutputFileHierarchy.rawOutputDataFilePaths + .getOrElse( classOf[NodeResult], fail( s"Cannot get filepath for raw result file of class '${classOf[NodeResult].getSimpleName}' from outputFileHierarchy!'" ), - ) - ), - dummySwitchResultString -> new File( + ), + dummySwitchResultString -> specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( classOf[SwitchResult], fail( s"Cannot get filepath for raw result file of class '${classOf[SwitchResult].getSimpleName}' from outputFileHierarchy!'" ), - ) - ), - dummyLineResultDataString -> new File( - specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( + ), + dummyLineResultDataString -> specificOutputFileHierarchy.rawOutputDataFilePaths + .getOrElse( classOf[LineResult], fail( s"Cannot get filepath for raw result file of class '${classOf[LineResult].getSimpleName}' from outputFileHierarchy!'" ), - ) - ), - dummyTrafo2wResultDataString -> new File( - specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( + ), + dummyTrafo2wResultDataString -> specificOutputFileHierarchy.rawOutputDataFilePaths + .getOrElse( classOf[Transformer2WResult], fail( s"Cannot get filepath for raw result file of class '${classOf[Transformer2WResult].getSimpleName}' from outputFileHierarchy!'" ), - ) - ), - ) + ), + ).map { case (dummyString, path) => + (dummyString, path.toFile) + } // wait until all output files exist (headers are flushed out immediately): awaitCond( @@ -308,14 +305,15 @@ class ResultEventListenerSpec ) ) - val outputFile = new File( - fileHierarchy.rawOutputDataFilePaths.getOrElse( + val outputFile = fileHierarchy.rawOutputDataFilePaths + .getOrElse( classOf[Transformer3WResult], fail( s"Cannot get filepath for raw result file of class '${classOf[Transformer3WResult].getSimpleName}' from outputFileHierarchy!'" ), ) - ) + .toFile + /* The result file is created at start up and only contains a headline. */ awaitCond( outputFile.exists(), @@ -386,12 +384,14 @@ class ResultEventListenerSpec val outputFile = new File( ".gz$".r.replaceAllIn( - specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( - classOf[PvResult], - fail( - s"Cannot get filepath for raw result file of class '${classOf[PvResult].getSimpleName}' from outputFileHierarchy!'" - ), - ), + specificOutputFileHierarchy.rawOutputDataFilePaths + .getOrElse( + classOf[PvResult], + fail( + s"Cannot get filepath for raw result file of class '${classOf[PvResult].getSimpleName}' from outputFileHierarchy!'" + ), + ) + .toString, "", ) ) @@ -413,26 +413,29 @@ class ResultEventListenerSpec // wait until file exists awaitCond( - new File( - specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( + specificOutputFileHierarchy.rawOutputDataFilePaths + .getOrElse( classOf[PvResult], fail( s"Cannot get filepath for raw result file of class '${classOf[PvResult].getSimpleName}' from outputFileHierarchy!'" ), ) - ).exists, + .toFile + .exists, timeoutDuration, ) val resultFileSource = Source.fromInputStream( new GZIPInputStream( new FileInputStream( - specificOutputFileHierarchy.rawOutputDataFilePaths.getOrElse( - classOf[PvResult], - fail( - s"Cannot get filepath for raw result file of class '${classOf[PvResult].getSimpleName}' from outputFileHierarchy!'" - ), - ) + specificOutputFileHierarchy.rawOutputDataFilePaths + .getOrElse( + classOf[PvResult], + fail( + s"Cannot get filepath for raw result file of class '${classOf[PvResult].getSimpleName}' from outputFileHierarchy!'" + ), + ) + .toFile ) ) ) diff --git a/src/test/scala/edu/ie3/simona/integration/RunSimonaStandaloneIT.scala b/src/test/scala/edu/ie3/simona/integration/RunSimonaStandaloneIT.scala index 4e53f0e078..083b9681e3 100644 --- a/src/test/scala/edu/ie3/simona/integration/RunSimonaStandaloneIT.scala +++ b/src/test/scala/edu/ie3/simona/integration/RunSimonaStandaloneIT.scala @@ -90,7 +90,7 @@ class RunSimonaStandaloneIT /* check the results */ // check configs - val configOutputDir = new File(resultFileHierarchy.configOutputDir) + val configOutputDir = resultFileHierarchy.configOutputDir.toFile configOutputDir.isDirectory shouldBe true configOutputDir.listFiles.toVector.size shouldBe 1 @@ -118,10 +118,12 @@ class RunSimonaStandaloneIT entityClass: Class[_ <: ResultEntity], ): BufferedSource = { Source.fromFile( - resultFileHierarchy.rawOutputDataFilePaths.getOrElse( - entityClass, - fail(s"Unable to get output path for result entity: $entityClass"), - ) + resultFileHierarchy.rawOutputDataFilePaths + .getOrElse( + entityClass, + fail(s"Unable to get output path for result entity: $entityClass"), + ) + .toFile ) } diff --git a/src/test/scala/edu/ie3/simona/io/file/ResultFileHierarchySpec.scala b/src/test/scala/edu/ie3/simona/io/file/ResultFileHierarchySpec.scala index 3b89d418f2..6ddc02a059 100644 --- a/src/test/scala/edu/ie3/simona/io/file/ResultFileHierarchySpec.scala +++ b/src/test/scala/edu/ie3/simona/io/file/ResultFileHierarchySpec.scala @@ -51,37 +51,15 @@ class ResultFileHierarchySpec ), ) - val runOutputDirWithDate = - "vn_simona_".concat(validOutputFileHierarchy.runStartTimeUTC) - - relativizePath( - validOutputFileHierarchy.baseOutputDir - ).toString shouldBe baseOutputDir - relativizePath( - validOutputFileHierarchy.runOutputDir - ).toString shouldBe baseOutputDir + fileSeparator + runOutputDirWithDate - relativizePath( - validOutputFileHierarchy.tmpDir - ).toString shouldBe baseOutputDir + fileSeparator + runOutputDirWithDate + fileSeparator + "tmp" - relativizePath( - validOutputFileHierarchy.configOutputDir - ).toString shouldBe baseOutputDir + fileSeparator + runOutputDirWithDate + fileSeparator + "configs" - relativizePath( - validOutputFileHierarchy.rawOutputDataDir - ).toString shouldBe baseOutputDir + fileSeparator + runOutputDirWithDate + fileSeparator + "rawOutputData" - relativizePath( - validOutputFileHierarchy.graphOutputDir - ).toString shouldBe baseOutputDir + fileSeparator + runOutputDirWithDate + fileSeparator + "graphs" - relativizePath( - validOutputFileHierarchy.kpiOutputDir - ).toString shouldBe baseOutputDir + fileSeparator + runOutputDirWithDate + fileSeparator + "kpi" - - relativizePath( - validOutputFileHierarchy.rawOutputDataFilePaths(classOf[PvResult]) - ).toString shouldBe baseOutputDir + fileSeparator + runOutputDirWithDate + fileSeparator + "rawOutputData" + fileSeparator + "pref_pv_res_suff.csv" + validOutputFileHierarchy.tmpDir.toString shouldBe validOutputFileHierarchy.runOutputDir.toString + fileSeparator + "tmp" + validOutputFileHierarchy.configOutputDir.toString shouldBe validOutputFileHierarchy.runOutputDir.toString + fileSeparator + "configs" + validOutputFileHierarchy.logOutputDir.toString shouldBe validOutputFileHierarchy.runOutputDir.toString + fileSeparator + "log" + + validOutputFileHierarchy + .rawOutputDataFilePaths(classOf[PvResult]) + .toString shouldBe validOutputFileHierarchy.runOutputDir.toString + fileSeparator + "rawOutputData" + fileSeparator + "pref_pv_res_suff.csv" } - "not write directories automatically on instantiation" in {} // todo "write directories automatically on instantiation when requested so" in { // delete file if they exist @@ -97,7 +75,6 @@ class ResultFileHierarchySpec Set(classOf[PvResult]), ResultSinkType.Csv("csv", "pref", "suff"), ), - createDirs = true, ) // check for existence of run output dir @@ -106,26 +83,13 @@ class ResultFileHierarchySpec ) shouldBe true // check for existence of other folders - assert( - Files.exists(new File(validOutputFileHierarchy.baseOutputDir).toPath) - ) - assert(Files.exists(new File(validOutputFileHierarchy.tmpDir).toPath)) - assert( - Files.exists(new File(validOutputFileHierarchy.configOutputDir).toPath) - ) - assert( - Files.exists(new File(validOutputFileHierarchy.rawOutputDataDir).toPath) - ) - assert( - Files.exists(new File(validOutputFileHierarchy.graphOutputDir).toPath) - ) - assert( - Files.exists(new File(validOutputFileHierarchy.kpiOutputDir).toPath) - ) + assert(Files.exists(validOutputFileHierarchy.configOutputDir)) + assert(Files.exists(validOutputFileHierarchy.logOutputDir)) + assert(Files.exists(validOutputFileHierarchy.tmpDir)) // check if tmp directory can be deleted by output file hierarchy ResultFileHierarchy.deleteTmpDir(validOutputFileHierarchy) - assert(!Files.exists(new File(validOutputFileHierarchy.tmpDir).toPath)) + assert(!Files.exists(validOutputFileHierarchy.tmpDir)) } @@ -133,11 +97,6 @@ class ResultFileHierarchySpec } - private def relativizePath(fullPath: String): Path = { - new File(new File("").getAbsolutePath).toPath - .relativize(new File(fullPath).toPath) - } - // todo output model path config compression should always be disabled -> test for this } diff --git a/src/test/scala/edu/ie3/simona/model/grid/GridSpec.scala b/src/test/scala/edu/ie3/simona/model/grid/GridSpec.scala index 2f29248054..45b0e5a837 100644 --- a/src/test/scala/edu/ie3/simona/model/grid/GridSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/grid/GridSpec.scala @@ -231,7 +231,7 @@ class GridSpec nodes.foreach(_.enable()) // remove a line from the grid - val adaptedLines = lines - line3To4 + val adaptedLines: Set[LineModel] = lines - line3To4 adaptedLines.foreach(_.enable()) // enable transformer @@ -466,7 +466,7 @@ class GridSpec updateUuidToIndexMap(gridModel) // nodes 1, 13 and 14 should map to the same node - val node1Index = gridModel.nodeUuidToIndexMap + val node1Index: Int = gridModel.nodeUuidToIndexMap .get(node1.uuid) .value gridModel.nodeUuidToIndexMap.get(node13.uuid).value shouldBe node1Index diff --git a/src/test/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatSpec.scala index 6e8556d6ca..e47c309c37 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/ApparentPowerAndHeatSpec.scala @@ -6,17 +6,22 @@ package edu.ie3.simona.model.participant -import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ApparentPowerAndHeat +import edu.ie3.simona.agent.participant.data.Data.PrimaryData.ComplexPowerAndHeat import edu.ie3.simona.model.participant.ApparentPowerAndHeatSpec.ApparentPowerAndHeatMock import edu.ie3.simona.model.participant.CalcRelevantData.FixedRelevantData import edu.ie3.simona.model.participant.ModelState.ConstantState import edu.ie3.simona.model.participant.control.QControl.CosPhiFixed -import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMinMaxFlexOptions import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage +import edu.ie3.simona.ontology.messages.flex.MinMaxFlexibilityMessage.ProvideMinMaxFlexOptions import edu.ie3.simona.test.common.UnitSpec import edu.ie3.util.scala.OperationInterval -import edu.ie3.util.scala.quantities.{Megavars, ReactivePower, Vars} -import squants.energy.{Kilowatts, Megawatts, Watts} +import edu.ie3.util.scala.quantities.{ + Kilovoltamperes, + Megavars, + ReactivePower, + Vars, +} +import squants.energy.{Megawatts, Watts} import squants.{Each, Power} import java.util.UUID @@ -33,7 +38,7 @@ class ApparentPowerAndHeatSpec extends UnitSpec { ConstantState, FixedRelevantData, ) match { - case ApparentPowerAndHeat(p, q, qDot) => + case ComplexPowerAndHeat(p, q, qDot) => p should approximate(Megawatts(0d)) q should approximate(Megavars(0d)) qDot should approximate(Megawatts(0d)) @@ -48,7 +53,7 @@ class ApparentPowerAndHeatSpec extends UnitSpec { ConstantState, FixedRelevantData, ) match { - case ApparentPowerAndHeat(p, q, qDot) => + case ComplexPowerAndHeat(p, q, qDot) => p should approximate(Megawatts(43d)) q should approximate(Megavars(0d)) qDot should approximate(Megawatts(42d)) @@ -62,14 +67,14 @@ object ApparentPowerAndHeatSpec { object ApparentPowerAndHeatMock extends SystemParticipant[ FixedRelevantData.type, - ApparentPowerAndHeat, + ComplexPowerAndHeat, ConstantState.type, ]( UUID.randomUUID(), "ParticipantMock", OperationInterval.apply(0L, 42L), CosPhiFixed(0.97), - Kilowatts(42d), + Kilovoltamperes(42d), 0.97, ) with ApparentPowerAndHeatParticipant[ diff --git a/src/test/scala/edu/ie3/simona/model/participant/BMModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/BMModelSpec.scala index 011dbb9567..9aa118c0b3 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/BMModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/BMModelSpec.scala @@ -11,7 +11,7 @@ import edu.ie3.simona.model.participant.ModelState.ConstantState import edu.ie3.simona.model.participant.control.QControl import edu.ie3.simona.test.common.UnitSpec import edu.ie3.util.scala.OperationInterval -import edu.ie3.util.scala.quantities.EuroPerKilowatthour +import edu.ie3.util.scala.quantities.{EuroPerKilowatthour, Kilovoltamperes} import squants.energy.{Kilowatts, Megawatts} import squants.market.EUR import squants.thermal.Celsius @@ -21,7 +21,7 @@ import java.time.ZonedDateTime import java.util.UUID /** Test class that tries to cover all special cases of the current - * implementation of the {@link BMModel} + * implementation of the [[BMModel]] * * Test results have been calculated on paper using equations from wiki: * https://wiki.ie3.e-technik.tu-dortmund.de/!simona/model:bm_model @@ -38,7 +38,7 @@ class BMModelSpec extends UnitSpec { "BM Model Test", OperationInterval(0L, 86400L), QControl(new CosPhiFixed("cosPhiFixed:{(0.0,1.0)}")), - Kilowatts(190), + Kilovoltamperes(190), 1d, "MockNode", isCostControlled = true, @@ -164,7 +164,7 @@ class BMModelSpec extends UnitSpec { "BM Model Test", OperationInterval(0L, 86400L), QControl(new CosPhiFixed("cosPhiFixed:{(0.0,1.0)}")), - Kilowatts(190), + Kilovoltamperes(190), 1d, "MockNode", isCostControlled = true, @@ -174,7 +174,7 @@ class BMModelSpec extends UnitSpec { ) val pElCalc = bmModel.calculateElOutput(usage, eff) - pElCalc.value should be(Kilowatts(pElSol).value +- 1e-4) + pElCalc should approximate(Kilowatts(pElSol)) } } @@ -306,7 +306,7 @@ class BMModelSpec extends UnitSpec { "BM Model Test", OperationInterval(0L, 86400L), QControl(new CosPhiFixed("cosPhiFixed:{(0.0,1.0)}")), - Kilowatts(190), + Kilovoltamperes(190), 1d, "MockNode", costControlled, diff --git a/src/test/scala/edu/ie3/simona/model/participant/ChpModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/ChpModelSpec.scala index 208037e21c..96824c95c3 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/ChpModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/ChpModelSpec.scala @@ -6,9 +6,9 @@ package edu.ie3.simona.model.participant +import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.ChpInput import edu.ie3.datamodel.models.input.system.`type`.ChpTypeInput -import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.characteristic.CosPhiFixed import edu.ie3.datamodel.models.input.thermal.{ CylindricalStorageInput, @@ -105,7 +105,7 @@ class ChpModelSpec "ChpModel", null, null, - Kilowatts(100), + Kilovoltamperes(100), 0.95, Kilowatts(50), thermalStorage, diff --git a/src/test/scala/edu/ie3/simona/model/participant/FixedFeedInModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/FixedFeedInModelSpec.scala index 3447a39d7c..be5dc6ac69 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/FixedFeedInModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/FixedFeedInModelSpec.scala @@ -15,8 +15,14 @@ import edu.ie3.simona.test.common.{DefaultTestData, UnitSpec} import edu.ie3.simona.util.ConfigUtil import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.quantities.PowerSystemUnits.MEGAVOLTAMPERE +import edu.ie3.util.scala.quantities.{ + ApparentPower, + Kilovoltamperes, + Megavoltamperes, + Voltamperes, +} import org.scalatest.PrivateMethodTester -import squants.energy.{Kilowatts, Megawatts, Watts} +import squants.energy.Kilowatts class FixedFeedInModelSpec extends UnitSpec @@ -24,9 +30,10 @@ class FixedFeedInModelSpec with DefaultTestData with PrivateMethodTester { - private implicit val powerTolerance: squants.Power = Watts( + // Equals to 1 VA power + private implicit val powerTolerance: ApparentPower = Voltamperes( 1.0 - ) // Equals to 1 W power + ) "The fixed feed in model object" should { @@ -63,7 +70,7 @@ class FixedFeedInModelSpec operationInterval shouldBe defaultOperationInterval qControl shouldBe QControl(fixedFeedInput.getqCharacteristics) sRated should approximate( - Megawatts( + Megavoltamperes( fixedFeedInput.getsRated().to(MEGAVOLTAMPERE).getValue.doubleValue ) ) @@ -85,10 +92,10 @@ class FixedFeedInModelSpec fixedFeedInput.getId, defaultOperationInterval, QControl.apply(fixedFeedInput.getqCharacteristics()), - Kilowatts( + Kilovoltamperes( fixedFeedInput .getsRated() - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue() ), diff --git a/src/test/scala/edu/ie3/simona/model/participant/PvModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/PvModelSpec.scala index 660852e28b..157ff0a041 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/PvModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/PvModelSpec.scala @@ -14,7 +14,9 @@ import edu.ie3.datamodel.models.voltagelevels.GermanVoltageLevelUtils import edu.ie3.simona.test.common.{DefaultTestData, UnitSpec} import edu.ie3.util.quantities.PowerSystemUnits._ import edu.ie3.util.scala.quantities.{ + ApparentPower, Irradiation, + Kilovoltamperes, Megavars, ReactivePower, WattHoursPerSquareMeter, @@ -92,6 +94,9 @@ class PvModelSpec extends UnitSpec with GivenWhenThen with DefaultTestData { private implicit val angleTolerance: Angle = Radians(1e-10) private implicit val irradiationTolerance: Irradiation = WattHoursPerSquareMeter(1e-10) + private implicit val apparentPowerTolerance: ApparentPower = Kilovoltamperes( + 1e-10 + ) private implicit val powerTolerance: Power = Kilowatts(1e-10) private implicit val reactivePowerTolerance: ReactivePower = Megavars(1e-10) diff --git a/src/test/scala/edu/ie3/simona/model/participant/SystemParticipantSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/SystemParticipantSpec.scala index 0c36be3e9c..02036d6a62 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/SystemParticipantSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/SystemParticipantSpec.scala @@ -15,7 +15,12 @@ import edu.ie3.simona.model.participant.control.QControl import edu.ie3.simona.test.common.UnitSpec import edu.ie3.simona.test.common.model.MockParticipant import edu.ie3.util.scala.OperationInterval -import edu.ie3.util.scala.quantities.{Kilovars, Megavars, ReactivePower} +import edu.ie3.util.scala.quantities.{ + Kilovars, + Kilovoltamperes, + Megavars, + ReactivePower, +} import org.scalatest.matchers.should.Matchers import squants._ import squants.energy._ @@ -52,7 +57,7 @@ class SystemParticipantSpec extends UnitSpec with Matchers { "System participant calculateQ Test", OperationInterval(0L, 86400L), QControl(new CosPhiFixed(varCharacteristicString)), - Kilowatts(200), + Kilovoltamperes(200), 1d, ) val power = Kilowatts(pVal) @@ -92,7 +97,7 @@ class SystemParticipantSpec extends UnitSpec with Matchers { QControl( new CosPhiP(varCharacteristicString) ), - Kilowatts(102), + Kilovoltamperes(102), 1d, ) val power = Kilowatts(pVal) @@ -130,13 +135,12 @@ class SystemParticipantSpec extends UnitSpec with Matchers { QControl( new CosPhiP(varCharacteristicString) ), - Kilowatts(101), + Kilovoltamperes(101), 1d, ) val power = Kilowatts(pVal) val qCalc = loadMock.calculateReactivePower(power, adjustedVoltage) qCalc should approximate(qSol) - } } @@ -146,7 +150,7 @@ class SystemParticipantSpec extends UnitSpec with Matchers { "System participant calculateQ Test", OperationInterval(0L, 86400L), QControl(new QV("qV:{(0.93,-1),(0.97,0),(1,0),(1.03,0),(1.07,1)}")), - Kilowatts(200), + Kilovoltamperes(200), 0.98, ) @@ -177,7 +181,7 @@ class SystemParticipantSpec extends UnitSpec with Matchers { "System participant calculateQ Test", OperationInterval(0L, 86400L), QControl(new QV("qV:{(0.93,-1),(0.97,0),(1,0),(1.03,0),(1.07,1)}")), - Kilowatts(200), + Kilovoltamperes(200), 1d, ) @@ -208,7 +212,7 @@ class SystemParticipantSpec extends UnitSpec with Matchers { "System participant calculateQ Test", OperationInterval(0L, 86400L), QControl(new QV("qV:{(0.93,-1),(0.97,0),(1,0),(1.03,0),(1.07,1)}")), - Kilowatts(200), + Kilovoltamperes(200), 0.95, ) @@ -240,7 +244,7 @@ class SystemParticipantSpec extends UnitSpec with Matchers { "System participant calculateQ Test", OperationInterval(0L, 86400L), QControl(new QV("qV:{(0.93,-1),(0.97,0),(1,0),(1.03,0),(1.07,1)}")), - Kilowatts(200), + Kilovoltamperes(200), 0.95, ) diff --git a/src/test/scala/edu/ie3/simona/model/participant/WecModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/WecModelSpec.scala index 82f69d3b0d..52fbbee023 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/WecModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/WecModelSpec.scala @@ -95,7 +95,7 @@ class WecModelSpec extends UnitSpec with DefaultTestData { wecModel.rotorArea.toSquareMeters shouldBe (typeInput.getRotorArea.toSystemUnit.getValue .doubleValue() +- 1e-5) wecModel.cosPhiRated shouldBe typeInput.getCosPhiRated - wecModel.sRated.toWatts shouldBe (typeInput.getsRated.toSystemUnit.getValue + wecModel.sRated.toVoltamperes shouldBe (typeInput.getsRated.toSystemUnit.getValue .doubleValue() +- 1e-5) wecModel.betzCurve shouldBe WecModel.WecCharacteristic.apply( inputModel.getType.getCpCharacteristic diff --git a/src/test/scala/edu/ie3/simona/model/participant/evcs/EvcsModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/evcs/EvcsModelSpec.scala index 358090b0a3..67d757c55e 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/evcs/EvcsModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/evcs/EvcsModelSpec.scala @@ -188,8 +188,8 @@ class EvcsModelSpec actualEv.uuid shouldBe ev.uuid actualEv.id shouldBe ev.id - actualEv.sRatedAc shouldBe ev.sRatedAc - actualEv.sRatedDc shouldBe ev.sRatedDc + actualEv.pRatedAc shouldBe ev.pRatedAc + actualEv.pRatedDc shouldBe ev.pRatedDc actualEv.eStorage shouldBe ev.eStorage actualEv.storedEnergy should approximate( KilowattHours(expectedStored) @@ -812,7 +812,7 @@ class EvcsModelSpec modelUuid shouldBe evcsModel.getUuid refPower should approximate(Kilowatts(5.0)) // one hour left minPower should approximate(Kilowatts(0d)) // no v2g allowed! - maxPower should approximate(ev1.sRatedAc) + maxPower should approximate(ev1.pRatedAc) } } diff --git a/src/test/scala/edu/ie3/simona/model/participant/evcs/uncontrolled/MaximumPowerChargingSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/evcs/uncontrolled/MaximumPowerChargingSpec.scala index a53b82981e..39f9a52564 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/evcs/uncontrolled/MaximumPowerChargingSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/evcs/uncontrolled/MaximumPowerChargingSpec.scala @@ -85,7 +85,7 @@ class MaximumPowerChargingSpec ScheduleEntry( offset, offset + expectedDuration, - ev.sRatedAc, + ev.pRatedAc, ) ) ) diff --git a/src/test/scala/edu/ie3/simona/model/participant/load/FixedLoadModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/load/FixedLoadModelSpec.scala index 1682d21b0c..6a75bd93e5 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/load/FixedLoadModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/load/FixedLoadModelSpec.scala @@ -16,9 +16,10 @@ import edu.ie3.simona.model.participant.load.LoadReference.{ import edu.ie3.simona.test.common.input.LoadInputTestData import edu.ie3.simona.test.common.{DefaultTestData, UnitSpec} import edu.ie3.util.quantities.PowerSystemUnits +import edu.ie3.util.scala.quantities.Kilovoltamperes import org.scalatest.prop.TableDrivenPropertyChecks import squants.Power -import squants.energy.{KilowattHours, Kilowatts, Watts} +import squants.energy.{KilowattHours, Watts} class FixedLoadModelSpec extends UnitSpec @@ -50,9 +51,9 @@ class FixedLoadModelSpec loadInput.getId, defaultOperationInterval, QControl.apply(loadInput.getqCharacteristics), - Kilowatts( + Kilovoltamperes( loadInput.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue() ), @@ -84,9 +85,9 @@ class FixedLoadModelSpec loadInput.getId, defaultOperationInterval, QControl.apply(loadInput.getqCharacteristics), - Kilowatts( + Kilovoltamperes( loadInput.getsRated - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue() ), @@ -119,7 +120,7 @@ class FixedLoadModelSpec LazyList.iterate(0.0)(_ + 0.1).takeWhile(_ <= 2.0) scales.foreach { scale => - val scaledSRated = Kilowatts( + val scaledSRated = Kilovoltamperes( loadInput.getsRated .to(PowerSystemUnits.KILOWATT) .getValue diff --git a/src/test/scala/edu/ie3/simona/model/participant/load/LoadModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/load/LoadModelSpec.scala index 8d29d36b32..cca01b7904 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/load/LoadModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/load/LoadModelSpec.scala @@ -11,6 +11,7 @@ import edu.ie3.simona.model.participant.load.profile.ProfileLoadModel import edu.ie3.simona.model.participant.load.random.RandomLoadModel import edu.ie3.simona.test.common.UnitSpec import edu.ie3.simona.test.common.input.LoadInputTestData +import edu.ie3.util.scala.quantities.{ApparentPower, Voltamperes} import org.scalatest.PrivateMethodTester import org.scalatest.prop.TableDrivenPropertyChecks import squants.energy.{KilowattHours, Power, Watts} @@ -21,7 +22,7 @@ class LoadModelSpec with PrivateMethodTester with TableDrivenPropertyChecks { - private implicit val powerTolerance: Power = Watts(1e-3) + private implicit val powerTolerance: ApparentPower = Voltamperes(1e-3) "The load model object" should { @@ -32,27 +33,31 @@ class LoadModelSpec ( LoadReference.ActivePower(Watts(268.6)), 1d, - Watts(282.7368), + Voltamperes(282.7368), ), ( LoadReference.EnergyConsumption(KilowattHours(3000.0)), 1d, - Watts(848.2105), + Voltamperes(848.2105), ), ( LoadReference.ActivePower(Watts(268.6)), 1.5d, - Watts(424.1053), + Voltamperes(424.1053), ), ( LoadReference.EnergyConsumption(KilowattHours(3000.0)), 1.5d, - Watts(1272.3158), + Voltamperes(1272.3158), ), ) forAll(params) { - (reference: LoadReference, scaling: Double, expectedSRated: Power) => + ( + reference: LoadReference, + scaling: Double, + expectedSRated: ApparentPower, + ) => { val actual = ProfileLoadModel( loadInput, @@ -91,27 +96,31 @@ class LoadModelSpec ( LoadReference.ActivePower(Watts(268.6)), 1d, - Watts(311.0105), + Voltamperes(311.0105), ), ( LoadReference.EnergyConsumption(KilowattHours(3000.0)), 1d, - Watts(770.8076), + Voltamperes(770.8076), ), ( LoadReference.ActivePower(Watts(268.6)), 1.5d, - Watts(466.5158), + Voltamperes(466.5158), ), ( LoadReference.EnergyConsumption(KilowattHours(3000.0)), 1.5d, - Watts(1156.2114), + Voltamperes(1156.2114), ), ) forAll(params) { - (reference: LoadReference, scaling: Double, expectedSRated: Power) => + ( + reference: LoadReference, + scaling: Double, + expectedSRated: ApparentPower, + ) => { val actual = RandomLoadModel( loadInput, diff --git a/src/test/scala/edu/ie3/simona/model/participant/load/LoadProfileStoreSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/load/LoadProfileStoreSpec.scala index 358da83a31..6b5d7ee5b2 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/load/LoadProfileStoreSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/load/LoadProfileStoreSpec.scala @@ -16,6 +16,7 @@ import edu.ie3.simona.model.participant.load.profile.{ } import edu.ie3.simona.test.common.UnitSpec import edu.ie3.util.TimeUtil +import edu.ie3.util.scala.quantities.Voltamperes import org.scalatest.PrivateMethodTester import org.scalatest.prop.TableDrivenPropertyChecks import squants.energy.{KilowattHours, Watts} diff --git a/src/test/scala/edu/ie3/simona/model/participant/load/ProfileLoadModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/load/ProfileLoadModelSpec.scala index 74077a250b..0cd81c66b5 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/load/ProfileLoadModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/load/ProfileLoadModelSpec.scala @@ -21,8 +21,8 @@ import edu.ie3.simona.model.participant.load.profile.ProfileLoadModel import edu.ie3.simona.test.common.UnitSpec import edu.ie3.util.TimeUtil import edu.ie3.util.quantities.PowerSystemUnits +import edu.ie3.util.scala.quantities.{ApparentPower, Voltamperes} import org.scalatest.prop.TableDrivenPropertyChecks -import squants.Power import squants.energy.{KilowattHours, Watts} import tech.units.indriya.quantity.Quantities @@ -30,7 +30,7 @@ import java.util.UUID class ProfileLoadModelSpec extends UnitSpec with TableDrivenPropertyChecks { - private implicit val tolerance: Power = Watts(1d) + private implicit val tolerance: ApparentPower = Voltamperes(1d) "Having a profile load model" when { val loadInput = @@ -78,38 +78,38 @@ class ProfileLoadModelSpec extends UnitSpec with TableDrivenPropertyChecks { ( BdewStandardLoadProfile.H0, ActivePower(Watts(268.6)), - Watts(282.74d), + Voltamperes(282.74d), ), ( BdewStandardLoadProfile.H0, EnergyConsumption( KilowattHours(3000d) ), - Watts(848.22d), + Voltamperes(848.22d), ), ( BdewStandardLoadProfile.L0, ActivePower(Watts(268.6)), - Watts(282.74d), + Voltamperes(282.74d), ), ( BdewStandardLoadProfile.L0, EnergyConsumption( KilowattHours(3000d) ), - Watts(759.158d), + Voltamperes(759.158d), ), ( BdewStandardLoadProfile.G0, ActivePower(Watts(268.6)), - Watts(282.74d), + Voltamperes(282.74d), ), ( BdewStandardLoadProfile.G0, EnergyConsumption( KilowattHours(3000d) ), - Watts(759.158d), + Voltamperes(759.158d), ), ) ) { (profile, reference, expectedSRated) => diff --git a/src/test/scala/edu/ie3/simona/model/participant/load/RandomLoadModelSpec.scala b/src/test/scala/edu/ie3/simona/model/participant/load/RandomLoadModelSpec.scala index 08457fc4c8..eb57409b0d 100644 --- a/src/test/scala/edu/ie3/simona/model/participant/load/RandomLoadModelSpec.scala +++ b/src/test/scala/edu/ie3/simona/model/participant/load/RandomLoadModelSpec.scala @@ -26,15 +26,19 @@ import edu.ie3.simona.model.participant.load.random.{ import edu.ie3.simona.test.common.UnitSpec import edu.ie3.util.TimeUtil import edu.ie3.util.quantities.PowerSystemUnits +import edu.ie3.util.scala.quantities.{ + ApparentPower, + Kilovoltamperes, + Voltamperes, +} import org.scalatest.prop.TableDrivenPropertyChecks -import squants.Power -import squants.energy.{KilowattHours, Kilowatts, Watts} +import squants.energy.{KilowattHours, Watts} import tech.units.indriya.quantity.Quantities import java.util.UUID class RandomLoadModelSpec extends UnitSpec with TableDrivenPropertyChecks { - implicit val tolerance: Power = Watts(1d) + implicit val tolerance: ApparentPower = Voltamperes(1d) "Having a random load model" when { val loadInput = new LoadInput( @@ -78,11 +82,11 @@ class RandomLoadModelSpec extends UnitSpec with TableDrivenPropertyChecks { val testData = Table( ("reference", "expectedSRated"), - (ActivePower(Watts(268.6)), Watts(311.0105263157895d)), - (EnergyConsumption(KilowattHours(2000d)), Watts(513.871737d)), + (ActivePower(Watts(268.6)), Voltamperes(311.0105263157895d)), + (EnergyConsumption(KilowattHours(2000d)), Voltamperes(513.871737d)), ) - forAll(testData) { (reference, expectedSRated: Power) => + forAll(testData) { (reference, expectedSRated: ApparentPower) => val actual = RandomLoadModel( loadInput, foreSeenOperationInterval, @@ -102,10 +106,10 @@ class RandomLoadModelSpec extends UnitSpec with TableDrivenPropertyChecks { loadInput.getId, foreSeenOperationInterval, QControl.apply(loadInput.getqCharacteristics()), - Kilowatts( + Kilovoltamperes( loadInput .getsRated() - .to(PowerSystemUnits.KILOWATT) + .to(PowerSystemUnits.KILOVOLTAMPERE) .getValue .doubleValue() ), diff --git a/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSpec.scala b/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSpec.scala index db7e9abdea..c08f189b79 100644 --- a/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSpec.scala +++ b/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSpec.scala @@ -105,6 +105,32 @@ class PrimaryServiceWorkerSpec } } + "fail to init, if time series ends with delay before simulation start" in { + val initData = validInitData.copy( + simulationStart = validInitData.simulationStart.plusHours(1) + ) + + service.init(initData) match { + case Failure(exception) => + exception.getMessage shouldBe "No appropriate data found within simulation time range in timeseries '9185b8c1-86ba-4a16-8dea-5ac898e8caa5'!" + case Success(_) => + fail("Initialisation with unsupported init data is meant to fail.") + } + } + + "fail to init, if time series starts with delay after simulation start" in { + val initData = validInitData.copy( + simulationStart = validInitData.simulationStart.minusHours(1) + ) + + service.init(initData) match { + case Failure(exception) => + exception.getMessage shouldBe "The data for the timeseries '9185b8c1-86ba-4a16-8dea-5ac898e8caa5' starts after the start of this simulation (tick: 3600)! This is not allowed!" + case Success(_) => + fail("Initialisation with unsupported init data is meant to fail.") + } + } + "fail, if pointed to the wrong file" in { // time series exists, but is malformed val tsUuid = UUID.fromString("3fbfaa97-cff4-46d4-95ba-a95665e87c27") diff --git a/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSqlIT.scala b/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSqlIT.scala index 2b7023daa3..9a50b4fce9 100644 --- a/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSqlIT.scala +++ b/src/test/scala/edu/ie3/simona/service/primary/PrimaryServiceWorkerSqlIT.scala @@ -15,7 +15,7 @@ import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy import edu.ie3.datamodel.models.value.{HeatAndSValue, PValue} import edu.ie3.simona.agent.participant.data.Data.PrimaryData.{ ActivePower, - ApparentPowerAndHeat, + ComplexPowerAndHeat, } import edu.ie3.simona.config.SimonaConfig.Simona.Input.Primary.SqlParams import edu.ie3.simona.ontology.messages.Activation @@ -107,7 +107,7 @@ class PrimaryServiceWorkerSqlIT ), uuidPqh, 0L, - ApparentPowerAndHeat( + ComplexPowerAndHeat( Kilowatts(1000.0), Kilovars(329.0), Kilowatts(8000.0), diff --git a/src/test/scala/edu/ie3/simona/sim/SimonaSimSpec.scala b/src/test/scala/edu/ie3/simona/sim/SimonaSimSpec.scala index 63be126c0f..9d1140be17 100644 --- a/src/test/scala/edu/ie3/simona/sim/SimonaSimSpec.scala +++ b/src/test/scala/edu/ie3/simona/sim/SimonaSimSpec.scala @@ -34,6 +34,7 @@ import org.apache.pekko.actor.typed.scaladsl.{ActorContext, Behaviors} import org.apache.pekko.actor.typed.{ActorRef, Behavior} import org.apache.pekko.actor.{ActorRef => ClassicRef} +import java.nio.file.Path import java.util.UUID class SimonaSimSpec extends ScalaTestWithActorTestKit with UnitSpec { @@ -398,7 +399,7 @@ object SimonaSimSpec { override val args: Array[String] = Array.empty[String] - override def logOutputDir: String = throw new NotImplementedError() + override def logOutputDir: Path = throw new NotImplementedError() override def runtimeEventListener( context: ActorContext[_] diff --git a/src/test/scala/edu/ie3/simona/sim/setup/SimonaSetupSpec.scala b/src/test/scala/edu/ie3/simona/sim/setup/SimonaSetupSpec.scala index 7fa3ab3469..0428ed765b 100644 --- a/src/test/scala/edu/ie3/simona/sim/setup/SimonaSetupSpec.scala +++ b/src/test/scala/edu/ie3/simona/sim/setup/SimonaSetupSpec.scala @@ -26,13 +26,14 @@ import org.apache.pekko.actor.typed.ActorRef import org.apache.pekko.actor.typed.scaladsl.ActorContext import org.apache.pekko.actor.{ActorRef => ClassicRef} +import java.nio.file.Path import java.util.UUID class SimonaSetupSpec extends UnitSpec with SimonaSetup with SubGridGateMokka { override val args: Array[String] = Array.empty[String] - override def logOutputDir: String = throw new NotImplementedError() + override def logOutputDir: Path = throw new NotImplementedError() override def runtimeEventListener( context: ActorContext[_] diff --git a/src/test/scala/edu/ie3/simona/test/common/input/HpInputTestData.scala b/src/test/scala/edu/ie3/simona/test/common/input/HpInputTestData.scala index 9aeb2c7453..722ec37659 100644 --- a/src/test/scala/edu/ie3/simona/test/common/input/HpInputTestData.scala +++ b/src/test/scala/edu/ie3/simona/test/common/input/HpInputTestData.scala @@ -26,6 +26,7 @@ import edu.ie3.simona.model.thermal._ import edu.ie3.simona.test.common.DefaultTestData import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.scala.OperationInterval +import edu.ie3.util.scala.quantities.Kilovoltamperes import squants.energy.{KilowattHours, Kilowatts} import squants.thermal.Celsius import squants.{Power, Temperature} @@ -67,7 +68,7 @@ trait HpInputTestData "HpModel", OperationInterval.apply(0L, 86400L), QControl.CosPhiFixed(0.95), - Kilowatts(100d), + Kilovoltamperes(100d), 0.95, Kilowatts(15d), thermalGrid, diff --git a/src/test/scala/edu/ie3/simona/test/common/model/MockParticipant.scala b/src/test/scala/edu/ie3/simona/test/common/model/MockParticipant.scala index ad407dbfb4..fdd518cb4b 100644 --- a/src/test/scala/edu/ie3/simona/test/common/model/MockParticipant.scala +++ b/src/test/scala/edu/ie3/simona/test/common/model/MockParticipant.scala @@ -16,6 +16,7 @@ import edu.ie3.simona.model.participant.{ } import edu.ie3.simona.ontology.messages.flex.FlexibilityMessage import edu.ie3.util.scala.OperationInterval +import edu.ie3.util.scala.quantities.ApparentPower import squants.Dimensionless import squants.energy._ @@ -26,11 +27,11 @@ class MockParticipant( id: String, operationInterval: OperationInterval, qControl: QControl, - sRated: Power, + sRated: ApparentPower, cosPhiRated: Double, ) extends SystemParticipant[ CalcRelevantData, - Data.PrimaryData.ApparentPower, + Data.PrimaryData.ComplexPower, ModelState, ]( uuid, @@ -46,7 +47,7 @@ class MockParticipant( voltage: Dimensionless, state: ModelState, data: CalcRelevantData, - ): Data.PrimaryData.ApparentPower = { + ): Data.PrimaryData.ComplexPower = { super.calculateApparentPower(tick, voltage, state, data) }