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.