SimShift.Entities.ShifterTableConfiguration.DefaultByPowerEfficiency2 C# (CSharp) Method

DefaultByPowerEfficiency2() private method

private DefaultByPowerEfficiency2 ( ) : void
return void
        private void DefaultByPowerEfficiency2()
        {
            tableGear = new Dictionary<int, Dictionary<double, int>>();
            tableThrottle = new Dictionary<int, Dictionary<double, double>>();

            if (Drivetrain.Gears == 0) return;
            // 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>());

                Dictionary<int, float> pwrPerGear = new Dictionary<int, float>();

                // Populate:
                for (int gear = 0; gear < Drivetrain.Gears; gear++)
                {
                    var calculatedRpm = Drivetrain.GearRatios[gear]*speed;
                    var power = (float) Drivetrain.CalculatePower(calculatedRpm, 1);
                    pwrPerGear.Add(gear, power);
                }

                var maxPwrAvailable = pwrPerGear.Values.Max()*0.85;

                for (var load = 0.0; load <= 1.0; load += 0.1)
                {

                    Dictionary<int, float> efficiencyPerGear = new Dictionary<int, float>();
                    var highestGearBeforeStalling = 0;

                    for (int gear = 0; gear < Drivetrain.Gears; gear++)
                    {
                        var calculatedRpm = Drivetrain.GearRatios[gear]*speed;
                        if (calculatedRpm > Drivetrain.StallRpm) highestGearBeforeStalling = gear;
                        var power = (float) Drivetrain.CalculatePower(calculatedRpm, 1);
                        var fuel = (float) Drivetrain.CalculateFuelConsumption(calculatedRpm, Math.Max(0.05,load));
                        efficiencyPerGear.Add(gear, fuel/power);
                    }
                    var bestGear = highestGearBeforeStalling;
                    var bestGearV = 100.0f;
                    foreach (var kvp in efficiencyPerGear)
                    {
                        if (kvp.Value < bestGearV && kvp.Value>0)
                        {
                            bestGearV = kvp.Value;
                            bestGear = kvp.Key;
                        }
                    }
                    var actualRpm = Drivetrain.GearRatios[bestGear]*speed;

                    var reqThr = Drivetrain.CalculateThrottleByPower(actualRpm, load * maxPwrAvailable);
                    var thrScale = reqThr/Math.Max(load,0.1);
                    if (thrScale > 1.5) thrScale = 1.5;
                    tableGear[speed].Add(load, bestGear+1);
                    tableThrottle[speed].Add(load,thrScale);

                }
            }
        }