20 #ifdef DEAL_II_WITH_CGAL
34 const std::vector<std::tuple<
35 typename dealii::Triangulation<dim0, spacedim>::cell_iterator,
36 typename dealii::Triangulation<dim1, spacedim>::cell_iterator,
37 dealii::Quadrature<spacedim>>> &intersections_info,
49 ExcMessage(
"This function can only work if dim1 <= dim0"));
57 const auto &space_fe = space_dh.
get_fe();
58 const auto &immersed_fe = immersed_dh.
get_fe();
60 const unsigned int n_dofs_per_immersed_cell =
61 immersed_fe.n_dofs_per_cell();
62 const unsigned int n_space_fe_components = space_fe.n_components();
63 const unsigned int n_immersed_fe_components = immersed_fe.n_components();
64 std::vector<types::global_dof_index> space_dofs(n_dofs_per_space_cell);
65 std::vector<types::global_dof_index> immersed_dofs(
66 n_dofs_per_immersed_cell);
75 (immersed_comps.
size() == 0 ?
84 std::vector<unsigned int> space_gtl(n_space_fe_components);
85 std::vector<unsigned int> immersed_gtl(n_immersed_fe_components);
86 for (
unsigned int i = 0, j = 0; i < n_space_fe_components; ++i)
93 for (
unsigned int i = 0, j = 0; i < n_immersed_fe_components; ++i)
96 immersed_gtl[i] = j++;
101 Table<2, bool> dof_mask(n_dofs_per_space_cell, n_dofs_per_immersed_cell);
102 dof_mask.fill(
false);
104 for (
unsigned int i = 0; i < n_dofs_per_space_cell; ++i)
106 const auto comp_i = space_fe.system_to_component_index(i).first;
109 for (
unsigned int j = 0; j < n_dofs_per_immersed_cell; ++j)
112 immersed_fe.system_to_component_index(j).first;
113 if (immersed_gtl[comp_j] == space_gtl[comp_i])
115 dof_mask(i, j) =
true;
121 const bool dof_mask_is_active =
122 dof_mask.n_rows() == n_dofs_per_space_cell &&
123 dof_mask.n_cols() == n_dofs_per_immersed_cell;
128 for (
const auto &it : intersections_info)
130 const auto &space_cell = std::get<0>(it);
131 const auto &immersed_cell = std::get<1>(it);
133 *space_cell, &space_dh);
135 *immersed_cell, &immersed_dh);
137 space_cell_dh->get_dof_indices(space_dofs);
138 immersed_cell_dh->get_dof_indices(immersed_dofs);
140 if (dof_mask_is_active)
142 for (
unsigned int i = 0; i < n_dofs_per_space_cell; ++i)
144 const unsigned int comp_i =
148 for (
unsigned int j = 0; j < n_dofs_per_immersed_cell;
151 const unsigned int comp_j =
155 if (space_gtl[comp_i] == immersed_gtl[comp_j])
160 immersed_constraints,
172 immersed_constraints,
195 const std::vector<std::tuple<
196 typename dealii::Triangulation<dim0, spacedim>::cell_iterator,
197 typename dealii::Triangulation<dim1, spacedim>::cell_iterator,
198 dealii::Quadrature<spacedim>>> &,
208 ExcMessage(
"This function needs CGAL to be installed, "
209 "but cmake could not find it."));
219 std::tuple<
typename dealii::Triangulation<1, 1>::cell_iterator,
220 typename dealii::Triangulation<1, 1>::cell_iterator,
221 dealii::Quadrature<1>>> &intersections_info,
233 std::tuple<
typename dealii::Triangulation<2, 2>::cell_iterator,
234 typename dealii::Triangulation<1, 2>::cell_iterator,
235 dealii::Quadrature<2>>> &intersections_info,
248 std::tuple<
typename dealii::Triangulation<3, 3>::cell_iterator,
249 typename dealii::Triangulation<1, 3>::cell_iterator,
250 dealii::Quadrature<3>>> &intersections_info,
263 std::tuple<
typename dealii::Triangulation<2, 2>::cell_iterator,
264 typename dealii::Triangulation<2, 2>::cell_iterator,
265 dealii::Quadrature<2>>> &intersections_info,
277 std::tuple<
typename dealii::Triangulation<3, 3>::cell_iterator,
278 typename dealii::Triangulation<2, 3>::cell_iterator,
279 dealii::Quadrature<3>>> &intersections_info,
291 std::tuple<
typename dealii::Triangulation<3, 3>::cell_iterator,
292 typename dealii::Triangulation<3, 3>::cell_iterator,
293 dealii::Quadrature<3>>> &intersections_info,
307 dealii::TrilinosWrappers::SparsityPattern,
310 std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
311 dealii::Triangulation<1, 2>::cell_iterator,
312 dealii::Quadrature<2>>,
313 std::allocator<std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
314 dealii::Triangulation<1, 2>::cell_iterator,
315 dealii::Quadrature<2>>>>
const &,
316 dealii::DoFHandler<2, 2>
const &,
317 dealii::DoFHandler<1, 2>
const &,
318 dealii::TrilinosWrappers::SparsityPattern &,
319 dealii::AffineConstraints<double>
const &,
320 dealii::ComponentMask
const &,
321 dealii::ComponentMask
const &,
322 dealii::AffineConstraints<double>
const &);
328 dealii::TrilinosWrappers::SparsityPattern,
331 std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
332 dealii::Triangulation<2, 2>::cell_iterator,
333 dealii::Quadrature<2>>,
334 std::allocator<std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
335 dealii::Triangulation<2, 2>::cell_iterator,
336 dealii::Quadrature<2>>>>
const &,
337 dealii::DoFHandler<2, 2>
const &,
338 dealii::DoFHandler<2, 2>
const &,
339 dealii::TrilinosWrappers::SparsityPattern &,
340 dealii::AffineConstraints<double>
const &,
341 dealii::ComponentMask
const &,
342 dealii::ComponentMask
const &,
343 dealii::AffineConstraints<double>
const &);
349 dealii::TrilinosWrappers::SparsityPattern,
352 std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
353 dealii::Triangulation<2, 3>::cell_iterator,
354 dealii::Quadrature<3>>,
355 std::allocator<std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
356 dealii::Triangulation<2, 3>::cell_iterator,
357 dealii::Quadrature<3>>>>
const &,
358 dealii::DoFHandler<3, 3>
const &,
359 dealii::DoFHandler<2, 3>
const &,
360 dealii::TrilinosWrappers::SparsityPattern &,
361 dealii::AffineConstraints<double>
const &,
362 dealii::ComponentMask
const &,
363 dealii::ComponentMask
const &,
364 dealii::AffineConstraints<double>
const &);
370 dealii::TrilinosWrappers::SparsityPattern,
373 std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
374 dealii::Triangulation<3, 3>::cell_iterator,
375 dealii::Quadrature<3>>,
376 std::allocator<std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
377 dealii::Triangulation<3, 3>::cell_iterator,
378 dealii::Quadrature<3>>>>
const &,
379 dealii::DoFHandler<3, 3>
const &,
380 dealii::DoFHandler<3, 3>
const &,
381 dealii::TrilinosWrappers::SparsityPattern &,
382 dealii::AffineConstraints<double>
const &,
383 dealii::ComponentMask
const &,
384 dealii::ComponentMask
const &,
385 dealii::AffineConstraints<double>
const &);
393 dealii::SparsityPattern,
396 std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
397 dealii::Triangulation<2, 3>::cell_iterator,
398 dealii::Quadrature<3>>,
399 std::allocator<std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
400 dealii::Triangulation<2, 3>::cell_iterator,
401 dealii::Quadrature<3>>>>
const &,
402 dealii::DoFHandler<3, 3>
const &,
403 dealii::DoFHandler<2, 3>
const &,
404 dealii::SparsityPattern &,
405 dealii::AffineConstraints<double>
const &,
406 dealii::ComponentMask
const &,
407 dealii::ComponentMask
const &,
408 dealii::AffineConstraints<double>
const &);
415 dealii::SparsityPattern,
418 std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
419 dealii::Triangulation<2, 2>::cell_iterator,
420 dealii::Quadrature<2>>,
421 std::allocator<std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
422 dealii::Triangulation<2, 2>::cell_iterator,
423 dealii::Quadrature<2>>>>
const &,
424 dealii::DoFHandler<2, 2>
const &,
425 dealii::DoFHandler<2, 2>
const &,
426 dealii::SparsityPattern &,
427 dealii::AffineConstraints<double>
const &,
428 dealii::ComponentMask
const &,
429 dealii::ComponentMask
const &,
430 dealii::AffineConstraints<double>
const &);
437 dealii::SparsityPattern,
440 std::tuple<dealii::Triangulation<1, 1>::cell_iterator,
441 dealii::Triangulation<1, 1>::cell_iterator,
442 dealii::Quadrature<1>>,
443 std::allocator<std::tuple<dealii::Triangulation<1, 1>::cell_iterator,
444 dealii::Triangulation<1, 1>::cell_iterator,
445 dealii::Quadrature<1>>>>
const &,
446 dealii::DoFHandler<1, 1>
const &,
447 dealii::DoFHandler<1, 1>
const &,
448 dealii::SparsityPattern &,
449 dealii::AffineConstraints<double>
const &,
450 dealii::ComponentMask
const &,
451 dealii::ComponentMask
const &,
452 dealii::AffineConstraints<double>
const &);
459 dealii::SparsityPattern,
462 std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
463 dealii::Triangulation<1, 3>::cell_iterator,
464 dealii::Quadrature<3>>,
465 std::allocator<std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
466 dealii::Triangulation<1, 3>::cell_iterator,
467 dealii::Quadrature<3>>>>
const &,
468 dealii::DoFHandler<3, 3>
const &,
469 dealii::DoFHandler<1, 3>
const &,
470 dealii::SparsityPattern &,
471 dealii::AffineConstraints<double>
const &,
472 dealii::ComponentMask
const &,
473 dealii::ComponentMask
const &,
474 dealii::AffineConstraints<double>
const &);
481 dealii::SparsityPattern,
484 std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
485 dealii::Triangulation<1, 2>::cell_iterator,
486 dealii::Quadrature<2>>,
487 std::allocator<std::tuple<dealii::Triangulation<2, 2>::cell_iterator,
488 dealii::Triangulation<1, 2>::cell_iterator,
489 dealii::Quadrature<2>>>>
const &,
490 dealii::DoFHandler<2, 2>
const &,
491 dealii::DoFHandler<1, 2>
const &,
492 dealii::SparsityPattern &,
493 dealii::AffineConstraints<double>
const &,
494 dealii::ComponentMask
const &,
495 dealii::ComponentMask
const &,
496 dealii::AffineConstraints<double>
const &);
503 dealii::SparsityPattern,
506 std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
507 dealii::Triangulation<3, 3>::cell_iterator,
508 dealii::Quadrature<3>>,
509 std::allocator<std::tuple<dealii::Triangulation<3, 3>::cell_iterator,
510 dealii::Triangulation<3, 3>::cell_iterator,
511 dealii::Quadrature<3>>>>
const &,
512 dealii::DoFHandler<3, 3>
const &,
513 dealii::DoFHandler<3, 3>
const &,
514 dealii::SparsityPattern &,
515 dealii::AffineConstraints<double>
const &,
516 dealii::ComponentMask
const &,
517 dealii::ComponentMask
const &,
518 dealii::AffineConstraints<double>
const &);
void add_entries_local_to_global(const std::vector< size_type > &local_dof_indices, SparsityPatternBase &sparsity_pattern, const bool keep_constrained_entries=true, const Table< 2, bool > &dof_mask=Table< 2, bool >()) const
unsigned int size() const
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
const Triangulation< dim, spacedim > & get_triangulation() 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
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcMessage(std::string arg1)
typename ActiveSelector::cell_iterator cell_iterator
void create_coupling_sparsity_pattern_with_exact_intersections(const std::vector< std::tuple< typename Triangulation< dim0, spacedim >::cell_iterator, typename Triangulation< dim1, spacedim >::cell_iterator, Quadrature< spacedim >>> &intersections_info, const DoFHandler< dim0, spacedim > &space_dh, const DoFHandler< dim1, spacedim > &immersed_dh, Sparsity &sparsity, const AffineConstraints< number > &constraints=AffineConstraints< number >(), const ComponentMask &space_comps=ComponentMask(), const ComponentMask &immersed_comps=ComponentMask(), const AffineConstraints< number > &immersed_constraints=AffineConstraints< number >())
Create a coupling sparsity pattern of two non-matching, overlapped grids.
static const unsigned int invalid_unsigned_int