29 #include "libmesh/string_to_enum.h" 32 #include "libmesh/enum_solver_package.h" 35 #include "libmesh/mesh.h" 36 #include "libmesh/mesh_generation.h" 37 #include "libmesh/mesh_modification.h" 40 #include "libmesh/dense_matrix.h" 41 #include "libmesh/sparse_matrix.h" 42 #include "libmesh/dense_vector.h" 43 #include "libmesh/numeric_vector.h" 46 #include "libmesh/fe.h" 47 #include "libmesh/elem.h" 50 #include "libmesh/quadrature_gauss.h" 53 #include "libmesh/dof_map.h" 56 #include "libmesh/equation_systems.h" 57 #include "libmesh/linear_implicit_system.h" 60 #include "libmesh/exact_solution.h" 61 #include "libmesh/enum_norm_type.h" 62 #include "solution_function.h" 65 #include "libmesh/getpot.h" 66 #include "libmesh/exodusII_io.h" 79 const std::string & system_name);
81 int main (
int argc,
char ** argv)
88 "--enable-petsc, --enable-trilinos, or --enable-eigen");
91 GetPot infile(
"vector_fe_ex10.in");
94 infile.parse_command_line(argc, argv);
97 const unsigned int dimension = infile(
"dim", 2);
98 const unsigned int grid_size = infile(
"grid_size", 15);
101 libmesh_example_requires(dimension <= LIBMESH_DIM, dimension <<
"D support");
110 const std::string elem_str = infile(
"element_type", std::string(
"TRI6"));
112 libmesh_error_msg_if((dimension == 2 && elem_str !=
"TRI6" && elem_str !=
"TRI7" && elem_str !=
"QUAD8" && elem_str !=
"QUAD9") ||
113 (dimension == 3 && elem_str !=
"TET14" && elem_str !=
"HEX27"),
114 "You selected " << elem_str <<
115 " but this example must be run with TRI6, TRI7, QUAD8, or QUAD9 in 2d" <<
116 " or with TET14, or HEX27 in 3d.");
124 Utility::string_to_enum<ElemType>(elem_str));
125 else if (dimension == 3)
133 Utility::string_to_enum<ElemType>(elem_str));
148 const Order vector_order =
static_cast<Order>(infile(
"order", 1u));
150 libmesh_error_msg_if(vector_order < FIRST || vector_order > ((dimension == 3) ?
FIRST :
FIFTH),
151 "You selected: " << vector_order <<
152 " but this example must be run with either 1 <= order <= 5 in 2d" 153 " or with order 1 in 3d.");
163 equation_systems.
init();
179 std::vector<FunctionBase<Number> *> sols(1, &soln_func);
180 std::vector<FunctionBase<Gradient> *> grads(1, &soln_grad);
186 int extra_error_quadrature = infile(
"extra_error_quadrature", 2);
196 << exact_sol.
l2_error(
"GradDiv",
"u")
205 #ifdef LIBMESH_HAVE_EXODUS_API 210 #endif // #ifdef LIBMESH_HAVE_EXODUS_API 224 const std::string & libmesh_dbg_var(system_name))
229 libmesh_assert_equal_to (system_name,
"GradDiv");
261 vector_fe->attach_quadrature_rule (&qrule);
271 vector_fe_face->attach_quadrature_rule (&qface);
277 const std::vector<Real> & JxW = vector_fe->get_JxW();
282 const std::vector<Point> & q_point = vector_fe->get_xyz();
285 const std::vector<std::vector<RealGradient>> & vector_phi = vector_fe->get_phi();
289 const std::vector<std::vector<Real>> & div_vector_phi = vector_fe->get_div_phi();
303 std::vector<dof_id_type> dof_indices;
321 for (
const auto & elem :
mesh.active_local_element_ptr_range())
327 dof_map.dof_indices (elem, dof_indices);
334 const unsigned int n_dofs =
335 cast_int<unsigned int>(dof_indices.size());
341 vector_fe->reinit (elem);
345 libmesh_assert_equal_to (n_dofs, vector_phi.size());
356 Ke.
resize (n_dofs, n_dofs);
361 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
367 for (
unsigned int i = 0; i != n_dofs; i++)
368 for (
unsigned int j = 0; j != n_dofs; j++)
370 Ke(i, j) += JxW[qp]*(div_vector_phi[i][qp]*div_vector_phi[j][qp]+
371 vector_phi[i][qp]*vector_phi[j][qp]);
380 const Real x = q_point[qp](0);
381 const Real y = q_point[qp](1);
382 const Real z = q_point[qp](2);
390 for (
unsigned int k = 0; k != n_dofs; k++)
392 Fe(k) += JxW[qp]*f*vector_phi[k][qp];
405 for (
auto side : elem->side_index_range())
406 if (elem->neighbor_ptr(side) ==
nullptr)
409 const std::vector<std::vector<RealGradient>> & vector_phi_face = vector_fe_face->get_phi();
413 const std::vector<Real> & JxW_face = vector_fe_face->get_JxW();
418 const std::vector<Point> & qface_point = vector_fe_face->get_xyz();
419 const std::vector<Point> & normals = vector_fe_face->get_normals();
422 vector_fe_face->reinit(elem, side);
426 libmesh_assert_equal_to (n_dofs, vector_phi_face.size());
429 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
433 const Real xf = qface_point[qp](0);
434 const Real yf = qface_point[qp](1);
435 const Real zf = qface_point[qp](2);
442 const Real penalty = 1.e10;
447 for (
unsigned int i = 0; i != n_dofs; i++)
448 for (
unsigned int j = 0; j != n_dofs; j++)
450 Ke(i, j) += JxW_face[qp]*penalty*vector_phi_face[i][qp]*
451 normals[qp]*vector_phi_face[j][qp]*normals[qp];
457 for (
unsigned int i = 0; i != n_dofs; i++)
459 Fe(i) += JxW_face[qp]*penalty*vector_phi_face[i][qp]*normals[qp]*
460 vector_value*normals[qp];
471 dof_map.constrain_element_matrix_and_vector (Ke, Fe, dof_indices);
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
This class handles the computation of the L2 and/or H1 error for the Systems in the EquationSystems o...
This is the EquationSystems class.
Order
defines an enum for polynomial orders.
Real hdiv_error(std::string_view sys_name, std::string_view unknown_name)
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
void assemble_graddiv(EquationSystems &es, const std::string &system_name)
void attach_exact_values(const std::vector< FunctionBase< Number > *> &f)
Clone and attach arbitrary functors which compute the exact values of the EquationSystems' solutions ...
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]...
void print_info(std::ostream &os=libMesh::out) const
Prints information about the equation systems, by default to libMesh::out.
void extra_quadrature_order(const int extraorder)
Increases or decreases the order of the quadrature rule used for numerical integration.
NumericVector< Number > * rhs
The system matrix.
Order default_quadrature_order() const
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
The libMesh namespace provides an interface to certain functionality in the library.
void attach_exact_derivs(const std::vector< FunctionBase< Gradient > *> &g)
Clone and attach arbitrary functors which compute the exact gradients of the EquationSystems' solutio...
virtual void solve() override
Assembles & solves the linear system A*x=b.
const T_sys & get_system(std::string_view name) const
This is the MeshBase class.
unsigned int variable_number(std::string_view var) const
SolverPackage default_solver_package()
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.
virtual void write_equation_systems(const std::string &fname, const EquationSystems &es, const std::set< std::string > *system_names=nullptr) override
Writes out the solution for no specific time or timestep.
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
Prints relevant information about the mesh.
void compute_error(std::string_view sys_name, std::string_view unknown_name)
Computes and stores the error in the solution value e = u-u_h, the gradient grad(e) = grad(u) - grad(...
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
RealGradient forcing(Real x, Real y, Real z)
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
void attach_assemble_function(void fptr(EquationSystems &es, const std::string &name))
Register a user function to use in assembling the system matrix and RHS.
Real l2_error(std::string_view sys_name, std::string_view unknown_name)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
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
virtual void init()
Initialize all the systems.
virtual System & add_system(std::string_view system_type, std::string_view name)
Add the system of type system_type named name to the systems array.
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
int main(int argc, char **argv)
const DofMap & get_dof_map() const
const SparseMatrix< Number > & get_system_matrix() const
Real error_norm(std::string_view sys_name, std::string_view unknown_name, const FEMNormType &norm)