16 #include <deal.II/base/convergence_table.h> 19 DEAL_II_NAMESPACE_OPEN
26 const std::string &reference_column_key,
28 const unsigned int dim)
31 ExcColumnNotExistent(data_column_key));
33 ExcColumnNotExistent(reference_column_key));
35 if (rate_mode ==
none)
42 std::vector<internal::TableEntry> &entries=
columns[data_column_key].entries;
43 std::vector<internal::TableEntry> &ref_entries=
columns[reference_column_key].entries;
44 std::string rate_key = data_column_key+
"...";
46 const unsigned int n = entries.size();
47 const unsigned int n_ref = ref_entries.size();
48 Assert(n == n_ref, ExcDimensionMismatch(n, n_ref));
50 std::vector<double> values(n);
51 std::vector<double> ref_values(n_ref);
53 for (
unsigned int i=0; i<n; ++i)
55 values[i] = entries[i].get_numeric_value();
56 ref_values[i] = ref_entries[i].get_numeric_value();
59 unsigned int no_rate_entries = 0;
66 rate_key +=
"red.rate";
67 no_rate_entries =
columns[rate_key].entries.size();
69 for (
unsigned int i = no_rate_entries; i<n; ++i)
78 add_value(rate_key, values[i-1]/values[i] *
79 ref_values[i]/ref_values[i-1]);
84 rate_key +=
"red.rate.log2";
85 no_rate_entries =
columns[rate_key].entries.size();
87 for (
unsigned int i = no_rate_entries; i<n; ++i)
96 add_value(rate_key, dim*std::log(std::fabs(values[i-1]/values[i])) /
97 std::log(std::fabs(ref_values[i]/ref_values[i-1])));
109 std::string superkey = data_column_key;
117 if (no_rate_entries == 0)
130 Assert(
columns.count(data_column_key), ExcColumnNotExistent(data_column_key));
136 std::vector<internal::TableEntry> &entries =
columns[data_column_key].entries;
137 std::string rate_key=data_column_key+
"...";
139 const unsigned int n=entries.size();
141 std::vector<double> values(n);
142 for (
unsigned int i=0; i<n; ++i)
143 values[i] = entries[i].get_numeric_value();
145 unsigned int no_rate_entries = 0;
153 rate_key+=
"red.rate";
154 no_rate_entries =
columns[rate_key].entries.size();
156 for (
unsigned int i = no_rate_entries; i<n; ++i)
165 add_value(rate_key, values[i-1]/values[i]);
171 rate_key+=
"red.rate.log2";
172 no_rate_entries =
columns[rate_key].entries.size();
174 for (
unsigned int i = no_rate_entries; i<n; ++i)
183 add_value(rate_key, std::log(std::fabs(values[i-1]/values[i]))/std::log(2.0));
197 std::string superkey=data_column_key;
207 if (no_rate_entries == 0)
220 const std::map<std::string, Column>::iterator col_iter=
columns.find(key);
221 col_iter->second.flag=1;
230 for (std::map<std::string, Column>::const_iterator col_iter=
columns.begin();
231 col_iter!=
columns.end(); ++col_iter)
232 if (!col_iter->second.flag)
241 for (std::map<std::string, Column>::const_iterator col_iter=
columns.begin();
242 col_iter!=
columns.end(); ++col_iter)
243 if (!col_iter->second.flag)
247 DEAL_II_NAMESPACE_CLOSE
void set_precision(const std::string &key, const unsigned int precision)
void set_tex_supercaption(const std::string &superkey, const std::string &tex_supercaption)
void add_value(const std::string &key, const T value)
#define AssertThrow(cond, exc)
void add_column_to_supercolumn(const std::string &key, const std::string &superkey)
void omit_column_from_convergence_rate_evaluation(const std::string &key)
void evaluate_all_convergence_rates(const std::string &reference_column_key, const RateMode rate_mode)
#define Assert(cond, exc)
void evaluate_convergence_rates(const std::string &data_column_key, const std::string &reference_column_key, const RateMode rate_mode, const unsigned int dim=2)
std::map< std::string, Column > columns
std::map< std::string, std::vector< std::string > > supercolumns
void set_auto_fill_mode(const bool state)