Eclipse SUMO - Simulation of Urban MObility
HelpersEnergy.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
16 // Helper methods for HBEFA-based emission computation
17 /****************************************************************************/
18 
19 
20 // ===========================================================================
21 // included modules
22 // ===========================================================================
23 #include <config.h>
24 
25 #include <utils/common/SUMOTime.h>
26 #include <utils/common/ToString.h>
27 #include "HelpersEnergy.h"
28 
29 
30 // ===========================================================================
31 // method definitions
32 // ===========================================================================
36  // default values from
37  // Kurczveil, T., López, P.Á., & Schnieder, E. (2014). Implementation of an Energy Model and a Charging Infrastructure in SUMO.
49 }
50 
51 
52 double
53 HelpersEnergy::compute(const SUMOEmissionClass /* c */, const PollutantsInterface::EmissionType e, const double v, const double a, const double slope, const std::map<int, double>* param) const {
54  if (e != PollutantsInterface::ELEC) {
55  return 0.;
56  }
57  if (param == nullptr) {
58  param = &myDefaultParameter;
59  }
60  //@ToDo: All formulas below work with the logic of the euler update (refs #860).
61  // Approximation order could be improved. Refs. #2592.
62 
63  const double lastV = v - ACCEL2SPEED(a);
64  const double mass = param->find(SUMO_ATTR_VEHICLEMASS)->second;
65 
66  // calculate potential energy difference
67  double energyDiff = mass * 9.81 * sin(DEG2RAD(slope)) * SPEED2DIST(v);
68 
69  // kinetic energy difference of vehicle
70  energyDiff += 0.5 * mass * (v * v - lastV * lastV);
71 
72  // add rotational energy diff of internal rotating elements
73  energyDiff += param->find(SUMO_ATTR_INTERNALMOMENTOFINERTIA)->second * (v * v - lastV * lastV);
74 
75  // Energy loss through Air resistance [Ws]
76  // Calculate energy losses:
77  // EnergyLoss,Air = 1/2 * rho_air [kg/m^3] * myFrontSurfaceArea [m^2] * myAirDragCoefficient [-] * v_Veh^2 [m/s] * s [m]
78  // ... with rho_air [kg/m^3] = 1,2041 kg/m^3 (at T = 20C)
79  // ... with s [m] = v_Veh [m/s] * TS [s]
80  energyDiff += 0.5 * 1.2041 * param->find(SUMO_ATTR_FRONTSURFACEAREA)->second * param->find(SUMO_ATTR_AIRDRAGCOEFFICIENT)->second * v * v * SPEED2DIST(v);
81 
82  // Energy loss through Roll resistance [Ws]
83  // ... (fabs(veh.getSpeed())>=0.01) = 0, if vehicle isn't moving
84  // EnergyLoss,Tire = c_R [-] * F_N [N] * s [m]
85  // ... with c_R = ~0.012 (car tire on asphalt)
86  // ... with F_N [N] = myMass [kg] * g [m/s^2]
87  energyDiff += param->find(SUMO_ATTR_ROLLDRAGCOEFFICIENT)->second * 9.81 * mass * SPEED2DIST(v);
88 
89  // Energy loss through friction by radial force [Ws]
90  // If angle of vehicle was changed
91  const double angleDiff = param->find(SUMO_ATTR_ANGLE)->second;
92  if (angleDiff != 0.) {
93  // Compute new radio
94  double radius = SPEED2DIST(v) / fabs(angleDiff);
95 
96  // Check if radius is in the interval [0.0001 - 10000] (To avoid overflow and division by zero)
97  if (radius < 0.0001) {
98  radius = 0.0001;
99  } else if (radius > 10000) {
100  radius = 10000;
101  }
102  // EnergyLoss,internalFrictionRadialForce = c [m] * F_rad [N];
103  // Energy loss through friction by radial force [Ws]
104  energyDiff += param->find(SUMO_ATTR_RADIALDRAGCOEFFICIENT)->second * mass * v * v / radius;
105  }
106 
107  // EnergyLoss,constantConsumers
108  // Energy loss through constant loads (e.g. A/C) [Ws]
109  energyDiff += param->find(SUMO_ATTR_CONSTANTPOWERINTAKE)->second;
110 
111  //E_Bat = E_kin_pot + EnergyLoss;
112  if (energyDiff > 0) {
113  // Assumption: Efficiency of myPropulsionEfficiency when accelerating
114  energyDiff /= param->find(SUMO_ATTR_PROPULSIONEFFICIENCY)->second;
115  } else {
116  // Assumption: Efficiency of myRecuperationEfficiency when recuperating
117  energyDiff *= param->find(SUMO_ATTR_RECUPERATIONEFFICIENCY)->second;
118  if (a != 0) {
119  // Fiori, Chiara & Ahn, Kyoungho & Rakha, Hesham. (2016).
120  // Power-based electric vehicle energy consumption model: Model
121  // development and validation. Applied Energy. 168. 257-268.
122  // 10.1016/j.apenergy.2016.01.097.
123  //
124  // Insaf Sagaama, Amine Kchiche, Wassim Trojet, Farouk Kamoun
125  // Improving The Accuracy of The Energy Consumption Model for
126  // Electric Vehicle in SUMO Considering The Ambient Temperature
127  // Effects
128  energyDiff *= (1 / exp(param->find(SUMO_ATTR_RECUPERATIONEFFICIENCY_BY_DECELERATION)->second / fabs(a)));
129  }
130  }
131 
132  // convert from [Ws] to [Wh] (3600s / 1h):
133  return energyDiff / 3600.;
134 }
135 
136 
137 /****************************************************************************/
SUMO_ATTR_ANGLE
Definition: SUMOXMLDefinitions.h:794
SPEED2DIST
#define SPEED2DIST(x)
Definition: SUMOTime.h:46
ToString.h
HelpersEnergy::HelpersEnergy
HelpersEnergy()
Constructor (initializes myEmissionClassStrings)
Definition: HelpersEnergy.cpp:33
SUMO_ATTR_PROPULSIONEFFICIENCY
Propulsion efficiency.
Definition: SUMOXMLDefinitions.h:501
SUMO_ATTR_VEHICLEMASS
Vehicle mass.
Definition: SUMOXMLDefinitions.h:487
SUMOTime.h
HelpersEnergy::compute
double compute(const SUMOEmissionClass c, const PollutantsInterface::EmissionType e, const double v, const double a, const double slope, const std::map< int, double > *param) const
Computes the emitted pollutant amount using the given speed and acceleration.
Definition: HelpersEnergy.cpp:53
HelpersEnergy::myDefaultParameter
std::map< int, double > myDefaultParameter
The default parameter.
Definition: HelpersEnergy.h:71
PollutantsInterface::EmissionType
EmissionType
Enumerating all emission types, including fuel.
Definition: PollutantsInterface.h:55
ACCEL2SPEED
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:52
SUMO_ATTR_CONSTANTPOWERINTAKE
Constant Power Intake.
Definition: SUMOXMLDefinitions.h:499
HelpersEnergy.h
SUMOEmissionClass
int SUMOEmissionClass
Definition: SUMOVehicleClass.h:231
HelpersEnergy::ENERGY_BASE
static const int ENERGY_BASE
Definition: HelpersEnergy.h:44
SUMO_ATTR_RECUPERATIONEFFICIENCY
Recuperation efficiency (constant)
Definition: SUMOXMLDefinitions.h:503
StringBijection::insert
void insert(const std::string str, const T key, bool checkDuplicates=true)
Definition: StringBijection.h:71
SUMO_ATTR_ROLLDRAGCOEFFICIENT
Roll Drag coefficient.
Definition: SUMOXMLDefinitions.h:497
PollutantsInterface::ELEC
Definition: PollutantsInterface.h:55
DEG2RAD
#define DEG2RAD(x)
Definition: GeomHelper.h:37
PollutantsInterface::ZERO_EMISSIONS
static const int ZERO_EMISSIONS
the first class in each model representing a zero emission vehicle
Definition: PollutantsInterface.h:261
PollutantsInterface::Helper::myEmissionClassStrings
StringBijection< SUMOEmissionClass > myEmissionClassStrings
Mapping between emission class names and integer representations.
Definition: PollutantsInterface.h:253
SUMO_ATTR_INTERNALMOMENTOFINERTIA
Internal moment of inertia.
Definition: SUMOXMLDefinitions.h:493
config.h
PollutantsInterface
Helper methods for PHEMlight-based emission computation.
Definition: PollutantsInterface.h:51
SUMO_ATTR_AIRDRAGCOEFFICIENT
Air drag coefficient.
Definition: SUMOXMLDefinitions.h:491
SUMO_ATTR_RADIALDRAGCOEFFICIENT
Radial drag coefficient.
Definition: SUMOXMLDefinitions.h:495
SUMO_ATTR_RECUPERATIONEFFICIENCY_BY_DECELERATION
Recuperation efficiency (by deceleration)
Definition: SUMOXMLDefinitions.h:505
SUMO_ATTR_FRONTSURFACEAREA
Front surface area.
Definition: SUMOXMLDefinitions.h:489