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 /****************************************************************************/
10 /// @file MSMeanData_Harmonoise.cpp
11 /// @author Daniel Krajzewicz
12 /// @author Michael Behrisch
13 /// @date Mon, 10.05.2004
14 /// @version $Id$
15 ///
16 // Redirector for mean data output (net->edgecontrol)
17 /****************************************************************************/
18
19
20 // ===========================================================================
21 // included modules
22 // ===========================================================================
23 #include <config.h>
24
25 #include <microsim/MSLane.h>
26 #include <microsim/MSVehicle.h>
27 #include <microsim/output/MSDetectorControl.h>
28 #include <utils/common/SUMOTime.h>
29 #include <utils/common/ToString.h>
30 #include <utils/iodevices/OutputDevice.h>
31 #include "MSMeanData_Harmonoise.h"
32 #include <utils/emissions/HelpersHarmonoise.h>
33 #include <limits>
34
35
36 // ===========================================================================
37 // method definitions
38 // ===========================================================================
39 // ---------------------------------------------------------------------------
40 // MSMeanData_Harmonoise::MSLaneMeanDataValues - methods
41 // ---------------------------------------------------------------------------
MSLaneMeanDataValues(MSLane * const lane,const double length,const bool doAdd,const MSMeanData_Harmonoise * parent)42 MSMeanData_Harmonoise::MSLaneMeanDataValues::MSLaneMeanDataValues(MSLane* const lane, const double length, const bool doAdd,
43 const MSMeanData_Harmonoise* parent)
44 : MSMeanData::MeanDataValues(lane, length, doAdd, parent),
45 currentTimeN(0), meanNTemp(0), myParent(parent) {}
46
47
~MSLaneMeanDataValues()48 MSMeanData_Harmonoise::MSLaneMeanDataValues::~MSLaneMeanDataValues() {
49 }
50
51
52 void
reset(bool)53 MSMeanData_Harmonoise::MSLaneMeanDataValues::reset(bool) {
54 sampleSeconds = 0;
55 currentTimeN = 0;
56 meanNTemp = 0;
57 travelledDistance = 0;
58 }
59
60
61 void
addTo(MSMeanData::MeanDataValues & val) const62 MSMeanData_Harmonoise::MSLaneMeanDataValues::addTo(MSMeanData::MeanDataValues& val) const {
63 MSLaneMeanDataValues& v = (MSLaneMeanDataValues&) val;
64 v.sampleSeconds += sampleSeconds;
65 v.meanNTemp += meanNTemp;
66 v.travelledDistance += travelledDistance;
67 }
68
69
70 void
update()71 MSMeanData_Harmonoise::MSLaneMeanDataValues::update() {
72 meanNTemp += currentTimeN;
73 currentTimeN = 0;
74 }
75
76
77 void
notifyMoveInternal(const SUMOTrafficObject & veh,const double,const double timeOnLane,const double,const double meanSpeedVehicleOnLane,const double,const double travelledDistanceVehicleOnLane,const double)78 MSMeanData_Harmonoise::MSLaneMeanDataValues::notifyMoveInternal(const SUMOTrafficObject& veh, const double /* frontOnLane */, const double timeOnLane, const double /*meanSpeedFrontOnLane*/, const double meanSpeedVehicleOnLane, const double /*travelledDistanceFrontOnLane*/, const double travelledDistanceVehicleOnLane, const double /* meanLengthOnLane */) {
79 const double sn = HelpersHarmonoise::computeNoise(veh.getVehicleType().getEmissionClass(),
80 // XXX: recheck, which value to use here for the speed. (Leo) Refs. #2579
81 (double) meanSpeedVehicleOnLane, veh.getAcceleration());
82 currentTimeN += (double) pow(10., (sn / 10.));
83 sampleSeconds += timeOnLane;
84 travelledDistance += travelledDistanceVehicleOnLane;
85 }
86
87
88 void
write(OutputDevice & dev,const SUMOTime period,const double,const double defaultTravelTime,const int) const89 MSMeanData_Harmonoise::MSLaneMeanDataValues::write(OutputDevice& dev, const SUMOTime period,
90 const double /*numLanes*/, const double defaultTravelTime, const int /*numVehicles*/) const {
91 dev.writeAttr("noise", (meanNTemp != 0 ? (double)(10. * log10(meanNTemp * TS / STEPS2TIME(period))) : (double) 0.));
92 if (sampleSeconds > myParent->myMinSamples) {
93 double traveltime = myParent->myMaxTravelTime;
94 if (travelledDistance > 0.f) {
95 traveltime = MIN2(traveltime, myLaneLength * sampleSeconds / travelledDistance);
96 }
97 dev.writeAttr("traveltime", traveltime);
98 } else if (defaultTravelTime >= 0.) {
99 // @todo default value for noise
100 dev.writeAttr("traveltime", defaultTravelTime);
101 }
102 dev.closeTag();
103 }
104
105
106
107 // ---------------------------------------------------------------------------
108 // MSMeanData_Harmonoise - methods
109 // ---------------------------------------------------------------------------
MSMeanData_Harmonoise(const std::string & id,const SUMOTime dumpBegin,const SUMOTime dumpEnd,const bool useLanes,const bool withEmpty,const bool printDefaults,const bool withInternal,const bool trackVehicles,const double maxTravelTime,const double minSamples,const std::string & vTypes)110 MSMeanData_Harmonoise::MSMeanData_Harmonoise(const std::string& id,
111 const SUMOTime dumpBegin, const SUMOTime dumpEnd,
112 const bool useLanes, const bool withEmpty,
113 const bool printDefaults, const bool withInternal,
114 const bool trackVehicles,
115 const double maxTravelTime, const double minSamples,
116 const std::string& vTypes)
117 : MSMeanData(id, dumpBegin, dumpEnd, useLanes, withEmpty, printDefaults,
118 withInternal, trackVehicles, 0, maxTravelTime, minSamples, vTypes) {
119 }
120
121
~MSMeanData_Harmonoise()122 MSMeanData_Harmonoise::~MSMeanData_Harmonoise() {}
123
124
125 MSMeanData::MeanDataValues*
createValues(MSLane * const lane,const double length,const bool doAdd) const126 MSMeanData_Harmonoise::createValues(MSLane* const lane, const double length, const bool doAdd) const {
127 return new MSLaneMeanDataValues(lane, length, doAdd, this);
128 }
129
130
131 void
detectorUpdate(const SUMOTime step)132 MSMeanData_Harmonoise::detectorUpdate(const SUMOTime step) {
133 MSMeanData::detectorUpdate(step);
134 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i = myMeasures.begin(); i != myMeasures.end(); ++i) {
135 const std::vector<MeanDataValues*>& lm = *i;
136 for (std::vector<MeanDataValues*>::const_iterator j = lm.begin(); j != lm.end(); ++j) {
137 (*j)->update();
138 }
139 }
140 }
141
142
143 /****************************************************************************/
144
145