private static void sgmga_vcn_coef_test(int dim_num, double[] importance, double[] level_weight, int level_max_min, int level_max_max) //****************************************************************************80 // // Purpose: // // SGMGA_VCN_COEF_TEST tests SGMGA_VCN_COEF. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 18 May 2010 // // Author: // // John Burkardt // { int dim; int level_max; SGMGAniso.SGMGAData data = new(); string cout = ""; int[] level_1d = new int[dim_num]; int[] level_1d_max = new int[dim_num]; int[] level_1d_min = new int[dim_num]; Console.WriteLine(""); Console.WriteLine("SGMGA_VCN_COEF_TEST"); Console.WriteLine(" For anisotropic problems, a \"combinatorial coefficent\""); Console.WriteLine(" must be computed for each component product grid."); Console.WriteLine(" SGMGA_VCN_COEF_NAIVE does this in a simple, inefficient way."); Console.WriteLine(" SGMGA_VCN_COEF tries to be more efficient."); Console.WriteLine(" Here, we simply compare COEF1 and COEF2, the same"); Console.WriteLine(" coefficient computed by the naive and efficient ways."); Console.WriteLine(""); Console.WriteLine(" IMPORTANCE:"); cout = ""; for (dim = 0; dim < dim_num; dim++) { cout += " " + importance[dim].ToString(CultureInfo.InvariantCulture).PadLeft(14); } Console.WriteLine(cout); Console.WriteLine(" LEVEL_WEIGHT:"); cout = ""; for (dim = 0; dim < dim_num; dim++) { cout += " " + level_weight[dim].ToString(CultureInfo.InvariantCulture).PadLeft(14); } Console.WriteLine(cout); for (level_max = level_max_min; level_max <= level_max_max; level_max++) { int i = 0; double coef1_sum = 0.0; double coef2_sum = 0.0; // // Initialization. // double level_weight_min_pos = typeMethods.r8vec_min_pos(dim_num, level_weight); double q_min = level_max * level_weight_min_pos - typeMethods.r8vec_sum(dim_num, level_weight); double q_max = level_max * level_weight_min_pos; for (dim = 0; dim < dim_num; dim++) { level_1d_min[dim] = 0; } for (dim = 0; dim < dim_num; dim++) { switch (level_weight[dim]) { case > 0.0: { level_1d_max[dim] = (int)Math.Floor(q_max / level_weight[dim]) + 1; if (q_max <= (level_1d_max[dim] - 1) * level_weight[dim]) { level_1d_max[dim] -= 1; } break; } default: level_1d_max[dim] = 0; break; } } bool more_grids = false; Console.WriteLine(""); Console.WriteLine(" I Q Coef1 Coef2 X"); cout = " MIN" + " " + q_min.ToString(CultureInfo.InvariantCulture).PadLeft(14) + " "; for (dim = 0; dim < dim_num; dim++) { cout += " " + level_1d_min[dim].ToString().PadLeft(2); } Console.WriteLine(cout); // // Seek all vectors LEVEL_1D which satisfy the constraint: // // LEVEL_MAX * LEVEL_WEIGHT_MIN_POS - sum ( LEVEL_WEIGHT ) // < sum ( 0 <= I < DIM_NUM ) LEVEL_WEIGHT[I] * LEVEL_1D[I] // <= LEVEL_MAX * LEVEL_WEIGHT_MIN_POS. // for (;;) { SGMGAniso.sgmga_vcn_ordered_naive(ref data, dim_num, level_weight, level_1d_max, level_1d, q_min, q_max, ref more_grids); if (!more_grids) { break; } // // Compute the combinatorial coefficient. // double coef1 = SGMGAniso.sgmga_vcn_coef_naive(dim_num, level_weight, level_1d_max, level_1d, q_min, q_max); double coef2 = SGMGAniso.sgmga_vcn_coef(dim_num, level_weight, level_1d, q_max); i += 1; double q = 0.0; for (dim = 0; dim < dim_num; dim++) { q += level_weight[dim] * level_1d[dim]; } coef1_sum += coef1; coef2_sum += coef2; cout = " " + i.ToString().PadLeft(4) + " " + q.ToString(CultureInfo.InvariantCulture).PadLeft(14) + " " + coef1.ToString(CultureInfo.InvariantCulture).PadLeft(10) + " " + coef2.ToString(CultureInfo.InvariantCulture).PadLeft(10); for (dim = 0; dim < dim_num; dim++) { cout += " " + level_1d[dim].ToString().PadLeft(2); } Console.WriteLine(cout); } cout = " MAX" + " " + q_max.ToString(CultureInfo.InvariantCulture).PadLeft(14) + " "; for (dim = 0; dim < dim_num; dim++) { cout += " " + level_1d_max[dim].ToString().PadLeft(2); } Console.WriteLine(cout); Console.WriteLine(" SUM " + " " + coef1_sum.ToString(CultureInfo.InvariantCulture).PadLeft(10) + " " + coef2_sum.ToString(CultureInfo.InvariantCulture).PadLeft(10) + ""); } }