src/contrib/energy/model/li-ion-energy-source.cc
changeset 6938 85d201f1c67f
parent 6937 99ee62eec34c
child 6939 9fe35f79fd8f
--- a/src/contrib/energy/model/li-ion-energy-source.cc	Tue Mar 22 16:21:35 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,307 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 Andrea Sacco
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Andrea Sacco <andrea.sacco85@gmail.com>
- */
-
-#include "li-ion-energy-source.h"
-#include "ns3/log.h"
-#include "ns3/assert.h"
-#include "ns3/double.h"
-#include "ns3/trace-source-accessor.h"
-#include "ns3/simulator.h"
-
-#include <cmath>
-
-NS_LOG_COMPONENT_DEFINE ("LiIonEnergySource");
-
-namespace ns3 {
-
-NS_OBJECT_ENSURE_REGISTERED (LiIonEnergySource);
-
-TypeId
-LiIonEnergySource::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::LiIonEnergySource")
-    .SetParent<EnergySource> ()
-    .AddConstructor<LiIonEnergySource> ()
-    .AddAttribute ("LiIonEnergySourceInitialEnergyJ",
-                   "Initial energy stored in basic energy source.",
-                   DoubleValue (31752.0),  // in Joules
-                   MakeDoubleAccessor (&LiIonEnergySource::SetInitialEnergy,
-                                       &LiIonEnergySource::GetInitialEnergy),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("IntialCellVoltage",
-                   "Initial (maximum) voltage of the cell (fully charged).",
-                   DoubleValue (4.05), // in Volts
-                   MakeDoubleAccessor (&LiIonEnergySource::SetInitialSupplyVoltage,
-                                       &LiIonEnergySource::GetSupplyVoltage),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("NominalCellVoltage",
-                   "Nominal voltage of the cell.",
-                   DoubleValue (3.6),  // in Volts
-                   MakeDoubleAccessor (&LiIonEnergySource::m_eNom),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("ExpCellVoltage",
-                   "Cell voltage at the end of the exponential zone.",
-                   DoubleValue (3.6),  // in Volts
-                   MakeDoubleAccessor (&LiIonEnergySource::m_eExp),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("RatedCapacity",
-                   "Rated capacity of the cell.",
-                   DoubleValue (2.45),   // in Ah
-                   MakeDoubleAccessor (&LiIonEnergySource::m_qRated),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("NomCapacity",
-                   "Cell capacity at the end of the nominal zone.",
-                   DoubleValue (1.1),  // in Ah
-                   MakeDoubleAccessor (&LiIonEnergySource::m_qNom),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("ExpCapacity",
-                   "Cell Capacity at the end of the exponential zone.",
-                   DoubleValue (1.2),  // in Ah
-                   MakeDoubleAccessor (&LiIonEnergySource::m_qExp),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("InternalResistance",
-                   "Internal resistance of the cell",
-                   DoubleValue (0.083),  // in Ohms
-                   MakeDoubleAccessor (&LiIonEnergySource::m_internalResistance),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("TypCurrent",
-                   "Typical discharge current used to fit the curves",
-                   DoubleValue (2.33), // in A
-                   MakeDoubleAccessor (&LiIonEnergySource::m_typCurrent),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("ThresholdVoltage",
-                   "Minimum threshold voltage to consider the battery depleted.",
-                   DoubleValue (3.3), // in Volts
-                   MakeDoubleAccessor (&LiIonEnergySource::m_minVoltTh),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("PeriodicEnergyUpdateInterval",
-                   "Time between two consecutive periodic energy updates.",
-                   TimeValue (Seconds (1.0)),
-                   MakeTimeAccessor (&LiIonEnergySource::SetEnergyUpdateInterval,
-                                     &LiIonEnergySource::GetEnergyUpdateInterval),
-                   MakeTimeChecker ())
-    .AddTraceSource ("RemainingEnergy",
-                     "Remaining energy at BasicEnergySource.",
-                     MakeTraceSourceAccessor (&LiIonEnergySource::m_remainingEnergyJ))
-  ;
-  return tid;
-}
-
-LiIonEnergySource::LiIonEnergySource ()
-  : m_drainedCapacity (0.0),
-    m_lastUpdateTime (Seconds (0.0))
-{
-}
-
-LiIonEnergySource::~LiIonEnergySource ()
-{
-}
-
-void
-LiIonEnergySource::SetInitialEnergy (double initialEnergyJ)
-{
-  NS_LOG_FUNCTION (this << initialEnergyJ);
-  NS_ASSERT (initialEnergyJ >= 0);
-  m_initialEnergyJ = initialEnergyJ;
-  // set remaining energy to be initial energy
-  m_remainingEnergyJ = m_initialEnergyJ;
-}
-
-double
-LiIonEnergySource::GetInitialEnergy (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_initialEnergyJ;
-}
-
-void
-LiIonEnergySource::SetInitialSupplyVoltage (double supplyVoltageV)
-{
-  m_eFull = supplyVoltageV;
-  m_supplyVoltageV = supplyVoltageV;
-}
-
-double
-LiIonEnergySource::GetSupplyVoltage (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_supplyVoltageV;
-}
-
-void
-LiIonEnergySource::SetEnergyUpdateInterval (Time interval)
-{
-  NS_LOG_FUNCTION (this);
-  m_energyUpdateInterval = interval;
-}
-
-Time
-LiIonEnergySource::GetEnergyUpdateInterval (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_energyUpdateInterval;
-}
-
-double
-LiIonEnergySource::GetRemainingEnergy (void)
-{
-  NS_LOG_FUNCTION (this);
-  // update energy source to get the latest remaining energy.
-  UpdateEnergySource ();
-  return m_remainingEnergyJ;
-}
-
-double
-LiIonEnergySource::GetEnergyFraction (void)
-{
-  NS_LOG_FUNCTION (this);
-  // update energy source to get the latest remaining energy.
-  UpdateEnergySource ();
-  return m_remainingEnergyJ / m_initialEnergyJ;
-}
-
-void
-LiIonEnergySource::DecreaseRemainingEnergy (double energyJ)
-{
-  NS_LOG_FUNCTION (this << energyJ);
-  NS_ASSERT (energyJ >= 0);
-  m_remainingEnergyJ -= energyJ;
-
-  // check if remaining energy is 0
-  if (m_supplyVoltageV <= m_minVoltTh)
-    {
-      HandleEnergyDrainedEvent ();
-    }
-}
-
-void
-LiIonEnergySource::IncreaseRemainingEnergy (double energyJ)
-{
-  NS_LOG_FUNCTION (this << energyJ);
-  NS_ASSERT (energyJ >= 0);
-  m_remainingEnergyJ += energyJ;
-}
-
-void
-LiIonEnergySource::UpdateEnergySource (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("LiIonEnergySource:Updating remaining energy at node #" <<
-                GetNode ()->GetId ());
-
-  // do not update if simulation has finished
-  if (Simulator::IsFinished ())
-    {
-      return;
-    }
-
-  m_energyUpdateEvent.Cancel ();
-
-  CalculateRemainingEnergy ();
-
-  if (m_remainingEnergyJ <= 0)
-    {
-      HandleEnergyDrainedEvent ();
-      return; // stop periodic update
-    }
-
-  m_lastUpdateTime = Simulator::Now ();
-
-  m_energyUpdateEvent = Simulator::Schedule (m_energyUpdateInterval,
-                                             &LiIonEnergySource::UpdateEnergySource,
-                                             this);
-}
-
-/*
- * Private functions start here.
- */
-void
-LiIonEnergySource::DoStart (void)
-{
-  NS_LOG_FUNCTION (this);
-  UpdateEnergySource ();  // start periodic update
-}
-
-void
-LiIonEnergySource::DoDispose (void)
-{
-  NS_LOG_FUNCTION (this);
-  // calculate remaining energy at the end of simulation
-  CalculateRemainingEnergy ();
-  BreakDeviceEnergyModelRefCycle ();  // break reference cycle
-}
-
-
-void
-LiIonEnergySource::HandleEnergyDrainedEvent (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("LiIonEnergySource:Energy depleted at node #" <<
-                GetNode ()->GetId ());
-  NotifyEnergyDrained (); // notify DeviceEnergyModel objects
-  m_remainingEnergyJ = 0; // energy never goes below 0
-}
-
-
-void
-LiIonEnergySource::CalculateRemainingEnergy (void)
-{
-  NS_LOG_FUNCTION (this);
-  double totalCurrentA = CalculateTotalCurrent ();
-  Time duration = Simulator::Now () - m_lastUpdateTime;
-  NS_ASSERT (duration.GetSeconds () >= 0);
-  // energy = current * voltage * time
-  double energyToDecreaseJ = totalCurrentA * m_supplyVoltageV * duration.GetSeconds ();
-  m_remainingEnergyJ -= energyToDecreaseJ;
-  m_drainedCapacity += (totalCurrentA * duration.GetSeconds () / 3600);
-  // update the supply voltage
-  m_supplyVoltageV = GetVoltage (totalCurrentA);
-  NS_LOG_DEBUG ("LiIonEnergySource:Remaining energy = " << m_remainingEnergyJ);
-}
-
-double
-LiIonEnergySource::GetVoltage (double i) const
-{
-  NS_LOG_FUNCTION (this << i);
-
-  // integral of i in dt, drained capacity in Ah
-  double it = m_drainedCapacity;
-
-  // empirical factors
-  double A = m_eFull - m_eExp;
-  double B = 3 / m_qExp;
-
-  // slope of the polarization curve
-  double K = std::abs ( (m_eFull - m_eNom + A * (exp (-B * m_qNom) - 1)) * (m_qRated - m_qNom) / m_qNom);
-
-  // constant voltage
-  double E0 = m_eFull + K + m_internalResistance * m_typCurrent - A;
-
-  double E = E0 - K * m_qRated / (m_qRated - it) + A * exp (-B * it);
-
-  // cell voltage
-  double V = E - m_internalResistance * i;
-
-  NS_LOG_DEBUG ("Voltage: " << V << " with E: " << E);
-
-  return V;
-}
-
-} // namespace ns3