Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others. 4 : // This program and the accompanying materials are made available under the 5 : // terms of the Eclipse Public License 2.0 which is available at 6 : // https://www.eclipse.org/legal/epl-2.0/ 7 : // This Source Code may also be made available under the following Secondary 8 : // Licenses when the conditions for such availability set forth in the Eclipse 9 : // Public License 2.0 are satisfied: GNU General Public License, version 2 10 : // or later which is available at 11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html 12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later 13 : /****************************************************************************/ 14 : /// @file HelpersHBEFA3.h 15 : /// @author Daniel Krajzewicz 16 : /// @author Michael Behrisch 17 : /// @date Mon, 10.05.2004 18 : /// 19 : // Helper methods for HBEFA3-based emission computation 20 : /****************************************************************************/ 21 : #pragma once 22 : #include <config.h> 23 : 24 : #include <vector> 25 : #include <limits> 26 : #include <cmath> 27 : #include <utils/common/StdDefs.h> 28 : #include <utils/geom/GeomHelper.h> 29 : #include <utils/common/SUMOVehicleClass.h> 30 : #include "EnergyParams.h" 31 : #include "PollutantsInterface.h" 32 : 33 : 34 : // =========================================================================== 35 : // class definitions 36 : // =========================================================================== 37 : /** 38 : * @class HelpersHBEFA3 39 : * @brief Helper methods for HBEFA3-based emission computation 40 : * 41 : * The parameter are stored per vehicle class; 6*6 parameter are used, sorted by 42 : * the pollutant (CO2, CO, HC, fuel, NOx, PMx), and the function part 43 : * (c0, cav1, cav2, c1, c2, c3). 44 : */ 45 : class HelpersHBEFA3 : public PollutantsInterface::Helper { 46 : private: 47 : static const int HBEFA3_BASE = 2 << 16; 48 : 49 : public: 50 : /** @brief Constructor (initializes myEmissionClassStrings) 51 : */ 52 : HelpersHBEFA3(); 53 : 54 : /** @brief Returns the emission class described by the given parameters. 55 : * @param[in] base the base class giving the default 56 : * @param[in] vClass the vehicle class as described in the Amitran interface (Passenger, ...) 57 : * @param[in] fuel the fuel type as described in the Amitran interface (Gasoline, Diesel, ...) 58 : * @param[in] eClass the emission class as described in the Amitran interface (Euro0, ...) 59 : * @param[in] weight the vehicle weight in kg as described in the Amitran interface 60 : * @return the class described by the parameters 61 : */ 62 : SUMOEmissionClass getClass(const SUMOEmissionClass base, const std::string& vClass, const std::string& fuel, const std::string& eClass, const double weight) const; 63 : 64 : /** @brief Returns the vehicle class described by this emission class as described in the Amitran interface (Passenger, ...) 65 : * @param[in] c the emission class 66 : * @return the name of the vehicle class 67 : */ 68 : std::string getAmitranVehicleClass(const SUMOEmissionClass c) const; 69 : 70 : /** @brief Returns the fuel type described by this emission class as described in the Amitran interface (Gasoline, Diesel, ...) 71 : * @param[in] c the emission class 72 : * @return the fuel type 73 : */ 74 : std::string getFuel(const SUMOEmissionClass c) const; 75 : 76 : /** @brief Returns the Euro emission class described by this emission class as described in the Amitran interface (0, ..., 6) 77 : * @param[in] c the emission class 78 : * @return the Euro class 79 : */ 80 : int getEuroClass(const SUMOEmissionClass c) const; 81 : 82 : 83 : /** @brief Computes the emitted pollutant amount using the given speed and acceleration 84 : * 85 : * As the functions are defining emissions in g/hour, the function's result is normed 86 : * by 3.6 (seconds in an hour/1000) yielding mg/s. For fuel ml/s is returned if volumetric fuel has been requested. 87 : * Coasting and an engine which is off by the given param result directly in zero emission. 88 : * 89 : * @param[in] c emission class for the function parameters to use 90 : * @param[in] e the type of emission (CO, CO2, ...) 91 : * @param[in] v The vehicle's current velocity 92 : * @param[in] a The vehicle's current acceleration 93 : * @param[in] slope The road's slope at vehicle's position [deg] 94 : * @param[in] param parameter of the emission model (only used for the coasting deceleration and to determine whether the engine is off) 95 : * @return The amount emitted by the given emission class when moving with the given velocity and acceleration [mg/s or ml/s] 96 : */ 97 1378727786 : inline double compute(const SUMOEmissionClass c, const PollutantsInterface::EmissionType e, const double v, const double a, const double slope, const EnergyParams* param) const { 98 1378727786 : if (e == PollutantsInterface::ELEC || (param != nullptr && param->isEngineOff())) { 99 228583532 : return 0.; 100 : } 101 1150144254 : if (v > ZERO_SPEED_ACCURACY && a < getCoastingDecel(c, v, a, slope, param)) { 102 : return 0.; 103 : } 104 1106106180 : const int index = (c & ~PollutantsInterface::HEAVY_BIT) - HBEFA3_BASE; 105 : double scale = 3.6; 106 1106106180 : if (e == PollutantsInterface::FUEL && myVolumetricFuel) { 107 24348 : if (getFuel(c) == "Diesel") { 108 : scale *= 836.; 109 : } else { 110 : scale *= 742.; 111 : } 112 : } 113 1106106180 : const double* f = myFunctionParameter[index][e]; 114 1106106180 : return MAX2((f[0] + f[1] * a * v + f[2] * a * a * v + f[3] * v + f[4] * v * v + f[5] * v * v * v) / scale, 0.); 115 : } 116 : 117 : 118 : private: 119 : /// @brief The function parameter 120 : static double myFunctionParameter[45][6][6]; 121 : 122 : };