Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 7621f8ac authored by Michael KRISPER's avatar Michael KRISPER
Browse files

sumwriter refactoring: extracted methods for calculations

parent 4337a1ac
No related branches found
No related tags found
No related merge requests found
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Data; using System.Data;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Utils; using TUGraz.VectoCore.Utils;
...@@ -47,7 +43,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -47,7 +43,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
private const string ERETARDER = "Eretarder [kWh]"; private const string ERETARDER = "Eretarder [kWh]";
private const string MASS = "Mass [kg]"; private const string MASS = "Mass [kg]";
private const string LOADING = "Loading [kg]"; private const string LOADING = "Loading [kg]";
private const string A = "a [m/s^2]"; private const string ACCELERATIONS = "a [m/s^2]";
private const string APOS = "a_pos [m/s^2]"; private const string APOS = "a_pos [m/s^2]";
private const string ANEG = "a_neg [m/s^2]"; private const string ANEG = "a_neg [m/s^2]";
private const string PACC = "pAcc [%]"; private const string PACC = "pAcc [%]";
...@@ -87,7 +83,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -87,7 +83,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
_table.Columns.AddRange(new[] { _table.Columns.AddRange(new[] {
TIME, DISTANCE, SPEED, ALTITUDE, PPOS, PNEG, FCMAP, FCMAPKM, FCAUXC, FCAUXCKM, FCWHTCC, FCWHTCCKM, PWHEELPOS, PBRAKE, TIME, DISTANCE, SPEED, ALTITUDE, PPOS, PNEG, FCMAP, FCMAPKM, FCAUXC, FCAUXCKM, FCWHTCC, FCWHTCCKM, PWHEELPOS, PBRAKE,
EPOSICE, ENEGICE, EAIR, EROLL, EGRAD, EACC, EAUX, EBRAKE, ETRANSM, ERETARDER, MASS, LOADING, A, APOS, ANEG, PACC, EPOSICE, ENEGICE, EAIR, EROLL, EGRAD, EACC, EAUX, EBRAKE, ETRANSM, ERETARDER, MASS, LOADING, ACCELERATIONS, APOS,
ANEG, PACC,
PDEC, PCRUISE, PSTOP, ETORQUECONV, CO2, CO2T, FCFINAL, FCFINAL_LITER, FCFINAL_LITERPER100TKM, ACCNOISE PDEC, PCRUISE, PSTOP, ETORQUECONV, CO2, CO2T, FCFINAL, FCFINAL_LITER, FCFINAL_LITERPER100TKM, ACCNOISE
}.Select(x => new DataColumn(x, typeof(SI))).ToArray()); }.Select(x => new DataColumn(x, typeof(SI))).ToArray());
} }
...@@ -100,94 +97,50 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -100,94 +97,50 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
row[INPUTFILE] = jobFileName; row[INPUTFILE] = jobFileName;
row[CYCLE] = cycleFileName; row[CYCLE] = cycleFileName;
row[STATUS] = data.RunStatus; row[STATUS] = data.RunStatus;
row[TIME] = data.GetValues<SI>(ModalResultField.time).Max(); row[TIME] = Duration(data);
row[PPOS] = data.GetValues<SI>(ModalResultField.Pe_eng).Where(x => x > 0).Average(); row[PPOS] = Ppos(data);
row[PNEG] = data.GetValues<SI>(ModalResultField.Pe_eng).Where(x => x < 0).Average(); row[PNEG] = Pneg(data);
row[FCMAP] = data.GetValues<SI>(ModalResultField.FCMap).Average(); row[FCMAP] = FuelConsumption(data);
row[FCAUXC] = data.GetValues<SI>(ModalResultField.FCAUXc).Average(); row[FCAUXC] = FuelConsumptionAuxStartStopCorrected(data);
row[FCWHTCC] = data.GetValues<SI>(ModalResultField.FCWHTCc).Average(); row[FCWHTCC] = FuelConsumptionWHTCCorrected(data);
WriteAuxiliaries(data, row); WriteAuxiliaries(data, row);
_table.Rows.Add(row); _table.Rows.Add(row);
} }
[MethodImpl(MethodImplOptions.Synchronized)]
private void WriteAuxiliaries(IModalDataWriter data, DataRow row)
{
var simulationInterval = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
_auxColumns = _auxColumns.Union(data.Auxiliaries.Select(kv => "Eaux_" + kv.Key + " [kWh]")).ToList();
var sum = 0.SI().Kilo.Watt.Hour.ConvertTo().Kilo.Watt.Hour;
foreach (var aux in data.Auxiliaries) {
var colName = "Eaux_" + aux.Key + " [kWh]";
if (!_table.Columns.Contains(colName)) {
_table.Columns.Add(colName, typeof(SI));
}
var currentSum = data.GetValues<Watt>(aux.Value)
.Zip(simulationInterval, (P, dt) => P.ConvertTo().Kilo.Watt * dt.ConvertTo().Hour)
.Sum();
row[colName] = currentSum;
sum += currentSum;
}
row[EAUX] = sum;
}
protected internal void WriteFullPowertrain(IModalDataWriter data, string jobFileName, string jobName, protected internal void WriteFullPowertrain(IModalDataWriter data, string jobFileName, string jobName,
string cycleFileName, Kilogram vehicleMass, Kilogram vehicleLoading) string cycleFileName, Kilogram vehicleMass, Kilogram vehicleLoading)
{ {
_engineOnly = false; _engineOnly = false;
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
var time = data.Max(ModalResultField.time) - data.Min(ModalResultField.time);
var distance = data.Max(ModalResultField.dist) - data.Min(ModalResultField.dist);
var totalFuelConsumption = TimeIntegralFuelConsumption(ModalResultField.FCMap, data, simulationIntervals);
var row = _table.NewRow(); var row = _table.NewRow();
row[JOB] = jobName; row[JOB] = jobName;
row[INPUTFILE] = jobFileName; row[INPUTFILE] = jobFileName;
row[CYCLE] = cycleFileName; row[CYCLE] = cycleFileName;
row[STATUS] = data.RunStatus; row[STATUS] = data.RunStatus;
row[TIME] = time; //data.Max(ModalResultField.time).DefaultIfNull(); row[TIME] = Duration(data);
row[DISTANCE] = distance.ConvertTo().Kilo.Meter; //data.Max(ModalResultField.dist).DefaultIfNull(); row[DISTANCE] = Distance(data);
row[SPEED] = (distance / time).ConvertTo().Kilo.Meter.Per.Hour; row[SPEED] = Speed(data);
row[PPOS] = data.Average(ModalResultField.Pe_eng, x => x > 0).DefaultIfNull(); row[PPOS] = Ppos(data);
row[PNEG] = data.Average(ModalResultField.Pe_eng, x => x < 0).DefaultIfNull(); row[PNEG] = Pneg(data);
row[FCMAP] = (totalFuelConsumption / time).ConvertTo().Gramm.Per.Hour; row[FCMAP] = FuelConsumption(data);
row[FCMAPKM] = (totalFuelConsumption / distance).ConvertTo().Gramm.Per.Kilo.Meter; row[FCMAPKM] = FuelConsumptionPerKilometer(data);
// data.Average(ModalResultField.FCMap).DefaultIfNull(); row[FCAUXC] = FuelConsumptionAuxStartStopCorrected(data);
row[FCAUXC] = data.Average(ModalResultField.FCAUXc).DefaultIfNull(); row[FCWHTCC] = FuelConsumptionWHTCCorrected(data);
row[FCWHTCC] = data.Average(ModalResultField.FCWHTCc).DefaultIfNull(); row[PBRAKE] = PowerBrake(data);
row[PBRAKE] = data.Average(ModalResultField.Pbrake).DefaultIfNull(); row[EPOSICE] = WorkEnginePositive(data);
row[EPOSICE] = data.Average(ModalResultField.Pe_eng, x => x > 0).DefaultIfNull(); row[ENEGICE] = WorkEngineNegative(data);
row[ENEGICE] = data.Average(ModalResultField.Pe_eng, x => x < 0).DefaultIfNull(); row[EAIR] = WorkAirResistance(data);
row[EAIR] = TimeIntegralPower(ModalResultField.Pair, data, simulationIntervals).DefaultIfNull(); row[EROLL] = WorkRollingResistance(data);
row[EROLL] = TimeIntegralPower(ModalResultField.Proll, data, simulationIntervals).DefaultIfNull(); row[EGRAD] = WorkRoadGradientResistance(data);
row[EGRAD] = TimeIntegralPower(ModalResultField.Pgrad, data, simulationIntervals).DefaultIfNull(); row[EAUX] = WorkAuxiliaries(data);
row[EAUX] = TimeIntegralPower(ModalResultField.Paux, data, simulationIntervals).DefaultIfNull(); row[EBRAKE] = WorkTotalMechanicalBrake(data);
row[EBRAKE] = TimeIntegralPower(ModalResultField.Pbrake, data, simulationIntervals).DefaultIfNull(); row[ETRANSM] = WorkTransmission(data);
row[ERETARDER] = PowerLossRetarder(data);
var plossdiff = TimeIntegralPower(ModalResultField.PlossDiff, data, simulationIntervals).DefaultIfNull(); row[EACC] = PowerAccelerations(data);
var plossgb = TimeIntegralPower(ModalResultField.PlossGB, data, simulationIntervals).DefaultIfNull(); row[ALTITUDE] = AltitudeDelta(data);
if ((plossdiff ?? plossgb) != null) {
// row[ETRANSM] = (plossdiff ?? 0.SI().Watt.Second.ConvertTo().Watt.Hour) +
// (plossgb ?? 0.SI().Watt.Second.ConvertTo().Watt.Hour);
}
row[ERETARDER] = TimeIntegralPower(ModalResultField.PlossRetarder, data, simulationIntervals).DefaultIfNull();
var paeng = data.Sum(ModalResultField.PaEng);
var pagb = data.Sum(ModalResultField.PaGB);
if ((paeng ?? pagb) != null) {
row[EACC] = paeng ?? 0.SI() + pagb ?? 0.SI();
}
row[ALTITUDE] = data.GetValues<SI>(ModalResultField.altitude).Last() -
data.GetValues<SI>(ModalResultField.altitude).First();
WriteAuxiliaries(data, row); WriteAuxiliaries(data, row);
...@@ -199,29 +152,224 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -199,29 +152,224 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
row[LOADING] = vehicleLoading; row[LOADING] = vehicleLoading;
} }
var dtValues = data.GetValues<SI>(ModalResultField.simulationInterval).Cast<Second>().ToList(); row[ACCELERATIONS] = AverageAccelerations(data);
var accValues = data.GetValues<SI>(ModalResultField.acc).Cast<MeterPerSquareSecond>(); row[APOS] = AverageAccelerationsPositive(data);
var accelerations = CalculateAverageOverSeconds(dtValues, accValues).ToList(); row[ANEG] = AverageAccelerationsNegative(data);
if (accelerations.Any()) { row[PACC] = PercentAccelerationTime(data);
row[A] = accelerations.Average(); row[PDEC] = PercentDecelerationTime(data);
} row[PCRUISE] = PercentCruiseTime(data);
row[PSTOP] = PercentStopTime(data);
var acceleration3SecondAverage = Calculate3SecondAverage(accelerations).ToList(); _table.Rows.Add(row);
if (acceleration3SecondAverage.Any()) { }
row[APOS] = acceleration3SecondAverage.Average(x => x > 0.125).DefaultIfNull();
row[ANEG] = acceleration3SecondAverage.Average(x => x < -0.125).DefaultIfNull(); private static object AverageAccelerationsPositive(IModalDataWriter data)
row[PACC] = 100.SI() * acceleration3SecondAverage.Count(x => x > 0.125) / acceleration3SecondAverage.Count; {
row[PDEC] = 100.SI() * acceleration3SecondAverage.Count(x => x < -0.125) / acceleration3SecondAverage.Count; var acceleration3SecondAverage = Calculate3SecondAverage(Accelerations(data));
row[PCRUISE] = 100.SI() * acceleration3SecondAverage.Count(x => x < 0.125 && x > -0.125) / return acceleration3SecondAverage.Average(x => x > 0.125).DefaultIfNull();
acceleration3SecondAverage.Count; }
}
private static object AverageAccelerationsNegative(IModalDataWriter data)
{
var acceleration3SecondAverage = Calculate3SecondAverage(Accelerations(data));
return acceleration3SecondAverage.Average(x => x < -0.125).DefaultIfNull();
}
private static object PercentAccelerationTime(IModalDataWriter data)
{
var acceleration3SecondAverage = Calculate3SecondAverage(Accelerations(data)).ToList();
return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x > 0.125) / acceleration3SecondAverage.Count;
}
private static object PercentDecelerationTime(IModalDataWriter data)
{
var acceleration3SecondAverage = Calculate3SecondAverage(Accelerations(data)).ToList();
return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x < -0.125) / acceleration3SecondAverage.Count;
}
private static object PercentCruiseTime(IModalDataWriter data)
{
var acceleration3SecondAverage = Calculate3SecondAverage(Accelerations(data)).ToList();
return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x < 0.125 && x > -0.125) /
acceleration3SecondAverage.Count;
}
private static SI PercentStopTime(IModalDataWriter data)
{
var acceleration3SecondAverage = Calculate3SecondAverage(Accelerations(data));
if (acceleration3SecondAverage.Any()) {}
var pStopTime = data.GetValues<SI>(ModalResultField.v_act) var pStopTime = data.GetValues<SI>(ModalResultField.v_act)
.Zip(dtValues, (velocity, dt) => new { velocity, dt }) .Zip(SimulationIntervals(data), (velocity, dt) => new { velocity, dt })
.Where(x => x.velocity < 0.1) .Where(x => x.velocity < 0.1)
.Sum(x => x.dt.Value()); .Sum(x => x.dt.Value());
row[PSTOP] = 100 * pStopTime / dtValues.Sum(); return 100 * pStopTime / SimulationIntervals(data).Sum();
}
_table.Rows.Add(row); private static SI AverageAccelerations(IModalDataWriter data)
{
return Accelerations(data).Average();
}
private static List<SI> Accelerations(IModalDataWriter data)
{
var accValues = data.GetValues<SI>(ModalResultField.acc).Cast<MeterPerSquareSecond>();
var accelerations = CalculateAverageOverSeconds(SimulationIntervals(data), accValues).ToList();
return accelerations;
}
private static Second[] SimulationIntervals(IModalDataWriter data)
{
return data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
}
private static SI AltitudeDelta(IModalDataWriter data)
{
return data.GetValues<SI>(ModalResultField.altitude).Last() -
data.GetValues<SI>(ModalResultField.altitude).First();
}
private static SI PowerAccelerations(IModalDataWriter data)
{
var zero = 0.SI<Watt>();
var paeng = data.Sum(ModalResultField.PaEng) ?? zero;
var pagb = data.Sum(ModalResultField.PaGB) ?? zero;
return paeng + pagb;
}
private static SI WorkTransmission(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
var plossdiff = TimeIntegralPower(ModalResultField.PlossGB, data, simulationIntervals);
var plossgb = TimeIntegralPower(ModalResultField.PlossDiff, data, simulationIntervals);
return plossdiff + plossgb;
}
private static object PowerLossRetarder(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return TimeIntegralPower(ModalResultField.PlossRetarder, data, simulationIntervals).DefaultIfNull();
}
private static SI Duration(IModalDataWriter data)
{
return data.Max(ModalResultField.time) - data.Min(ModalResultField.time);
}
private static SI Distance(IModalDataWriter data)
{
return data.Max(ModalResultField.dist) - data.Min(ModalResultField.dist);
}
private static object WorkTotalMechanicalBrake(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return TimeIntegralPower(ModalResultField.Pbrake, data, simulationIntervals).DefaultIfNull();
}
private static object WorkAuxiliaries(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return TimeIntegralPower(ModalResultField.Paux, data, simulationIntervals).DefaultIfNull();
}
private static object WorkRoadGradientResistance(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return TimeIntegralPower(ModalResultField.Pgrad, data, simulationIntervals).DefaultIfNull();
}
private static object WorkRollingResistance(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return TimeIntegralPower(ModalResultField.Proll, data, simulationIntervals).DefaultIfNull();
}
private static object WorkAirResistance(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return TimeIntegralPower(ModalResultField.Pair, data, simulationIntervals).DefaultIfNull();
}
private static object WorkEngineNegative(IModalDataWriter data)
{
return data.Average(ModalResultField.Pe_eng, x => x < 0).DefaultIfNull();
}
private static object WorkEnginePositive(IModalDataWriter data)
{
return data.Average(ModalResultField.Pe_eng, x => x > 0).DefaultIfNull();
}
private static object PowerBrake(IModalDataWriter data)
{
return data.Average(ModalResultField.Pbrake).DefaultIfNull();
}
private static object FuelConsumptionWHTCCorrected(IModalDataWriter data)
{
return data.Average(ModalResultField.FCWHTCc).DefaultIfNull();
}
private static object FuelConsumptionAuxStartStopCorrected(IModalDataWriter data)
{
return data.Average(ModalResultField.FCAUXc).DefaultIfNull();
}
private static SI FuelConsumption(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return
(TimeIntegralFuelConsumption(ModalResultField.FCMap, data, simulationIntervals) / Duration(data)).ConvertTo()
.Gramm.Per.Hour;
}
private static SI FuelConsumptionPerKilometer(IModalDataWriter data)
{
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
return
(TimeIntegralFuelConsumption(ModalResultField.FCMap, data, simulationIntervals) / Distance(data)).ConvertTo()
.Gramm.Per.Kilo.Meter;
}
private static object Pneg(IModalDataWriter data)
{
return data.Average(ModalResultField.Pe_eng, x => x < 0).DefaultIfNull();
}
private static object Ppos(IModalDataWriter data)
{
return data.Average(ModalResultField.Pe_eng, x => x > 0).DefaultIfNull();
}
private static SI Speed(IModalDataWriter data)
{
return (Distance(data) / Duration(data)).ConvertTo().Kilo.Meter.Per.Hour;
}
[MethodImpl(MethodImplOptions.Synchronized)]
private void WriteAuxiliaries(IModalDataWriter data, DataRow row)
{
var simulationInterval = data.GetValues<Second>(ModalResultField.simulationInterval).ToArray();
_auxColumns = _auxColumns.Union(data.Auxiliaries.Select(kv => "Eaux_" + kv.Key + " [kWh]")).ToList();
var sum = 0.SI().Kilo.Watt.Hour.ConvertTo().Kilo.Watt.Hour;
foreach (var aux in data.Auxiliaries) {
var colName = "Eaux_" + aux.Key + " [kWh]";
if (!_table.Columns.Contains(colName)) {
_table.Columns.Add(colName, typeof(SI));
}
var currentSum = data.GetValues<Watt>(aux.Value)
.Zip(simulationInterval, (P, dt) => P.ConvertTo().Kilo.Watt * dt.ConvertTo().Hour)
.Sum();
row[colName] = currentSum;
sum += currentSum;
}
row[EAUX] = sum;
} }
protected static SI TimeIntegralPower(ModalResultField field, IModalDataWriter data, protected static SI TimeIntegralPower(ModalResultField field, IModalDataWriter data,
...@@ -296,7 +444,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -296,7 +444,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
dataColumns.AddRange(new[] { dataColumns.AddRange(new[] {
PPOS, PNEG, FCMAP, FCMAPKM, FCAUXC, FCAUXCKM, FCWHTCC, FCWHTCCKM, CO2, CO2T, FCFINAL, FCFINAL_LITERPER100TKM, PPOS, PNEG, FCMAP, FCMAPKM, FCAUXC, FCAUXCKM, FCWHTCC, FCWHTCCKM, CO2, CO2T, FCFINAL, FCFINAL_LITERPER100TKM,
FCFINAL_LITER, PWHEELPOS, PBRAKE, EPOSICE, ENEGICE, EAIR, EROLL, EGRAD, EACC, EAUX, EBRAKE, ETRANSM, FCFINAL_LITER, PWHEELPOS, PBRAKE, EPOSICE, ENEGICE, EAIR, EROLL, EGRAD, EACC, EAUX, EBRAKE, ETRANSM,
ERETARDER, ETORQUECONV, MASS, LOADING, A, APOS, ANEG, ACCNOISE, PACC, PDEC, PCRUISE, PSTOP ERETARDER, ETORQUECONV, MASS, LOADING, ACCELERATIONS, APOS, ANEG, ACCNOISE, PACC, PDEC, PCRUISE, PSTOP
}); });
} }
......
using System.Linq; using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Utils; using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Tests.Reports namespace TUGraz.VectoCore.Tests.Reports
...@@ -35,7 +36,7 @@ namespace TUGraz.VectoCore.Tests.Reports ...@@ -35,7 +36,7 @@ namespace TUGraz.VectoCore.Tests.Reports
sumWriter.WriteFullPowertrain(modData, "testSumCalc", "--", "--", 0.SI<Kilogram>(), 0.SI<Kilogram>()); sumWriter.WriteFullPowertrain(modData, "testSumCalc", "--", "--", 0.SI<Kilogram>(), 0.SI<Kilogram>());
modData.Finish(); modData.Finish(VectoRun.Status.Success);
sumWriter.Finish(); sumWriter.Finish();
var sumData = VectoCSVFile.Read("testsumcalc_fixed.vsum", false, true); var sumData = VectoCSVFile.Read("testsumcalc_fixed.vsum", false, true);
...@@ -83,7 +84,7 @@ namespace TUGraz.VectoCore.Tests.Reports ...@@ -83,7 +84,7 @@ namespace TUGraz.VectoCore.Tests.Reports
sumWriter.WriteFullPowertrain(modData, "testSumCalc", "--", "--", 0.SI<Kilogram>(), 0.SI<Kilogram>()); sumWriter.WriteFullPowertrain(modData, "testSumCalc", "--", "--", 0.SI<Kilogram>(), 0.SI<Kilogram>());
modData.Finish(); modData.Finish(VectoRun.Status.Success);
sumWriter.Finish(); sumWriter.Finish();
var sumData = VectoCSVFile.Read("testsumcalc_var.vsum", false, true); var sumData = VectoCSVFile.Read("testsumcalc_var.vsum", false, true);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment