This class encapsulate all functionality required for assembling and solving a linear elastic model with contact.
More...
#include <linear_elasticity_with_contact.h>
|
| LinearElasticityWithContact (NonlinearImplicitSystem &sys_in, Real contact_penalty_in) |
| Constructor. More...
|
|
void | set_contact_penalty (Real contact_penalty_in) |
| Update the penalty parameter. More...
|
|
Real | get_contact_penalty () const |
| Get the penalty parameter. More...
|
|
Real | kronecker_delta (unsigned int i, unsigned int j) |
| Kronecker delta function. More...
|
|
Real | elasticity_tensor (Real young_modulus, Real poisson_ratio, unsigned int i, unsigned int j, unsigned int k, unsigned int l) |
| Evaluate the fourth order tensor (C_ijkl) that relates stress to strain. More...
|
|
void | move_mesh (MeshBase &input_mesh, const NumericVector< Number > &input_solution) |
| Move the mesh nodes of input_mesh based on the displacement field in input_solution. More...
|
|
void | initialize_contact_load_paths () |
| Set up the load paths on the contact surfaces. More...
|
|
void | add_contact_edge_elements () |
| Add edge elements into the mesh based on the contact load paths. More...
|
|
virtual void | residual_and_jacobian (const NumericVector< Number > &soln, NumericVector< Number > *residual, SparseMatrix< Number > *jacobian, NonlinearImplicitSystem &) |
| Evaluate the Jacobian of the nonlinear system. More...
|
|
void | compute_stresses () |
| Compute the Cauchy stress for the current solution. More...
|
|
std::pair< Real, Real > | update_lambdas () |
| Update the lambda parameters in the augmented Lagrangian method. More...
|
|
std::pair< Real, Real > | get_least_and_max_gap_function () |
|
This class encapsulate all functionality required for assembling and solving a linear elastic model with contact.
Definition at line 31 of file linear_elasticity_with_contact.h.
◆ LinearElasticityWithContact()
LinearElasticityWithContact::LinearElasticityWithContact |
( |
NonlinearImplicitSystem & |
sys_in, |
|
|
Real |
contact_penalty_in |
|
) |
| |
◆ add_contact_edge_elements()
void LinearElasticityWithContact::add_contact_edge_elements |
( |
| ) |
|
Add edge elements into the mesh based on the contact load paths.
This ensure proper parallel communication of data, e.g. if a node on one side of the contact surface has a constraint on it, then adding contact elements into the mesh ensures that the constraint will be enforced properly.
Definition at line 207 of file linear_elasticity_with_contact.C.
213 for( ; it != it_end ; ++it )
222 connector_elem->
set_node(0) = &master_node;
223 connector_elem->
set_node(1) = &slave_node;
References _contact_node_map, _sys, libMesh::MeshBase::add_elem(), libMesh::System::get_mesh(), mesh, libMesh::MeshBase::node_ref(), libMesh::MeshBase::prepare_for_use(), libMesh::Elem::set_node(), and libMesh::Elem::subdomain_id().
◆ compute_stresses()
void LinearElasticityWithContact::compute_stresses |
( |
| ) |
|
Compute the Cauchy stress for the current solution.
Definition at line 481 of file linear_elasticity_with_contact.C.
490 unsigned int displacement_vars[3];
498 std::unique_ptr<FEBase> fe (FEBase::build(
dim, fe_type));
500 fe->attach_quadrature_rule (&qrule);
502 const std::vector<Real> & JxW = fe->get_JxW();
503 const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
508 unsigned int sigma_vars[6];
515 unsigned int vonMises_var = stress_system.
variable_number (
"vonMises");
518 std::vector<std::vector<dof_id_type>> dof_indices_var(
_sys.
n_vars());
519 std::vector<dof_id_type> stress_dof_indices_var;
526 if( elem->type() ==
EDGE2 )
532 for (
unsigned int var=0; var<3; var++)
533 dof_map.
dof_indices (elem, dof_indices_var[var], displacement_vars[var]);
535 const unsigned int n_var_dofs = dof_indices_var[0].size();
540 elem_avg_stress_tensor.resize(3, 3);
542 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
546 for (
unsigned int var_i=0; var_i<3; var_i++)
547 for (
unsigned int var_j=0; var_j<3; var_j++)
548 for (
unsigned int j=0; j<n_var_dofs; j++)
549 grad_u(var_i, var_j) +=
553 for (
unsigned int i=0; i<3; i++)
554 for (
unsigned int j=0; j<3; j++)
555 for (
unsigned int k=0; k<3; k++)
556 for (
unsigned int l=0; l<3; l++)
557 stress_tensor(i,j) +=
562 elem_avg_stress_tensor.add(JxW[qp], stress_tensor);
566 elem_avg_stress_tensor.scale(1./elem->volume());
569 unsigned int stress_var_index = 0;
570 for (
unsigned int i=0; i<3; i++)
571 for (
unsigned int j=i; j<3; j++)
573 stress_dof_map.dof_indices (elem, stress_dof_indices_var, sigma_vars[stress_var_index]);
579 if ((stress_system.
solution->first_local_index() <= dof_index) &&
580 (dof_index < stress_system.solution->last_local_index()))
581 stress_system.
solution->set(dof_index, elem_avg_stress_tensor(i,j));
587 Number vonMises_value =
std::sqrt(0.5*(
pow(elem_avg_stress_tensor(0,0) - elem_avg_stress_tensor(1,1), 2.) +
588 pow(elem_avg_stress_tensor(1,1) - elem_avg_stress_tensor(2,2), 2.) +
589 pow(elem_avg_stress_tensor(2,2) - elem_avg_stress_tensor(0,0), 2.) +
590 6.*(
pow(elem_avg_stress_tensor(0,1), 2.) +
591 pow(elem_avg_stress_tensor(1,2), 2.) +
592 pow(elem_avg_stress_tensor(2,0), 2.))));
594 stress_dof_map.dof_indices (elem, stress_dof_indices_var, vonMises_var);
597 if ((stress_system.
solution->first_local_index() <= dof_index) &&
598 (dof_index < stress_system.solution->last_local_index()))
599 stress_system.
solution->set(dof_index, vonMises_value);
References _sys, libMesh::MeshBase::active_local_element_ptr_range(), libMesh::DenseMatrix< T >::add(), libMesh::System::current_solution(), libMesh::FEType::default_quadrature_order(), dim, libMesh::DofMap::dof_indices(), libMesh::EDGE2, elasticity_tensor(), libMesh::Parameters::get(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::System::get_mesh(), libMesh::EquationSystems::get_system(), mesh, libMesh::MeshBase::mesh_dimension(), libMesh::System::n_vars(), libMesh::EquationSystems::parameters, std::pow(), libMesh::Real, libMesh::DenseMatrix< T >::resize(), libMesh::DenseMatrix< T >::scale(), libMesh::System::solution, std::sqrt(), libMesh::System::update(), libMesh::System::variable_number(), and libMesh::DofMap::variable_type().
◆ elasticity_tensor()
Real LinearElasticityWithContact::elasticity_tensor |
( |
Real |
young_modulus, |
|
|
Real |
poisson_ratio, |
|
|
unsigned int |
i, |
|
|
unsigned int |
j, |
|
|
unsigned int |
k, |
|
|
unsigned int |
l |
|
) |
| |
◆ get_contact_penalty()
Real LinearElasticityWithContact::get_contact_penalty |
( |
| ) |
const |
◆ get_least_and_max_gap_function()
std::pair< Real, Real > LinearElasticityWithContact::get_least_and_max_gap_function |
( |
| ) |
|
◆ initialize_contact_load_paths()
void LinearElasticityWithContact::initialize_contact_load_paths |
( |
| ) |
|
Set up the load paths on the contact surfaces.
Definition at line 142 of file linear_elasticity_with_contact.C.
146 std::vector<dof_id_type> nodes_on_lower_surface;
147 std::vector<dof_id_type> nodes_on_upper_surface;
151 for (
auto side : elem->side_index_range())
152 if (elem->neighbor_ptr(side) ==
nullptr)
154 bool on_lower_contact_surface =
157 bool on_upper_contact_surface =
160 if (on_lower_contact_surface && on_upper_contact_surface)
161 libmesh_error_msg(
"Should not be on both surfaces at the same time");
163 if (on_lower_contact_surface || on_upper_contact_surface)
165 for (
auto node_index : elem->node_index_range())
166 if (elem->is_node_on_side(node_index, side))
168 if (on_lower_contact_surface)
169 nodes_on_lower_surface.push_back(elem->node_id(node_index));
172 _lambdas[elem->node_id(node_index)] = 0.;
173 nodes_on_upper_surface.push_back(elem->node_id(node_index));
180 libmesh_assert(nodes_on_lower_surface.size() == nodes_on_upper_surface.size());
184 for (std::size_t i=0; i<nodes_on_lower_surface.size(); i++)
186 dof_id_type lower_node_id = nodes_on_lower_surface[i];
189 Real min_distance = std::numeric_limits<Real>::max();
191 for (std::size_t j=0; j<nodes_on_upper_surface.size(); j++)
193 dof_id_type upper_node_id = nodes_on_upper_surface[j];
References _contact_node_map, _lambdas, _sys, libMesh::MeshBase::active_element_ptr_range(), distance(), libMesh::MeshBase::get_boundary_info(), libMesh::System::get_mesh(), libMesh::BoundaryInfo::has_boundary_id(), libMesh::libmesh_assert(), mesh, std::norm(), libMesh::MeshBase::point(), and libMesh::Real.
◆ kronecker_delta()
Real LinearElasticityWithContact::kronecker_delta |
( |
unsigned int |
i, |
|
|
unsigned int |
j |
|
) |
| |
◆ move_mesh()
void LinearElasticityWithContact::move_mesh |
( |
MeshBase & |
input_mesh, |
|
|
const NumericVector< Number > & |
input_solution |
|
) |
| |
Move the mesh nodes of input_mesh based on the displacement field in input_solution.
Definition at line 71 of file linear_elasticity_with_contact.C.
75 std::unordered_set<dof_id_type> encountered_node_ids;
79 std::unique_ptr<NumericVector<Number>> localized_input_solution =
82 localized_input_solution->
init (input_solution.
size(),
false,
SERIAL);
83 input_solution.
localize(*localized_input_solution);
89 for (
auto node_id : elem->node_index_range())
91 Node & node = elem->node_ref(node_id);
93 if (encountered_node_ids.find(node.
id()) != encountered_node_ids.end())
96 encountered_node_ids.insert(node.
id());
98 std::vector<std::string> uvw_names(3);
104 const Point master_point = elem->master_point(node_id);
107 for (std::size_t index=0; index<uvw_names.size(); index++)
114 FEInterface::compute_data(elem->dim(),
119 std::vector<dof_id_type> dof_indices_var;
122 for (std::size_t i=0; i<dof_indices_var.size(); i++)
124 Number value = (*localized_input_solution)(dof_indices_var[i]) *
data.shape[i];
126 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
128 uvw(index) +=
value.real();
References _sys, libMesh::MeshBase::active_element_ptr_range(), libMesh::ParallelObject::comm(), data, libMesh::DofMap::dof_indices(), libMesh::MeshBase::elem_ptr(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::System::get_mesh(), libMesh::DofObject::id(), libMesh::NumericVector< T >::init(), libMesh::NumericVector< T >::localize(), libMesh::SERIAL, libMesh::NumericVector< T >::size(), value, libMesh::System::variable_number(), and libMesh::DofMap::variable_type().
Referenced by get_least_and_max_gap_function(), and residual_and_jacobian().
◆ residual_and_jacobian()
Evaluate the Jacobian of the nonlinear system.
Definition at line 231 of file linear_elasticity_with_contact.C.
248 std::unique_ptr<FEBase> fe (FEBase::build(
dim, fe_type));
250 fe->attach_quadrature_rule (&qrule);
252 std::unique_ptr<FEBase> fe_face (FEBase::build(
dim, fe_type));
254 fe_face->attach_quadrature_rule (&qface);
256 std::unique_ptr<FEBase> fe_neighbor_face (FEBase::build(
dim, fe_type));
257 fe_neighbor_face->attach_quadrature_rule (&qface);
259 const std::vector<Real> & JxW = fe->get_JxW();
260 const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
284 std::vector<dof_id_type> dof_indices;
285 std::vector<std::vector<dof_id_type>> dof_indices_var(3);
289 if( elem->type() ==
EDGE2 )
297 for (
unsigned int var=0; var<3; var++)
298 dof_map.
dof_indices (elem, dof_indices_var[var], var);
300 const unsigned int n_dofs = dof_indices.size();
301 const unsigned int n_var_dofs = dof_indices_var[0].size();
306 for (
unsigned int var=0; var<3; var++)
307 Re_var[var].reposition (var*n_var_dofs, n_var_dofs);
309 Ke.
resize (n_dofs, n_dofs);
310 for (
unsigned int var_i=0; var_i<3; var_i++)
311 for (
unsigned int var_j=0; var_j<3; var_j++)
312 Ke_var[var_i][var_j].reposition (var_i*n_var_dofs, var_j*n_var_dofs, n_var_dofs, n_var_dofs);
314 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
318 for (
unsigned int var_i=0; var_i<3; var_i++)
319 for (
unsigned int var_j=0; var_j<3; var_j++)
320 for (
unsigned int j=0; j<n_var_dofs; j++)
321 grad_u(var_i, var_j) += dphi[j][qp](var_j)*soln(dof_indices_var[var_i][j]);
324 for (
unsigned int dof_i=0; dof_i<n_var_dofs; dof_i++)
325 for (
unsigned int i=0; i<3; i++)
326 for (
unsigned int j=0; j<3; j++)
327 for (
unsigned int k=0; k<3; k++)
328 for (
unsigned int l=0; l<3; l++)
329 Re_var[i](dof_i) -= JxW[qp] *
330 elasticity_tensor(young_modulus, poisson_ratio, i, j, k, l) * grad_u(k,l) * dphi[dof_i][qp](j);
333 for (
unsigned int dof_i=0; dof_i<n_var_dofs; dof_i++)
334 for (
unsigned int dof_j=0; dof_j<n_var_dofs; dof_j++)
335 for (
unsigned int i=0; i<3; i++)
336 for (
unsigned int j=0; j<3; j++)
337 for (
unsigned int k=0; k<3; k++)
338 for (
unsigned int l=0; l<3; l++)
339 Ke_var[i][k](dof_i, dof_j) -= JxW[qp] *
340 elasticity_tensor(young_modulus, poisson_ratio, i, j, k, l) * dphi[dof_j][qp](l) * dphi[dof_i][qp](j);
358 std::unique_ptr<MeshBase> mesh_clone =
mesh.
clone();
368 for ( ; it != it_end; ++it)
373 Point upper_to_lower;
375 Point lower_node_moved = mesh_clone->point(lower_point_id);
376 Point upper_node_moved = mesh_clone->point(upper_point_id);
378 upper_to_lower = (lower_node_moved - upper_node_moved);
384 Point contact_force_direction(0., 0., 1.);
389 Real gap_function = upper_to_lower * contact_force_direction;
393 Real lambda_plus_penalty =
396 if (lambda_plus_penalty < 0.)
397 lambda_plus_penalty = 0.;
405 std::vector<dof_id_type> dof_indices_on_lower_node(3);
406 std::vector<dof_id_type> dof_indices_on_upper_node(3);
410 for (
unsigned int var=0; var<3; var++)
413 lower_contact_force_vec(var) = -lambda_plus_penalty * contact_force_direction(var);
416 upper_contact_force_vec(var) = lambda_plus_penalty * contact_force_direction(var);
419 if (lambda_plus_penalty > 0.)
421 if (residual && (
_sys.
comm().rank() == 0))
423 residual->
add_vector (lower_contact_force_vec, dof_indices_on_lower_node);
424 residual->
add_vector (upper_contact_force_vec, dof_indices_on_upper_node);
429 if (jacobian && (
_sys.
comm().rank() == 0))
430 for (
unsigned int var=0; var<3; var++)
431 for (
unsigned int j=0; j<3; j++)
433 jacobian->
add(dof_indices_on_lower_node[var],
434 dof_indices_on_upper_node[j],
435 _contact_penalty * contact_force_direction(j) * contact_force_direction(var));
437 jacobian->
add(dof_indices_on_lower_node[var],
438 dof_indices_on_lower_node[j],
439 -
_contact_penalty * contact_force_direction(j) * contact_force_direction(var));
441 jacobian->
add(dof_indices_on_upper_node[var],
442 dof_indices_on_lower_node[j],
443 _contact_penalty * contact_force_direction(j) * contact_force_direction(var));
445 jacobian->
add(dof_indices_on_upper_node[var],
446 dof_indices_on_upper_node[j],
447 -
_contact_penalty * contact_force_direction(j) * contact_force_direction(var));
457 if (jacobian && (
_sys.
comm().rank() == 0))
458 for (
unsigned int var=0; var<3; var++)
459 for (
unsigned int j=0; j<3; j++)
461 jacobian->
add(dof_indices_on_lower_node[var],
462 dof_indices_on_upper_node[j],
465 jacobian->
add(dof_indices_on_lower_node[var],
466 dof_indices_on_lower_node[j],
469 jacobian->
add(dof_indices_on_upper_node[var],
470 dof_indices_on_lower_node[j],
473 jacobian->
add(dof_indices_on_upper_node[var],
474 dof_indices_on_upper_node[j],
References _contact_node_map, _contact_penalty, _lambda_plus_penalty_values, _lambdas, _sys, libMesh::MeshBase::active_local_element_ptr_range(), libMesh::SparseMatrix< T >::add(), libMesh::SparseMatrix< T >::add_matrix(), libMesh::NumericVector< T >::add_vector(), libMesh::MeshBase::clone(), libMesh::ParallelObject::comm(), libMesh::DofMap::constrain_element_matrix_and_vector(), libMesh::FEType::default_quadrature_order(), dim, libMesh::DofMap::dof_indices(), libMesh::DofObject::dof_number(), libMesh::EDGE2, elasticity_tensor(), libMesh::Parameters::get(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::System::get_mesh(), mesh, libMesh::MeshBase::mesh_dimension(), move_mesh(), libMesh::MeshBase::node_ref(), libMesh::System::number(), libMesh::EquationSystems::parameters, libMesh::Real, libMesh::DenseVector< T >::resize(), libMesh::DenseMatrix< T >::resize(), libMesh::System::variable_number(), libMesh::DofMap::variable_type(), libMesh::SparseMatrix< T >::zero(), and libMesh::NumericVector< T >::zero().
◆ set_contact_penalty()
void LinearElasticityWithContact::set_contact_penalty |
( |
Real |
contact_penalty_in | ) |
|
◆ update_lambdas()
std::pair< Real, Real > LinearElasticityWithContact::update_lambdas |
( |
| ) |
|
Update the lambda parameters in the augmented Lagrangian method.
- Returns
- the largest change in the lambdas, and the largest lambda value.
Definition at line 607 of file linear_elasticity_with_contact.C.
609 Real max_delta_lambda = 0.;
610 Real max_new_lambda = 0.;
612 std::map<dof_id_type, Real>::iterator it =
_lambdas.begin();
613 std::map<dof_id_type, Real>::iterator it_end =
_lambdas.end();
614 for ( ; it != it_end; ++it)
620 libmesh_error_msg(
"New lambda value not found");
622 Real new_lambda = new_lambda_it->second;
623 Real old_lambda = it->second;
625 it->second = new_lambda;
628 if (delta_lambda > max_delta_lambda)
629 max_delta_lambda = delta_lambda;
631 if (
std::abs(new_lambda) > max_new_lambda)
632 max_new_lambda =
std::abs(new_lambda);
635 return std::make_pair(max_delta_lambda, max_new_lambda);
References _lambda_plus_penalty_values, _lambdas, std::abs(), and libMesh::Real.
◆ _contact_node_map
std::map<dof_id_type, dof_id_type> LinearElasticityWithContact::_contact_node_map |
|
private |
◆ _contact_penalty
Real LinearElasticityWithContact::_contact_penalty |
|
private |
◆ _lambda_plus_penalty_values
std::map<dof_id_type, Real> LinearElasticityWithContact::_lambda_plus_penalty_values |
|
private |
◆ _lambdas
std::map<dof_id_type, Real> LinearElasticityWithContact::_lambdas |
|
private |
◆ _sys
The documentation for this class was generated from the following files:
virtual void zero()=0
Set all entries to zero.
unsigned int n_vars() const
const EquationSystems & get_equation_systems() const
class FEComputeData hides arbitrary data to be passed to and from children of FEBase through the FEIn...
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
This class implements specific orders of Gauss quadrature.
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Fills the vector di with the global degree of freedom indices for the element.
virtual const Point & point(const dof_id_type i) const =0
virtual SimpleRange< element_iterator > active_local_element_ptr_range()=0
Defines a dense submatrix for use in Finite Element-type computations.
virtual SimpleRange< element_iterator > active_element_ptr_range()=0
const T_sys & get_system(const std::string &name) const
virtual void init(const numeric_index_type n, const numeric_index_type n_local, const bool fast=false, const ParallelType ptype=AUTOMATIC)=0
Change the dimension of the vector to n.
MetaPhysicL::DualNumber< T, D > sqrt(const MetaPhysicL::DualNumber< T, D > &in)
const Parallel::Communicator & comm() const
unsigned int number() const
unsigned int mesh_dimension() const
virtual const Elem * elem_ptr(const dof_id_type i) const =0
void resize(const unsigned int new_m, const unsigned int new_n)
Resize the matrix.
virtual numeric_index_type size() const =0
Provides a uniform interface to vector storage schemes for different linear algebra libraries.
Number current_solution(const dof_id_type global_dof_number) const
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i].
This is the MeshBase class.
MetaPhysicL::DualNumber< T, D > abs(const MetaPhysicL::DualNumber< T, D > &in)
virtual void localize(std::vector< T > &v_local) const =0
Creates a copy of the global vector in the local vector v_local.
const MeshBase & get_mesh() const
A Point defines a location in LIBMESH_DIM dimensional Real space.
A Node is like a Point, but with more information.
double pow(double a, int b)
virtual std::unique_ptr< MeshBase > clone() const =0
Virtual "copy constructor".
const FEType & variable_type(const unsigned int c) const
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).
This is the EquationSystems class.
virtual Node *& set_node(const unsigned int i)
void constrain_element_matrix_and_vector(DenseMatrix< Number > &matrix, DenseVector< Number > &rhs, std::vector< dof_id_type > &elem_dofs, bool asymmetric_constraint_rows=true) const
Constrains the element matrix and vector.
virtual const Node & node_ref(const dof_id_type i) const
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems.
void resize(const unsigned int n)
Resize the vector.
Real distance(const Point &p)
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
virtual Elem * add_elem(Elem *e)=0
Add elem e to the end of the element array.
This class handles the numbering of degrees of freedom on a mesh.
subdomain_id_type subdomain_id() const
The Edge2 is an element in 1D composed of 2 nodes.
This is the base class from which all geometric element types are derived.
unsigned short int variable_number(const std::string &var) const
MetaPhysicL::DualNumber< T, D > norm(const MetaPhysicL::DualNumber< T, D > &in)
IterBase * data
Ideally this private member data should have protected access.
const DofMap & get_dof_map() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void prepare_for_use(const bool skip_renumber_nodes_and_elements=false, const bool skip_find_neighbors=false)
Prepare a newly ecreated (or read) mesh for use.
Order default_quadrature_order() const
bool has_boundary_id(const Node *const node, const boundary_id_type id) const
const T & get(const std::string &) const
virtual void update()
Update the local values to reflect the solution on neighboring processors.
virtual void zero()=0
Set all entries to 0.
Parameters parameters
Data structure holding arbitrary parameters.