42 #ifdef CHECK_MEMORY_LEAKS
44 #endif // CHECK_MEMORY_LEAKS
47 #define IDLE_SPEED (10 / 3.6)
65 if (eClass.size() < 6) {
69 const std::string type = eClass.substr(0, 3);
70 if (type ==
"HDV" || type ==
"LB_" || type ==
"RB_" || type ==
"LSZ" || eClass.find(
"LKW") != std::string::npos) {
77 std::vector<std::string> phemPath;
79 if (getenv(
"PHEMLIGHT_PATH") != 0) {
80 phemPath.push_back(std::string(getenv(
"PHEMLIGHT_PATH")) +
"/");
82 if (getenv(
"SUMO_HOME") != 0) {
83 phemPath.push_back(std::string(getenv(
"SUMO_HOME")) +
"/data/emissions/PHEMlight/");
97 std::string eclower = eClass;
98 std::transform(eclower.begin(), eclower.end(), eclower.begin(), tolower);
106 std::string eClassOffset =
"0";
107 if (eClass.length() == 5 && eClass.substr(0, 4) ==
"Euro") {
108 if (eClass[4] >=
'0' && eClass[4] <=
'6') {
109 eClassOffset = eClass.substr(4, 1);
113 if (vClass ==
"Passenger") {
115 if (fuel ==
"Gasoline") {
117 }
else if (fuel ==
"Diesel") {
119 }
else if (fuel ==
"HybridGasoline") {
120 desc =
"H_" + desc +
"G_";
121 }
else if (fuel ==
"HybridDiesel") {
122 desc =
"H_" + desc +
"G_";
124 desc +=
"EU" + eClassOffset;
125 }
else if (vClass ==
"Moped") {
126 desc =
"KKR_G_EU" + eClassOffset;
127 }
else if (vClass ==
"Motorcycle") {
128 desc =
"MR_G_EU" + eClassOffset;
129 if (fuel ==
"Gasoline2S") {
134 }
else if (vClass ==
"Delivery") {
136 if (fuel ==
"Gasoline") {
138 }
else if (fuel ==
"Diesel") {
141 desc +=
"EU" + eClassOffset +
"_I";
142 if (weight > 1305.) {
144 if (weight > 1760.) {
148 }
else if (vClass ==
"UrbanBus") {
149 desc =
"LB_D_EU" + eClassOffset;
150 }
else if (vClass ==
"Coach") {
151 desc =
"RB_D_EU" + eClassOffset;
152 }
else if (vClass ==
"Truck") {
153 desc =
"Solo_LKW_D_EU" + eClassOffset +
"_I";
154 if (weight > 1305.) {
157 }
else if (vClass ==
"Trailer") {
158 desc =
"LSZ_D_EU" + eClassOffset;
170 if (name.find(
"KKR_") != std::string::npos) {
172 }
else if (name.find(
"RB_") != std::string::npos) {
174 }
else if (name.find(
"LB_") != std::string::npos) {
176 }
else if (name.find(
"LNF_") != std::string::npos) {
178 }
else if (name.find(
"LSZ_") != std::string::npos) {
180 }
else if (name.find(
"MR_") != std::string::npos) {
182 }
else if (name.find(
"LKW_") != std::string::npos) {
192 std::string fuel =
"Gasoline";
193 if (name.find(
"_D_") != std::string::npos) {
196 if (name.find(
"H_") != std::string::npos) {
197 fuel =
"Hybrid" + fuel;
206 if (name.find(
"_EU1") != std::string::npos) {
208 }
else if (name.find(
"_EU2") != std::string::npos) {
210 }
else if (name.find(
"_EU3") != std::string::npos) {
212 }
else if (name.find(
"_EU4") != std::string::npos) {
214 }
else if (name.find(
"_EU5") != std::string::npos) {
216 }
else if (name.find(
"_EU6") != std::string::npos) {
226 if (name.find(
"LNF_") != std::string::npos) {
227 if (name.find(
"_III") != std::string::npos) {
229 }
else if (name.find(
"_II") != std::string::npos) {
231 }
else if (name.find(
"_I") != std::string::npos) {
235 if (name.find(
"Solo_LKW_") != std::string::npos) {
236 if (name.find(
"_II") != std::string::npos) {
238 }
else if (name.find(
"_I") != std::string::npos) {
260 const double corrSpeed =
MAX2((
double) 0.0, v);
265 if (v >
IDLE_SPEED && a < oldCep->GetDecelCoast(corrSpeed, a, slope, 0)) {
270 power = oldCep->
CalcPower(corrSpeed, a, slope);
273 const PHEMCEP*
const oldCep = 0;
277 if (a < currCep->GetDecelCoast(corrSpeed, a, slope) && currCep->
getFuelType() !=
"BEV") {
281 power = currCep->
CalcPower(corrSpeed, v == 0.0 ? 0.0 : a, slope);
301 if (fuelType ==
"D") {
303 }
else if (fuelType ==
"G") {
305 }
else if (fuelType ==
"BEV") {
312 if (fuelType ==
"BEV") {
Data Handler for a single CEP emission data set.
void remove(const std::string str, const T key)
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types...
double GetEmission(const std::string &pollutant, double power, double speed, Helpers *VehicleClass)
bool hasString(const std::string &str) const
int myIndex
the index of the next class
const std::string & GetVehicleFuelType() const
Getter function to recieve vehicle data from CEP.
HelpersPHEMlight()
Constructor.
int getEuroClass(const SUMOEmissionClass c) const
Returns the Euro emission class described by this emission class as described in the Amitran interfac...
EmissionType
Enumerating all emission types, including fuel.
bool setclass(const std::string &VEH)
SUMOReal compute(const SUMOEmissionClass c, const PollutantsInterface::EmissionType e, const double v, const double a, const double slope) const
Returns the amount of emitted pollutant given the vehicle type and state (in mg/s or in ml/s for fuel...
SUMOReal getWeight(const SUMOEmissionClass c) const
Returns a reference weight in kg described by this emission class as described in the Amitran interfa...
static const int HEAVY_BIT
the bit to set for denoting heavy vehicles
static OptionsCont & getOptions()
Retrieves the options.
static PHEMCEPHandler & getHandlerInstance()
Implementatio of Singelton pattern.
std::map< SUMOEmissionClass, PHEMlightdll::CEP * > myCEPs
void insert(const std::string str, const T key, bool checkDuplicates=true)
bool GetCEP(const std::vector< std::string > &DataPath, Helpers *Helper)
void addAlias(const std::string str, const T key)
std::string getFuel(const SUMOEmissionClass c) const
Returns the fuel type described by this emission class as described in the Amitran interface (Gasolin...
SUMOReal 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...
const std::string & getgClass() const
const std::string & getString(const T key) const
const double SECONDS_PER_HOUR
static const int PHEMLIGHT_BASE
const std::string & getErrMsg() const
const std::map< std::string, CEP * > & getCEPS() const
StringBijection< SUMOEmissionClass > myEmissionClassStrings
Mapping between emission class names and integer representations.
std::string getAmitranVehicleClass(const SUMOEmissionClass c) const
Returns the vehicle class described by this emission class as described in the Amitran interface (Pas...
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.
SUMOEmissionClass getClassByName(const std::string &eClass, const SUMOVehicleClass vc)
Checks whether the string describes a known vehicle class.
void setCommentPrefix(const std::string &value)
T get(const std::string &str) const
PHEMCEP * GetCep(SUMOEmissionClass emissionClass)
Returns the CEP data for a PHEM emission class.
PHEMlightdll::Helpers myHelper
PHEMlightdll::CEPHandler myCEPHandler
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.
double CalcPower(double speed, double acc, double gradient)
const std::string & getFuelType() const
double GetEmission(const std::string &pollutantIdentifier, double power, double speed, bool normalized=false) const
Returns a emission measure for power[kW] level.
double GetCO2Emission(double _FC, double _CO, double _HC, Helpers *VehicleClass)
Helper methods for PHEMlight-based emission computation.
void setPHEMDataV(const std::string &value)