12#include "ns3/double.h" 
   15#include "ns3/mobility-model.h" 
   30        TypeId(
"ns3::ItuR1411NlosOverRooftopPropagationLossModel")
 
   32            .SetGroupName(
"Propagation")
 
   36                "The Frequency  (default is 2.106 GHz).",
 
   40            .AddAttribute(
"Environment",
 
   41                          "Environment Scenario",
 
   53                "Dimension of the city",
 
   60                "The height of the rooftop level in meters",
 
   64            .AddAttribute(
"StreetsOrientation",
 
   65                          "The orientation of streets in degrees [0,90] with respect to the " 
   66                          "direction of propagation",
 
   73                "The width of streets",
 
   79                "The distance over which the buildings extend",
 
   83            .AddAttribute(
"BuildingSeparation",
 
   84                          "The separation between buildings",
 
 
  111                  " Street Orientation must be in [0,90]");
 
  125    double distance = a->GetDistanceFrom(b);
 
  126    double hb = (a->GetPosition().z > b->GetPosition().z ? a->GetPosition().z : b->GetPosition().z);
 
  127    double hm = (a->GetPosition().z < b->GetPosition().z ? a->GetPosition().z : b->GetPosition().z);
 
  128    NS_ASSERT_MSG(hm > 0 && hb > 0, 
"nodes' height must be greater then 0");
 
  130    double ds = (
m_lambda * distance * distance) / (Dhb * Dhb);
 
  142            Lbsh = -18 * std::log10(1 + Dhb);
 
  143            ka = (fmhz > 2000 ? 71.4 : 54.0);
 
  149            kd = 18.0 - 15 * Dhb / a->GetPosition().z;
 
  152                ka = 54.0 - 1.6 * Dhb * distance / 1000;
 
  156                ka = 54.0 - 0.8 * Dhb;
 
  165            kf = -4 + 0.7 * (fmhz / 925.0 - 1);
 
  169            kf = -4 + 1.5 * (fmhz / 925.0 - 1);
 
  172        Lmsd = Lbsh + ka + kd * std::log10(distance / 1000.0) + kf * std::log10(fmhz) -
 
  191                 (1 / theta - (1 / (2 * M_PI + theta)));
 
  193        Lmsd = -10 * std::log10(Qm * Qm);
 
  195    double Lbf = 32.4 + 20 * std::log10(distance / 1000) + 20 * std::log10(fmhz);
 
  197    double Lrts = -8.2 - 10 * std::log10(
m_streetsWidth) + 10 * std::log10(fmhz) +
 
  198                  20 * std::log10(Dhm) + Lori;
 
  199    NS_LOG_LOGIC(
this << 
" Lbf " << Lbf << 
" Lrts " << Lrts << 
" Dhm" << Dhm << 
" Lmsd " << Lmsd);
 
  203        loss = Lbf + Lrts + Lmsd;
 
 
  224    return (txPowerDbm - 
GetLoss(a, b));
 
 
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Hold variables of type enum.
the ITU-R 1411 NLOS over rooftop propagation model
double m_buildingSeparation
in meters
int64_t DoAssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
~ItuR1411NlosOverRooftopPropagationLossModel() override
void SetFrequency(double freq)
Set the operating frequency.
double m_buildingsExtend
in meters
double m_streetsWidth
in meters
CitySize m_citySize
Dimension of the city.
double m_rooftopHeight
in meters
double DoCalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const override
PropagationLossModel.
static TypeId GetTypeId()
Get the type ID.
EnvironmentType m_environment
Environment Scenario.
double m_frequency
frequency in MHz
ItuR1411NlosOverRooftopPropagationLossModel()
double GetLoss(Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
double m_lambda
wavelength
double m_streetsOrientation
in degrees [0,90]
Smart pointer class similar to boost::intrusive_ptr.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeChecker > MakeDoubleChecker()
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#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 > MakeEnumChecker(T v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.