Esempio n. 1
0
        public static double[,] InterpolateArray(double[,] initArray, int xsize, int ysize)
        {
            if (xsize == initArray.GetLength(0) && ysize == initArray.GetLength(1))
            {
                return(initArray);
            }

            var resArray = new double[xsize, ysize];

            FillArray(resArray, double.NaN);

            //todo учесть, что исходный массив может быть больше интерполируемого
            var xinit = initArray.GetLength(0);
            var yinit = initArray.GetLength(1);

            var ktX = Convert.ToDouble(xsize - 1) / Convert.ToDouble(xinit - 1);
            var ktY = Convert.ToDouble(ysize - 1) / Convert.ToDouble(yinit - 1);

            var xNodes = new List <int>(); //строчные индексы опорных значений интерполируемого массива
            var yNodes = new List <int>(); //столбовые индексы опорных значений интерполируемого массива

            //равномерно распределяем элементы исходного массива в интерполируемый
            for (int i = 0; i < xinit; i++)
            {
                int ni = Convert.ToInt32(i * ktX);
                xNodes.Add(ni);

                for (int j = 0; j < yinit; j++)
                {
                    int nj = Convert.ToInt32(j * ktY);
                    resArray[ni, nj] = initArray[i, j];

                    if (i == 0)
                    {
                        yNodes.Add(nj);
                    }
                }
            }

            //интерполируем

            for (int i = 0; i < xsize; i++)
            {
                for (int j = 0; j < ysize; j++)
                {
                    if (double.IsNaN(resArray[i, j]))
                    {
                        var li = LeftInd(xNodes, i);
                        var lj = LeftInd(yNodes, j);
                        var ri = RightInd(xNodes, i);
                        var rj = RightInd(yNodes, j);

                        var interpol = new InterpolationRectangle(new ModPoint(li, lj), new ModPoint(ri, rj), resArray[li, lj], resArray[li, rj], resArray[ri, lj], resArray[ri, rj], new ModPoint(i, j));
                        resArray[i, j] = interpol.InterpolatedValue;
                    }
                }
            }

            return(resArray);
        }
Esempio n. 2
0
        public static Dictionary <uint, Marker> GetMarkersFromPrnByIndexesDict(string filePath, List <uint> inds, bool calculatePressure = true)
        {
            var fs = new FileStream(filePath, FileMode.Open);

            var intArr    = new byte[4];
            var int64Arr  = new byte[8];
            var longArr   = new byte[45];
            var doubleArr = new byte[72];
            var byteArr   = new byte[1];
            var floatArr  = new byte[4];

            var A = new byte[4];

            fs.Read(A, 0, 4);

            fs.Read(longArr, 0, 40);
            var xnumx   = BitConverter.ToInt64(longArr, 0);
            var ynumy   = BitConverter.ToInt64(longArr, 8);
            var mnumx   = BitConverter.ToInt64(longArr, 16);
            var mnumy   = BitConverter.ToInt64(longArr, 24);
            var marknum = BitConverter.ToInt64(longArr, 32);

            // if (ind > marknum) return null; todo вернуть

            fs.Read(doubleArr, 0, 72);
            var xsize = BitConverter.ToDouble(doubleArr, 0);
            var ysize = BitConverter.ToDouble(doubleArr, 8);
            var pinit = new double[5]; for (int i = 0; i < 5; i++)
            {
                pinit[i] = BitConverter.ToDouble(doubleArr, 16 + 8 * i);
            }
            var gxkoef = BitConverter.ToDouble(doubleArr, 56);
            var gykoef = BitConverter.ToDouble(doubleArr, 64);

            fs.Read(intArr, 0, 4);
            var rocknum = BitConverter.ToInt32(intArr, 0);

            fs.Read(int64Arr, 0, 8);
            var bondnum = BitConverter.ToInt64(int64Arr, 0);

            fs.Read(intArr, 0, 4);
            var n1 = BitConverter.ToInt32(intArr, 0);

            fs.Read(doubleArr, 0, 8);
            var timesum = BitConverter.ToDouble(doubleArr, 0);


            // -------

            var curpos0 = 4 + 2 * 4 + 16 * 8 + rocknum * (8 * 24 + 4);

            fs.Position = curpos0 + (4 * 22 + 8 * 4) * xnumx * ynumy;

            var gx = new float[xnumx];

            for (int i = 0; i < xnumx; i++)
            {
                fs.Read(floatArr, 0, 4);
                gx[i] = BitConverter.ToSingle(floatArr, 0);
            }

            var gy = new float[ynumy];

            for (int i = 0; i < ynumy; i++)
            {
                fs.Read(floatArr, 0, 4);
                gy[i] = BitConverter.ToSingle(floatArr, 0);
            }
            //-------

            var result = new Dictionary <uint, Marker>();

            foreach (var ind in inds)
            {
                var nodenum1 = xnumx * ynumy;
                var curpos1  = 4 + 2 * 4 + 16 * 8 + rocknum * (8 * 24 + 4) + 15 * 8 * nodenum1 + 4 * (xnumx + ynumy) + (bondnum - 1) * (16 + 3 * 8) + ind * 37;
                fs.Position = curpos1;

                var parBytes = new byte[36];
                fs.Read(parBytes, 0, 36);

                var rid = new byte[1];
                fs.Read(rid, 0, 1);

                var resultMarker = new Marker
                {
                    XPosition     = BitConverter.ToSingle(parBytes, 0),
                    YPosition     = BitConverter.ToSingle(parBytes, 4),
                    Temperature   = BitConverter.ToSingle(parBytes, 8) - 273,
                    Density       = BitConverter.ToSingle(parBytes, 12),
                    WaterCons     = BitConverter.ToSingle(parBytes, 16),
                    UndefinedPar1 = BitConverter.ToSingle(parBytes, 20),
                    UndefinedPar2 = BitConverter.ToSingle(parBytes, 24),
                    Viscosity     = BitConverter.ToSingle(parBytes, 28),
                    Deformation   = BitConverter.ToSingle(parBytes, 32),
                    RockId        = rid[0],
                    Id            = ind,
                    Age           = timesum
                };

                if (calculatePressure)
                {
                    //     p1--------p3
                    //     |         |
                    //     p2--------p4

                    var p1X = LeftIndex(gx, resultMarker.XPosition);
                    var p1Y = LeftIndex(gy, resultMarker.YPosition);
                    var p2X = p1X;
                    var p2Y = p1Y + 1;
                    var p3X = p1X + 1;
                    var p3Y = p1Y;
                    var p4X = p1X + 1;
                    var p4Y = p1Y + 1;

                    double pressure;

                    if (p1X < 0 || p1Y < 0)
                    {
                        pressure = 0;
                        resultMarker.Pressure = pressure;
                        result.Add(resultMarker.Id, resultMarker);
                        continue;
                    }

                    fs.Position = curpos0 + 120 * ynumy * p1X + 120 * p1Y;
                    fs.Read(floatArr, 0, 4);
                    var v1 = BitConverter.ToSingle(floatArr, 0);

                    fs.Position = curpos0 + 120 * ynumy * p2X + 120 * p2Y;
                    fs.Read(floatArr, 0, 4);
                    var v2 = BitConverter.ToSingle(floatArr, 0);

                    fs.Position = curpos0 + 120 * ynumy * p3X + 120 * p3Y;
                    fs.Read(floatArr, 0, 4);
                    var v3 = BitConverter.ToSingle(floatArr, 0);

                    fs.Position = curpos0 + 120 * ynumy * p4X + 120 * p4Y;
                    fs.Read(floatArr, 0, 4);
                    var v4 = BitConverter.ToSingle(floatArr, 0);

                    var a1X = gx[p1X];
                    var a1Y = gy[p1Y];
                    var a4X = gx[p4X];
                    var a4Y = gy[p4Y];

                    var interpolation = new InterpolationRectangle(new ModPoint(a1X, a1Y), new ModPoint(a4X, a4Y), v1, v2, v3, v4, new ModPoint(resultMarker.XPosition, resultMarker.YPosition));
                    pressure = interpolation.InterpolatedValue;

                    resultMarker.Pressure = pressure;
                }

                result.Add(resultMarker.Id, resultMarker);
            }

            fs.Close();

            return(result);
        }