266 libmesh_assert_equal_to (system_name,
"DivGrad");
296 std::unique_ptr<FEVectorBase> vector_fe (FEVectorBase::build(
dim, vector_fe_type));
297 std::unique_ptr<FEBase> scalar_fe (FEBase::build(
dim, scalar_fe_type));
303 vector_fe->attach_quadrature_rule (&qrule);
304 scalar_fe->attach_quadrature_rule (&qrule);
307 std::unique_ptr<FEVectorBase> vector_fe_face (FEVectorBase::build(
dim, vector_fe_type));
314 vector_fe_face->attach_quadrature_rule (&qface);
320 const std::vector<Real> & JxW = vector_fe->get_JxW();
325 const std::vector<Point> & q_point = vector_fe->get_xyz();
328 const std::vector<std::vector<RealGradient>> & vector_phi = vector_fe->get_phi();
329 const std::vector<std::vector<Real>> & scalar_phi = scalar_fe->get_phi();
333 const std::vector<std::vector<Real>> & div_vector_phi = vector_fe->get_div_phi();
347 std::vector<dof_id_type> dof_indices;
348 std::vector<dof_id_type> vector_dof_indices;
349 std::vector<dof_id_type> scalar_dof_indices;
350 std::vector<dof_id_type> lambda_dof_indices;
368 for (
const auto & elem :
mesh.active_local_element_ptr_range())
374 dof_map.dof_indices (elem, dof_indices);
375 dof_map.dof_indices (elem, vector_dof_indices, system.
variable_number(
"u"));
376 dof_map.dof_indices (elem, scalar_dof_indices, system.
variable_number(
"p"));
378 dof_map.dof_indices (elem, lambda_dof_indices, system.
variable_number(
"l"));
385 const unsigned int n_dofs =
386 cast_int<unsigned int>(dof_indices.size());
387 const unsigned int vector_n_dofs =
388 cast_int<unsigned int>(vector_dof_indices.size());
389 const unsigned int scalar_n_dofs =
390 cast_int<unsigned int>(scalar_dof_indices.size());
391 const unsigned int lambda_n_dofs =
392 cast_int<unsigned int>(lambda_dof_indices.size());
398 vector_fe->reinit (elem);
399 scalar_fe->reinit (elem);
404 libmesh_assert_equal_to (n_dofs, vector_n_dofs + scalar_n_dofs + lambda_n_dofs);
405 libmesh_assert_equal_to (vector_n_dofs, vector_phi.size());
406 libmesh_assert_equal_to (scalar_n_dofs, scalar_phi.size());
417 Ke.
resize (n_dofs, n_dofs);
422 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
428 for (
unsigned int i = 0; i != vector_n_dofs; i++)
429 for (
unsigned int j = 0; j != vector_n_dofs; j++)
431 Ke(i, j) += JxW[qp]*(vector_phi[i][qp]*vector_phi[j][qp]);
437 for (
unsigned int i = 0; i != vector_n_dofs; i++)
438 for (
unsigned int l = 0; l != scalar_n_dofs; l++)
440 Ke(i, l + vector_n_dofs) -= JxW[qp]*(div_vector_phi[i][qp]*scalar_phi[l][qp]);
446 for (
unsigned int k = 0; k != scalar_n_dofs; k++)
447 for (
unsigned int j = 0; j != vector_n_dofs; j++)
449 Ke(k + vector_n_dofs, j) -= JxW[qp]*(div_vector_phi[j][qp]*scalar_phi[k][qp]);
458 const Real x = q_point[qp](0);
459 const Real y = q_point[qp](1);
460 const Real z = q_point[qp](2);
473 for (
unsigned int k = 0; k != scalar_n_dofs; k++)
475 Fe(k + vector_n_dofs) -= JxW[qp]*f*scalar_phi[k][qp];
486 const Real x = q_point[qp](0);
487 const Real y = q_point[qp](1);
488 const Real z = q_point[qp](2);
491 Real scalar_value = 0;
499 for (
unsigned int k = 0; k != scalar_n_dofs; k++)
500 for (
unsigned int n = 0; n != lambda_n_dofs; n++)
502 Ke(k + vector_n_dofs, n + vector_n_dofs + scalar_n_dofs) += JxW[qp]*scalar_phi[k][qp];
507 for (
unsigned int m = 0; m != lambda_n_dofs; m++)
508 for (
unsigned int l = 0; l != scalar_n_dofs; l++)
510 Ke(m + vector_n_dofs + scalar_n_dofs, l + vector_n_dofs) += JxW[qp]*scalar_phi[l][qp];
514 for (
unsigned int m = 0; m != lambda_n_dofs; m++)
516 Fe(m + vector_n_dofs + scalar_n_dofs) += JxW[qp]*scalar_value;
533 for (
auto side : elem->side_index_range())
534 if (elem->neighbor_ptr(side) ==
nullptr)
537 const std::vector<std::vector<RealGradient>> & vector_phi_face = vector_fe_face->get_phi();
541 const std::vector<Real> & JxW_face = vector_fe_face->get_JxW();
546 const std::vector<Point> & qface_point = vector_fe_face->get_xyz();
547 const std::vector<Point> & normals = vector_fe_face->get_normals();
550 vector_fe_face->reinit(elem, side);
554 libmesh_assert_equal_to (vector_n_dofs, vector_phi_face.size());
557 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
561 const Real xf = qface_point[qp](0);
562 const Real yf = qface_point[qp](1);
563 const Real zf = qface_point[qp](2);
576 const Real penalty = 1.e10;
581 for (
unsigned int i = 0; i != vector_n_dofs; i++)
582 for (
unsigned int j = 0; j != vector_n_dofs; j++)
584 Ke(i, j) += JxW_face[qp]*penalty*vector_phi_face[i][qp]*
585 normals[qp]*vector_phi_face[j][qp]*normals[qp];
591 for (
unsigned int i = 0; i != vector_n_dofs; i++)
593 Fe(i) += JxW_face[qp]*penalty*vector_phi_face[i][qp]*normals[qp]*
594 vector_value*normals[qp];
600 Real scalar_value = 0;
608 for (
unsigned int i = 0; i != vector_n_dofs; i++)
610 Fe(i) += -JxW_face[qp]*vector_phi_face[i][qp]*normals[qp]*scalar_value;
622 dof_map.constrain_element_matrix_and_vector (Ke, Fe, dof_indices);
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and linear solvers ...
void resize(const unsigned int n)
Resize the vector.
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]...
NumericVector< Number > * rhs
The system matrix.
Order default_quadrature_order() const
const T_sys & get_system(std::string_view name) const
This is the MeshBase class.
unsigned int variable_number(std::string_view var) const
This class handles the numbering of degrees of freedom on a mesh.
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.
const T & get(std::string_view) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real forcing(Real x, Real y)
const MeshBase & get_mesh() const
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
This class implements specific orders of Gauss quadrature.
unsigned int mesh_dimension() const
Parameters parameters
Data structure holding arbitrary parameters.
const DofMap & get_dof_map() const
const SparseMatrix< Number > & get_system_matrix() const
Real scalar(Real x, Real y)