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)];