37 #define IDLE_SPEED (10 / 3.6)
44 myIndex(PHEMLIGHT_BASE) {
59 if (eClass.size() < 6) {
63 const std::string type = eClass.substr(0, 3);
64 if (type ==
"HDV" || type ==
"LB_" || type ==
"RB_" || type ==
"LSZ" || eClass.find(
"LKW") != std::string::npos) {
71 std::vector<std::string> phemPath;
73 if (getenv(
"PHEMLIGHT_PATH") !=
nullptr) {
74 phemPath.push_back(std::string(getenv(
"PHEMLIGHT_PATH")) +
"/");
76 if (getenv(
"SUMO_HOME") !=
nullptr) {
77 phemPath.push_back(std::string(getenv(
"SUMO_HOME")) +
"/data/emissions/PHEMlight/");
98 std::string eClassOffset =
"0";
99 if (eClass.length() == 5 && eClass.substr(0, 4) ==
"Euro") {
100 if (eClass[4] >=
'0' && eClass[4] <=
'6') {
101 eClassOffset = eClass.substr(4, 1);
105 if (vClass ==
"Passenger") {
107 if (fuel ==
"Gasoline") {
109 }
else if (fuel ==
"Diesel") {
111 }
else if (fuel ==
"HybridGasoline") {
112 desc =
"H_" + desc +
"G_";
113 }
else if (fuel ==
"HybridDiesel") {
114 desc =
"H_" + desc +
"G_";
116 desc +=
"EU" + eClassOffset;
117 }
else if (vClass ==
"Moped") {
118 desc =
"KKR_G_EU" + eClassOffset;
119 }
else if (vClass ==
"Motorcycle") {
120 desc =
"MR_G_EU" + eClassOffset;
121 if (fuel ==
"Gasoline2S") {
126 }
else if (vClass ==
"Delivery") {
128 if (fuel ==
"Gasoline") {
130 }
else if (fuel ==
"Diesel") {
133 desc +=
"EU" + eClassOffset +
"_I";
134 if (weight > 1305.) {
136 if (weight > 1760.) {
140 }
else if (vClass ==
"UrbanBus") {
141 desc =
"LB_D_EU" + eClassOffset;
142 }
else if (vClass ==
"Coach") {
143 desc =
"RB_D_EU" + eClassOffset;
144 }
else if (vClass ==
"Truck") {
145 desc =
"Solo_LKW_D_EU" + eClassOffset +
"_I";
146 if (weight > 1305.) {
149 }
else if (vClass ==
"Trailer") {
150 desc =
"LSZ_D_EU" + eClassOffset;
162 if (name.find(
"KKR_") != std::string::npos) {
164 }
else if (name.find(
"RB_") != std::string::npos) {
166 }
else if (name.find(
"LB_") != std::string::npos) {
168 }
else if (name.find(
"LNF_") != std::string::npos) {
170 }
else if (name.find(
"LSZ_") != std::string::npos) {
172 }
else if (name.find(
"MR_") != std::string::npos) {
174 }
else if (name.find(
"LKW_") != std::string::npos) {
184 std::string fuel =
"Gasoline";
185 if (name.find(
"_D_") != std::string::npos) {
188 if (name.find(
"H_") != std::string::npos) {
189 fuel =
"Hybrid" + fuel;
198 if (name.find(
"_EU1") != std::string::npos) {
200 }
else if (name.find(
"_EU2") != std::string::npos) {
202 }
else if (name.find(
"_EU3") != std::string::npos) {
204 }
else if (name.find(
"_EU4") != std::string::npos) {
206 }
else if (name.find(
"_EU5") != std::string::npos) {
208 }
else if (name.find(
"_EU6") != std::string::npos) {
218 if (name.find(
"LNF_") != std::string::npos) {
219 if (name.find(
"_III") != std::string::npos) {
221 }
else if (name.find(
"_II") != std::string::npos) {
223 }
else if (name.find(
"_I") != std::string::npos) {
227 if (name.find(
"Solo_LKW_") != std::string::npos) {
228 if (name.find(
"_II") != std::string::npos) {
230 }
else if (name.find(
"_I") != std::string::npos) {
240 if (oldCep !=
nullptr) {
250 if (currCep !=
nullptr) {
259 const double corrSpeed =
MAX2(0.0, v);
263 if (oldCep !=
nullptr) {
264 if (v >
IDLE_SPEED && a < oldCep->GetDecelCoast(corrSpeed, a, slope, 0)) {
269 power = oldCep->
CalcPower(corrSpeed, a, slope);
272 const PHEMCEP*
const oldCep = 0;
275 if (currCep !=
nullptr) {
278 corrAcc < currCep->GetDecelCoast(corrSpeed, corrAcc, slope) &&
283 power = currCep->
CalcPower(corrSpeed, corrAcc, slope);
290 if (oldCep !=
nullptr) {
294 getEmission(
nullptr, currCep,
"CO", power, corrSpeed),
const double SECONDS_PER_HOUR
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
An upper class for objects with additional parameters.
double getEmission(const PHEMCEP *oldCep, PHEMlightdll::CEP *currCep, const std::string &e, const double p, const double v) const
Returns the amount of emitted pollutant given the vehicle type and state (in mg/s or in ml/s for fuel...
std::map< SUMOEmissionClass, PHEMlightdll::CEP * > myCEPs
SUMOEmissionClass getClass(const SUMOEmissionClass base, const std::string &vClass, const std::string &fuel, const std::string &eClass, const double weight) const
Returns the emission class described by the given parameters.
std::string getFuel(const SUMOEmissionClass c) const
Returns the fuel type described by this emission class as described in the Amitran interface (Gasolin...
PHEMlightdll::Helpers myHelper
double compute(const SUMOEmissionClass c, const PollutantsInterface::EmissionType e, const double v, const double a, const double slope, const EnergyParams *param) const
Returns the amount of emitted pollutant given the vehicle type and state (in mg/s or in ml/s for fuel...
HelpersPHEMlight()
Constructor.
double getModifiedAccel(const SUMOEmissionClass c, const double v, const double a, const double slope) const
Returns the adapted acceleration value, useful for comparing with external PHEMlight references.
int getEuroClass(const SUMOEmissionClass c) const
Returns the Euro emission class described by this emission class as described in the Amitran interfac...
SUMOEmissionClass getClassByName(const std::string &eClass, const SUMOVehicleClass vc)
Checks whether the string describes a known vehicle class.
double getWeight(const SUMOEmissionClass c) const
Returns a reference weight in kg described by this emission class as described in the Amitran interfa...
PHEMlightdll::CEPHandler myCEPHandler
int myIndex
the index of the next class
std::string getAmitranVehicleClass(const SUMOEmissionClass c) const
Returns the vehicle class described by this emission class as described in the Amitran interface (Pas...
static OptionsCont & getOptions()
Retrieves the options.
static PHEMCEPHandler & getHandlerInstance()
Implementatio of Singelton pattern.
PHEMCEP * GetCep(SUMOEmissionClass emissionClass)
Returns the CEP data for a PHEM emission class.
Data Handler for a single CEP emission data set.
double CalcPower(double v, double a, double slope, double vehicleLoading=0) const
Returns the power of used for a vehicle at state v,a, slope and loading.
double GetEmission(const std::string &pollutantIdentifier, double power, double speed, bool normalized=false) const
Returns a emission measure for power[kW] level.
const std::string & GetVehicleFuelType() const
Getter function to recieve vehicle data from CEP.
const std::map< std::string, CEP * > & getCEPS() const
bool GetCEP(const std::vector< std::string > &DataPath, Helpers *Helper)
double GetMaxAccel(double speed, double gradient)
double GetEmission(const std::string &pollutant, double power, double speed, Helpers *VehicleClass)
double CalcPower(double speed, double acc, double gradient)
const std::string & getFuelType() const
double GetCO2Emission(double _FC, double _CO, double _HC, Helpers *VehicleClass)
static const std::string strGasoline
static const double ZERO_SPEED_ACCURACY
static const std::string strBEV
static const std::string strDiesel
const std::string & getErrMsg() const
void setPHEMDataV(const std::string &value)
void setCommentPrefix(const std::string &value)
const std::string & getgClass() const
bool setclass(const std::string &VEH)
StringBijection< SUMOEmissionClass > myEmissionClassStrings
Mapping between emission class names and integer representations.
Helper methods for PHEMlight-based emission computation.
EmissionType
Enumerating all emission types, including fuel.
static const int HEAVY_BIT
the bit to set for denoting heavy vehicles
void remove(const std::string str, const T key)
bool hasString(const std::string &str) const
const std::string & getString(const T key) const
void addAlias(const std::string str, const T key)
T get(const std::string &str) const
void insert(const std::string str, const T key, bool checkDuplicates=true)
static std::string to_lower_case(std::string str)
Transfers the content to lower case.