A Discrete-Event Network Simulator
API
rv-battery-model.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Authors: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
19 */
20
21#include "rv-battery-model.h"
22#include "ns3/log.h"
23#include "ns3/assert.h"
24#include "ns3/double.h"
25#include "ns3/trace-source-accessor.h"
26#include "ns3/simulator.h"
27#include <cmath>
28
29namespace ns3 {
30
31NS_LOG_COMPONENT_DEFINE ("RvBatteryModel");
32
33NS_OBJECT_ENSURE_REGISTERED (RvBatteryModel);
34
35TypeId
37{
38 static TypeId tid = TypeId ("ns3::RvBatteryModel")
40 .SetGroupName ("Energy")
41 .AddConstructor<RvBatteryModel> ()
42 .AddAttribute ("RvBatteryModelPeriodicEnergyUpdateInterval",
43 "RV battery model sampling interval.",
44 TimeValue (Seconds (1.0)),
48 .AddAttribute ("RvBatteryModelLowBatteryThreshold",
49 "Low battery threshold.",
50 DoubleValue (0.10), // as a fraction of the initial energy
52 MakeDoubleChecker<double> ())
53 .AddAttribute ("RvBatteryModelOpenCircuitVoltage",
54 "RV battery model open circuit voltage.",
55 DoubleValue (4.1),
58 MakeDoubleChecker<double> ())
59 .AddAttribute ("RvBatteryModelCutoffVoltage",
60 "RV battery model cutoff voltage.",
61 DoubleValue (3.0),
64 MakeDoubleChecker<double> ())
65 .AddAttribute ("RvBatteryModelAlphaValue",
66 "RV battery model alpha value.",
67 DoubleValue (35220.0),
70 MakeDoubleChecker<double> ())
71 .AddAttribute ("RvBatteryModelBetaValue",
72 "RV battery model beta value.",
73 DoubleValue (0.637),
76 MakeDoubleChecker<double> ())
77 .AddAttribute ("RvBatteryModelNumOfTerms",
78 "The number of terms of the infinite sum for estimating battery level.",
79 IntegerValue (10), // value used in paper
82 MakeIntegerChecker<int> ())
83 .AddTraceSource ("RvBatteryModelBatteryLevel",
84 "RV battery model battery level.",
86 "ns3::TracedValueCallback::Double")
87 .AddTraceSource ("RvBatteryModelBatteryLifetime",
88 "RV battery model battery lifetime.",
90 "ns3::TracedValueCallback::Time")
91 ;
92 return tid;
93}
94
96{
97 NS_LOG_FUNCTION (this);
100 m_previousLoad = -1.0;
101 m_batteryLevel = 1; // fully charged
102 m_lifetime = Seconds (0.0);
103}
104
106{
107 NS_LOG_FUNCTION (this);
108}
109
110double
112{
113 NS_LOG_FUNCTION (this);
114 return m_alpha * GetSupplyVoltage ();
115}
116
117double
119{
120 NS_LOG_FUNCTION (this);
121 // average of Voc and Vcutoff
123}
124
125double
127{
128 NS_LOG_FUNCTION (this);
131}
132
133double
135{
136 NS_LOG_FUNCTION (this);
137 return GetBatteryLevel ();
138}
139
140void
142{
143 NS_LOG_FUNCTION (this);
144
145 // do not update if battery is already dead
146 if (m_batteryLevel <= 0)
147 {
148 NS_LOG_DEBUG ("RvBatteryModel:Battery is dead!");
149 return;
150 }
151
152 // do not update if simulation has finished
154 {
155 return;
156 }
157
158 NS_LOG_DEBUG ("RvBatteryModel:Updating remaining energy!");
159
161
162 double currentLoad = CalculateTotalCurrent () * 1000; // must be in mA
163 double calculatedAlpha = Discharge (currentLoad, Simulator::Now ());
164
165 NS_LOG_DEBUG ("RvBatteryModel:Calculated alpha = " << calculatedAlpha <<
166 " time = " << Simulator::Now ().As (Time::S));
167
168 // calculate battery level
169 m_batteryLevel = 1 - (calculatedAlpha / m_alpha);
170 if (m_batteryLevel < 0)
171 {
172 m_batteryLevel = 0;
173 }
174
175 // check if battery level is below the low battery threshold.
177 {
179 NS_LOG_DEBUG ("RvBatteryModel:Battery level below threshold!");
181 }
182
183 m_previousLoad = currentLoad;
187 this);
188}
189
190void
192{
193 NS_LOG_FUNCTION (this << interval);
194 m_samplingInterval = interval;
195}
196
197Time
199{
200 NS_LOG_FUNCTION (this);
201 return m_samplingInterval;
202}
203
204void
206{
207 NS_LOG_FUNCTION (this << voltage);
208 NS_ASSERT (voltage >= 0);
209 m_openCircuitVoltage = voltage;
210}
211
212double
214{
215 NS_LOG_FUNCTION (this);
217}
218
219void
221{
222 NS_LOG_FUNCTION (this << voltage);
223 NS_ASSERT (voltage <= m_openCircuitVoltage);
224 m_cutoffVoltage = voltage;
225}
226
227double
229{
230 NS_LOG_FUNCTION (this);
231 return m_cutoffVoltage;
232}
233
234void
236{
237 NS_LOG_FUNCTION (this << alpha);
238 NS_ASSERT (alpha >= 0);
239 m_alpha = alpha;
240}
241
242double
244{
245 NS_LOG_FUNCTION (this);
246 return m_alpha;
247}
248
249void
251{
252 NS_LOG_FUNCTION (this << beta);
253 NS_ASSERT (beta >= 0);
254 m_beta = beta;
255}
256
257double
259{
260 NS_LOG_FUNCTION (this);
261 return m_beta;
262}
263
264double
266{
267 NS_LOG_FUNCTION (this);
269 return m_batteryLevel;
270}
271
272Time
274{
275 NS_LOG_FUNCTION (this);
276 return m_lifetime;
277}
278
279void
281{
282 NS_LOG_FUNCTION (this << num);
283 m_numOfTerms = num;
284}
285
286int
288{
289 NS_LOG_FUNCTION (this);
290 return m_numOfTerms;
291}
292
293/*
294 * Private functions start here.
295 */
296
297void
299{
300 NS_LOG_FUNCTION (this);
301 NS_LOG_DEBUG ("RvBatteryModel:Starting battery level update!");
302 UpdateEnergySource (); // start periodic sampling of load (total current)
303}
304
305void
307{
308 NS_LOG_FUNCTION (this);
309 BreakDeviceEnergyModelRefCycle (); // break reference cycle
310}
311
312void
314{
315 NS_LOG_FUNCTION (this);
316 NS_LOG_DEBUG ("RvBatteryModel:Energy depleted!");
317 NotifyEnergyDrained (); // notify DeviceEnergyModel objects
318}
319
320double
322{
323 NS_LOG_FUNCTION (this << load << t);
324
325 // record only when load changes
326 if (load != m_previousLoad)
327 {
328 m_load.push_back (load);
329 m_previousLoad = load;
331 m_timeStamps.push_back (t);
332 }
333 else
334 {
335 if (!m_timeStamps.empty())
336 {
337 m_timeStamps[m_timeStamps.size () - 1] = t;
338 }
339 }
340
342
343 // calculate alpha for new t
344 NS_ASSERT (m_load.size () == m_timeStamps.size () - 1); // size must be equal
345 double calculatedAlpha = 0.0;
346 if (m_timeStamps.size () == 1)
347 {
348 // constant load
349 calculatedAlpha = m_load[0] * RvModelAFunction (t, t, Seconds (0.0),
350 m_beta);
351 }
352 else
353 {
354 // changing load
355 for (uint64_t i = 1; i < m_timeStamps.size (); i++)
356 {
357 calculatedAlpha += m_load[i - 1] * RvModelAFunction (t, m_timeStamps[i],
358 m_timeStamps[i - 1],
359 m_beta);
360 }
361 }
362
363 return calculatedAlpha;
364}
365
366double
368{
369 NS_LOG_FUNCTION (this << t << sk << sk_1 << beta);
370
371 // everything is in minutes
372 double firstDelta = (t - sk).GetMinutes ();
373 double secondDelta = (t - sk_1).GetMinutes ();
374 double delta = (sk - sk_1).GetMinutes ();
375
376 double sum = 0.0;
377 for (int m = 1; m <= m_numOfTerms; m++)
378 {
379 double square = beta * beta * m * m;
380 sum += (std::exp (-square * (firstDelta)) - std::exp (-square * (secondDelta))) / square;
381 }
382 return delta + 2 * sum;
383}
384
385} // namespace ns3
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:41
Introspection did not find any typical Config paths.
Definition: energy-source.h:87
void BreakDeviceEnergyModelRefCycle(void)
This function is called to break reference cycle between EnergySource and DeviceEnergyModel.
double CalculateTotalCurrent(void)
void NotifyEnergyDrained(void)
This function notifies all DeviceEnergyModel of energy depletion event.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Definition: event-id.cc:53
Hold a signed integer type.
Definition: integer.h:44
Rakhmatov Vrudhula non-linear battery model.
double m_lowBatteryTh
low battery threshold, as a fraction of the initial energy
int GetNumOfTerms(void) const
double m_openCircuitVoltage
Open circuit voltage (in Volts)
virtual double GetSupplyVoltage(void) const
void SetNumOfTerms(int num)
Sets the number of terms of the infinite sum for estimating battery level.
virtual void DoInitialize(void)
Defined in ns3::Object.
double m_cutoffVoltage
Cutoff voltage (in Volts)
virtual double GetEnergyFraction(void)
Time GetSamplingInterval(void) const
EventId m_currentSampleEvent
Current sample event.
static TypeId GetTypeId(void)
Get the type ID.
double GetAlpha(void) const
void SetSamplingInterval(Time interval)
Time m_lastSampleTime
Last sample time.
virtual double GetInitialEnergy(void) const
double m_previousLoad
load value (total current) of previous sampling
std::vector< Time > m_timeStamps
time stamps of load profile
int m_numOfTerms
Number# of terms for infinite sum in battery level estimation.
double GetCutoffVoltage(void) const
double Discharge(double load, Time t)
Discharges the battery.
void SetCutoffVoltage(double voltage)
Sets cutoff voltage of battery.
virtual double GetRemainingEnergy(void)
void SetBeta(double beta)
Sets the beta value for the battery model.
Time GetLifetime(void) const
virtual void DoDispose(void)
Defined in ns3::Object.
std::vector< double > m_load
load profile
TracedValue< Time > m_lifetime
time of death of the battery
Time m_samplingInterval
Sampling interval.
void SetOpenCircuitVoltage(double voltage)
Sets open circuit voltage of battery.
double RvModelAFunction(Time t, Time sk, Time sk_1, double beta)
RV model A function.
void SetAlpha(double alpha)
Sets the alpha value for the battery model.
double GetOpenCircuitVoltage(void) const
virtual void UpdateEnergySource(void)
Implements UpdateEnergySource.
void HandleEnergyDrainedEvent(void)
Handles the remaining energy going to zero event.
double GetBeta(void) const
double m_alpha
alpha value of RV model, in Coulomb
double GetBatteryLevel(void)
TracedValue< double > m_batteryLevel
Battery level is defined as: output of Discharge function / alpha value.
double m_beta
beta value of RV model, in second^-1
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:555
static bool IsFinished(void)
Check if the simulation should finish.
Definition: simulator.cc:165
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
@ S
second
Definition: nstime.h:115
AttributeValue implementation for Time.
Definition: nstime.h:1309
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Definition: double.h:42
Ptr< const AttributeAccessor > MakeIntegerAccessor(T1 a1)
Definition: integer.h:45
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Definition: nstime.h:1310
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:206
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:274
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1245
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Definition: time.cc:520