public void DefaultByPowerEfficiency()
{
tableGear = new Dictionary<int, Dictionary<double, int>>();
tableThrottle = new Dictionary<int, Dictionary<double, double>>();
// Make sure there are 20 rpm steps, and 10 load steps
for (int speed = 0; speed <= MaximumSpeed; speed += 1)
{
tableGear.Add(speed, new Dictionary<double, int>());
tableThrottle.Add(speed, new Dictionary<double, double>());
for (var load = 0.0; load <= 1.0; load += 0.1)
{
tableThrottle[speed].Add(load, 1);
var gearSet = false;
var bestFuelEfficiency = double.MinValue;
var bestFuelGear = 0;
for (int gear = 0; gear < Drivetrain.Gears; gear++)
{
var calculatedRpm = Drivetrain.GearRatios[gear] * speed;
if (calculatedRpm < Drivetrain.StallRpm * 1.5) continue;
if (calculatedRpm > Drivetrain.MaximumRpm) continue;
var thr = (load < 0.05)
? 0.05
: load;
var pwr = Drivetrain.CalculatePower(calculatedRpm, thr);
var fuel = Drivetrain.CalculateFuelConsumption(calculatedRpm, thr);
var efficiency = pwr / fuel;
if (efficiency > bestFuelEfficiency)
{
bestFuelEfficiency = efficiency;
bestFuelGear = gear;
gearSet = true;
}
}
if (!gearSet)
{
if (Drivetrain is Ets2Drivetrain &&
Drivetrain.Gears >= 10)
tableGear[speed].Add(load, 3);
else
tableGear[speed].Add(load, 1);
}
else
{
if (Drivetrain is Ets2Drivetrain &&
Drivetrain.Gears >= 10)
bestFuelGear = Math.Max(2, bestFuelGear);
tableGear[speed].Add(load, bestFuelGear + 1);
}
}
}
}