19 #include "libmesh/libmesh_config.h"
20 #if defined(LIBMESH_HAVE_TRIANGLE) && defined(LIBMESH_HAVE_TETGEN)
22 #include "libmesh/fe.h"
23 #include "libmesh/quadrature_gauss.h"
24 #include "libmesh/quadrature_trap.h"
25 #include "libmesh/quadrature_simpson.h"
26 #include "libmesh/quadrature_composite.h"
27 #include "libmesh/elem.h"
28 #include "libmesh/enum_quadrature_type.h"
36 template <
class QSubCell>
44 template <
class QSubCell>
66 template <
class QSubCell>
68 const std::vector<Real> & vertex_distance_func,
71 libmesh_assert_equal_to (vertex_distance_func.size(), elem.
n_vertices());
72 libmesh_assert_equal_to (_dim, elem.
dim());
79 if (!_elem_cutter.is_cut (elem, vertex_distance_func))
81 _q_subcell.init (elem.
type(), p_level);
82 _points = _q_subcell.get_points();
83 _weights = _q_subcell.get_weights();
98 _elem_cutter(*reference_elem, vertex_distance_func);
107 const std::vector<Elem const *> & inside_elem (_elem_cutter.inside_elements());
108 std::cout << inside_elem.size() <<
" elements inside\n";
110 this->add_subelem_values(inside_elem);
115 const std::vector<Elem const *> & outside_elem (_elem_cutter.outside_elements());
116 std::cout << outside_elem.size() <<
" elements outside\n";
118 this->add_subelem_values(outside_elem);
126 template <
class QSubCell>
130 const std::vector<Real> & subelem_weights = _lagrange_fe->get_JxW();
131 const std::vector<Point> & subelem_points = _lagrange_fe->get_xyz();
133 for (
const auto & elem : subelem)
140 _lagrange_fe->reinit(elem);
141 _weights.insert(_weights.end(),
142 subelem_weights.begin(), subelem_weights.end());
144 _points.insert(_points.end(),
145 subelem_points.begin(), subelem_points.end());
151 for (
auto n : elem->node_index_range())
154 libmesh_error_msg(
"Tetgen may have created a 0-volume cell during Cutcell integration.");
169 #endif // LIBMESH_HAVE_TRIANGLE && LIBMESH_HAVE_TETGEN