64 bool estimate_parent_error)
66 LOG_SCOPE(
"estimate_error()",
"AdjointResidualErrorEstimator");
73 error_per_cell.resize (
mesh.max_elem_id());
74 std::fill (error_per_cell.begin(), error_per_cell.end(), 0.);
80 std::map<const System *, const NumericVector<Number> *>solutionvecs;
81 solutionvecs[&_system] = _system.
solution.get();
100 if (!error_norm_is_identity)
101 for (
unsigned int v = 0; v <
n_vars; v++)
103 primal_errors_per_cell[std::make_pair(&_system, v)] = std::make_unique<ErrorVector>();
104 dual_errors_per_cell[std::make_pair(&_system, v)] = std::make_unique<ErrorVector>();
105 total_dual_errors_per_cell[std::make_pair(&_system, v)] = std::make_unique<ErrorVector>();
112 if (!error_norm_is_identity)
122 (_system, primal_error_per_cell, solution_vector, estimate_parent_error);
126 for (
unsigned int i = 0, n_qois = _system.
n_qois(); i != n_qois; ++i)
134 std::map<const System *, const NumericVector<Number> *>adjointsolutionvecs;
138 if (!error_norm_is_identity)
142 estimate_parent_error);
151 std::size_t error_size;
154 if (!error_norm_is_identity)
156 error_size = dual_errors_per_cell[std::make_pair(&_system, 0)]->
size();
160 error_size = dual_error_per_cell.size();
164 if (!error_norm_is_identity)
167 for (
unsigned int v = 0; v <
n_vars; v++)
169 libmesh_assert(!total_dual_errors_per_cell[std::make_pair(&_system, v)]->size() ||
170 total_dual_errors_per_cell[std::make_pair(&_system, v)]->size() == error_size) ;
171 total_dual_errors_per_cell[std::make_pair(&_system, v)]->resize(error_size);
177 total_dual_error_per_cell.size() == error_size);
178 total_dual_error_per_cell.resize(error_size);
181 for (std::size_t e = 0; e != error_size; ++e)
184 if (!error_norm_is_identity)
187 for (
unsigned int v = 0; v <
n_vars; v++)
190 (*total_dual_errors_per_cell[std::make_pair(&_system, v)])[e] +=
193 (*dual_errors_per_cell[std::make_pair(&_system, v)])[e]);
198 total_dual_error_per_cell[e] +=
208 if (!error_norm_is_identity)
211 for (
unsigned int v = 0; v <
n_vars; v++)
213 std::ostringstream primal_out;
214 std::ostringstream dual_out;
218 primal_out << std::setw(1)
219 << std::setprecision(0)
224 dual_out << std::setw(1)
225 << std::setprecision(0)
230 primal_errors_per_cell[std::make_pair(&_system, v)]->
plot_error(primal_out.str(), _system.
get_mesh());
231 total_dual_errors_per_cell[std::make_pair(&_system, v)]->plot_error(dual_out.str(), _system.
get_mesh());
239 std::ostringstream primal_out;
240 std::ostringstream dual_out;
257 if (!error_norm_is_identity)
260 std::vector<Real> cell_primal_error;
261 std::vector<Real> cell_dual_error;
263 for (
unsigned int v = 0; v <
n_vars; v++)
265 cell_primal_error.push_back((*primal_errors_per_cell[std::make_pair(&_system, v)])[i]);
266 cell_dual_error.push_back((*total_dual_errors_per_cell[std::make_pair(&_system, v)])[i]);
275 error_per_cell[i] = primal_error_per_cell[i]*total_dual_error_per_cell[i];