32 #ifdef DEAL_II_WITH_CGAL
42 template <
int dim0,
int dim1,
int spacedim,
typename Matrix>
46 const std::vector<std::tuple<
47 typename dealii::Triangulation<dim0, spacedim>::cell_iterator,
48 typename dealii::Triangulation<dim1, spacedim>::cell_iterator,
49 dealii::Quadrature<spacedim>>> &cells_and_quads,
61 ExcMessage(
"This function can only work if dim1<=dim0"));
65 const auto &space_fe = space_dh.
get_fe();
69 const unsigned int n_space_fe_components = space_fe.n_components();
72 n_dofs_per_space_cell);
74 std::vector<types::global_dof_index> local_space_dof_indices(
75 n_dofs_per_space_cell);
85 std::vector<unsigned int> space_gtl(n_space_fe_components,
88 for (
unsigned int i = 0, j = 0; i < n_space_fe_components; ++i)
98 for (
const auto &infos : cells_and_quads)
100 const auto &[first_cell, second_cell, quad_formula] = infos;
101 if (first_cell->is_active())
103 local_cell_matrix =
typename Matrix::value_type();
105 const unsigned int n_quad_pts = quad_formula.size();
106 const auto &real_qpts = quad_formula.get_points();
107 std::vector<double> nitsche_coefficient_values(n_quad_pts);
109 nitsche_coefficient_values);
111 std::vector<Point<spacedim>> ref_pts_space(n_quad_pts);
117 h = first_cell->diameter();
118 const auto &JxW = quad_formula.get_weights();
119 for (
unsigned int q = 0; q < n_quad_pts; ++q)
121 const auto &q_ref_point = ref_pts_space[q];
122 for (
unsigned int i = 0; i < n_dofs_per_space_cell; ++i)
124 const unsigned int comp_i =
128 for (
unsigned int j = 0; j < n_dofs_per_space_cell;
131 const unsigned int comp_j =
135 if (space_gtl[comp_i] == space_gtl[comp_j])
137 local_cell_matrix(i, j) +=
138 nitsche_coefficient_values[q] *
140 space_fe.shape_value(i, q_ref_point) *
141 space_fe.shape_value(j, q_ref_point) *
149 *first_cell, &space_dh);
151 space_cell_dh->get_dof_indices(local_space_dof_indices);
153 local_cell_matrix, local_space_dof_indices, matrix);
167 template <
int dim0,
int dim1,
int spacedim,
typename Matrix>
172 std::tuple<
typename dealii::Triangulation<dim0, spacedim>::cell_iterator,
173 typename dealii::Triangulation<dim1, spacedim>::cell_iterator,
174 dealii::Quadrature<spacedim>>> &,
181 ExcMessage(
"This function needs CGAL to be installed, "
182 "but cmake could not find it."));
192 dealii::NonMatching::assemble_nitsche_with_exact_intersections<1, 1, 1>(
195 std::tuple<
typename dealii::Triangulation<1, 1>::cell_iterator,
196 typename dealii::Triangulation<1, 1>::cell_iterator,
197 dealii::Quadrature<1>>> &,
198 dealii::SparseMatrix<double> &,
206 dealii::NonMatching::assemble_nitsche_with_exact_intersections<2, 1, 2>(
209 std::tuple<
typename dealii::Triangulation<2, 2>::cell_iterator,
210 typename dealii::Triangulation<1, 2>::cell_iterator,
211 dealii::Quadrature<2>>> &,
212 dealii::SparseMatrix<double> &,
221 dealii::NonMatching::assemble_nitsche_with_exact_intersections<2, 2, 2>(
224 std::tuple<
typename dealii::Triangulation<2, 2>::cell_iterator,
225 typename dealii::Triangulation<2, 2>::cell_iterator,
226 dealii::Quadrature<2>>> &,
227 dealii::SparseMatrix<double> &,
236 dealii::NonMatching::assemble_nitsche_with_exact_intersections<3, 1, 3>(
239 std::tuple<
typename dealii::Triangulation<3, 3>::cell_iterator,
240 typename dealii::Triangulation<1, 3>::cell_iterator,
241 dealii::Quadrature<3>>> &,
242 dealii::SparseMatrix<double> &,
250 dealii::NonMatching::assemble_nitsche_with_exact_intersections<3, 2, 3>(
253 std::tuple<
typename dealii::Triangulation<3, 3>::cell_iterator,
254 typename dealii::Triangulation<2, 3>::cell_iterator,
255 dealii::Quadrature<3>>> &,
256 dealii::SparseMatrix<double> &,
266 dealii::NonMatching::assemble_nitsche_with_exact_intersections<3, 3, 3>(
269 std::tuple<
typename dealii::Triangulation<3, 3>::cell_iterator,
270 typename dealii::Triangulation<3, 3>::cell_iterator,
271 dealii::Quadrature<3>>> &,
272 dealii::SparseMatrix<double> &,
void distribute_local_to_global(const InVector &local_vector, const std::vector< size_type > &local_dof_indices, OutVector &global_vector) const
unsigned int size() const
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
types::global_dof_index n_dofs() const
unsigned int n_dofs_per_cell() const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
virtual void value_list(const std::vector< Point< dim > > &points, std::vector< RangeNumberType > &values, const unsigned int component=0) const
virtual void transform_points_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< spacedim > > &real_points, const ArrayView< Point< dim > > &unit_points) const
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcMessage(std::string arg1)
typename ActiveSelector::cell_iterator cell_iterator
void assemble_nitsche_with_exact_intersections(const DoFHandler< dim0, spacedim > &, const std::vector< std::tuple< typename Triangulation< dim0, spacedim >::cell_iterator, typename Triangulation< dim1, spacedim >::cell_iterator, Quadrature< spacedim >>> &, Matrix &matrix, const AffineConstraints< typename Matrix::value_type > &, const ComponentMask &, const Mapping< dim0, spacedim > &, const Function< spacedim, typename Matrix::value_type > &nitsche_coefficient=Functions::ConstantFunction< spacedim >(1.0), const double penalty=1.)
Given two non-matching, overlapping grids, this function computes the local contributions M_{ij}:= \i...
static const unsigned int invalid_unsigned_int