24 std::vector<std::string>
25 get_unique_component_names(
const std::vector<std::string> &component_names)
27 auto elements = component_names;
28 auto last = std::unique(elements.begin(), elements.end());
29 elements.resize(last - elements.begin());
35 std::vector<ComponentMask>
36 get_unique_component_masks(
const std::vector<std::string> &component_names)
38 const auto unique_component_names =
39 get_unique_component_names(component_names);
41 std::vector<ComponentMask> masks;
43 std::vector<std::vector<bool>> bools(
44 unique_component_names.size(),
45 std::vector<bool>(component_names.size(),
false));
48 for (
unsigned int i = 0; i < component_names.size(); ++i)
50 if (unique_component_names[j] != component_names[i])
51 masks.emplace_back(bools[j++]);
54 masks.emplace_back(bools[j++]);
63 const std::vector<std::string> & solution_names,
64 const std::vector<std::set<VectorTools::NormType>> &list_of_error_norms)
70 "reduction_rate_log2",
79 const std::vector<std::string> & component_names,
80 const std::vector<std::set<VectorTools::NormType>> &list_of_error_norms,
81 const double exponent,
82 const std::set<std::string> & extra_columns,
83 const std::string & rate_key,
84 const std::string & rate_mode,
85 const std::string & error_file_name,
86 const unsigned int precision,
87 const bool compute_error)
88 : component_names(component_names)
89 , unique_component_names(get_unique_component_names(component_names))
90 , unique_component_masks(get_unique_component_masks(component_names))
91 , norms_per_unique_component(list_of_error_norms)
93 , extra_columns(extra_columns)
95 , rate_mode(rate_mode)
96 , precision(precision)
97 , error_file_name(error_file_name)
98 , compute_error(compute_error)
111 "When set to false, no computations are performed.");
115 "Number of digits to use when printing the error.",
120 "Set this to a filename with extension .txt, .gpl, .org, "
121 "or .tex to enable writing the convergence table to a "
125 "List of error norms to compute",
127 "Each component is separated by a semicolon "
128 "and each norm by a comma. See the documentation of VectorTools::NormType "
129 "for a list of implemented norms. If you want to skip a component, leave "
135 "The exponent to use when computing p-norms.",
140 "Extra columns to add to the table. Available options "
141 "are dofs and cells.",
146 "Key to use when computing convergence rates. If "
147 "this is set to a column that is not present, or to the "
148 "empty string, then no error rates are computed.");
152 "What type of error rate to compute. Available options are "
153 "reduction_rate_log2, reduction_rate, and none.",
155 "reduction_rate|reduction_rate_log2|none"));
168 bool has_key =
false;
179 if (extra_col.second.second ==
false)
204 "You specified the key <" +
rate_key +
205 "> to compute convergence rates, but that key does "
206 "not exist in the current table."));
234 const std::string error_file_format =
239 if (error_file_format ==
"tex")
241 else if (error_file_format ==
"txt")
243 else if (error_file_format ==
"gpl")
246 else if (error_file_format ==
"org")
252 std::string(
"Unrecognized file format: ") +
263 const std::string & column_name,
264 const std::function<
double()> &custom_function,
265 const bool compute_rate)