private static void test06()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST06 tests SPHERE01_TRIANGLE_QUAD_ICOS2V.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    29 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int[] e = new int[3];
        int   i;
        int   node_num = 0;

        int seed = 123456789;

        Console.WriteLine("");
        Console.WriteLine("TEST06");
        Console.WriteLine("  Approximate the integral of a function on a random spherical triangle.");
        Console.WriteLine("");
        Console.WriteLine("  SPHERE01_TRIANGLE_QUAD_ICOS2V approximates the");
        Console.WriteLine("  integral of a function over a spherical triangle on");
        Console.WriteLine("  the surface of the unit sphere using a vertex rule.");
        Console.WriteLine("");
        Console.WriteLine("  We do not have an exact result, so we compare each");
        Console.WriteLine("  estimate to the final one.");
        //
        //  Choose three points at random to define a spherical triangle.
        //
        double[] v1 = MonteCarlo.sphere01_sample(1, ref seed);
        double[] v2 = MonteCarlo.sphere01_sample(1, ref seed);
        double[] v3 = MonteCarlo.sphere01_sample(1, ref seed);

        Console.WriteLine("");
        Console.WriteLine("  Vertices of random spherical triangle:");
        Console.WriteLine("");
        typeMethods.r8vec_transpose_print(3, v1, "  V1:");
        typeMethods.r8vec_transpose_print(3, v2, "  V2:");
        typeMethods.r8vec_transpose_print(3, v3, "  V3:");

        Console.WriteLine("");
        Console.WriteLine("FACTOR   N   RESULT");

        for (i = 1; i <= 17; i++)
        {
            switch (i)
            {
            case 1:
                e[0] = 0;
                e[1] = 0;
                e[2] = 0;
                break;

            case 2:
                e[0] = 1;
                e[1] = 0;
                e[2] = 0;
                break;

            case 3:
                e[0] = 0;
                e[1] = 1;
                e[2] = 0;
                break;

            case 4:
                e[0] = 0;
                e[1] = 0;
                e[2] = 1;
                break;

            case 5:
                e[0] = 2;
                e[1] = 0;
                e[2] = 0;
                break;

            case 6:
                e[0] = 0;
                e[1] = 2;
                e[2] = 2;
                break;

            case 7:
                e[0] = 2;
                e[1] = 2;
                e[2] = 2;
                break;

            case 8:
                e[0] = 0;
                e[1] = 2;
                e[2] = 4;
                break;

            case 9:
                e[0] = 0;
                e[1] = 0;
                e[2] = 6;
                break;

            case 10:
                e[0] = 1;
                e[1] = 2;
                e[2] = 4;
                break;

            case 11:
                e[0] = 2;
                e[1] = 4;
                e[2] = 2;
                break;

            case 12:
                e[0] = 6;
                e[1] = 2;
                e[2] = 0;
                break;

            case 13:
                e[0] = 0;
                e[1] = 0;
                e[2] = 8;
                break;

            case 14:
                e[0] = 6;
                e[1] = 0;
                e[2] = 4;
                break;

            case 15:
                e[0] = 4;
                e[1] = 6;
                e[2] = 2;
                break;

            case 16:
                e[0] = 2;
                e[1] = 4;
                e[2] = 8;
                break;

            case 17:
                e[0] = 16;
                e[1] = 0;
                e[2] = 0;
                break;
            }

            polyterm_exponent("SET", e);

            polyterm_exponent("PRINT", e);

            int factor = (int)Math.Pow(2, 9);

            double best = TriangleQuad.sphere01_triangle_quad_icos2v(v1, v2, v3, factor,
                                                                     polyterm_value_3d, ref node_num);

            factor = 1;

            int factor_log;
            for (factor_log = 0; factor_log <= 9; factor_log++)
            {
                double result = TriangleQuad.sphere01_triangle_quad_icos2v(v1, v2, v3, factor,
                                                                           polyterm_value_3d, ref node_num);

                double error = Math.Abs(result - best);

                Console.WriteLine("  " + factor.ToString().PadLeft(4)
                                  + "  " + node_num.ToString().PadLeft(8)
                                  + "  " + result.ToString(CultureInfo.InvariantCulture).PadLeft(16)
                                  + "  " + error.ToString(CultureInfo.InvariantCulture).PadLeft(10) + "");

                factor *= 2;
            }
        }
    }
    private static void test01()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TEST01 tests SPHERE01_TRIANGLE_QUAD_01, 02, 03.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    28 September 2010
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int[] e = new int[3];
        int   i;

        int seed = 123456789;

        Console.WriteLine("");
        Console.WriteLine("TEST01");
        Console.WriteLine("  Approximate the integral of a function on a random spherical triangle.");
        Console.WriteLine("");
        Console.WriteLine("  QUAD_01 uses centroids of spherical triangles.");
        Console.WriteLine("  QUAD_02 uses vertices of spherical triangles.");
        Console.WriteLine("  QUAD_03 uses midsides of spherical triangles.");
        //
        //  Choose three points at random to define a spherical triangle.
        //
        double[] v1 = MonteCarlo.sphere01_sample(1, ref seed);
        double[] v2 = MonteCarlo.sphere01_sample(1, ref seed);
        double[] v3 = MonteCarlo.sphere01_sample(1, ref seed);

        Console.WriteLine("");
        Console.WriteLine("  Vertices of random spherical triangle:");
        Console.WriteLine("");
        typeMethods.r8vec_transpose_print(3, v1, "  V1:");
        typeMethods.r8vec_transpose_print(3, v2, "  V2:");
        typeMethods.r8vec_transpose_print(3, v3, "  V3:");

        Console.WriteLine("");
        Console.WriteLine("QUAD_01      QUAD_02      QUAD_03");

        for (i = 1; i <= 17; i++)
        {
            switch (i)
            {
            case 1:
                e[0] = 0;
                e[1] = 0;
                e[2] = 0;
                break;

            case 2:
                e[0] = 1;
                e[1] = 0;
                e[2] = 0;
                break;

            case 3:
                e[0] = 0;
                e[1] = 1;
                e[2] = 0;
                break;

            case 4:
                e[0] = 0;
                e[1] = 0;
                e[2] = 1;
                break;

            case 5:
                e[0] = 2;
                e[1] = 0;
                e[2] = 0;
                break;

            case 6:
                e[0] = 0;
                e[1] = 2;
                e[2] = 2;
                break;

            case 7:
                e[0] = 2;
                e[1] = 2;
                e[2] = 2;
                break;

            case 8:
                e[0] = 0;
                e[1] = 2;
                e[2] = 4;
                break;

            case 9:
                e[0] = 0;
                e[1] = 0;
                e[2] = 6;
                break;

            case 10:
                e[0] = 1;
                e[1] = 2;
                e[2] = 4;
                break;

            case 11:
                e[0] = 2;
                e[1] = 4;
                e[2] = 2;
                break;

            case 12:
                e[0] = 6;
                e[1] = 2;
                e[2] = 0;
                break;

            case 13:
                e[0] = 0;
                e[1] = 0;
                e[2] = 8;
                break;

            case 14:
                e[0] = 6;
                e[1] = 0;
                e[2] = 4;
                break;

            case 15:
                e[0] = 4;
                e[1] = 6;
                e[2] = 2;
                break;

            case 16:
                e[0] = 2;
                e[1] = 4;
                e[2] = 8;
                break;

            case 17:
                e[0] = 16;
                e[1] = 0;
                e[2] = 0;
                break;
            }

            polyterm_exponent("SET", e);

            polyterm_exponent("PRINT", e);

            double result_01 = TriangleQuad.sphere01_triangle_quad_01(v1, v2, v3, polyterm_value_3d);

            double result_02 = TriangleQuad.sphere01_triangle_quad_02(v1, v2, v3, polyterm_value_3d);

            double result_03 = TriangleQuad.sphere01_triangle_quad_03(v1, v2, v3, polyterm_value_3d);

            Console.WriteLine("  " + result_01.ToString(CultureInfo.InvariantCulture).PadLeft(14)
                              + "  " + result_02.ToString(CultureInfo.InvariantCulture).PadLeft(14)
                              + "  " + result_03.ToString(CultureInfo.InvariantCulture).PadLeft(14) + "");
        }
    }