22 #include "ns3/double.h" 23 #include "ns3/mobility-model.h" 26 #include "ns3/simulator.h" 39 .SetGroupName (
"Propagation")
71 static TypeId tid =
TypeId (
"ns3::ChannelConditionModel")
73 .SetGroupName (
"Propagation")
93 static TypeId tid =
TypeId (
"ns3::AlwaysLosChannelConditionModel")
95 .SetGroupName (
"Propagation")
135 static TypeId tid =
TypeId (
"ns3::NeverLosChannelConditionModel")
137 .SetGroupName (
"Propagation")
177 static TypeId tid =
TypeId (
"ns3::ThreeGppChannelConditionModel")
179 .SetGroupName (
"Propagation")
180 .AddAttribute (
"UpdatePeriod",
"Specifies the time period after which the channel condition is recomputed. If set to 0, the channel condition is never updated.",
213 uint32_t key =
GetKey (a, b);
215 bool notFound =
false;
222 NS_LOG_DEBUG (
"found the channel condition in the map");
223 cond = mapItem->second.m_condition;
240 if (notFound || update)
249 cond = CreateObject<ChannelCondition> ();
253 cond->SetLosCondition (ChannelCondition::LosConditionValue::LOS);
258 cond->SetLosCondition (ChannelCondition::LosConditionValue::NLOS);
284 double x = a.x - b.x;
285 double y = a.y - b.y;
286 double distance2D = sqrt (
x *
x + y * y);
300 uint32_t key = (((x1 + x2) * (x1 + x2 + 1)) / 2) + x2;
312 static TypeId tid =
TypeId (
"ns3::ThreeGppRmaChannelConditionModel")
314 .SetGroupName (
"Propagation")
341 if (distance2D <= 10.0)
347 pLos = exp (-(distance2D - 10.0) / 1000.0);
360 static TypeId tid =
TypeId (
"ns3::ThreeGppUmaChannelConditionModel")
362 .SetGroupName (
"Propagation")
385 double h_UT =
std::min (a->GetPosition ().z, b->GetPosition ().z);
388 NS_LOG_WARN (
"The height of the UT should be smaller than 23 m (see TR 38.901, Table 7.4.2-1)");
392 double h_BS =
std::max (a->GetPosition ().z, b->GetPosition ().z);
395 NS_LOG_WARN (
"The LOS probability was derived assuming BS antenna heights of 25 m (see TR 38.901, Table 7.4.2-1)");
400 if (distance2D <= 18.0)
414 c = pow ((h_UT - 13.0) / 10.0, 1.5);
417 pLos = (18.0 / distance2D + exp (-distance2D / 63.0) * (1.0 - 18.0 / distance2D)) * (1.0 + c * 5.0 / 4.0 * pow (distance2D / 100.0, 3.0) * exp (-distance2D / 150.0));
430 static TypeId tid =
TypeId (
"ns3::ThreeGppUmiStreetCanyonChannelConditionModel")
432 .SetGroupName (
"Propagation")
459 if (a->GetPosition ().z != 10.0 && b->GetPosition ().z != 10.0)
461 NS_LOG_WARN (
"The LOS probability was derived assuming BS antenna heights of 10 m (see TR 38.901, Table 7.4.2-1)");
466 if (distance2D <= 18.0)
472 pLos = 18.0 / distance2D + exp (-distance2D / 36.0) * (1.0 - 18.0 / distance2D);
485 static TypeId tid =
TypeId (
"ns3::ThreeGppIndoorMixedOfficeChannelConditionModel")
487 .SetGroupName (
"Propagation")
513 double h_BS =
std::max (a->GetPosition ().z, b->GetPosition ().z);
516 NS_LOG_WARN (
"The LOS probability was derived assuming BS antenna heights of 3 m (see TR 38.901, Table 7.4.2-1)");
521 if (distance2D <= 1.2)
525 else if (distance2D > 1.2 && distance2D < 6.5)
527 pLos = exp (-(distance2D - 1.2) / 4.7);
531 pLos = exp (-(distance2D - 6.5) / 32.6) * 0.32;
544 static TypeId tid =
TypeId (
"ns3::ThreeGppIndoorOpenOfficeChannelConditionModel")
546 .SetGroupName (
"Propagation")
572 double h_BS =
std::max (a->GetPosition ().z, b->GetPosition ().z);
575 NS_LOG_WARN (
"The LOS probability was derived assuming BS antenna heights of 3 m (see TR 38.901, Table 7.4.2-1)");
580 if (distance2D <= 5.0)
584 else if (distance2D > 5.0 && distance2D <= 49.0)
586 pLos = exp (-(distance2D - 5.0) / 70.8);
590 pLos = exp (-(distance2D - 49.0) / 211.7) * 0.54;
virtual double ComputePlos(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const =0
Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901.
virtual int64_t AssignStreams(int64_t stream) override
If this model uses objects of type RandomVariableStream, set the stream numbers to the integers start...
Smart pointer class similar to boost::intrusive_ptr.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Models the channel condition.
uint32_t GetId(void) const
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
virtual ~ThreeGppIndoorOpenOfficeChannelConditionModel() override
Destructor for the ThreeGppIndoorOpenOfficeChannelConditionModel class.
LosConditionValue m_losCondition
contains the information about the LOS/NLOS state of the channel
virtual double ComputePlos(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901 for the UMi-Street Canyon...
Struct to store the channel condition in the m_channelConditionMap.
ThreeGppChannelConditionModel()
Constructor for the ThreeGppRmaChannelConditionModel class.
static TypeId GetTypeId(void)
Get the type ID.
virtual Ptr< ChannelCondition > GetChannelCondition(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Computes the condition of the channel between a and b, that will be always non-LoS.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
static double Calculate2dDistance(const Vector &a, const Vector &b)
Computes the 2D distance between two 3D vectors.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
std::unordered_map< uint32_t, Item > m_channelConditionMap
map to store the channel conditions
virtual ~ChannelConditionModel()
Destructor for the ChannelConditionModel class.
#define NS_UNUSED(x)
Mark a local variable as unused.
ThreeGppUmiStreetCanyonChannelConditionModel()
Constructor for the ThreeGppUmiStreetCanyonChannelConditionModel class.
static TypeId GetTypeId(void)
Get the type ID.
LosConditionValue GetLosCondition() const
Get the LosConditionValue contaning the information about the LOS/NLOS state of the channel...
Ptr< UniformRandomVariable > m_uniformVar
uniform random variable
ThreeGppIndoorOpenOfficeChannelConditionModel()
Constructor for the ThreeGppIndoorOpenOfficeChannelConditionModel class.
static uint32_t GetKey(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b)
Returns a unique and reciprocal key for the channel between a and b.
virtual ~ThreeGppIndoorMixedOfficeChannelConditionModel() override
Destructor for the ThreeGppIndoorMixedOfficeChannelConditionModel class.
ThreeGppUmaChannelConditionModel()
Constructor for the ThreeGppUmaChannelConditionModel class.
static TypeId GetTypeId(void)
Get the type ID.
virtual int64_t AssignStreams(int64_t stream) override
If this model uses objects of type RandomVariableStream, set the stream numbers to the integers start...
virtual ~AlwaysLosChannelConditionModel()
Destructor for the ChannelConditionModel class.
bool IsZero(void) const
Exactly equivalent to t == 0.
virtual ~ThreeGppUmiStreetCanyonChannelConditionModel() override
Destructor for the ThreeGppUmiStreetCanyonChannelConditionModel class.
AttributeValue implementation for Time.
Ptr< ChannelCondition > m_condition
the channel condition
static TypeId GetTypeId(void)
Get the type ID.
ThreeGppIndoorMixedOfficeChannelConditionModel()
Constructor for the ThreeGppIndoorMixedOfficeChannelConditionModel class.
Base class for the 3GPP channel condition models.
Computes the channel condition for the RMa scenario.
Computes the channel condition for the UMa scenario.
virtual double ComputePlos(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901 for the RMa scenario...
virtual ~ThreeGppRmaChannelConditionModel() override
Destructor for the ThreeGppRmaChannelConditionModel class.
virtual Ptr< ChannelCondition > GetChannelCondition(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Computes the condition of the channel between a and b, that will be always LoS.
Computes the channel condition for the Indoor Mixed Office scenario.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual double ComputePlos(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901 for the Indoor Mixed Offi...
virtual double ComputePlos(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901 for the Indoor Open Offic...
Computes the channel condition for the Indoor Open Office scenario.
virtual Ptr< ChannelCondition > GetChannelCondition(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Retrieve the condition of the channel between a and b.
static TypeId GetTypeId(void)
Get the type ID.
virtual ~ChannelCondition()
Destructor for the ChannelCondition class.
static TypeId GetTypeId(void)
Get the type ID.
virtual void DoDispose() override
Destructor implementation.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
static TypeId GetTypeId(void)
Get the type ID.
static Time Now(void)
Return the current simulation virtual time.
ChannelConditionModel()
Constructor for the ChannelConditionModel class.
Time m_updatePeriod
the update period for the channel condition
ThreeGppRmaChannelConditionModel()
Constructor for the ThreeGppRmaChannelConditionModel class.
static TypeId GetTypeId(void)
Get the type ID.
virtual ~NeverLosChannelConditionModel()
Destructor for the ChannelConditionModel class.
void SetLosCondition(LosConditionValue losCondition)
Set the LosConditionValue with the information about the LOS/NLOS state of the channel.
NeverLosChannelConditionModel()
Constructor for the ChannelConditionModel class.
Models a never in-LoS condition model.
virtual ~ThreeGppChannelConditionModel() override
Destructor for the ThreeGppRmaChannelConditionModel class.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
virtual ~ThreeGppUmaChannelConditionModel() override
Destructor for the ThreeGppUmaChannelConditionModel class.
static TypeId GetTypeId(void)
Get the type ID.
Time m_generatedTime
the time when the condition was generated
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Models an always in-LoS condition model.
A base class which provides memory management and object aggregation.
static TypeId GetTypeId(void)
Get the type ID.
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'...
ChannelCondition()
Constructor for the ChannelCondition class.
Computes the channel condition for the UMi-Street canyon scenario.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
virtual int64_t AssignStreams(int64_t stream) override
If this model uses objects of type RandomVariableStream, set the stream numbers to the integers start...
AlwaysLosChannelConditionModel()
Constructor for the ChannelConditionModel class.
virtual double ComputePlos(Ptr< const MobilityModel > a, Ptr< const MobilityModel > b) const override
Compute the LOS probability as specified in Table 7.4.2-1 of 3GPP TR 38.901 for the UMa scenario...