1 #include <libmesh/dirichlet_boundaries.h> 2 #include <libmesh/dof_map.h> 3 #include <libmesh/elem.h> 4 #include <libmesh/equation_systems.h> 5 #include <libmesh/exodusII_io.h> 6 #include <libmesh/function_base.h> 7 #include <libmesh/linear_implicit_system.h> 8 #include <libmesh/mesh.h> 9 #include <libmesh/numeric_vector.h> 10 #include <libmesh/periodic_boundary.h> 11 #include <libmesh/quadrature_gauss.h> 12 #include <libmesh/sparse_matrix.h> 13 #include <libmesh/wrapped_function.h> 28 const Real & y = LIBMESH_DIM > 1 ? p(1) : 0;
32 return (y > 1) ? (y-3)*(y-3) : (y+1)*(y+1);
41 virtual std::unique_ptr<FunctionBase<Number>>
clone ()
const 42 {
return std::make_unique<PeriodicQuadFunction>(); }
46 const Real = 0.)
override 49 virtual void operator() (
const Point & p,
53 libmesh_assert_equal_to(output.
size(), 1);
82 FEType fe_type = dof_map.variable_type(0);
85 fe->attach_quadrature_rule(&qrule);
87 const std::vector<Real> & JxW = fe->get_JxW();
88 const std::vector<std::vector<Real>> & phi = fe->get_phi();
89 const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
94 fe_face->attach_quadrature_rule(&qface);
96 const std::vector<Real> & JxW_face = fe_face->get_JxW();
97 const std::vector<std::vector<Real>> & phi_face = fe_face->get_phi();
98 std::unique_ptr<const Elem> elem_side;
103 std::vector<dof_id_type> dof_indices;
105 for (
const Elem * elem :
mesh.active_local_element_ptr_range())
107 dof_map.dof_indices (elem, dof_indices);
108 const unsigned int n_dofs = dof_indices.
size();
110 Ke.
resize (n_dofs, n_dofs);
117 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
119 for (
unsigned int i=0; i != n_dofs; i++)
121 for (
unsigned int j=0; j != n_dofs; j++)
122 Ke(i,j) += -JxW[qp]*(dphi[i][qp]*dphi[j][qp]);
124 Fe(i) += JxW[qp]*phi[i][qp]*2;
128 for(
unsigned int s=0; s != elem->n_sides(); ++s)
130 elem->build_side_ptr(elem_side, s);
131 Point centroid = elem_side->vertex_average();
132 if (std::abs(centroid(1) - 1) <
TOLERANCE)
134 fe_face->reinit(elem, s);
136 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
140 for (
unsigned int i=0; i != n_dofs; i++)
141 Fe(i) += JxW_face[qp]*phi_face[i][qp]*(-4);
146 dof_map.heterogenously_constrain_element_matrix_and_vector(Ke, Fe, dof_indices);
166 #if defined(LIBMESH_HAVE_SOLVER) && defined(LIBMESH_HAVE_EXODUS_API) && defined(LIBMESH_HAVE_GZSTREAM) 167 CPPUNIT_TEST( testPeriodicLagrange2 );
169 #endif // LIBMESH_DIM > 1 171 CPPUNIT_TEST_SUITE_END();
187 mesh.
read(
"meshes/shark_tooth_tri6.xda.gz");
190 for (
const Elem * elem :
mesh.active_element_ptr_range())
192 for (
unsigned int s=0; s != 3; ++s)
193 if (!elem->neighbor_ptr(s))
195 unsigned v2 = (s+1)%3;
198 if (elem->point(s)(0) - elem->point(v2)(0) < -.1)
202 else if (elem->point(s)(0) - elem->point(v2)(0) > .1)
220 const unsigned int u_var = sys.
add_variable(
"u", fe_type);
223 std::set<boundary_id_type> side_bdy {
side_id };
224 std::vector<unsigned int> all_vars (1, u_var);
237 for (
Real x = 0.1; x < 10; x += 0.2)
238 for (
Real ya = -2.9; ya < 1; ya += 0.2)
241 const Real offset = 1-std::abs(std::fmod(x,2)-1);
242 const Real y = ya + offset;
246 LIBMESH_ASSERT_NUMBERS_EQUAL(exact, approx,
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
Wrap a libMesh-style function pointer into a FunctionBase object.
This is the EquationSystems class.
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false)=0
Interfaces for reading/writing a mesh to/from a file.
void add_periodic_boundary(const PeriodicBoundaryBase &periodic_boundary)
Adds a copy of the specified periodic boundary to the system.
This class provides the ability to map between arbitrary, user-defined strings and several data types...
VectorValue< Real > RealVectorValue
Useful typedefs to allow transparent switching between Real and Complex data types.
libMesh::Parallel::Communicator * TestCommWorld
static constexpr Real TOLERANCE
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
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]...
Number component(unsigned int i, const Point &p, Real) override
const boundary_id_type side_id
This is the base class from which all geometric element types are derived.
boundary_id_type pairedboundary
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
NumericVector< Number > * rhs
The system matrix.
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
Order default_quadrature_order() const
The libMesh namespace provides an interface to certain functionality in the library.
The definition of a periodic boundary.
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
virtual void solve() override
Assembles & solves the linear system A*x=b.
CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicBCTest)
const T_sys & get_system(std::string_view name) const
virtual std::unique_ptr< FunctionBase< Number > > clone() const
This is the MeshBase class.
void testPeriodicLagrange2()
This class handles the numbering of degrees of freedom on a mesh.
void allow_remote_element_removal(bool allow)
If false is passed in then this mesh will no longer have remote elements deleted when being prepared ...
boundary_id_type myboundary
The boundary ID of this boundary and its counterpart.
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.
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
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.
virtual void close()=0
Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across ...
const boundary_id_type top_id
virtual void close()=0
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
The system matrix.
void add_side(const dof_id_type elem, const unsigned short int side, const boundary_id_type id)
Add side side of element number elem with boundary id id to the boundary information data structure...
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.
void periodic_bc_test_poisson(EquationSystems &es, const std::string &)
virtual unsigned int size() const override final
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
virtual void init()
Initialize all the systems.
virtual void delete_remote_elements()
When supported, deletes all nonlocal elements of the mesh except for "ghosts" which touch a local ele...
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.
Base class for functors that can be evaluated at a point and (optionally) time.
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
void testPeriodicBC(FEType fe_type)
const DofMap & get_dof_map() const
A Point defines a location in LIBMESH_DIM dimensional Real space.
const boundary_id_type bottom_id
Number quadratic_solution(const Point &p, const Parameters &, const std::string &, const std::string &)