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; } } }
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"; } }