public static CEP AddRangeCeps(CEP[] cps, Helpers Helper)
{
#region SingleValues
CEP newCEP = new CEP(cps.Select(p => p.HeavyVehicle ? 1 : 0).Sum() > 0,
cps.Select(p => p._massVehicle).Sum(),
cps.Select(p => p._vehicleLoading).Sum(),
cps.Select(p => p._vehicleMassRot).Sum(),
cps.Select(p => p._crossSectionalArea).Sum(),
cps.Select(p => p._cWValue).Sum(),
cps.Select(p => p._resistanceF0).Sum(),
cps.Select(p => p._resistanceF1).Sum(),
cps.Select(p => p._resistanceF2).Sum(),
cps.Select(p => p._resistanceF3).Sum(),
cps.Select(p => p._resistanceF4).Sum(),
cps.Select(p => p._axleRatio).Sum(),
cps.Select(p => p._auxPower).Sum(),
cps.Select(p => p._ratedPower).Sum(),
cps.Select(p => p._engineIdlingSpeed).Sum(),
cps.Select(p => p._engineRatedSpeed).Sum(),
cps.Select(p => p._effectiveWheelDiameter).Sum(),
cps.Select(p => p._pNormV0).Sum(),
cps.Select(p => p._pNormP0).Sum(),
cps.Select(p => p._pNormV1).Sum(),
cps.Select(p => p._pNormP1).Sum());
newCEP._fuelType = cps.First().FuelType;
#endregion
#region SpeedRotationalTable
double minSpeedRotational = cps.Select(p => p._speedPatternRotational.First()).Min();
double maxSpeedRotational = cps.Select(p => p._speedPatternRotational.Last()).Max();
newCEP._speedPatternRotational
= CreatePattern(minSpeedRotational,
maxSpeedRotational,
Constants.SPEED_ROTATIONAL_INCREMENT);
newCEP._speedCurveRotational = new List<double>();
newCEP._gearTransmissionCurve = new List<double>();
for (int i = 0; i < newCEP._speedPatternRotational.Count; i++)
{
newCEP._speedCurveRotational.Add(cps.Select(p => p.GetRotationalCoeffecient(newCEP._speedPatternRotational[i])).Sum());
newCEP._gearTransmissionCurve.Add(cps.Select(p => p.GetGearCoeffecient(newCEP._speedPatternRotational[i])).Sum());
}
#endregion
#region NormalizingPower
newCEP._drivingPower = newCEP.CalcPower(Constants.NORMALIZING_SPEED, Constants.NORMALIZING_ACCELARATION, 0);
if (newCEP._heavyVehicle)
{
newCEP._normalizingPower = newCEP._ratedPower;
newCEP._normalizingType = NormalizingType.RatedPower;
}
else
{
newCEP._normalizingPower = newCEP._drivingPower;
newCEP._normalizingType = NormalizingType.DrivingPower;
}
#endregion
#region FC
double minNormPowerPatternFC = cps.Select(p => p._normalizedPowerPatternFC.First()).Min();
double maxNormPowerPatternFC = cps.Select(p => p._normalizedPowerPatternFC.Last()).Max();
newCEP._normalizedPowerPatternFC
= CreatePattern(minNormPowerPatternFC,
maxNormPowerPatternFC,
Constants.POWER_FC_INCREMENT);
newCEP._cepCurveFC = new List<double>();
newCEP._normedCepCurveFC = new List<double>();
newCEP._powerPatternFC = new List<double>();
for (int i = 0; i < newCEP._normalizedPowerPatternFC.Count; i++)
{
double newCepVal = cps.Select(p => p.GetNormedEmission("FC", newCEP._normalizedPowerPatternFC[i], double.MaxValue, Helper)).Sum();
newCEP._cepCurveFC.Add(newCepVal * newCEP._ratedPower);
newCEP._normedCepCurveFC.Add(newCepVal);
newCEP._powerPatternFC.Add(newCEP._normalizedPowerPatternFC[i] * newCEP._ratedPower);
}
#endregion
#region Pollutants
double minNormPowerPattern = cps.Select(p => p._normailzedPowerPatternPollutants.First()).Min();
double maxNormPowerPattern = cps.Select(p => p._normailzedPowerPatternPollutants.Last()).Max();
newCEP._normailzedPowerPatternPollutants
= CreatePattern(minNormPowerPattern,
maxNormPowerPattern,
Constants.POWER_POLLUTANT_INCREMENT);
newCEP._cepCurvePollutants = new Dictionary<string, List<double>>();
newCEP._powerPatternPollutants = new List<double>();
newCEP._cepNormalizedCurvePollutants = new Dictionary<string, List<double>>();
foreach (string id in cps.First()._cepCurvePollutants.Keys)
{
newCEP._cepCurvePollutants.Add(id, new List<double>());
newCEP._cepNormalizedCurvePollutants.Add(id, new List<double>());
}
for (int i = 0; i < newCEP._normailzedPowerPatternPollutants.Count; i++)
{
foreach (string id in newCEP._cepCurvePollutants.Keys)
{
if (newCEP.NormalizingTypeX == NormalizingType.RatedPower)
{
double newCepVal = cps.Select(p => p.GetNormedEmission(id, newCEP._normailzedPowerPatternPollutants[i], double.MaxValue, Helper)).Sum();
newCEP._cepCurvePollutants[id].Add(newCepVal * newCEP._ratedPower);
newCEP._cepNormalizedCurvePollutants[id].Add(newCepVal);
}
else
{
newCEP._cepCurvePollutants[id].Add(cps.Select(p => p.GetEmission(id, newCEP._normailzedPowerPatternPollutants[i] * p._normalizingPower, double.MaxValue, Helper)).Sum());
newCEP._cepNormalizedCurvePollutants[id].Add(cps.Select(p => p.GetNormedEmission(id, newCEP._normailzedPowerPatternPollutants[i], double.MaxValue, Helper)).Sum());
}
}
newCEP._powerPatternPollutants.Add(newCEP._normailzedPowerPatternPollutants[i] * newCEP.NormalizingPower);
}
#endregion
#region IdlingValues
newCEP._idlingValueFC = cps.Select(p => p._idlingValueFC).Sum();
newCEP._idlingValuesPollutants = new Dictionary<string, double>();
foreach (string id in cps.First()._idlingValuesPollutants.Keys)
{
newCEP._idlingValuesPollutants.Add(id, cps.Select(p => p._idlingValuesPollutants[id]).Sum());
}
#endregion
#region TragTable
double minTragTable = cps.Select(p => p._nNormTable.First()).Min();
double maxTragTable = cps.Select(p => p._nNormTable.Last()).Max();
newCEP._nNormTable
= CreatePattern(minTragTable,
maxTragTable,
Constants.NNORM_INCREMENT);
newCEP._dragNormTable = new List<double>();
for (int i = 0; i < newCEP._nNormTable.Count; i++)
{
newCEP._dragNormTable.Add(cps.Select(p => p.GetDragCoeffecient(newCEP._nNormTable[i])).Sum());
}
#endregion
return newCEP;
}
#endregion