5G-LENA nr-v4.0-29-g6d8085cd
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-channel-setup-test.cc
Go to the documentation of this file.
1// Copyright (c) 2024 LASSE / Universidade Federal do Pará (UFPA)
2// Copyright (c) 2024 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3//
4// SPDX-License-Identifier: GPL-2.0-only
5// Author: João Albuquerque <joao.barbosa.albuquerque@itec.ufpa.br>
6
7#include "ns3/channel-condition-model.h"
8#include "ns3/log.h"
9#include "ns3/multi-model-spectrum-channel.h"
10#include "ns3/nr-channel-helper.h"
11#include "ns3/nyu-channel-condition-model.h"
12#include "ns3/nyu-propagation-loss-model.h"
13#include "ns3/nyu-spectrum-propagation-loss-model.h"
14#include "ns3/pointer.h"
15#include "ns3/test.h"
16#include "ns3/three-gpp-propagation-loss-model.h"
17#include "ns3/three-gpp-spectrum-propagation-loss-model.h"
18#include "ns3/three-gpp-v2v-channel-condition-model.h"
19#include "ns3/three-gpp-v2v-propagation-loss-model.h"
20#include "ns3/two-ray-spectrum-propagation-loss-model.h"
21
22using namespace ns3;
23
47class NrChannelSetupTest : public TestSuite
48{
49 public:
53 struct ChannelConfig
54 {
55 std::string scenario;
56 std::string condition;
57 std::string channelModel;
58 };
59
63 NrChannelSetupTest();
67 ~NrChannelSetupTest() override;
71 void ValidateCreatedChannel(const Ptr<MultiModelSpectrumChannel> channel,
72 const ChannelConfig& config);
73
74 private:
78 void DoRun() override;
79
80 // All supported scenarios for each channel model
81 std::map<std::string, std::vector<std::string>> supportedScenarios{
82 // ThreeGpp supported scenarios
83 {"ThreeGpp",
84 {"RMa",
85 "UMa",
86 "UMi",
87 "InH-OfficeOpen",
88 "InH-OfficeMixed",
89 "V2V-Highway",
90 "V2V-Urban",
91 "UMi",
92 "NTN-DenseUrban",
93 "NTN-Urban",
94 "NTN-Suburban",
95 "NTN-Rural"}},
96 // TwoRay supported scenarios (V2V-Highway and V2V-Urban are not yet calibrated)
97 {"TwoRay",
98 {
99 "RMa",
100 "UMa",
101 "UMi",
102 "InH-OfficeOpen",
103 "InH-OfficeMixed" // V2V-Highway, "V2V-Urban"
104 }},
105 // NYU supported scenarios
106 {"NYU", {"RMa", "UMa", "UMi", "InF", "InH"}}};
107
108 // All channel conditions
109 std::vector<std::string> channelConditions = {"LOS", "NLOS", "Buildings", "Default"};
110 // All channel models
111 std::vector<std::string> channelModels = {"ThreeGpp", "TwoRay", "NYU"};
112
113 // FTR uses almost the same scenarios of 3GPP so we can use the same TypeIds for both 3GPP and
114 // FTR. These are the expected TypeIds for the channel conditions and propagation loss models
115 std::map<std::pair<std::string, std::string>, std::pair<TypeId, TypeId>> channelInfoTypeId = {
116 {{"ThreeGpp", "RMa"},
117 std::make_pair(ThreeGppRmaChannelConditionModel::GetTypeId(),
118 ThreeGppRmaPropagationLossModel::GetTypeId())},
119 {{"ThreeGpp", "UMa"},
120 std::make_pair(ThreeGppUmaChannelConditionModel::GetTypeId(),
121 ThreeGppUmaPropagationLossModel::GetTypeId())},
122 {{"ThreeGpp", "UMi"},
123 std::make_pair(ThreeGppUmiStreetCanyonChannelConditionModel::GetTypeId(),
124 ThreeGppUmiStreetCanyonPropagationLossModel::GetTypeId())},
125 {{"ThreeGpp", "InH-OfficeOpen"},
126 std::make_pair(ThreeGppIndoorOpenOfficeChannelConditionModel::GetTypeId(),
127 ThreeGppIndoorOfficePropagationLossModel::GetTypeId())},
128 {{"ThreeGpp", "InH-OfficeMixed"},
129 std::make_pair(ThreeGppIndoorMixedOfficeChannelConditionModel::GetTypeId(),
130 ThreeGppIndoorOfficePropagationLossModel::GetTypeId())},
131 {{"ThreeGpp", "V2V-Highway"},
132 std::make_pair(ThreeGppV2vHighwayChannelConditionModel::GetTypeId(),
133 ThreeGppV2vHighwayPropagationLossModel::GetTypeId())},
134 {{"ThreeGpp", "V2V-Urban"},
135 std::make_pair(ThreeGppV2vUrbanChannelConditionModel::GetTypeId(),
136 ThreeGppV2vUrbanPropagationLossModel::GetTypeId())},
137 {{"ThreeGpp", "NTN-DenseUrban"},
138 std::make_pair(ThreeGppNTNDenseUrbanChannelConditionModel::GetTypeId(),
139 ThreeGppNTNDenseUrbanPropagationLossModel::GetTypeId())},
140 {{"ThreeGpp", "NTN-Urban"},
141 std::make_pair(ThreeGppNTNUrbanChannelConditionModel::GetTypeId(),
142 ThreeGppNTNUrbanPropagationLossModel::GetTypeId())},
143 {{"ThreeGpp", "NTN-Suburban"},
144 std::make_pair(ThreeGppNTNSuburbanChannelConditionModel::GetTypeId(),
145 ThreeGppNTNSuburbanPropagationLossModel::GetTypeId())},
146 {{"ThreeGpp", "NTN-Rural"},
147 std::make_pair(ThreeGppNTNRuralChannelConditionModel::GetTypeId(),
148 ThreeGppNTNRuralPropagationLossModel::GetTypeId())},
149 {{"NYU", "RMa"},
150 std::make_pair(NYURmaChannelConditionModel::GetTypeId(),
151 NYURmaPropagationLossModel::GetTypeId())},
152 {{"NYU", "UMa"},
153 std::make_pair(NYUUmaChannelConditionModel::GetTypeId(),
154 NYUUmaPropagationLossModel::GetTypeId())},
155 {{"NYU", "UMi"},
156 std::make_pair(NYUUmiChannelConditionModel::GetTypeId(),
157 NYUUmiPropagationLossModel::GetTypeId())},
158 {{"NYU", "InF"},
159 std::make_pair(NYUInFChannelConditionModel::GetTypeId(),
160 NYUInFPropagationLossModel::GetTypeId())},
161 {{"NYU", "InH"},
162 std::make_pair(NYUInHChannelConditionModel::GetTypeId(),
163 NYUInHPropagationLossModel::GetTypeId())}};
164
165 // TypeIds for the channel models
166 std::map<std::string, TypeId> channelModelTypeId = {
167 {"ThreeGpp", ThreeGppSpectrumPropagationLossModel::GetTypeId()},
168 {"TwoRay", TwoRaySpectrumPropagationLossModel::GetTypeId()},
169 {"NYU", NYUSpectrumPropagationLossModel::GetTypeId()}};
170 // TypeIds for the channel conditions
171 std::map<std::string, TypeId> channelConditionTypeId = {
172 {"LOS", AlwaysLosChannelConditionModel::GetTypeId()},
173 {"NLOS", NeverLosChannelConditionModel::GetTypeId()},
174 {"Buildings", BuildingsChannelConditionModel::GetTypeId()}};
175};
176
177NrChannelSetupTest::NrChannelSetupTest()
178 : TestSuite("nr-channel-setup-test")
179{
180}
181
182NrChannelSetupTest::~NrChannelSetupTest()
183{
184}
185
186void
187NrChannelSetupTest::DoRun()
188{
189 auto channelHelper = CreateObject<NrChannelHelper>();
190 for (auto& channel : channelModels)
191 {
192 for (auto& condition : channelConditions)
193 {
194 for (auto& scenario : supportedScenarios[channel])
195 {
196 channelHelper->ConfigureFactories(scenario, condition, channel);
197 auto specChannel = channelHelper->CreateChannel();
198 ValidateCreatedChannel(DynamicCast<MultiModelSpectrumChannel>(specChannel),
199 {scenario, condition, channel});
200 }
201 }
202 }
203}
204
205void
206NrChannelSetupTest::ValidateCreatedChannel(const Ptr<MultiModelSpectrumChannel> channel,
207 const ChannelConfig& config)
208{
209 auto channelModel = channel->GetPhasedArraySpectrumPropagationLossModel();
210 auto propagationLossModel = channel->GetPropagationLossModel();
211 // Get the channel conidtion model, using the propagation object
212 PointerValue channelConditionModelPtr;
213 propagationLossModel->GetAttribute("ChannelConditionModel", channelConditionModelPtr);
214 auto channelConditionModel = channelConditionModelPtr.Get<ChannelConditionModel>();
215
216 // Check if the channel model is the one expected
217 NS_TEST_ASSERT_MSG_EQ(channelModelTypeId[config.channelModel],
218 channelModel->GetInstanceTypeId(),
219 "Channel model is not the one expected");
220
221 // If LOS, NLOS or Buildings, it maps to the expected channel condition model using the
222 // channelConditionTypeId map. Instead, if Default, it uses the channelInfoTypeId map to get the
223 // expected channel condition model
224 TypeId expectedChannelConditionTypeId = channelConditionTypeId[config.condition];
225 // If FTR is used, the channel model is the same as 3GPP
226 auto currentChannel = (config.channelModel == "TwoRay") ? "ThreeGpp" : config.channelModel;
227 if (config.condition == "Default")
228 {
229 expectedChannelConditionTypeId = channelInfoTypeId[{currentChannel, config.scenario}].first;
230 }
231
232 // Check if the channel condition model is the one expected
233 NS_TEST_ASSERT_MSG_EQ(expectedChannelConditionTypeId,
234 channelConditionModel->GetInstanceTypeId(),
235 "Channel condition is not the one expected");
236
237 // Check if the propagation loss model is the one expected
238 NS_TEST_ASSERT_MSG_EQ(channelInfoTypeId[std::make_pair(currentChannel, config.scenario)].second,
239 propagationLossModel->GetInstanceTypeId(),
240 "Propagation loss model is not the one expected");
241}
242
243static NrChannelSetupTest g_NrChannelSetupTest;