309         {-0.21, 0.977701, 0, 0, 0, 0},
 
  310         {-0.48, 0.459445, 0.747335, 0, 0, 0},
 
  311         {-0.05, 0.377927, 0.28416, 0.879729, 0, 0},
 
  312         {-0.02, 0.691213, 0.258017, 0.073265, 0.670734, 0},
 
  313         {-0.31, -0.00521632, -0.115615, 0.0788023, 0.00218104, 0.940368},
 
  318         {-0.25, 0.968246, 0, 0, 0, 0},
 
  319         {-0.52, 0.35115, 0.778648, 0, 0, 0},
 
  320         {-0.04, 0.371806, 0.345008, 0.860889, 0, 0},
 
  321         {0, 0.743613, 0.281102, 0.0424415, 0.605161, 0},
 
  322         {-0.32, 0.0206559, -0.0689057, 0.154832, 0.061865, 0.929852},
 
  327         {-0.21, 0.977701, 0, 0, 0, 0},
 
  328         {-0.52, 0.450853, 0.725487, 0, 0, 0},
 
  329         {-0.04, 0.288023, 0.260989, 0.920504, 0, 0},
 
  330         {0.01, 0.697657, 0.386856, 0.0418183, 0.601472, 0},
 
  331         {-0.33, 0.0416283, -0.0694268, 0.166137, 0.139937, 0.915075},
 
  336         {-0.26, 0.965609, 0, 0, 0, 0},
 
  337         {-0.53, 0.395813, 0.749955, 0, 0, 0},
 
  338         {-0.04, 0.299914, 0.320139, 0.897754, 0, 0},
 
  339         {0.01, 0.696556, 0.372815, 0.0580784, 0.610202, 0},
 
  340         {-0.33, 0.0457742, -0.0173584, 0.154417, 0.129332, 0.920941},
 
  345         {-0.25, 0.968246, 0, 0, 0, 0},
 
  346         {-0.57, 0.420864, 0.705672, 0, 0, 0},
 
  347         {-0.03, 0.229797, 0.235501, 0.943839, 0, 0},
 
  348         {0.03, 0.679063, 0.384466, 0.0681379, 0.6209, 0},
 
  349         {-0.41, -0.147173, -0.229228, 0.270707, 0.293002, 0.773668},
 
  354         {-0.2, 0.979796, 0, 0, 0, 0},
 
  355         {-0.53, 0.473568, 0.703444, 0, 0, 0},
 
  356         {-0.05, 0.204124, 0.109225, 0.971547, 0, 0},
 
  357         {0.03, 0.68994, 0.411073, 0.0676935, 0.591202, 0},
 
  358         {-0.4, -0.224537, -0.292371, 0.275609, 0.301835, 0.732828},
 
  363         {-0.19, 0.981784, 0, 0, 0, 0},
 
  364         {-0.5, 0.524555, 0.689088, 0, 0, 0},
 
  365         {-0.03, 0.228462, 0.18163, 0.955989, 0, 0},
 
  366         {-0.02, 0.637818, 0.428725, 0.00608114, 0.639489, 0},
 
  367         {-0.36, -0.18171, -0.282523, 0.106726, 0.123808, 0.854894},
 
  372         {-0.2, 0.979796, 0, 0, 0, 0},
 
  373         {-0.49, 0.502145, 0.712566, 0, 0, 0},
 
  374         {-0.01, 0.232702, 0.151916, 0.960558, 0, 0},
 
  375         {-0.05, 0.612372, 0.376106, 0.0206792, 0.693265, 0},
 
  376         {-0.37, -0.320475, -0.365405, -0.00376264, 0.0364343, 0.790907},
 
  381         {-0.19, 0.981784, 0, 0, 0, 0},
 
  382         {-0.38, 0.58852, 0.713613, 0, 0, 0},
 
  383         {-0.03, 0.360874, 0.12082, 0.924269, 0, 0},
 
  384         {-0.12, 0.526796, 0.34244, 0.0594196, 0.766348, 0},
 
  385         {-0.33, -0.257389, -0.24372, -0.257035, -0.176521, 0.817451},
 
 
  456         {-0.36, 0.932952, 0, 0, 0, 0},
 
  457         {0.45, 0.516639, 0.728412, 0, 0, 0},
 
  458         {0.02, 0.329277, 0.371881, 0.867687, 0, 0},
 
  459         {-0.06, 0.59853, 0.436258, -0.0324062, 0.668424, 0},
 
  460         {-0.07, 0.0373009, 0.305087, -0.0280496, -0.225204, 0.921481},
 
  465         {-0.39, 0.920815, 0, 0, 0, 0},
 
  466         {0.52, 0.426579, 0.740021, 0, 0, 0},
 
  467         {0, 0.347518, -0.0381664, 0.936896, 0, 0},
 
  468         {-0.04, 0.710675, 0.172483, 0.116993, 0.670748, 0},
 
  469         {-0.17, -0.0394216, 0.115154, 0.243458, -0.0702635, 0.944498},
 
  474         {-0.41, 0.912086, 0, 0, 0, 0},
 
  475         {0.54, 0.49491, 0.680782, 0, 0, 0},
 
  476         {0, 0.350844, -0.152231, 0.923977, 0, 0},
 
  477         {-0.04, 0.694672, 0.0702137, 0.0832998, 0.709903, 0},
 
  478         {-0.19, -0.0854087, 0.0805978, 0.283811, -0.137441, 0.922318},
 
  483         {-0.37, 0.929032, 0, 0, 0, 0},
 
  484         {0.53, 0.480177, 0.698949, 0, 0, 0},
 
  485         {0.01, 0.434538, 0.00864797, 0.900556, 0, 0},
 
  486         {-0.05, 0.765851, -0.0303947, 0.0421641, 0.63896, 0},
 
  487         {-0.17, -0.16458, 0.0989022, 0.158081, -0.150425, 0.941602},
 
  492         {-0.4, 0.916515, 0, 0, 0, 0},
 
  493         {0.55, 0.403703, 0.731111, 0, 0, 0},
 
  494         {0.02, 0.499719, -0.0721341, 0.862947, 0, 0},
 
  495         {-0.06, 0.835775, -0.156481, 0.0373835, 0.521534, 0},
 
  496         {-0.19, -0.301141, 0.145082, 0.144564, -0.0238067, 0.911427},
 
  501         {-0.41, 0.912086, 0, 0, 0, 0},
 
  502         {0.56, 0.339442, 0.755764, 0, 0, 0},
 
  503         {0.02, 0.436582, -0.0256617, 0.899076, 0, 0},
 
  504         {-0.07, 0.856608, -0.12116, 0.0715303, 0.491453, 0},
 
  505         {-0.2, -0.331109, 0.15136, 0.036082, 0.031313, 0.908391},
 
  510         {-0.4, 0.916515, 0, 0, 0, 0},
 
  511         {0.56, 0.386246, 0.732949, 0, 0, 0},
 
  512         {0.04, 0.573913, -0.0601289, 0.815726, 0, 0},
 
  513         {-0.11, 0.813953, -0.0720183, 0.0281118, 0.565158, 0},
 
  514         {-0.19, -0.432071, 0.236423, -0.0247788, -0.0557206, 0.847113},
 
  519         {-0.46, 0.887919, 0, 0, 0, 0},
 
  520         {0.58, 0.469412, 0.665772, 0, 0, 0},
 
  521         {0.01, 0.309262, -0.286842, 0.90663, 0, 0},
 
  522         {-0.05, 0.762457, -0.268721, -0.0467443, 0.584605, 0},
 
  523         {-0.23, -0.580909, 0.399665, 0.0403629, 0.326208, 0.584698},
 
  528         {-0.3, 0.953939, 0, 0, 0, 0},
 
  529         {0.47, 0.81871, 0.329868, 0, 0, 0},
 
  530         {0.06, 0.0712834, -0.595875, 0.797654, 0, 0},
 
  531         {-0.1, 0.408831, -0.0233859, 0.0412736, 0.905873, 0},
 
  532         {-0.13, -0.407783, 0.439436, -0.0768289, -0.212875, 0.756631},
 
 
  551         {-0.36, 0.932952, 0, 0, 0, 0},
 
  552         {0.45, 0.527358, 0.72069, 0, 0, 0},
 
  553         {0.02, 0.350715, 0.355282, 0.866241, 0, 0},
 
  554         {-0.07, 0.562515, 0.478504, 0.0162932, 0.670406, 0},
 
  555         {-0.06, 0.0411597, 0.270982, 0.0121094, -0.159927, 0.946336},
 
  560         {-0.38, 0.924986, 0, 0, 0, 0},
 
  561         {0.52, 0.473088, 0.711188, 0, 0, 0},
 
  562         {0, 0.367573, -0.0617198, 0.927944, 0, 0},
 
  563         {-0.04, 0.68628, 0.149228, 0.115257, 0.701332, 0},
 
  564         {-0.16, -0.0441088, 0.118207, 0.251641, -0.0752458, 0.943131},
 
  569         {-0.42, 0.907524, 0, 0, 0, 0},
 
  570         {0.54, 0.48131, 0.690464, 0, 0, 0},
 
  571         {0, 0.363627, -0.137613, 0.921324, 0, 0},
 
  572         {-0.04, 0.686704, 0.117433, 0.104693, 0.708581, 0},
 
  573         {-0.19, -0.0438556, 0.0922685, 0.269877, -0.136292, 0.928469},
 
  578         {-0.36, 0.932952, 0, 0, 0, 0},
 
  579         {0.53, 0.483197, 0.696865, 0, 0, 0},
 
  580         {0.01, 0.464761, -0.0285153, 0.88492, 0, 0},
 
  581         {-0.05, 0.763169, 0.140255, 0.0562856, 0.626286, 0},
 
  582         {-0.16, -0.126051, 0.0942905, 0.195354, -0.217188, 0.92967},
 
  587         {-0.39, 0.920815, 0, 0, 0, 0},
 
  588         {0.55, 0.406705, 0.729446, 0, 0, 0},
 
  589         {0.01, 0.503793, -0.123923, 0.854831, 0, 0},
 
  590         {-0.06, 0.821664, -0.207246, 0.0245302, 0.526988, 0},
 
  591         {-0.19, -0.254231, 0.10679, 0.190931, -0.0665276, 0.920316},
 
  596         {-0.42, 0.907524, 0, 0, 0, 0},
 
  597         {0.56, 0.391395, 0.730213, 0, 0, 0},
 
  598         {0.02, 0.427978, -0.0393147, 0.902712, 0, 0},
 
  599         {-0.06, 0.820694, -0.119986, 0.105509, 0.545281, 0},
 
  600         {-0.2, -0.279882, 0.180145, 0.0563477, -0.0121631, 0.919723},
 
  605         {-0.36, 0.932952, 0, 0, 0, 0},
 
  606         {0.54, 0.519212, 0.662434, 0, 0, 0},
 
  607         {0.04, 0.412025, -0.0234416, 0.909992, 0, 0},
 
  608         {-0.09, 0.758452, -0.0682296, 0.0214276, 0.64151, 0},
 
  609         {-0.17, -0.387158, 0.306169, -0.0291255, -0.109344, 0.845378},
 
  614         {-0.44, 0.897998, 0, 0, 0, 0},
 
  615         {0.57, 0.43519, 0.696928, 0, 0, 0},
 
  616         {0.01, 0.316705, -0.248988, 0.915207, 0, 0},
 
  617         {-0.06, 0.805793, -0.296262, -0.0419182, 0.507514, 0},
 
  618         {-0.22, -0.497551, 0.289742, 0.0785823, 0.328773, 0.711214},
 
  623         {-0.27, 0.96286, 0, 0, 0, 0},
 
  624         {0.46, 0.741748, 0.488067, 0, 0, 0},
 
  625         {0.04, 0.0735309, -0.374828, 0.923308, 0, 0},
 
  626         {-0.08, 0.517624, 0.128779, 0.0795063, 0.838308, 0},
 
  627         {-0.11, -0.321646, 0.0802763, -0.131981, -0.193429, 0.907285},
 
 
  669         {10, {-7.12, 0.8, -3.06, 0.48, 0.94, 0.7,  0.82, 0.03, -2.52, 0.5, 4.4,
 
  670               3.3,   2.5, 24.4,  3.8,  3.0,  20.0, 3.9,  0.0,  11.0,  7.0, 3.0}},
 
  671         {20, {-7.28, 0.67, -2.68, 0.36, 0.87, 0.66, 0.5, 0.09, -2.29, 0.53, 9.0,
 
  672               6.6,   2.5,  23.6,  4.7,  3.0,  20.0, 3.9, 0.0,  11.0,  7.0,  3.0}},
 
  673         {30, {-7.45, 0.68, -2.51, 0.38, 0.92, 0.68, 0.82, 0.05, -2.19, 0.58, 9.3,
 
  674               6.1,   2.5,  23.2,  4.6,  3.0,  20.0, 3.9,  0.0,  11.0,  7.0,  3.0}},
 
  675         {40, {-7.73, 0.66, -2.4, 0.32, 0.79, 0.64, 1.23, 0.03, -2.24, 0.51, 7.9,
 
  676               4.0,   2.5,  22.6, 4.9,  3.0,  20.0, 3.9,  0.0,  11.0,  7.0,  3.0}},
 
  677         {50, {-7.91, 0.62, -2.31, 0.33, 0.72, 0.63, 1.43, 0.06, -2.3, 0.46, 7.4,
 
  678               3.0,   2.5,  21.8,  5.7,  3.0,  20.0, 3.9,  0.0,  11.0, 7.0,  3.0}},
 
  679         {60, {-8.14, 0.51, -2.2, 0.39, 0.6, 0.54, 1.56, 0.05, -2.48, 0.35, 7.0,
 
  680               2.6,   2.5,  20.5, 6.9,  3.0, 20.0, 3.9,  0.0,  11.0,  7.0,  3.0}},
 
  681         {70, {-8.23, 0.45, -2.0, 0.4, 0.55, 0.52, 1.66, 0.05, -2.64, 0.31, 6.9,
 
  682               2.2,   2.5,  19.3, 8.1, 3.0,  20.0, 3.9,  0.0,  11.0,  7.0,  3.0}},
 
  683         {80, {-8.28, 0.31, -1.64, 0.32, 0.71, 0.53, 1.73, 0.02, -2.68, 0.39, 6.5,
 
  684               2.1,   2.5,  17.4,  10.3, 3.0,  20.0, 3.9,  0.0,  11.0,  7.0,  3.0}},
 
  685         {90, {-8.36, 0.08, -0.63, 0.53, 0.81, 0.62, 1.79, 0.01, -2.61, 0.28, 6.8,
 
  686               1.9,   2.5,  12.3,  15.2, 3.0,  20.0, 3.9,  0.0,  11.0,  7.0,  3.0}},
 
  690         {10, {-7.43, 0.9, -3.43, 0.54, 0.65, 0.82, 0.82, 0.05, -2.75, 0.55, 6.1,
 
  691               2.6,   2.5, 24.7,  2.1,  3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  692         {20, {-7.62, 0.78, -3.06, 0.41, 0.53, 0.78, 0.47, 0.11, -2.64, 0.64, 13.7,
 
  693               6.8,   2.5,  24.4,  2.8,  3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  694         {30, {-7.76, 0.8, -2.91, 0.42, 0.6, 0.83, 0.8, 0.05, -2.49, 0.69, 12.9,
 
  695               6.0,   2.5, 24.4,  2.7,  3.0, 20.0, 1.6, 0.0,  11.0,  7.0,  3.0}},
 
  696         {40, {-8.02, 0.72, -2.81, 0.34, 0.43, 0.78, 1.23, 0.04, -2.51, 0.57, 10.3,
 
  697               3.3,   2.5,  24.2,  2.7,  3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  698         {50, {-8.13, 0.61, -2.74, 0.34, 0.36, 0.77, 1.42, 0.1, -2.54, 0.5, 9.2,
 
  699               2.2,   2.5,  23.9,  3.1,  3.0,  20.0, 1.6,  0.0, 11.0,  7.0, 3.0}},
 
  700         {60, {-8.3, 0.47, -2.72, 0.7, 0.16, 0.84, 1.56, 0.06, -2.71, 0.37, 8.4,
 
  701               1.9,  2.5,  23.3,  3.9, 3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  702         {70, {-8.34, 0.39, -2.46, 0.4, 0.18, 0.64, 1.65, 0.07, -2.85, 0.31, 8.0,
 
  703               1.5,   2.5,  22.6,  4.8, 3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  704         {80, {-8.39, 0.26, -2.3, 0.78, 0.24, 0.81, 1.73, 0.02, -3.01, 0.45, 7.4,
 
  705               1.6,   2.5,  21.2, 6.8,  3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  706         {90, {-8.45, 0.01, -1.11, 0.51, 0.36, 0.65, 1.79, 0.01, -3.08, 0.27, 7.6,
 
  707               1.3,   2.5,  17.6,  12.7, 3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
 
  720         {10, {-6.84, 0.82, -2.08, 0.87, 1.0, 1.6,  1.0, 0.63, -2.08, 0.58, 0.0,
 
  721               0.0,   2.3,  23.8,  4.4,  4.0, 20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
 
  722         {20, {-6.81, 0.61, -1.68, 0.73, 1.44, 0.87, 0.94, 0.65, -1.66, 0.5, 0.0,
 
  723               0.0,   2.3,  21.9,  6.3,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0, 3.0}},
 
  724         {30, {-6.94, 0.49, -1.46, 0.53, 1.54, 0.64, 1.15, 0.42, -1.48, 0.4, 0.0,
 
  725               0.0,   2.3,  19.7,  8.1,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0, 3.0}},
 
  726         {40, {-7.14, 0.49, -1.43, 0.5, 1.53, 0.56, 1.35, 0.28, -1.46, 0.37, 0.0,
 
  727               0.0,   2.3,  18.1,  9.3, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  728         {50, {-7.34, 0.51, -1.44, 0.58, 1.48, 0.54, 1.44, 0.25, -1.53, 0.47, 0.0,
 
  729               0.0,   2.3,  16.3,  11.5, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  730         {60, {-7.53, 0.47, -1.33, 0.49, 1.39, 0.68, 1.56, 0.16, -1.61, 0.43, 0.0,
 
  731               0.0,   2.3,  14.0,  13.3, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  732         {70, {-7.67, 0.44, -1.31, 0.65, 1.42, 0.55, 1.64, 0.18, -1.77, 0.5, 0.0,
 
  733               0.0,   2.3,  12.1,  14.9, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0, 3.0}},
 
  734         {80, {-7.82, 0.42, -1.11, 0.69, 1.38, 0.6,  1.7, 0.09, -1.9, 0.42, 0.0,
 
  735               0.0,   2.3,  8.7,   17.0, 4.0,  20.0, 3.9, 0.0,  15.0, 7.0,  3.0}},
 
  736         {90, {-7.84, 0.55, -0.11, 0.53, 1.23, 0.6,  1.7, 0.17, -1.99, 0.5, 0.0,
 
  737               0.0,   2.3,  6.4,   12.3, 4.0,  20.0, 3.9, 0.0,  15.0,  7.0, 3.0}},
 
  741         {10, {-6.86, 0.81, -2.12, 0.94, 1.02, 1.44, 1.01, 0.56, -2.11, 0.59, 0.0,
 
  742               0.0,   2.3,  23.7,  4.5,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  743         {20, {-6.84, 0.61, -1.74, 0.79, 1.44, 0.77, 0.96, 0.55, -1.69, 0.51, 0.0,
 
  744               0.0,   2.3,  21.8,  6.3,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  745         {30, {-7.0, 0.56, -1.56, 0.66, 1.48, 0.7,  1.13, 0.43, -1.52, 0.46, 0.0,
 
  746               0.0,  2.3,  19.6,  8.2,  4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  747         {40, {-7.21, 0.56, -1.54, 0.63, 1.46, 0.6,  1.3, 0.37, -1.51, 0.43, 0.0,
 
  748               0.0,   2.3,  18.0,  9.4,  4.0,  20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
 
  749         {50, {-7.42, 0.57, -1.45, 0.56, 1.4, 0.59, 1.4, 0.32, -1.54, 0.45, 0.0,
 
  750               0.0,   2.3,  16.3,  11.5, 4.0, 20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
 
  751         {60, {-7.86, 0.55, -1.64, 0.78, 0.97, 1.27, 1.41, 0.45, -1.84, 0.63, 0.0,
 
  752               0.0,   2.3,  15.9,  12.4, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  753         {70, {-7.76, 0.47, -1.37, 0.56, 1.33, 0.56, 1.63, 0.17, -1.86, 0.51, 0.0,
 
  754               0.0,   2.3,  12.3,  15.0, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  755         {80, {-8.07, 0.42, -1.29, 0.76, 1.12, 1.04, 1.68, 0.14, -2.16, 0.74, 0.0,
 
  756               0.0,   2.3,  10.5,  15.7, 4.0,  20.0, 3.9,  0.0,  15.0,  7.0,  3.0}},
 
  757         {90, {-7.95, 0.59, -0.41, 0.59, 1.04, 0.63, 1.7, 0.17, -2.21, 0.61, 0.0,
 
  758               0.0,   2.3,  10.5,  15.7, 4.0,  20.0, 3.9, 0.0,  15.0,  7.0,  3.0}},
 
 
  768static const std::map<std::string, std::map<int, std::array<float, 22>>> 
NTNUrbanLOS{
 
  771         {10, {-7.97, 1.0, -2.6, 0.79, 0.18, 0.74, -0.63, 2.6,  -2.54, 2.62, 31.83,
 
  772               13.84, 2.5, 8.0,  4.0,  4.0,  20.0, 3.9,   0.09, 12.55, 1.25, 3.0}},
 
  773         {20, {-8.12, 0.83, -2.48, 0.8, 0.42, 0.9,  -0.15, 3.31, -2.67, 2.96, 18.78,
 
  774               13.78, 2.5,  8.0,   4.0, 3.0,  20.0, 3.9,   0.09, 12.76, 3.23, 3.0}},
 
  775         {30, {-8.21, 0.68, -2.44, 0.91, 0.41, 1.3,  0.54, 1.1,  -2.03, 0.86, 10.49,
 
  776               10.42, 2.5,  8.0,   4.0,  3.0,  20.0, 3.9,  0.12, 14.36, 4.39, 3.0}},
 
  777         {40, {-8.31, 0.48, -2.6, 1.02, 0.18, 1.69, 0.35, 1.59, -2.28, 1.19, 7.46,
 
  778               8.01,  2.5,  8.0,  4.0,  3.0,  20.0, 3.9,  0.16, 16.42, 5.72, 3.0}},
 
  779         {50, {-8.37, 0.38, -2.71, 1.17, -0.07, 2.04, 0.27, 1.62, -2.48, 1.4,  6.52,
 
  780               8.27,  2.5,  8.0,   4.0,  3.0,   20.0, 3.9,  0.2,  17.13, 6.17, 3.0}},
 
  781         {60, {-8.39, 0.24, -2.76, 1.17, -0.43, 2.54, 0.26, 0.97, -2.56, 0.85, 5.47,
 
  782               7.26,  2.5,  8.0,   4.0,  3.0,   20.0, 3.9,  0.28, 19.01, 7.36, 3.0}},
 
  783         {70, {-8.38, 0.18, -2.78, 1.2, -0.64, 2.47, -0.12, 1.99, -2.96, 1.61, 4.54,
 
  784               5.53,  2.5,  8.0,   4.0, 3.0,   20.0, 3.9,   0.44, 19.31, 7.3,  3.0}},
 
  785         {80, {-8.35, 0.13, -2.65, 1.45, -0.91, 2.69, -0.21, 1.82, -3.08, 1.49, 4.03,
 
  786               4.49,  2.5,  8.0,   4.0,  3.0,   20.0, 3.9,   0.9,  22.39, 7.7,  3.0}},
 
  787         {90, {-8.34, 0.09, -2.27, 1.85, -0.54, 1.66, -0.07, 1.43, -3.0, 1.09, 3.68,
 
  788               3.14,  2.5,  8.0,   4.0,  3.0,   20.0, 3.9,   2.87, 27.8, 9.25, 3.0}},
 
  792         {10, {-8.52, 0.92, -3.18, 0.79, -0.4, 0.77, -0.67, 2.22, -2.61, 2.41, 40.18,
 
  793               16.99, 2.5,  8.0,   4.0,  4.0,  20.0, 1.6,   0.09, 11.8,  1.14, 3.0}},
 
  794         {20, {-8.59, 0.79, -3.05, 0.87, -0.15, 0.97, -0.34, 3.04, -2.82, 2.59, 23.62,
 
  795               18.96, 2.5,  8.0,   4.0,  3.0,   20.0, 1.6,   0.09, 11.6,  2.78, 3.0}},
 
  796         {30, {-8.51, 0.65, -2.98, 1.04, -0.18, 1.58, 0.07, 1.33, -2.48, 1.02, 12.48,
 
  797               14.23, 2.5,  8.0,   4.0,  3.0,   20.0, 1.6,  0.11, 13.05, 3.87, 3.0}},
 
  798         {40, {-8.49, 0.48, -3.11, 1.06, -0.31, 1.69, -0.08, 1.45, -2.76, 1.27, 8.56,
 
  799               11.06, 2.5,  8.0,   4.0,  3.0,   20.0, 1.6,   0.15, 14.56, 4.94, 3.0}},
 
  800         {50, {-8.48, 0.46, -3.19, 1.12, -0.58, 2.13, -0.21, 1.62, -2.93, 1.38, 7.42,
 
  801               11.21, 2.5,  8.0,   4.0,  3.0,   20.0, 1.6,   0.18, 15.35, 5.41, 3.0}},
 
  802         {60, {-8.44, 0.34, -3.25, 1.14, -0.9, 2.51, -0.25, 1.06, -3.05, 0.96, 5.97,
 
  803               9.47,  2.5,  8.0,   4.0,  3.0,  20.0, 1.6,   0.27, 16.97, 6.31, 3.0}},
 
  804         {70, {-8.4, 0.27, -3.33, 1.25, -1.16, 2.47, -0.61, 1.88, -3.45, 1.51, 4.88,
 
  805               7.24, 2.5,  8.0,   4.0,  3.0,   20.0, 1.6,   0.42, 17.96, 6.66, 3.0}},
 
  806         {80, {-8.37, 0.19, -3.22, 1.35, -1.48, 2.61, -0.79, 1.87, -3.66, 1.49, 4.22,
 
  807               5.79,  2.5,  8.0,   4.0,  3.0,   20.0, 1.6,   0.86, 20.68, 7.31, 3.0}},
 
  808         {90, {-8.35, 0.14, -2.83, 1.62, -1.14, 1.7,  -0.58, 1.19, -3.56, 0.89, 3.81,
 
  809               4.25,  2.5,  8.0,   4.0,  3.0,   20.0, 1.6,   2.55, 25.08, 9.23, 3.0}},
 
 
  819static const std::map<std::string, std::map<int, std::array<float, 22>>> 
NTNUrbanNLOS{
 
  822         {10, {-7.24, 1.26, -1.58, 0.89, 0.13, 2.99, -1.13, 2.66, -2.87, 2.76, 0.0,
 
  823               0.0,   2.3,  7.0,   3.0,  3.0,  20.0, 1.6,   0.08, 14.72, 1.57, 3.0}},
 
  824         {20, {-7.7, 0.99, -1.67, 0.89, 0.19, 3.12, 0.49, 2.03, -2.68, 2.76, 0.0,
 
  825               0.0,  2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.1,  14.62, 4.3,  3.0}},
 
  826         {30, {-7.82, 0.86, -1.84, 1.3, 0.44, 2.69, 0.95, 1.54, -2.12, 1.54, 0.0,
 
  827               0.0,   2.3,  7.0,   3.0, 3.0,  20.0, 1.6,  0.14, 16.4,  6.64, 3.0}},
 
  828         {40, {-8.04, 0.75, -2.02, 1.15, 0.48, 2.45, 1.15, 1.02, -2.27, 1.77, 0.0,
 
  829               0.0,   2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.22, 17.86, 9.21, 3.0}},
 
  830         {50, {-8.08, 0.77, -2.06, 1.23, 0.56, 2.17, 1.14, 1.61, -2.5,  2.36,  0.0,
 
  831               0.0,   2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.31, 19.74, 10.32, 3.0}},
 
  832         {60, {-8.1, 0.76, -1.99, 1.02, 0.55, 1.93, 1.13, 1.84, -2.47, 2.33, 0.0,
 
  833               0.0,  2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.49, 19.73, 10.3, 3.0}},
 
  834         {70, {-8.16, 0.73, -2.19, 1.78, 0.48, 1.72, 1.16, 1.81, -2.83, 2.84, 0.0,
 
  835               0.0,   2.3,  7.0,   3.0,  2.0,  20.0, 1.6,  0.97, 20.5,  10.2, 3.0}},
 
  836         {80, {-8.03, 0.79, -1.88, 1.55, 0.53, 1.51, 1.28, 1.35, -2.82, 2.87,  0.0,
 
  837               0.0,   2.3,  7.0,   3.0,  2.0,  20.0, 1.6,  1.52, 26.16, 12.27, 3.0}},
 
  838         {90, {-8.33, 0.7, -2.0, 1.4, 0.32, 1.2,  1.42, 0.6,  -4.55, 4.27,  0.0,
 
  839               0.0,   2.3, 7.0,  3.0, 2.0,  20.0, 1.6,  5.36, 25.83, 12.75, 3.0}},
 
  843         {10, {-7.24, 1.26, -1.58, 0.89, 0.13, 2.99, -1.13, 2.66, -2.87, 2.76, 0.0,
 
  844               0.0,   2.3,  7.0,   3.0,  3.0,  20.0, 1.6,   0.08, 14.72, 1.57, 3.0}},
 
  845         {20, {-7.7, 0.99, -1.67, 0.89, 0.19, 3.12, 0.49, 2.03, -2.68, 2.76, 0.0,
 
  846               0.0,  2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.1,  14.62, 4.3,  3.0}},
 
  847         {30, {-7.82, 0.86, -1.84, 1.3, 0.44, 2.69, 0.95, 1.54, -2.12, 1.54, 0.0,
 
  848               0.0,   2.3,  7.0,   3.0, 3.0,  20.0, 1.6,  0.14, 16.4,  6.64, 3.0}},
 
  849         {40, {-8.04, 0.75, -2.02, 1.15, 0.48, 2.45, 1.15, 1.02, -2.27, 1.77, 0.0,
 
  850               0.0,   2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.22, 17.86, 9.21, 3.0}},
 
  851         {50, {-8.08, 0.77, -2.06, 1.23, 0.56, 2.17, 1.14, 1.61, -2.5,  2.36,  0.0,
 
  852               0.0,   2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.31, 19.74, 10.32, 3.0}},
 
  853         {60, {-8.1, 0.76, -1.99, 1.02, 0.55, 1.93, 1.13, 1.84, -2.47, 2.33, 0.0,
 
  854               0.0,  2.3,  7.0,   3.0,  3.0,  20.0, 1.6,  0.49, 19.73, 10.3, 3.0}},
 
  855         {70, {-8.16, 0.73, -2.19, 1.78, 0.48, 1.72, 1.16, 1.81, -2.83, 2.84, 0.0,
 
  856               0.0,   2.3,  7.0,   3.0,  2.0,  20.0, 1.6,  0.97, 20.5,  10.2, 3.0}},
 
  857         {80, {-8.03, 0.79, -1.88, 1.55, 0.53, 1.51, 1.28, 1.35, -2.82, 2.87,  0.0,
 
  858               0.0,   2.3,  7.0,   3.0,  2.0,  20.0, 1.6,  1.52, 26.16, 12.27, 3.0}},
 
  859         {90, {-8.33, 0.7, -2.0, 1.4, 0.32, 1.2,  1.42, 0.6,  -4.55, 4.27,  0.0,
 
  860               0.0,   2.3, 7.0,  3.0, 2.0,  20.0, 1.6,  5.36, 25.83, 12.75, 3.0}},
 
 
  870static const std::map<std::string, std::map<int, std::array<float, 22>>> 
NTNSuburbanLOS{
 
  873         {10, {-8.16, 0.99, -3.57, 1.62, 0.05, 1.84, -1.78, 0.62, -1.06, 0.96, 11.4,
 
  874               6.26,  2.2,  21.3,  7.6,  3.0,  20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  875         {20, {-8.56, 0.96, -3.8, 1.74, -0.38, 1.94, -1.84, 0.81, -1.21, 0.95, 19.45,
 
  876               10.32, 3.36, 21.0, 8.9,  3.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  877         {30, {-8.72, 0.79, -3.77, 1.72, -0.56, 1.75, -1.67, 0.57, -1.28, 0.49, 20.8,
 
  878               16.34, 3.5,  21.2,  8.5,  3.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  879         {40, {-8.71, 0.81, -3.57, 1.6, -0.59, 1.82, -1.59, 0.86, -1.32, 0.79, 21.2,
 
  880               15.63, 2.81, 21.1,  8.4, 3.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  881         {50, {-8.72, 1.12, -3.42, 1.49, -0.58, 1.87, -1.55, 1.05, -1.39, 0.97, 21.6,
 
  882               14.22, 2.39, 20.7,  9.2,  3.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  883         {60, {-8.66, 1.23, -3.27, 1.43, -0.55, 1.92, -1.51, 1.23, -1.36, 1.17, 19.75,
 
  884               14.19, 2.73, 20.6,  9.8,  3.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  885         {70, {-8.38, 0.55, -3.08, 1.36, -0.28, 1.16, -1.27, 0.54, -1.08, 0.62, 12.0,
 
  886               5.7,   2.07, 20.3,  10.8, 2.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  887         {80, {-8.34, 0.63, -2.75, 1.26, -0.17, 1.09, -1.28, 0.67, -1.31, 0.76, 12.85,
 
  888               9.91,  2.04, 19.8,  12.2, 2.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  889         {90, {-8.34, 0.63, -2.75, 1.26, -0.17, 1.09, -1.28, 0.67, -1.31, 0.76, 12.85,
 
  890               9.91,  2.04, 19.1,  13.0, 2.0,   20.0, 1.6,   0.0,  11.0,  7.0,  3.0}},
 
  894         {10, {-8.07, 0.46, -3.55, 0.48, 0.89, 0.67, 0.63, 0.35, -3.37, 0.28, 8.9,
 
  895               4.4,   2.5,  23.2,  5.0,  3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  896         {20, {-8.61, 0.45, -3.69, 0.41, 0.31, 0.78, 0.76, 0.3, -3.28, 0.27, 14.0,
 
  897               4.6,   2.5,  23.6,  4.5,  3.0,  20.0, 1.6,  0.0, 11.0,  7.0,  3.0}},
 
  898         {30, {-8.72, 0.28, -3.59, 0.41, 0.02, 0.75, 1.11, 0.28, -3.04, 0.26, 11.3,
 
  899               3.7,   2.5,  23.5,  4.7,  3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  900         {40, {-8.63, 0.17, -3.38, 0.35, -0.1, 0.65, 1.37, 0.23, -2.88, 0.21, 9.0,
 
  901               3.5,   2.5,  23.4,  5.2,  3.0,  20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  902         {50, {-8.54, 0.14, -3.23, 0.35, -0.19, 0.55, 1.53, 0.23, -2.83, 0.18, 7.5,
 
  903               3.0,   2.5,  23.2,  5.7,  3.0,   20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  904         {60, {-8.48, 0.15, -3.19, 0.43, -0.54, 0.96, 1.65, 0.17, -2.86, 0.17, 6.6,
 
  905               2.6,   2.5,  23.3,  5.9,  3.0,   20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  906         {70, {-8.42, 0.09, -2.83, 0.33, -0.24, 0.43, 1.74, 0.11, -2.95, 0.1, 5.9,
 
  907               1.7,   2.5,  23.4,  6.2,  2.0,   20.0, 1.6,  0.0,  11.0,  7.0, 3.0}},
 
  908         {80, {-8.39, 0.05, -2.66, 0.44, -0.52, 0.93, 1.82, 0.05, -3.21, 0.07, 5.5,
 
  909               0.7,   2.5,  23.2,  7.0,  2.0,   20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
  910         {90, {-8.37, 0.02, -1.22, 0.31, -0.15, 0.44, 1.87, 0.02, -3.49, 0.24, 5.4,
 
  911               0.3,   2.5,  23.1,  7.6,  2.0,   20.0, 1.6,  0.0,  11.0,  7.0,  3.0}},
 
 
  921static const std::map<std::string, std::map<int, std::array<float, 22>>> 
NTNSuburbanNLOS{
 
  924         {10, {-7.43, 0.5, -2.89, 0.41, 1.49, 0.4,  0.81, 0.36, -3.09, 0.32, 0.0,
 
  925               0.0,   2.3, 22.5,  5.0,  4.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  926         {20, {-7.63, 0.61, -2.76, 0.41, 1.24, 0.82, 1.06, 0.41, -2.93, 0.47, 0.0,
 
  927               0.0,   2.3,  19.4,  8.5,  4.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  928         {30, {-7.86, 0.56, -2.64, 0.41, 1.06, 0.71, 1.12, 0.4, -2.91, 0.46, 0.0,
 
  929               0.0,   2.3,  15.5,  10.0, 4.0,  20.0, 1.6,  0.0, 15.0,  7.0,  3.0}},
 
  930         {40, {-7.96, 0.58, -2.41, 0.52, 0.91, 0.55, 1.14, 0.39, -2.78, 0.54, 0.0,
 
  931               0.0,   2.3,  13.9,  10.6, 4.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  932         {50, {-7.98, 0.59, -2.42, 0.7,  0.98, 0.58, 1.29, 0.35, -2.7, 0.45, 0.0,
 
  933               0.0,   2.3,  11.7,  10.0, 4.0,  20.0, 1.6,  0.0,  15.0, 7.0,  3.0}},
 
  934         {60, {-8.45, 0.47, -2.53, 0.5, 0.49, 1.37, 1.38, 0.36, -3.03, 0.36, 0.0,
 
  935               0.0,   2.3,  9.8,   9.1, 3.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  936         {70, {-8.21, 0.36, -2.35, 0.58, 0.73, 0.49, 1.36, 0.29, -2.9, 0.42, 0.0,
 
  937               0.0,   2.3,  10.3,  9.1,  3.0,  20.0, 1.6,  0.0,  15.0, 7.0,  3.0}},
 
  938         {80, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
 
  939               0.0,   2.3,  15.6,  9.1,  3.0,   20.0, 1.6,  0.0, 15.0, 7.0, 3.0}},
 
  940         {90, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
 
  941               0.0,   2.3,  15.6,  9.1,  3.0,   20.0, 1.6,  0.0, 15.0, 7.0, 3.0}},
 
  945         {10, {-7.43, 0.5, -2.89, 0.41, 1.49, 0.4,  0.81, 0.36, -3.09, 0.32, 0.0,
 
  946               0.0,   2.3, 22.5,  5.0,  4.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  947         {20, {-7.63, 0.61, -2.76, 0.41, 1.24, 0.82, 1.06, 0.41, -2.93, 0.47, 0.0,
 
  948               0.0,   2.3,  19.4,  8.5,  4.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  949         {30, {-7.86, 0.56, -2.64, 0.41, 1.06, 0.71, 1.12, 0.4, -2.91, 0.46, 0.0,
 
  950               0.0,   2.3,  15.5,  10.0, 4.0,  20.0, 1.6,  0.0, 15.0,  7.0,  3.0}},
 
  951         {40, {-7.96, 0.58, -2.41, 0.52, 0.91, 0.55, 1.14, 0.39, -2.78, 0.54, 0.0,
 
  952               0.0,   2.3,  13.9,  10.6, 4.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  953         {50, {-7.98, 0.59, -2.42, 0.7,  0.98, 0.58, 1.29, 0.35, -2.7, 0.45, 0.0,
 
  954               0.0,   2.3,  11.7,  10.0, 4.0,  20.0, 1.6,  0.0,  15.0, 7.0,  3.0}},
 
  955         {60, {-8.45, 0.47, -2.53, 0.5, 0.49, 1.37, 1.38, 0.36, -3.03, 0.36, 0.0,
 
  956               0.0,   2.3,  9.8,   9.1, 3.0,  20.0, 1.6,  0.0,  15.0,  7.0,  3.0}},
 
  957         {70, {-8.21, 0.36, -2.35, 0.58, 0.73, 0.49, 1.36, 0.29, -2.9, 0.42, 0.0,
 
  958               0.0,   2.3,  10.3,  9.1,  3.0,  20.0, 1.6,  0.0,  15.0, 7.0,  3.0}},
 
  959         {80, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
 
  960               0.0,   2.3,  15.6,  9.1,  3.0,   20.0, 1.6,  0.0, 15.0, 7.0, 3.0}},
 
  961         {90, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
 
  962               0.0,   2.3,  15.6,  9.1,  3.0,   20.0, 1.6,  0.0, 15.0, 7.0, 3.0}},
 
 
  972static const std::map<std::string, std::map<int, std::array<float, 22>>> 
NTNRuralLOS{
 
  975         {10, {-9.55, 0.66, -3.42, 0.89, -9.45, 7.83, -4.2, 6.3,  -6.03, 5.19, 24.72,
 
  976               5.07,  3.8,  12.0,  4.0,  2.0,   20.0, 0.0,  0.39, 10.81, 1.94, 3.0}},
 
  977         {20, {-8.68, 0.44, -3.0, 0.63, -4.45, 6.86, -2.31, 5.04, -4.31, 4.18, 12.31,
 
  978               5.75,  3.8,  12.0, 4.0,  2.0,   20.0, 0.0,   0.31, 8.09,  1.83, 3.0}},
 
  979         {30, {-8.46, 0.28, -2.86, 0.52, -2.39, 5.14, -0.28, 0.81, -2.57, 0.61, 8.05,
 
  980               5.46,  3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   0.29, 13.7,  2.28, 3.0}},
 
  981         {40, {-8.36, 0.19, -2.78, 0.45, -1.28, 3.44, -0.38, 1.16, -2.59, 0.79, 6.21,
 
  982               5.23,  3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   0.37, 20.05, 2.93, 3.0}},
 
  983         {50, {-8.29, 0.14, -2.7, 0.42, -0.99, 2.59, -0.38, 0.82, -2.59, 0.65, 5.04,
 
  984               3.95,  3.8,  12.0, 4.0,  2.0,   20.0, 0.0,   0.61, 24.51, 2.84, 3.0}},
 
  985         {60, {-8.26, 0.1, -2.66, 0.41, -1.05, 2.42, -0.46, 0.67, -2.65, 0.52, 4.42,
 
  986               3.75,  3.8, 12.0,  4.0,  2.0,   20.0, 0.0,   0.9,  26.35, 3.17, 3.0}},
 
  987         {70, {-8.22, 0.1, -2.53, 0.42, -0.9, 1.78, -0.49, 1.0,  -2.69, 0.78, 3.92,
 
  988               2.56,  3.8, 12.0,  4.0,  2.0,  20.0, 0.0,   1.43, 31.84, 3.88, 3.0}},
 
  989         {80, {-8.2, 0.05, -2.21, 0.5, -0.89, 1.65, -0.53, 1.18, -2.65, 1.01, 3.65,
 
  990               1.77, 3.8,  12.0,  4.0, 2.0,   20.0, 0.0,   2.87, 36.62, 4.17, 3.0}},
 
  991         {90, {-8.19, 0.06, -1.78, 0.91, -0.81, 1.26, -0.46, 0.91, -2.65, 0.71, 3.59,
 
  992               1.77,  3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   5.48, 36.77, 4.29, 3.0}},
 
  996         {10, {-9.68, 0.46, -4.03, 0.91, -9.74, 7.52, -5.85, 6.51, -7.45, 5.3,  25.43,
 
  997               7.04,  3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   0.36, 4.63,  0.75, 3.0}},
 
  998         {20, {-8.86, 0.29, -3.55, 0.7, -4.88, 6.67, -3.27, 5.36, -5.25, 4.42, 12.72,
 
  999               7.47,  3.8,  12.0,  4.0, 2.0,   20.0, 0.0,   0.3,  6.83,  1.25, 3.0}},
 
 1000         {30, {-8.59, 0.18, -3.45, 0.55, -2.6, 4.63, -0.88, 0.93, -3.16, 0.68, 8.4,
 
 1001               7.18,  3.8,  12.0,  4.0,  2.0,  20.0, 0.0,   0.25, 12.91, 1.93, 3.0}},
 
 1002         {40, {-8.46, 0.19, -3.38, 0.52, -1.92, 3.45, -0.93, 0.96, -3.15, 0.73, 6.52,
 
 1003               6.88,  3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   0.35, 18.9,  2.37, 3.0}},
 
 1004         {50, {-8.36, 0.14, -3.33, 0.46, -1.56, 2.44, -0.99, 0.97, -3.2,  0.77, 5.24,
 
 1005               5.28,  3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   0.53, 22.44, 2.66, 3.0}},
 
 1006         {60, {-8.3, 0.15, -3.29, 0.43, -1.66, 2.38, -1.04, 0.83, -3.27, 0.61, 4.57,
 
 1007               4.92, 3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   0.88, 25.69, 3.23, 3.0}},
 
 1008         {70, {-8.26, 0.13, -3.24, 0.46, -1.59, 1.67, -1.17, 1.01, -3.42, 0.74, 4.02,
 
 1009               3.4,   3.8,  12.0,  4.0,  2.0,   20.0, 0.0,   1.39, 27.95, 3.71, 3.0}},
 
 1010         {80, {-8.22, 0.03, -2.9, 0.44, -1.58, 1.44, -1.19, 1.01, -3.36, 0.79, 3.7,
 
 1011               2.22,  3.8,  12.0, 4.0,  2.0,   20.0, 0.0,   2.7,  31.45, 4.17, 3.0}},
 
 1012         {90, {-8.21, 0.07, -2.5, 0.82, -1.51, 1.13, -1.13, 0.85, -3.35, 0.65, 3.62,
 
 1013               2.28,  3.8,  12.0, 4.0,  2.0,   20.0, 0.0,   4.97, 28.01, 4.14, 3.0}},
 
 
 1023static const std::map<std::string, std::map<int, std::array<float, 22>>> 
NTNRuralNLOS{
 
 1026         {10, {-9.01, 1.59, -2.9, 1.34, -3.33, 6.22, -0.88, 3.26, -4.92, 3.96, 0.0,
 
 1027               0.0,   1.7,  7.0,  3.0,  3.0,   20.0, 0.0,   0.03, 18.16, 2.32, 3.0}},
 
 1028         {20, {-8.37, 0.95, -2.5, 1.18, -0.74, 4.22, -0.07, 3.29, -4.06, 4.07, 0.0,
 
 1029               0.0,   1.7,  7.0,  3.0,  3.0,   20.0, 0.0,   0.05, 26.82, 7.34, 3.0}},
 
 1030         {30, {-8.05, 0.92, -2.12, 1.08, 0.08, 3.02, 0.75, 1.92, -2.33, 1.7,  0.0,
 
 1031               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  0.07, 21.99, 8.28, 3.0}},
 
 1032         {40, {-7.92, 0.92, -1.99, 1.06, 0.32, 2.45, 0.72, 1.92, -2.24, 2.01, 0.0,
 
 1033               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  0.1,  22.86, 8.76, 3.0}},
 
 1034         {50, {-7.92, 0.87, -1.9, 1.05, 0.53, 1.63, 0.95, 1.45, -2.24, 2.0,  0.0,
 
 1035               0.0,   1.7,  7.0,  3.0,  2.0,  20.0, 0.0,  0.15, 25.93, 9.68, 3.0}},
 
 1036         {60, {-7.96, 0.87, -1.85, 1.06, 0.33, 2.08, 0.97, 1.62, -2.22, 1.82, 0.0,
 
 1037               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  0.22, 27.79, 9.94, 3.0}},
 
 1038         {70, {-7.91, 0.82, -1.69, 1.14, 0.55, 1.58, 1.1, 1.43, -2.19, 1.66, 0.0,
 
 1039               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0, 0.5,  28.5,  8.9,  3.0}},
 
 1040         {80, {-7.79, 0.86, -1.46, 1.16, 0.45, 2.01, 0.97, 1.88, -2.41, 2.58,  0.0,
 
 1041               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  1.04, 37.53, 13.74, 3.0}},
 
 1042         {90, {-7.74, 0.81, -1.32, 1.3, 0.4, 2.19, 1.35, 0.62, -2.45, 2.52,  0.0,
 
 1043               0.0,   1.7,  7.0,   3.0, 2.0, 20.0, 0.0,  2.11, 29.23, 12.16, 3.0}},
 
 1047         {10, {-9.13, 1.91, -2.9, 1.32, -3.4, 6.28, -1.19, 3.81, -5.47, 4.39, 0.0,
 
 1048               0.0,   1.7,  7.0,  3.0,  3.0,  20.0, 0.0,   0.03, 18.21, 2.13, 3.0}},
 
 1049         {20, {-8.39, 0.94, -2.53, 1.18, -0.51, 3.75, -0.11, 3.33, -4.06, 4.04, 0.0,
 
 1050               0.0,   1.7,  7.0,   3.0,  3.0,   20.0, 0.0,   0.05, 24.08, 6.52, 3.0}},
 
 1051         {30, {-8.1, 0.92, -2.16, 1.08, 0.06, 2.95, 0.72, 1.93, -2.32, 1.54, 0.0,
 
 1052               0.0,  1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  0.07, 22.06, 7.72, 3.0}},
 
 1053         {40, {-7.96, 0.94, -2.04, 1.09, 0.2, 2.65, 0.69, 1.91, -2.19, 1.73, 0.0,
 
 1054               0.0,   1.7,  7.0,   3.0,  2.0, 20.0, 0.0,  0.09, 21.4,  8.45, 3.0}},
 
 1055         {50, {-7.99, 0.89, -1.99, 1.08, 0.4, 1.85, 0.84, 1.7,  -2.16, 1.5,  0.0,
 
 1056               0.0,   1.7,  7.0,   3.0,  2.0, 20.0, 0.0,  0.16, 24.26, 8.92, 3.0}},
 
 1057         {60, {-8.05, 0.87, -1.95, 1.06, 0.32, 1.83, 0.99, 1.27, -2.24, 1.64, 0.0,
 
 1058               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  0.22, 24.15, 8.76, 3.0}},
 
 1059         {70, {-8.01, 0.82, -1.81, 1.17, 0.46, 1.57, 0.95, 1.86, -2.29, 1.66, 0.0,
 
 1060               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  0.51, 25.99, 9.0,  3.0}},
 
 1061         {80, {-8.05, 1.65, -1.56, 1.2, 0.33, 1.99, 0.92, 1.84, -2.65, 2.86, 0.0,
 
 1062               0.0,   1.7,  7.0,   3.0, 2.0,  20.0, 0.0,  0.89, 36.07, 13.6, 3.0}},
 
 1063         {90, {-7.91, 0.76, -1.53, 1.27, 0.24, 2.18, 1.29, 0.59, -2.23, 1.12,  0.0,
 
 1064               0.0,   1.7,  7.0,   3.0,  2.0,  20.0, 0.0,  1.68, 24.51, 10.56, 3.0}},
 
 
 1226    double hUT = std::min(aMob->GetPosition().z, bMob->GetPosition().z);
 
 1227    double hBS = std::max(aMob->GetPosition().z, bMob->GetPosition().z);
 
 1229    double distance2D = sqrt(pow(aMob->GetPosition().x - bMob->GetPosition().x, 2) +
 
 1230                             pow(aMob->GetPosition().y - bMob->GetPosition().y, 2));
 
 1239    bool los = channelCondition->IsLos();
 
 1240    bool o2i = channelCondition->IsO2i();
 
 1249            table3gpp->m_numOfCluster = 11;
 
 1250            table3gpp->m_raysPerCluster = 20;
 
 1251            table3gpp->m_uLgDS = -7.49;
 
 1252            table3gpp->m_sigLgDS = 0.55;
 
 1253            table3gpp->m_uLgASD = 0.90;
 
 1254            table3gpp->m_sigLgASD = 0.38;
 
 1255            table3gpp->m_uLgASA = 1.52;
 
 1256            table3gpp->m_sigLgASA = 0.24;
 
 1257            table3gpp->m_uLgZSA = 0.47;
 
 1258            table3gpp->m_sigLgZSA = 0.40;
 
 1259            table3gpp->m_uLgZSD = 0.34;
 
 1260            table3gpp->m_sigLgZSD =
 
 1261                std::max(-1.0, -0.17 * (distance2D / 1000.0) - 0.01 * (hUT - 1.5) + 0.22);
 
 1262            table3gpp->m_offsetZOD = 0;
 
 1263            table3gpp->m_cDS = 3.91e-9;
 
 1264            table3gpp->m_cASD = 2;
 
 1265            table3gpp->m_cASA = 3;
 
 1266            table3gpp->m_cZSA = 3;
 
 1267            table3gpp->m_uK = 7;
 
 1268            table3gpp->m_sigK = 4;
 
 1269            table3gpp->m_rTau = 3.8;
 
 1270            table3gpp->m_uXpr = 12;
 
 1271            table3gpp->m_sigXpr = 4;
 
 1272            table3gpp->m_perClusterShadowingStd = 3;
 
 1274            for (uint8_t row = 0; row < 7; row++)
 
 1276                for (uint8_t column = 0; column < 7; column++)
 
 1278                    table3gpp->m_sqrtC[row][column] = 
sqrtC_RMa_LOS[row][column];
 
 1282        else if (!los && !o2i)
 
 1284            table3gpp->m_numOfCluster = 10;
 
 1285            table3gpp->m_raysPerCluster = 20;
 
 1286            table3gpp->m_uLgDS = -7.43;
 
 1287            table3gpp->m_sigLgDS = 0.48;
 
 1288            table3gpp->m_uLgASD = 0.95;
 
 1289            table3gpp->m_sigLgASD = 0.45;
 
 1290            table3gpp->m_uLgASA = 1.52;
 
 1291            table3gpp->m_sigLgASA = 0.13;
 
 1292            table3gpp->m_uLgZSA = 0.58;
 
 1293            table3gpp->m_sigLgZSA = 0.37;
 
 1294            table3gpp->m_uLgZSD =
 
 1295                std::max(-1.0, -0.19 * (distance2D / 1000.0) - 0.01 * (hUT - 1.5) + 0.28);
 
 1296            table3gpp->m_sigLgZSD = 0.30;
 
 1297            table3gpp->m_offsetZOD = atan((35 - 3.5) / distance2D) - atan((35 - 1.5) / distance2D);
 
 1298            table3gpp->m_cDS = 3.91e-9;
 
 1299            table3gpp->m_cASD = 2;
 
 1300            table3gpp->m_cASA = 3;
 
 1301            table3gpp->m_cZSA = 3;
 
 1302            table3gpp->m_uK = 0;
 
 1303            table3gpp->m_sigK = 0;
 
 1304            table3gpp->m_rTau = 1.7;
 
 1305            table3gpp->m_uXpr = 7;
 
 1306            table3gpp->m_sigXpr = 3;
 
 1307            table3gpp->m_perClusterShadowingStd = 3;
 
 1309            for (uint8_t row = 0; row < 6; row++)
 
 1311                for (uint8_t column = 0; column < 6; column++)
 
 1319            table3gpp->m_numOfCluster = 10;
 
 1320            table3gpp->m_raysPerCluster = 20;
 
 1321            table3gpp->m_uLgDS = -7.47;
 
 1322            table3gpp->m_sigLgDS = 0.24;
 
 1323            table3gpp->m_uLgASD = 0.67;
 
 1324            table3gpp->m_sigLgASD = 0.18;
 
 1325            table3gpp->m_uLgASA = 1.66;
 
 1326            table3gpp->m_sigLgASA = 0.21;
 
 1327            table3gpp->m_uLgZSA = 0.93;
 
 1328            table3gpp->m_sigLgZSA = 0.22;
 
 1329            table3gpp->m_uLgZSD =
 
 1330                std::max(-1.0, -0.19 * (distance2D / 1000.0) - 0.01 * (hUT - 1.5) + 0.28);
 
 1331            table3gpp->m_sigLgZSD = 0.30;
 
 1332            table3gpp->m_offsetZOD = atan((35 - 3.5) / distance2D) - atan((35 - 1.5) / distance2D);
 
 1333            table3gpp->m_cDS = 3.91e-9;
 
 1334            table3gpp->m_cASD = 2;
 
 1335            table3gpp->m_cASA = 3;
 
 1336            table3gpp->m_cZSA = 3;
 
 1337            table3gpp->m_uK = 0;
 
 1338            table3gpp->m_sigK = 0;
 
 1339            table3gpp->m_rTau = 1.7;
 
 1340            table3gpp->m_uXpr = 7;
 
 1341            table3gpp->m_sigXpr = 3;
 
 1342            table3gpp->m_perClusterShadowingStd = 3;
 
 1344            for (uint8_t row = 0; row < 6; row++)
 
 1346                for (uint8_t column = 0; column < 6; column++)
 
 1348                    table3gpp->m_sqrtC[row][column] = 
sqrtC_RMa_O2I[row][column];
 
 1357            table3gpp->m_numOfCluster = 12;
 
 1358            table3gpp->m_raysPerCluster = 20;
 
 1359            table3gpp->m_uLgDS = -6.955 - 0.0963 * log10(fcGHz);
 
 1360            table3gpp->m_sigLgDS = 0.66;
 
 1361            table3gpp->m_uLgASD = 1.06 + 0.1114 * log10(fcGHz);
 
 1362            table3gpp->m_sigLgASD = 0.28;
 
 1363            table3gpp->m_uLgASA = 1.81;
 
 1364            table3gpp->m_sigLgASA = 0.20;
 
 1365            table3gpp->m_uLgZSA = 0.95;
 
 1366            table3gpp->m_sigLgZSA = 0.16;
 
 1367            table3gpp->m_uLgZSD =
 
 1368                std::max(-0.5, -2.1 * distance2D / 1000.0 - 0.01 * (hUT - 1.5) + 0.75);
 
 1369            table3gpp->m_sigLgZSD = 0.40;
 
 1370            table3gpp->m_offsetZOD = 0;
 
 1371            table3gpp->m_cDS = std::max(0.25, -3.4084 * log10(fcGHz) + 6.5622) * 1e-9;
 
 1372            table3gpp->m_cASD = 5;
 
 1373            table3gpp->m_cASA = 11;
 
 1374            table3gpp->m_cZSA = 7;
 
 1375            table3gpp->m_uK = 9;
 
 1376            table3gpp->m_sigK = 3.5;
 
 1377            table3gpp->m_rTau = 2.5;
 
 1378            table3gpp->m_uXpr = 8;
 
 1379            table3gpp->m_sigXpr = 4;
 
 1380            table3gpp->m_perClusterShadowingStd = 3;
 
 1382            for (uint8_t row = 0; row < 7; row++)
 
 1384                for (uint8_t column = 0; column < 7; column++)
 
 1386                    table3gpp->m_sqrtC[row][column] = 
sqrtC_UMa_LOS[row][column];
 
 1392            double uLgZSD = std::max(-0.5, -2.1 * distance2D / 1000.0 - 0.01 * (hUT - 1.5) + 0.9);
 
 1394            double afc = 0.208 * log10(fcGHz) - 0.782;
 
 1396            double cfc = -0.13 * log10(fcGHz) + 2.03;
 
 1397            double efc = 7.66 * log10(fcGHz) - 5.96;
 
 1399            double offsetZOD = efc - std::pow(10, afc * log10(std::max(bfc, distance2D)) + cfc);
 
 1403                table3gpp->m_numOfCluster = 20;
 
 1404                table3gpp->m_raysPerCluster = 20;
 
 1405                table3gpp->m_uLgDS = -6.28 - 0.204 * log10(fcGHz);
 
 1406                table3gpp->m_sigLgDS = 0.39;
 
 1407                table3gpp->m_uLgASD = 1.5 - 0.1144 * log10(fcGHz);
 
 1408                table3gpp->m_sigLgASD = 0.28;
 
 1409                table3gpp->m_uLgASA = 2.08 - 0.27 * log10(fcGHz);
 
 1410                table3gpp->m_sigLgASA = 0.11;
 
 1411                table3gpp->m_uLgZSA = -0.3236 * log10(fcGHz) + 1.512;
 
 1412                table3gpp->m_sigLgZSA = 0.16;
 
 1413                table3gpp->m_uLgZSD = 
uLgZSD;
 
 1414                table3gpp->m_sigLgZSD = 0.49;
 
 1415                table3gpp->m_offsetZOD = offsetZOD;
 
 1416                table3gpp->m_cDS = std::max(0.25, -3.4084 * log10(fcGHz) + 6.5622) * 1e-9;
 
 1417                table3gpp->m_cASD = 2;
 
 1418                table3gpp->m_cASA = 15;
 
 1419                table3gpp->m_cZSA = 7;
 
 1420                table3gpp->m_uK = 0;
 
 1421                table3gpp->m_sigK = 0;
 
 1422                table3gpp->m_rTau = 2.3;
 
 1423                table3gpp->m_uXpr = 7;
 
 1424                table3gpp->m_sigXpr = 3;
 
 1425                table3gpp->m_perClusterShadowingStd = 3;
 
 1427                for (uint8_t row = 0; row < 6; row++)
 
 1429                    for (uint8_t column = 0; column < 6; column++)
 
 1437                table3gpp->m_numOfCluster = 12;
 
 1438                table3gpp->m_raysPerCluster = 20;
 
 1439                table3gpp->m_uLgDS = -6.62;
 
 1440                table3gpp->m_sigLgDS = 0.32;
 
 1441                table3gpp->m_uLgASD = 1.25;
 
 1442                table3gpp->m_sigLgASD = 0.42;
 
 1443                table3gpp->m_uLgASA = 1.76;
 
 1444                table3gpp->m_sigLgASA = 0.16;
 
 1445                table3gpp->m_uLgZSA = 1.01;
 
 1446                table3gpp->m_sigLgZSA = 0.43;
 
 1447                table3gpp->m_uLgZSD = 
uLgZSD;
 
 1448                table3gpp->m_sigLgZSD = 0.49;
 
 1449                table3gpp->m_offsetZOD = offsetZOD;
 
 1450                table3gpp->m_cDS = 11e-9;
 
 1451                table3gpp->m_cASD = 5;
 
 1452                table3gpp->m_cASA = 8;
 
 1453                table3gpp->m_cZSA = 3;
 
 1454                table3gpp->m_uK = 0;
 
 1455                table3gpp->m_sigK = 0;
 
 1456                table3gpp->m_rTau = 2.2;
 
 1457                table3gpp->m_uXpr = 9;
 
 1458                table3gpp->m_sigXpr = 5;
 
 1459                table3gpp->m_perClusterShadowingStd = 4;
 
 1461                for (uint8_t row = 0; row < 6; row++)
 
 1463                    for (uint8_t column = 0; column < 6; column++)
 
 1465                        table3gpp->m_sqrtC[row][column] = 
sqrtC_UMa_O2I[row][column];
 
 1475            table3gpp->m_numOfCluster = 12;
 
 1476            table3gpp->m_raysPerCluster = 20;
 
 1477            table3gpp->m_uLgDS = -0.24 * log10(1 + fcGHz) - 7.14;
 
 1478            table3gpp->m_sigLgDS = 0.38;
 
 1479            table3gpp->m_uLgASD = -0.05 * log10(1 + fcGHz) + 1.21;
 
 1480            table3gpp->m_sigLgASD = 0.41;
 
 1481            table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.73;
 
 1482            table3gpp->m_sigLgASA = 0.014 * log10(1 + fcGHz) + 0.28;
 
 1483            table3gpp->m_uLgZSA = -0.1 * log10(1 + fcGHz) + 0.73;
 
 1484            table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.34;
 
 1485            table3gpp->m_uLgZSD =
 
 1486                std::max(-0.21, -14.8 * distance2D / 1000.0 + 0.01 * std::abs(hUT - hBS) + 0.83);
 
 1487            table3gpp->m_sigLgZSD = 0.35;
 
 1488            table3gpp->m_offsetZOD = 0;
 
 1489            table3gpp->m_cDS = 5e-9;
 
 1490            table3gpp->m_cASD = 3;
 
 1491            table3gpp->m_cASA = 17;
 
 1492            table3gpp->m_cZSA = 7;
 
 1493            table3gpp->m_uK = 9;
 
 1494            table3gpp->m_sigK = 5;
 
 1495            table3gpp->m_rTau = 3;
 
 1496            table3gpp->m_uXpr = 9;
 
 1497            table3gpp->m_sigXpr = 3;
 
 1498            table3gpp->m_perClusterShadowingStd = 3;
 
 1500            for (uint8_t row = 0; row < 7; row++)
 
 1502                for (uint8_t column = 0; column < 7; column++)
 
 1504                    table3gpp->m_sqrtC[row][column] = 
sqrtC_UMi_LOS[row][column];
 
 1511                std::max(-0.5, -3.1 * distance2D / 1000.0 + 0.01 * std::max(hUT - hBS, 0.0) + 0.2);
 
 1512            double offsetZOD = -1 * std::pow(10, -1.5 * log10(std::max(10.0, distance2D)) + 3.3);
 
 1515                table3gpp->m_numOfCluster = 19;
 
 1516                table3gpp->m_raysPerCluster = 20;
 
 1517                table3gpp->m_uLgDS = -0.24 * log10(1 + fcGHz) - 6.83;
 
 1518                table3gpp->m_sigLgDS = 0.16 * log10(1 + fcGHz) + 0.28;
 
 1519                table3gpp->m_uLgASD = -0.23 * log10(1 + fcGHz) + 1.53;
 
 1520                table3gpp->m_sigLgASD = 0.11 * log10(1 + fcGHz) + 0.33;
 
 1521                table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.81;
 
 1522                table3gpp->m_sigLgASA = 0.05 * log10(1 + fcGHz) + 0.3;
 
 1523                table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1524                table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1525                table3gpp->m_uLgZSD = 
uLgZSD;
 
 1526                table3gpp->m_sigLgZSD = 0.35;
 
 1527                table3gpp->m_offsetZOD = offsetZOD;
 
 1528                table3gpp->m_cDS = 11e-9;
 
 1529                table3gpp->m_cASD = 10;
 
 1530                table3gpp->m_cASA = 22;
 
 1531                table3gpp->m_cZSA = 7;
 
 1532                table3gpp->m_uK = 0;
 
 1533                table3gpp->m_sigK = 0;
 
 1534                table3gpp->m_rTau = 2.1;
 
 1535                table3gpp->m_uXpr = 8;
 
 1536                table3gpp->m_sigXpr = 3;
 
 1537                table3gpp->m_perClusterShadowingStd = 3;
 
 1539                for (uint8_t row = 0; row < 6; row++)
 
 1541                    for (uint8_t column = 0; column < 6; column++)
 
 1549                table3gpp->m_numOfCluster = 12;
 
 1550                table3gpp->m_raysPerCluster = 20;
 
 1551                table3gpp->m_uLgDS = -6.62;
 
 1552                table3gpp->m_sigLgDS = 0.32;
 
 1553                table3gpp->m_uLgASD = 1.25;
 
 1554                table3gpp->m_sigLgASD = 0.42;
 
 1555                table3gpp->m_uLgASA = 1.76;
 
 1556                table3gpp->m_sigLgASA = 0.16;
 
 1557                table3gpp->m_uLgZSA = 1.01;
 
 1558                table3gpp->m_sigLgZSA = 0.43;
 
 1559                table3gpp->m_uLgZSD = 
uLgZSD;
 
 1560                table3gpp->m_sigLgZSD = 0.35;
 
 1561                table3gpp->m_offsetZOD = offsetZOD;
 
 1562                table3gpp->m_cDS = 11e-9;
 
 1563                table3gpp->m_cASD = 5;
 
 1564                table3gpp->m_cASA = 8;
 
 1565                table3gpp->m_cZSA = 3;
 
 1566                table3gpp->m_uK = 0;
 
 1567                table3gpp->m_sigK = 0;
 
 1568                table3gpp->m_rTau = 2.2;
 
 1569                table3gpp->m_uXpr = 9;
 
 1570                table3gpp->m_sigXpr = 5;
 
 1571                table3gpp->m_perClusterShadowingStd = 4;
 
 1573                for (uint8_t row = 0; row < 6; row++)
 
 1575                    for (uint8_t column = 0; column < 6; column++)
 
 1577                        table3gpp->m_sqrtC[row][column] = 
sqrtC_UMi_O2I[row][column];
 
 1585        NS_ASSERT_MSG(!o2i, 
"The indoor scenario does out support outdoor to indoor");
 
 1588            table3gpp->m_numOfCluster = 15;
 
 1589            table3gpp->m_raysPerCluster = 20;
 
 1590            table3gpp->m_uLgDS = -0.01 * log10(1 + fcGHz) - 7.692;
 
 1591            table3gpp->m_sigLgDS = 0.18;
 
 1592            table3gpp->m_uLgASD = 1.60;
 
 1593            table3gpp->m_sigLgASD = 0.18;
 
 1594            table3gpp->m_uLgASA = -0.19 * log10(1 + fcGHz) + 1.781;
 
 1595            table3gpp->m_sigLgASA = 0.12 * log10(1 + fcGHz) + 0.119;
 
 1596            table3gpp->m_uLgZSA = -0.26 * log10(1 + fcGHz) + 1.44;
 
 1597            table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.264;
 
 1598            table3gpp->m_uLgZSD = -1.43 * log10(1 + fcGHz) + 2.228;
 
 1599            table3gpp->m_sigLgZSD = 0.13 * log10(1 + fcGHz) + 0.30;
 
 1600            table3gpp->m_offsetZOD = 0;
 
 1601            table3gpp->m_cDS = 3.91e-9;
 
 1602            table3gpp->m_cASD = 5;
 
 1603            table3gpp->m_cASA = 8;
 
 1604            table3gpp->m_cZSA = 9;
 
 1605            table3gpp->m_uK = 7;
 
 1606            table3gpp->m_sigK = 4;
 
 1607            table3gpp->m_rTau = 3.6;
 
 1608            table3gpp->m_uXpr = 11;
 
 1609            table3gpp->m_sigXpr = 4;
 
 1610            table3gpp->m_perClusterShadowingStd = 6;
 
 1612            for (uint8_t row = 0; row < 7; row++)
 
 1614                for (uint8_t column = 0; column < 7; column++)
 
 1622            table3gpp->m_numOfCluster = 19;
 
 1623            table3gpp->m_raysPerCluster = 20;
 
 1624            table3gpp->m_uLgDS = -0.28 * log10(1 + fcGHz) - 7.173;
 
 1625            table3gpp->m_sigLgDS = 0.1 * log10(1 + fcGHz) + 0.055;
 
 1626            table3gpp->m_uLgASD = 1.62;
 
 1627            table3gpp->m_sigLgASD = 0.25;
 
 1628            table3gpp->m_uLgASA = -0.11 * log10(1 + fcGHz) + 1.863;
 
 1629            table3gpp->m_sigLgASA = 0.12 * log10(1 + fcGHz) + 0.059;
 
 1630            table3gpp->m_uLgZSA = -0.15 * log10(1 + fcGHz) + 1.387;
 
 1631            table3gpp->m_sigLgZSA = -0.09 * log10(1 + fcGHz) + 0.746;
 
 1632            table3gpp->m_uLgZSD = 1.08;
 
 1633            table3gpp->m_sigLgZSD = 0.36;
 
 1634            table3gpp->m_offsetZOD = 0;
 
 1635            table3gpp->m_cDS = 3.91e-9;
 
 1636            table3gpp->m_cASD = 5;
 
 1637            table3gpp->m_cASA = 11;
 
 1638            table3gpp->m_cZSA = 9;
 
 1639            table3gpp->m_uK = 0;
 
 1640            table3gpp->m_sigK = 0;
 
 1641            table3gpp->m_rTau = 3;
 
 1642            table3gpp->m_uXpr = 10;
 
 1643            table3gpp->m_sigXpr = 4;
 
 1644            table3gpp->m_perClusterShadowingStd = 3;
 
 1646            for (uint8_t row = 0; row < 6; row++)
 
 1648                for (uint8_t column = 0; column < 6; column++)
 
 1657        if (channelCondition->IsLos())
 
 1661            table3gpp->m_numOfCluster = 12;
 
 1662            table3gpp->m_raysPerCluster = 20;
 
 1663            table3gpp->m_uLgDS = -0.2 * log10(1 + fcGHz) - 7.5;
 
 1664            table3gpp->m_sigLgDS = 0.1;
 
 1665            table3gpp->m_uLgASD = -0.1 * log10(1 + fcGHz) + 1.6;
 
 1666            table3gpp->m_sigLgASD = 0.1;
 
 1667            table3gpp->m_uLgASA = -0.1 * log10(1 + fcGHz) + 1.6;
 
 1668            table3gpp->m_sigLgASA = 0.1;
 
 1669            table3gpp->m_uLgZSA = -0.1 * log10(1 + fcGHz) + 0.73;
 
 1670            table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.34;
 
 1671            table3gpp->m_uLgZSD = -0.1 * log10(1 + fcGHz) + 0.73;
 
 1672            table3gpp->m_sigLgZSD = -0.04 * log10(1 + fcGHz) + 0.34;
 
 1673            table3gpp->m_offsetZOD = 0;
 
 1674            table3gpp->m_cDS = 5 * 1e-9;
 
 1675            table3gpp->m_cASD = 17;
 
 1676            table3gpp->m_cASA = 17;
 
 1677            table3gpp->m_cZSA = 7;
 
 1678            table3gpp->m_uK = 3.48;
 
 1679            table3gpp->m_sigK = 2;
 
 1680            table3gpp->m_rTau = 3;
 
 1681            table3gpp->m_uXpr = 9;
 
 1682            table3gpp->m_sigXpr = 3;
 
 1683            table3gpp->m_perClusterShadowingStd = 4;
 
 1685            for (uint8_t row = 0; row < 7; row++)
 
 1687                for (uint8_t column = 0; column < 7; column++)
 
 1689                    table3gpp->m_sqrtC[row][column] = 
sqrtC_UMi_LOS[row][column];
 
 1693        else if (channelCondition->IsNlos())
 
 1695            table3gpp->m_numOfCluster = 19;
 
 1696            table3gpp->m_raysPerCluster = 20;
 
 1697            table3gpp->m_uLgDS = -0.3 * log10(1 + fcGHz) - 7;
 
 1698            table3gpp->m_sigLgDS = 0.28;
 
 1699            table3gpp->m_uLgASD = -0.08 * log10(1 + fcGHz) + 1.81;
 
 1700            table3gpp->m_sigLgASD = 0.05 * log10(1 + fcGHz) + 0.3;
 
 1701            table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.81;
 
 1702            table3gpp->m_sigLgASA = 0.05 * log10(1 + fcGHz) + 0.3;
 
 1703            table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1704            table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1705            table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1706            table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1707            table3gpp->m_offsetZOD = 0;
 
 1708            table3gpp->m_cDS = 11 * 1e-9;
 
 1709            table3gpp->m_cASD = 22;
 
 1710            table3gpp->m_cASA = 22;
 
 1711            table3gpp->m_cZSA = 7;
 
 1712            table3gpp->m_uK = 0;   
 
 1713            table3gpp->m_sigK = 0; 
 
 1714            table3gpp->m_rTau = 2.1;
 
 1715            table3gpp->m_uXpr = 8;
 
 1716            table3gpp->m_sigXpr = 3;
 
 1717            table3gpp->m_perClusterShadowingStd = 4;
 
 1719            for (uint8_t row = 0; row < 6; row++)
 
 1721                for (uint8_t column = 0; column < 6; column++)
 
 1727        else if (channelCondition->IsNlosv())
 
 1729            table3gpp->m_numOfCluster = 19;
 
 1730            table3gpp->m_raysPerCluster = 20;
 
 1731            table3gpp->m_uLgDS = -0.4 * log10(1 + fcGHz) - 7;
 
 1732            table3gpp->m_sigLgDS = 0.1;
 
 1733            table3gpp->m_uLgASD = -0.1 * log10(1 + fcGHz) + 1.7;
 
 1734            table3gpp->m_sigLgASD = 0.1;
 
 1735            table3gpp->m_uLgASA = -0.1 * log10(1 + fcGHz) + 1.7;
 
 1736            table3gpp->m_sigLgASA = 0.1;
 
 1737            table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1738            table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1739            table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1740            table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1741            table3gpp->m_offsetZOD = 0;
 
 1742            table3gpp->m_cDS = 11 * 1e-9;
 
 1743            table3gpp->m_cASD = 22;
 
 1744            table3gpp->m_cASA = 22;
 
 1745            table3gpp->m_cZSA = 7;
 
 1746            table3gpp->m_uK = 0;
 
 1747            table3gpp->m_sigK = 4.5;
 
 1748            table3gpp->m_rTau = 2.1;
 
 1749            table3gpp->m_uXpr = 8;
 
 1750            table3gpp->m_sigXpr = 3;
 
 1751            table3gpp->m_perClusterShadowingStd = 4;
 
 1753            for (uint8_t row = 0; row < 6; row++)
 
 1755                for (uint8_t column = 0; column < 6; column++)
 
 1757                    table3gpp->m_sqrtC[row][column] = 
sqrtC_UMi_LOS[row][column];
 
 1768        if (channelCondition->IsLos())
 
 1770            table3gpp->m_numOfCluster = 12;
 
 1771            table3gpp->m_raysPerCluster = 20;
 
 1772            table3gpp->m_uLgDS = -8.3;
 
 1773            table3gpp->m_sigLgDS = 0.2;
 
 1774            table3gpp->m_uLgASD = 1.4;
 
 1775            table3gpp->m_sigLgASD = 0.1;
 
 1776            table3gpp->m_uLgASA = 1.4;
 
 1777            table3gpp->m_sigLgASA = 0.1;
 
 1778            table3gpp->m_uLgZSA = -0.1 * log10(1 + fcGHz) + 0.73;
 
 1779            table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.34;
 
 1780            table3gpp->m_uLgZSD = -0.1 * log10(1 + fcGHz) + 0.73;
 
 1781            table3gpp->m_sigLgZSD = -0.04 * log10(1 + fcGHz) + 0.34;
 
 1782            table3gpp->m_offsetZOD = 0;
 
 1783            table3gpp->m_cDS = 5 * 1e-9;
 
 1784            table3gpp->m_cASD = 17;
 
 1785            table3gpp->m_cASA = 17;
 
 1786            table3gpp->m_cZSA = 7;
 
 1787            table3gpp->m_uK = 9;
 
 1788            table3gpp->m_sigK = 3.5;
 
 1789            table3gpp->m_rTau = 3;
 
 1790            table3gpp->m_uXpr = 9;
 
 1791            table3gpp->m_sigXpr = 3;
 
 1792            table3gpp->m_perClusterShadowingStd = 4;
 
 1794            for (uint8_t row = 0; row < 7; row++)
 
 1796                for (uint8_t column = 0; column < 7; column++)
 
 1798                    table3gpp->m_sqrtC[row][column] = 
sqrtC_UMi_LOS[row][column];
 
 1802        else if (channelCondition->IsNlosv())
 
 1804            table3gpp->m_numOfCluster = 19;
 
 1805            table3gpp->m_raysPerCluster = 20;
 
 1806            table3gpp->m_uLgDS = -8.3;
 
 1807            table3gpp->m_sigLgDS = 0.3;
 
 1808            table3gpp->m_uLgASD = 1.5;
 
 1809            table3gpp->m_sigLgASD = 0.1;
 
 1810            table3gpp->m_uLgASA = 1.5;
 
 1811            table3gpp->m_sigLgASA = 0.1;
 
 1812            table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1813            table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1814            table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1815            table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1816            table3gpp->m_offsetZOD = 0;
 
 1817            table3gpp->m_cDS = 11 * 1e-9;
 
 1818            table3gpp->m_cASD = 22;
 
 1819            table3gpp->m_cASA = 22;
 
 1820            table3gpp->m_cZSA = 7;
 
 1821            table3gpp->m_uK = 0;
 
 1822            table3gpp->m_sigK = 4.5;
 
 1823            table3gpp->m_rTau = 2.1;
 
 1824            table3gpp->m_uXpr = 8.0;
 
 1825            table3gpp->m_sigXpr = 3;
 
 1826            table3gpp->m_perClusterShadowingStd = 4;
 
 1828            for (uint8_t row = 0; row < 6; row++)
 
 1830                for (uint8_t column = 0; column < 6; column++)
 
 1832                    table3gpp->m_sqrtC[row][column] = 
sqrtC_UMi_LOS[row][column];
 
 1836        else if (channelCondition->IsNlos())
 
 1839                "The fast fading parameters for the NLOS condition in the Highway scenario are not " 
 1840                "defined in TR 37.885, use the ones defined in TDoc R1-1803671 instead");
 
 1842            table3gpp->m_numOfCluster = 19;
 
 1843            table3gpp->m_raysPerCluster = 20;
 
 1844            table3gpp->m_uLgDS = -0.3 * log10(1 + fcGHz) - 7;
 
 1845            table3gpp->m_sigLgDS = 0.28;
 
 1846            table3gpp->m_uLgASD = -0.08 * log10(1 + fcGHz) + 1.81;
 
 1847            table3gpp->m_sigLgASD = 0.05 * log10(1 + fcGHz) + 0.3;
 
 1848            table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.81;
 
 1849            table3gpp->m_sigLgASA = 0.05 * log10(1 + fcGHz) + 0.3;
 
 1850            table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1851            table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1852            table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
 
 1853            table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
 
 1854            table3gpp->m_offsetZOD = 0;
 
 1855            table3gpp->m_cDS = 11 * 1e-9;
 
 1856            table3gpp->m_cASD = 22;
 
 1857            table3gpp->m_cASA = 22;
 
 1858            table3gpp->m_cZSA = 7;
 
 1859            table3gpp->m_uK = 0;   
 
 1860            table3gpp->m_sigK = 0; 
 
 1861            table3gpp->m_rTau = 2.1;
 
 1862            table3gpp->m_uXpr = 8;
 
 1863            table3gpp->m_sigXpr = 3;
 
 1864            table3gpp->m_perClusterShadowingStd = 4;
 
 1866            for (uint8_t row = 0; row < 6; row++)
 
 1868                for (uint8_t column = 0; column < 6; column++)
 
 1881        std::string freqBand = (fcGHz < 13) ? 
"S" : 
"Ka";
 
 1883        double elevAngle = 0;
 
 1884        bool isSatellite = 
false; 
 
 1902            if (aNTNMob->GetGeographicPosition().z <
 
 1903                bNTNMob->GetGeographicPosition().z) 
 
 1905                elevAngle = aNTNMob->GetElevationAngle(bNTNMob);
 
 1906                if (bNTNMob->GetGeographicPosition().z > 50000)
 
 1913                elevAngle = bNTNMob->GetElevationAngle(aNTNMob);
 
 1914                if (aNTNMob->GetGeographicPosition().z > 50000)
 
 1922            NS_FATAL_ERROR(
"Mobility Models needs to be of type Geocentric for NTN scenarios");
 
 1926        int elevAngleQuantized = (elevAngle < 10) ? 10 : round(elevAngle / 10) * 10;
 
 1930            if (channelCondition->IsLos())
 
 1932                table3gpp->m_uLgDS =
 
 1934                table3gpp->m_sigLgDS =
 
 1938                table3gpp->m_uLgASD =
 
 1941                table3gpp->m_sigLgASD =
 
 1944                table3gpp->m_uLgASA =
 
 1946                table3gpp->m_sigLgASA =
 
 1948                table3gpp->m_uLgZSA =
 
 1950                table3gpp->m_sigLgZSA =
 
 1954                table3gpp->m_uLgZSD =
 
 1957                table3gpp->m_sigLgZSD =
 
 1968                table3gpp->m_sigXpr =
 
 1986                for (uint8_t row = 0; row < 7; row++)
 
 1988                    for (uint8_t column = 0; column < 7; column++)
 
 1994            else if (channelCondition->IsNlos())
 
 1997                table3gpp->m_uLgDS =
 
 1999                table3gpp->m_sigLgDS =
 
 2001                table3gpp->m_uLgASD =
 
 2005                table3gpp->m_uLgASA =
 
 2009                table3gpp->m_uLgZSA =
 
 2013                table3gpp->m_uLgZSD =
 
 2021                table3gpp->m_sigXpr =
 
 2039                for (uint8_t row = 0; row < 6; row++)
 
 2041                    for (uint8_t column = 0; column < 6; column++)
 
 2050            if (channelCondition->IsLos())
 
 2052                table3gpp->m_uLgDS =
 
 2054                table3gpp->m_sigLgDS =
 
 2056                table3gpp->m_uLgASD =
 
 2058                table3gpp->m_sigLgASD =
 
 2060                table3gpp->m_uLgASA =
 
 2062                table3gpp->m_sigLgASA =
 
 2064                table3gpp->m_uLgZSA =
 
 2066                table3gpp->m_sigLgZSA =
 
 2068                table3gpp->m_uLgZSD =
 
 2070                table3gpp->m_sigLgZSD =
 
 2080                table3gpp->m_sigXpr =
 
 2082                table3gpp->m_numOfCluster =
 
 2084                table3gpp->m_raysPerCluster = 
NTNUrbanLOS.at(freqBand).at(
 
 2094                table3gpp->m_perClusterShadowingStd = 
NTNUrbanLOS.at(freqBand).at(
 
 2097                for (uint8_t row = 0; row < 7; row++)
 
 2099                    for (uint8_t column = 0; column < 7; column++)
 
 2105            else if (channelCondition->IsNlos())
 
 2107                table3gpp->m_uLgDS =
 
 2109                table3gpp->m_sigLgDS =
 
 2111                table3gpp->m_uLgASD =
 
 2113                table3gpp->m_sigLgASD =
 
 2115                table3gpp->m_uLgASA =
 
 2117                table3gpp->m_sigLgASA =
 
 2119                table3gpp->m_uLgZSA =
 
 2121                table3gpp->m_sigLgZSA =
 
 2123                table3gpp->m_uLgZSD =
 
 2125                table3gpp->m_sigLgZSD =
 
 2135                table3gpp->m_sigXpr =
 
 2137                table3gpp->m_numOfCluster =
 
 2139                table3gpp->m_raysPerCluster = 
NTNUrbanNLOS.at(freqBand).at(
 
 2149                table3gpp->m_perClusterShadowingStd = 
NTNUrbanNLOS.at(freqBand).at(
 
 2152                for (uint8_t row = 0; row < 6; row++)
 
 2154                    for (uint8_t column = 0; column < 6; column++)
 
 2156                        table3gpp->m_sqrtC[row][column] =
 
 2164            if (channelCondition->IsLos())
 
 2166                table3gpp->m_uLgDS =
 
 2168                table3gpp->m_sigLgDS =
 
 2170                table3gpp->m_uLgASD =
 
 2172                table3gpp->m_sigLgASD =
 
 2174                table3gpp->m_uLgASA =
 
 2176                table3gpp->m_sigLgASA =
 
 2178                table3gpp->m_uLgZSA =
 
 2180                table3gpp->m_sigLgZSA =
 
 2182                table3gpp->m_uLgZSD =
 
 2184                table3gpp->m_sigLgZSD =
 
 2194                table3gpp->m_sigXpr =
 
 2208                table3gpp->m_perClusterShadowingStd = 
NTNSuburbanLOS.at(freqBand).at(
 
 2211                for (uint8_t row = 0; row < 7; row++)
 
 2213                    for (uint8_t column = 0; column < 7; column++)
 
 2219            else if (channelCondition->IsNlos())
 
 2221                table3gpp->m_uLgDS =
 
 2223                table3gpp->m_sigLgDS =
 
 2225                table3gpp->m_uLgASD =
 
 2227                table3gpp->m_sigLgASD =
 
 2229                table3gpp->m_uLgASA =
 
 2231                table3gpp->m_sigLgASA =
 
 2233                table3gpp->m_uLgZSA =
 
 2235                table3gpp->m_sigLgZSA =
 
 2237                table3gpp->m_uLgZSD =
 
 2239                table3gpp->m_sigLgZSD =
 
 2249                table3gpp->m_sigXpr =
 
 2264                table3gpp->m_perClusterShadowingStd = 
NTNSuburbanNLOS.at(freqBand).at(
 
 2267                for (uint8_t row = 0; row < 6; row++)
 
 2269                    for (uint8_t column = 0; column < 6; column++)
 
 2278            if (channelCondition->IsLos())
 
 2280                table3gpp->m_uLgDS =
 
 2282                table3gpp->m_sigLgDS =
 
 2284                table3gpp->m_uLgASD =
 
 2286                table3gpp->m_sigLgASD =
 
 2288                table3gpp->m_uLgASA =
 
 2290                table3gpp->m_sigLgASA =
 
 2292                table3gpp->m_uLgZSA =
 
 2294                table3gpp->m_sigLgZSA =
 
 2296                table3gpp->m_uLgZSD =
 
 2298                table3gpp->m_sigLgZSD =
 
 2308                table3gpp->m_sigXpr =
 
 2310                table3gpp->m_numOfCluster =
 
 2312                table3gpp->m_raysPerCluster = 
NTNRuralLOS.at(freqBand).at(
 
 2322                table3gpp->m_perClusterShadowingStd = 
NTNRuralLOS.at(freqBand).at(
 
 2325                for (uint8_t row = 0; row < 7; row++)
 
 2327                    for (uint8_t column = 0; column < 7; column++)
 
 2333            else if (channelCondition->IsNlos())
 
 2335                table3gpp->m_uLgDS =
 
 2337                table3gpp->m_sigLgDS =
 
 2339                table3gpp->m_uLgASD =
 
 2341                table3gpp->m_sigLgASD =
 
 2343                table3gpp->m_uLgASA =
 
 2345                table3gpp->m_sigLgASA =
 
 2347                table3gpp->m_uLgZSA =
 
 2349                table3gpp->m_sigLgZSA =
 
 2351                table3gpp->m_uLgZSD =
 
 2353                table3gpp->m_sigLgZSD =
 
 2363                table3gpp->m_sigXpr =
 
 2365                table3gpp->m_numOfCluster =
 
 2367                table3gpp->m_raysPerCluster = 
NTNRuralNLOS.at(freqBand).at(
 
 2377                table3gpp->m_perClusterShadowingStd = 
NTNRuralNLOS.at(freqBand).at(
 
 2380                if (freqBand == 
"S")
 
 2382                    for (uint8_t row = 0; row < 6; row++)
 
 2384                        for (uint8_t column = 0; column < 6; column++)
 
 2386                            table3gpp->m_sqrtC[row][column] =
 
 2391                else if (freqBand == 
"Ka")
 
 2393                    for (uint8_t row = 0; row < 6; row++)
 
 2395                        for (uint8_t column = 0; column < 6; column++)
 
 2397                            table3gpp->m_sqrtC[row][column] =
 
 2408            table3gpp->m_uLgASD = std::numeric_limits<double>::min();
 
 2409            table3gpp->m_sigLgASD = 0;
 
 2410            table3gpp->m_uLgZSD = std::numeric_limits<double>::min();
 
 2411            table3gpp->m_sigLgZSD = 0;
 
 
 2591    channelParams->m_nodeIds =
 
 2593    channelParams->m_losCondition = channelCondition->GetLosCondition();
 
 2594    channelParams->m_o2iCondition = channelCondition->GetO2iCondition();
 
 2599    uint8_t paramNum = 6;
 
 2606    for (uint8_t iter = 0; iter < paramNum; iter++)
 
 2610    for (uint8_t row = 0; row < paramNum; row++)
 
 2613        for (uint8_t column = 0; column < paramNum; column++)
 
 2615            temp += table3gpp->m_sqrtC[row][column] * LSPsIndep[column];
 
 2617        LSPs.push_back(temp);
 
 2629        kFactor = LSPs[1] * table3gpp->m_sigK + table3gpp->m_uK;
 
 2630        DS = pow(10, LSPs[2] * table3gpp->m_sigLgDS + table3gpp->m_uLgDS);
 
 2631        ASD = pow(10, LSPs[3] * table3gpp->m_sigLgASD + table3gpp->m_uLgASD);
 
 2632        ASA = pow(10, LSPs[4] * table3gpp->m_sigLgASA + table3gpp->m_uLgASA);
 
 2633        ZSD = pow(10, LSPs[5] * table3gpp->m_sigLgZSD + table3gpp->m_uLgZSD);
 
 2634        ZSA = pow(10, LSPs[6] * table3gpp->m_sigLgZSA + table3gpp->m_uLgZSA);
 
 2638        DS = pow(10, LSPs[1] * table3gpp->m_sigLgDS + table3gpp->m_uLgDS);
 
 2639        ASD = pow(10, LSPs[2] * table3gpp->m_sigLgASD + table3gpp->m_uLgASD);
 
 2640        ASA = pow(10, LSPs[3] * table3gpp->m_sigLgASA + table3gpp->m_uLgASA);
 
 2641        ZSD = pow(10, LSPs[4] * table3gpp->m_sigLgZSD + table3gpp->m_uLgZSD);
 
 2642        ZSA = pow(10, LSPs[5] * table3gpp->m_sigLgZSA + table3gpp->m_uLgZSA);
 
 2644    ASD = std::min(ASD, 104.0);
 
 2645    ASA = std::min(ASA, 104.0);
 
 2646    ZSD = std::min(ZSD, 52.0);
 
 2647    ZSA = std::min(ZSA, 52.0);
 
 2650    channelParams->m_DS = DS;
 
 2651    channelParams->m_K_factor = kFactor;
 
 2653    NS_LOG_INFO(
"K-factor=" << kFactor << 
", DS=" << DS << 
", ASD=" << ASD << 
", ASA=" << ASA
 
 2654                            << 
", ZSD=" << ZSD << 
", ZSA=" << ZSA);
 
 2658    double minTau = 100.0;
 
 2659    for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
 
 2661        double tau = -1 * table3gpp->m_rTau * DS * log(
m_uniformRv->GetValue(0, 1)); 
 
 2666        clusterDelay.push_back(tau);
 
 2669    for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
 
 2671        clusterDelay[cIndex] -= minTau;
 
 2673    std::sort(clusterDelay.begin(), clusterDelay.end()); 
 
 2680    double powerSum = 0;
 
 2681    for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
 
 2684            exp(-1 * clusterDelay[cIndex] * (table3gpp->m_rTau - 1) / table3gpp->m_rTau / DS) *
 
 2686                -1 * 
m_normalRv->GetValue() * table3gpp->m_perClusterShadowingStd / 10.0); 
 
 2688        clusterPower.push_back(power);
 
 2690    channelParams->m_clusterPower = clusterPower;
 
 2692    double powerMax = 0;
 
 2694    for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
 
 2696        channelParams->m_clusterPower[cIndex] =
 
 2697            channelParams->m_clusterPower[cIndex] / powerSum; 
 
 2704        double kLinear = pow(10, kFactor / 10.0);
 
 2706        for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
 
 2710                clusterPowerForAngles.push_back(channelParams->m_clusterPower[cIndex] /
 
 2712                                                kLinear / (1 + kLinear)); 
 
 2716                clusterPowerForAngles.push_back(channelParams->m_clusterPower[cIndex] /
 
 2719            if (powerMax < clusterPowerForAngles[cIndex])
 
 2721                powerMax = clusterPowerForAngles[cIndex];
 
 2727        for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
 
 2729            clusterPowerForAngles.push_back(channelParams->m_clusterPower[cIndex]); 
 
 2730            if (powerMax < clusterPowerForAngles[cIndex])
 
 2732                powerMax = clusterPowerForAngles[cIndex];
 
 2739    double thresh = 0.0032;
 
 2740    for (uint8_t cIndex = table3gpp->m_numOfCluster; cIndex > 0; cIndex--)
 
 2742        if (clusterPowerForAngles[cIndex - 1] < thresh * powerMax)
 
 2744            clusterPowerForAngles.erase(clusterPowerForAngles.begin() + cIndex - 1);
 
 2745            channelParams->m_clusterPower.erase(channelParams->m_clusterPower.begin() + cIndex - 1);
 
 2746            clusterDelay.erase(clusterDelay.begin() + cIndex - 1);
 
 2750    NS_ASSERT(channelParams->m_clusterPower.size() < UINT8_MAX);
 
 2751    channelParams->m_reducedClusterNumber = channelParams->m_clusterPower.size();
 
 2756            0.7705 - 0.0433 * kFactor + 2e-4 * pow(kFactor, 2) + 17e-6 * pow(kFactor, 3); 
 
 2757        for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
 
 2759            clusterDelay[cIndex] = clusterDelay[cIndex] / cTau; 
 
 2769    switch (table3gpp->m_numOfCluster) 
 
 2814    double cPhi = cNlos;
 
 2818        cPhi *= (1.1035 - 0.028 * kFactor - 2e-3 * pow(kFactor, 2) +
 
 2819                 1e-4 * pow(kFactor, 3)); 
 
 2823    switch (table3gpp->m_numOfCluster) 
 
 2859    double cTheta = cNlos;
 
 2860    if (channelCondition->IsLos())
 
 2862        cTheta *= (1.3086 + 0.0339 * kFactor - 0.0077 * pow(kFactor, 2) +
 
 2863                   2e-4 * pow(kFactor, 3)); 
 
 2870    for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
 
 2872        double logCalc = -1 * log(clusterPowerForAngles[cIndex] / powerMax);
 
 2873        double angle = 2 * sqrt(logCalc) / 1.4 / cPhi; 
 
 2874        clusterAoa.push_back(ASA * angle);
 
 2875        clusterAod.push_back(ASD * angle);
 
 2876        angle = logCalc / cTheta; 
 
 2877        clusterZoa.push_back(ZSA * angle);
 
 2878        clusterZod.push_back(ZSD * angle);
 
 2881    Angles sAngle(bMob->GetPosition(), aMob->GetPosition());
 
 2882    Angles uAngle(aMob->GetPosition(), bMob->GetPosition());
 
 2884    for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
 
 2891        clusterAoa[cIndex] = clusterAoa[cIndex] * Xn + (
m_normalRv->GetValue() * ASA / 7.0) +
 
 2893        clusterAod[cIndex] = clusterAod[cIndex] * Xn + (
m_normalRv->GetValue() * ASD / 7.0) +
 
 2895        if (channelCondition->IsO2i())
 
 2897            clusterZoa[cIndex] =
 
 2898                clusterZoa[cIndex] * Xn + (
m_normalRv->GetValue() * ZSA / 7.0) + 90; 
 
 2902            clusterZoa[cIndex] = clusterZoa[cIndex] * Xn + (
m_normalRv->GetValue() * ZSA / 7.0) +
 
 2905        clusterZod[cIndex] = clusterZod[cIndex] * Xn + (
m_normalRv->GetValue() * ZSD / 7.0) +
 
 2907                             table3gpp->m_offsetZOD; 
 
 2919        for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
 
 2921            clusterAoa[cIndex] -= diffAoa; 
 
 2922            clusterAod[cIndex] -= diffAod;
 
 2923            clusterZoa[cIndex] -= diffZsa; 
 
 2924            clusterZod[cIndex] -= diffZsd;
 
 2928    double sizeTemp = clusterZoa.size();
 
 2929    for (uint8_t ind = 0; ind < 4; ind++)
 
 2935            angleDegree = clusterAoa;
 
 2938            angleDegree = clusterZoa;
 
 2941            angleDegree = clusterAod;
 
 2944            angleDegree = clusterZod;
 
 2949        for (uint8_t nIndex = 0; nIndex < sizeTemp; nIndex++)
 
 2951            while (angleDegree[nIndex] > 360)
 
 2953                angleDegree[nIndex] -= 360;
 
 2956            while (angleDegree[nIndex] < 0)
 
 2958                angleDegree[nIndex] += 360;
 
 2961            if (ind == 1 || ind == 3)
 
 2963                if (angleDegree[nIndex] > 180)
 
 2965                    angleDegree[nIndex] = 360 - angleDegree[nIndex];
 
 2972            clusterAoa = angleDegree;
 
 2975            clusterZoa = angleDegree;
 
 2978            clusterAod = angleDegree;
 
 2981            clusterZod = angleDegree;
 
 2992        for (uint8_t cInd = 0; cInd < channelParams->m_reducedClusterNumber; cInd++)
 
 2994            channelParams->m_clusterPower[cInd] =
 
 2995                channelParams->m_clusterPower[cInd] / pow(10, attenuationDb[cInd] / 10.0);
 
 3000        attenuationDb.push_back(0);
 
 3004    channelParams->m_attenuation_dB = attenuationDb;
 
 3009        channelParams->m_reducedClusterNumber,
 
 3013        channelParams->m_reducedClusterNumber,
 
 3017        channelParams->m_reducedClusterNumber,
 
 3021        channelParams->m_reducedClusterNumber,
 
 3025    const double pow10_uLgZSD = pow(10, table3gpp->m_uLgZSD);
 
 3026    for (uint8_t nInd = 0; nInd < channelParams->m_reducedClusterNumber; nInd++)
 
 3028        for (uint8_t mInd = 0; mInd < table3gpp->m_raysPerCluster; mInd++)
 
 3030            double tempAoa = clusterAoa[nInd] + table3gpp->m_cASA * 
offSetAlpha[mInd]; 
 
 3031            double tempZoa = clusterZoa[nInd] + table3gpp->m_cZSA * 
offSetAlpha[mInd]; 
 
 3032            std::tie(rayAoaRadian[nInd][mInd], rayZoaRadian[nInd][mInd]) =
 
 3035            double tempAod = clusterAod[nInd] + table3gpp->m_cASD * 
offSetAlpha[mInd];    
 
 3036            double tempZod = clusterZod[nInd] + 0.375 * pow10_uLgZSD * 
offSetAlpha[mInd]; 
 
 3037            std::tie(rayAodRadian[nInd][mInd], rayZodRadian[nInd][mInd]) =
 
 3042    for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
 
 3051    channelParams->m_rayAodRadian = rayAodRadian;
 
 3052    channelParams->m_rayAoaRadian = rayAoaRadian;
 
 3053    channelParams->m_rayZodRadian = rayZodRadian;
 
 3054    channelParams->m_rayZoaRadian = rayZoaRadian;
 
 3060    auto& crossPolarizationPowerRatios = channelParams->m_crossPolarizationPowerRatios;
 
 3062    auto& clusterPhase = channelParams->m_clusterPhase;
 
 3064    const double uXprLinear = pow(10, table3gpp->m_uXpr / 10.0);     
 
 3065    const double sigXprLinear = pow(10, table3gpp->m_sigXpr / 10.0); 
 
 3068    clusterPhase.resize(channelParams->m_reducedClusterNumber);
 
 3069    crossPolarizationPowerRatios.resize(channelParams->m_reducedClusterNumber);
 
 3070    for (uint8_t nInd = 0; nInd < channelParams->m_reducedClusterNumber; nInd++)
 
 3072        clusterPhase[nInd].resize(table3gpp->m_raysPerCluster);
 
 3073        crossPolarizationPowerRatios[nInd].resize(table3gpp->m_raysPerCluster);
 
 3074        for (uint8_t mInd = 0; mInd < table3gpp->m_raysPerCluster; mInd++)
 
 3076            clusterPhase[nInd][mInd].resize(4);
 
 3078            crossPolarizationPowerRatios[nInd][mInd] =
 
 3079                std::pow(10, (
m_normalRv->GetValue() * sigXprLinear + uXprLinear) / 10.0);
 
 3080            for (uint8_t pInd = 0; pInd < 4; pInd++)
 
 3083                clusterPhase[nInd][mInd][pInd] = 
m_uniformRv->GetValue(-1 * M_PI, M_PI);
 
 3088    uint8_t cluster1st = 0;
 
 3089    uint8_t cluster2nd = 0; 
 
 3090    double maxPower = 0;
 
 3091    for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
 
 3093        if (maxPower < channelParams->m_clusterPower[cIndex])
 
 3095            maxPower = channelParams->m_clusterPower[cIndex];
 
 3096            cluster1st = cIndex;
 
 3099    channelParams->m_cluster1st = cluster1st;
 
 3101    for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
 
 3103        if (maxPower < channelParams->m_clusterPower[cIndex] && cluster1st != cIndex)
 
 3105            maxPower = channelParams->m_clusterPower[cIndex];
 
 3106            cluster2nd = cIndex;
 
 3109    channelParams->m_cluster2nd = cluster2nd;
 
 3111    NS_LOG_INFO(
"1st strongest cluster:" << +cluster1st
 
 3112                                         << 
", 2nd strongest cluster:" << +cluster2nd);
 
 3115    if (cluster1st == cluster2nd)
 
 3117        clusterDelay.push_back(clusterDelay[cluster1st] + 1.28 * table3gpp->m_cDS);
 
 3118        clusterDelay.push_back(clusterDelay[cluster1st] + 2.56 * table3gpp->m_cDS);
 
 3120        clusterAoa.push_back(clusterAoa[cluster1st]);
 
 3121        clusterAoa.push_back(clusterAoa[cluster1st]);
 
 3123        clusterZoa.push_back(clusterZoa[cluster1st]);
 
 3124        clusterZoa.push_back(clusterZoa[cluster1st]);
 
 3126        clusterAod.push_back(clusterAod[cluster1st]);
 
 3127        clusterAod.push_back(clusterAod[cluster1st]);
 
 3129        clusterZod.push_back(clusterZod[cluster1st]);
 
 3130        clusterZod.push_back(clusterZod[cluster1st]);
 
 3136        if (cluster1st < cluster2nd)
 
 3146        clusterDelay.push_back(clusterDelay[min] + 1.28 * table3gpp->m_cDS);
 
 3147        clusterDelay.push_back(clusterDelay[min] + 2.56 * table3gpp->m_cDS);
 
 3148        clusterDelay.push_back(clusterDelay[max] + 1.28 * table3gpp->m_cDS);
 
 3149        clusterDelay.push_back(clusterDelay[max] + 2.56 * table3gpp->m_cDS);
 
 3151        clusterAoa.push_back(clusterAoa[min]);
 
 3152        clusterAoa.push_back(clusterAoa[min]);
 
 3153        clusterAoa.push_back(clusterAoa[max]);
 
 3154        clusterAoa.push_back(clusterAoa[max]);
 
 3156        clusterZoa.push_back(clusterZoa[min]);
 
 3157        clusterZoa.push_back(clusterZoa[min]);
 
 3158        clusterZoa.push_back(clusterZoa[max]);
 
 3159        clusterZoa.push_back(clusterZoa[max]);
 
 3161        clusterAod.push_back(clusterAod[min]);
 
 3162        clusterAod.push_back(clusterAod[min]);
 
 3163        clusterAod.push_back(clusterAod[max]);
 
 3164        clusterAod.push_back(clusterAod[max]);
 
 3166        clusterZod.push_back(clusterZod[min]);
 
 3167        clusterZod.push_back(clusterZod[min]);
 
 3168        clusterZod.push_back(clusterZod[max]);
 
 3169        clusterZod.push_back(clusterZod[max]);
 
 3172    channelParams->m_delay = clusterDelay;
 
 3173    channelParams->m_angle.clear();
 
 3174    channelParams->m_angle.push_back(clusterAoa);
 
 3175    channelParams->m_angle.push_back(clusterZoa);
 
 3176    channelParams->m_angle.push_back(clusterAod);
 
 3177    channelParams->m_angle.push_back(clusterZod);
 
 3180    channelParams->m_cachedAngleSincos.resize(channelParams->m_angle.size());
 
 3181    for (
size_t direction = 0; direction < channelParams->m_angle.size(); direction++)
 
 3183        channelParams->m_cachedAngleSincos[direction].resize(
 
 3184            channelParams->m_angle[direction].size());
 
 3185        for (
size_t cluster = 0; cluster < channelParams->m_angle[direction].size(); cluster++)
 
 3187            channelParams->m_cachedAngleSincos[direction][cluster] = {
 
 3188                sin(channelParams->m_angle[direction][cluster] * 
DEG2RAD),
 
 3189                cos(channelParams->m_angle[direction][cluster] * 
DEG2RAD)};
 
 3209    uint8_t updatedClusterNumber = (channelParams->m_reducedClusterNumber == 1)
 
 3210                                       ? channelParams->m_reducedClusterNumber + 2
 
 3211                                       : channelParams->m_reducedClusterNumber + 4;
 
 3213    for (uint8_t cIndex = 0; cIndex < updatedClusterNumber; cIndex++)
 
 3222        dopplerTermAlpha.push_back(alpha);
 
 3223        dopplerTermD.push_back(D);
 
 3225    channelParams->m_alpha = dopplerTermAlpha;
 
 3226    channelParams->m_D = dopplerTermD;
 
 3228    return channelParams;
 
 
 3247    channelMatrix->m_nodeIds =
 
 3250    bool isSameDirection = (channelParams->m_nodeIds == channelMatrix->m_nodeIds);
 
 3261    if (isSameDirection)
 
 3263        rayAodRadian = channelParams->m_rayAodRadian;
 
 3264        rayAoaRadian = channelParams->m_rayAoaRadian;
 
 3265        rayZodRadian = channelParams->m_rayZodRadian;
 
 3266        rayZoaRadian = channelParams->m_rayZoaRadian;
 
 3270        rayAodRadian = channelParams->m_rayAoaRadian;
 
 3271        rayAoaRadian = channelParams->m_rayAodRadian;
 
 3272        rayZodRadian = channelParams->m_rayZoaRadian;
 
 3273        rayZoaRadian = channelParams->m_rayZodRadian;
 
 3279    size_t uSize = uAntenna->GetNumElems();
 
 3280    size_t sSize = sAntenna->GetNumElems();
 
 3286    uint16_t numOverallCluster = (channelParams->m_cluster1st != channelParams->m_cluster2nd)
 
 3287                                     ? channelParams->m_reducedClusterNumber + 4
 
 3288                                     : channelParams->m_reducedClusterNumber + 2;
 
 3290    NS_ASSERT(channelParams->m_reducedClusterNumber <= channelParams->m_clusterPhase.size());
 
 3291    NS_ASSERT(channelParams->m_reducedClusterNumber <= channelParams->m_clusterPower.size());
 
 3292    NS_ASSERT(channelParams->m_reducedClusterNumber <=
 
 3293              channelParams->m_crossPolarizationPowerRatios.size());
 
 3294    NS_ASSERT(channelParams->m_reducedClusterNumber <= rayZoaRadian.size());
 
 3295    NS_ASSERT(channelParams->m_reducedClusterNumber <= rayZodRadian.size());
 
 3296    NS_ASSERT(channelParams->m_reducedClusterNumber <= rayAoaRadian.size());
 
 3297    NS_ASSERT(channelParams->m_reducedClusterNumber <= rayAodRadian.size());
 
 3298    NS_ASSERT(table3gpp->m_raysPerCluster <= channelParams->m_clusterPhase[0].size());
 
 3299    NS_ASSERT(table3gpp->m_raysPerCluster <=
 
 3300              channelParams->m_crossPolarizationPowerRatios[0].size());
 
 3301    NS_ASSERT(table3gpp->m_raysPerCluster <= rayZoaRadian[0].size());
 
 3302    NS_ASSERT(table3gpp->m_raysPerCluster <= rayZodRadian[0].size());
 
 3303    NS_ASSERT(table3gpp->m_raysPerCluster <= rayAoaRadian[0].size());
 
 3304    NS_ASSERT(table3gpp->m_raysPerCluster <= rayAodRadian[0].size());
 
 3306    double x = sMob->GetPosition().x - uMob->GetPosition().x;
 
 3307    double y = sMob->GetPosition().y - uMob->GetPosition().y;
 
 3308    double distance2D = sqrt(x * x + y * y);
 
 3311    double hUt = std::min(sMob->GetPosition().z, uMob->GetPosition().z);
 
 3312    double hBs = std::max(sMob->GetPosition().z, uMob->GetPosition().z);
 
 3314    double distance3D = std::sqrt(distance2D * distance2D + (hBs - hUt) * (hBs - hUt));
 
 3316    Angles sAngle(uMob->GetPosition(), sMob->GetPosition());
 
 3317    Angles uAngle(sMob->GetPosition(), uMob->GetPosition());
 
 3329    for (
size_t polSa = 0; polSa < sAntenna->GetNumPols(); ++polSa)
 
 3331        for (
size_t polUa = 0; polUa < uAntenna->GetNumPols(); ++polUa)
 
 3333            raysPreComp[std::make_pair(polSa, polUa)] =
 
 3334                Complex2DVector(channelParams->m_reducedClusterNumber, table3gpp->m_raysPerCluster);
 
 3339    sinCosA.resize(channelParams->m_reducedClusterNumber);
 
 3340    sinSinA.resize(channelParams->m_reducedClusterNumber);
 
 3341    cosZoA.resize(channelParams->m_reducedClusterNumber);
 
 3342    sinCosD.resize(channelParams->m_reducedClusterNumber);
 
 3343    sinSinD.resize(channelParams->m_reducedClusterNumber);
 
 3344    cosZoD.resize(channelParams->m_reducedClusterNumber);
 
 3345    for (uint8_t nIndex = 0; nIndex < channelParams->m_reducedClusterNumber; nIndex++)
 
 3347        sinCosA[nIndex].resize(table3gpp->m_raysPerCluster);
 
 3348        sinSinA[nIndex].resize(table3gpp->m_raysPerCluster);
 
 3349        cosZoA[nIndex].resize(table3gpp->m_raysPerCluster);
 
 3350        sinCosD[nIndex].resize(table3gpp->m_raysPerCluster);
 
 3351        sinSinD[nIndex].resize(table3gpp->m_raysPerCluster);
 
 3352        cosZoD[nIndex].resize(table3gpp->m_raysPerCluster);
 
 3355    for (uint8_t nIndex = 0; nIndex < channelParams->m_reducedClusterNumber; nIndex++)
 
 3357        for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
 
 3359            DoubleVector initialPhase = channelParams->m_clusterPhase[nIndex][mIndex];
 
 3361            double k = channelParams->m_crossPolarizationPowerRatios[nIndex][mIndex];
 
 3365            for (uint8_t polUa = 0; polUa < uAntenna->GetNumPols(); ++polUa)
 
 3367                auto [rxFieldPatternPhi, rxFieldPatternTheta] = uAntenna->GetElementFieldPattern(
 
 3368                    Angles(channelParams->m_rayAoaRadian[nIndex][mIndex],
 
 3369                           channelParams->m_rayZoaRadian[nIndex][mIndex]),
 
 3371                for (uint8_t polSa = 0; polSa < sAntenna->GetNumPols(); ++polSa)
 
 3373                    auto [txFieldPatternPhi, txFieldPatternTheta] =
 
 3374                        sAntenna->GetElementFieldPattern(
 
 3375                            Angles(channelParams->m_rayAodRadian[nIndex][mIndex],
 
 3376                                   channelParams->m_rayZodRadian[nIndex][mIndex]),
 
 3378                    raysPreComp[std::make_pair(polSa, polUa)](nIndex, mIndex) =
 
 3379                        std::complex<double>(cos(initialPhase[0]), sin(initialPhase[0])) *
 
 3380                            rxFieldPatternTheta * txFieldPatternTheta +
 
 3381                        std::complex<double>(cos(initialPhase[1]), sin(initialPhase[1])) *
 
 3382                            std::sqrt(1.0 / k) * rxFieldPatternTheta * txFieldPatternPhi +
 
 3383                        std::complex<double>(cos(initialPhase[2]), sin(initialPhase[2])) *
 
 3384                            std::sqrt(1.0 / k) * rxFieldPatternPhi * txFieldPatternTheta +
 
 3385                        std::complex<double>(cos(initialPhase[3]), sin(initialPhase[3])) *
 
 3386                            rxFieldPatternPhi * txFieldPatternPhi;
 
 3392            double sinRayZoa = sin(rayZoaRadian[nIndex][mIndex]);
 
 3393            double sinRayAoa = sin(rayAoaRadian[nIndex][mIndex]);
 
 3394            double cosRayAoa = cos(rayAoaRadian[nIndex][mIndex]);
 
 3395            sinCosA[nIndex][mIndex] = sinRayZoa * cosRayAoa;
 
 3396            sinSinA[nIndex][mIndex] = sinRayZoa * sinRayAoa;
 
 3397            cosZoA[nIndex][mIndex] = cos(rayZoaRadian[nIndex][mIndex]);
 
 3401            double sinRayZod = sin(rayZodRadian[nIndex][mIndex]);
 
 3402            double sinRayAod = sin(rayAodRadian[nIndex][mIndex]);
 
 3403            double cosRayAod = cos(rayAodRadian[nIndex][mIndex]);
 
 3404            sinCosD[nIndex][mIndex] = sinRayZod * cosRayAod;
 
 3405            sinSinD[nIndex][mIndex] = sinRayZod * sinRayAod;
 
 3406            cosZoD[nIndex][mIndex] = cos(rayZodRadian[nIndex][mIndex]);
 
 3412    uint8_t numSubClustersAdded = 0;
 
 3413    for (uint8_t nIndex = 0; nIndex < channelParams->m_reducedClusterNumber; nIndex++)
 
 3415        for (
size_t uIndex = 0; uIndex < uSize; uIndex++)
 
 3417            Vector uLoc = uAntenna->GetElementLocation(uIndex);
 
 3419            for (
size_t sIndex = 0; sIndex < sSize; sIndex++)
 
 3421                Vector sLoc = sAntenna->GetElementLocation(sIndex);
 
 3424                if (nIndex != channelParams->m_cluster1st && nIndex != channelParams->m_cluster2nd)
 
 3426                    std::complex<double> rays(0, 0);
 
 3427                    for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
 
 3430                        double rxPhaseDiff =
 
 3432                            (sinCosA[nIndex][mIndex] * uLoc.x + sinSinA[nIndex][mIndex] * uLoc.y +
 
 3433                             cosZoA[nIndex][mIndex] * uLoc.z);
 
 3435                        double txPhaseDiff =
 
 3437                            (sinCosD[nIndex][mIndex] * sLoc.x + sinSinD[nIndex][mIndex] * sLoc.y +
 
 3438                             cosZoD[nIndex][mIndex] * sLoc.z);
 
 3441                        rays += raysPreComp[std::make_pair(sAntenna->GetElemPol(sIndex),
 
 3442                                                           uAntenna->GetElemPol(uIndex))](nIndex,
 
 3444                                std::complex<double>(cos(rxPhaseDiff), sin(rxPhaseDiff)) *
 
 3445                                std::complex<double>(cos(txPhaseDiff), sin(txPhaseDiff));
 
 3448                        sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
 
 3449                    hUsn(uIndex, sIndex, nIndex) = rays;
 
 3453                    std::complex<double> raysSub1(0, 0);
 
 3454                    std::complex<double> raysSub2(0, 0);
 
 3455                    std::complex<double> raysSub3(0, 0);
 
 3457                    for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
 
 3461                        double rxPhaseDiff =
 
 3463                            (sinCosA[nIndex][mIndex] * uLoc.x + sinSinA[nIndex][mIndex] * uLoc.y +
 
 3464                             cosZoA[nIndex][mIndex] * uLoc.z);
 
 3466                        double txPhaseDiff =
 
 3468                            (sinCosD[nIndex][mIndex] * sLoc.x + sinSinD[nIndex][mIndex] * sLoc.y +
 
 3469                             cosZoD[nIndex][mIndex] * sLoc.z);
 
 3471                        std::complex<double> raySub =
 
 3472                            raysPreComp[std::make_pair(sAntenna->GetElemPol(sIndex),
 
 3473                                                       uAntenna->GetElemPol(uIndex))](nIndex,
 
 3475                            std::complex<double>(cos(rxPhaseDiff), sin(rxPhaseDiff)) *
 
 3476                            std::complex<double>(cos(txPhaseDiff), sin(txPhaseDiff));
 
 3500                        sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
 
 3502                        sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
 
 3504                        sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
 
 3505                    hUsn(uIndex, sIndex, nIndex) = raysSub1;
 
 3508                         channelParams->m_reducedClusterNumber + numSubClustersAdded) = raysSub2;
 
 3511                         channelParams->m_reducedClusterNumber + numSubClustersAdded + 1) =
 
 3516        if (nIndex == channelParams->m_cluster1st || nIndex == channelParams->m_cluster2nd)
 
 3518            numSubClustersAdded += 2;
 
 3525        std::complex<double> phaseDiffDueToDistance(cos(-2 * M_PI * distance3D / lambda),
 
 3526                                                    sin(-2 * M_PI * distance3D / lambda));
 
 3530        const double sinUAngleAz = sin(uAngle.
GetAzimuth());
 
 3531        const double cosUAngleAz = cos(uAngle.
GetAzimuth());
 
 3534        const double sinSAngleAz = sin(sAngle.
GetAzimuth());
 
 3535        const double cosSAngleAz = cos(sAngle.
GetAzimuth());
 
 3537        for (
size_t uIndex = 0; uIndex < uSize; uIndex++)
 
 3539            Vector uLoc = uAntenna->GetElementLocation(uIndex);
 
 3540            double rxPhaseDiff = 2 * M_PI *
 
 3541                                 (sinUAngleIncl * cosUAngleAz * uLoc.x +
 
 3542                                  sinUAngleIncl * sinUAngleAz * uLoc.y + cosUAngleIncl * uLoc.z);
 
 3544            for (
size_t sIndex = 0; sIndex < sSize; sIndex++)
 
 3546                Vector sLoc = sAntenna->GetElementLocation(sIndex);
 
 3547                std::complex<double> ray(0, 0);
 
 3548                double txPhaseDiff =
 
 3550                    (sinSAngleIncl * cosSAngleAz * sLoc.x + sinSAngleIncl * sinSAngleAz * sLoc.y +
 
 3551                     cosSAngleIncl * sLoc.z);
 
 3553                auto [rxFieldPatternPhi, rxFieldPatternTheta] = uAntenna->GetElementFieldPattern(
 
 3555                    uAntenna->GetElemPol(uIndex));
 
 3556                auto [txFieldPatternPhi, txFieldPatternTheta] = sAntenna->GetElementFieldPattern(
 
 3558                    sAntenna->GetElemPol(sIndex));
 
 3560                ray = (rxFieldPatternTheta * txFieldPatternTheta -
 
 3561                       rxFieldPatternPhi * txFieldPatternPhi) *
 
 3562                      phaseDiffDueToDistance *
 
 3563                      std::complex<double>(cos(rxPhaseDiff), sin(rxPhaseDiff)) *
 
 3564                      std::complex<double>(cos(txPhaseDiff), sin(txPhaseDiff));
 
 3566                double kLinear = pow(10, channelParams->m_K_factor / 10.0);
 
 3568                hUsn(uIndex, sIndex, 0) =
 
 3569                    sqrt(1.0 / (kLinear + 1)) * hUsn(uIndex, sIndex, 0) +
 
 3570                    sqrt(kLinear / (1 + kLinear)) * ray /
 
 3572                            channelParams->m_attenuation_dB[0] / 10.0); 
 
 3573                for (
size_t nIndex = 1; nIndex < hUsn.
GetNumPages(); nIndex++)
 
 3575                    hUsn(uIndex, sIndex, nIndex) *=
 
 3576                        sqrt(1.0 / (kLinear + 1)); 
 
 3582    NS_LOG_DEBUG(
"Husn (sAntenna, uAntenna):" << sAntenna->GetId() << 
", " << uAntenna->GetId());
 
 3583    for (
size_t cIndex = 0; cIndex < hUsn.
GetNumPages(); cIndex++)
 
 3585        for (
size_t rowIdx = 0; rowIdx < hUsn.
GetNumRows(); rowIdx++)
 
 3587            for (
size_t colIdx = 0; colIdx < hUsn.
GetNumCols(); colIdx++)
 
 3589                NS_LOG_DEBUG(
" " << hUsn(rowIdx, colIdx, cIndex) << 
",");
 
 3594    NS_LOG_INFO(
"size of coefficient matrix (rows, columns, clusters) = (" 
 3597    channelMatrix->m_channel = hUsn;
 
 3598    return channelMatrix;