From 9cd41fdc02a44258736793658543a42dbd623e1e Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 3 Dec 2020 16:57:14 +0100
Subject: [PATCH] bugfix in supercap: calculation of max discharge power,
 ensure initial soc is higher than min soc, fix in powertrain builder
 calculating aux buffer in case of supercap

---
 .../VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs   | 6 ++++++
 .../VectoCore/Models/SimulationComponent/Impl/SuperCap.cs   | 6 +++---
 .../Models/SimulationComponent/Strategies/HybridStrategy.cs | 6 +++---
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
index 8cc4e89534..30a70b1a2f 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
@@ -370,12 +370,18 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			var es = new ElectricSystem(container);
 
 			if (data.BatteryData != null) {
+				if (data.BatteryData.InitialSoC < data.BatteryData.MinSOC) {
+					throw new VectoException("Battery: Initial SoC has to be higher than min SoC");
+				}
 				var battery = new Battery(container, data.BatteryData);
 				battery.Initialize(data.BatteryData.InitialSoC);
 				es.Connect(battery);
 			}
 
 			if (data.SuperCapData != null) {
+				if (data.SuperCapData.InitialSoC < data.SuperCapData.MinVoltage / data.SuperCapData.MaxVoltage) {
+					throw new VectoException("SuperCap: Initial SoC has to be higher than min SoC");
+				}
 				var superCap = new SuperCap(container, data.SuperCapData);
 				superCap.Initialize(data.SuperCapData.InitialSoC);
 				es.Connect(superCap);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs
index 621be6e2a4..e839aec156 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -57,7 +58,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var maxDischargePower = InternalVoltage * maxDischargeCurrent +
 									maxDischargeCurrent * ModelData.InternalResistance * maxDischargeCurrent;
 			var maxPower = -InternalVoltage / (4 * ModelData.InternalResistance) * InternalVoltage;
-			return VectoMath.Max(maxDischargePower > 0 ? -double.MaxValue.SI<Watt>():maxDischargePower, maxPower);
+			return VectoMath.Max(maxDischargePower, maxPower);
 		}
 
 		public double MinSoC
@@ -71,8 +72,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public void Initialize(double initialSoC)
 		{
-			PreviousState.Charge = ModelData.Capacity * ((ModelData.MaxVoltage - ModelData.MinVoltage) *  initialSoC +
-						ModelData.MinVoltage);
+			PreviousState.Charge = ModelData.Capacity * (ModelData.MaxVoltage *  initialSoC );
 
 		}
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
index f4a0c0efa6..e790d82f2d 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
@@ -360,7 +360,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 			var auxEnergyReserve = ModelData.ElectricAuxDemand * StrategyParameters.AuxReserveTime;
 			BatteryDischargeEnergyThreshold = 0.SI<WattSecond>();
 			if (auxEnergyReserve > 0) {
-				var minSoc = Math.Max(ModelData.BatteryData?.MinSOC ?? ModelData.SuperCapData.InitialSoC,
+				var minSoc = Math.Max(ModelData.BatteryData?.MinSOC ?? ModelData.SuperCapData.MinVoltage / ModelData.SuperCapData.MaxVoltage,
 					StrategyParameters.MinSoC);
 				BatteryDischargeEnergyThreshold =
 					ModelData.BatteryData.Capacity * minSoc * ModelData.BatteryData.SOCMap.Lookup(minSoc) +
@@ -985,8 +985,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				ShiftRequired = best.Gear.Engaged && !best.Gear.Equals(currentGear), //  gs?.Item1 ?? false,
 				NextGear = best.Gear, // gs?.Item2 ?? 0,
 				EvaluatedSolution = best,
-                SimulationInterval = best.SimulationInterval
-            };
+				SimulationInterval = best.SimulationInterval
+			};
 			//var pos = retVal.MechanicalAssistPower.Keys.First();
 			//if (retVal.MechanicalAssistPower[pos].Item1 == null) {
 			//	retVal.MechanicalAssistPower[pos] = Tuple.Create(best.Response.ElectricMotor.AngularVelocity, retVal.MechanicalAssistPower[pos].Item2);
-- 
GitLab