64 template <
int dim0,
int dim1,
int spacedim>
65 std::pair<std::vector<Point<spacedim>>, std::vector<unsigned int>>
82 unsigned int cell_id = 0;
83 for (
const auto &cell :
immersed_dh.active_cell_iterators())
85 bool use_cell =
false;
88 const auto bbox = cell->bounding_box();
89 std::vector<std::pair<
94 boost::geometry::index::intersects(
bbox),
101 if (
bbox_it.second->is_locally_owned())
116 const std::vector<Point<spacedim>> &
x_points =
117 fe_v.get_quadrature_points();
137 template <
int dim0,
int dim1,
int spacedim>
138 std::pair<std::vector<unsigned int>, std::vector<unsigned int>>
155 std::vector<unsigned int>
gtl0(
fe0.n_components(),
157 std::vector<unsigned int>
gtl1(
fe1.n_components(),
160 for (
unsigned int i = 0,
j = 0; i <
gtl0.
size(); ++i)
164 for (
unsigned int i = 0,
j = 0; i <
gtl1.
size(); ++i)
171 template <
int dim0,
int dim1,
int spacedim,
typename number>
201 template <
int dim0,
int dim1,
int spacedim,
typename number>
218 ExcMessage(
"This function can only work if dim1 <= dim0"));
226 &
space_dh.get_triangulation()) !=
nullptr);
231 std::vector<types::global_dof_index> dofs(
immersed_fe.n_dofs_per_cell());
232 std::vector<types::global_dof_index>
odofs(
space_fe.n_dofs_per_cell());
261 const unsigned int n_q_points = quad.
size();
296 const auto &
maps = std::get<2>(
cpm);
299 std::set<typename Triangulation<dim0, spacedim>::active_cell_iterator>>
302 for (
unsigned int i = 0; i <
maps.
size(); ++i)
307 unsigned int last_id = std::numeric_limits<unsigned int>::max();
308 unsigned int cell_id;
309 for (
const unsigned int idx :
maps[i])
315 cell_id = idx / n_q_points;
328 for (
const auto &cell :
immersed_dh.active_cell_iterators())
331 cell->get_dof_indices(dofs);
336 for (
const auto &
cell_c : cells)
342 if (
ocell->is_locally_owned())
348 constraints.add_entries_local_to_global(
361 template <
int dim0,
int dim1,
int spacedim,
typename Matrix>
391 template <
int dim0,
int dim1,
int spacedim,
typename Matrix>
408 ExcMessage(
"This function can only work if dim1 <= dim0"));
416 &
space_dh.get_triangulation()) !=
nullptr);
422 std::vector<types::global_dof_index> dofs(
immersed_fe.n_dofs_per_cell());
423 std::vector<types::global_dof_index>
odofs(
space_fe.n_dofs_per_cell());
452 space_dh.get_fe().n_dofs_per_cell(),
461 const unsigned int n_q_points = quad.
size();
479 std::vector<typename Triangulation<dim0, spacedim>::active_cell_iterator>>
483 std::vector<std::vector<std::vector<unsigned int>>>
maps_container(
495 unsigned int cell_id;
510 std::vector<unsigned int>{
n_pt});
533 std::vector<unsigned int>{
n_pt});
537 const unsigned int pos =
551 for (
unsigned int j = 0; cell !=
endc; ++cell, ++
j)
555 cell->get_dof_indices(dofs);
562 for (
unsigned int c = 0; c < cells.size(); ++c)
568 if (
ocell->is_locally_owned())
570 const std::vector<Point<dim0>> &
qps =
qpoints[c];
571 const std::vector<unsigned int> &ids =
maps[c];
581 cell_matrix =
typename Matrix::value_type();
583 for (
unsigned int i = 0;
584 i <
space_dh.get_fe().n_dofs_per_cell();
588 space_dh.get_fe().system_to_component_index(i).first;
590 for (
unsigned int j = 0;
595 .system_to_component_index(
j)
598 for (
unsigned int oq = 0;
603 const unsigned int q = ids[
oq];
613 constraints.distribute_local_to_global(
620 template <
int dim0,
int dim1,
int spacedim,
typename Number>
623 const double & epsilon,
637 ExcMessage(
"When epsilon is zero, you can only "
638 "call this function with dim1 <= dim0."));
655 *
>(&
dh0.get_triangulation()) !=
nullptr);
658 *
>(&
dh1.get_triangulation()) !=
nullptr);
671 (
dh1.get_triangulation().n_active_cells() >
672 dh0.get_triangulation().n_active_cells());
674 const auto &
fe0 =
dh0.get_fe();
675 const auto &
fe1 =
dh1.get_fe();
678 std::vector<types::global_dof_index>
dofs0(
fe0.n_dofs_per_cell());
679 std::vector<types::global_dof_index>
dofs1(
fe1.n_dofs_per_cell());
685 const auto &
tree1 =
cache1.get_cell_bounding_boxes_rtree();
687 std::vector<std::pair<
692 for (
const auto &
cell0 :
698 box0.extend(epsilon);
699 boost::geometry::index::query(
tree1,
700 boost::geometry::index::intersects(
709 *entry.second, &
dh1);
721 const auto &
tree0 =
cache0.get_cell_bounding_boxes_rtree();
723 std::vector<std::pair<
728 for (
const auto &
cell1 :
734 box1.extend(epsilon);
735 boost::geometry::index::query(
tree0,
736 boost::geometry::index::intersects(
745 *entry.second, &
dh0);
758 template <
int dim0,
int dim1,
int spacedim,
typename Matrix>
762 const double & epsilon,
777 ExcMessage(
"When epsilon is zero, you can only "
778 "call this function with dim1 <= dim0."));
796 *
>(&
dh0.get_triangulation()) !=
nullptr);
799 *
>(&
dh1.get_triangulation()) !=
nullptr);
812 (
dh1.get_triangulation().n_active_cells() >
813 dh0.get_triangulation().n_active_cells());
815 const auto &
fe0 =
dh0.get_fe();
816 const auto &
fe1 =
dh1.get_fe();
831 std::vector<types::global_dof_index>
dofs0(
fe0.n_dofs_per_cell());
832 std::vector<types::global_dof_index>
dofs1(
fe1.n_dofs_per_cell());
836 fe1.n_dofs_per_cell());
841 const auto &
gtl0 = p.first;
842 const auto &
gtl1 = p.second;
853 for (
unsigned int j = 0;
j <
fe1.n_dofs_per_cell(); ++
j)
855 const auto comp_j =
fe1.system_to_component_index(
j).first;
859 typename Matrix::value_type
sum_q1 = {};
868 for (
unsigned int i = 0; i <
fe0.n_dofs_per_cell(); ++i)
870 const auto comp_i =
fe0.system_to_component_index(i).first;
888 const auto &
tree1 =
cache1.get_cell_bounding_boxes_rtree();
890 std::vector<std::pair<
895 for (
const auto &
cell0 :
901 box0.extend(epsilon);
902 boost::geometry::index::query(
tree1,
903 boost::geometry::index::intersects(
913 *entry.second, &
dh1);
924 const auto &
tree0 =
cache0.get_cell_bounding_boxes_rtree();
926 std::vector<std::pair<
931 for (
const auto &
cell1 :
937 box1.extend(epsilon);
938 boost::geometry::index::query(
tree0,
939 boost::geometry::index::intersects(
949 *entry.second, &
dh0);
959# include "coupling.inst"
void reinit(value_type *starting_element, const std::size_t n_elements)
virtual void value_list(const std::vector< Point< dim > > &points, std::vector< RangeNumberType > &values, const unsigned int component=0) const
virtual void set_radius(const double r)
virtual void set_center(const Point< dim > &p)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
typename ActiveSelector::cell_iterator cell_iterator
typename ActiveSelector::active_cell_iterator active_cell_iterator
@ update_values
Shape function values.
@ update_JxW_values
Transformed quadrature weights.
@ update_quadrature_points
Transformed quadrature points.
std::pair< std::vector< unsigned int >, std::vector< unsigned int > > compute_components_coupling(const ComponentMask &comps0, const ComponentMask &comps1, const FiniteElement< dim0, spacedim > &fe0, const FiniteElement< dim1, spacedim > &fe1)
std::pair< std::vector< Point< spacedim > >, std::vector< unsigned int > > qpoints_over_locally_owned_cells(const GridTools::Cache< dim0, spacedim > &cache, const DoFHandler< dim1, spacedim > &immersed_dh, const Quadrature< dim1 > &quad, const Mapping< dim1, spacedim > &immersed_mapping, const bool tria_is_parallel)
void create_coupling_mass_matrix(const DoFHandler< dim0, spacedim > &space_dh, const DoFHandler< dim1, spacedim > &immersed_dh, const Quadrature< dim1 > &quad, Matrix &matrix, const AffineConstraints< typename Matrix::value_type > &constraints=AffineConstraints< typename Matrix::value_type >(), const ComponentMask &space_comps=ComponentMask(), const ComponentMask &immersed_comps=ComponentMask(), const Mapping< dim0, spacedim > &space_mapping=StaticMappingQ1< dim0, spacedim >::mapping, const Mapping< dim1, spacedim > &immersed_mapping=StaticMappingQ1< dim1, spacedim >::mapping, const AffineConstraints< typename Matrix::value_type > &immersed_constraints=AffineConstraints< typename Matrix::value_type >())
void create_coupling_sparsity_pattern(const DoFHandler< dim0, spacedim > &space_dh, const DoFHandler< dim1, spacedim > &immersed_dh, const Quadrature< dim1 > &quad, SparsityPatternBase &sparsity, const AffineConstraints< number > &constraints=AffineConstraints< number >(), const ComponentMask &space_comps=ComponentMask(), const ComponentMask &immersed_comps=ComponentMask(), const Mapping< dim0, spacedim > &space_mapping=StaticMappingQ1< dim0, spacedim >::mapping, const Mapping< dim1, spacedim > &immersed_mapping=StaticMappingQ1< dim1, spacedim >::mapping, const AffineConstraints< number > &immersed_constraints=AffineConstraints< number >())
static const unsigned int invalid_unsigned_int