45const double PollutantsInterface::Helper::ZERO_SPEED_ACCURACY = .5;
46PollutantsInterface::Helper PollutantsInterface::myZeroHelper(
"Zero", PollutantsInterface::ZERO_EMISSIONS, PollutantsInterface::ZERO_EMISSIONS);
54PollutantsInterface::Helper* PollutantsInterface::myHelpers[] = {
55 &PollutantsInterface::myZeroHelper,
56 &PollutantsInterface::myHBEFA2Helper, &PollutantsInterface::myHBEFA3Helper,
57 &PollutantsInterface::myPHEMlightHelper, &PollutantsInterface::myEnergyHelper,
58 &PollutantsInterface::myMMPEVEMHelper, &PollutantsInterface::myPHEMlight5Helper,
59 &PollutantsInterface::myHBEFA4Helper
61std::vector<std::string> PollutantsInterface::myAllClassesStr;
72PollutantsInterface::Emissions::Emissions(
double co2,
double co,
double hc,
double f,
double nox,
double pmx,
double elec) :
83void PollutantsInterface::Emissions::addScaled(
const Emissions& a,
const double scale) {
87 fuel += scale *
a.fuel;
90 electricity += scale *
a.electricity;
97PollutantsInterface::Helper::Helper(std::string name,
const int baseIndex,
const int defaultClass) :
99 myBaseIndex(baseIndex) {
100 if (defaultClass != -1) {
101 myEmissionClassStrings.insert(
"default", defaultClass);
102 myEmissionClassStrings.addAlias(
"unknown", defaultClass);
108std::string& PollutantsInterface::Helper::getName()
const {
114PollutantsInterface::Helper::getClassByName(
const std::string& eClass,
const SUMOVehicleClass vc) {
117 if (myEmissionClassStrings.hasString(eClass)) {
118 return myEmissionClassStrings.get(eClass);
126 return myName +
"/" + myEmissionClassStrings.getString(c);
132 return (c & (
int)0xffffffff & ~HEAVY_BIT) == 0;
137PollutantsInterface::Helper::getClass(
const SUMOEmissionClass base,
const std::string& vClass,
const std::string& fuel,
const std::string& eClass,
const double weight)
const {
147PollutantsInterface::Helper::getAmitranVehicleClass(
const SUMOEmissionClass c)
const {
175PollutantsInterface::Helper::compute(
const SUMOEmissionClass c,
const EmissionType e,
const double v,
const double a,
const double slope,
const EnergyParams* param)
const {
187PollutantsInterface::Helper::getModifiedAccel(
const SUMOEmissionClass c,
const double v,
const double a,
const double slope,
const EnergyParams* param)
const {
197PollutantsInterface::Helper::getCoastingDecel(
const SUMOEmissionClass c,
const double v,
const double a,
const double slope,
const EnergyParams* param)
const {
202 if (param ==
nullptr) {
209 return MIN2(0., incl * v + 0.00001066 * mass + -0.38347107 - 20.0 * incl - grad);
214PollutantsInterface::Helper::addAllClassesInto(std::vector<SUMOEmissionClass>& list)
const {
215 myEmissionClassStrings.addKeysInto(list);
221 return (c >> 16) == (myBaseIndex >> 16);
229PollutantsInterface::getClassByName(
const std::string& eClass,
const SUMOVehicleClass vc) {
230 const std::string::size_type sep = eClass.find(
"/");
231 const std::string model = eClass.substr(0, sep);
232 for (
int i = 0; i < 8; i++) {
233 if (myHelpers[i]->getName() == model) {
234 if (sep != std::string::npos) {
235 const std::string subClass = eClass.substr(sep + 1);
236 if (subClass ==
"zero") {
237 return myZeroHelper.getClassByName(
"default", vc);
239 return myHelpers[i]->getClassByName(subClass, vc);
241 return myHelpers[i]->getClassByName(
"default", vc);
244 if (sep == std::string::npos) {
245 if (eClass ==
"zero") {
246 return myZeroHelper.getClassByName(
"default", vc);
248 WRITE_WARNINGF(
"Emission classes should always use the model as a prefix, please recheck '%'. In later SUMO versions this might become an error.", eClass)
250 return myHBEFA2Helper.getClassByName(eClass, vc);
252 throw InvalidArgument(
TLF(
"Unknown emission class '%'.", eClass));
256const std::vector<SUMOEmissionClass>
257PollutantsInterface::getAllClasses() {
258 std::vector<SUMOEmissionClass>
result;
259 for (
int i = 0; i < 8; i++) {
260 myHelpers[i]->addAllClassesInto(result);
266const std::vector<std::string>&
267PollutantsInterface::getAllClassesStr() {
269 if (myAllClassesStr.empty()) {
271 std::vector<SUMOEmissionClass> emissionClasses;
272 for (
int i = 0; i < 8; i++) {
273 myHelpers[i]->addAllClassesInto(emissionClasses);
276 for (
const auto& i : emissionClasses) {
277 myAllClassesStr.push_back(getName(i));
280 return myAllClassesStr;
285 return myHelpers[c >> 16]->getClassName(c);
290PollutantsInterface::getPollutantName(
const EmissionType e) {
305 return "electricity";
307 throw InvalidArgument(
"Unknown emission type '" +
toString(e) +
"'");
313 return (c & HEAVY_BIT) != 0;
319 return myHelpers[c >> 16]->isSilent(c);
324PollutantsInterface::getClass(
const SUMOEmissionClass base,
const std::string& vClass,
325 const std::string& fuel,
const std::string& eClass,
const double weight) {
326 return myHelpers[base >> 16]->getClass(base, vClass, fuel, eClass, weight);
332 return myHelpers[c >> 16]->getAmitranVehicleClass(c);
338 return myHelpers[c >> 16]->getFuel(c);
344 return myHelpers[c >> 16]->getEuroClass(c);
350 return myHelpers[c >> 16]->getWeight(c);
355PollutantsInterface::compute(
const SUMOEmissionClass c,
const EmissionType e,
const double v,
const double a,
const double slope,
const EnergyParams* param) {
356 return myHelpers[c >> 16]->compute(c, e, v, a, slope, param);
360PollutantsInterface::Emissions
361PollutantsInterface::computeAll(
const SUMOEmissionClass c,
const double v,
const double a,
const double slope,
const EnergyParams* param) {
362 const Helper*
const h = myHelpers[c >> 16];
363 return Emissions(h->compute(c, CO2, v, a, slope, param), h->compute(c, CO, v, a, slope, param), h->compute(c, HC, v, a, slope, param),
364 h->compute(c,
FUEL, v, a, slope, param), h->compute(c, NO_X, v, a, slope, param), h->compute(c, PM_X, v, a, slope, param),
365 h->compute(c, ELEC, v, a, slope, param));
370PollutantsInterface::computeDefault(
const SUMOEmissionClass c,
const EmissionType e,
const double v,
const double a,
const double slope,
const double tt,
const EnergyParams* param) {
371 const Helper*
const h = myHelpers[c >> 16];
372 return (h->compute(c, e, v, 0, slope, param) + h->compute(c, e, v - a, a, slope, param)) * tt / 2.;
377PollutantsInterface::getModifiedAccel(
const SUMOEmissionClass c,
const double v,
const double a,
const double slope,
const EnergyParams* param) {
378 return myHelpers[c >> 16]->getModifiedAccel(c, v, a, slope, param);
383PollutantsInterface::getCoastingDecel(
const SUMOEmissionClass c,
const double v,
const double a,
const double slope,
const EnergyParams* param) {
384 return myHelpers[c >> 16]->getCoastingDecel(c, v, a, slope, param);
389PollutantsInterface::getEnergyHelper() {
390 return myEnergyHelper;
#define WRITE_WARNINGF(...)
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SUMO_ATTR_FRONTSURFACEAREA
Front surface area.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
double getDouble(SumoXMLAttr attr) const
Returns the value for a given key.
static const EnergyParams * getDefault()
Helper methods for energy-based electricity consumption computation based on the battery device.
Helper methods for HBEFA3-based emission computation.
Helper methods for HBEFA4-based emission computation.
Helper methods for HBEFA-based emission computation.
This helper class allows the PollutantsInterface to load and use different MMPEVEMs.
Helper methods for PHEMlight-based emission computation.
Helper methods for PHEMlight-based emission computation.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool).
static OptionsCont & getOptions()
Retrieves the options.
static const double SPEED_DCEL_MIN
static const double GRAVITY_CONST
static std::string to_lower_case(const std::string &str)
Transfers the content to lower case.
#define UNUSED_PARAMETER(x)
*brief create JSON pointer *sa reference_tokens const std::string & a