Exemple #1
0
        private static void makeseminfweights(GaussIntType pickmethod, int num, out double[] x, out double[] w,
                       double delta)
        {
            double[] xtemp, wtemp;

            x = new double[num];
            w = new double[num];

            if (pickmethod == GaussIntType.GINTEQUAL)
            {
                for (int i = 0; i < num; i++)
                {
                    x[i] = delta * (i + 1.0);
                    w[i] = delta;
                }
            }
            else if (pickmethod == GaussIntType.GINTGLEG)
            {
                xtemp = new double[num + 1];
                wtemp = new double[num + 1];
                gauleg(0.0, 1.0, xtemp, wtemp, num / 2); // Gauss-Legendre weights & nodes
                for (int i = 0; i < num; i++)
                {
                    if (i < num / 2)
                    {
                        x[i] = delta * xtemp[i + 1];
                        w[i] = delta * wtemp[i + 1];
                    }
                    else
                    {
                        x[i] = delta / xtemp[num - i];
                        w[i] = delta * wtemp[num - i] / (xtemp[num - i] * xtemp[num - i]);
                    }
                }
            }
            else if (pickmethod == GaussIntType.GINTGLEGTAN)
            {
                makearbweights(pickmethod, num, out xtemp, out wtemp, -1.0, +1.0);
                for (int i = 0; i < num; i++)
                {
                    x[i] = delta * Math.Tan(0.25 * Math.PI * (xtemp[i] + 1.0));
                    double tmp = 1.0 / Math.Cos(0.25 * Math.PI * (xtemp[i] + 1.0));
                    double s = delta * 0.25 * Math.PI * wtemp[i];
                    w[i] = s * tmp * tmp;
                }
            }
        }
Exemple #2
0
        public static void makearbweights(GaussIntType pickmethod, int num, out double[] x, out double[] w, double xmin, double xmax)
        {
            double[] xtemp, wtemp;
            int i;

            x = new double[num];
            w = new double[num];

            if (pickmethod == GaussIntType.GINTEQUAL)
                for (i = 0; i < num; i++)
                {
                    x[i] = xmin + (xmax - xmin) * (i + 0.5) / num;
                    w[i] = (xmax - xmin) / num;
                }
            else if (pickmethod == GaussIntType.GINTGLEG || pickmethod == GaussIntType.GINTGLEGTAN)
            {
                xtemp = new double[num + 1];
                wtemp = new double[num + 1];
                gauleg(xmin, xmax, xtemp, wtemp, num);
                double test = 0.0;
                for (i = 0; i < num; i++)
                {
                    x[i] = xtemp[i + 1];
                    w[i] = wtemp[i + 1];
                    test += w[i];
                }
                //    cout + "with xmin="+xmin+" and xmax="+xmax+" int="+test+"\n";
            }
        }