示例#1
0
        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);
        }
示例#2
0
        //********************************************************
        //* 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;
        }
示例#3
0
        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);
        }
示例#4
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);
        }
示例#5
0
        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;
                        }
                    }
                }
            }
        }