SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HelpersPHEMlight.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Helper methods for PHEMlight-based emission computation
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
12 // Copyright (C) 2013-2014 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include "HelpersPHEMlight.h"
34 #include "PHEMCEPHandler.h"
35 #include "PHEMConstants.h"
36 #include <limits>
37 #include <cmath>
38 
39 #ifdef CHECK_MEMORY_LEAKS
40 #include <foreign/nvwa/debug_new.h>
41 #endif // CHECK_MEMORY_LEAKS
42 
43 
44 // ===========================================================================
45 // method definitions
46 // ===========================================================================
47 HelpersPHEMlight::HelpersPHEMlight() : PollutantsInterface::Helper("PHEMlight"), myIndex(PHEMLIGHT_BASE) {
49 }
50 
51 
53 HelpersPHEMlight::getClassByName(const std::string& eClass, const SUMOVehicleClass vc) {
54  if (eClass == "unknown" && !myEmissionClassStrings.hasString("unknown")) {
55  myEmissionClassStrings.addAlias("unknown", getClassByName("PKW_G_EU4", vc));
56  }
57  if (myEmissionClassStrings.hasString(eClass)) {
58  return myEmissionClassStrings.get(eClass);
59  }
60  if (eClass.size() < 8 || (eClass.find("_D_EU") == std::string::npos && eClass.find("_G_EU") == std::string::npos)) {
61  return false;
62  }
63  int index = myIndex++;
64  const std::string type = eClass.substr(0, 3);
65  if (type == "LB_" || type == "RB_" || type == "LSZ" || eClass.find("LKW") != std::string::npos) {
67  }
68  myEmissionClassStrings.insert(eClass, index);
69  if (!PHEMCEPHandler::getHandlerInstance().Load(index, eClass)) {
70  myEmissionClassStrings.remove(eClass, index);
71  myIndex--;
72  throw InvalidArgument("File for PHEM emission class " + eClass + " not found.");
73  }
74  std::string eclower = eClass;
75  std::transform(eclower.begin(), eclower.end(), eclower.begin(), tolower);
76  myEmissionClassStrings.addAlias(eclower, index);
77  return index;
78 }
79 
80 
82 HelpersPHEMlight::getMaxAccel(SUMOEmissionClass c, double v, double a, double slope) {
84  if (currCep == 0) {
85  return -1.;
86  }
87  return currCep->GetMaxAccel(v, a, slope);
88 }
89 
90 
92 HelpersPHEMlight::getClass(const SUMOEmissionClass base, const std::string& vClass, const std::string& fuel, const std::string& eClass, const double weight) const {
93  std::string eClassOffset = "0";
94  if (eClass.length() == 5 && eClass.substr(0, 4) == "Euro") {
95  if (eClass[4] >= '0' && eClass[4] <= '6') {
96  eClassOffset = eClass.substr(4, 1);
97  }
98  }
99  std::string desc;
100  if (vClass == "Passenger") {
101  desc = "PKW_";
102  if (fuel == "Gasoline") {
103  desc += "G_";
104  } else if (fuel == "Diesel") {
105  desc += "D_";
106  } else if (fuel == "HybridGasoline") {
107  desc = "H_" + desc + "G_";
108  } else if (fuel == "HybridDiesel") {
109  desc = "H_" + desc + "G_";
110  }
111  desc += "EU" + eClassOffset;
112  } else if (vClass == "Moped") {
113  desc = "KKR_G_EU" + eClassOffset;
114  } else if (vClass == "Motorcycle") {
115  desc = "MR_G_EU" + eClassOffset;
116  if (fuel == "Gasoline2S") {
117  desc += "_2T";
118  } else {
119  desc += "_4T";
120  }
121  } else if (vClass == "Delivery") {
122  desc = "LNF_";
123  if (fuel == "Gasoline") {
124  desc += "G_";
125  } else if (fuel == "Diesel") {
126  desc += "D_";
127  }
128  desc += "EU" + eClassOffset + "_I";
129  if (weight > 1305.) {
130  desc += "I";
131  if (weight > 1760.) {
132  desc += "I";
133  }
134  }
135  } else if (vClass == "UrbanBus") {
136  desc = "LB_D_EU" + eClassOffset;
137  } else if (vClass == "Coach") {
138  desc = "RB_D_EU" + eClassOffset;
139  } else if (vClass == "Truck") {
140  desc = "Solo_LKW_D_EU" + eClassOffset + "_I";
141  if (weight > 1305.) {
142  desc += "I";
143  }
144  } else if (vClass == "Trailer") {
145  desc = "LSZ_D_EU" + eClassOffset;
146  }
147  if (myEmissionClassStrings.hasString(desc)) {
148  return myEmissionClassStrings.get(desc);
149  }
150  return base;
151 }
152 
153 
154 std::string
156  const std::string name = myEmissionClassStrings.getString(c);
157  if (name.find("KKR_") != std::string::npos) {
158  return "Moped";
159  } else if (name.find("RB_") != std::string::npos) {
160  return "Coach";
161  } else if (name.find("LB_") != std::string::npos) {
162  return "UrbanBus";
163  } else if (name.find("LNF_") != std::string::npos) {
164  return "Delivery";
165  } else if (name.find("LSZ_") != std::string::npos) {
166  return "Trailer";
167  } else if (name.find("MR_") != std::string::npos) {
168  return "Motorcycle";
169  } else if (name.find("LKW_") != std::string::npos) {
170  return "Truck";
171  }
172  return "Passenger";
173 }
174 
175 
176 std::string
178  const std::string name = myEmissionClassStrings.getString(c);
179  std::string fuel = "Gasoline";
180  if (name.find("_D_") != std::string::npos) {
181  fuel = "Diesel";
182  }
183  if (name.find("H_") != std::string::npos) {
184  fuel = "Hybrid" + fuel;
185  }
186  return fuel;
187 }
188 
189 
190 int
192  const std::string name = myEmissionClassStrings.getString(c);
193  if (name.find("_EU1") != std::string::npos) {
194  return 1;
195  } else if (name.find("_EU2") != std::string::npos) {
196  return 2;
197  } else if (name.find("_EU3") != std::string::npos) {
198  return 3;
199  } else if (name.find("_EU4") != std::string::npos) {
200  return 4;
201  } else if (name.find("_EU5") != std::string::npos) {
202  return 5;
203  } else if (name.find("_EU6") != std::string::npos) {
204  return 6;
205  }
206  return 0;
207 }
208 
209 
210 SUMOReal
212  const std::string name = myEmissionClassStrings.getString(c);
213  if (name.find("LNF_") != std::string::npos) {
214  if (name.find("_III") != std::string::npos) {
215  return 2630.;
216  } else if (name.find("_II") != std::string::npos) {
217  return 1532.;
218  } else if (name.find("_I") != std::string::npos) {
219  return 652.;
220  }
221  }
222  if (name.find("Solo_LKW_") != std::string::npos) {
223  if (name.find("_II") != std::string::npos) {
224  return 8398.;
225  } else if (name.find("_I") != std::string::npos) {
226  return 18702.;
227  }
228  }
229  return -1.;
230 }
231 
232 
233 SUMOReal
234 HelpersPHEMlight::compute(const SUMOEmissionClass c, const PollutantsInterface::EmissionType e, const double v, const double a, const double slope) const {
235  const PHEMCEP* const currCep = PHEMCEPHandler::getHandlerInstance().GetCep(c);
236  if (currCep == 0) {
237  return 0.;
238  }
239  const double power = currCep->CalcPower(v, a, slope);
240  switch (e) {
242  return currCep->GetEmission("CO", power) / SECONDS_PER_HOUR * 1000.;
244  return currCep->GetEmission("FC", power) * 3.15 / SECONDS_PER_HOUR * 1000.;
246  return currCep->GetEmission("HC", power) / SECONDS_PER_HOUR * 1000.;
248  return currCep->GetEmission("NOx", power) / SECONDS_PER_HOUR * 1000.;
250  return currCep->GetEmission("PM", power) / SECONDS_PER_HOUR * 1000.;
252  std::string fuelType = currCep->GetVehicleFuelType();
253  if (fuelType == "D") { // divide by average diesel density of 836 g/l
254  return currCep->GetEmission("FC", power) / 836. / SECONDS_PER_HOUR * 1000.;
255  } else if (fuelType == "G") { // divide by average gasoline density of 742 g/l
256  return currCep->GetEmission("FC", power) / 742. / SECONDS_PER_HOUR * 1000.;
257  } else {
258  return currCep->GetEmission("FC", power) / SECONDS_PER_HOUR * 1000.; // surely false, but at least not additionally modified
259  }
260  }
261  }
262  // should never get here
263  return 0.;
264 }
265 
266 
267 /****************************************************************************/
268