55 zero_indices(
unsigned int (&indices)[dim])
57 for (
unsigned int d = 0;
d < dim; ++
d)
68 increment_indices(
unsigned int (&indices)[dim],
const unsigned int dofs1d)
71 for (
unsigned int d = 0;
d < dim - 1; ++
d)
72 if (indices[
d] == dofs1d)
88 template <
int xdim,
int xspacedim>
95 template <
int spacedim>
104 template <
int spacedim>
109 const unsigned int dim = 2;
111 unsigned int q_deg = fe.
degree;
160 std::vector<
Point<dim - 1>> constraint_points;
162 constraint_points.emplace_back(0.5);
166 const unsigned int n = q_deg - 1;
167 const double step = 1. / q_deg;
169 for (
unsigned int i = 1; i <= n; ++i)
170 constraint_points.push_back(
174 for (
unsigned int i = 1; i <= n; ++i)
175 constraint_points.push_back(
188 const std::vector<unsigned int> &index_map_inverse =
190 const std::vector<unsigned int> face_index_map =
197 for (
unsigned int i = 0; i < constraint_points.size(); ++i)
198 for (
unsigned int j = 0; j < q_deg + 1; ++j)
201 p[0] = constraint_points[i](0);
203 fe.
poly_space->compute_value(index_map_inverse[j], p);
215 template <
int spacedim>
220 const unsigned int dim = 3;
222 unsigned int q_deg = fe.
degree;
242 std::vector<
Point<dim - 1>> constraint_points;
245 constraint_points.emplace_back(0.5, 0.5);
248 constraint_points.emplace_back(0, 0.5);
249 constraint_points.emplace_back(1, 0.5);
250 constraint_points.emplace_back(0.5, 0);
251 constraint_points.emplace_back(0.5, 1);
255 const unsigned int n = q_deg - 1;
256 const double step = 1. / q_deg;
257 std::vector<
Point<dim - 2>> line_support_points(n);
258 for (
unsigned int i = 0; i < n; ++i)
259 line_support_points[i](0) = (i + 1) * step;
260 Quadrature<dim - 2> qline(line_support_points);
263 std::vector<
Point<dim - 1>> p_line(n);
269 ReferenceCells::get_hypercube<dim - 1>(), qline, 0, 0, p_line);
270 for (
unsigned int i = 0; i < n; ++i)
274 ReferenceCells::get_hypercube<dim - 1>(), qline, 0, 1, p_line);
275 for (
unsigned int i = 0; i < n; ++i)
279 ReferenceCells::get_hypercube<dim - 1>(), qline, 2, 0, p_line);
280 for (
unsigned int i = 0; i < n; ++i)
284 ReferenceCells::get_hypercube<dim - 1>(), qline, 2, 1, p_line);
285 for (
unsigned int i = 0; i < n; ++i)
289 for (
unsigned int face = 0;
292 for (
unsigned int subface = 0;
297 ReferenceCells::get_hypercube<dim - 1>(),
302 constraint_points.insert(constraint_points.end(),
308 std::vector<
Point<dim - 1>> inner_points(n * n);
309 for (
unsigned int i = 0, iy = 1; iy <= n; ++iy)
310 for (
unsigned int ix = 1; ix <= n; ++ix)
314 for (
unsigned int child = 0;
317 for (
const auto &inner_point : inner_points)
318 constraint_points.push_back(
325 const unsigned int pnts = (q_deg + 1) * (q_deg + 1);
329 const std::vector<unsigned int> &index_map_inverse =
331 const std::vector<unsigned int> face_index_map =
341 for (
unsigned int i = 0; i < constraint_points.size(); ++i)
343 const double interval =
static_cast<double>(q_deg * 2);
344 bool mirror[dim - 1];
356 for (
unsigned int k = 0; k < dim - 1; ++k)
358 const int coord_int =
359 static_cast<int>(constraint_points[i](k) * interval + 0.25);
360 constraint_point(k) = 1. * coord_int / interval;
382 mirror[k] = (constraint_point(k) > 0.5);
384 constraint_point(k) = 1.0 - constraint_point(k);
387 for (
unsigned int j = 0; j < pnts; ++j)
389 unsigned int indices[2] = {j % (q_deg + 1), j / (q_deg + 1)};
391 for (
unsigned int k = 0; k < 2; ++k)
393 indices[k] = q_deg - indices[k];
395 const unsigned int new_index =
396 indices[1] * (q_deg + 1) + indices[0];
399 fe.
poly_space->compute_value(index_map_inverse[new_index],
416 template <
int dim,
int spacedim>
420 const std::vector<bool> & restriction_is_additive_flags)
424 restriction_is_additive_flags,
427 &poly_space) != nullptr ?
434 template <
int dim,
int spacedim>
439 ExcMessage(
"The first support point has to be zero."));
440 Assert(points.back()[0] == 1,
441 ExcMessage(
"The last support point has to be one."));
446 const unsigned int q_dofs_per_cell =
447 Utilities::fixed_power<dim>(q_degree + 1);
448 Assert(q_dofs_per_cell == this->n_dofs_per_cell() ||
449 q_dofs_per_cell + 1 == this->n_dofs_per_cell() ||
450 q_dofs_per_cell + dim == this->n_dofs_per_cell(),
453 [
this, q_dofs_per_cell]() {
454 std::vector<unsigned int> renumber =
455 FETools::hierarchic_to_lexicographic_numbering<dim>(q_degree);
456 for (
unsigned int i = q_dofs_per_cell; i < this->n_dofs_per_cell(); ++i)
457 renumber.push_back(i);
458 auto *tensor_poly_space_ptr =
460 if (tensor_poly_space_ptr !=
nullptr)
465 auto *tensor_piecewise_poly_space_ptr =
dynamic_cast<
467 *>(this->poly_space.get());
468 if (tensor_piecewise_poly_space_ptr !=
nullptr)
473 auto *tensor_bubbles_poly_space_ptr =
475 this->poly_space.get());
476 if (tensor_bubbles_poly_space_ptr !=
nullptr)
481 auto *tensor_const_poly_space_ptr =
483 this->poly_space.get());
484 if (tensor_const_poly_space_ptr !=
nullptr)
510 template <
int dim,
int spacedim>
521 Assert(interpolation_matrix.
m() == this->n_dofs_per_cell(),
523 this->n_dofs_per_cell()));
529 const unsigned int q_dofs_per_cell =
530 Utilities::fixed_power<dim>(q_degree + 1);
531 const unsigned int source_q_dofs_per_cell =
532 Utilities::fixed_power<dim>(source_fe->degree + 1);
538 for (
unsigned int j = 0; j < q_dofs_per_cell; ++j)
545 Assert(std::abs(this->poly_space->compute_value(j, p) - 1.) < 1
e-13,
548 for (
unsigned int i = 0; i < source_q_dofs_per_cell; ++i)
549 interpolation_matrix(j, i) =
550 source_fe->poly_space->compute_value(i, p);
554 if (q_dofs_per_cell < this->n_dofs_per_cell())
557 source_fe->n_dofs_per_cell());
558 for (
unsigned int i = 0; i < source_q_dofs_per_cell; ++i)
559 interpolation_matrix(q_dofs_per_cell, i) = 0.;
560 for (
unsigned int j = 0; j < q_dofs_per_cell; ++j)
561 interpolation_matrix(j, source_q_dofs_per_cell) = 0.;
562 interpolation_matrix(q_dofs_per_cell, source_q_dofs_per_cell) = 1.;
566 const double eps = 2
e-13 * q_degree * dim;
567 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
568 for (
unsigned int j = 0; j < source_fe->n_dofs_per_cell(); ++j)
570 interpolation_matrix(i, j) = 0.;
575 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
578 for (
unsigned int j = 0; j < source_fe->n_dofs_per_cell(); ++j)
579 sum += interpolation_matrix(i, j);
605 spacedim>::ExcInterpolationNotImplemented()));
610 template <
int dim,
int spacedim>
615 const unsigned int face_no)
const
617 get_subface_interpolation_matrix(source_fe,
619 interpolation_matrix,
625 template <
int dim,
int spacedim>
629 const unsigned int subface,
631 const unsigned int face_no)
const
644 Assert(interpolation_matrix.
n() == this->n_dofs_per_face(face_no),
646 this->n_dofs_per_face(face_no)));
656 spacedim>::ExcInterpolationNotImplemented()));
665 const double eps = 2
e-13 * this->q_degree *
std::max(dim - 1, 1);
685 for (
unsigned int j = 0; j < this->n_dofs_per_face(face_no); ++j)
687 double matrix_entry =
688 this->shape_value(this->face_to_cell_index(j, 0), p);
698 interpolation_matrix(i, j) = matrix_entry;
709 for (
unsigned int i = 0; i < this->n_dofs_per_face(face_no); ++i)
710 sum += interpolation_matrix(j, i);
724 spacedim>::ExcInterpolationNotImplemented()));
729 template <
int dim,
int spacedim>
738 template <
int dim,
int spacedim>
739 std::vector<std::pair<unsigned int, unsigned int>>
782 template <
int dim,
int spacedim>
783 std::vector<std::pair<unsigned int, unsigned int>>
800 const unsigned int p = this->degree;
801 const unsigned int q = fe_q_other->degree;
803 std::vector<std::pair<unsigned int, unsigned int>> identities;
805 const std::vector<unsigned int> &index_map_inverse =
806 this->get_poly_space_numbering_inverse();
807 const std::vector<unsigned int> &index_map_inverse_other =
808 fe_q_other->get_poly_space_numbering_inverse();
810 for (
unsigned int i = 0; i < p - 1; ++i)
811 for (
unsigned int j = 0; j < q - 1; ++j)
814 fe_q_other->unit_support_points[index_map_inverse_other[j + 1]]
816 identities.emplace_back(i, j);
837 const std::vector<unsigned int> &index_map_inverse_q =
838 this->get_poly_space_numbering_inverse();
840 std::vector<std::pair<unsigned int, unsigned int>> identities;
842 for (
unsigned int i = 0; i < this->degree - 1; ++i)
843 for (
unsigned int j = 0; j < fe_p_other->degree - 1; ++j)
846 fe_p_other->get_unit_support_points()[j + 3][0]) < 1
e-14)
847 identities.emplace_back(i, j);
877 template <
int dim,
int spacedim>
878 std::vector<std::pair<unsigned int, unsigned int>>
881 const unsigned int)
const
893 const unsigned int p = this->degree;
894 const unsigned int q = fe_q_other->degree;
896 std::vector<std::pair<unsigned int, unsigned int>> identities;
898 const std::vector<unsigned int> &index_map_inverse =
899 this->get_poly_space_numbering_inverse();
900 const std::vector<unsigned int> &index_map_inverse_other =
901 fe_q_other->get_poly_space_numbering_inverse();
903 for (
unsigned int i1 = 0; i1 < p - 1; ++i1)
904 for (
unsigned int i2 = 0; i2 < p - 1; ++i2)
905 for (
unsigned int j1 = 0; j1 < q - 1; ++j1)
906 for (
unsigned int j2 = 0; j2 < q - 1; ++j2)
917 identities.emplace_back(i1 * (p - 1) + i2, j1 * (q - 1) + j2);
925 return std::vector<std::pair<unsigned int, unsigned int>>();
936 return std::vector<std::pair<unsigned int, unsigned int>>();
941 return std::vector<std::pair<unsigned int, unsigned int>>();
953 template <
int dim,
int spacedim>
956 const std::vector<
Point<1>> &points)
958 const std::vector<unsigned int> &index_map_inverse =
959 this->get_poly_space_numbering_inverse();
971 for (
unsigned int k = 0; k < support_quadrature.
size(); ++k)
973 support_quadrature.
point(k);
978 template <
int dim,
int spacedim>
981 const std::vector<
Point<1>> &points)
986 const unsigned int face_no = 0;
988 this->unit_face_support_points[face_no].resize(
989 Utilities::fixed_power<dim - 1>(q_degree + 1));
997 const std::vector<unsigned int> face_index_map =
1005 const Quadrature<dim - 1> support_quadrature(support_1d);
1009 this->unit_face_support_points[face_no].resize(support_quadrature.size());
1010 for (
unsigned int k = 0; k < support_quadrature.size(); ++k)
1011 this->unit_face_support_points[face_no][face_index_map[k]] =
1012 support_quadrature.point(k);
1017 template <
int dim,
int spacedim>
1028 const unsigned int face_no = 0;
1031 this->adjust_quad_dof_index_for_face_orientation_table[0].n_elements() ==
1033 this->n_dofs_per_quad(face_no),
1036 const unsigned int n = q_degree - 1;
1057 for (
unsigned int local = 0; local < this->n_dofs_per_quad(face_no); ++local)
1061 unsigned int i = local % n, j = local / n;
1064 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1068 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1070 i + (n - 1 - j) * n - local;
1072 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1074 (n - 1 - j) + (n - 1 - i) * n - local;
1076 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1078 (n - 1 - i) + j * n - local;
1080 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1083 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1085 j + (n - 1 - i) * n - local;
1087 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1089 (n - 1 - i) + (n - 1 - j) * n - local;
1091 this->adjust_quad_dof_index_for_face_orientation_table[face_no](local,
1093 (n - 1 - j) + i * n - local;
1097 for (
unsigned int i = 0; i < this->n_dofs_per_line(); ++i)
1098 this->adjust_line_dof_index_for_line_orientation_table[i] =
1099 this->n_dofs_per_line() - 1 - i - i;
1104 template <
int dim,
int spacedim>
1107 const unsigned int face,
1108 const bool face_orientation,
1109 const bool face_flip,
1110 const bool face_rotation)
const
1126 if (face_index < this->get_first_face_line_index(face))
1131 const unsigned int face_vertex = face_index / this->n_dofs_per_vertex();
1132 const unsigned int dof_index_on_vertex =
1133 face_index % this->n_dofs_per_vertex();
1138 face, face_vertex, face_orientation, face_flip, face_rotation) *
1139 this->n_dofs_per_vertex() +
1140 dof_index_on_vertex);
1142 else if (face_index < this->get_first_face_quad_index(face))
1147 const unsigned int index =
1148 face_index - this->get_first_face_line_index(face);
1150 const unsigned int face_line = index / this->n_dofs_per_line();
1151 const unsigned int dof_index_on_line = index % this->n_dofs_per_line();
1155 unsigned int adjusted_dof_index_on_line = 0;
1165 if (face_flip ==
false)
1166 adjusted_dof_index_on_line = dof_index_on_line;
1168 adjusted_dof_index_on_line =
1169 this->n_dofs_per_line() - dof_index_on_line - 1;
1180 Assert((this->n_dofs_per_line() <= 1) ||
1181 ((face_orientation ==
true) && (face_flip ==
false) &&
1182 (face_rotation ==
false)),
1184 adjusted_dof_index_on_line = dof_index_on_line;
1191 return (this->get_first_line_index() +
1193 face, face_line, face_orientation, face_flip, face_rotation) *
1194 this->n_dofs_per_line() +
1195 adjusted_dof_index_on_line);
1203 const unsigned int index =
1204 face_index - this->get_first_face_quad_index(face);
1209 Assert((this->n_dofs_per_quad(face) <= 1) ||
1210 ((face_orientation ==
true) && (face_flip ==
false) &&
1211 (face_rotation ==
false)),
1213 return (this->get_first_quad_index(face) + index);
1219 template <
int dim,
int spacedim>
1220 std::vector<unsigned int>
1224 AssertThrow(degree > 0,
typename FEQ::ExcFEQCannotHaveDegree0());
1225 std::vector<unsigned int> dpo(dim + 1, 1U);
1226 for (
unsigned int i = 1; i < dpo.size(); ++i)
1227 dpo[i] = dpo[i - 1] * (degree - 1);
1233 template <
int dim,
int spacedim>
1236 const std::vector<
Point<1>> &points)
1238 Implementation::initialize_constraints(points, *
this);
1243 template <
int dim,
int spacedim>
1246 const unsigned int child,
1253 "Prolongation matrices are only available for refined cells!"));
1257 if (this->prolongation[refinement_case - 1][child].n() == 0)
1259 std::lock_guard<std::mutex> lock(this->mutex);
1262 if (this->prolongation[refinement_case - 1][child].n() ==
1263 this->n_dofs_per_cell())
1264 return this->prolongation[refinement_case - 1][child];
1267 const unsigned int q_dofs_per_cell =
1268 Utilities::fixed_power<dim>(q_degree + 1);
1276 const double eps = 1
e-15 * q_degree * dim;
1281 for (
unsigned int i = 0; i < q_dofs_per_cell; ++i)
1284 i, this->unit_support_points[i])) <
eps,
1286 "to one or zero in a nodal point. "
1287 "This typically indicates that the "
1288 "polynomial interpolation is "
1289 "ill-conditioned such that round-off "
1290 "prevents the sum to be one."));
1291 for (
unsigned int j = 0; j < q_dofs_per_cell; ++j)
1294 i, this->unit_support_points[j])) <
eps,
1296 "The Lagrange polynomial does not evaluate "
1297 "to one or zero in a nodal point. "
1298 "This typically indicates that the "
1299 "polynomial interpolation is "
1300 "ill-conditioned such that round-off "
1301 "prevents the sum to be one."));
1309 const unsigned int dofs1d = q_degree + 1;
1310 std::vector<Table<2, double>> subcell_evaluations(
1313 const std::vector<unsigned int> &index_map_inverse =
1314 this->get_poly_space_numbering_inverse();
1318 unsigned int step_size_diag = 0;
1320 unsigned int factor = 1;
1321 for (
unsigned int d = 0;
d < dim; ++
d)
1323 step_size_diag += factor;
1329 this->n_dofs_per_cell());
1333 for (
unsigned int j = 0; j < dofs1d; ++j)
1335 const unsigned int diag_comp = index_map_inverse[j * step_size_diag];
1341 for (
unsigned int i = 0; i < dofs1d; ++i)
1342 for (
unsigned int d = 0;
d < dim; ++
d)
1347 const double cell_value =
1348 this->poly_space->compute_value(index_map_inverse[i],
point);
1368 subcell_evaluations[
d](j, i) = 0;
1370 subcell_evaluations[
d](j, i) = cell_value;
1376 unsigned int j_indices[dim];
1377 internal::FE_Q_Base::zero_indices<dim>(j_indices);
1378 for (
unsigned int j = 0; j < q_dofs_per_cell; j += dofs1d)
1380 unsigned int i_indices[dim];
1381 internal::FE_Q_Base::zero_indices<dim>(i_indices);
1382 for (
unsigned int i = 0; i < q_dofs_per_cell; i += dofs1d)
1384 double val_extra_dim = 1.;
1385 for (
unsigned int d = 1;
d < dim; ++
d)
1387 subcell_evaluations[
d](j_indices[
d - 1], i_indices[
d - 1]);
1391 for (
unsigned int jj = 0; jj < dofs1d; ++jj)
1393 const unsigned int j_ind = index_map_inverse[j + jj];
1394 for (
unsigned int ii = 0; ii < dofs1d; ++ii)
1395 prolongate(j_ind, index_map_inverse[i + ii]) =
1396 val_extra_dim * subcell_evaluations[0](jj, ii);
1401 internal::FE_Q_Base::increment_indices<dim>(i_indices, dofs1d);
1404 internal::FE_Q_Base::increment_indices<dim>(j_indices, dofs1d);
1409 if (q_dofs_per_cell < this->n_dofs_per_cell())
1410 prolongate(q_dofs_per_cell, q_dofs_per_cell) = 1.;
1415 for (
unsigned int row = 0; row < this->n_dofs_per_cell(); ++row)
1418 for (
unsigned int col = 0; col < this->n_dofs_per_cell(); ++col)
1419 sum += prolongate(row, col);
1421 std::max(
eps, 5
e-16 * std::sqrt(this->n_dofs_per_cell())),
1423 "prolongation matrix do not add to one. "
1424 "This typically indicates that the "
1425 "polynomial interpolation is "
1426 "ill-conditioned such that round-off "
1427 "prevents the sum to be one."));
1433 this->prolongation[refinement_case - 1][child]));
1437 return this->prolongation[refinement_case - 1][child];
1442 template <
int dim,
int spacedim>
1445 const unsigned int child,
1452 "Restriction matrices are only available for refined cells!"));
1456 if (this->restriction[refinement_case - 1][child].n() == 0)
1458 std::lock_guard<std::mutex> lock(this->mutex);
1461 if (this->restriction[refinement_case - 1][child].n() ==
1462 this->n_dofs_per_cell())
1463 return this->restriction[refinement_case - 1][child];
1466 this->n_dofs_per_cell());
1468 const unsigned int q_dofs_per_cell =
1469 Utilities::fixed_power<dim>(q_degree + 1);
1489 const double eps = 1
e-15 * q_degree * dim;
1490 const std::vector<unsigned int> &index_map_inverse =
1491 this->get_poly_space_numbering_inverse();
1493 const unsigned int dofs1d = q_degree + 1;
1494 std::vector<Tensor<1, dim>> evaluations1d(dofs1d);
1496 my_restriction.reinit(this->n_dofs_per_cell(), this->n_dofs_per_cell());
1498 for (
unsigned int i = 0; i < q_dofs_per_cell; ++i)
1500 unsigned int mother_dof = index_map_inverse[i];
1515 for (
unsigned int j = 0; j < dofs1d; ++j)
1516 for (
unsigned int d = 0;
d < dim; ++
d)
1520 evaluations1d[j][
d] =
1521 this->poly_space->compute_value(index_map_inverse[j],
1524 unsigned int j_indices[dim];
1525 internal::FE_Q_Base::zero_indices<dim>(j_indices);
1527 double sum_check = 0;
1529 for (
unsigned int j = 0; j < q_dofs_per_cell; j += dofs1d)
1531 double val_extra_dim = 1.;
1532 for (
unsigned int d = 1;
d < dim; ++
d)
1533 val_extra_dim *= evaluations1d[j_indices[
d - 1]][
d];
1534 for (
unsigned int jj = 0; jj < dofs1d; ++jj)
1542 const double val = val_extra_dim * evaluations1d[jj][0];
1543 const unsigned int child_dof = index_map_inverse[j + jj];
1545 my_restriction(mother_dof, child_dof) = 1.;
1547 my_restriction(mother_dof, child_dof) = val;
1552 internal::FE_Q_Base::increment_indices<dim>(j_indices,
1557 5
e-16 * std::sqrt(this->n_dofs_per_cell())),
1559 "restriction matrix do not add to one. "
1560 "This typically indicates that the "
1561 "polynomial interpolation is "
1562 "ill-conditioned such that round-off "
1563 "prevents the sum to be one."));
1567 if (q_dofs_per_cell < this->n_dofs_per_cell())
1568 my_restriction(this->n_dofs_per_cell() - 1,
1569 this->n_dofs_per_cell() - 1) =
1577 this->restriction[refinement_case - 1][child]));
1580 return this->restriction[refinement_case - 1][child];
1590 template <
int dim,
int spacedim>
1593 const unsigned int shape_index,
1594 const unsigned int face_index)
const
1603 return (((shape_index == 0) && (face_index == 0)) ||
1604 ((shape_index == 1) && (face_index == 1)));
1609 (shape_index >= this->get_first_quad_index(0 ))) ||
1610 ((dim == 3) && (shape_index >= this->get_first_hex_index())))
1614 if (shape_index < this->get_first_line_index())
1619 const unsigned int vertex_no = shape_index;
1623 for (
unsigned int v = 0; v < GeometryInfo<dim>::vertices_per_face; ++v)
1630 else if (shape_index < this->get_first_quad_index(0 ))
1633 const unsigned int line_index =
1634 (shape_index - this->get_first_line_index()) / this->n_dofs_per_line();
1640 return (line_index == face_index);
1644 const unsigned int lines_per_face =
1647 for (
unsigned int l = 0;
l < lines_per_face; ++
l)
1657 else if (shape_index < this->get_first_hex_index())
1660 const unsigned int quad_index =
1661 (shape_index - this->get_first_quad_index(0)) /
1662 this->n_dofs_per_quad(face_index);
1663 Assert(
static_cast<signed int>(quad_index) <
1673 return (quad_index == face_index);
1692 template <
int dim,
int spacedim>
1693 std::pair<Table<2, bool>, std::vector<unsigned int>>
1701 for (
unsigned int i = 0; i < Utilities::fixed_power<dim>(q_degree + 1); ++i)
1702 constant_modes(0, i) =
true;
1703 return std::pair<Table<2, bool>, std::vector<unsigned int>>(
1704 constant_modes, std::vector<unsigned int>(1, 0));
1710 #include "fe_q_base.inst"
std::vector< unsigned int > get_poly_space_numbering_inverse() const
const std::unique_ptr< ScalarPolynomialsBase< dim > > poly_space
const ScalarPolynomialsBase< dim > & get_poly_space() const
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
void initialize(const std::vector< Point< 1 >> &support_points_1d)
void initialize_unit_face_support_points(const std::vector< Point< 1 >> &points)
virtual unsigned int face_to_cell_index(const unsigned int face_dof_index, const unsigned int face, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
void initialize_unit_support_points(const std::vector< Point< 1 >> &points)
void initialize_constraints(const std::vector< Point< 1 >> &points)
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
void initialize_quad_dof_index_permutation()
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other, const unsigned int face_no=0) const override
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
virtual bool hp_constraints_are_implemented() const override
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
FE_Q_Base(const ScalarPolynomialsBase< dim > &poly_space, const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags)
const unsigned int degree
unsigned int n_dofs_per_cell() const
unsigned int n_dofs_per_face(unsigned int face_no=0, unsigned int child=0) const
unsigned int n_components() const
unsigned int n_unique_faces() const
bool has_face_support_points(const unsigned int face_no=0) const
TableIndices< 2 > interface_constraints_size() const
const std::vector< Point< dim - 1 > > & get_unit_face_support_points(const unsigned int face_no=0) const
FullMatrix< double > interface_constraints
static void project_to_subface(const ReferenceCell &reference_cell, const SubQuadrature &quadrature, const unsigned int face_no, const unsigned int subface_no, std::vector< Point< dim >> &q_points, const RefinementCase< dim - 1 > &ref_case=RefinementCase< dim - 1 >::isotropic_refinement)
static void project_to_face(const ReferenceCell &reference_cell, const SubQuadrature &quadrature, const unsigned int face_no, std::vector< Point< dim >> &q_points)
const Point< dim > & point(const unsigned int i) const
unsigned int size() const
SymmetricTensor< rank, dim, Number > sum(const SymmetricTensor< rank, dim, Number > &local, const MPI_Comm mpi_communicator)
void set_numbering(const std::vector< unsigned int > &renumber)
void set_numbering(const std::vector< unsigned int > &renumber)
void set_numbering(const std::vector< unsigned int > &renumber)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
Task< RT > new_task(const std::function< RT()> &function)
Expression fabs(const Expression &x)
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
std::vector< Point< dim > > unit_support_points(const std::vector< Point< 1 >> &line_support_points, const std::vector< unsigned int > &renumbering)
static const unsigned int invalid_unsigned_int
static void initialize_constraints(const std::vector< Point< 1 >> &, FE_Q_Base< 1, spacedim > &)
static void initialize_constraints(const std::vector< Point< 1 >> &, FE_Q_Base< 2, spacedim > &fe)
static void initialize_constraints(const std::vector< Point< 1 >> &, FE_Q_Base< 3, spacedim > &fe)
static Point< dim > child_to_cell_coordinates(const Point< dim > &p, const unsigned int child_index, const RefinementCase< dim > refine_case=RefinementCase< dim >::isotropic_refinement)
static Point< dim > cell_to_child_coordinates(const Point< dim > &p, const unsigned int child_index, const RefinementCase< dim > refine_case=RefinementCase< dim >::isotropic_refinement)
static unsigned int n_children(const RefinementCase< dim > &refinement_case)