コード例 #1
0
    private static void test05()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST05 writes a rule created by LYNESS_RULE to a file.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    30 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        double[] r =
        {
            0.0, 0.0,
            1.0, 0.0,
            0.0, 1.0
        };

        Console.WriteLine("");
        Console.WriteLine("TEST05");
        Console.WriteLine("  LYNESS_RULE returns the points and weights");
        Console.WriteLine("  of a Lyness rule for the triangle.");
        Console.WriteLine("");
        Console.WriteLine("  In this test, we simply print a rule.");

        const int rule      = 18;
        int       order     = LynessRule.lyness_order(rule);
        int       precision = LynessRule.lyness_precision(rule);

        Console.WriteLine("");
        Console.WriteLine("  Rule =      " + rule + "");
        Console.WriteLine("  Order =     " + order + "");
        Console.WriteLine("  Precision = " + precision + "");

        double[] w = new double[order];
        double[] x = new double[2 * order];

        LynessRule.lyness_rule(rule, order, ref w, ref x);

        typeMethods.r8mat_write("lyness_18_r.txt", 2, 3, r);
        Console.WriteLine("");
        Console.WriteLine("  Wrote the region file \"lyness_18_r.txt\".");
        typeMethods.r8mat_write("lyness_18_w.txt", 1, order, w);
        Console.WriteLine("  Wrote the weight file \"lyness_18_w.txt\".");
        typeMethods.r8mat_write("lyness_18_x.txt", 2, order, x);
        Console.WriteLine("  Wrote the point file \"lyness_18_x.txt\".");
    }
コード例 #2
0
    private static void test03()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST03 performs the barycentric coordinate sum test on Lyness rules.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    30 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int rule;

        Console.WriteLine("");
        Console.WriteLine("TEST03");
        Console.WriteLine("  LYNESS_RULE returns the points and weights");
        Console.WriteLine("  of a Lyness rule for the triangle.");
        Console.WriteLine("");
        Console.WriteLine("  In this test, we simply check that, for each");
        Console.WriteLine("  quadrature point, the barycentric coordinates");
        Console.WriteLine("  sum to 1.");

        int rule_num = LynessRule.lyness_rule_num();

        Console.WriteLine("");
        Console.WriteLine("      Rule   Suborder    Sum of coordinates");

        for (rule = 0; rule < rule_num; rule++)
        {
            int suborder_num = LynessRule.lyness_suborder_num(rule);

            double[] sub_w   = new double[suborder_num];
            double[] sub_xyz = new double[3 * suborder_num];

            LynessRule.lyness_subrule(rule, suborder_num, ref sub_xyz, ref sub_w);

            Console.WriteLine("");
            Console.WriteLine("  " + rule.ToString(CultureInfo.InvariantCulture).PadLeft(8)
                              + "  " + suborder_num.ToString(CultureInfo.InvariantCulture).PadLeft(8) + "");
            int suborder;
            for (suborder = 0; suborder < suborder_num; suborder++)
            {
                double xyz_sum = typeMethods.r8vec_sum(3, sub_xyz, +3 * suborder);
                Console.WriteLine("                           " + xyz_sum + "");
            }
        }
    }
コード例 #3
0
    private static void test04()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST04 prints a rule generated by LYNESS_RULE.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    30 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int j;

        Console.WriteLine("");
        Console.WriteLine("TEST04");
        Console.WriteLine("  LYNESS_RULE returns the points and weights");
        Console.WriteLine("  of a Lyness rule for the triangle.");
        Console.WriteLine("");
        Console.WriteLine("  In this test, we simply print a rule.");

        int rule      = 18;
        int order     = LynessRule.lyness_order(rule);
        int precision = LynessRule.lyness_precision(rule);

        Console.WriteLine("");
        Console.WriteLine("  Rule =      " + rule + "");
        Console.WriteLine("  Order =     " + order + "");
        Console.WriteLine("  Precision = " + precision + "");

        double[] w = new double[order];
        double[] x = new double[2 * order];

        LynessRule.lyness_rule(rule, order, ref w, ref x);

        Console.WriteLine("");
        Console.WriteLine("     I      W                   X                   Y");
        Console.WriteLine("");

        for (j = 0; j < order; j++)
        {
            Console.WriteLine("  " + j.ToString(CultureInfo.InvariantCulture).PadLeft(4)
                              + "  " + w[j].ToString("0.################").PadLeft(24)
                              + "  " + x[0 + j * 2].ToString("0.################").PadLeft(24)
                              + "  " + x[1 + j * 2].ToString("0.################").PadLeft(24) + "");
        }
    }
コード例 #4
0
    private static void test02()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST02 performs the weight sum test on Lyness rules.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    30 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int rule;

        Console.WriteLine("");
        Console.WriteLine("TEST02");
        Console.WriteLine("  LYNESS_RULE returns the points and weights");
        Console.WriteLine("  of a Lyness rule for the triangle.");
        Console.WriteLine("");
        Console.WriteLine("  In this test, we simply check that the weights");
        Console.WriteLine("  sum to 1.");

        int rule_num = LynessRule.lyness_rule_num();

        Console.WriteLine("");
        Console.WriteLine("  Number of available rules = " + rule_num + "");
        Console.WriteLine("");
        Console.WriteLine("      Rule    Sum of weights");
        Console.WriteLine("");

        for (rule = 0; rule <= rule_num; rule++)
        {
            int order = LynessRule.lyness_order(rule);

            double[] x = new double[2 * order];
            double[] w = new double[order];

            LynessRule.lyness_rule(rule, order, ref w, ref x);

            double w_sum = typeMethods.r8vec_sum(order, w);

            Console.WriteLine("  " + rule.ToString(CultureInfo.InvariantCulture).PadLeft(8)
                              + "  " + w_sum.ToString(CultureInfo.InvariantCulture).PadLeft(25) + "");
        }
    }
コード例 #5
0
    private static void test01()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST01 tests LYNESS_RULE_NUM, LYNESS_DEGREE, LYNESS_ORDER_NUM.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    29 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int rule;

        Console.WriteLine("");
        Console.WriteLine("TEST01");
        Console.WriteLine("  LYNESS_RULE_NUM returns the number of rules;");
        Console.WriteLine("  LYNESS_DEGREE returns the degree of a rule;");
        Console.WriteLine("  LYNESS_ORDER_NUM returns the order of a rule.");

        int rule_num = LynessRule.lyness_rule_num();

        Console.WriteLine("");
        Console.WriteLine("  Number of available rules = " + rule_num + "");
        Console.WriteLine("");
        Console.WriteLine("      Rule     Order  Precision");
        Console.WriteLine("");

        for (rule = 0; rule <= rule_num; rule++)
        {
            int order     = LynessRule.lyness_order(rule);
            int precision = LynessRule.lyness_precision(rule);
            Console.WriteLine("  " + rule.ToString(CultureInfo.InvariantCulture).PadLeft(8)
                              + "  " + order.ToString(CultureInfo.InvariantCulture).PadLeft(8)
                              + "  " + precision.ToString(CultureInfo.InvariantCulture).PadLeft(8) + "");
        }
    }
コード例 #6
0
    private static void test06()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST06 tests the Lyness rules for exact integration of monomials.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    30 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int       degree;
        const int degree_max = 10;
        double    value      = 0;

        Console.WriteLine("");
        Console.WriteLine("TEST06");
        Console.WriteLine("  LYNESS_RULE returns the points and weights of");
        Console.WriteLine("  a Lyness rule for the unit triangle.");
        Console.WriteLine("");
        Console.WriteLine("  This routine uses those rules to estimate the");
        Console.WriteLine("  integral of monomomials in the unit triangle.");

        int rule_num = LynessRule.lyness_rule_num();

        double area = 0.5;

        for (degree = 0; degree <= degree_max; degree++)
        {
            int a;
            for (a = 0; a <= degree; a++)
            {
                int b = degree - a;
                //
                //  Multiplying X^A * Y^B by COEF will give us an integrand
                //  whose integral is exactly 1.  This makes the error calculations easy.
                //
                double coef = (a + b + 2) * (double)(a + b + 1);
                int    i;
                for (i = 1; i <= b; i++)
                {
                    coef = coef * (a + i) / i;
                }

                Console.WriteLine("");
                Console.WriteLine("  Integrate " + coef + " * X^" + a + " * Y^" + b + "");
                Console.WriteLine("");
                Console.WriteLine("      Rule       QUAD           ERROR");
                Console.WriteLine("");

                int rule;
                for (rule = 0; rule <= rule_num; rule++)
                {
                    int order = LynessRule.lyness_order(rule);

                    double[] w = new double[order];
                    double[] x = new double[2 * order];

                    LynessRule.lyness_rule(rule, order, ref w, ref x);

                    double quad = 0.0;

                    int j;
                    for (j = 0; j < order; j++)
                    {
                        switch (a)
                        {
                        case 0 when b == 0:
                            value = coef;
                            break;

                        case 0 when b != 0:
                            value = coef * Math.Pow(x[1 + j * 2], b);
                            break;

                        default:
                        {
                            if (a != 0 && b == 0)
                            {
                                value = coef * Math.Pow(x[0 + j * 2], a);
                            }
                            else if (a != 0 && b != 0)
                            {
                                value = coef * Math.Pow(x[0 + j * 2], a) * Math.Pow(x[1 + j * 2], b);
                            }

                            break;
                        }
                        }

                        quad += w[j] * value;
                    }

                    quad = area * quad;

                    double exact = 1.0;
                    double err   = Math.Abs(exact - quad);

                    Console.WriteLine("  " + rule.ToString(CultureInfo.InvariantCulture).PadLeft(8)
                                      + "  " + quad.ToString("0.######").PadLeft(14)
                                      + "  " + err.ToString("0.##").PadLeft(10) + "");
                }
            }
        }
    }