16#ifndef dealii_tensor_product_matrix_creator_h
17#define dealii_tensor_product_matrix_creator_h
65 template <
int dim,
typename Number>
66 std::pair<std::array<FullMatrix<Number>, dim>,
67 std::array<FullMatrix<Number>, dim>>
79 template <
int dim,
typename Number>
80 std::pair<std::array<FullMatrix<Number>, dim>,
81 std::array<FullMatrix<Number>, dim>>
102 template <
typename Number>
105 const unsigned int n,
115 template <
typename Number>
125 dof_handler.distribute_dofs(fe);
129 const unsigned int n_dofs_1D = fe.n_dofs_per_cell();
142 const auto lexicographic_to_hierarchic_numbering =
144 FETools::hierarchic_to_lexicographic_numbering<1>(
145 fe.tensor_degree()));
147 for (
const unsigned int q_index : fe_values.quadrature_point_indices())
148 for (
const unsigned int i : fe_values.dof_indices())
149 for (
const unsigned int j : fe_values.dof_indices())
152 (fe_values.shape_value(lexicographic_to_hierarchic_numbering[i],
154 fe_values.shape_value(lexicographic_to_hierarchic_numbering[
j],
156 fe_values.JxW(q_index));
159 (fe_values.shape_grad(lexicographic_to_hierarchic_numbering[i],
161 fe_values.shape_grad(lexicographic_to_hierarchic_numbering[
j],
163 fe_values.JxW(q_index));
173 template <
int dim,
typename Number>
174 std::pair<std::array<FullMatrix<Number>, dim>,
175 std::array<FullMatrix<Number>, dim>>
184 const auto create_reference_mass_and_stiffness_matrices =
185 internal::create_reference_mass_and_stiffness_matrices<Number>(
189 std::get<0>(create_reference_mass_and_stiffness_matrices);
191 std::get<1>(create_reference_mass_and_stiffness_matrices);
193 std::get<2>(create_reference_mass_and_stiffness_matrices);
205 std::array<FullMatrix<Number>, dim>
Ms;
206 std::array<FullMatrix<Number>, dim>
Ks;
208 for (
unsigned int d = 0; d < dim; ++d)
214 for (
unsigned int i = 0; i <
n_dofs_1D; ++i)
229 for (
unsigned int i = 0; i <
n_overlap; ++i)
266 for (
unsigned int i = 0; i <
n_overlap; ++i)
303 template <
int dim,
typename Number>
304 std::pair<std::array<FullMatrix<Number>, dim>,
305 std::array<FullMatrix<Number>, dim>>
317 for (
unsigned int d = 0; d < dim; ++d)
320 if ((cell->at_boundary(2 * d) ==
false) ||
321 cell->has_periodic_neighbor(2 * d))
330 const auto bid = cell->face(2 * d)->boundary_id();
350 if ((cell->at_boundary(2 * d + 1) ==
false) ||
351 cell->has_periodic_neighbor(2 * d + 1))
359 const auto bid = cell->face(2 * d + 1)->boundary_id();
void reinit(value_type *starting_element, const std::size_t n_elements)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
#define AssertThrow(cond, exc)
@ update_values
Shape function values.
@ update_JxW_values
Transformed quadrature weights.
@ update_gradients
Shape function gradients.
void hyper_cube(Triangulation< dim, spacedim > &tria, const double left=0., const double right=1., const bool colorize=false)
void clear_row_and_column(const unsigned int n_dofs_1D_with_overlap, const unsigned int n, FullMatrix< Number > &matrix)
std::tuple< FullMatrix< Number >, FullMatrix< Number >, bool > create_reference_mass_and_stiffness_matrices(const FiniteElement< 1 > &fe, const Quadrature< 1 > &quadrature)
std::pair< std::array< FullMatrix< Number >, dim >, std::array< FullMatrix< Number >, dim > > create_laplace_tensor_product_matrix(const FiniteElement< 1 > &fe, const Quadrature< 1 > &quadrature, const ::ndarray< LaplaceBoundaryType, dim, 2 > &boundary_ids, const ::ndarray< double, dim, 3 > &cell_extent, const unsigned int n_overlap=1)
std::vector< Integer > invert_permutation(const std::vector< Integer > &permutation)
const ::Triangulation< dim, spacedim > & tria