17 #include <deal.II/fe/fe_q_hierarchical.h> 18 #include <deal.II/fe/fe_nothing.h> 22 #include <deal.II/base/std_cxx14/memory.h> 29 DEAL_II_NAMESPACE_OPEN
41 std::vector<unsigned int>
42 invert_numbering (
const std::vector<unsigned int> &in)
44 std::vector<unsigned int> out (in.size());
45 for (
unsigned int i=0; i<in.size(); ++i)
47 Assert (in[i] < out.size(),
63 Polynomials::Hierarchical::generate_complete_basis(degree),
67 get_dpo_vector(degree),1, degree).dofs_per_cell, false),
69 get_dpo_vector(degree),1, degree).dofs_per_cell,
std::vector<bool>(1,true))),
70 face_renumber(face_fe_q_hierarchical_to_hierarchic_numbering (degree))
89 std::vector<FullMatrix<double> >
93 std::vector<FullMatrix<double> >
126 std::ostringstream namebuf;
127 namebuf <<
"FE_Q_Hierarchical<" << dim <<
">(" << this->degree <<
")";
129 return namebuf.str();
135 std::unique_ptr<FiniteElement<dim,dim> >
138 return std_cxx14::make_unique<FE_Q_Hierarchical<dim>>(*this);
153 Assert (matrix.m() == this->dofs_per_cell,
155 this->dofs_per_cell));
158 source_fe->dofs_per_cell));
169 if (this->dofs_per_cell >= source_fe->dofs_per_cell)
171 const std::vector<unsigned int> dof_map = this->get_embedding_dofs(source_fe->degree);
172 for (
unsigned int j=0; j < dof_map.size(); j++)
173 matrix[dof_map[j]][j] = 1.;
178 const std::vector<unsigned int> dof_map = source_fe->get_embedding_dofs(this->degree);
179 for (
unsigned int j=0; j < dof_map.size(); j++)
180 matrix[j][dof_map[j]] = 1.;
196 ExcMessage(
"Prolongation matrices are only available for isotropic refinement!"));
201 return this->prolongation[refinement_case-1][child];
215 std::vector<std::pair<unsigned int, unsigned int> >
230 std::vector<std::pair<unsigned int, unsigned int> >
231 (1, std::make_pair (0U, 0U));
239 return std::vector<std::pair<unsigned int, unsigned int> > ();
244 return std::vector<std::pair<unsigned int, unsigned int> > ();
249 std::vector<std::pair<unsigned int, unsigned int> >
259 const unsigned int &this_dpl = this->dofs_per_line;
266 std::vector<std::pair<unsigned int, unsigned int> > res;
267 for (
unsigned int i = 0; i < std::min(this_dpl,other_dpl); i++)
268 res.emplace_back(i, i);
278 return std::vector<std::pair<unsigned int, unsigned int> > ();
283 return std::vector<std::pair<unsigned int, unsigned int> > ();
288 std::vector<std::pair<unsigned int, unsigned int> >
298 const unsigned int &this_dpq = this->dofs_per_quad;
305 std::vector<std::pair<unsigned int, unsigned int> > res;
306 for (
unsigned int i = 0; i < std::min(this_dpq,other_dpq); i++)
307 res.emplace_back(i, i);
317 return std::vector<std::pair<unsigned int, unsigned int> > ();
322 return std::vector<std::pair<unsigned int, unsigned int> > ();
336 if (this->degree < fe_q_other->degree)
338 else if (this->degree == fe_q_other->degree)
345 if (fe_nothing->is_dominating())
372 const unsigned int dofs_1d = 2*this->dofs_per_vertex + this->dofs_per_line;
421 for (
unsigned int c=0; c<GeometryInfo<1>::max_children_per_cell; ++c)
422 for (
unsigned int j=0; j<dofs_1d; ++j)
423 for (
unsigned int k=0; k<dofs_1d; ++k)
426 if ((j<=1) && (k<=1))
428 if (((c==0) && (j==0) && (k==0)) ||
429 ((c==1) && (j==1) && (k==1)))
430 dofs_cell[c](j,k) = 1.;
432 dofs_cell[c](j,k) = 0.;
434 if (((c==0) && (j==1)) || ((c==1) && (j==0)))
435 dofs_subcell[c](j,k) = .5;
436 else if (((c==0) && (k==0)) || ((c==1) && (k==1)))
437 dofs_subcell[c](j,k) = 1.;
439 dofs_subcell[c](j,k) = 0.;
442 else if ((j<=1) && (k>=2))
444 if (((c==0) && (j==1) && ((k % 2)==0)) ||
445 ((c==1) && (j==0) && ((k % 2)==0)))
446 dofs_subcell[c](j,k) = -1.;
449 else if ((j>=2) && (k>=2) && (j<=k))
452 for (
unsigned int i=1; i<=j; ++i)
453 factor *= ((
double) (k-i+1))/((double) i);
457 dofs_subcell[c](j,k) = ((k+j) % 2 == 0) ?
458 std::pow(.5,static_cast<double>(k))*factor :
459 -std::pow(.5,static_cast<double>(k))*factor;
460 dofs_cell[c](j,k) = std::pow(2.,static_cast<double>(j))*factor;
464 dofs_subcell[c](j,k) = std::pow(.5,static_cast<double>(k))*factor;
465 dofs_cell[c](j,k) = ((k+j) % 2 == 0) ?
466 std::pow(2.,static_cast<double>(j))*factor :
467 -std::pow(2.,static_cast<double>(j))*factor;
480 const unsigned int dofs_1d = 2*this->dofs_per_vertex + this->dofs_per_line;
482 this->interface_constraints
483 .TableBase<2,double>::reinit (this->interface_constraints_size());
496 for (
unsigned int i=0; i<dofs_1d; ++i)
497 this->interface_constraints(0,i) = dofs_subcell[0](1,i);
499 for (
unsigned int c=0; c<GeometryInfo<1>::max_children_per_cell; ++c)
500 for (
unsigned int i=0; i<dofs_1d; ++i)
501 for (
unsigned int j=2; j<dofs_1d; ++j)
502 this->interface_constraints(1 + c*(this->degree-1) + j - 2,i) =
503 dofs_subcell[c](j,i);
509 for (
unsigned int i=0; i<dofs_1d * dofs_1d; i++)
512 this->interface_constraints(0,face_renumber[i]) =
513 dofs_subcell[0](1,i % dofs_1d) *
514 dofs_subcell[0](1,(i - (i % dofs_1d)) / dofs_1d);
517 this->interface_constraints(1,face_renumber[i]) =
518 dofs_subcell[0](0, i % dofs_1d) *
519 dofs_subcell[0](1, (i - (i % dofs_1d)) / dofs_1d);
520 this->interface_constraints(2,face_renumber[i]) =
521 dofs_subcell[1](1, i % dofs_1d) *
522 dofs_subcell[0](1, (i - (i % dofs_1d)) / dofs_1d);
523 this->interface_constraints(3,face_renumber[i]) =
524 dofs_subcell[0](1, i % dofs_1d) *
525 dofs_subcell[0](0, (i - (i % dofs_1d)) / dofs_1d);
526 this->interface_constraints(4,face_renumber[i]) =
527 dofs_subcell[1](0, i % dofs_1d) *
528 dofs_subcell[1](1, (i - (i % dofs_1d)) / dofs_1d);
531 for (
unsigned int j=0; j<(this->degree-1); j++)
533 this->interface_constraints(5 + j,face_renumber[i]) =
534 dofs_subcell[0](1, i % dofs_1d) *
535 dofs_subcell[0](2 + j, (i - (i % dofs_1d)) / dofs_1d);
536 this->interface_constraints(5 + (this->degree-1) + j,face_renumber[i]) =
537 dofs_subcell[0](1,i % dofs_1d) *
538 dofs_subcell[1](2 + j, (i - (i % dofs_1d)) / dofs_1d);
539 this->interface_constraints(5 + 2*(this->degree-1) + j,face_renumber[i]) =
540 dofs_subcell[0](2 + j,i % dofs_1d) *
541 dofs_subcell[1](0, (i - (i % dofs_1d)) / dofs_1d);
542 this->interface_constraints(5 + 3*(this->degree-1) + j,face_renumber[i]) =
543 dofs_subcell[1](2 + j, i % dofs_1d) *
544 dofs_subcell[0](1, (i - (i % dofs_1d)) / dofs_1d);
548 for (
unsigned int j=0; j<(this->degree-1); j++)
551 this->interface_constraints(5 + 4*(this->degree-1) + j,face_renumber[i]) =
552 dofs_subcell[0](0, i % dofs_1d) *
553 dofs_subcell[0](2 + j, (i - (i % dofs_1d)) / dofs_1d);
554 this->interface_constraints(5 + 4*(this->degree-1) + (this->degree-1) + j,face_renumber[i]) =
555 dofs_subcell[0](0, i % dofs_1d) *
556 dofs_subcell[1](2 + j, (i - (i % dofs_1d)) / dofs_1d);
558 this->interface_constraints(5 + 4*(this->degree-1) + 2*(this->degree-1) + j,face_renumber[i]) =
559 dofs_subcell[1](1, i % dofs_1d) *
560 dofs_subcell[0](2 + j, (i - (i % dofs_1d)) / dofs_1d);
561 this->interface_constraints(5 + 4*(this->degree-1) + 3*(this->degree-1) + j,face_renumber[i]) =
562 dofs_subcell[1](1, i % dofs_1d) *
563 dofs_subcell[1](2 + j, (i - (i % dofs_1d)) / dofs_1d);
565 this->interface_constraints(5 + 4*(this->degree-1) + 4*(this->degree-1) + j,face_renumber[i]) =
566 dofs_subcell[0](2 + j, i % dofs_1d) *
567 dofs_subcell[0](0, (i - (i % dofs_1d)) / dofs_1d);
568 this->interface_constraints(5 + 4*(this->degree-1) + 5*(this->degree-1) + j,face_renumber[i]) =
569 dofs_subcell[1](2 + j, i % dofs_1d) *
570 dofs_subcell[0](0, (i - (i % dofs_1d)) / dofs_1d);
572 this->interface_constraints(5 + 4*(this->degree-1) + 6*(this->degree-1) + j,face_renumber[i]) =
573 dofs_subcell[0](2 + j, i % dofs_1d) *
574 dofs_subcell[1](1, (i - (i % dofs_1d)) / dofs_1d);
575 this->interface_constraints(5 + 4*(this->degree-1) + 7*(this->degree-1) + j,face_renumber[i]) =
576 dofs_subcell[1](2 + j, i % dofs_1d) *
577 dofs_subcell[1](1, (i - (i % dofs_1d)) / dofs_1d);
581 for (
unsigned int j=0; j<(this->degree-1); j++)
582 for (
unsigned int k=0; k<(this->degree-1); k++)
585 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1),face_renumber[i]) =
586 dofs_subcell[0](2 + j, i % dofs_1d) *
587 dofs_subcell[0](2 + k, (i - (i % dofs_1d)) / dofs_1d);
589 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1) + (this->degree-1)*(this->degree-1),face_renumber[i]) =
590 dofs_subcell[1](2 + j, i % dofs_1d) *
591 dofs_subcell[0](2 + k, (i - (i % dofs_1d)) / dofs_1d);
593 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1) + 2*(this->degree-1)*(this->degree-1),face_renumber[i]) =
594 dofs_subcell[0](2 + j, i % dofs_1d) *
595 dofs_subcell[1](2 + k, (i - (i % dofs_1d)) / dofs_1d);
597 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1) + 3*(this->degree-1)*(this->degree-1),face_renumber[i]) =
598 dofs_subcell[1](2 + j, i % dofs_1d) *
599 dofs_subcell[1](2 + k, (i - (i % dofs_1d)) / dofs_1d);
620 const unsigned int dofs_1d = 2*this->dofs_per_vertex + this->dofs_per_line;
621 const std::vector<unsigned int> &renumber=
622 this->poly_space.get_numbering();
624 for (
unsigned int c=0; c<GeometryInfo<dim>::max_children_per_cell; ++c)
626 this->prolongation[iso][c].reinit (this->dofs_per_cell, this->dofs_per_cell);
627 this->restriction[iso][c].reinit (this->dofs_per_cell, this->dofs_per_cell);
634 for (
unsigned int c=0; c<GeometryInfo<dim>::max_children_per_cell; ++c)
636 this->prolongation[iso][c].fill (dofs_subcell[c]);
637 this->restriction[iso][c].fill (dofs_cell[c]);
652 for (
unsigned int j=0; j<this->dofs_per_cell; ++j)
653 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
658 for (
unsigned int c=0; c<GeometryInfo<2>::max_children_per_cell; ++c)
661 const unsigned int c0 = c%2;
663 const unsigned int c1 = c/2;
665 this->prolongation[iso][c](j,i) =
666 dofs_subcell[c0](renumber[j] % dofs_1d,
667 renumber[i] % dofs_1d) *
668 dofs_subcell[c1]((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d,
669 (renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d);
671 this->restriction[iso][c](j,i) =
672 dofs_cell[c0](renumber[j] % dofs_1d,
673 renumber[i] % dofs_1d) *
674 dofs_cell[c1]((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d,
675 (renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d);
682 for (
unsigned int c=0; c<GeometryInfo<3>::max_children_per_cell; ++c)
685 const unsigned int c0 = c%2;
687 const unsigned int c1 = (c%4)/2;
689 const unsigned int c2 = c/4;
691 this->prolongation[iso][c](j,i) =
692 dofs_subcell[c0](renumber[j] % dofs_1d,
693 renumber[i] % dofs_1d) *
694 dofs_subcell[c1](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d) % dofs_1d,
695 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d) % dofs_1d) *
696 dofs_subcell[c2](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d - (((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d,
697 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d - (((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d);
699 this->restriction[iso][c](j,i) =
700 dofs_cell[c0](renumber[j] % dofs_1d,
701 renumber[i] % dofs_1d) *
702 dofs_cell[c1](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d) % dofs_1d,
703 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d) % dofs_1d) *
704 dofs_cell[c2](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d - (((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d,
705 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d - (((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d);
721 unsigned int n = this->degree+1;
722 for (
unsigned int i=1; i<dim; ++i)
725 this->generalized_support_points.resize(n);
727 const std::vector<unsigned int> &index_map_inverse=
728 this->poly_space.get_numbering_inverse();
759 for (
unsigned int iz=0; iz <= ((dim>2) ? this->degree : 0) ; ++iz)
760 for (
unsigned int iy=0; iy <= ((dim>1) ? this->degree : 0) ; ++iy)
761 for (
unsigned int ix=0; ix<=this->degree; ++ix)
787 this->generalized_support_points[index_map_inverse[k++]] = p;
833 (dynamic_cast<const FEQHierarchical *>(&x_source_fe) !=
nullptr),
836 Assert (interpolation_matrix.
n() == this->dofs_per_face,
838 this->dofs_per_face));
862 ExcInterpolationNotImplemented ()));
863 interpolation_matrix = 0;
875 for (
unsigned int i = 0; i < this->dofs_per_face; ++i)
876 interpolation_matrix (i, i) = 1;
883 for (
unsigned int i = 0; i < GeometryInfo<3>::vertices_per_face; ++i)
884 interpolation_matrix (i, i) = 1;
886 for (
unsigned int i = 0; i < this->degree - 1; ++i)
888 for (
unsigned int j = 0; j < GeometryInfo<3>::lines_per_face; ++j)
889 interpolation_matrix (
893 for (
unsigned int j = 0; j < this->degree - 1; ++j)
894 interpolation_matrix (
910 const unsigned int subface,
919 (dynamic_cast<const FEQHierarchical *>(&x_source_fe) !=
nullptr),
922 Assert (interpolation_matrix.
n() == this->dofs_per_face,
924 this->dofs_per_face));
947 ExcInterpolationNotImplemented ()));
957 interpolation_matrix (0, 0) = 1.0;
958 interpolation_matrix (1, 0) = 0.5;
959 interpolation_matrix (1, 1) = 0.5;
961 for (
unsigned int dof = 2; dof < this->dofs_per_face;)
963 interpolation_matrix (1, dof) = -1.0;
969 for (
int i = 2; i < (int) this->dofs_per_face; ++i)
971 interpolation_matrix (i, i) = std::pow (0.5, i);
973 int factorial_j = factorial_i;
974 int factorial_ij = 1;
976 for (
int j = i + 1; j < (int) this->dofs_per_face; ++j)
978 factorial_ij *= j - i;
982 interpolation_matrix (i, j)
983 = -1.0 * std::pow (0.5, j) *
984 factorial_j / (factorial_i * factorial_ij);
987 interpolation_matrix (i, j)
988 = std::pow (0.5, j) *
989 factorial_j / (factorial_i * factorial_ij);
998 interpolation_matrix (0, 0) = 0.5;
999 interpolation_matrix (0, 1) = 0.5;
1001 for (
unsigned int dof = 2; dof < this->dofs_per_face;)
1003 interpolation_matrix (0, dof) = -1.0;
1007 interpolation_matrix (1, 1) = 1.0;
1009 int factorial_i = 1;
1011 for (
int i = 2; i < (int) this->dofs_per_face; ++i)
1013 interpolation_matrix (i, i) = std::pow (0.5, i);
1015 int factorial_j = factorial_i;
1016 int factorial_ij = 1;
1018 for (
int j = i + 1; j < (int) this->dofs_per_face; ++j)
1020 factorial_ij *= j - i;
1022 interpolation_matrix (i, j)
1023 = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1038 interpolation_matrix (0, 0) = 1.0;
1039 interpolation_matrix (1, 0) = 0.5;
1040 interpolation_matrix (1, 1) = 0.5;
1041 interpolation_matrix (2, 0) = 0.5;
1042 interpolation_matrix (2, 2) = 0.5;
1044 for (
unsigned int i = 0; i < this->degree - 1;)
1046 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1047 interpolation_matrix (3, i + line * (this->degree - 1) + 4) = -0.5;
1049 for (
unsigned int j = 0; j < this->degree - 1;)
1051 interpolation_matrix (3, i + (j + 4) * this->degree - j) = 1.0;
1055 interpolation_matrix (1, i + 2 * (this->degree + 1)) = -1.0;
1056 interpolation_matrix (2, i + 4) = -1.0;
1060 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1061 interpolation_matrix (3, vertex) = 0.25;
1063 int factorial_i = 1;
1065 for (
int i = 2; i <= (int) this->degree; ++i)
1067 double tmp = std::pow (0.5, i);
1068 interpolation_matrix (i + 2, i + 2) = tmp;
1069 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1071 interpolation_matrix (i + source_fe.
degree + 1, i + 2) = tmp;
1072 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1073 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 2 * this->degree) = tmp;
1074 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1077 for (
unsigned int j = 0; j < this->degree - 1;)
1079 interpolation_matrix (i + source_fe.
degree + 1, (i + 2) * this->degree + j + 2 - i) = tmp;
1080 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + (j + 4) * this->degree - j - 2) = tmp;
1084 int factorial_k = 1;
1086 for (
int j = 2; j <= (int) this->degree; ++j)
1088 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1090 int factorial_kl = 1;
1091 int factorial_l = factorial_k;
1093 for (
int k = j + 1; k < (int) this->degree; ++k)
1095 factorial_kl *= k - j;
1099 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (k + 2) * this->degree - k) = -1.0 * std::pow (0.5, i + k) * factorial_l / (factorial_k * factorial_kl);
1102 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (k + 2) * this->degree - k) = std::pow (0.5, i + k) * factorial_l / (factorial_k * factorial_kl);
1107 int factorial_j = factorial_i;
1108 int factorial_ij = 1;
1110 for (
int j = i + 1; j <= (int) this->degree; ++j)
1112 factorial_ij *= j - i;
1117 tmp = -1.0 * std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1118 interpolation_matrix (i + 2, j + 2) = tmp;
1119 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1122 for (
int k = 2; k <= (int) this->degree; ++k)
1124 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1126 int factorial_l = factorial_k;
1127 int factorial_kl = 1;
1129 for (
int l = k + 1; l <= (int) this->degree; ++l)
1131 factorial_kl *= l - k;
1135 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = -1.0 * tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1138 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1143 interpolation_matrix (i + source_fe.
degree + 1, j + 2) = tmp;
1144 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1145 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 2 * this->degree) = tmp;
1146 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1149 for (
unsigned int k = 0; k < this->degree - 1;)
1151 interpolation_matrix (i + source_fe.
degree + 1, (j + 2) * this->degree + k + 2 - j) = tmp;
1152 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + (k + 4) * this->degree - k - 2) = tmp;
1158 tmp = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1159 interpolation_matrix (i + 2, j + 2) = tmp;
1160 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1163 for (
int k = 2; k <= (int) this->degree; ++k)
1165 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1167 int factorial_l = factorial_k;
1168 int factorial_kl = 1;
1170 for (
int l = k + 1; l <= (int) this->degree; ++l)
1172 factorial_kl *= l - k;
1176 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = -1.0 * tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1179 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1184 interpolation_matrix (i + source_fe.
degree + 1, j + 2) = tmp;
1185 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1186 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 2 * this->degree) = tmp;
1187 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1190 for (
unsigned int k = 0; k < this->degree - 1;)
1192 interpolation_matrix (i + source_fe.
degree + 1, (j + 2) * this->degree + k + 2 - j) = tmp;
1193 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + (k + 4) * this->degree - k - 2) = tmp;
1205 interpolation_matrix (0, 0) = 0.5;
1206 interpolation_matrix (0, 1) = 0.5;
1207 interpolation_matrix (1, 1) = 1.0;
1208 interpolation_matrix (3, 1) = 0.5;
1209 interpolation_matrix (3, 3) = 0.5;
1211 for (
unsigned int i = 0; i < this->degree - 1;)
1213 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1214 interpolation_matrix (2, i + line * (this->degree - 1) + 4) = -0.5;
1216 for (
unsigned int j = 0; j < this->degree - 1;)
1218 interpolation_matrix (2, i + (j + 4) * this->degree - j) = 1.0;
1222 interpolation_matrix (0, i + 2 * (this->degree + 1)) = -1.0;
1223 interpolation_matrix (3, i + this->degree + 3) = -1.0;
1227 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1228 interpolation_matrix (2, vertex) = 0.25;
1230 int factorial_i = 1;
1232 for (
int i = 2; i <= (int) this->degree; ++i)
1234 double tmp = std::pow (0.5, i + 1);
1235 interpolation_matrix (i + 2, i + 2) = tmp;
1236 interpolation_matrix (i + 2, i + this->degree + 1) = tmp;
1237 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 2 * this->degree) = tmp;
1238 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1241 for (
unsigned int j = 0; j < this->degree - 1;)
1243 interpolation_matrix (i + 2, j + (i + 2) * this->degree + 2 - i) = tmp;
1244 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + (j + 4) * this->degree - j - 2) = tmp;
1249 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1250 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1252 int factorial_j = factorial_i;
1253 int factorial_ij = 1;
1255 for (
int j = i + 1; j <= (int) this->degree; ++j)
1257 factorial_ij *= j - i;
1259 tmp = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1260 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1261 int factorial_k = 1;
1263 for (
int k = 2; k <= (int) this->degree; ++k)
1265 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1267 int factorial_l = factorial_k;
1268 int factorial_kl = 1;
1270 for (
int l = k + 1; l <= (int) this->degree; ++l)
1272 factorial_kl *= l - k;
1276 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = -1.0 * tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1279 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1285 for (
unsigned int k = 0; k < this->degree - 1;)
1287 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + (k + 4) * this->degree - k - 2) = tmp;
1292 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 2 * this->degree) = tmp;
1293 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1298 interpolation_matrix (i + 2, j + 2) = tmp;
1299 interpolation_matrix (i + 2, j + this->degree + 1) = tmp;
1300 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = 2.0 * tmp;
1303 for (
unsigned int k = 0; k < this->degree - 1;)
1305 interpolation_matrix (i + 2, k + (j + 2) * this->degree + 2 - j) = tmp;
1310 int factorial_k = 1;
1312 for (
int j = 2; j <= (int) this->degree; ++j)
1314 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1316 int factorial_l = factorial_k;
1317 int factorial_kl = 1;
1319 for (
int k = j + 1; k <= (int) this->degree; ++k)
1321 factorial_kl *= k - j;
1325 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (k + 2) * this->degree - k) = -1.0 * std::pow (0.5, i + k) * factorial_l / (factorial_k * factorial_kl);
1328 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (k + 2) * this->degree - k) = std::pow (0.5, i + k) * factorial_l / (factorial_k * factorial_kl);
1338 interpolation_matrix (0, 0) = 0.5;
1339 interpolation_matrix (0, 2) = 0.5;
1340 interpolation_matrix (2, 2) = 1.0;
1341 interpolation_matrix (3, 2) = 0.5;
1342 interpolation_matrix (3, 3) = 0.5;
1344 for (
unsigned int i = 0; i < this->degree - 1;)
1346 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1347 interpolation_matrix (1, i + line * (this->degree - 1) + 4) = -0.5;
1349 for (
unsigned int j = 0; j < this->degree - 1;)
1351 interpolation_matrix (1, i + (j + 4) * this->degree - j) = 1.0;
1355 interpolation_matrix (0, i + 4) = -1.0;
1356 interpolation_matrix (3, i + 3 * this->degree + 1) = -1.0;
1360 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1361 interpolation_matrix (1, vertex) = 0.25;
1363 int factorial_i = 1;
1365 for (
int i = 2; i <= (int) this->degree; ++i)
1367 double tmp = std::pow (0.5, i);
1368 interpolation_matrix (i + 2, i + 2) = tmp;
1369 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1371 interpolation_matrix (i + source_fe.
degree + 1, i + 2) = tmp;
1372 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1373 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1374 interpolation_matrix (i + 2 * source_fe.
degree, i + 3 * this->degree - 1) = tmp;
1377 for (
unsigned int j = 0; j < this->degree - 1;)
1379 interpolation_matrix (i + source_fe.
degree + 1, j + (i + 2) * this->degree + 2 - i) = tmp;
1380 interpolation_matrix (i + 2 * source_fe.
degree, i + (j + 4) * this->degree - j - 2) = tmp;
1384 int factorial_k = 1;
1386 for (
int j = 2; j <= (int) this->degree; ++j)
1388 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1390 int factorial_kl = 1;
1391 int factorial_l = factorial_k;
1393 for (
int k = j + 1; k <= (int) this->degree; ++k)
1395 factorial_kl *= k - j;
1397 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (k + 2) * this->degree - k) = std::pow (0.5, i + k) * factorial_l / (factorial_k * factorial_kl);
1402 int factorial_j = factorial_i;
1403 int factorial_ij = 1;
1405 for (
int j = i + 1; j <= (int) this->degree; ++j)
1407 factorial_ij *= j - i;
1409 tmp = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1410 interpolation_matrix (i + 2, j + 2) = tmp;
1413 for (
unsigned int k = 0; k < this->degree - 1;)
1415 interpolation_matrix (i + source_fe.
degree + 1, k + (j + 2) * this->degree + 2 - j) = tmp;
1420 interpolation_matrix (i + source_fe.
degree + 1, j + 2) = tmp;
1421 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1426 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1427 interpolation_matrix (i + 2 * source_fe.
degree, j + 3 * this->degree - 1) = tmp;
1429 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1430 int factorial_k = 1;
1432 for (
int k = 2; k <= (int) this->degree; ++k)
1434 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1436 int factorial_l = factorial_k;
1437 int factorial_kl = 1;
1439 for (
int l = k + 1; l <= (int) this->degree; ++l)
1441 factorial_kl *= l - k;
1443 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1449 for (
unsigned int k = 0; k < this->degree - 1;)
1451 interpolation_matrix (i + 2 * source_fe.
degree, j + (k + 4) * this->degree - k - 2) = tmp;
1462 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1463 interpolation_matrix (0, vertex) = 0.25;
1465 for (
unsigned int i = 0; i < this->degree - 1;)
1467 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1468 interpolation_matrix (0, i + line * (this->degree - 1) + 4) = -0.5;
1470 for (
unsigned int j = 0; j < this->degree - 1;)
1472 interpolation_matrix (0, i + (j + 4) * this->degree - j) = 1.0;
1476 interpolation_matrix (1, i + 4) = -1.0;
1477 interpolation_matrix (2, i + 3 * this->degree + 1) = -1.0;
1481 interpolation_matrix (1, 0) = 0.5;
1482 interpolation_matrix (1, 1) = 0.5;
1483 interpolation_matrix (2, 2) = 0.5;
1484 interpolation_matrix (2, 3) = 0.5;
1485 interpolation_matrix (3, 3) = 1.0;
1487 int factorial_i = 1;
1489 for (
int i = 2; i <= (int) this->degree; ++i)
1491 double tmp = std::pow (0.5, i + 1);
1492 interpolation_matrix (i + 2, i + 2) = tmp;
1493 interpolation_matrix (i + 2, i + this->degree + 1) = tmp;
1494 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1495 interpolation_matrix (i + 2 * source_fe.
degree, i + 3 * this->degree - 1) = tmp;
1498 for (
unsigned int j = 0; j < this->degree - 1;)
1500 interpolation_matrix (i + 2, j + (i + 2) * this->degree + 2 - i) = tmp;
1501 interpolation_matrix (i + 2 * source_fe.
degree, i + (j + 4) * this->degree - 2) = tmp;
1506 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1507 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1508 int factorial_k = 1;
1510 for (
int j = 2; j <= (int) this->degree; ++j)
1512 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1514 int factorial_l = factorial_k;
1515 int factorial_kl = 1;
1517 for (
int k = j + 1; k <= (int) this->degree; ++k)
1519 factorial_kl *= k - j;
1521 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (k + 2) * this->degree - k) = std::pow (0.5, i + k) * factorial_l / (factorial_k * factorial_kl);
1526 int factorial_j = factorial_i;
1527 int factorial_ij = 1;
1529 for (
int j = i + 1; j <= (int) this->degree; ++j)
1531 factorial_ij *= j - i;
1533 tmp = std::pow (0.5, j + 1) * factorial_j / (factorial_i * factorial_ij);
1534 interpolation_matrix (i + 2, j + 2) = tmp;
1535 interpolation_matrix (i + 2, j + this->degree + 1) = tmp;
1536 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1537 interpolation_matrix (i + 2 * source_fe.
degree, j + 3 * this->degree - 1) = tmp;
1539 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1540 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1541 int factorial_k = 1;
1543 for (
int k = 2; k <= (int) this->degree; ++k)
1545 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1547 int factorial_l = factorial_k;
1548 int factorial_kl = 1;
1550 for (
int l = k + 1; l <= (int) this->degree; ++l)
1552 factorial_kl *= l - k;
1554 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (l + 2) * this->degree - l) = tmp * std::pow (0.5, l) * factorial_l / (factorial_k * factorial_kl);
1560 for (
unsigned int k = 0; k < this->degree - 1;)
1562 interpolation_matrix (i + 2, k + (j + 2) * this->degree + 2 - j) = tmp;
1563 interpolation_matrix (i + 2 * source_fe.
degree, j + (k + 4) * this->degree - 2) = tmp;
1579 const unsigned int codim = dim-1;
1582 unsigned int n = this->degree+1;
1583 for (
unsigned int i=1; i<codim; ++i)
1584 n *= this->degree+1;
1586 this->generalized_face_support_points.resize(n);
1591 for (
unsigned int iz=0; iz <= ((codim>2) ? this->degree : 0) ; ++iz)
1592 for (
unsigned int iy=0; iy <= ((codim>1) ? this->degree : 0) ; ++iy)
1593 for (
unsigned int ix=0; ix<=this->degree; ++ix)
1619 this->generalized_face_support_points[face_renumber[k++]] = p;
1626 std::vector<unsigned int>
1629 std::vector<unsigned int> dpo(dim+1, 1U);
1630 for (
unsigned int i=1; i<dpo.size(); ++i)
1631 dpo[i]=dpo[i-1]*(deg-1);
1638 std::vector<unsigned int>
1649 const unsigned int n = degree+1;
1688 unsigned int next_index = 0;
1690 h2l[next_index++] = 0;
1691 h2l[next_index++] = 1;
1692 h2l[next_index++] = n;
1693 h2l[next_index++] = n+1;
1696 h2l[next_index++] = (2+i)*n;
1699 h2l[next_index++] = (2+i)*n+1;
1702 h2l[next_index++] = 2+i;
1705 h2l[next_index++] = n+2+i;
1711 h2l[next_index++] = (2+i)*n+2+j;
1720 unsigned int next_index = 0;
1721 const unsigned int n2=n*n;
1724 h2l[next_index++] = 0;
1725 h2l[next_index++] = 1;
1726 h2l[next_index++] = n;
1727 h2l[next_index++] = n+1;
1729 h2l[next_index++] = n2;
1730 h2l[next_index++] = n2+1;
1731 h2l[next_index++] = n2+n;
1732 h2l[next_index++] = n2+n+1;
1737 h2l[next_index++] = (2+i)*n;
1739 h2l[next_index++] = (2+i)*n+1;
1741 h2l[next_index++] = 2+i;
1743 h2l[next_index++] = n+2+i;
1746 h2l[next_index++] = n2+(2+i)*n;
1748 h2l[next_index++] = n2+(2+i)*n+1;
1750 h2l[next_index++] = n2+2+i;
1752 h2l[next_index++] = n2+n+2+i;
1755 h2l[next_index++] = (2+i)*n2;
1757 h2l[next_index++] = (2+i)*n2+1;
1759 h2l[next_index++] = (2+i)*n2+n;
1761 h2l[next_index++] = (2+i)*n2+n+1;
1769 h2l[next_index++] = (2+i)*n2+(2+j)*n;
1773 h2l[next_index++] = (2+i)*n2+(2+j)*n+1;
1777 h2l[next_index++] = (2+i)*n2+2+j;
1781 h2l[next_index++] = (2+i)*n2+n+2+j;
1785 h2l[next_index++] = (2+i)*n+2+j;
1789 h2l[next_index++] = n2+(2+i)*n+2+j;
1797 h2l[next_index++] = (2+i)*n2+(2+j)*n+2+k;
1812 std::vector<unsigned int>
1817 return internal::FE_Q_Hierarchical::invert_numbering
1824 std::vector<unsigned int>
1827 return std::vector<unsigned int> ();
1834 const unsigned int face_index)
const 1836 Assert (shape_index < this->dofs_per_cell,
1848 return (((shape_index == 0) && (face_index == 0)) ||
1849 ((shape_index == 1) && (face_index == 1)));
1858 const unsigned int face_index)
const 1860 Assert (shape_index < this->dofs_per_cell,
1869 if (((dim==2) && (shape_index>=this->first_quad_index))
1871 ((dim==3) && (shape_index>=this->first_hex_index)))
1876 if (shape_index < this->first_line_index)
1883 const unsigned int vertex_no = shape_index;
1886 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_face; ++i)
1891 else if (shape_index < this->first_quad_index)
1894 const unsigned int line_index
1895 = (shape_index - this->first_line_index) / this->dofs_per_line;
1899 for (
unsigned int i=0; i<GeometryInfo<dim>::lines_per_face; ++i)
1904 else if (shape_index < this->first_hex_index)
1907 const unsigned int quad_index
1908 = (shape_index - this->first_quad_index) / this->dofs_per_quad;
1909 Assert (static_cast<signed int>(quad_index) <
1922 return (quad_index == face_index);
1944 std::vector<unsigned int>
1947 Assert ((sub_degree>0) && (sub_degree<=this->degree),
1952 std::vector<unsigned int> embedding_dofs (sub_degree+1);
1953 for (
unsigned int i=0; i<(sub_degree+1); ++i)
1954 embedding_dofs[i] = i;
1956 return embedding_dofs;
1962 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
1963 embedding_dofs[i] = i;
1965 return embedding_dofs;
1967 else if (sub_degree==this->degree)
1969 std::vector<unsigned int> embedding_dofs (this->dofs_per_cell);
1970 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
1971 embedding_dofs[i] = i;
1973 return embedding_dofs;
1976 if ((dim==2) || (dim==3))
1978 std::vector<unsigned int> embedding_dofs ( (dim==2) ?
1979 (sub_degree+1) * (sub_degree+1) :
1980 (sub_degree+1) * (sub_degree+1) * (sub_degree+1) );
1982 for (
unsigned int i=0; i<( (dim==2) ?
1983 (sub_degree+1) * (sub_degree+1) :
1984 (sub_degree+1) * (sub_degree+1) * (sub_degree+1) ); ++i)
1988 embedding_dofs[i] = i;
1998 line * (this->degree-1) + j;
2014 face * (this->degree-1) * (this->degree-1) +
2015 k * (this->degree-1) + j;
2036 l * (this->degree-1) * (this->degree-1) + k * (this->degree-1) + j;
2040 return embedding_dofs;
2045 return std::vector<unsigned int> ();
2052 std::pair<Table<2,bool>, std::vector<unsigned int> >
2056 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
2057 constant_modes(0,i) =
true;
2059 constant_modes(0,i) =
false;
2060 return std::pair<Table<2,bool>, std::vector<unsigned int> >
2061 (constant_modes, std::vector<unsigned int>(1, 0));
2077 #include "fe_q_hierarchical.inst" 2080 DEAL_II_NAMESPACE_CLOSE
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim > &fe_other) const
virtual bool hp_constraints_are_implemented() const
void initialize_generalized_support_points()
const unsigned int dofs_per_quad
void initialize_embedding_and_restriction(const std::vector< FullMatrix< double > > &dofs_cell, const std::vector< FullMatrix< double > > &dofs_subcell)
const unsigned int degree
void set_numbering(const std::vector< unsigned int > &renumber)
#define AssertThrow(cond, exc)
virtual void get_interpolation_matrix(const FiniteElement< dim > &source, FullMatrix< double > &matrix) const
static ::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
const unsigned int dofs_per_line
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
std::vector< unsigned int > get_embedding_dofs(const unsigned int sub_degree) const
virtual std::string get_name() const
virtual std::unique_ptr< FiniteElement< dim, dim > > clone() const
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
static ::ExceptionBase & ExcMessage(std::string arg1)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
static std::vector< unsigned int > face_fe_q_hierarchical_to_hierarchic_numbering(const unsigned int degree)
const unsigned int dofs_per_hex
#define Assert(cond, exc)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const
virtual std::string get_name() const =0
void initialize_constraints(const std::vector< FullMatrix< double > > &dofs_subcell)
virtual void get_subface_interpolation_matrix(const FiniteElement< dim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
const unsigned int dofs_per_cell
friend class FE_Q_Hierarchical
static std::vector< unsigned int > hierarchic_to_fe_q_hierarchical_numbering(const FiniteElementData< dim > &fe)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim > &fe_other) const
unsigned int n_components() const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim > &fe_other) const
const unsigned int dofs_per_face
virtual void get_face_interpolation_matrix(const FiniteElement< dim > &source, FullMatrix< double > &matrix) const
static ::ExceptionBase & ExcNotImplemented()
const unsigned int dofs_per_vertex
virtual std::size_t memory_consumption() const
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim > &fe_other) const
TensorProductPolynomials< dim > poly_space
void build_dofs_cell(std::vector< FullMatrix< double > > &dofs_cell, std::vector< FullMatrix< double > > &dofs_subcell) const
void initialize_generalized_face_support_points()
static ::ExceptionBase & ExcInternalError()