|
|
| 19 |
* Contributions: Timo Bingmann <timo.bingmann@student.kit.edu> |
19 |
* Contributions: Timo Bingmann <timo.bingmann@student.kit.edu> |
| 20 |
* Contributions: Tom Hewer <tomhewer@mac.com> for Two Ray Ground Model |
20 |
* Contributions: Tom Hewer <tomhewer@mac.com> for Two Ray Ground Model |
| 21 |
* Pavel Boyko <boyko@iitp.ru> for matrix |
21 |
* Pavel Boyko <boyko@iitp.ru> for matrix |
|
|
22 |
* Quincy Tse <quincy.tse@nicta.com.au> for cached |
| 22 |
*/ |
23 |
*/ |
| 23 |
|
24 |
|
| 24 |
#include "propagation-loss-model.h" |
25 |
#include "propagation-loss-model.h" |
| 25 |
#include "ns3/log.h" |
26 |
#include "ns3/log.h" |
| 26 |
#include "ns3/mobility-model.h" |
27 |
#include "ns3/mobility-model.h" |
| 27 |
#include "ns3/boolean.h" |
28 |
#include "ns3/boolean.h" |
|
|
29 |
#include "ns3/pointer.h" |
| 28 |
#include "ns3/double.h" |
30 |
#include "ns3/double.h" |
| 29 |
#include <math.h> |
31 |
#include <math.h> |
| 30 |
|
32 |
|
|
|
| 752 |
Ptr<MobilityModel> ma = a->GetObject<MobilityModel> (); |
754 |
Ptr<MobilityModel> ma = a->GetObject<MobilityModel> (); |
| 753 |
Ptr<MobilityModel> mb = b->GetObject<MobilityModel> (); |
755 |
Ptr<MobilityModel> mb = b->GetObject<MobilityModel> (); |
| 754 |
NS_ASSERT (ma != 0 && mb != 0); |
756 |
NS_ASSERT (ma != 0 && mb != 0); |
|
|
757 |
SetLoss (ma, mb, loss, symmetric); |
| 758 |
} |
| 759 |
|
| 760 |
void |
| 761 |
MatrixPropagationLossModel::SetLoss (Ptr<MobilityModel> ma, Ptr<MobilityModel> mb, double loss, bool symmetric) |
| 762 |
{ |
| 763 |
NS_ASSERT (ma != 0 && mb != 0); |
| 755 |
|
764 |
|
| 756 |
MobilityPair p = std::make_pair(ma, mb); |
765 |
MobilityPair p = std::make_pair(ma, mb); |
| 757 |
std::map<MobilityPair, double>::iterator i = m_loss.find (p); |
766 |
std::map<MobilityPair, double>::iterator i = m_loss.find (p); |
|
|
| 767 |
|
776 |
|
| 768 |
if (symmetric) |
777 |
if (symmetric) |
| 769 |
{ |
778 |
{ |
| 770 |
SetLoss (b, a, loss, false); |
779 |
SetLoss (mb, ma, loss, false); |
| 771 |
} |
780 |
} |
| 772 |
} |
781 |
} |
| 773 |
|
782 |
|
|
|
| 788 |
} |
797 |
} |
| 789 |
} |
798 |
} |
| 790 |
|
799 |
|
|
|
800 |
bool |
| 801 |
MatrixPropagationLossModel::IsLossSet (Ptr<MobilityModel> a, |
| 802 |
Ptr<MobilityModel> b) const |
| 803 |
{ |
| 804 |
std::map<MobilityPair, double>::const_iterator i = m_loss.find (std::make_pair (a, b)); |
| 805 |
|
| 806 |
return (i != m_loss.end ()); |
| 807 |
} |
| 808 |
|
| 791 |
// ------------------------------------------------------------------------- // |
809 |
// ------------------------------------------------------------------------- // |
| 792 |
|
810 |
|
| 793 |
NS_OBJECT_ENSURE_REGISTERED (RangePropagationLossModel); |
811 |
NS_OBJECT_ENSURE_REGISTERED (RangePropagationLossModel); |
|
|
| 829 |
|
847 |
|
| 830 |
// ------------------------------------------------------------------------- // |
848 |
// ------------------------------------------------------------------------- // |
| 831 |
|
849 |
|
|
|
850 |
NS_OBJECT_ENSURE_REGISTERED (PropagationLossCache); |
| 851 |
|
| 852 |
TypeId |
| 853 |
PropagationLossCache::GetTypeId (void) |
| 854 |
{ |
| 855 |
static TypeId tid = TypeId ("ns3::PropagationLossCache") |
| 856 |
.SetParent<PropagationLossModel> () |
| 857 |
.AddConstructor<PropagationLossCache> () |
| 858 |
.AddAttribute ("Symmetric", |
| 859 |
"Whether propagation loss is symmetric", |
| 860 |
BooleanValue (false), |
| 861 |
MakeBooleanAccessor (&PropagationLossCache::m_symmetric), |
| 862 |
MakeBooleanChecker ()) |
| 863 |
.AddAttribute ("CachedModels", |
| 864 |
"The list of models to be cached", |
| 865 |
PointerValue (), |
| 866 |
MakePointerAccessor (&PropagationLossCache::m_models), |
| 867 |
MakePointerChecker<PropagationLossModel> ()) |
| 868 |
; |
| 869 |
return tid; |
| 870 |
} |
| 871 |
|
| 872 |
PropagationLossCache::PropagationLossCache (void) |
| 873 |
: PropagationLossModel (), m_symmetric (false), |
| 874 |
m_cache (CreateObject<MatrixPropagationLossModel> ()) |
| 875 |
{} |
| 876 |
|
| 877 |
void |
| 878 |
PropagationLossCache::AddModel (Ptr<PropagationLossModel> next) |
| 879 |
{ |
| 880 |
NS_ASSERT (next != 0x0); |
| 881 |
|
| 882 |
next->SetNext (m_models); |
| 883 |
m_models = next; |
| 884 |
} |
| 885 |
|
| 886 |
void |
| 887 |
PropagationLossCache::SetSymmetric (const bool b) |
| 888 |
{ |
| 889 |
m_symmetric = b; |
| 890 |
} |
| 891 |
|
| 892 |
bool |
| 893 |
PropagationLossCache::GetSymmetric (void) |
| 894 |
{ |
| 895 |
return m_symmetric; |
| 896 |
} |
| 897 |
|
| 898 |
double |
| 899 |
PropagationLossCache::DoCalcRxPower (double txPowerDbm, |
| 900 |
Ptr<MobilityModel> a, |
| 901 |
Ptr<MobilityModel> b) const |
| 902 |
{ |
| 903 |
double rxc = 0.0; |
| 904 |
|
| 905 |
if (m_cache->IsLossSet (a, b)) |
| 906 |
{ |
| 907 |
NS_LOG_DEBUG ("cache hit."); |
| 908 |
rxc = m_cache->CalcRxPower (0, a, b); |
| 909 |
} |
| 910 |
else |
| 911 |
{ |
| 912 |
NS_LOG_DEBUG ("cache miss."); |
| 913 |
rxc = m_models->CalcRxPower (0, a, b); // assumes models independent of power |
| 914 |
m_cache->SetLoss (a, b, -rxc, m_symmetric); |
| 915 |
} |
| 916 |
|
| 917 |
NS_LOG_DEBUG ("attenuation coefficent="<<rxc<<"Db"); |
| 918 |
|
| 919 |
return txPowerDbm + rxc; |
| 920 |
} |
| 921 |
|
| 922 |
// ------------------------------------------------------------------------- // |
| 923 |
|
| 832 |
} // namespace ns3 |
924 |
} // namespace ns3 |