summaryrefslogtreecommitdiff
path: root/opendc-simulator/opendc-simulator-compute/src/main
diff options
context:
space:
mode:
authorHongyu He <hongyuhe.cs@googlemail.com>2021-06-14 12:53:10 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-06-14 12:53:10 +0200
commitb5826e9dcf4a6b510d26168ba02b1781b3b6c521 (patch)
tree913777f9e7c0008abaaf18445932583e4b01c972 /opendc-simulator/opendc-simulator-compute/src/main
parent885137dd79f76a63aee1bcaecbc0c9e9dec80d3a (diff)
simulator: Add model for PSU power loss
This change introduces power loss to the PSU component.
Diffstat (limited to 'opendc-simulator/opendc-simulator-compute/src/main')
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt18
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimPsu.kt58
2 files changed, 53 insertions, 23 deletions
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt
index 45d15692..7f416010 100644
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt
+++ b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt
@@ -36,12 +36,14 @@ import org.opendc.simulator.resources.SimResourceInterpreter
* @param interpreter The [SimResourceInterpreter] to drive the simulation.
* @param model The machine model to simulate.
* @param powerDriver The power driver to use.
+ * @param psu The power supply of the machine.
* @param parent The parent simulation system.
*/
public class SimBareMetalMachine(
interpreter: SimResourceInterpreter,
model: SimMachineModel,
powerDriver: PowerDriver,
+ public val psu: SimPsu = SimPsu(500.0, mapOf(1.0 to 1.0)),
parent: SimResourceSystem? = null,
) : SimAbstractMachine(interpreter, parent, model) {
/**
@@ -51,23 +53,15 @@ public class SimBareMetalMachine(
Cpu(SimResourceSource(cpu.frequency, interpreter, this@SimBareMetalMachine), cpu)
}
- /**
- * The power supply of this bare-metal machine.
- */
- public val psu: SimPsu = object : SimPsu() {
- /**
- * The logic for the CPU power driver.
- */
- private val cpuLogic = powerDriver.createLogic(this@SimBareMetalMachine, cpus)
-
- override fun computePower(): Double = cpuLogic.computePower()
- }
-
override fun updateUsage(usage: Double) {
super.updateUsage(usage)
psu.update()
}
+ init {
+ psu.connect(powerDriver.createLogic(this, cpus))
+ }
+
/**
* A [SimProcessingUnit] of a bare-metal machine.
*/
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimPsu.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimPsu.kt
index 8837eff3..4ddad1c9 100644
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimPsu.kt
+++ b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimPsu.kt
@@ -22,16 +22,24 @@
package org.opendc.simulator.compute
+import org.opendc.simulator.compute.power.PowerDriver
import org.opendc.simulator.power.SimPowerInlet
import org.opendc.simulator.resources.SimResourceCommand
import org.opendc.simulator.resources.SimResourceConsumer
import org.opendc.simulator.resources.SimResourceContext
import org.opendc.simulator.resources.SimResourceEvent
+import java.util.*
/**
* A power supply of a [SimBareMetalMachine].
+ *
+ * @param ratedOutputPower The rated output power of the PSU.
+ * @param energyEfficiency The energy efficiency of the PSU for various power draws.
*/
-public abstract class SimPsu : SimPowerInlet() {
+public class SimPsu(
+ private val ratedOutputPower: Double,
+ energyEfficiency: Map<Double, Double>,
+) : SimPowerInlet() {
/**
* The power draw of the machine at this instant.
*/
@@ -40,13 +48,44 @@ public abstract class SimPsu : SimPowerInlet() {
private var _powerDraw = 0.0
/**
+ * The energy efficiency of the PSU at various power draws.
+ */
+ private val energyEfficiency = TreeMap(energyEfficiency)
+
+ /**
* The consumer context.
*/
private var _ctx: SimResourceContext? = null
+ /**
+ * The driver that is connected to the PSU.
+ */
+ private var _driver: PowerDriver.Logic? = null
+
+ init {
+ require(energyEfficiency.isNotEmpty()) { "Must specify at least one entry for energy efficiency of PSU" }
+ }
+
+ /**
+ * Update the power draw of the PSU.
+ */
+ public fun update() {
+ _ctx?.interrupt()
+ }
+
+ /**
+ * Connect the specified [PowerDriver.Logic] to this PSU.
+ */
+ public fun connect(driver: PowerDriver.Logic) {
+ check(_driver == null) { "PSU already connected" }
+ _driver = driver
+ update()
+ }
+
override fun createConsumer(): SimResourceConsumer = object : SimResourceConsumer {
override fun onNext(ctx: SimResourceContext): SimResourceCommand {
- val powerDraw = _powerDraw
+ val powerDraw = computePowerDraw(_driver?.computePower() ?: 0.0)
+
return if (powerDraw > 0.0)
SimResourceCommand.Consume(Double.POSITIVE_INFINITY, powerDraw, Long.MAX_VALUE)
else
@@ -56,6 +95,7 @@ public abstract class SimPsu : SimPowerInlet() {
override fun onEvent(ctx: SimResourceContext, event: SimResourceEvent) {
when (event) {
SimResourceEvent.Start -> _ctx = ctx
+ SimResourceEvent.Run -> _powerDraw = ctx.speed
SimResourceEvent.Exit -> _ctx = null
else -> {}
}
@@ -63,17 +103,13 @@ public abstract class SimPsu : SimPowerInlet() {
}
/**
- * Update the power draw of the PSU.
+ * Compute the power draw of the PSU including the power loss.
*/
- public fun update() {
- _powerDraw = computePower()
- _ctx?.interrupt()
+ private fun computePowerDraw(load: Double): Double {
+ val loadPercentage = (load / ratedOutputPower).coerceIn(0.0, 1.0)
+ val efficiency = energyEfficiency.ceilingEntry(loadPercentage)?.value ?: 1.0
+ return load / efficiency
}
- /**
- * Compute the power draw of the PSU.
- */
- protected abstract fun computePower(): Double
-
override fun toString(): String = "SimPsu[draw=$_powerDraw]"
}