A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
sionna-rt-channel-example.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2025 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3 * Author: Amir Ashtari <aashtari@cttc.es>
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7/**
8 * @file sionna-rt-channel-example.cc
9 * @brief Example demonstrating how to use the Sionna RT channel model in ns-3.
10 *
11 * This example shows how to configure and use the Sionna RT channel classes to
12 * compute the average SNR between two static/moving nodes in a scene computed
13 * using the sionna.rt Python library. The example:
14 * - Configures a SionnaRtSpectrumPropagationLossModel instance to use the
15 * sionna.rt scene and path solver,
16 * - Creates a simple two-node network (SimpleNetDevice),
17 * - Configures mobility and uniform planar arrays for antennas on each node,
18 * - Applies simple DFT-based beamforming to point arrays at the intended peer,
19 * - Computes average SNR periodically and logs results to the console and a file.
20 *
21 * The example uses default 30 GHz operation, 18 MHz equivalent LTE bandwidth
22 * (100 RBs), and `ThreeGppAntennaModel` elements arranged in small planar arrays.
23 *
24 * Prerequisites:
25 * - The sionna.rt Python library must be available and imported properly by the
26 * Sionna RT channel model (check PYTHONPATH and environment).
27 *
28 *
29 * Common command-line options (and defaults):
30 * - frequency: Operating frequency in Hz (default 30e9)
31 * - txPow: Tx power in dBm (default 49.0)
32 * - noiseFigure: Noise figure in dB (default 9.0)
33 * - distance: Distance between tx and rx in meters (default 50.0)
34 * - simTime: Simulation time in milliseconds (default 2000)
35 * - timeRes: Time resolution for periodic SNR compute (ms) (default 10)
36 * - IsImageRenderedEnabled: Enable rendering of scene images (default true)
37 * - outputFileName: Output filename prefix for scene images (default "sionna-rt-scene3-")
38 * - outputFileDirectory: Directory for scene image output (default "sionna-rt-images2")
39 *
40 * The example also exposes several Sionna RT path solver configuration parameters:
41 * - maxDepth: maximum reflection/refraction depth
42 * - los: include line-of-sight
43 * - specularReflection: enable specular reflections
44 * - diffuseReflection: enable diffuse reflections
45 * - diffraction: enable diffraction
46 * - edgeDiffraction: enable edge diffraction
47 * - refraction: enable refractions
48 * - syntheticArray: use synthetic array processing
49 * - seed: random seed used by the path solver
50 *
51 * The main computed outputs are:
52 * - Per-iteration SNR
53 * - Average rx power
54 * - A log file named "snr-trace.txt" containing time-stamped SNR values
55 *
56 * @note The channel update period is set using the ns-3 attribute:
57 * ns3::SionnaRtChannelModel::UpdatePeriod
58 *
59 */
60
61#include "pybind11/pybind11.h"
62
63#include "ns3/channel-condition-model.h"
64#include "ns3/constant-position-mobility-model.h"
65#include "ns3/constant-velocity-mobility-model.h"
66#include "ns3/core-module.h"
67#include "ns3/lte-spectrum-value-helper.h"
68#include "ns3/mobility-model.h"
69#include "ns3/net-device.h"
70#include "ns3/node-container.h"
71#include "ns3/node.h"
72#include "ns3/output-stream-wrapper.h"
73#include "ns3/simple-net-device.h"
74#include "ns3/sionna-rt-channel-model.h"
75#include "ns3/sionna-rt-spectrum-propagation-loss-model.h"
76#include "ns3/spectrum-signal-parameters.h"
77#include "ns3/three-gpp-antenna-model.h"
78#include "ns3/uniform-planar-array.h"
79
80#include <iomanip>
81#include <iostream>
82
83NS_LOG_COMPONENT_DEFINE("SionnaRTChannelExample");
84namespace py = pybind11;
85using namespace ns3;
86
88 m_spectrumLossModel; //!< the SpectrumPropagationLossModel object
89static int g_snrSamples; //!< number of SNR samples computed
90static double g_snrSumDb; //!< running sum of SNR values in dB
91
92/**
93 * @brief A structure that holds the parameters for the
94 * ComputeSnr function. In this way the problem with the limited
95 * number of parameters of method Schedule is avoided.
96 */
98{
99 Ptr<MobilityModel> txMob; //!< the tx mobility model
100 Ptr<MobilityModel> rxMob; //!< the rx mobility model
101 double txPow; //!< the tx power in dBm
102 double noiseFigure; //!< the noise figure in dB
103 Ptr<PhasedArrayModel> txAntenna; //!< the tx antenna array
104 Ptr<PhasedArrayModel> rxAntenna; //!< the rx antenna array
105 Ptr<OutputStreamWrapper> stream; //!< output stream wrapper for SNR trace
106};
107
108/**
109 * Perform the beamforming using the DFT beamforming method
110 * @param thisDevice the device performing the beamforming
111 * @param thisAntenna the antenna object associated to thisDevice
112 * @param otherDevice the device towards which point the beam
113 */
114static void
116 Ptr<PhasedArrayModel> thisAntenna,
117 Ptr<NetDevice> otherDevice)
118{
119 // retrieve the position of the two devices
120 Vector aPos = thisDevice->GetNode()->GetObject<MobilityModel>()->GetPosition();
121 Vector bPos = otherDevice->GetNode()->GetObject<MobilityModel>()->GetPosition();
122
123 // compute the azimuth and the elevation angles
124 Angles completeAngle(bPos, aPos);
125 double hAngleRadian = completeAngle.GetAzimuth();
126
127 double vAngleRadian = completeAngle.GetInclination(); // the elevation angle
128
129 // retrieve the number of antenna elements and resize the vector
130 uint64_t totNoArrayElements = thisAntenna->GetNumElems();
131 PhasedArrayModel::ComplexVector antennaWeights(totNoArrayElements);
132
133 // the total power is divided equally among the antenna elements
134 double power = 1.0 / sqrt(totNoArrayElements);
135
136 // compute the antenna weights
137 const double sinVAngleRadian = sin(vAngleRadian);
138 const double cosVAngleRadian = cos(vAngleRadian);
139 const double sinHAngleRadian = sin(hAngleRadian);
140 const double cosHAngleRadian = cos(hAngleRadian);
141
142 for (uint64_t ind = 0; ind < totNoArrayElements; ind++)
143 {
144 Vector loc = thisAntenna->GetElementLocation(ind);
145 double phase = -2 * M_PI *
146 (sinVAngleRadian * cosHAngleRadian * loc.x +
147 sinVAngleRadian * sinHAngleRadian * loc.y + cosVAngleRadian * loc.z);
148 antennaWeights[ind] = exp(std::complex<double>(0, phase)) * power;
149 }
150
151 // store the antenna weights
152 thisAntenna->SetBeamformingVector(antennaWeights);
153}
154
155/**
156 * Print the python executable and version
157 */
158static void
160{
161 py::object sys = py::module_::import("sys");
162 py::print("Python executable:", sys.attr("executable"));
163 py::print("Python version:", sys.attr("version"));
164}
165
166/**
167 * Compute the average SNR
168 * @param params A structure that holds the parameters that are needed to perform calculations in
169 * ComputeSnr
170 */
171static void
173{
174 // Create the tx PSD using the LteSpectrumValueHelper
175 // 100 RBs corresponds to 18 MHz (1 RB = 180 kHz)
176 // EARFCN 100 corresponds to 2125.00 MHz
177 std::vector<int> activeRbs0(100);
178 for (int i = 0; i < 100; i++)
179 {
180 activeRbs0[i] = i;
181 }
182 auto txPsd =
183 LteSpectrumValueHelper::CreateTxPowerSpectralDensity(2100, 100, params.txPow, activeRbs0);
184 auto txParams = Create<SpectrumSignalParameters>();
185 txParams->psd = txPsd->Copy();
186 NS_LOG_DEBUG("Average tx power " << 10 * log10(Sum(*txPsd) * 180e3) << " dB");
187
188 // create the noise PSD
189 auto noisePsd =
190 LteSpectrumValueHelper::CreateNoisePowerSpectralDensity(2100, 100, params.noiseFigure);
191 NS_LOG_DEBUG("Average noise power " << 10 * log10(Sum(*noisePsd) * 180e3) << " dB");
192
193 // Zero pathloss :: already included in the SionnaRtSpectrumPropagationLossModel
194 // so no need to add it here
195
196 NS_ASSERT_MSG(params.txAntenna, "params.txAntenna is nullptr!");
197 NS_ASSERT_MSG(params.rxAntenna, "params.rxAntenna is nullptr!");
198
199 // apply the fast fading and the beamforming gain
200 auto rxParams = m_spectrumLossModel->CalcRxPowerSpectralDensity(txParams,
201 params.txMob,
202 params.rxMob,
203 params.txAntenna,
204 params.rxAntenna);
205 auto rxPsd = rxParams->psd;
206 double rxPowDb = 10 * log10(Sum(*rxPsd) * 180e3);
207 double snrDb = 10 * log10(Sum(*rxPsd) / Sum(*noisePsd));
208 NS_LOG_DEBUG("Average rx power " << rxPowDb << " dB");
209 NS_LOG_DEBUG("Average SNR " << snrDb << " dB");
210
211 g_snrSamples++;
212 g_snrSumDb += snrDb;
213
214 std::cout << " [t=" << std::fixed << std::setprecision(3) << Simulator::Now().GetSeconds()
215 << "s]"
216 << " SNR = " << std::setprecision(2) << snrDb << " dB"
217 << " | Rx power = " << rxPowDb << " dBm" << std::endl;
218
219 // print the SNR and pathloss values in the snr-trace.txt file
220 auto* stream = params.stream->GetStream();
221 *stream << Simulator::Now().GetSeconds() << " " << snrDb << std::endl;
222}
223
224int
225main(int argc, char* argv[])
226{
227 py::scoped_interpreter guard{}; // Python stays alive for whole program
228
229 // to check the python executable and version
231
232 std::cout << "\n--- Sionna-RT Channel Example ---\n" << std::endl;
233
234 double frequency = 30e9; // operating frequency in Hz (corresponds to EARFCN 2100)
235 double txPow = 49.0; // tx power in dBm
236 double noiseFigure = 9.0; // noise figure in dB
237 double distance = 50.0; // distance between tx and rx nodes in meters
238 uint32_t simTime = 20; // simulation time in milliseconds
239 uint32_t timeRes = 10; // time resolution in milliseconds
240
241 std::string Scenario = "simple_street_canyon_with_cars"; // propagation scenario
242
243 bool enableGnbIso = false; // enable isotropic elements at gNB
244 bool enableUeIso = false; // enable isotropic elements at UE
245 bool enableGnbDualPolarized = true; // enable dual-polarized elements at gNB
246 bool enableUeDualPolarized = true; // enable dual-polarized elements at UE
247
248 bool IsImageRenderedEnabled = false; // enable rendering of scene images to file
249 Vector CameraPosition(Vector(70.0, -20.0, 190.0)); // Camera position
250 Vector CameraLookAt(Vector(0.0, 0.0, 4.0)); // Camera look-at point
251 std::string filenamePrefix = "sionna-rt-scene-"; // output file name for scene images
252 std::string filedirectory = "sionna-rt-images"; // output file directory for scene images
253
254 // Sionna RT path solver configuration defaults
256 RtPathSolverConfig.maxDepth = 2; // Maximum reflection/refraction depth
257 RtPathSolverConfig.los = true; // Include line-of-sight path
258 RtPathSolverConfig.specularReflection = true; // Enable specular reflections
259 RtPathSolverConfig.diffuseReflection = true; // Enable diffuse reflections
260 RtPathSolverConfig.diffraction = true; // Disable diffraction
261 RtPathSolverConfig.edgeDiffraction = true; // Disable edge diffraction
262 RtPathSolverConfig.refraction = true; // Enable refractions
263 RtPathSolverConfig.syntheticArray = false; // Use synthetic array processing
264 RtPathSolverConfig.seed = 41; // Random seed
265
267 cmd.AddValue("Scenario", "Propagation scenario", Scenario);
268
269 cmd.AddValue("frequency", "Operating frequency in Hz", frequency);
270
271 cmd.AddValue("enableGnbIso", "Enable isotropic elements at gNB", enableGnbIso);
272 cmd.AddValue("enableUeIso", "Enable isotropic elements at UE", enableUeIso);
273 cmd.AddValue("enableGnbDualPolarized",
274 "Enable dual-polarized elements at gNB",
275 enableGnbDualPolarized);
276 cmd.AddValue("enableUeDualPolarized",
277 "Enable dual-polarized elements at UE",
278 enableUeDualPolarized);
279
280 cmd.AddValue("IsImageRenderedEnabled",
281 "Enable rendering of scene images to file",
282 IsImageRenderedEnabled);
283 cmd.AddValue("outputFileName", "Output file name for scene images", filenamePrefix);
284 cmd.AddValue("outputFileDirectory", "Output file directory for scene images", filedirectory);
285 cmd.AddValue("cameraPosition", "Camera position for scene rendering", CameraPosition);
286 cmd.AddValue("cameraLookAt", "Camera look-at point for scene rendering", CameraLookAt);
287
288 cmd.AddValue("txPow", "Tx power in dBm", txPow);
289 cmd.AddValue("noiseFigure", "Noise figure in dB", noiseFigure);
290 cmd.AddValue("distance", "Distance between tx and rx nodes in meters", distance);
291
292 cmd.AddValue("simTime", "Simulation time in milliseconds", simTime);
293 cmd.AddValue("timeRes", "Time resolution in milliseconds", timeRes);
294
295 cmd.AddValue("maxDepth",
296 "Maximum reflection/refraction depth for sionna-rt configuration",
297 RtPathSolverConfig.maxDepth);
298 cmd.AddValue("los",
299 "Include line-of-sight path for sionna-rt configuration",
300 RtPathSolverConfig.los);
301 cmd.AddValue("specularReflection",
302 "Enable specular reflections for sionna-rt configuration",
303 RtPathSolverConfig.specularReflection);
304 cmd.AddValue("diffuseReflection",
305 "Enable diffuse reflections for sionna-rt configuration",
306 RtPathSolverConfig.diffuseReflection);
307 cmd.AddValue("refraction",
308 "Enable refractions for sionna-rt configuration",
309 RtPathSolverConfig.refraction);
310 cmd.AddValue("syntheticArray",
311 "Use synthetic array processing for sionna-rt configuration",
312 RtPathSolverConfig.syntheticArray);
313 cmd.AddValue("diffraction",
314 "Enable diffraction for sionna-rt configuration",
315 RtPathSolverConfig.diffraction);
316 cmd.AddValue("edgeDiffraction",
317 "Enable edge diffraction for sionna-rt configuration",
318 RtPathSolverConfig.edgeDiffraction);
319 cmd.AddValue("seed", "Random seed", RtPathSolverConfig.seed);
320
321 cmd.Parse(argc, argv);
322
323 // set the channel update period used by the Sionna RT channel model
324 Config::SetDefault("ns3::SionnaRtChannelModel::UpdatePeriod",
325 TimeValue(MilliSeconds(5))); // update the channel at each iteration
326
327 RngSeedManager::SetSeed(RtPathSolverConfig.seed);
328 RngSeedManager::SetRun(RtPathSolverConfig.seed);
329
330 // create and configure the Sionna-RT spectrum propagation loss model
332 m_spectrumLossModel->SetChannelModelAttribute("Frequency", DoubleValue(frequency));
333 m_spectrumLossModel->SetChannelModelAttribute(
334 "Scenario",
335 StringValue(Scenario)); // set the propagation scenario
336
337 // enable image rendering and set output filenames/paths if desired
338 m_spectrumLossModel->SetChannelModelAttribute(
339 "IsImageRenderedEnabled",
340 BooleanValue(IsImageRenderedEnabled)); // enable rendering of scene images to file
341 m_spectrumLossModel->SetChannelModelAttribute(
342 "OutputImageDirectory",
343 StringValue(filedirectory)); // set output directory for scene images
344 m_spectrumLossModel->SetChannelModelAttribute(
345 "OutputImageName",
346 StringValue(filenamePrefix)); // set the output file name for scene images
347
348 // set up camera parameters used for scene rendering
349 m_spectrumLossModel->SetChannelModelAttribute("CameraPosition", VectorValue(CameraPosition));
350 m_spectrumLossModel->SetChannelModelAttribute("CameraLookAt", VectorValue(CameraLookAt));
351
352 // apply the solver configuration
353 m_spectrumLossModel->SetRtPathSolverConfig(RtPathSolverConfig);
354
355 // create the tx and rx nodes
357 nodes.Create(2);
358
359 // create the tx and rx devices
362
363 // associate the nodes and the devices
364 nodes.Get(0)->AddDevice(txDev);
365 txDev->SetNode(nodes.Get(0));
366 nodes.Get(1)->AddDevice(rxDev);
367 rxDev->SetNode(nodes.Get(1));
368
369 // create the tx and rx mobility models, set the positions
371 txMob->SetPosition(Vector(-20.0, 00.0, 0.0));
372
374 rxMob->SetPosition(Vector(distance - 20.0, 00.0, 0));
375 rxMob->SetVelocity(Vector(00.0, -20.0, 0.0));
376
377 // assign the mobility models to the nodes
378 nodes.Get(0)->AggregateObject(txMob);
379 nodes.Get(1)->AggregateObject(rxMob);
380
381 // create the antenna objects and set their dimensions
382 Ptr<PhasedArrayModel> txAntenna =
384 UintegerValue(2),
385 "NumRows",
386 UintegerValue(2));
387 if (!enableGnbIso)
388 {
389 txAntenna->SetAttribute("AntennaElement",
391 }
392
393 txAntenna->SetAttribute("IsDualPolarized", BooleanValue(enableGnbDualPolarized));
394
395 Ptr<PhasedArrayModel> rxAntenna =
397 UintegerValue(2),
398 "NumRows",
399 UintegerValue(2));
400 if (!enableUeIso)
401 {
402 rxAntenna->SetAttribute("AntennaElement",
404 }
405
406 rxAntenna->SetAttribute("IsDualPolarized", BooleanValue(enableUeDualPolarized));
407
408 // set the beamforming vectors
409 DoBeamforming(txDev, txAntenna, rxDev);
410 DoBeamforming(rxDev, rxAntenna, txDev);
411
412 // Create the SNR trace output stream wrapper (kept alive for the full simulation)
413 Ptr<OutputStreamWrapper> snrOutputStream =
414 Create<OutputStreamWrapper>("snr-trace.txt", std::ios::out);
415
416 for (int i = 0; i < floor(simTime / timeRes); i++)
417 {
419 params{txMob, rxMob, txPow, noiseFigure, txAntenna, rxAntenna, snrOutputStream};
420 Simulator::Schedule(MilliSeconds(timeRes * i), &ComputeSnr, params);
421 }
422
423 try
424 {
427 }
428 catch (const py::error_already_set& e)
429 {
430 std::cerr << "\n[FAILURE] Sionna/Python error during simulation:\n"
431 << " " << e.what() << "\n"
432 << " Check that the Sionna virtual environment is active and the\n"
433 << " scene name (--Scenario) is correct.\n"
434 << std::endl;
435 return 1;
436 }
437 catch (const std::exception& e)
438 {
439 std::cerr << "\n[FAILURE] Simulation error:\n"
440 << " " << e.what() << "\n"
441 << std::endl;
442 return 1;
443 }
444
445 if (g_snrSamples > 0)
446 {
447 std::cout << "\n[SUCCESS] Simulation completed successfully.\n"
448 << " Computed " << g_snrSamples << " SNR sample(s), "
449 << "average SNR = " << std::fixed << std::setprecision(2)
450 << (g_snrSumDb / g_snrSamples) << " dB\n"
451 << " Results written to snr-trace.txt\n"
452 << std::endl;
453 }
454 else
455 {
456 std::cerr << "\n[FAILURE] Simulation ran but no SNR samples were produced.\n"
457 << " Check that simTime > 0 and the channel model is configured correctly.\n"
458 << std::endl;
459 return 1;
460 }
461
462 return 0;
463}
Class holding the azimuth and inclination angles of spherical coordinates.
Definition angles.h:107
double GetInclination() const
Getter for inclination angle.
Definition angles.cc:236
double GetAzimuth() const
Getter for azimuth angle.
Definition angles.cc:230
Parse command-line arguments.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
static Ptr< SpectrumValue > CreateNoisePowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double noiseFigure)
create a SpectrumValue that models the power spectral density of AWGN
static Ptr< SpectrumValue > CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::vector< int > activeRbs)
create a spectrum value representing the power spectral density of a signal to be transmitted.
Keep track of the current position and velocity of an object.
keep track of a set of node pointers.
ComplexMatrixArray ComplexVector
the underlying Valarray
AttributeValue implementation for Pointer.
Definition pointer.h:37
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:70
static void SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition simulator.h:580
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:125
static Time Now()
Return the current simulation virtual time.
Definition simulator.cc:191
static void Run()
Run the simulation.
Definition simulator.cc:161
Hold variables of type string.
Definition string.h:45
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition nstime.h:398
Hold an unsigned integer type.
Definition uinteger.h:34
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition assert.h:75
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:886
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:194
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:260
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:627
Ptr< T > CreateObjectWithAttributes(Args... args)
Allocate an Object on the heap and initialize with a set of attributes.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:492
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1290
NodeContainer nodes
Every class exported by the ns3 library is enclosed in the ns3 namespace.
double Sum(const SpectrumValue &x)
params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.
static int g_snrSamples
number of SNR samples computed
static void DoBeamforming(Ptr< NetDevice > thisDevice, Ptr< PhasedArrayModel > thisAntenna, Ptr< NetDevice > otherDevice)
Perform the beamforming using the DFT beamforming method.
static void ComputeSnr(const ComputeSnrParams &params)
Compute the average SNR.
static double g_snrSumDb
running sum of SNR values in dB
static void PrintPythonExecutable()
Print the python executable and version.
A structure that holds the parameters for the ComputeSnr function.
Ptr< PhasedArrayModel > txAntenna
the tx antenna array
Ptr< MobilityModel > rxMob
the rx mobility model
double noiseFigure
the noise figure in dB
double txPow
the tx power in dBm
Ptr< OutputStreamWrapper > stream
output stream wrapper for SNR trace
Ptr< PhasedArrayModel > rxAntenna
the rx antenna array
Ptr< MobilityModel > txMob
the tx mobility model
Configuration for the Sionna RT PathSolver.
bool diffuseReflection
Enable diffuse reflections (scattering).
bool syntheticArray
Use synthetic array processing (if supported by scene factory).
bool specularReflection
Enable specular reflections (mirror-like).
bool los
Include direct line-of-sight (LOS) path when true It only controls whether the solver should include ...
int seed
Random seed for stochastic components (e.g., diffuse scattering).
int maxDepth
Maximum number of interactions (reflection/refraction depth).
bool edgeDiffraction
Enable edge diffraction (alternative diffraction handling).
bool refraction
Enable refraction through transparent bodies / materials.
static void ComputeSnr(const ComputeSnrParams &params)
Compute the average SNR.
static Ptr< ThreeGppSpectrumPropagationLossModel > m_spectrumLossModel
the SpectrumPropagationLossModel object