19 #include "libmesh/libmesh_config.h" 21 #include "libmesh/fourth_error_estimators.h" 23 #include "libmesh/enum_error_estimator_type.h" 25 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 28 #include "libmesh/libmesh_common.h" 29 #include "libmesh/error_vector.h" 30 #include "libmesh/fe_base.h" 31 #include "libmesh/libmesh_logging.h" 32 #include "libmesh/elem.h" 33 #include "libmesh/system.h" 34 #include "libmesh/dense_vector.h" 35 #include "libmesh/tensor_tools.h" 36 #include "libmesh/enum_norm_type.h" 67 for (
unsigned int v=0; v<
n_vars; v++)
73 FEBase * side_fe =
nullptr;
75 const std::set<unsigned char> & elem_dims =
78 for (
const auto &
dim : elem_dims)
99 unsigned short dim = fine_elem.
dim();
101 FEBase * fe_fine =
nullptr;
104 FEBase * fe_coarse =
nullptr;
110 const std::vector<std::vector<RealTensor>> & d2phi_coarse = fe_coarse->
get_d2phi();
111 const std::vector<std::vector<RealTensor>> & d2phi_fine = fe_fine->
get_d2phi();
112 const std::vector<Real> & JxW_face = fe_fine->
get_JxW();
114 for (
unsigned int qp=0; qp != n_qp; ++qp)
118 Number laplacian_fine = 0., laplacian_coarse = 0.;
120 const unsigned int n_coarse_dofs = Ucoarse.
size();
121 for (
unsigned int i=0; i != n_coarse_dofs; ++i)
123 laplacian_coarse += d2phi_coarse[i][qp](0,0) * Ucoarse(i);
125 laplacian_coarse += d2phi_coarse[i][qp](1,1) * Ucoarse(i);
127 laplacian_coarse += d2phi_coarse[i][qp](2,2) * Ucoarse(i);
130 const unsigned int n_fine_dofs = Ufine.
size();
131 for (
unsigned int i=0; i != n_fine_dofs; ++i)
133 laplacian_fine += d2phi_fine[i][qp](0,0) * Ufine(i);
135 laplacian_fine += d2phi_fine[i][qp](1,1) * Ufine(i);
137 laplacian_fine += d2phi_fine[i][qp](2,2) * Ufine(i);
143 const Number jump = laplacian_fine - laplacian_coarse;
147 error += JxW_face[qp] * jump2;
159 #else // defined (LIBMESH_ENABLE_SECOND_DERIVATIVES) 167 libmesh_error_msg(
"Error: LaplacianErrorEstimator requires second " \
168 <<
"derivative support; try configuring libmesh with " \
169 <<
"--enable-second");
186 #endif // defined (LIBMESH_ENABLE_SECOND_DERIVATIVES) void get_side_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for edge/face (2D/3D) finite element object for variable var for the largest dimension in th...
SystemNorm error_norm
When estimating the error in a single system, the error_norm is used to control the scaling and norm ...
virtual void internal_side_integration() override
The function which calculates a laplacian jump based error term on an internal side.
std::unique_ptr< FEMContext > fine_context
Context objects for integrating on the fine and coarse elements sharing a face.
ErrorEstimatorType
Defines an enum for the different types of error estimators which are available.
This abstract base class implements utility functions for error estimators which are based on integra...
This is the base class from which all geometric element types are derived.
The libMesh namespace provides an interface to certain functionality in the library.
virtual Real hmax() const
virtual unsigned int n_quadrature_points() const
virtual_for_inffe const std::vector< Real > & get_JxW() const
This class provides all data required for a physics package (e.g.
const std::vector< std::vector< OutputTensor > > & get_d2phi() const
std::unique_ptr< FEMContext > coarse_context
Real fine_error
The fine and coarse error values to be set by each side_integration();.
virtual void init_context(FEMContext &c) override
An initialization function, for requesting specific data from the FE objects.
Real weight(unsigned int var) const
virtual ErrorEstimatorType type() const override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
LaplacianErrorEstimator()
Constructor.
virtual unsigned short dim() const =0
unsigned int var
The variable number currently being evaluated.
virtual unsigned int size() const override final
unsigned int n_vars() const
Number of variables in solution.
This class forms the foundation from which generic finite elements may be derived.
const std::set< unsigned char > & elem_dimensions() const