libMesh::AdjointResidualErrorEstimator Class Reference

#include <adjoint_residual_error_estimator.h>

Inheritance diagram for libMesh::AdjointResidualErrorEstimator:

Public Types

typedef std::map< std::pair< const System *, unsigned int >, ErrorVector * > ErrorMap
 

Public Member Functions

 AdjointResidualErrorEstimator ()
 
 AdjointResidualErrorEstimator (const AdjointResidualErrorEstimator &)=delete
 
AdjointResidualErrorEstimatoroperator= (const AdjointResidualErrorEstimator &)=delete
 
 AdjointResidualErrorEstimator (AdjointResidualErrorEstimator &&)=default
 
AdjointResidualErrorEstimatoroperator= (AdjointResidualErrorEstimator &&)=default
 
virtual ~AdjointResidualErrorEstimator ()=default
 
std::unique_ptr< ErrorEstimator > & primal_error_estimator ()
 
std::unique_ptr< ErrorEstimator > & dual_error_estimator ()
 
QoISetqoi_set ()
 
const QoISetqoi_set () const
 
virtual void estimate_error (const System &system, ErrorVector &error_per_cell, const NumericVector< Number > *solution_vector=nullptr, bool estimate_parent_error=false) override
 
virtual ErrorEstimatorType type () const override
 
virtual void estimate_errors (const EquationSystems &equation_systems, ErrorVector &error_per_cell, const std::map< const System *, SystemNorm > &error_norms, const std::map< const System *, const NumericVector< Number > *> *solution_vectors=nullptr, bool estimate_parent_error=false)
 
virtual void estimate_errors (const EquationSystems &equation_systems, ErrorMap &errors_per_cell, const std::map< const System *, const NumericVector< Number > *> *solution_vectors=nullptr, bool estimate_parent_error=false)
 

Public Attributes

std::string error_plot_suffix
 
SystemNorm error_norm
 

Protected Member Functions

void reduce_error (std::vector< ErrorVectorReal > &error_per_cell, const Parallel::Communicator &comm) const
 

Protected Attributes

std::unique_ptr< ErrorEstimator_primal_error_estimator
 
std::unique_ptr< ErrorEstimator_dual_error_estimator
 
QoISet _qoi_set
 

Detailed Description

This class implements a goal oriented error indicator, by weighting residual-based estimates from the primal problem against estimates from the adjoint problem.

This is based on a trick suggested by Brian Carnes, (first proposed by Babuska and Miller in 1984) but if it doesn't actually work then the misunderstanding or misimplementation will be the fault of Roy Stogner. It's also Roy's fault there's no literature reference here yet.

Author
Roy H. Stogner
Date
2009

Definition at line 50 of file adjoint_residual_error_estimator.h.

Member Typedef Documentation

◆ ErrorMap

typedef std::map<std::pair<const System *, unsigned int>, ErrorVector *> libMesh::ErrorEstimator::ErrorMap
inherited

When calculating many error vectors at once, we need a data structure to hold them all

Definition at line 124 of file error_estimator.h.

Constructor & Destructor Documentation

◆ AdjointResidualErrorEstimator() [1/3]

libMesh::AdjointResidualErrorEstimator::AdjointResidualErrorEstimator ( )

Constructor. Responsible for picking default subestimators.

Definition at line 41 of file adjoint_residual_error_estimator.C.

41  :
44  _primal_error_estimator(new PatchRecoveryErrorEstimator()),
45  _dual_error_estimator(new PatchRecoveryErrorEstimator()),
46  _qoi_set(QoISet())
47 {
48 }
std::unique_ptr< ErrorEstimator > _dual_error_estimator
std::unique_ptr< ErrorEstimator > _primal_error_estimator

◆ AdjointResidualErrorEstimator() [2/3]

libMesh::AdjointResidualErrorEstimator::AdjointResidualErrorEstimator ( const AdjointResidualErrorEstimator )
delete

This class cannot be (default) copy constructed/assigned because it has unique_ptr members. Explicitly deleting these functions is the best way to document this fact.

◆ AdjointResidualErrorEstimator() [3/3]

libMesh::AdjointResidualErrorEstimator::AdjointResidualErrorEstimator ( AdjointResidualErrorEstimator &&  )
default

Defaulted move ctor, move assignment operator, and destructor.

◆ ~AdjointResidualErrorEstimator()

virtual libMesh::AdjointResidualErrorEstimator::~AdjointResidualErrorEstimator ( )
virtualdefault

Member Function Documentation

◆ dual_error_estimator()

std::unique_ptr<ErrorEstimator>& libMesh::AdjointResidualErrorEstimator::dual_error_estimator ( )
inline

Access to the "subestimator" (default: PatchRecovery) to use on the dual/adjoint solution

Definition at line 84 of file adjoint_residual_error_estimator.h.

References _dual_error_estimator.

84 { return _dual_error_estimator; }
std::unique_ptr< ErrorEstimator > _dual_error_estimator

◆ estimate_error()

void libMesh::AdjointResidualErrorEstimator::estimate_error ( const System system,
ErrorVector error_per_cell,
const NumericVector< Number > *  solution_vector = nullptr,
bool  estimate_parent_error = false 
)
overridevirtual

Compute the adjoint-weighted error on each element and place it in the error_per_cell vector.

Note
this->error_norm is ignored; the error estimate is in the seminorm given by the absolute value of the error in the quantity of interest functional. The primal and dual subestimator error_norm values are used, and should be chosen appropriately for your model.

Implements libMesh::ErrorEstimator.

Definition at line 60 of file adjoint_residual_error_estimator.C.

References _dual_error_estimator, _primal_error_estimator, _qoi_set, libMesh::System::adjoint_solve(), libMesh::SystemNorm::calculate_norm(), libMesh::ErrorEstimator::error_norm, error_plot_suffix, libMesh::ErrorVectorReal, libMesh::System::get_adjoint_solution(), libMesh::System::get_equation_systems(), libMesh::System::get_mesh(), libMesh::QoISet::has_index(), libMesh::index_range(), libMesh::System::is_adjoint_already_solved(), libMesh::SystemNorm::is_identity(), mesh, libMesh::System::n_qois(), n_vars, libMesh::System::n_vars(), libMesh::ErrorVector::plot_error(), libMesh::Real, libMesh::System::solution, and libMesh::QoISet::weight().

64 {
65  LOG_SCOPE("estimate_error()", "AdjointResidualErrorEstimator");
66 
67  // The current mesh
68  const MeshBase & mesh = _system.get_mesh();
69 
70  // Resize the error_per_cell vector to be
71  // the number of elements, initialize it to 0.
72  error_per_cell.resize (mesh.max_elem_id());
73  std::fill (error_per_cell.begin(), error_per_cell.end(), 0.);
74 
75  // Get the number of variables in the system
76  unsigned int n_vars = _system.n_vars();
77 
78  // We need to make a map of the pointer to the solution vector
79  std::map<const System *, const NumericVector<Number> *>solutionvecs;
80  solutionvecs[&_system] = _system.solution.get();
81 
82  // Solve the dual problem if we have to
83  if (!_system.is_adjoint_already_solved())
84  {
85  // FIXME - we'll need to change a lot of APIs to make this trick
86  // work with a const System...
87  System & system = const_cast<System &>(_system);
88  system.adjoint_solve(_qoi_set);
89  }
90 
91  // Flag to check whether we have not been asked to weight the variable error contributions in any specific manner
92  bool error_norm_is_identity = error_norm.is_identity();
93 
94  // Create an ErrorMap/ErrorVector to store the primal, dual and total_dual variable errors
95  ErrorMap primal_errors_per_cell;
96  ErrorMap dual_errors_per_cell;
97  ErrorMap total_dual_errors_per_cell;
98  // Allocate ErrorVectors to this map if we're going to use it
99  if (!error_norm_is_identity)
100  for (unsigned int v = 0; v < n_vars; v++)
101  {
102  primal_errors_per_cell[std::make_pair(&_system, v)] = new ErrorVector;
103  dual_errors_per_cell[std::make_pair(&_system, v)] = new ErrorVector;
104  total_dual_errors_per_cell[std::make_pair(&_system, v)] = new ErrorVector;
105  }
106  ErrorVector primal_error_per_cell;
107  ErrorVector dual_error_per_cell;
108  ErrorVector total_dual_error_per_cell;
109 
110  // Have we been asked to weight the variable error contributions in any specific manner
111  if (!error_norm_is_identity) // If we do
112  {
113  // Estimate the primal problem error for each variable
114  _primal_error_estimator->estimate_errors
115  (_system.get_equation_systems(), primal_errors_per_cell, &solutionvecs, estimate_parent_error);
116  }
117  else // If not
118  {
119  // Just get the combined error estimate
120  _primal_error_estimator->estimate_error
121  (_system, primal_error_per_cell, solution_vector, estimate_parent_error);
122  }
123 
124  // Sum and weight the dual error estimate based on our QoISet
125  for (unsigned int i = 0, n_qois = _system.n_qois(); i != n_qois; ++i)
126  {
127  if (_qoi_set.has_index(i))
128  {
129  // Get the weight for the current QoI
130  Real error_weight = _qoi_set.weight(i);
131 
132  // We need to make a map of the pointer to the adjoint solution vector
133  std::map<const System *, const NumericVector<Number> *>adjointsolutionvecs;
134  adjointsolutionvecs[&_system] = &_system.get_adjoint_solution(i);
135 
136  // Have we been asked to weight the variable error contributions in any specific manner
137  if (!error_norm_is_identity) // If we have
138  {
139  _dual_error_estimator->estimate_errors
140  (_system.get_equation_systems(), dual_errors_per_cell, &adjointsolutionvecs,
141  estimate_parent_error);
142  }
143  else // If not
144  {
145  // Just get the combined error estimate
146  _dual_error_estimator->estimate_error
147  (_system, dual_error_per_cell, &(_system.get_adjoint_solution(i)), estimate_parent_error);
148  }
149 
150  std::size_t error_size;
151 
152  // Get the size of the first ErrorMap vector; this will give us the number of elements
153  if (!error_norm_is_identity) // If in non default weights case
154  {
155  error_size = dual_errors_per_cell[std::make_pair(&_system, 0)]->size();
156  }
157  else // If in the standard default weights case
158  {
159  error_size = dual_error_per_cell.size();
160  }
161 
162  // Resize the ErrorVector(s)
163  if (!error_norm_is_identity)
164  {
165  // Loop over variables
166  for (unsigned int v = 0; v < n_vars; v++)
167  {
168  libmesh_assert(!total_dual_errors_per_cell[std::make_pair(&_system, v)]->size() ||
169  total_dual_errors_per_cell[std::make_pair(&_system, v)]->size() == error_size) ;
170  total_dual_errors_per_cell[std::make_pair(&_system, v)]->resize(error_size);
171  }
172  }
173  else
174  {
175  libmesh_assert(!total_dual_error_per_cell.size() ||
176  total_dual_error_per_cell.size() == error_size);
177  total_dual_error_per_cell.resize(error_size);
178  }
179 
180  for (std::size_t e = 0; e != error_size; ++e)
181  {
182  // Have we been asked to weight the variable error contributions in any specific manner
183  if (!error_norm_is_identity) // If we have
184  {
185  // Loop over variables
186  for (unsigned int v = 0; v < n_vars; v++)
187  {
188  // Now fill in total_dual_error ErrorMap with the weight
189  (*total_dual_errors_per_cell[std::make_pair(&_system, v)])[e] +=
190  static_cast<ErrorVectorReal>
191  (error_weight *
192  (*dual_errors_per_cell[std::make_pair(&_system, v)])[e]);
193  }
194  }
195  else // If not
196  {
197  total_dual_error_per_cell[e] +=
198  static_cast<ErrorVectorReal>(error_weight * dual_error_per_cell[e]);
199  }
200  }
201  }
202  }
203 
204  // Do some debugging plots if requested
205  if (!error_plot_suffix.empty())
206  {
207  if (!error_norm_is_identity) // If we have
208  {
209  // Loop over variables
210  for (unsigned int v = 0; v < n_vars; v++)
211  {
212  std::ostringstream primal_out;
213  std::ostringstream dual_out;
214  primal_out << "primal_" << error_plot_suffix << ".";
215  dual_out << "dual_" << error_plot_suffix << ".";
216 
217  primal_out << std::setw(1)
218  << std::setprecision(0)
219  << std::setfill('0')
220  << std::right
221  << v;
222 
223  dual_out << std::setw(1)
224  << std::setprecision(0)
225  << std::setfill('0')
226  << std::right
227  << v;
228 
229  (*primal_errors_per_cell[std::make_pair(&_system, v)]).plot_error(primal_out.str(), _system.get_mesh());
230  (*total_dual_errors_per_cell[std::make_pair(&_system, v)]).plot_error(dual_out.str(), _system.get_mesh());
231 
232  primal_out.clear();
233  dual_out.clear();
234  }
235  }
236  else // If not
237  {
238  std::ostringstream primal_out;
239  std::ostringstream dual_out;
240  primal_out << "primal_" << error_plot_suffix ;
241  dual_out << "dual_" << error_plot_suffix ;
242 
243  primal_error_per_cell.plot_error(primal_out.str(), _system.get_mesh());
244  total_dual_error_per_cell.plot_error(dual_out.str(), _system.get_mesh());
245 
246  primal_out.clear();
247  dual_out.clear();
248  }
249  }
250 
251  // Weight the primal error by the dual error using the system norm object
252  // FIXME: we ought to thread this
253  for (auto i : index_range(error_per_cell))
254  {
255  // Have we been asked to weight the variable error contributions in any specific manner
256  if (!error_norm_is_identity) // If we do
257  {
258  // Create Error Vectors to pass to calculate_norm
259  std::vector<Real> cell_primal_error;
260  std::vector<Real> cell_dual_error;
261 
262  for (unsigned int v = 0; v < n_vars; v++)
263  {
264  cell_primal_error.push_back((*primal_errors_per_cell[std::make_pair(&_system, v)])[i]);
265  cell_dual_error.push_back((*total_dual_errors_per_cell[std::make_pair(&_system, v)])[i]);
266  }
267 
268  error_per_cell[i] =
269  static_cast<ErrorVectorReal>
270  (error_norm.calculate_norm(cell_primal_error, cell_dual_error));
271  }
272  else // If not
273  {
274  error_per_cell[i] = primal_error_per_cell[i]*total_dual_error_per_cell[i];
275  }
276  }
277 
278  // Deallocate the ErrorMap contents if we allocated them earlier
279  if (!error_norm_is_identity)
280  for (unsigned int v = 0; v < n_vars; v++)
281  {
282  delete primal_errors_per_cell[std::make_pair(&_system, v)];
283  delete dual_errors_per_cell[std::make_pair(&_system, v)];
284  delete total_dual_errors_per_cell[std::make_pair(&_system, v)];
285  }
286 }
MeshBase & mesh
IntRange< std::size_t > index_range(const std::vector< T > &vec)
Definition: int_range.h:104
const unsigned int n_vars
Definition: tecplot_io.C:69
DIE A HORRIBLE DEATH HERE typedef float ErrorVectorReal
bool has_index(std::size_t) const
Definition: qoi_set.h:221
std::map< std::pair< const System *, unsigned int >, ErrorVector * > ErrorMap
std::unique_ptr< ErrorEstimator > _dual_error_estimator
Real weight(std::size_t) const
Definition: qoi_set.h:240
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real calculate_norm(const std::vector< Real > &v)
Definition: system_norm.C:230
std::unique_ptr< ErrorEstimator > _primal_error_estimator

◆ estimate_errors() [1/2]

void libMesh::ErrorEstimator::estimate_errors ( const EquationSystems equation_systems,
ErrorVector error_per_cell,
const std::map< const System *, SystemNorm > &  error_norms,
const std::map< const System *, const NumericVector< Number > *> *  solution_vectors = nullptr,
bool  estimate_parent_error = false 
)
virtualinherited

This virtual function can be redefined in derived classes, but by default computes the sum of the error_per_cell for each system in the equation_systems.

Currently this function ignores the error_norm member variable, and uses the function argument error_norms instead.

This function is named estimate_errors instead of estimate_error because otherwise C++ can get confused.

Reimplemented in libMesh::UniformRefinementEstimator.

Definition at line 47 of file error_estimator.C.

References libMesh::ErrorEstimator::error_norm, libMesh::ErrorEstimator::estimate_error(), libMesh::EquationSystems::get_system(), libMesh::index_range(), and libMesh::EquationSystems::n_systems().

52 {
53  SystemNorm old_error_norm = this->error_norm;
54 
55  // Sum the error values from each system
56  for (unsigned int s = 0; s != equation_systems.n_systems(); ++s)
57  {
58  ErrorVector system_error_per_cell;
59  const System & sys = equation_systems.get_system(s);
60  if (error_norms.find(&sys) == error_norms.end())
61  this->error_norm = old_error_norm;
62  else
63  this->error_norm = error_norms.find(&sys)->second;
64 
65  const NumericVector<Number> * solution_vector = nullptr;
66  if (solution_vectors &&
67  solution_vectors->find(&sys) != solution_vectors->end())
68  solution_vector = solution_vectors->find(&sys)->second;
69 
70  this->estimate_error(sys, system_error_per_cell,
71  solution_vector, estimate_parent_error);
72 
73  if (s)
74  {
75  libmesh_assert_equal_to (error_per_cell.size(), system_error_per_cell.size());
76  for (auto i : index_range(error_per_cell))
77  error_per_cell[i] += system_error_per_cell[i];
78  }
79  else
80  error_per_cell = system_error_per_cell;
81  }
82 
83  // Restore our old state before returning
84  this->error_norm = old_error_norm;
85 }
IntRange< std::size_t > index_range(const std::vector< T > &vec)
Definition: int_range.h:104
virtual void estimate_error(const System &system, ErrorVector &error_per_cell, const NumericVector< Number > *solution_vector=nullptr, bool estimate_parent_error=false)=0

◆ estimate_errors() [2/2]

void libMesh::ErrorEstimator::estimate_errors ( const EquationSystems equation_systems,
ErrorMap errors_per_cell,
const std::map< const System *, const NumericVector< Number > *> *  solution_vectors = nullptr,
bool  estimate_parent_error = false 
)
virtualinherited

This virtual function can be redefined in derived classes, but by default it calls estimate_error repeatedly to calculate the requested error vectors.

Currently this function ignores the error_norm.weight() values because it calculates each variable's error individually, unscaled.

The user selects which errors get computed by filling a map with error vectors: If errors_per_cell[&system][v] exists, it will be filled with the error values in variable v of system

FIXME: This is a default implementation - derived classes should reimplement it for efficiency.

Reimplemented in libMesh::UniformRefinementEstimator.

Definition at line 93 of file error_estimator.C.

References libMesh::ErrorEstimator::error_norm, libMesh::ErrorEstimator::estimate_error(), libMesh::EquationSystems::get_system(), libMesh::EquationSystems::n_systems(), n_vars, libMesh::System::n_vars(), and libMesh::SystemNorm::type().

97 {
98  SystemNorm old_error_norm = this->error_norm;
99 
100  // Find the requested error values from each system
101  for (unsigned int s = 0; s != equation_systems.n_systems(); ++s)
102  {
103  const System & sys = equation_systems.get_system(s);
104 
105  unsigned int n_vars = sys.n_vars();
106 
107  for (unsigned int v = 0; v != n_vars; ++v)
108  {
109  // Only fill in ErrorVectors the user asks for
110  if (errors_per_cell.find(std::make_pair(&sys, v)) ==
111  errors_per_cell.end())
112  continue;
113 
114  // Calculate error in only one variable
115  std::vector<Real> weights(n_vars, 0.0);
116  weights[v] = 1.0;
117  this->error_norm =
118  SystemNorm(std::vector<FEMNormType>(n_vars, old_error_norm.type(v)),
119  weights);
120 
121  const NumericVector<Number> * solution_vector = nullptr;
122  if (solution_vectors &&
123  solution_vectors->find(&sys) != solution_vectors->end())
124  solution_vector = solution_vectors->find(&sys)->second;
125 
126  this->estimate_error
127  (sys, *errors_per_cell[std::make_pair(&sys, v)],
128  solution_vector, estimate_parent_error);
129  }
130  }
131 
132  // Restore our old state before returning
133  this->error_norm = old_error_norm;
134 }
virtual void estimate_error(const System &system, ErrorVector &error_per_cell, const NumericVector< Number > *solution_vector=nullptr, bool estimate_parent_error=false)=0
const unsigned int n_vars
Definition: tecplot_io.C:69

◆ operator=() [1/2]

AdjointResidualErrorEstimator& libMesh::AdjointResidualErrorEstimator::operator= ( const AdjointResidualErrorEstimator )
delete

◆ operator=() [2/2]

AdjointResidualErrorEstimator& libMesh::AdjointResidualErrorEstimator::operator= ( AdjointResidualErrorEstimator &&  )
default

◆ primal_error_estimator()

std::unique_ptr<ErrorEstimator>& libMesh::AdjointResidualErrorEstimator::primal_error_estimator ( )
inline

Access to the "subestimator" (default: PatchRecovery) to use on the primal/forward solution

Definition at line 78 of file adjoint_residual_error_estimator.h.

References _primal_error_estimator.

78 { return _primal_error_estimator; }
std::unique_ptr< ErrorEstimator > _primal_error_estimator

◆ qoi_set() [1/2]

QoISet& libMesh::AdjointResidualErrorEstimator::qoi_set ( )
inline

Access to the QoISet (default: weight all QoIs equally) to use when computing errors

Definition at line 90 of file adjoint_residual_error_estimator.h.

References _qoi_set.

◆ qoi_set() [2/2]

const QoISet& libMesh::AdjointResidualErrorEstimator::qoi_set ( ) const
inline

Access to the QoISet (default: weight all QoIs equally) to use when computing errors

Definition at line 96 of file adjoint_residual_error_estimator.h.

References _qoi_set.

◆ reduce_error()

void libMesh::ErrorEstimator::reduce_error ( std::vector< ErrorVectorReal > &  error_per_cell,
const Parallel::Communicator comm 
) const
protectedinherited

This method takes the local error contributions in error_per_cell from each processor and combines them to get the global error vector.

Definition at line 32 of file error_estimator.C.

References libMesh::Parallel::Communicator::sum().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), and libMesh::ExactErrorEstimator::estimate_error().

34 {
35  // This function must be run on all processors at once
36  // parallel_object_only();
37 
38  // Each processor has now computed the error contributions
39  // for its local elements. We may need to sum the vector to
40  // recover the error for each element.
41 
42  comm.sum(error_per_cell);
43 }

◆ type()

ErrorEstimatorType libMesh::AdjointResidualErrorEstimator::type ( ) const
overridevirtual
Returns
The type for the ErrorEstimator subclass.

Implements libMesh::ErrorEstimator.

Definition at line 53 of file adjoint_residual_error_estimator.C.

References libMesh::ADJOINT_RESIDUAL.

Member Data Documentation

◆ _dual_error_estimator

std::unique_ptr<ErrorEstimator> libMesh::AdjointResidualErrorEstimator::_dual_error_estimator
protected

An error estimator for the adjoint problem

Definition at line 134 of file adjoint_residual_error_estimator.h.

Referenced by dual_error_estimator(), and estimate_error().

◆ _primal_error_estimator

std::unique_ptr<ErrorEstimator> libMesh::AdjointResidualErrorEstimator::_primal_error_estimator
protected

An error estimator for the forward problem

Definition at line 129 of file adjoint_residual_error_estimator.h.

Referenced by estimate_error(), and primal_error_estimator().

◆ _qoi_set

QoISet libMesh::AdjointResidualErrorEstimator::_qoi_set
protected

A QoISet to handle cases with multiple QoIs available

Definition at line 139 of file adjoint_residual_error_estimator.h.

Referenced by estimate_error(), and qoi_set().

◆ error_norm

SystemNorm libMesh::ErrorEstimator::error_norm
inherited

When estimating the error in a single system, the error_norm is used to control the scaling and norm choice for each variable. Not all estimators will support all norm choices. The default scaling is for all variables to be weighted equally. The default norm choice depends on the error estimator.

Part of this functionality was supported via component_scale and sobolev_order in older libMesh versions, and a small part was supported via component_mask in even older versions. Hopefully the encapsulation here will allow us to avoid changing this API again.

Definition at line 161 of file error_estimator.h.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::AdjointRefinementEstimator::AdjointRefinementEstimator(), libMesh::DiscontinuityMeasure::boundary_side_integration(), libMesh::KellyErrorEstimator::boundary_side_integration(), libMesh::DiscontinuityMeasure::DiscontinuityMeasure(), libMesh::JumpErrorEstimator::estimate_error(), estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::ErrorEstimator::estimate_errors(), libMesh::ExactErrorEstimator::ExactErrorEstimator(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::LaplacianErrorEstimator::init_context(), libMesh::DiscontinuityMeasure::init_context(), libMesh::KellyErrorEstimator::init_context(), libMesh::LaplacianErrorEstimator::internal_side_integration(), libMesh::DiscontinuityMeasure::internal_side_integration(), libMesh::KellyErrorEstimator::internal_side_integration(), libMesh::KellyErrorEstimator::KellyErrorEstimator(), libMesh::LaplacianErrorEstimator::LaplacianErrorEstimator(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::PatchRecoveryErrorEstimator(), libMesh::JumpErrorEstimator::reinit_sides(), and libMesh::UniformRefinementEstimator::UniformRefinementEstimator().

◆ error_plot_suffix

std::string libMesh::AdjointResidualErrorEstimator::error_plot_suffix

To aid in investigating error estimator behavior, set this string to a suffix with which to plot (prefixed by "primal_" or "dual_") the subestimator results. The suffix should end with a file extension (e.g. ".gmv") that the ErrorVector::plot_error recognizes.

Definition at line 105 of file adjoint_residual_error_estimator.h.

Referenced by estimate_error().


The documentation for this class was generated from the following files: