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