16 #include <deal.II/base/exceptions.h> 17 #include <deal.II/base/point.h> 18 #include <deal.II/base/tensor.h> 20 #include <deal.II/distributed/shared_tria.h> 21 #include <deal.II/distributed/tria.h> 23 #include <deal.II/fe/fe_values.h> 25 #include <deal.II/grid/grid_tools.h> 26 #include <deal.II/grid/grid_tools_cache.h> 28 #include <deal.II/lac/block_sparse_matrix.h> 29 #include <deal.II/lac/block_sparsity_pattern.h> 30 #include <deal.II/lac/petsc_block_sparse_matrix.h> 31 #include <deal.II/lac/petsc_sparse_matrix.h> 32 #include <deal.II/lac/sparse_matrix.h> 33 #include <deal.II/lac/sparsity_pattern.h> 34 #include <deal.II/lac/trilinos_block_sparse_matrix.h> 35 #include <deal.II/lac/trilinos_sparse_matrix.h> 36 #include <deal.II/lac/trilinos_sparsity_pattern.h> 38 #include <deal.II/non_matching/coupling.h> 40 DEAL_II_NAMESPACE_OPEN
94 static_assert(dim1 <= dim0,
"This function can only work if dim1 <= dim0");
100 const auto &space_fe = space_dh.
get_fe();
101 const auto &immersed_fe = immersed_dh.
get_fe();
106 endc = immersed_dh.
end();
109 std::vector<types::global_dof_index> dofs(immersed_fe.dofs_per_cell);
110 std::vector<types::global_dof_index> odofs(space_fe.dofs_per_cell);
123 (immersed_comps.
size() == 0 ?
130 std::vector<unsigned int> space_gtl(space_fe.n_components(),
132 std::vector<unsigned int> immersed_gtl(immersed_fe.n_components(),
135 for (
unsigned int i = 0, j = 0; i < space_gtl.size(); ++i)
139 for (
unsigned int i = 0, j = 0; i < immersed_gtl.size(); ++i)
141 immersed_gtl[i] = j++;
163 for (; cell != endc; ++cell)
167 cell->get_dof_indices(dofs);
169 const std::vector<Point<spacedim>> &Xpoints =
174 const auto &cells = std::get<0>(cpm);
176 for (
unsigned int c = 0; c < cells.size(); ++c)
182 if (ocell->is_locally_owned())
184 ocell->get_dof_indices(odofs);
189 odofs, dofs, sparsity);
197 template <
int dim0,
int dim1,
int spacedim,
typename Matrix>
225 template <
int dim0,
int dim1,
int spacedim,
typename Matrix>
240 static_assert(dim1 <= dim0,
"This function can only work if dim1 <= dim0");
246 const auto &space_fe = space_dh.
get_fe();
247 const auto &immersed_fe = immersed_dh.
get_fe();
250 std::vector<types::global_dof_index> dofs(immersed_fe.dofs_per_cell);
251 std::vector<types::global_dof_index> odofs(space_fe.dofs_per_cell);
259 (immersed_comps.
size() == 0 ?
266 std::vector<unsigned int> space_gtl(space_fe.n_components(),
268 std::vector<unsigned int> immersed_gtl(immersed_fe.n_components(),
271 for (
unsigned int i = 0, j = 0; i < space_gtl.size(); ++i)
275 for (
unsigned int i = 0, j = 0; i < immersed_gtl.size(); ++i)
277 immersed_gtl[i] = j++;
280 space_dh.
get_fe().dofs_per_cell, immersed_dh.
get_fe().dofs_per_cell);
291 endc = immersed_dh.
end();
293 for (; cell != endc; ++cell)
297 cell->get_dof_indices(dofs);
299 const std::vector<Point<spacedim>> &Xpoints =
300 fe_v.get_quadrature_points();
304 const auto &cells = std::get<0>(cpm);
305 const auto &qpoints = std::get<1>(cpm);
306 const auto &maps = std::get<2>(cpm);
308 for (
unsigned int c = 0; c < cells.size(); ++c)
312 *cells[c], &space_dh);
314 if (ocell->is_locally_owned())
316 const std::vector<Point<dim0>> & qps = qpoints[c];
317 const std::vector<unsigned int> &ids = maps[c];
324 ocell->get_dof_indices(odofs);
327 cell_matrix =
typename Matrix::value_type();
329 for (
unsigned int i = 0; i < space_dh.
get_fe().dofs_per_cell;
333 space_dh.
get_fe().system_to_component_index(i).first;
335 for (
unsigned int j = 0;
336 j < immersed_dh.
get_fe().dofs_per_cell;
339 const auto comp_j = immersed_dh.
get_fe()
340 .system_to_component_index(j)
342 if (space_gtl[comp_i] == immersed_gtl[comp_j])
343 for (
unsigned int oq = 0;
344 oq < o_fe_v.n_quadrature_points;
348 const unsigned int q = ids[oq];
351 (fe_v.shape_value(j, q) *
352 o_fe_v.shape_value(i, oq) * fe_v.JxW(q));
367 #include "coupling.inst" 371 DEAL_II_NAMESPACE_CLOSE
Transformed quadrature weights.
static const unsigned int invalid_unsigned_int
active_cell_iterator begin_active(const unsigned int level=0) const
#define AssertDimension(dim1, dim2)
Transformed quadrature points.
const Triangulation< dim, spacedim > & get_triangulation() const
void create_coupling_sparsity_pattern(const DoFHandler< dim0, spacedim > &space_dh, const DoFHandler< dim1, spacedim > &immersed_dh, const Quadrature< dim1 > &quad, Sparsity &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 std::vector< Point< spacedim > > & get_quadrature_points() const
#define Assert(cond, exc)
types::global_dof_index n_dofs() const
Abstract base class for mapping classes.
unsigned int size() const
void distribute_local_to_global(const InVector &local_vector, const std::vector< size_type > &local_dof_indices, OutVector &global_vector) const
cell_iterator end() const
void reinit(const TriaIterator< DoFCellAccessor< DoFHandlerType< dim, spacedim >, level_dof_access >> &cell)
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 FiniteElement< dim, spacedim > & get_fe(const unsigned int index=0) const
void add_entries_local_to_global(const std::vector< size_type > &local_dof_indices, SparsityPatternType &sparsity_pattern, const bool keep_constrained_entries=true, const Table< 2, bool > &dof_mask=Table< 2, bool >()) const
static::ExceptionBase & ExcNotImplemented()
typename ActiveSelector::cell_iterator cell_iterator
typename ActiveSelector::active_cell_iterator active_cell_iterator