Esempio n. 1
0
        //---------------------------------------------
        //*********************************************
        public Inv_SRInfoLine copy()
        {
            Inv_SRInfoLine output = new Inv_SRInfoLine();

            output.name       = string.Copy(this.name);
            output.start      = this.start.copy();
            output.end        = this.end.copy();
            output.travelTime = this.travelTime;
            return(output);
        }
        private List <double> TsGenerator2(Inv_SRInfoTable table)
        {
            List <double> output = new List <double>();

            foreach (Inv_SRInfoLine L in table.SRInfoLineList)
            {
                Inv_SRInfoLine ttl = L.copy();
                ttl.TravelTime = (float)Math.Pow(6 * table.F_alpha_d * ttl.TravelTime, 0.5);
                output.Add(ttl.TravelTime);
            }
            return(output);
        }
        //=============================================
        private List <double> TsGenerator1(Inv_SRInfoTable table)
        {
            List <double> output = new List <double>();

            foreach (Inv_SRInfoLine L in table.SRInfoLineList)
            {
                Inv_SRInfoLine ttl = L.copy();
                ttl.TravelTime = ttl.TravelTime;
                output.Add(ttl.TravelTime);
            }
            return(output);
        }
        public List <double> TsGenerator2(Inv_SRInfoTable table)
        {
            List <double> TTL = new List <double>();//--> 经过计算后将用来矩阵计算的TravelTimeList// the vector b used for b=Ax

            foreach (Inv_SRInfoLine L in table.SRInfoLineList)
            {
                Inv_SRInfoLine line = L.copy();
                line.TravelTime = (float)Math.Pow(table.DimFactor * _table.F_alpha_d * line.TravelTime, 0.5);
                TTL.Add(line.TravelTime);
            }
            return(TTL);
        }
        //--------------------------------------------------------------------------------------
        //--------------------------------------------------------------------------------------
        ///Measured TravelTime
        ///配置TravelTime的向量-->List<double> TTL//set the vector of travel time
        public List <double> TsGenerator1(Inv_SRInfoTable table)
        {
            List <double> TTL = new List <double>();//--> 经过计算后将用来矩阵计算的TravelTimeList// the vector b used for b=Ax

            foreach (Inv_SRInfoLine L in table.SRInfoLineList)
            {
                Inv_SRInfoLine line = L.copy();
                line.TravelTime = line.TravelTime;
                TTL.Add(line.TravelTime);
            }
            return(TTL);
        }
        public void StRayAlgo()//straight ray algorithm
        {
            if (_result.Count == 0)
            {
                _result.Clear();
            }
            int n_d = _initialDiffusivity.Count; //he number of cells, it equals the number of columns of matrix A
            int n_t = _tProcessed.Count;         //the number of travel times, it equals the number of rows of matrix A
            // b=Ax, x->x2
            // consider b as time, A as distance, x as speed
            double          xMax       = 1.0 / (Math.Sqrt(_iP.MinD)); // set the constraint, the max of x, x=1/(root of diffusivity)
            double          xMin       = 1.0 / (Math.Sqrt(_iP.MaxD)); // set the constraint, the min of x, x=1/(root of diffusivity)
            List <double>   estimatedD = _initialDiffusivity.ToList();
            Vector <double> x          = Vector <double> .Build.Dense(n_d, 1);

            for (int i = 0; i < n_d; i++)
            {
                x[i] = 1.0 / (Math.Sqrt(estimatedD[i]));//the speed vector, x=1/(root of diffusivity)
            }

            #region
            int    iter = 0;
            double RMS  = _iP.CriRMS + 1;
            while (iter <_iP.StrRay& RMS> _iP.CriRMS)
            {
                //STEP 1
                SIRT_Result_StraightRay Record = new SIRT_Result_StraightRay();
                Record.Iter          = iter;
                Record.OldProcessedD = x.ToList();
                //====================================================
                //STEP 2 : Set matrix A
                Matrix <double> A = Matrix <double> .Build.Dense(n_t, n_d, 0);

                for (int row = 0; row < n_t; row++)
                {
                    Inv_SRInfoLine infoLine = (Inv_SRInfoLine)_table.SRInfoLineList[row];
                    MathNet.Spatial.Euclidean.Point2D PStart = new MathNet.Spatial.Euclidean.Point2D(infoLine.Start.Coor[0], infoLine.Start.Coor[2]);
                    MathNet.Spatial.Euclidean.Point2D PEnd   = new MathNet.Spatial.Euclidean.Point2D(infoLine.End.Coor[0], infoLine.End.Coor[2]);
                    MathNet.Spatial.Euclidean.Line2D  Traj   = new MathNet.Spatial.Euclidean.Line2D(PStart, PEnd);
                    for (int col = 0; col < n_d; col++)
                    {
                        CohenSutherland coh = new CohenSutherland();
                        List <MathNet.Spatial.Euclidean.Point2D> Ps = coh.CohenSutherlandLineClip(_fRs[col], PStart, PEnd).ToList();
                        if (Ps.Count > 1)
                        {
                            A[row, col] = Ps[0].DistanceTo(Ps[1]);
                        }
                    }
                }
                Record.A             = A.Clone();
                Record.ProcessedTime = (A * x).ToList();
                //====================================================
                //STEP 3 : set the start node and the end node from Record
                foreach (object obj in _table.SRInfoLineList)
                {
                    Inv_SRInfoLine infoLine = (Inv_SRInfoLine)obj;
                    Record.Start.Add(infoLine.Start);
                    Record.End.Add(infoLine.End);
                }
                //====================================================
                //STEP 4 : cimmino calculation
                Vector <double> b = Vector <double> .Build.DenseOfArray(_tProcessed.ToArray());

                SIRT_Options    so = new SIRT_Options(b, A, x, 1);// b=Ax
                Vector <double> x2 = so.XUpdaterDROP(x, 1);
                //====================================================
                //STEP 7 : update x and diffusivity for next iteration
                x = x2.Clone();
                for (int i = 0; i < n_d; i++)
                {
                    if (x[i] < conMinX[i])
                    {
                        x[i] = conMinX[i];
                    }
                    if (x[i] > conMaxX[i])
                    {
                        x[i] = conMaxX[i];
                    }
                }
                Record.NewProcessedD = x.ToList();
                //====================================================
                _result.Add(Record);//output
                iter = iter + 1;
            }
            #endregion
        }