20 #include "libmesh/adjoint_residual_error_estimator.h"
21 #include "libmesh/error_vector.h"
22 #include "libmesh/patch_recovery_error_estimator.h"
23 #include "libmesh/libmesh_logging.h"
24 #include "libmesh/numeric_vector.h"
25 #include "libmesh/system.h"
26 #include "libmesh/system_norm.h"
27 #include "libmesh/qoi_set.h"
28 #include "libmesh/enum_error_estimator_type.h"
29 #include "libmesh/int_range.h"
30 #include "libmesh/auto_ptr.h"
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();
88 System & system = const_cast<System &>(_system);
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)] =
new ErrorVector;
104 dual_errors_per_cell[std::make_pair(&_system, v)] =
new ErrorVector;
105 total_dual_errors_per_cell[std::make_pair(&_system, v)] =
new 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] +=
191 static_cast<ErrorVectorReal>
193 (*dual_errors_per_cell[std::make_pair(&_system, v)])[e]);
198 total_dual_error_per_cell[e] +=
199 static_cast<ErrorVectorReal>(error_weight * 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]);
270 static_cast<ErrorVectorReal>
275 error_per_cell[i] = primal_error_per_cell[i]*total_dual_error_per_cell[i];
280 if (!error_norm_is_identity)
281 for (
unsigned int v = 0; v <
n_vars; v++)
283 delete primal_errors_per_cell[std::make_pair(&_system, v)];
284 delete dual_errors_per_cell[std::make_pair(&_system, v)];
285 delete total_dual_errors_per_cell[std::make_pair(&_system, v)];