private void qlra(RadioClimate klimx, VariabilityMode mdvarx) { foreach (var antenna in Antennae) { double q; if (antenna.kst == SiteCriteria.Random) { antenna.he = antenna.hg; } else { if (antenna.kst != SiteCriteria.Careful) { q = 9; } else { q = 4; } if (antenna.hg < 5) { q *= Math.Sin(0.3141593 * antenna.hg); } antenna.he = antenna.hg + (1 + q) * Math.Exp(-Math.Min(20, 2 * antenna.hg / Math.Max(1e-3, _dh))); } q = Math.Sqrt(2 * antenna.he / _gme); antenna.dl = q * Math.Exp(-0.07 * Math.Sqrt(_dh / Math.Max(antenna.he, 5))); antenna.the = (0.65 * _dh * (q / antenna.dl - 1) - 2 * antenna.he) / q; } _mdp = ControlFlow.AreaBegin; _mdvar = mdvarx; _klim = klimx; _lvar = Changes.All; }
//******************************************************** //* Point-To-Point Mode Calculations * //******************************************************** public void point_to_pointMDH(double[] elev, double tht_m, double rht_m, double eps_dielect, double sgm_conductivity, double eno_ns_surfref, double frq_mhz, RadioClimate radio_climate, Polarization pol, VariabilityMode mdvar, double timepct, double locpct, double confpct, out double dbloss, out PropMode propmode, out double deltaH, out int errnum) // timepct, locpct, confpct: .01 to .99 // elev[]: [num points - 1], [delta dist(meters)], [height(meters) point 1], ..., [height(meters) point n] // errnum: 0- No Error. // 1- Warning: Some parameters are nearly out of range. // Results should be used with caution. // 2- Note: Default parameters have been substituted for impossible ones. // 3- Warning: A combination of parameters is out of range. // Results are probably invalid. // Other- Warning: Some parameters are out of range. // Results are probably invalid. { _klim = radio_climate; _lvar = Changes.All; _mdp = ControlFlow.PointToPoint; _w1 = true; // possible bugfix: original embedded this value in mdvar _mdvar = mdvar; // bugfix: original used 'mobile' Transmitter.hg = tht_m; Receiver.hg = rht_m; var e = new Elevations(elev); qlrps(frq_mhz, e.Points.Average(), eno_ns_surfref, pol, eps_dielect, sgm_conductivity); qlrpfl(e, _klim, _mdvar); var fs = 32.45 + 20 * Math.Log10(frq_mhz) + 20 * Math.Log10(_dist / 1000.0); deltaH = _dh; propmode = GetPropMode(); dbloss = avar(qerfi(timepct), qerfi(locpct), qerfi(confpct)) + fs; //avar(time,location,confidence) errnum = _kwx; }
private void qlrpfl(Elevations pfl, RadioClimate klimx, VariabilityMode mdvarx) { _dist = pfl.EndIndex * pfl.DeltaDistance; hzns(pfl); foreach (var antenna in Antennae) { antenna.xl = Math.Min(15 * antenna.hg, 0.1 * antenna.dl); } Receiver.xl = _dist - Receiver.xl; _dh = d1thx(pfl, Transmitter.xl, Receiver.xl); if (Transmitter.dl + Receiver.dl > 1.5 * _dist) { z1sq1(pfl, Transmitter.xl, Receiver.xl, out var za, out var zb); Transmitter.he = Transmitter.hg + Dim(pfl.FirstPoint, za); Receiver.he = Receiver.hg + Dim(pfl.LastPoint, zb); foreach (var antenna in Antennae) { antenna.dl = Math.Sqrt(2 * antenna.he / _gme) * Math.Exp(-0.07 * Math.Sqrt(_dh / Math.Max(antenna.he, 5))); } var q = Transmitter.dl + Receiver.dl; if (q <= _dist) { q = Math.Pow(_dist / q, 2); foreach (var antenna in Antennae) { antenna.he *= q; antenna.dl = Math.Sqrt(2 * antenna.he / _gme) * Math.Exp(-0.07 * Math.Sqrt(_dh / Math.Max(antenna.he, 5))); } } foreach (var antenna in Antennae) { q = Math.Sqrt(2 * antenna.he / _gme); antenna.the = (0.65 * _dh * (q / antenna.dl - 1) - 2 * antenna.he) / q; } } else { z1sq1(pfl, Transmitter.xl, 0.9 * Transmitter.dl, out var za, out _); z1sq1(pfl, _dist - 0.9 * Receiver.dl, Receiver.xl, out _, out var zb); Transmitter.he = Transmitter.hg + Dim(pfl.FirstPoint, za); Receiver.he = Receiver.hg + Dim(pfl.LastPoint, zb); } _mdp = ControlFlow.PointToPoint; _mdvar = mdvarx; _klim = klimx; _lvar = Changes.All; lrprop(0); }
//******************************************************** //* Area Mode Calculations * //******************************************************** public void area(VariabilityMode ModVar, double deltaH, double tht_m, double rht_m, double dist_km, SiteCriteria TSiteCriteria, SiteCriteria RSiteCriteria, double eps_dielect, double sgm_conductivity, double eno_ns_surfref, double frq_mhz, RadioClimate radio_climate, Polarization pol, double pctTime, double pctLoc, double pctConf, out double dbloss, out PropMode propmode, out int errnum) { // pctTime, pctLoc, pctConf: .01 to .99 // errnum: 0- No Error. // 1- Warning: Some parameters are nearly out of range. // Results should be used with caution. // 2- Note: Default parameters have been substituted for impossible ones. // 3- Warning: A combination of parameters is out of range. // Results are probably invalid. // Other- Warning: Some parameters are out of range. // Results are probably invalid. _dh = deltaH; _klim = radio_climate; _ens = eno_ns_surfref; Transmitter.hg = tht_m; Transmitter.kst = TSiteCriteria; Receiver.hg = rht_m; Receiver.kst = RSiteCriteria; qlrps(frq_mhz, 0, eno_ns_surfref, pol, eps_dielect, sgm_conductivity); qlra(_klim, ModVar); if (_lvar < Changes.Distance) { _lvar = Changes.Distance; } lrprop(dist_km * 1000); var fs = 32.45 + 20 * Math.Log10(frq_mhz) + 20 * Math.Log10(_dist / 1000.0); var xlb = fs + avar(qerfi(pctTime), qerfi(pctLoc), qerfi(pctConf)); dbloss = xlb; errnum = _kwx; propmode = GetPropMode(); }