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