Skip to content

Commit

Permalink
delaying denormalization of power curve #12 #14285
Browse files Browse the repository at this point in the history
  • Loading branch information
behrisch committed Jan 31, 2024
1 parent 67031b1 commit c252b4a
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 39 deletions.
65 changes: 30 additions & 35 deletions src/foreign/PHEMlight/V5/cpp/CEP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ namespace PHEMlightdllV5 {
_dragNormTable = Vehicle->getFLDData()->getDragCurve()["pe_drag_norm"];

// Looping through matrix and assigning values for FC values
_powerPatternFCvalues = std::vector<double>();
_normalizedPowerPatternFCvalues = std::vector<double>();

int headerFCCount = (int)headerLineFCvalues.size();
Expand All @@ -122,7 +121,6 @@ namespace PHEMlightdllV5 {

if (j == 0) {
_normalizedPowerPatternFCvalues.push_back(matrixFCvalues[i][j]);
_powerPatternFCvalues.push_back(matrixFCvalues[i][j] * getRatedPower());
}
else {
FCvaluesMeasures[j - 1].push_back(matrixFCvalues[i][j] * getRatedPower());
Expand All @@ -143,10 +141,8 @@ namespace PHEMlightdllV5 {

// looping through matrix and assigning values for pollutants
const double pollutantMultiplyer = getHeavyVehicle() ? getRatedPower() : 1.;
const double normalizingPower = getHeavyVehicle() ? getRatedPower() : CalcPower(Constants::NORMALIZING_SPEED, Constants::NORMALIZING_ACCELARATION, 0, (getCalcType() == "HEV" || getCalcType() == "BEV"));

_powerPatternPollutants = std::vector<double>();
_normailzedPowerPatternPollutants = std::vector<double>();
_normalizedPowerPatternPollutants = std::vector<double>();
_cepNormalizedCurvePollutants = std::map<std::string, std::vector<double> >();

int headerCount = (int)headerLinePollutants.size();
Expand All @@ -157,8 +153,7 @@ namespace PHEMlightdllV5 {
}

if (j == 0) {
_normailzedPowerPatternPollutants.push_back(matrixPollutants[i][j]);
_powerPatternPollutants.push_back(matrixPollutants[i][j] * normalizingPower);
_normalizedPowerPatternPollutants.push_back(matrixPollutants[i][j]);
}
else {
pollutantMeasures[j - 1].push_back(matrixPollutants[i][j] * pollutantMultiplyer);
Expand Down Expand Up @@ -249,20 +244,20 @@ namespace PHEMlightdllV5 {
}

double CEP::CalcEngPower(double power) {
if (power < _powerPatternFCvalues.front()) {
return _powerPatternFCvalues.front();
if (power < _normalizedPowerPatternFCvalues.front() * getRatedPower()) {
return _normalizedPowerPatternFCvalues.front() * getRatedPower();
}
if (power > _powerPatternFCvalues.back()) {
return _powerPatternFCvalues.back();
if (power > _normalizedPowerPatternFCvalues.back() * getRatedPower()) {
return _normalizedPowerPatternFCvalues.back() * getRatedPower();
}

return power;
}

double CEP::GetEmission(const std::string& pollutant, double power, double speed, Helpers* VehicleClass) {
//Declaration
std::vector<double> emissionCurve;
std::vector<double> powerPattern;
std::vector<double>* emissionCurve = nullptr;
std::vector<double>* powerPattern = nullptr;

// bisection search to find correct position in power pattern
int upperIndex;
Expand All @@ -287,35 +282,39 @@ namespace PHEMlightdllV5 {
return 0;
}

double normalizingPower = getRatedPower();
if (_cepCurveFCvalues.find(pollutant) != _cepCurveFCvalues.end()) {
emissionCurve = _cepCurveFCvalues[pollutant];
powerPattern = _powerPatternFCvalues;
emissionCurve = &_cepCurveFCvalues[pollutant];
powerPattern = &_normalizedPowerPatternFCvalues;
}
else if (_cepCurvePollutants.find(pollutant) != _cepCurvePollutants.end()) {
emissionCurve = _cepCurvePollutants[pollutant];
powerPattern = _powerPatternPollutants;
emissionCurve = &_cepCurvePollutants[pollutant];
powerPattern = &_normalizedPowerPatternPollutants;
if (!getHeavyVehicle()) {
normalizingPower = CalcPower(Constants::NORMALIZING_SPEED, Constants::NORMALIZING_ACCELARATION, 0, (getCalcType() == "HEV" || getCalcType() == "BEV"));
}
}

if (emissionCurve.empty()) {
if (emissionCurve == nullptr || emissionCurve->empty()) {
VehicleClass->setErrMsg(std::string("Empty emission curve for ") + pollutant + std::string(" found!"));
return 0;
}
if (emissionCurve.size() == 1) {
return emissionCurve[0];
if (emissionCurve->size() == 1) {
return emissionCurve->front();
}

// in case that the demanded power is smaller than the first entry (smallest) in the power pattern the first is returned (should never happen)
if (power <= powerPattern.front()) {
return emissionCurve[0];
if (power <= powerPattern->front() * normalizingPower) {
return emissionCurve->front();
}

// if power bigger than all entries in power pattern return the last (should never happen)
if (power >= powerPattern.back()) {
return emissionCurve.back();
if (power >= powerPattern->back() * normalizingPower) {
return emissionCurve->back();
}

FindLowerUpperInPattern(lowerIndex, upperIndex, powerPattern, power);
return Interpolate(power, powerPattern[lowerIndex], powerPattern[upperIndex], emissionCurve[lowerIndex], emissionCurve[upperIndex]);
FindLowerUpperInPattern(lowerIndex, upperIndex, *powerPattern, power, normalizingPower);
return Interpolate(power, (*powerPattern)[lowerIndex] * normalizingPower, (*powerPattern)[upperIndex] * normalizingPower, (*emissionCurve)[lowerIndex], (*emissionCurve)[upperIndex]);
}

double CEP::GetCO2Emission(double _FC, double _CO, double _HC, Helpers* VehicleClass) {
Expand Down Expand Up @@ -459,17 +458,17 @@ namespace PHEMlightdllV5 {
return Interpolate(speed, _speedPatternRotational[lowerIndex], _speedPatternRotational[upperIndex], _speedCurveRotational[lowerIndex], _speedCurveRotational[upperIndex]);
}

void CEP::FindLowerUpperInPattern(int& lowerIndex, int& upperIndex, std::vector<double>& pattern, double value) {
void CEP::FindLowerUpperInPattern(int& lowerIndex, int& upperIndex, const std::vector<double>& pattern, double value, double scale) {
lowerIndex = 0;
upperIndex = 0;

if (value <= pattern.front()) {
if (value <= pattern.front() * scale) {
lowerIndex = 0;
upperIndex = 0;
return;
}

if (value >= pattern.back()) {
if (value >= pattern.back() * scale) {
lowerIndex = (int)pattern.size() - 1;
upperIndex = (int)pattern.size() - 1;
return;
Expand All @@ -481,12 +480,12 @@ namespace PHEMlightdllV5 {
lowerIndex = 0;

while (upperIndex - lowerIndex > 1) {
if (pattern[middleIndex] == value) {
if (pattern[middleIndex] * scale == value) {
lowerIndex = middleIndex;
upperIndex = middleIndex;
return;
}
else if (pattern[middleIndex] < value) {
else if (pattern[middleIndex] * scale < value) {
lowerIndex = middleIndex;
middleIndex = (upperIndex - lowerIndex) / 2 + lowerIndex;
}
Expand All @@ -495,10 +494,6 @@ namespace PHEMlightdllV5 {
middleIndex = (upperIndex - lowerIndex) / 2 + lowerIndex;
}
}

if (pattern[lowerIndex] <= value && value < pattern[upperIndex]) {
return;
}
}

double CEP::Interpolate(double px, double p1, double p2, double e1, double e2) {
Expand Down
6 changes: 2 additions & 4 deletions src/foreign/PHEMlight/V5/cpp/CEP.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,8 @@ namespace PHEMlightdllV5 {
double _effectiveWheelDiameter;

std::vector<double> _speedPatternRotational;
std::vector<double> _powerPatternFCvalues;
std::vector<double> _normalizedPowerPatternFCvalues;
std::vector<double> _normailzedPowerPatternPollutants;
std::vector<double> _powerPatternPollutants;
std::vector<double> _normalizedPowerPatternPollutants;

std::map<std::string, std::vector<double> > _cepCurveFCvalues;
std::map<std::string, std::vector<double> > _normedCepCurveFCvalues;
Expand Down Expand Up @@ -137,7 +135,7 @@ namespace PHEMlightdllV5 {


private:
void FindLowerUpperInPattern(int& lowerIndex, int& upperIndex, std::vector<double>& pattern, double value);
void FindLowerUpperInPattern(int& lowerIndex, int& upperIndex, const std::vector<double>& pattern, double value, double scale=1.);

double Interpolate(double px, double p1, double p2, double e1, double e2);

Expand Down

0 comments on commit c252b4a

Please sign in to comment.