diff options
| author | Hongyu He <hongyuhe.cs@googlemail.com> | 2021-06-14 12:53:10 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-06-14 12:53:10 +0200 |
| commit | b5826e9dcf4a6b510d26168ba02b1781b3b6c521 (patch) | |
| tree | 913777f9e7c0008abaaf18445932583e4b01c972 /opendc-simulator/opendc-simulator-compute/src/main | |
| parent | 885137dd79f76a63aee1bcaecbc0c9e9dec80d3a (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')
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]" } |
