--- a/src/lte/examples/lena-extract-pathloss.cc Wed Nov 30 13:28:39 2011 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,272 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
- *
- * 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: Manuel Requena <manuel.requena@cttc.es>
- * Nicola Baldo <nbaldo@cttc.es>
- */
-
-
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/mobility-module.h"
-#include "ns3/lte-module.h"
-#include "ns3/config-store.h"
-#include "ns3/rlc-stats-calculator.h"
-
-#include <iomanip>
-#include <string>
-
-#include <ns3/log.h>
-
-using namespace ns3;
-
-
-NS_LOG_COMPONENT_DEFINE ("InterCellInterference");
-
-
-/**
- * Store the last pathloss value for each TX-RX pair. This is an
- * example of how the PathlossTrace (provided by some SpectrumChannel
- * implementations) work.
- *
- */
-class GlobalPathlossDatabase
-{
-public:
-
- /**
- * update the pathloss value
- *
- * \param context
- * \param txPhy the transmitting PHY
- * \param rxPhy the receiving PHY
- * \param lossDb the loss in dB
- */
- virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb) = 0;
-
- /**
- * print the stored pathloss values to standard output
- *
- */
- void Print ();
-
-protected:
-
- // CELL ID IMSI PATHLOSS
- std::map<uint16_t, std::map<uint64_t, double> > m_pathlossMap;
-};
-
-void
-GlobalPathlossDatabase::Print ()
-{
- NS_LOG_FUNCTION (this);
- for (std::map<uint16_t, std::map<uint64_t, double> >::const_iterator cellIdIt = m_pathlossMap.begin ();
- cellIdIt != m_pathlossMap.end ();
- ++cellIdIt)
- {
- for (std::map<uint64_t, double>::const_iterator imsiIt = cellIdIt->second.begin ();
- imsiIt != cellIdIt->second.end ();
- ++imsiIt)
- {
- std::cout << "CellId: " << cellIdIt->first << " IMSI: " << imsiIt->first << " pathloss: " << imsiIt->second << " dB" << std::endl;
- }
- }
-}
-
-class DownlinkGlobalPathlossDatabase : public GlobalPathlossDatabase
-{
-public:
- // inherited from GlobalPathlossDatabase
- virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
-};
-
-void
-DownlinkGlobalPathlossDatabase::UpdatePathloss (std::string context,
- Ptr<SpectrumPhy> txPhy,
- Ptr<SpectrumPhy> rxPhy,
- double lossDb)
-{
- NS_LOG_FUNCTION (this << lossDb);
- uint16_t cellId = txPhy->GetDevice ()->GetObject<LteEnbNetDevice> ()->GetCellId ();
- uint16_t imsi = rxPhy->GetDevice ()->GetObject<LteUeNetDevice> ()->GetImsi ();
- m_pathlossMap[cellId][imsi] = lossDb;
-}
-
-
-class UplinkGlobalPathlossDatabase : public GlobalPathlossDatabase
-{
-public:
- // inherited from GlobalPathlossDatabase
- virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
-};
-
-void
-UplinkGlobalPathlossDatabase::UpdatePathloss (std::string context,
- Ptr<SpectrumPhy> txPhy,
- Ptr<SpectrumPhy> rxPhy,
- double lossDb)
-{
- NS_LOG_FUNCTION (this << lossDb);
- uint16_t imsi = txPhy->GetDevice ()->GetObject<LteUeNetDevice> ()->GetImsi ();
- uint16_t cellId = rxPhy->GetDevice ()->GetObject<LteEnbNetDevice> ()->GetCellId ();
- m_pathlossMap[cellId][imsi] = lossDb;
-}
-
-
-
-
-
-int main (int argc, char *argv[])
-{
- double enbDist = 20.0;
- double radius = 10.0;
- uint32_t numUes = 1;
-
-
- CommandLine cmd;
- cmd.AddValue ("enbDist", "distance between the two eNBs", enbDist);
- cmd.AddValue ("radius", "the radius of the disc where UEs are placed around an eNB", radius);
- cmd.AddValue ("numUes", "how many UEs are attached to each eNB", numUes);
- cmd.Parse (argc, argv);
-
- ConfigStore inputConfig;
- inputConfig.ConfigureDefaults ();
-
- // parse again so you can override default values from the command line
- cmd.Parse (argc, argv);
-
- // determine the string tag that identifies this simulation run
- // this tag is then appended to all filenames
-
- IntegerValue runValue;
- GlobalValue::GetValueByName ("RngRun", runValue);
-
- std::ostringstream tag;
- tag << "_enbDist" << std::setw (3) << std::setfill ('0') << std::fixed << std::setprecision (0) << enbDist
- << "_radius" << std::setw (3) << std::setfill ('0') << std::fixed << std::setprecision (0) << radius
- << "_numUes" << std::setw (3) << std::setfill ('0') << numUes
- << "_rngRun" << std::setw (3) << std::setfill ('0') << runValue.Get () ;
-
- Ptr<LenaHelper> lena = CreateObject<LenaHelper> ();
-
-
- // NOTE: the PropagationLoss trace source of the SpectrumChannel
- // works only for single-frequency path loss model.
- // e.g., it will work with the following models:
- // ns3::FriisPropagationLossModel,
- // ns3::TwoRayGroundPropagationLossModel,
- // ns3::LogDistancePropagationLossModel,
- // ns3::ThreeLogDistancePropagationLossModel,
- // ns3::NakagamiPropagationLossModel
- // ns3::BuildingsPropagationLossModel
- // etc.
- // but it WON'T work if you ONLY use SpectrumPropagationLossModels such as:
- // ns3::FriisSpectrumPropagationLossModel
- // ns3::ConstantSpectrumPropagationLossModel
- lena->SetAttribute ("PathlossModel", StringValue ("ns3::Cost231PropagationLossModel"));
-
-
- // Create Nodes: eNodeB and UE
- NodeContainer enbNodes;
- NodeContainer ueNodes1, ueNodes2;
- enbNodes.Create (2);
- ueNodes1.Create (numUes);
- ueNodes2.Create (numUes);
-
- // Position of eNBs
- Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
- positionAlloc->Add (Vector (0.0, 0.0, 0.0));
- positionAlloc->Add (Vector (enbDist, 0.0, 0.0));
- MobilityHelper enbMobility;
- enbMobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
- enbMobility.SetPositionAllocator (positionAlloc);
- enbMobility.Install (enbNodes);
-
- // Position of UEs attached to eNB 1
- MobilityHelper ue1mobility;
- ue1mobility.SetPositionAllocator ("ns3::UniformDiscPositionAllocator",
- "X", DoubleValue (0.0),
- "Y", DoubleValue (0.0),
- "rho", DoubleValue (radius));
- ue1mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
- ue1mobility.Install (ueNodes1);
-
- // Position of UEs attached to eNB 2
- MobilityHelper ue2mobility;
- ue2mobility.SetPositionAllocator ("ns3::UniformDiscPositionAllocator",
- "X", DoubleValue (enbDist),
- "Y", DoubleValue (0.0),
- "rho", DoubleValue (radius));
- ue2mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
- ue2mobility.Install (ueNodes2);
-
-
-
- // Create Devices and install them in the Nodes (eNB and UE)
- NetDeviceContainer enbDevs;
- NetDeviceContainer ueDevs1;
- NetDeviceContainer ueDevs2;
- enbDevs = lena->InstallEnbDevice (enbNodes);
- ueDevs1 = lena->InstallUeDevice (ueNodes1);
- ueDevs2 = lena->InstallUeDevice (ueNodes2);
-
- // Attach UEs to a eNB
- lena->Attach (ueDevs1, enbDevs.Get (0));
- lena->Attach (ueDevs2, enbDevs.Get (1));
-
- // Activate an EPS bearer on all UEs
- enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
- EpsBearer bearer (q);
- lena->ActivateEpsBearer (ueDevs1, bearer, LteTft::Default ());
- lena->ActivateEpsBearer (ueDevs2, bearer, LteTft::Default ());
-
- Simulator::Stop (Seconds (0.5));
-
- // Insert RLC Performance Calculator
- std::string dlOutFname = "DlRlcStats";
- dlOutFname.append (tag.str ());
- std::string ulOutFname = "UlRlcStats";
- ulOutFname.append (tag.str ());
-
- lena->EnableMacTraces ();
- lena->EnableRlcTraces ();
-
-
-
- // keep track of all path loss values in a global object
- DownlinkGlobalPathlossDatabase dlPathlossDb;
- UplinkGlobalPathlossDatabase ulPathlossDb;
- // we rely on the fact that LenaHelper creates the DL channel object first, then the UL channel object,
- // hence the former will have index 0 and the latter 1
- Config::Connect ("/ChannelList/0/PropagationLoss",
- MakeCallback (&DownlinkGlobalPathlossDatabase::UpdatePathloss, &dlPathlossDb));
- Config::Connect ("/ChannelList/1/PropagationLoss",
- MakeCallback (&UplinkGlobalPathlossDatabase::UpdatePathloss, &ulPathlossDb));
-
- Simulator::Run ();
-
-
- // print the pathloss values at the end of the simulation
- std::cout << std::endl << "Downlink pathloss:" << std::endl;
- dlPathlossDb.Print ();
- std::cout << std::endl << "Uplink pathloss:" << std::endl;
- ulPathlossDb.Print ();
-
-
- Simulator::Destroy ();
- return 0;
-}