Ejemplo n.º 1
0
    private static void test03()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST03 writes out some rules for the unit wedge.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    20 August 2014
    //
    //  Author:
    //
    //    John Burkardt
    //
    //  Parameters:
    //
    {
        const int dim_num = 3;

        int[] line_order_array =
        {
            1, 2, 2, 3, 2, 3, 4
        }

        ;
        int       rule;
        const int rule_num = 7;

        int[] triangle_order_array =
        {
            1, 3, -3, 6, -6, 7, 12
        }

        ;
        string w_filename = "";

        double[] x;
        string   x_filename = "";

        Console.WriteLine("");
        Console.WriteLine("TEST03");
        Console.WriteLine("  For the unit wedge,");
        Console.WriteLine("  write some rules to a file");
        Console.WriteLine("");
        Console.WriteLine("   Rule  Trig    Line   Total  W_File X_File");
        Console.WriteLine("         Order   Order  Order");
        Console.WriteLine("");

        for (rule = 0; rule < rule_num; rule++)
        {
            switch (rule)
            {
            case 0:
                w_filename = "wedge_felippa_1x1_w.txt";
                x_filename = "wedge_felippa_1x1_x.txt";
                break;

            case 1:
                w_filename = "wedge_felippa_3x2_w.txt";
                x_filename = "wedge_felippa_3x2_x.txt";
                break;

            case 2:
                w_filename = "wedge_felippa_3bx2_w.txt";
                x_filename = "wedge_felippa_3bx2_x.txt";
                break;

            case 3:
                w_filename = "wedge_felippa_6x3_w.txt";
                x_filename = "wedge_felippa_6x3_x.txt";
                break;

            case 4:
                w_filename = "wedge_felippa_6bx2_w.txt";
                x_filename = "wedge_felippa_6bx2_x.txt";
                break;

            case 5:
                w_filename = "wedge_felippa_7x3_w.txt";
                x_filename = "wedge_felippa_7x3_x.txt";
                break;

            case 6:
                w_filename = "wedge_felippa_12x4_w.txt";
                x_filename = "wedge_felippa_12x4_x.txt";
                break;
            }

            int line_order     = line_order_array[rule];
            int triangle_order = triangle_order_array[rule];

            int order = line_order * Math.Abs(triangle_order);

            double[] w = new double[order];
            x = new double[dim_num * order];
            QuadratureRule.wedge_rule(line_order, triangle_order, ref w, ref x);
            typeMethods.r8mat_write(w_filename, 1, order, w);
            typeMethods.r8mat_write(x_filename, dim_num, order, x);
            Console.WriteLine(rule.ToString(CultureInfo.InvariantCulture).PadLeft(6) + "  "
                              + triangle_order.ToString(CultureInfo.InvariantCulture).PadLeft(6) + "  "
                              + line_order.ToString(CultureInfo.InvariantCulture).PadLeft(6) + "  "
                              + order.ToString(CultureInfo.InvariantCulture).PadLeft(6) + "  "
                              + w_filename + "  "
                              + x_filename + "");
        }
    }
Ejemplo n.º 2
0
    private static void test02(int degree_max)

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST02 tests the rules for the unit wedge.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    20 August 2014
    //
    //  Author:
    //
    //    John Burkardt
    //
    //  Parameters:
    //
    //    Input, int DEGREE_MAX, the maximum total degree of the
    //    monomials to check.
    //
    {
        const int dim_num = 3;

        int[] expon = new int[3];
        int   h     = 0;

        int[] line_order_array =
        {
            1, 2, 2, 3, 2, 3, 4
        }

        ;
        int       t        = 0;
        const int test_num = 7;

        int[] triangle_order_array =
        {
            1, 3, -3, 6, -6, 7, 12
        }

        ;

        Console.WriteLine("");
        Console.WriteLine("TEST02");
        Console.WriteLine("  For the unit wedge,");
        Console.WriteLine("  we approximate monomial integrals with WEDG_UNIT_RULE.");

        bool more = false;

        SubCompData data = new();

        for (;;)
        {
            SubComp.subcomp_next(ref data, degree_max, dim_num, ref expon, ref more, ref h, ref t);

            if (expon[2] % 2 == 1)
            {
                if (!more)
                {
                    break;
                }

                continue;
            }

            Console.WriteLine("");
            Console.WriteLine("  Monomial exponents:   "
                              + expon[0].ToString(CultureInfo.InvariantCulture).PadLeft(2) + "  "
                              + expon[1].ToString(CultureInfo.InvariantCulture).PadLeft(2) + "  "
                              + expon[2].ToString(CultureInfo.InvariantCulture).PadLeft(2) + "");
            Console.WriteLine("");

            int    test;
            double quad;
            for (test = 0; test < test_num; test++)
            {
                int line_order     = line_order_array[test];
                int triangle_order = triangle_order_array[test];

                int order = line_order * Math.Abs(triangle_order);

                double[] w   = new double[order];
                double[] xyz = new double[dim_num * order];
                QuadratureRule.wedge_rule(line_order, triangle_order, ref w, ref xyz);
                double[] v = Monomial.monomial_value(dim_num, order, expon, xyz);
                quad = QuadratureRule.wedge_volume() * typeMethods.r8vec_dot_product(order, w, v);
                Console.WriteLine(triangle_order.ToString(CultureInfo.InvariantCulture).PadLeft(6) + "  "
                                  + line_order.ToString(CultureInfo.InvariantCulture).PadLeft(6) + "  "
                                  + quad.ToString(CultureInfo.InvariantCulture).PadLeft(14) + "");
            }

            Console.WriteLine("");
            quad = QuadratureRule.wedge_integral(expon);
            Console.WriteLine("   Exact        "
                              + quad.ToString(CultureInfo.InvariantCulture).PadLeft(14) + "");

            if (!more)
            {
                break;
            }
        }
    }