private static void z1sq1(Elevations z, double x1, double x2, out double z0, out double zn) { double xn = z.EndIndex; double xa = (int)Dim(x1 / z.DeltaDistance, 0); var xb = xn - (int)Dim(xn, x2 / z.DeltaDistance); if (xb <= xa) { xa = Dim(xa, 1); xb = xn - Dim(xn, xb + 1); } var ja = (int)xa; var jb = (int)xb; var n = jb - ja; xa = xb - xa; var x = -0.5 * xa; xb += x; var a = 0.5 * (z.Points[ja] + z.Points[jb]); var b = 0.5 * (z.Points[ja] - z.Points[jb]) * x; for (var i = 2; i <= n; i++) { ja++; x += 1; a += z.Points[ja]; b += z.Points[ja] * x; } a /= xa; b = b * 12 / ((xa * xa + 2) * xa); z0 = a - b * xb; zn = a + b * (xn - xb); }
//******************************************************** //* 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); }
private static double d1thx(Elevations pfl, double x1, double x2) { var np = pfl.EndIndex; var xa = x1 / pfl.DeltaDistance; var xb = x2 / pfl.DeltaDistance; if (xb - xa < 2) // exit out { return(0); } var ka = (int)(0.1 * (xb - xa + 8)); ka = Math.Min(Math.Max(4, ka), 25); var n = 10 * ka - 5; var kb = n - ka + 1; double sn = n - 1; xb = (xb - xa) / sn; var k = (int)(xa + 1); xa -= k; var s = new Elevations(n, 1); for (var j = 0; j < n; j++) { while (xa > 0 && k < np) { xa -= 1; k++; } s.Points[j] = pfl.Points[k] + (pfl.Points[k] - pfl.Points[k - 1]) * xa; xa += xb; } z1sq1(s, 0, sn, out xa, out xb); xb = (xb - xa) / sn; for (var j = 0; j < n; j++) { s.Points[j] -= xa; xa += xb; } var d1thxv = qtile(n - 1, s.Points, ka - 1) - qtile(n - 1, s.Points, kb - 1); d1thxv /= 1 - 0.8 * Math.Exp(-(x2 - x1) / 50000.0); return(d1thxv); }
private void hzns(Elevations pfl) { var np = pfl.EndIndex; var xi = pfl.DeltaDistance; var za = pfl.FirstPoint + Transmitter.hg; var zb = pfl.LastPoint + Receiver.hg; var qc = 0.5 * _gme; var q = qc * _dist; Receiver.the = (zb - za) / _dist; Transmitter.the = Receiver.the - q; Receiver.the = -Receiver.the - q; Transmitter.dl = _dist; Receiver.dl = _dist; if (np >= 2) { var sa = 0.0; var sb = _dist; var wq = true; for (var i = 1; i < np; i++) { sa += xi; sb -= xi; q = pfl.Points[i] - (qc * sa + Transmitter.the) * sa - za; if (q > 0) { Transmitter.the += q / sa; Transmitter.dl = sa; wq = false; } if (!wq) { q = pfl.Points[i] - (qc * sb + Receiver.the) * sb - zb; if (q > 0) { Receiver.the += q / sb; Receiver.dl = sb; } } } } }