23 #include "ns3/boolean.h"
24 #include "ns3/double.h"
26 #include "ns3/mobility-model.h"
28 #include "ns3/pointer.h"
29 #include "ns3/simulator.h"
38 static const double M_C = 3.0e8;
48 TypeId(
"ns3::ThreeGppPropagationLossModel")
50 .SetGroupName(
"Propagation")
51 .AddAttribute(
"Frequency",
52 "The centre frequency in Hz.",
56 MakeDoubleChecker<double>())
57 .AddAttribute(
"ShadowingEnabled",
58 "Enable/disable shadowing.",
63 "ChannelConditionModel",
64 "Pointer to the channel condition model.",
68 MakePointerChecker<ChannelConditionModel>())
69 .AddAttribute(
"EnforceParameterRanges",
70 "Whether to strictly enforce TR38.901 applicability ranges",
75 "BuildingPenetrationLossesEnabled",
76 "Enable/disable Building Penetration Losses.",
137 "Frequency should be between 0.5 and 100 GHz but is " <<
f);
177 double rxPow = txPowerDbm;
178 rxPow -=
GetLoss(cond, distance2d, distance3d, heights.first, heights.second);
186 if (cond->GetO2iCondition() == ChannelCondition::O2iConditionValue::O2I &&
198 else if (cond->GetO2iCondition() == ChannelCondition::O2iConditionValue::I2I &&
199 cond->GetLosCondition() == ChannelCondition::LosConditionValue::NLOS &&
225 if (cond->GetLosCondition() == ChannelCondition::LosConditionValue::LOS)
227 loss =
GetLossLos(distance2d, distance3d, hUt, hBs);
229 else if (cond->GetLosCondition() == ChannelCondition::LosConditionValue::NLOSv)
233 else if (cond->GetLosCondition() == ChannelCondition::LosConditionValue::NLOS)
235 loss =
GetLossNlos(distance2d, distance3d, hUt, hBs);
253 double o2iLossValue = 0;
254 double lowLossTw = 0;
256 double lowlossNormalVariate = 0;
258 double lConcrete = 0;
261 uint32_t key =
GetKey(a, b);
263 bool notFound =
false;
264 bool newCondition =
false;
271 newCondition = (it->second.m_condition != cond);
278 it =
m_o2iLossMap.insert(it, std::make_pair(key, newItem));
281 if (notFound || newCondition)
293 5 - 10 * log10(0.3 * std::pow(10, -lGlass / 10) + 0.7 * std::pow(10, -lConcrete / 10));
296 lossIn = 0.5 * distance2dIn;
301 o2iLossValue = lowLossTw + lossIn + lowlossNormalVariate;
305 o2iLossValue = it->second.m_o2iLoss;
309 it->second.m_o2iLoss = o2iLossValue;
310 it->second.m_condition = cond;
323 double o2iLossValue = 0;
324 double highLossTw = 0;
326 double highlossNormalVariate = 0;
327 double lIIRGlass = 0;
328 double lConcrete = 0;
331 uint32_t key =
GetKey(a, b);
333 bool notFound =
false;
334 bool newCondition =
false;
341 newCondition = (it->second.m_condition != cond);
348 it =
m_o2iLossMap.insert(it, std::make_pair(key, newItem));
351 if (notFound || newCondition)
364 highLossTw = 5 - 10 * log10(0.7 * std::pow(10, -lIIRGlass / 10) +
365 0.3 * std::pow(10, -lConcrete / 10));
368 lossIn = 0.5 * distance2dIn;
373 o2iLossValue = highLossTw + lossIn + highlossNormalVariate;
377 o2iLossValue = it->second.m_o2iLoss;
381 it->second.m_o2iLoss = o2iLossValue;
382 it->second.m_condition = cond;
400 NS_ABORT_MSG(
"If we have set the O2I condition, we shouldn't be here");
422 double shadowingValue;
425 uint32_t key =
GetKey(a, b);
427 bool notFound =
false;
428 bool newCondition =
false;
436 newCondition = (it->second.m_condition != cond);
447 if (notFound || newCondition)
455 Vector2D displacement(newDistance.x - it->second.m_distance.x,
456 newDistance.y - it->second.m_distance.y);
458 shadowingValue = R * it->second.m_shadowing + sqrt(1 - R * R) *
464 it->second.m_shadowing = shadowingValue;
465 it->second.m_distance = newDistance;
467 it->second.m_condition = cond;
469 return shadowingValue;
472 std::pair<double, double>
480 return std::pair<double, double>(hUt, hBs);
500 double x = a.x - b.x;
501 double y = a.y - b.y;
502 double distance2D = sqrt(
x *
x + y * y);
516 uint32_t key = (((x1 + x2) * (x1 + x2 + 1)) / 2) + x2;
544 static TypeId tid =
TypeId(
"ns3::ThreeGppRmaPropagationLossModel")
546 .SetGroupName(
"Propagation")
548 .AddAttribute(
"AvgBuildingHeight",
549 "The average building height in meters.",
552 MakeDoubleChecker<double>(5.0, 50.0))
553 .AddAttribute(
"AvgStreetWidth",
554 "The average street width in meters.",
557 MakeDoubleChecker<double>(5.0, 50.0));
585 [[maybe_unused]])
const
600 "RMa scenario is valid for frequencies between 0.5 and 30 GHz.");
603 if (hUt < 1.0 || hUt > 10.0)
607 "The height of the UT should be between 1 and 10 m (see TR 38.901, Table 7.4.1-1)");
610 if (hBs < 10.0 || hBs > 150.0)
614 "The height of the BS should be between 10 and 150 m (see TR 38.901, Table 7.4.1-1)");
628 "Breakpoint distance is zero (divide-by-zero below); are either hBs or hUt = 0?");
631 if (distance2D < 10.0 || distance2D > 10.0e3)
634 NS_LOG_WARN(
"The 2D distance is outside the validity range, the pathloss value may not be "
640 if (distance2D <= distanceBp)
664 "RMa scenario is valid for frequencies between 0.5 and 30 GHz.");
667 if (hUt < 1.0 || hUt > 10.0)
671 "The height of the UT should be between 1 and 10 m (see TR 38.901, Table 7.4.1-1)");
674 if (hBs < 10.0 || hBs > 150.0)
678 "The height of the BS should be between 10 and 150 m (see TR 38.901, Table 7.4.1-1)");
689 if (distance2D < 10.0 || distance2D > 5.0e3)
692 NS_LOG_WARN(
"The 2D distance is outside the validity range, the pathloss value may not be "
697 double plNlos = 161.04 - 7.1 * log10(
m_w) + 7.5 * log10(
m_h) -
698 (24.37 - 3.7 * pow((
m_h / hBs), 2)) * log10(hBs) +
699 (43.42 - 3.1 * log10(hBs)) * (log10(distance3D) - 3.0) +
700 20.0 * log10(
m_frequency / 1e9) - (3.2 * pow(log10(11.75 * hUt), 2) - 4.97);
717 if (cond == ChannelCondition::LosConditionValue::LOS)
725 if (distance2d <= distanceBp)
734 else if (cond == ChannelCondition::LosConditionValue::NLOS)
751 double correlationDistance;
754 if (cond == ChannelCondition::LosConditionValue::LOS)
756 correlationDistance = 37;
758 else if (cond == ChannelCondition::LosConditionValue::NLOS)
760 correlationDistance = 120;
767 return correlationDistance;
773 double loss = 20.0 * log10(40.0 * M_PI * distance3D * frequency / 1e9 / 3.0) +
774 std::min(0.03 * pow(h, 1.72), 10.0) * log10(distance3D) -
775 std::min(0.044 * pow(h, 1.72), 14.77) + 0.002 * log10(h) * distance3D;
782 double distanceBp = 2.0 * M_PI * hA * hB * frequency /
M_C;
793 static TypeId tid =
TypeId(
"ns3::ThreeGppUmaPropagationLossModel")
795 .SetGroupName(
"Propagation")
821 if (distance2D > 18.0)
823 g = 5.0 / 4.0 * pow(distance2D / 100.0, 3) * exp(-distance2D / 150.0);
830 c = pow((hUt - 13.0) / 10.0, 1.5) * g;
834 double prob = 1.0 / (1.0 + c);
843 hE = (double)floor(random / 3.0) * 3.0;
847 double distanceBp = 4 * (hBs - hE) * (hUt - hE) *
m_frequency /
M_C;
861 if (hUt < 1.5 || hUt > 22.5)
865 "The height of the UT should be between 1.5 and 22.5 m (see TR 38.901, Table 7.4.1-1)");
871 NS_LOG_WARN(
"The height of the BS should be equal to 25 m (see TR 38.901, Table 7.4.1-1)");
886 if (distance2D < 10.0 || distance2D > 5.0e3)
889 NS_LOG_WARN(
"The 2D distance is outside the validity range, the pathloss value may not be "
895 if (distance2D <= distanceBp)
898 loss = 28.0 + 22.0 * log10(distance3D) + 20.0 * log10(
m_frequency / 1e9);
903 loss = 28.0 + 40.0 * log10(distance3D) + 20.0 * log10(
m_frequency / 1e9) -
904 9.0 * log10(pow(distanceBp, 2) + pow(hBs - hUt, 2));
929 if (hUt < 1.5 || hUt > 22.5)
933 "The height of the UT should be between 1.5 and 22.5 m (see TR 38.901, Table 7.4.1-1)");
939 NS_LOG_WARN(
"The height of the BS should be equal to 25 m (see TR 38.901, Table 7.4.1-1)");
950 if (distance2D < 10.0 || distance2D > 5.0e3)
953 NS_LOG_WARN(
"The 2D distance is outside the validity range, the pathloss value may not be "
959 13.54 + 39.08 * log10(distance3D) + 20.0 * log10(
m_frequency / 1e9) - 0.6 * (hUt - 1.5);
974 if (cond == ChannelCondition::LosConditionValue::LOS)
978 else if (cond == ChannelCondition::LosConditionValue::NLOS)
995 double correlationDistance;
998 if (cond == ChannelCondition::LosConditionValue::LOS)
1000 correlationDistance = 37;
1002 else if (cond == ChannelCondition::LosConditionValue::NLOS)
1004 correlationDistance = 50;
1011 return correlationDistance;
1031 static TypeId tid =
TypeId(
"ns3::ThreeGppUmiStreetCanyonPropagationLossModel")
1033 .SetGroupName(
"Propagation")
1063 double distanceBp = 4 * (hBs - hE) * (hUt - hE) *
m_frequency /
M_C;
1085 if (hUt < 1.5 || hUt >= 10.0)
1089 "The height of the UT should be between 1.5 and 22.5 m (see TR 38.901, Table 7.4.1-1). "
1090 "We further assume hUT < hBS, then hUT is upper bounded by hBS, which should be 10 m");
1096 NS_LOG_WARN(
"The height of the BS should be equal to 10 m (see TR 38.901, Table 7.4.1-1)");
1111 if (distance2D < 10.0 || distance2D > 5.0e3)
1114 NS_LOG_WARN(
"The 2D distance is outside the validity range, the pathloss value may not be "
1120 if (distance2D <= distanceBp)
1123 loss = 32.4 + 21.0 * log10(distance3D) + 20.0 * log10(
m_frequency / 1e9);
1128 loss = 32.4 + 40.0 * log10(distance3D) + 20.0 * log10(
m_frequency / 1e9) -
1129 9.5 * log10(pow(distanceBp, 2) + pow(hBs - hUt, 2));
1146 if (hUt < 1.5 || hUt >= 10.0)
1150 "The height of the UT should be between 1.5 and 22.5 m (see TR 38.901, Table 7.4.1-1). "
1151 "We further assume hUT < hBS, then hUT is upper bounded by hBS, which should be 10 m");
1157 NS_LOG_WARN(
"The height of the BS should be equal to 10 m (see TR 38.901, Table 7.4.1-1)");
1168 if (distance2D < 10.0 || distance2D > 5.0e3)
1171 NS_LOG_WARN(
"The 2D distance is outside the validity range, the pathloss value may not be "
1177 22.4 + 35.3 * log10(distance3D) + 21.3 * log10(
m_frequency / 1e9) - 0.3 * (hUt - 1.5);
1184 std::pair<double, double>
1197 else if (zb == 10.0)
1211 return std::pair<double, double>(hUt, hBs);
1221 double shadowingStd;
1223 if (cond == ChannelCondition::LosConditionValue::LOS)
1227 else if (cond == ChannelCondition::LosConditionValue::NLOS)
1229 shadowingStd = 7.82;
1236 return shadowingStd;
1244 double correlationDistance;
1247 if (cond == ChannelCondition::LosConditionValue::LOS)
1249 correlationDistance = 10;
1251 else if (cond == ChannelCondition::LosConditionValue::NLOS)
1253 correlationDistance = 13;
1260 return correlationDistance;
1270 static TypeId tid =
TypeId(
"ns3::ThreeGppIndoorOfficePropagationLossModel")
1272 .SetGroupName(
"Propagation")
1306 if (distance3D < 1.0 || distance3D > 150.0)
1309 NS_LOG_WARN(
"The 3D distance is outside the validity range, the pathloss value may not be "
1314 double loss = 32.4 + 17.3 * log10(distance3D) + 20.0 * log10(
m_frequency / 1e9);
1330 if (distance3D < 1.0 || distance3D > 150.0)
1333 NS_LOG_WARN(
"The 3D distance is outside the validity range, the pathloss value may not be "
1338 double plNlos = 17.3 + 38.3 * log10(distance3D) + 24.9 * log10(
m_frequency / 1e9);
1353 double shadowingStd;
1355 if (cond == ChannelCondition::LosConditionValue::LOS)
1359 else if (cond == ChannelCondition::LosConditionValue::NLOS)
1361 shadowingStd = 8.03;
1368 return shadowingStd;
1378 double correlationDistance;
1380 if (cond == ChannelCondition::LosConditionValue::LOS)
1382 correlationDistance = 10;
1384 else if (cond == ChannelCondition::LosConditionValue::NLOS)
1386 correlationDistance = 6;
1393 return correlationDistance;
double f(double x, void *params)
LosConditionValue
Possible values for Line-of-Sight condition.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Vector GetPosition() const
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Hold objects of type Ptr<T>.
Models the propagation loss through a transmission medium.
Smart pointer class similar to boost::intrusive_ptr.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1 for the Indoor Office scenario...
static TypeId GetTypeId()
Get the type ID.
double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading correlation distance.
double GetShadowingStd(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading standard deviation.
double GetO2iDistance2dIn() const override
Returns the minimum of the two independently generated distances according to the uniform distributio...
~ThreeGppIndoorOfficePropagationLossModel() override
Destructor.
double GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is obstructed.
ThreeGppIndoorOfficePropagationLossModel()
Constructor.
double GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is not obstructed.
Base class for the 3GPP propagation models.
Ptr< ChannelConditionModel > GetChannelConditionModel() const
Returns the associated channel condition model.
virtual double GetO2iLowPenetrationLoss(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const
Retrieves the o2i building penetration loss value by looking at m_o2iLossMap.
double GetLoss(Ptr< ChannelCondition > cond, double distance2D, double distance3D, double hUt, double hBs) const
Computes the pathloss between a and b.
Ptr< UniformRandomVariable > m_randomO2iVar2
a uniform random variable for the calculation of the indoor loss, see TR38.901 Table 7....
double GetFrequency() const
Return the current central frequency.
Ptr< UniformRandomVariable > m_randomO2iVar1
a uniform random variable for the calculation of the indoor loss, see TR38.901 Table 7....
virtual double GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const =0
Computes the pathloss between a and b considering that the line of sight is obstructed.
double GetShadowing(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const
Retrieves the shadowing value by looking at m_shadowingMap.
static double Calculate2dDistance(Vector a, Vector b)
Computes the 2D distance between two 3D vectors.
void SetChannelConditionModel(Ptr< ChannelConditionModel > model)
Set the channel condition model used to determine the channel state (e.g., the LOS/NLOS condition)
std::unordered_map< uint32_t, ShadowingMapItem > m_shadowingMap
map to store the shadowing values
virtual double GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const =0
Computes the pathloss between a and b considering that the line of sight is not obstructed.
virtual bool DoIsO2iLowPenetrationLoss(Ptr< const ChannelCondition > cond) const
Indicates the condition of the o2i building penetration loss (defined in 3GPP TR 38....
int64_t DoAssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
virtual double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const =0
Returns the shadow fading correlation distance.
ThreeGppPropagationLossModel()
Constructor.
Ptr< NormalRandomVariable > m_normRandomVariable
normal random variable
static TypeId GetTypeId()
Get the type ID.
Ptr< ChannelConditionModel > m_channelConditionModel
pointer to the channel condition model
~ThreeGppPropagationLossModel() override
Destructor.
std::unordered_map< uint32_t, O2iLossMapItem > m_o2iLossMap
map to store the o2i Loss values
virtual double GetO2iDistance2dIn() const =0
Returns the minimum of the two independently generated distances according to the uniform distributio...
virtual double GetO2iHighPenetrationLoss(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const
Retrieves the o2i building penetration loss value by looking at m_o2iLossMap.
bool IsO2iLowPenetrationLoss(Ptr< const ChannelCondition > cond) const
Return true if the O2I Building Penetration loss corresponds to a low loss condition.
void SetFrequency(double f)
Set the central frequency of the model.
void DoDispose() override
Destructor implementation.
static uint32_t GetKey(Ptr< MobilityModel > a, Ptr< MobilityModel > b)
Returns an unique key for the channel between a and b.
Ptr< NormalRandomVariable > m_normalO2iLowLossVar
a normal random variable for the calculation of 02i low loss, see TR38.901 Table 7....
double m_frequency
operating frequency in Hz
bool m_enforceRanges
strictly enforce TR 38.901 parameter ranges
virtual double GetShadowingStd(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const =0
Returns the shadow fading standard deviation.
virtual double GetLossNlosv(double distance2D, double distance3D, double hUt, double hBs) const
Computes the pathloss between a and b considering that the line of sight is obstructed by a vehicle.
Ptr< NormalRandomVariable > m_normalO2iHighLossVar
a normal random variable for the calculation of 02i high loss, see TR38.901 Table 7....
virtual std::pair< double, double > GetUtAndBsHeights(double za, double zb) const
Determines hUT and hBS.
double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const override
Computes the received power by applying the pathloss model described in 3GPP TR 38....
bool m_shadowingEnabled
enable/disable shadowing
static Vector GetVectorDifference(Ptr< MobilityModel > a, Ptr< MobilityModel > b)
Get the difference between the node position.
bool m_buildingPenLossesEnabled
enable/disable building penetration losses
Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1 for the RMa scenario.
double GetShadowingStd(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading standard deviation.
static double Pl1(double frequency, double distance3D, double h, double w)
Computes the PL1 formula for the RMa scenario.
double GetO2iDistance2dIn() const override
Returns the minimum of the two independently generated distances according to the uniform distributio...
ThreeGppRmaPropagationLossModel()
Constructor.
double GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is not obstructed.
double GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is obstructed.
~ThreeGppRmaPropagationLossModel() override
Destructor.
double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading correlation distance.
double m_h
average building height in meters
static TypeId GetTypeId()
Get the type ID.
static double GetBpDistance(double frequency, double hA, double hB)
Computes the breakpoint distance for the RMa scenario.
double m_w
average street width in meters
bool DoIsO2iLowPenetrationLoss(Ptr< const ChannelCondition > cond) const override
Indicates the condition of the o2i building penetration loss (defined in 3GPP TR 38....
Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1 for the UMa scenario.
static TypeId GetTypeId()
Get the type ID.
double GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is not obstructed.
double GetBpDistance(double hUt, double hBs, double distance2D) const
Computes the breakpoint distance.
~ThreeGppUmaPropagationLossModel() override
Destructor.
ThreeGppUmaPropagationLossModel()
Constructor.
int64_t DoAssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
double GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is obstructed.
double GetO2iDistance2dIn() const override
Returns the minimum of the two independently generated distances according to the uniform distributio...
Ptr< UniformRandomVariable > m_uniformVar
a uniform random variable used for the computation of the breakpoint distance
double GetShadowingStd(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading standard deviation.
double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading correlation distance.
Implements the pathloss model defined in 3GPP TR 38.901, Table 7.4.1-1 for the UMi-Street Canyon scen...
std::pair< double, double > GetUtAndBsHeights(double za, double zb) const override
Determines hUT and hBS.
~ThreeGppUmiStreetCanyonPropagationLossModel() override
Destructor.
double GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is obstructed.
double GetShadowingStd(Ptr< MobilityModel > a, Ptr< MobilityModel > b, ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading standard deviation.
double GetBpDistance(double hUt, double hBs, double distance2D) const
Computes the breakpoint distance.
double GetO2iDistance2dIn() const override
Returns the minimum of the two independently generated distances according to the uniform distributio...
ThreeGppUmiStreetCanyonPropagationLossModel()
Constructor.
double GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const override
Computes the pathloss between a and b considering that the line of sight is not obstructed.
static TypeId GetTypeId()
Get the type ID.
double GetShadowingCorrelationDistance(ChannelCondition::LosConditionValue cond) const override
Returns the shadow fading correlation distance.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
double GetLength() const
Compute the length (magnitude) of the vector.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeBooleanChecker()
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
static const double M_C
propagation velocity in free space
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
double CalculateDistance(const Vector3D &a, const Vector3D &b)
Define a struct for the m_o2iLossMap entries.
Define a struct for the m_shadowingMap entries.