Пример #1
0
        /// <summary>Constructor.</summary>
        /// <param name="InitialState">Initial state of system</param>
        /// <param name="StepSize">Desired step per integration pass</param>
        /// <param name="InitialIndepVarValue">Initial independent variable value</param>
        /// <param name="DerivativeCalculator">Function to calculate derivatives vector</param>
        public doubleODE46(double InitialIndepVarValue, double StepSize, double[] InitialState, DerivCalcDeleg DerivativeCalculator)
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                CLCalc.InitCL();
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.NotUsingCL)
                throw new Exception("OpenCL not available");

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                ODE46Source Source = new ODE46Source();
                string[] s = new string[] { @"
                            #pragma OPENCL EXTENSION cl_khr_fp64 : enable
                            ", Source.doubleStep2, Source.doubleStep3, Source.doubleStep4, Source.doubleStep5, Source.doubleStep6, Source.doubleFinalizeCalc };
                CLCalc.Program.Compile(s);

                //Calculador de derivada
                Derivs = DerivativeCalculator;

                //Scalars
                double[] xx = new double[1] { InitialIndepVarValue };
                x = new CLCalc.Program.Variable(xx);
                xsav = new CLCalc.Program.Variable(xx);

                //Sets initial values to Device and local variables
                hdid = new CLCalc.Program.Variable(xx);
                currentX = InitialIndepVarValue;
                SetStep(StepSize);

                //Vectors
                yy = new double[InitialState.Length];
                for (int i = 0; i < InitialState.Length; i++) yy[i] = InitialState[i];

                ysav = new CLCalc.Program.Variable(yy);
                k1 = new CLCalc.Program.Variable(InitialState);
                k2 = new CLCalc.Program.Variable(InitialState);
                k3 = new CLCalc.Program.Variable(InitialState);
                k4 = new CLCalc.Program.Variable(InitialState);
                k5 = new CLCalc.Program.Variable(InitialState);
                k6 = new CLCalc.Program.Variable(InitialState);
                absError = new CLCalc.Program.Variable(new double[InitialState.Length]);

                y = new CLCalc.Program.Variable(yy);

                //Kernels
                KernelFinalizeCalc = new CLCalc.Program.Kernel("doubleFinalizeCalc");
                KernelUpdateX = new CLCalc.Program.Kernel("doubleUpdateX");
                KernelRK46YStep2 = new CLCalc.Program.Kernel("doubleYStep2");
                KernelRK46XStep2 = new CLCalc.Program.Kernel("doubleXStep2");
                KernelRK46YStep3 = new CLCalc.Program.Kernel("doubleYStep3");
                KernelRK46XStep3 = new CLCalc.Program.Kernel("doubleXStep3");
                KernelRK46YStep4 = new CLCalc.Program.Kernel("doubleYStep4");
                KernelRK46XStep4 = new CLCalc.Program.Kernel("doubleXStep4");
                KernelRK46YStep5 = new CLCalc.Program.Kernel("doubleYStep5");
                KernelRK46XStep5 = new CLCalc.Program.Kernel("doubleXStep5");
                KernelRK46YStep6 = new CLCalc.Program.Kernel("doubleYStep6");
                KernelRK46XStep6 = new CLCalc.Program.Kernel("doubleXStep6");

                //Kernel arguments
                ArgsFinalize = new CLCalc.Program.Variable[] { x, hdid, y, ysav, absError, k1, k2, k3, k4, k5, k6 };
                ArgsRK46Y = new CLCalc.Program.Variable[] { x, hdid, y, ysav, k1, k2, k3, k4, k5, k6 };
                ArgsRK46X = new CLCalc.Program.Variable[] { x, hdid, xsav };
                NStates = new int[1] { InitialState.Length };
                NScalar = new int[1] { 1 };

                //Data retrieving
                yerr = new double[NStates[0]];
                xRet = new double[NScalar[0]];

            }
        }
Пример #2
0
        /// <summary>Constructor.</summary>
        /// <param name="InitialState">Initial state of system</param>
        /// <param name="StepSize">Desired step per integration pass</param>
        /// <param name="InitialIndepVarValue">Initial independent variable value</param>
        /// <param name="DerivativeCalculator">Function to calculate derivatives vector</param>
        public floatODE46(float InitialIndepVarValue, float StepSize, float[] InitialState, DerivCalcDeleg DerivativeCalculator)
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                CLCalc.InitCL();
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.NotUsingCL)
            {
                throw new Exception("OpenCL not available");
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                ODE46Source Source = new ODE46Source();
                string[]    s      = new string[] { Source.floatStep2, Source.floatStep3, Source.floatStep4, Source.floatStep5, Source.floatStep6, Source.floatFinalizeCalc };
                CLCalc.Program.Compile(s);

                //Calculador de derivada
                Derivs = DerivativeCalculator;

                //Scalars
                float[] xx = new float[1] {
                    InitialIndepVarValue
                };
                x    = new CLCalc.Program.Variable(xx);
                xsav = new CLCalc.Program.Variable(xx);

                //Sets initial values to Device and local variables
                hdid     = new CLCalc.Program.Variable(xx);
                currentX = InitialIndepVarValue;
                SetStep(StepSize);

                //Vectors
                yy = new float[InitialState.Length];
                for (int i = 0; i < InitialState.Length; i++)
                {
                    yy[i] = InitialState[i];
                }


                ysav     = new CLCalc.Program.Variable(yy);
                k1       = new CLCalc.Program.Variable(InitialState);
                k2       = new CLCalc.Program.Variable(InitialState);
                k3       = new CLCalc.Program.Variable(InitialState);
                k4       = new CLCalc.Program.Variable(InitialState);
                k5       = new CLCalc.Program.Variable(InitialState);
                k6       = new CLCalc.Program.Variable(InitialState);
                absError = new CLCalc.Program.Variable(new float[InitialState.Length]);

                y = new CLCalc.Program.Variable(yy);

                //Kernels
                KernelFinalizeCalc = new CLCalc.Program.Kernel("floatFinalizeCalc");
                KernelUpdateX      = new CLCalc.Program.Kernel("floatUpdateX");
                KernelRK46YStep2   = new CLCalc.Program.Kernel("floatYStep2");
                KernelRK46XStep2   = new CLCalc.Program.Kernel("floatXStep2");
                KernelRK46YStep3   = new CLCalc.Program.Kernel("floatYStep3");
                KernelRK46XStep3   = new CLCalc.Program.Kernel("floatXStep3");
                KernelRK46YStep4   = new CLCalc.Program.Kernel("floatYStep4");
                KernelRK46XStep4   = new CLCalc.Program.Kernel("floatXStep4");
                KernelRK46YStep5   = new CLCalc.Program.Kernel("floatYStep5");
                KernelRK46XStep5   = new CLCalc.Program.Kernel("floatXStep5");
                KernelRK46YStep6   = new CLCalc.Program.Kernel("floatYStep6");
                KernelRK46XStep6   = new CLCalc.Program.Kernel("floatXStep6");


                //Kernel arguments
                ArgsFinalize = new CLCalc.Program.Variable[] { x, hdid, y, ysav, absError, k1, k2, k3, k4, k5, k6 };
                ArgsRK46Y    = new CLCalc.Program.Variable[] { x, hdid, y, ysav, k1, k2, k3, k4, k5, k6 };
                ArgsRK46X    = new CLCalc.Program.Variable[] { x, hdid, xsav };
                NStates      = new int[1] {
                    InitialState.Length
                };
                NScalar = new int[1] {
                    1
                };

                //Data retrieving
                yerr = new float[NStates[0]];
                xRet = new float[NScalar[0]];
            }
        }