45 ConfigStore inputConfig; |
45 ConfigStore inputConfig; |
46 inputConfig.ConfigureDefaults (); |
46 inputConfig.ConfigureDefaults (); |
47 |
47 |
48 cmd.Parse (argc, argv); |
48 cmd.Parse (argc, argv); |
49 |
49 |
50 Config::SetDefault ("ns3::LteSpectrumPhy::PemEnabled", BooleanValue (false)); |
|
51 |
|
52 // Geometry of the scenario (in meters) |
50 // Geometry of the scenario (in meters) |
53 // Assume squared building |
51 // Assume squared building |
54 double nodeHeight = 1.5; |
52 double nodeHeight = 1.5; |
55 double roomHeight = 3; |
53 double roomHeight = 3; |
56 double roomLength = 500; |
54 double roomLength = 500; |
59 uint32_t nEnb = nRooms*nRooms + 4; |
57 uint32_t nEnb = nRooms*nRooms + 4; |
60 uint32_t nUe = 1; |
58 uint32_t nUe = 1; |
61 |
59 |
62 Ptr < LteHelper > lteHelper = CreateObject<LteHelper> (); |
60 Ptr < LteHelper > lteHelper = CreateObject<LteHelper> (); |
63 //lteHelper->EnableLogComponents (); |
61 //lteHelper->EnableLogComponents (); |
64 lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::BuildingsPropagationLossModel")); |
62 lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisPropagationLossModel")); |
65 |
63 |
66 // Create Nodes: eNodeB and UE |
64 // Create Nodes: eNodeB and UE |
67 NodeContainer enbNodes; |
65 NodeContainer enbNodes; |
68 NodeContainer oneSectorNodes; |
66 NodeContainer oneSectorNodes; |
69 NodeContainer threeSectorNodes; |
67 NodeContainer threeSectorNodes; |
112 mmEnb->SetFloorNumber (0); |
110 mmEnb->SetFloorNumber (0); |
113 mmEnb->SetRoomNumberX (row); |
111 mmEnb->SetRoomNumberX (row); |
114 mmEnb->SetRoomNumberY (column); |
112 mmEnb->SetRoomNumberY (column); |
115 |
113 |
116 // Positioning UEs attached to eNB |
114 // Positioning UEs attached to eNB |
117 mobility.Install (ueNodes.at (plantedEnb)); |
115 mobility.Install (ueNodes.at(plantedEnb)); |
118 for (uint32_t ue = 0; ue < nUe; ue++) |
116 for (uint32_t ue = 0; ue < nUe; ue++) |
119 { |
117 { |
120 Ptr<BuildingsMobilityModel> mmUe = ueNodes.at (plantedEnb).Get (ue)->GetObject<BuildingsMobilityModel> (); |
118 Ptr<BuildingsMobilityModel> mmUe = ueNodes.at(plantedEnb).Get (ue)->GetObject<BuildingsMobilityModel> (); |
121 Vector vUe (v.x, v.y, v.z); |
119 Vector vUe (v.x, v.y, v.z); |
122 mmUe->SetPosition (vUe); |
120 mmUe->SetPosition (vUe); |
123 mmUe->SetIndoor (building); |
121 mmUe->SetIndoor (building); |
124 mmUe->SetFloorNumber (0); |
122 mmUe->SetFloorNumber (0); |
125 mmUe->SetRoomNumberX (row); |
123 mmUe->SetRoomNumberX (row); |
130 |
128 |
131 // Add a 1-sector site |
129 // Add a 1-sector site |
132 Vector v (500, 3000, nodeHeight); |
130 Vector v (500, 3000, nodeHeight); |
133 positionAlloc->Add (v); |
131 positionAlloc->Add (v); |
134 enbPosition.push_back (v); |
132 enbPosition.push_back (v); |
135 mobility.Install (ueNodes.at (plantedEnb)); |
133 mobility.Install (ueNodes.at(plantedEnb)); |
136 plantedEnb++; |
134 plantedEnb++; |
137 |
135 |
138 // Add the 3-sector site |
136 // Add the 3-sector site |
139 for (uint32_t index = 0; index < 3; index++, plantedEnb++) |
137 for (uint32_t index = 0; index < 3; index++, plantedEnb++) |
140 { |
138 { |
141 Vector v (500, 2000, nodeHeight); |
139 Vector v (500, 2000, nodeHeight); |
142 positionAlloc->Add (v); |
140 positionAlloc->Add (v); |
143 enbPosition.push_back (v); |
141 enbPosition.push_back (v); |
144 mobility.Install (ueNodes.at (plantedEnb)); |
142 mobility.Install (ueNodes.at(plantedEnb)); |
145 } |
143 } |
146 |
144 |
147 |
145 |
148 mobility.SetPositionAllocator (positionAlloc); |
146 mobility.SetPositionAllocator (positionAlloc); |
149 mobility.Install (enbNodes); |
147 mobility.Install (enbNodes); |
150 |
148 |
151 // Position of UEs attached to eNB |
149 // Position of UEs attached to eNB |
152 for (uint32_t i = 0; i < nEnb; i++) |
150 for (uint32_t i = 0; i < nEnb; i++) |
153 { |
151 { |
154 UniformVariable posX (enbPosition.at (i).x - roomLength * 0, |
152 UniformVariable posX (enbPosition.at(i).x - roomLength * 0, |
155 enbPosition.at (i).x + roomLength * 0); |
153 enbPosition.at(i).x + roomLength * 0); |
156 UniformVariable posY (enbPosition.at (i).y - roomLength * 0, |
154 UniformVariable posY (enbPosition.at(i).y - roomLength * 0, |
157 enbPosition.at (i).y + roomLength * 0); |
155 enbPosition.at(i).y + roomLength * 0); |
158 positionAlloc = CreateObject<ListPositionAllocator> (); |
156 positionAlloc = CreateObject<ListPositionAllocator> (); |
159 for (uint32_t j = 0; j < nUe; j++) |
157 for (uint32_t j = 0; j < nUe; j++) |
160 { |
158 { |
161 if ( i == nEnb - 3 ) |
159 if ( i == nEnb - 3 ) |
162 { |
160 { |
163 positionAlloc->Add (Vector (enbPosition.at (i).x + 10, enbPosition.at (i).y, nodeHeight)); |
161 positionAlloc->Add (Vector (enbPosition.at(i).x + 10, enbPosition.at(i).y, nodeHeight)); |
164 } |
162 } |
165 else if ( i == nEnb - 2 ) |
163 else if ( i == nEnb - 2 ) |
166 { |
164 { |
167 positionAlloc->Add (Vector (enbPosition.at (i).x - sqrt (10), enbPosition.at (i).y + sqrt (10), nodeHeight)); |
165 positionAlloc->Add (Vector (enbPosition.at(i).x - sqrt (10), enbPosition.at(i).y + sqrt (10), nodeHeight)); |
168 } |
166 } |
169 else if ( i == nEnb - 1 ) |
167 else if ( i == nEnb - 1 ) |
170 { |
168 { |
171 positionAlloc->Add (Vector (enbPosition.at (i).x - sqrt (10), enbPosition.at (i).y - sqrt (10), nodeHeight)); |
169 positionAlloc->Add (Vector (enbPosition.at(i).x - sqrt (10), enbPosition.at(i).y - sqrt (10), nodeHeight)); |
172 } |
170 } |
173 else |
171 else |
174 { |
172 { |
175 positionAlloc->Add (Vector (posX.GetValue (), posY.GetValue (), nodeHeight)); |
173 positionAlloc->Add (Vector (posX.GetValue (), posY.GetValue (), nodeHeight)); |
176 } |
174 } |
177 mobility.SetPositionAllocator (positionAlloc); |
175 mobility.SetPositionAllocator (positionAlloc); |
178 } |
176 } |
179 mobility.Install (ueNodes.at (i)); |
177 mobility.Install (ueNodes.at(i)); |
180 } |
178 } |
181 BuildingsHelper::MakeMobilityModelConsistent (); |
179 BuildingsHelper::MakeMobilityModelConsistent (); |
182 |
180 |
183 |
181 |
184 // Create Devices and install them in the Nodes (eNB and UE) |
182 // Create Devices and install them in the Nodes (eNB and UE) |
206 lteHelper->SetEnbAntennaModelAttribute ("MaxGain", DoubleValue (0.0)); |
204 lteHelper->SetEnbAntennaModelAttribute ("MaxGain", DoubleValue (0.0)); |
207 enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (2))); |
205 enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (2))); |
208 |
206 |
209 for (uint32_t i = 0; i < nEnb; i++) |
207 for (uint32_t i = 0; i < nEnb; i++) |
210 { |
208 { |
211 NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at (i)); |
209 NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at(i)); |
212 ueDevs.push_back (ueDev); |
210 ueDevs.push_back (ueDev); |
213 lteHelper->Attach (ueDev, enbDevs.Get (i)); |
211 lteHelper->Attach (ueDev, enbDevs.Get (i)); |
214 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE; |
212 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE; |
215 EpsBearer bearer (q); |
213 EpsBearer bearer (q); |
216 lteHelper->ActivateEpsBearer (ueDev, bearer, EpcTft::Default ()); |
214 lteHelper->ActivateEpsBearer (ueDev, bearer, EpcTft::Default ()); |
217 } |
215 } |
218 |
216 |
219 Simulator::Stop (Seconds (simTime)); |
217 Simulator::Stop (Seconds (simTime)); |
220 |
218 lteHelper->EnableTraces (); |
221 // better to leave traces disabled |
|
222 //lteHelper->EnableTraces (); |
|
223 |
219 |
224 Ptr<RadioEnvironmentMapHelper> remHelper = CreateObject<RadioEnvironmentMapHelper> (); |
220 Ptr<RadioEnvironmentMapHelper> remHelper = CreateObject<RadioEnvironmentMapHelper> (); |
225 remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0")); |
221 remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0")); |
226 remHelper->SetAttribute ("OutputFile", StringValue ("rem.out")); |
222 remHelper->SetAttribute ("OutputFile", StringValue ("rem.out")); |
227 remHelper->SetAttribute ("XMin", DoubleValue (-200.0)); |
223 remHelper->SetAttribute ("XMin", DoubleValue (-2000.0)); |
228 remHelper->SetAttribute ("XMax", DoubleValue (1200.0)); |
224 remHelper->SetAttribute ("XMax", DoubleValue (+2000.0)); |
229 remHelper->SetAttribute ("XRes", UintegerValue (300)); |
225 remHelper->SetAttribute ("XRes", UintegerValue (100)); |
230 remHelper->SetAttribute ("YMin", DoubleValue (-300.0)); |
226 remHelper->SetAttribute ("YMin", DoubleValue (-500.0)); |
231 remHelper->SetAttribute ("YMax", DoubleValue (+3500.0)); |
227 remHelper->SetAttribute ("YMax", DoubleValue (+3500.0)); |
232 remHelper->SetAttribute ("YRes", UintegerValue (300)); |
228 remHelper->SetAttribute ("YRes", UintegerValue (100)); |
233 remHelper->SetAttribute ("Z", DoubleValue (1.5)); |
229 remHelper->SetAttribute ("Z", DoubleValue (1.5)); |
234 remHelper->Install (); |
230 remHelper->Install (); |
235 // Recall the buildings helper to place the REM nodes in its position |
231 // Recall the buildings helper to place the REM nodes in its position |
236 BuildingsHelper::MakeMobilityModelConsistent (); |
232 BuildingsHelper::MakeMobilityModelConsistent (); |
237 Simulator::Run (); |
233 Simulator::Run (); |