141 const std::string& scenario,
142 const std::string& confType,
143 const std::string& radioNetwork,
144 std::string errorModel,
145 const std::string& operationMode,
146 const std::string& direction,
148 const std::string& pattern,
149 const NodeContainer& gnbSector1Container,
150 const NodeContainer& gnbSector2Container,
151 const NodeContainer& gnbSector3Container,
152 const NodeContainer& ueSector1Container,
153 const NodeContainer& ueSector2Container,
154 const NodeContainer& ueSector3Container,
155 const Ptr<NrPointToPointEpcHelper>& baseEpcHelper,
156 Ptr<NrHelper>& nrHelper,
157 NetDeviceContainer& gnbSector1NetDev,
158 NetDeviceContainer& gnbSector2NetDev,
159 NetDeviceContainer& gnbSector3NetDev,
160 NetDeviceContainer& ueSector1NetDev,
161 NetDeviceContainer& ueSector2NetDev,
162 NetDeviceContainer& ueSector3NetDev,
165 std::string powerAllocation,
171 const std::string& scheduler,
172 uint32_t bandwidthMHz,
174 uint32_t freqScenario,
177 double downtiltAngle,
178 const uint32_t gnbNumRows,
179 const uint32_t gnbNumColumns,
180 const uint32_t ueNumRows,
181 const uint32_t ueNumColumns,
182 bool gnbEnable3gppElement,
183 bool ueEnable3gppElement,
184 const double gnbHSpacing,
185 const double gnbVSpacing,
186 const double ueHSpacing,
187 const double ueVSpacing,
188 const double gnbNoiseFigure,
189 const double ueNoiseFigure,
191 bool enableShadowing,
193 double o2iLowLossThreshold,
194 bool linkO2iConditionToAntennaHeight,
195 bool crossPolarizedGnb,
196 bool crossPolarizedUe,
197 double polSlantAngleGnb1,
198 double polSlantAngleGnb2,
199 double polSlantAngleUe1,
200 double polSlantAngleUe2,
201 std::string bfMethod,
202 uint16_t beamConfSector,
203 double beamConfElevation,
210 uint8_t numScPerRb = 1;
211 double rbOverhead = 0.1;
212 uint32_t harqProcesses = 20;
213 uint32_t n1Delay = 2;
214 uint32_t n2Delay = 2;
215 uint8_t dlCtrlSymbols = 1;
217 if (radioNetwork ==
"LTE")
225 if (errorModel.empty())
227 errorModel =
"ns3::LenaErrorModel";
229 else if (errorModel !=
"ns3::NrLteMiErrorModel" && errorModel !=
"ns3::LenaErrorModel")
231 NS_ABORT_MSG(
"The selected error model is not recommended for LTE");
234 else if (radioNetwork ==
"NR")
238 if (errorModel.empty())
240 errorModel =
"ns3::NrEesmIrT1";
242 else if (errorModel ==
"ns3::NrLteMiErrorModel")
244 NS_ABORT_MSG(
"The selected error model is not recommended for NR");
249 NS_ABORT_MSG(
"Unrecognized radio network technology");
260 nrHelper = CreateObject<NrHelper>();
262 Ptr<BeamformingHelperBase> beamformingHelper;
268 if (enableFading && bfMethod !=
"FixedBeam")
270 if (radioNetwork ==
"NR" && enableRealBF)
272 beamformingHelper = CreateObject<RealisticBeamformingHelper>();
276 beamformingHelper = CreateObject<IdealBeamformingHelper>();
278 nrHelper->SetBeamformingHelper(beamformingHelper);
281 Ptr<NrPointToPointEpcHelper> nrEpcHelper = DynamicCast<NrPointToPointEpcHelper>(baseEpcHelper);
282 nrHelper->SetEpcHelper(nrEpcHelper);
284 double txPowerBs = 0.0;
288 if (scenario ==
"UMa")
292 else if (scenario ==
"RMa")
294 scene = BandwidthPartInfo::RMa;
296 else if (scenario ==
"UMi-StreetCanyon")
302 NS_ABORT_MSG(
"Unsupported scenario " << scenario
303 <<
". Supported values: UMa, RMa, UMi_StreetCanyon");
306 txPowerBs = gnbTxPower;
307 std::cout <<
"Scenario: " << scenario <<
"gnbTxPower: " << txPowerBs << std::endl;
309 Config::SetDefault(
"ns3::ThreeGppChannelModel::UpdatePeriod", TimeValue(MilliSeconds(100)));
310 nrHelper->SetPhasedArraySpectrumPropagationLossModelTypeId(
311 DistanceBasedThreeGppSpectrumPropagationLossModel::GetTypeId());
312 nrHelper->SetPhasedArraySpectrumPropagationLossModelAttribute(
"MaxDistance",
313 DoubleValue(2 * isd));
314 nrHelper->SetChannelConditionModelAttribute(
"UpdatePeriod", TimeValue(MilliSeconds(100)));
315 nrHelper->SetChannelConditionModelAttribute(
"LinkO2iConditionToAntennaHeight",
316 BooleanValue(linkO2iConditionToAntennaHeight));
317 nrHelper->SetChannelConditionModelAttribute(
"O2iThreshold", DoubleValue(o2iThreshold));
318 nrHelper->SetChannelConditionModelAttribute(
"O2iLowLossThreshold",
319 DoubleValue(o2iLowLossThreshold));
321 std::cout <<
"o2iThreshold: " << o2iThreshold << std::endl;
322 std::cout <<
"o2iLowLossThreshold: " << o2iLowLossThreshold << std::endl;
324 nrHelper->SetPathlossAttribute(
"ShadowingEnabled", BooleanValue(enableShadowing));
327 nrHelper->SetGnbPhyAttribute(
"NoiseFigure", DoubleValue(gnbNoiseFigure));
329 nrHelper->SetUePhyAttribute(
"NoiseFigure", DoubleValue(ueNoiseFigure));
330 nrHelper->SetUePhyAttribute(
"EnableUplinkPowerControl", BooleanValue(enableUlPc));
332 if (radioNetwork ==
"LTE" && confType ==
"calibrationConf" && enableUlPc)
334 Config::SetDefault(
"ns3::NrUePowerControl::ClosedLoop", BooleanValue(
false));
335 Config::SetDefault(
"ns3::NrUePowerControl::PoNominalPucch", IntegerValue(-106));
336 Config::SetDefault(
"ns3::NrUePowerControl::PoNominalPusch", IntegerValue(-106));
337 Config::SetDefault(
"ns3::NrUePowerControl::Alpha",
341 Config::SetDefault(
"ns3::NrMacSchedulerSrsDefault::StartingPeriodicity", UintegerValue(16));
342 nrHelper->SetSchedulerAttribute(
"SrsSymbols", UintegerValue(1));
344 NrSpectrumValueHelper::PowerAllocationType powerAllocationEnum;
345 if (powerAllocation ==
"UniformPowerAllocBw")
347 powerAllocationEnum = NrSpectrumValueHelper::UNIFORM_POWER_ALLOCATION_BW;
349 else if (powerAllocation ==
"UniformPowerAllocUsed")
351 powerAllocationEnum = NrSpectrumValueHelper::UNIFORM_POWER_ALLOCATION_USED;
355 NS_ABORT_MSG(
"Unsupported power allocation type "
357 <<
". Supported values: "
358 "UniformPowerAllocBw and UniformPowerAllocUsed.");
361 nrHelper->SetUePhyAttribute(
"PowerAllocationType", EnumValue(powerAllocationEnum));
363 nrHelper->SetGnbPhyAttribute(
"PowerAllocationType",
364 EnumValue(NrSpectrumValueHelper::UNIFORM_POWER_ALLOCATION_BW));
367 nrHelper->SetUlErrorModel(errorModel);
368 nrHelper->SetDlErrorModel(errorModel);
378 nrHelper->SetGnbDlAmcAttribute(
"NumRefScPerRb", UintegerValue(numScPerRb));
379 nrHelper->SetGnbUlAmcAttribute(
"NumRefScPerRb", UintegerValue(1));
381 nrHelper->SetGnbPhyAttribute(
"RbOverhead", DoubleValue(rbOverhead));
382 nrHelper->SetGnbPhyAttribute(
"N2Delay", UintegerValue(n2Delay));
383 nrHelper->SetGnbPhyAttribute(
"N1Delay", UintegerValue(n1Delay));
385 nrHelper->SetUeMacAttribute(
"NumHarqProcess", UintegerValue(harqProcesses));
386 nrHelper->SetGnbMacAttribute(
"NumHarqProcess", UintegerValue(harqProcesses));
438 const double band0Start = startingFreq;
439 double bandwidthBwp = bandwidthMHz * 1e6;
448 uint8_t numBwp = operationMode ==
"FDD" ? 2 : 1;
450 if (freqScenario == 0)
452 double bandwidthCc = numBwp * bandwidthBwp;
453 uint8_t numCcPerBand = 1;
454 double bandwidthBand = numCcPerBand * bandwidthCc;
455 double bandCenter = band0Start + bandwidthBand / 2.0;
457 NS_LOG_LOGIC(
"NON_OVERLAPPING, " << operationMode <<
": " << bandwidthBand <<
":"
458 << bandwidthCc <<
":" << bandwidthBwp <<
", "
459 << (
int)numCcPerBand <<
", " << (
int)numBwp);
461 NS_LOG_LOGIC(
"bandConf0: " << bandCenter <<
" " << bandwidthBand);
467 bandCenter += bandwidthBand;
469 NS_LOG_LOGIC(
"bandConf1: " << bandCenter <<
" " << bandwidthBand);
475 bandCenter += bandwidthBand;
477 NS_LOG_LOGIC(
"bandConf2: " << bandCenter <<
" " << bandwidthBand);
495 bandCenter = band0Start + bandwidthBwp / 2.0;
497 NS_LOG_LOGIC(
"band0[0][0]: " << bandCenter <<
" " << bandwidthBwp);
498 ConfigureBwpTo(band0.
m_cc[0]->m_bwp[0], bandCenter, bandwidthBwp);
499 bandCenter += bandwidthBwp;
501 if (operationMode ==
"FDD")
503 NS_LOG_LOGIC(
"band0[0][1]: " << bandCenter <<
" " << bandwidthBwp);
504 ConfigureBwpTo(band0.
m_cc[0]->m_bwp[1], bandCenter, bandwidthBwp);
505 bandCenter += bandwidthBwp;
508 NS_LOG_LOGIC(
"band1[0][0]: " << bandCenter <<
" " << bandwidthBwp);
509 ConfigureBwpTo(band1.
m_cc[0]->m_bwp[0], bandCenter, bandwidthBwp);
510 bandCenter += bandwidthBwp;
512 if (operationMode ==
"FDD")
514 NS_LOG_LOGIC(
"band1[0][1]: " << bandCenter <<
" " << bandwidthBwp);
515 ConfigureBwpTo(band1.
m_cc[0]->m_bwp[1], bandCenter, bandwidthBwp);
516 bandCenter += bandwidthBwp;
519 NS_LOG_LOGIC(
"band2[0][0]: " << bandCenter <<
" " << bandwidthBwp);
520 ConfigureBwpTo(band2.
m_cc[0]->m_bwp[0], bandCenter, bandwidthBwp);
521 bandCenter += bandwidthBwp;
523 if (operationMode ==
"FDD")
525 NS_LOG_LOGIC(
"band2[0][1]: " << bandCenter <<
" " << bandwidthBwp);
526 ConfigureBwpTo(band2.
m_cc[0]->m_bwp[1], bandCenter, bandwidthBwp);
529 std::cout <<
"BWP Configuration for NON_OVERLAPPING case, mode " << operationMode <<
"\n"
530 << band0 << band1 << band2;
533 else if (freqScenario == 1)
535 double bandwidthCc = numBwp * bandwidthBwp;
536 uint8_t numCcPerBand = 1;
537 double bandwidthBand = numCcPerBand * bandwidthCc;
538 double bandCenter = band0Start + bandwidthBand / 2.0;
540 NS_LOG_LOGIC(
"OVERLAPPING, " << operationMode <<
": " << bandwidthBand <<
":" << bandwidthCc
541 <<
":" << bandwidthBwp <<
", " << (
int)numCcPerBand <<
", "
544 NS_LOG_LOGIC(
"bandConf0: " << bandCenter <<
" " << bandwidthBand);
550 bandCenter += bandwidthBand;
557 bandCenter = band0Start + bandwidthBwp / 2.0;
559 NS_LOG_LOGIC(
"band0[0][0]: " << bandCenter <<
" " << bandwidthBwp);
560 ConfigureBwpTo(band0.
m_cc[0]->m_bwp[0], bandCenter, bandwidthBwp);
561 bandCenter += bandwidthBwp;
563 if (operationMode ==
"FDD")
565 NS_LOG_LOGIC(
"band0[0][1]: " << bandCenter <<
" " << bandwidthBwp);
566 ConfigureBwpTo(band0.
m_cc[0]->m_bwp[1], bandCenter, bandwidthBwp);
569 std::cout <<
"BWP Configuration for OVERLAPPING case, mode " << operationMode <<
"\n"
575 std::cerr <<
"unknown combination of freqScenario = " << freqScenario
576 <<
" and operationMode = " << operationMode << std::endl;
586 nrHelper->InitializeOperationBand(&band0, bandMask);
587 nrHelper->InitializeOperationBand(&band1, bandMask);
588 nrHelper->InitializeOperationBand(&band2, bandMask);
593 if (freqScenario == 0)
606 RealisticBfManager::TriggerEvent realTriggerEvent{RealisticBfManager::SRS_COUNT};
610 if (enableFading && bfMethod !=
"FixedBeam")
612 if (radioNetwork ==
"NR")
618 nrHelper->SetGnbBeamManagerAttribute(
"TriggerEvent", EnumValue(realTriggerEvent));
619 nrHelper->SetGnbBeamManagerAttribute(
"UpdateDelay", TimeValue(MicroSeconds(0)));
623 if (bfMethod ==
"Omni")
625 beamformingHelper->SetBeamformingMethod(
628 else if (bfMethod ==
"CellScan")
631 beamformingHelper->SetAttribute(
"BeamformingPeriodicity",
632 TimeValue(MilliSeconds(10)));
634 else if (bfMethod ==
"CellScanAzimuth")
636 beamformingHelper->SetBeamformingMethod(
641 NS_ABORT_MSG(
"We shouldn't be here. bfMethod is: " << bfMethod);
645 else if (radioNetwork ==
"LTE")
647 if (bfMethod ==
"Omni")
649 beamformingHelper->SetBeamformingMethod(
652 else if (bfMethod ==
"CellScan")
655 beamformingHelper->SetAttribute(
"BeamformingPeriodicity",
656 TimeValue(MilliSeconds(10)));
660 NS_ABORT_MSG(
"We shouldn't be here. bfMethod is: " << bfMethod);
667 if (radioNetwork ==
"NR")
669 if (scheduler ==
"PF")
671 nrHelper->SetSchedulerTypeId(TypeId::LookupByName(
"ns3::NrMacSchedulerTdmaPF"));
673 else if (scheduler ==
"RR")
675 nrHelper->SetSchedulerTypeId(TypeId::LookupByName(
"ns3::NrMacSchedulerTdmaRR"));
680 if (scheduler ==
"PF")
682 nrHelper->SetSchedulerTypeId(TypeId::LookupByName(
"ns3::NrMacSchedulerOfdmaPF"));
684 else if (scheduler ==
"RR")
686 nrHelper->SetSchedulerTypeId(TypeId::LookupByName(
"ns3::NrMacSchedulerOfdmaRR"));
689 nrHelper->SetSchedulerAttribute(
"EnableHarqReTx", BooleanValue(
false));
692 nrHelper->SetSchedulerAttribute(
"SrsSymbols", UintegerValue(1));
693 nrHelper->SetSchedulerAttribute(
"EnableSrsInUlSlots", BooleanValue(
false));
694 nrHelper->SetSchedulerAttribute(
"EnableSrsInFSlots", BooleanValue(
false));
697 nrHelper->SetSchedulerAttribute(
"DlCtrlSymbols", UintegerValue(dlCtrlSymbols));
700 nrEpcHelper->SetAttribute(
"S1uLinkDelay", TimeValue(MilliSeconds(0)));
703 nrHelper->SetUeAntennaAttribute(
"NumRows", UintegerValue(ueNumRows));
704 nrHelper->SetUeAntennaAttribute(
"NumColumns", UintegerValue(ueNumColumns));
706 if (ueEnable3gppElement)
708 nrHelper->SetUeAntennaAttribute(
"AntennaElement",
709 PointerValue(CreateObject<ThreeGppAntennaModel>()));
713 nrHelper->SetUeAntennaAttribute(
"AntennaElement",
714 PointerValue(CreateObject<IsotropicAntennaModel>()));
717 nrHelper->SetUeAntennaAttribute(
"AntennaHorizontalSpacing", DoubleValue(ueHSpacing));
718 nrHelper->SetUeAntennaAttribute(
"AntennaVerticalSpacing", DoubleValue(ueVSpacing));
721 nrHelper->SetGnbAntennaAttribute(
"NumRows", UintegerValue(gnbNumRows));
722 nrHelper->SetGnbAntennaAttribute(
"NumColumns", UintegerValue(gnbNumColumns));
724 nrHelper->SetGnbAntennaAttribute(
"AntennaHorizontalSpacing", DoubleValue(gnbHSpacing));
725 nrHelper->SetGnbAntennaAttribute(
"AntennaVerticalSpacing", DoubleValue(gnbVSpacing));
727 nrHelper->SetGnbAntennaAttribute(
"DowntiltAngle", DoubleValue(downtiltAngle * M_PI / 180.0));
729 if (gnbEnable3gppElement)
731 nrHelper->SetGnbAntennaAttribute(
"AntennaElement",
732 PointerValue(CreateObject<ThreeGppAntennaModel>()));
736 nrHelper->SetGnbAntennaAttribute(
"AntennaElement",
737 PointerValue(CreateObject<IsotropicAntennaModel>()));
740 double gnbFirstSubArray = (polSlantAngleGnb1 * M_PI) / 180.0;
741 double gnbSecondSubArray = (polSlantAngleGnb2 * M_PI) / 180.0;
742 double ueFirstSubArray = (polSlantAngleUe1 * M_PI) / 180.0;
743 double ueSecondSubArray = (polSlantAngleUe2 * M_PI) / 180.0;
746 nrHelper->SetUePhyAttribute(
"TxPower", DoubleValue(ueTxPower));
752 if (radioNetwork ==
"LTE")
754 switch (bandwidthMHz)
759 nrHelper->SetGnbMacAttribute(
"NumRbPerRbg", UintegerValue(4));
762 nrHelper->SetGnbMacAttribute(
"NumRbPerRbg", UintegerValue(3));
765 nrHelper->SetGnbMacAttribute(
"NumRbPerRbg", UintegerValue(2));
769 "Currently, only supported bandwidths are 5, 10, 15, 20 and 40MHz, you chose "
775 nrHelper->SetGnbMacAttribute(
"NumRbPerRbg", UintegerValue(1));
779 uint32_t bwpIdForLowLat = 0;
780 if (operationMode ==
"FDD" && direction ==
"UL")
786 nrHelper->SetGnbBwpManagerAlgorithmAttribute(
"NGBR_LOW_LAT_EMBB",
787 UintegerValue(bwpIdForLowLat));
790 nrHelper->SetUeBwpManagerAlgorithmAttribute(
"NGBR_LOW_LAT_EMBB", UintegerValue(bwpIdForLowLat));
794 gnbSector1NetDev = nrHelper->InstallGnbDevice(gnbSector1Container, sector1Bwps);
795 NetDeviceContainer gnbNetDevs(gnbSector1NetDev);
796 gnbSector2NetDev = nrHelper->InstallGnbDevice(gnbSector2Container, sector2Bwps);
797 gnbNetDevs.Add(gnbSector2NetDev);
798 gnbSector3NetDev = nrHelper->InstallGnbDevice(gnbSector3Container, sector3Bwps);
799 gnbNetDevs.Add(gnbSector3NetDev);
800 ueSector1NetDev = nrHelper->InstallUeDevice(ueSector1Container, sector1Bwps);
801 NetDeviceContainer ueNetDevs(ueSector1NetDev);
802 ueSector2NetDev = nrHelper->InstallUeDevice(ueSector2Container, sector2Bwps);
803 ueNetDevs.Add(ueSector2NetDev);
804 ueSector3NetDev = nrHelper->InstallUeDevice(ueSector3Container, sector3Bwps);
805 ueNetDevs.Add(ueSector3NetDev);
807 int64_t randomStream = 1;
808 randomStream += nrHelper->AssignStreams(gnbSector1NetDev, randomStream);
809 randomStream += nrHelper->AssignStreams(gnbSector2NetDev, randomStream);
810 randomStream += nrHelper->AssignStreams(gnbSector3NetDev, randomStream);
811 randomStream += nrHelper->AssignStreams(ueSector1NetDev, randomStream);
812 randomStream += nrHelper->AssignStreams(ueSector2NetDev, randomStream);
813 randomStream += nrHelper->AssignStreams(ueSector3NetDev, randomStream);
816 std::vector<double> sectorOrientationRad{
818 sector0AngleRad + 2.0 * M_PI / 3.0,
819 sector0AngleRad - 2.0 * M_PI / 3.0
822 for (uint32_t cellId = 0; cellId < gnbNetDevs.GetN(); ++cellId)
824 Ptr<NetDevice> gnb = gnbNetDevs.Get(cellId);
825 uint32_t numBwps = nrHelper->GetNumberBwp(gnb);
828 NS_ABORT_MSG(
"Incorrect number of BWPs per CC");
831 uint32_t sector = cellId % (gnbSector3NetDev.GetN() == 0 ? 1 : 3);
832 double orientation = sectorOrientationRad[sector];
835 ConfigurePhy(nrHelper,
849 ConfigurePhy(nrHelper,
861 nrHelper->GetBwpManagerGnb(gnb)->SetOutputLink(1, 0);
865 Ptr<UniformRandomVariable> m_uniformUeBearingAngle;
866 m_uniformUeBearingAngle = CreateObject<UniformRandomVariable>();
869 for (
auto nd = ueNetDevs.Begin(); nd != ueNetDevs.End(); ++nd)
871 auto uePhyFirst = nrHelper->GetUePhy(*nd, 0);
872 auto uePhySecond{uePhyFirst};
874 ObjectVectorValue ueSpectrumPhysFirstBwp;
875 Ptr<NrSpectrumPhy> nrSpectrumPhy = uePhyFirst->GetSpectrumPhy();
876 nrSpectrumPhy->GetAntenna()->GetObject<UniformPlanarArray>()->SetAttribute(
878 DoubleValue(ueFirstSubArray));
883 double ueBearingAngleValue = m_uniformUeBearingAngle->GetValue(-180, 180);
884 ueBearingAngleValue = (ueBearingAngleValue * M_PI) / 180.0;
885 nrSpectrumPhy->GetAntenna()->GetObject<UniformPlanarArray>()->SetAttribute(
887 DoubleValue(ueBearingAngleValue));
889 if (ueSpectrumPhysFirstBwp.GetN() == 2)
891 nrSpectrumPhy = ueSpectrumPhysFirstBwp.Get(1)->GetObject<
NrSpectrumPhy>();
892 nrSpectrumPhy->
GetAntenna()->GetObject<UniformPlanarArray>()->SetAttribute(
894 DoubleValue(ueSecondSubArray));
897 if (operationMode ==
"FDD")
899 nrHelper->GetBwpManagerUe(*nd)->SetOutputLink(0, 1);
900 uePhySecond = nrHelper->GetUePhy(*nd, 1);
901 uePhySecond->SetUplinkPowerControl(uePhyFirst->GetUplinkPowerControl());
903 ObjectVectorValue ueSpectrumPhysSecondBwp;
904 nrSpectrumPhy = uePhySecond->GetSpectrumPhy();
905 nrSpectrumPhy->GetAntenna()->GetObject<UniformPlanarArray>()->SetAttribute(
907 DoubleValue(ueFirstSubArray));
909 uePhyFirst->TraceConnectWithoutContext(
"DlDataSinr",
910 MakeBoundCallback(&ReportSinrNr, sinrStats));
911 uePhySecond->TraceConnectWithoutContext(
"ReportPowerSpectralDensity",
912 MakeBoundCallback(&ReportPowerNr, ueTxPowerStats));
916 for (
auto nd = gnbNetDevs.Begin(); nd != gnbNetDevs.End(); ++nd)
919 if (operationMode ==
"FDD" && direction ==
"UL")
923 auto gnbPhy = nrHelper->GetGnbPhy(*nd, bwpId);
924 gnbPhy->TraceConnectWithoutContext(
"SlotDataStats",
925 MakeBoundCallback(&ReportSlotStatsNr, slotStats));
926 gnbPhy->TraceConnectWithoutContext(
"RBDataStats",
927 MakeBoundCallback(&ReportRbStatsNr, rbStats));
928 gnbPhy->GetSpectrumPhy()->TraceConnectWithoutContext(
930 MakeBoundCallback(&ReportGnbRxDataNr, gnbRxPowerStats));
932 DynamicCast<NrGnbNetDevice>(*nd)->UpdateConfig();
935 for (
auto nd = ueNetDevs.Begin(); nd != ueNetDevs.End(); ++nd)
937 DynamicCast<NrUeNetDevice>(*nd)->UpdateConfig();
static void SetLenaV2SimulatorParameters(const double sector0AngleRad, const std::string &scenario, const std::string &confType, const std::string &radioNetwork, std::string errorModel, const std::string &operationMode, const std::string &direction, uint16_t numerology, const std::string &pattern, const NodeContainer &gnbSector1Container, const NodeContainer &gnbSector2Container, const NodeContainer &gnbSector3Container, const NodeContainer &ueSector1Container, const NodeContainer &ueSector2Container, const NodeContainer &ueSector3Container, const Ptr< NrPointToPointEpcHelper > &baseEpcHelper, Ptr< NrHelper > &nrHelper, NetDeviceContainer &gnbSector1NetDev, NetDeviceContainer &gnbSector2NetDev, NetDeviceContainer &gnbSector3NetDev, NetDeviceContainer &ueSector1NetDev, NetDeviceContainer &ueSector2NetDev, NetDeviceContainer &ueSector3NetDev, bool enableFading, bool enableUlPc, std::string powerAllocation, SinrOutputStats *sinrStats, PowerOutputStats *ueTxPowerStats, PowerOutputStats *gnbRxPowerStats, SlotOutputStats *slotStats, RbOutputStats *rbStats, const std::string &scheduler, uint32_t bandwidthMHz, double startingFreq, uint32_t freqScenario, double gnbTxPower, double ueTxPower, double downtiltAngle, const uint32_t gnbNumRows, const uint32_t gnbNumColumns, const uint32_t ueNumRows, const uint32_t ueNumColumns, bool gnbEnable3gppElement, bool ueEnable3gppElement, const double gnbHSpacing, const double gnbVSpacing, const double ueHSpacing, const double ueVSpacing, const double gnbNoiseFigure, const double ueNoiseFigure, bool enableRealBF, bool enableShadowing, double o2iThreshold, double o2iLowLossThreshold, bool linkO2iConditionToAntennaHeight, bool crossPolarizedGnb, bool crossPolarizedUe, double polSlantAngleGnb1, double polSlantAngleGnb2, double polSlantAngleUe1, double polSlantAngleUe2, std::string bfMethod, uint16_t beamConfSector, double beamConfElevation, double isd, bool ueBearingAngle)