|
|
| 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" |
|
|
| 771 |
} |
772 |
} |
| 772 |
} |
773 |
} |
| 773 |
|
774 |
|
|
|
775 |
void |
| 776 |
MatrixPropagationLossModel::SetLoss (Ptr<MobilityModel> ma, Ptr<MobilityModel> mb, double loss, bool symmetric) |
| 777 |
{ |
| 778 |
NS_ASSERT (ma != 0 && mb != 0); |
| 779 |
|
| 780 |
MobilityPair p = std::make_pair(ma, mb); |
| 781 |
std::map<MobilityPair, double>::iterator i = m_loss.find (p); |
| 782 |
|
| 783 |
if (i == m_loss.end ()) |
| 784 |
{ |
| 785 |
m_loss.insert (std::make_pair (p, loss)); |
| 786 |
} |
| 787 |
else |
| 788 |
{ |
| 789 |
i->second = loss; |
| 790 |
} |
| 791 |
|
| 792 |
if (symmetric) |
| 793 |
{ |
| 794 |
SetLoss (mb, ma, loss, false); |
| 795 |
} |
| 796 |
} |
| 797 |
|
| 774 |
double |
798 |
double |
| 775 |
MatrixPropagationLossModel::DoCalcRxPower (double txPowerDbm, |
799 |
MatrixPropagationLossModel::DoCalcRxPower (double txPowerDbm, |
| 776 |
Ptr<MobilityModel> a, |
800 |
Ptr<MobilityModel> a, |
|
|
| 788 |
} |
812 |
} |
| 789 |
} |
813 |
} |
| 790 |
|
814 |
|
|
|
815 |
bool |
| 816 |
MatrixPropagationLossModel::ContainsPair (Ptr<MobilityModel> a, |
| 817 |
Ptr<MobilityModel> b) const |
| 818 |
{ |
| 819 |
std::map<MobilityPair, double>::const_iterator i = m_loss.find (std::make_pair (a, b)); |
| 820 |
|
| 821 |
return (i != m_loss.end ()); |
| 822 |
} |
| 823 |
|
| 791 |
// ------------------------------------------------------------------------- // |
824 |
// ------------------------------------------------------------------------- // |
| 792 |
|
825 |
|
| 793 |
NS_OBJECT_ENSURE_REGISTERED (RangePropagationLossModel); |
826 |
NS_OBJECT_ENSURE_REGISTERED (RangePropagationLossModel); |
|
|
| 829 |
|
862 |
|
| 830 |
// ------------------------------------------------------------------------- // |
863 |
// ------------------------------------------------------------------------- // |
| 831 |
|
864 |
|
|
|
865 |
NS_OBJECT_ENSURE_REGISTERED (PropagationLossCachedEvaluator); |
| 866 |
|
| 867 |
TypeId |
| 868 |
PropagationLossCachedEvaluator::GetTypeId (void) |
| 869 |
{ |
| 870 |
static TypeId tid = TypeId ("ns3::PropagationLossCachedEvaluator") |
| 871 |
.SetParent<PropagationLossModel> () |
| 872 |
.AddConstructor<PropagationLossCachedEvaluator> () |
| 873 |
.AddAttribute ("Symmetric", |
| 874 |
"Whether propagation loss is symmetric", |
| 875 |
BooleanValue (false), |
| 876 |
MakeBooleanAccessor (&PropagationLossCachedEvaluator::m_symmetric), |
| 877 |
MakeBooleanChecker ()) |
| 878 |
; |
| 879 |
return tid; |
| 880 |
} |
| 881 |
|
| 882 |
PropagationLossCachedEvaluator::PropagationLossCachedEvaluator (void) |
| 883 |
: PropagationLossModel (), m_symmetric (false), |
| 884 |
m_cache (CreateObject<MatrixPropagationLossModel> ()) |
| 885 |
{} |
| 886 |
|
| 887 |
void |
| 888 |
PropagationLossCachedEvaluator::AddModel (Ptr<PropagationLossModel> next) |
| 889 |
{ |
| 890 |
NS_ASSERT (next != 0x0); |
| 891 |
|
| 892 |
next->SetNext (m_models); |
| 893 |
m_models = next; |
| 894 |
} |
| 895 |
|
| 896 |
void |
| 897 |
PropagationLossCachedEvaluator::SetSymmetric (const bool b) |
| 898 |
{ |
| 899 |
m_symmetric = b; |
| 900 |
} |
| 901 |
|
| 902 |
bool |
| 903 |
PropagationLossCachedEvaluator::GetSymmetric (void) |
| 904 |
{ |
| 905 |
return m_symmetric; |
| 906 |
} |
| 907 |
|
| 908 |
double |
| 909 |
PropagationLossCachedEvaluator::DoCalcRxPower (double txPowerDbm, |
| 910 |
Ptr<MobilityModel> a, |
| 911 |
Ptr<MobilityModel> b) const |
| 912 |
{ |
| 913 |
double rxc = 0.0; |
| 914 |
|
| 915 |
if (m_cache->ContainsPair (a, b)) |
| 916 |
{ |
| 917 |
NS_LOG_DEBUG ("cache hit."); |
| 918 |
rxc = m_cache->CalcRxPower (0, a, b); |
| 919 |
} |
| 920 |
else |
| 921 |
{ |
| 922 |
NS_LOG_DEBUG ("cache miss."); |
| 923 |
rxc = m_models->CalcRxPower (0, a, b); // assumes models independent of power |
| 924 |
m_cache->SetLoss (a, b, -rxc, m_symmetric); |
| 925 |
} |
| 926 |
|
| 927 |
NS_LOG_DEBUG ("attenuation coefficent="<<rxc<<"Db"); |
| 928 |
|
| 929 |
return txPowerDbm + rxc; |
| 930 |
} |
| 931 |
|
| 932 |
// ------------------------------------------------------------------------- // |
| 933 |
|
| 832 |
} // namespace ns3 |
934 |
} // namespace ns3 |