Пример #1
0
        private static void LoadInput(out AproximationExpression expression, out PlotInterval interval)
        {
            Console.WriteLine("Zadajte funkciu f(x, y) na aproximaciu.\nAlebo priamo stlacte enter pre f(x,y)=sin(sqrt(x^2+y^2))");
            var func = Console.ReadLine();

            if (func == "")
            {
                func = "sin(sqrt(x^2+y^2))";
            }

            Console.WriteLine("Zadajte interval aproximacie v tvare: \n x0 y0 x1 y1.\nAlebo priamo stlacte enter pre hodnoty (0, 0, 50, 50)");
            var line = Console.ReadLine();

            if (line == "")
            {
                line = "0 0 50 50";
            }
            var vals = line.Split(' ');

            if (vals.Length < 4)
            {
                ErrMess();
            }
            interval   = new PlotInterval(float.Parse(vals[0]), float.Parse(vals[1]), float.Parse(vals[2]), float.Parse(vals[3]));
            expression = new AproximationExpression(func, "x", "y");
        }
Пример #2
0
        private float[] BasisMatrix(AproximationFunction function, PlotInterval interval)
        {
            var matrix = new float[16];

            matrix[0]  = (float)function.Z(interval.X0, interval.Y0);
            matrix[1]  = (float)function.Z(interval.X0, interval.Y1);
            matrix[2]  = (float)function.Dy(interval.X0, interval.Y0);
            matrix[3]  = (float)function.Dy(interval.X0, interval.Y1);
            matrix[4]  = (float)function.Z(interval.X1, interval.Y0);
            matrix[5]  = (float)function.Z(interval.X1, interval.Y1);
            matrix[6]  = (float)function.Dy(interval.X1, interval.Y0);
            matrix[7]  = (float)function.Dy(interval.X1, interval.Y1);
            matrix[8]  = (float)function.Dx(interval.X0, interval.Y0);
            matrix[9]  = (float)function.Dx(interval.X0, interval.Y1);
            matrix[10] = (float)function.Dxy(interval.X0, interval.Y0);
            matrix[11] = (float)function.Dxy(interval.X0, interval.Y1);
            matrix[12] = (float)function.Dx(interval.X1, interval.Y0);
            matrix[13] = (float)function.Dx(interval.X1, interval.Y1);
            matrix[14] = (float)function.Dxy(interval.X1, interval.Y0);
            matrix[15] = (float)function.Dxy(interval.X1, interval.Y1);

            return(matrix);
        }
Пример #3
0
        public Float4[] CreateMesh(AproximationFunction function, PlotInterval interval)
        {
            var basis = BasisMatrix(function, interval);
            var u0    = interval.X0;
            var u1    = interval.X1;
            var v0    = interval.Y0;
            var v1    = interval.Y1;

            var uKnotsDistance = Math.Abs(u1 - u0);
            var xCount         = Math.Ceiling(uKnotsDistance / Density);
            var yKnotDistance  = Math.Abs(v1 - v0);
            var yCount         = Math.Ceiling(yKnotDistance / Density);

            var verticesCount = (int)((++xCount) * (++yCount));

            var result = new Float4[verticesCount];


            // Create the input buffers and fill them with data from the arrays.
            // Access modifiers should match those in a kernel.
            // CopyHostPointer means the buffer should be filled with the data provided in the last argument.
            var knotsBuffer = new ComputeBuffer <float>(Context,
                                                        ComputeMemoryFlags.ReadOnly | ComputeMemoryFlags.CopyHostPointer, new[] { u0, v0, u1, v1 });
            var densityBuffer = new ComputeBuffer <float>(Context,
                                                          ComputeMemoryFlags.ReadOnly | ComputeMemoryFlags.CopyHostPointer, new[] { Density });
            var basisBuffer = new ComputeBuffer <float>(Context,
                                                        ComputeMemoryFlags.ReadOnly | ComputeMemoryFlags.CopyHostPointer, basis);


            var eventList = new ComputeEventList();

            // var localBasisBuffer = new ComputeBuffer<float>(Context, ComputeMemoryFlags.ReadWrite , 16L);

            var resultBuffer = new ComputeBuffer <Float4>(Context, ComputeMemoryFlags.WriteOnly, verticesCount);

            _kernel.SetMemoryArgument(0, resultBuffer);
//            _kernel.SetMemoryArgument(1, u0Buffer);
//            _kernel.SetMemoryArgument(2, u1Buffer);
//            _kernel.SetMemoryArgument(3, v0Buffer);
//            _kernel.SetMemoryArgument(4, v1Buffer);
            _kernel.SetMemoryArgument(1, knotsBuffer);
            _kernel.SetMemoryArgument(2, densityBuffer);
            _kernel.SetMemoryArgument(3, basisBuffer);
            // _kernel.SetLocalArgument(7,16*sizeof(float));

            var commands = new ComputeCommandQueue(_context, _context.Devices[0], ComputeCommandQueueFlags.None);
            // a.k.a. number of threads .... uCount*vCount
            var globalWorkSize = new[] { (long)xCount, (long)yCount };

            //var globalWorkSize = new[] {(long) verticesCount};
            //var localWorkSize = new long[] { 4,4};
            commands.Execute(_kernel, null, globalWorkSize, null, eventList);

            commands.ReadFromBuffer(resultBuffer, ref result, false, eventList);

            //Wait for the events in the list to finish,
            //eventList.Wait();

            //Or simply use
            commands.Finish();

            return(result);
        }
Пример #4
0
 public Float4[] CreateMesh(AproximationExpression expression, PlotInterval interval)
 {
     return(CreateMesh(AproximationFunction.FromExpression(expression), interval));
 }