17 #include <deal.II/fe/fe_q_hierarchical.h> 18 #include <deal.II/fe/fe_nothing.h> 28 DEAL_II_NAMESPACE_OPEN
36 std::vector<unsigned int>
37 invert_numbering (
const std::vector<unsigned int> &in)
39 std::vector<unsigned int> out (in.size());
40 for (
unsigned int i=0; i<in.size(); ++i)
42 Assert (in[i] < out.size(),
56 Polynomials::Hierarchical::generate_complete_basis(degree),
60 get_dpo_vector(degree),1, degree).dofs_per_cell, false),
62 get_dpo_vector(degree),1, degree).dofs_per_cell,
std::vector<bool>(1,true))),
63 face_renumber(face_fe_q_hierarchical_to_hierarchic_numbering (degree))
82 std::vector<FullMatrix<double> >
86 std::vector<FullMatrix<double> >
119 std::ostringstream namebuf;
120 namebuf <<
"FE_Q_Hierarchical<" << dim <<
">(" << this->degree <<
")";
122 return namebuf.str();
129 std::vector<double> &,
130 const std::vector<double> &)
const 142 std::vector<double> &,
153 std::vector<double> &,
154 const VectorSlice<
const std::vector<std::vector<double> > > &)
const 177 Assert (matrix.m() == this->dofs_per_cell,
179 this->dofs_per_cell));
182 source_fe->dofs_per_cell));
193 if (this->dofs_per_cell >= source_fe->dofs_per_cell)
195 const std::vector<unsigned int> dof_map = this->get_embedding_dofs(source_fe->degree);
196 for (
unsigned int j=0; j < dof_map.size(); j++)
197 matrix[dof_map[j]][j] = 1.;
202 const std::vector<unsigned int> dof_map = source_fe->get_embedding_dofs(this->degree);
203 for (
unsigned int j=0; j < dof_map.size(); j++)
204 matrix[j][dof_map[j]] = 1.;
220 ExcMessage(
"Prolongation matrices are only available for isotropic refinement!"));
225 return this->prolongation[refinement_case-1][child];
239 std::vector<std::pair<unsigned int, unsigned int> >
254 std::vector<std::pair<unsigned int, unsigned int> >
255 (1, std::make_pair (0U, 0U));
263 return std::vector<std::pair<unsigned int, unsigned int> > ();
268 return std::vector<std::pair<unsigned int, unsigned int> > ();
273 std::vector<std::pair<unsigned int, unsigned int> >
283 const unsigned int &this_dpl = this->dofs_per_line;
290 std::vector<std::pair<unsigned int, unsigned int> > res;
291 for (
unsigned int i = 0; i < std::min(this_dpl,other_dpl); i++)
292 res.push_back(std::make_pair (i, i));
302 return std::vector<std::pair<unsigned int, unsigned int> > ();
307 return std::vector<std::pair<unsigned int, unsigned int> > ();
312 std::vector<std::pair<unsigned int, unsigned int> >
322 const unsigned int &this_dpq = this->dofs_per_quad;
329 std::vector<std::pair<unsigned int, unsigned int> > res;
330 for (
unsigned int i = 0; i < std::min(this_dpq,other_dpq); i++)
331 res.push_back(std::make_pair (i, i));
341 return std::vector<std::pair<unsigned int, unsigned int> > ();
346 return std::vector<std::pair<unsigned int, unsigned int> > ();
360 if (this->degree < fe_q_other->degree)
362 else if (this->degree == fe_q_other->degree)
369 if (fe_nothing->is_dominating())
396 const unsigned int dofs_1d = 2*this->dofs_per_vertex + this->dofs_per_line;
445 for (
unsigned int c=0; c<GeometryInfo<1>::max_children_per_cell; ++c)
446 for (
unsigned int j=0; j<dofs_1d; ++j)
447 for (
unsigned int k=0; k<dofs_1d; ++k)
450 if ((j<=1) && (k<=1))
452 if (((c==0) && (j==0) && (k==0)) ||
453 ((c==1) && (j==1) && (k==1)))
454 dofs_cell[c](j,k) = 1.;
456 dofs_cell[c](j,k) = 0.;
458 if (((c==0) && (j==1)) || ((c==1) && (j==0)))
459 dofs_subcell[c](j,k) = .5;
460 else if (((c==0) && (k==0)) || ((c==1) && (k==1)))
461 dofs_subcell[c](j,k) = 1.;
463 dofs_subcell[c](j,k) = 0.;
466 else if ((j<=1) && (k>=2))
468 if (((c==0) && (j==1) && ((k % 2)==0)) ||
469 ((c==1) && (j==0) && ((k % 2)==0)))
470 dofs_subcell[c](j,k) = -1.;
473 else if ((j>=2) && (k>=2) && (j<=k))
476 for (
unsigned int i=1; i<=j; ++i)
477 factor *= ((
double) (k-i+1))/((double) i);
481 dofs_subcell[c](j,k) = ((k+j) % 2 == 0) ?
482 std::pow(.5,static_cast<double>(k))*factor :
483 -std::pow(.5,static_cast<double>(k))*factor;
484 dofs_cell[c](j,k) = std::pow(2.,static_cast<double>(j))*factor;
488 dofs_subcell[c](j,k) = std::pow(.5,static_cast<double>(k))*factor;
489 dofs_cell[c](j,k) = ((k+j) % 2 == 0) ?
490 std::pow(2.,static_cast<double>(j))*factor :
491 -std::pow(2.,static_cast<double>(j))*factor;
504 const unsigned int dofs_1d = 2*this->dofs_per_vertex + this->dofs_per_line;
506 this->interface_constraints
507 .TableBase<2,double>::reinit (this->interface_constraints_size());
520 for (
unsigned int i=0; i<dofs_1d; ++i)
521 this->interface_constraints(0,i) = dofs_subcell[0](1,i);
523 for (
unsigned int c=0; c<GeometryInfo<1>::max_children_per_cell; ++c)
524 for (
unsigned int i=0; i<dofs_1d; ++i)
525 for (
unsigned int j=2; j<dofs_1d; ++j)
526 this->interface_constraints(1 + c*(this->degree-1) + j - 2,i) =
527 dofs_subcell[c](j,i);
533 for (
unsigned int i=0; i<dofs_1d * dofs_1d; i++)
536 this->interface_constraints(0,face_renumber[i]) =
537 dofs_subcell[0](1,i % dofs_1d) *
538 dofs_subcell[0](1,(i - (i % dofs_1d)) / dofs_1d);
541 this->interface_constraints(1,face_renumber[i]) =
542 dofs_subcell[0](0, i % dofs_1d) *
543 dofs_subcell[0](1, (i - (i % dofs_1d)) / dofs_1d);
544 this->interface_constraints(2,face_renumber[i]) =
545 dofs_subcell[1](1, i % dofs_1d) *
546 dofs_subcell[0](1, (i - (i % dofs_1d)) / dofs_1d);
547 this->interface_constraints(3,face_renumber[i]) =
548 dofs_subcell[0](1, i % dofs_1d) *
549 dofs_subcell[0](0, (i - (i % dofs_1d)) / dofs_1d);
550 this->interface_constraints(4,face_renumber[i]) =
551 dofs_subcell[1](0, i % dofs_1d) *
552 dofs_subcell[1](1, (i - (i % dofs_1d)) / dofs_1d);
555 for (
unsigned int j=0; j<(this->degree-1); j++)
557 this->interface_constraints(5 + j,face_renumber[i]) =
558 dofs_subcell[0](1, i % dofs_1d) *
559 dofs_subcell[0](2 + j, (i - (i % dofs_1d)) / dofs_1d);
560 this->interface_constraints(5 + (this->degree-1) + j,face_renumber[i]) =
561 dofs_subcell[0](1,i % dofs_1d) *
562 dofs_subcell[1](2 + j, (i - (i % dofs_1d)) / dofs_1d);
563 this->interface_constraints(5 + 2*(this->degree-1) + j,face_renumber[i]) =
564 dofs_subcell[0](2 + j,i % dofs_1d) *
565 dofs_subcell[1](0, (i - (i % dofs_1d)) / dofs_1d);
566 this->interface_constraints(5 + 3*(this->degree-1) + j,face_renumber[i]) =
567 dofs_subcell[1](2 + j, i % dofs_1d) *
568 dofs_subcell[0](1, (i - (i % dofs_1d)) / dofs_1d);
572 for (
unsigned int j=0; j<(this->degree-1); j++)
575 this->interface_constraints(5 + 4*(this->degree-1) + j,face_renumber[i]) =
576 dofs_subcell[0](0, i % dofs_1d) *
577 dofs_subcell[0](2 + j, (i - (i % dofs_1d)) / dofs_1d);
578 this->interface_constraints(5 + 4*(this->degree-1) + (this->degree-1) + j,face_renumber[i]) =
579 dofs_subcell[0](0, i % dofs_1d) *
580 dofs_subcell[1](2 + j, (i - (i % dofs_1d)) / dofs_1d);
582 this->interface_constraints(5 + 4*(this->degree-1) + 2*(this->degree-1) + j,face_renumber[i]) =
583 dofs_subcell[1](1, i % dofs_1d) *
584 dofs_subcell[0](2 + j, (i - (i % dofs_1d)) / dofs_1d);
585 this->interface_constraints(5 + 4*(this->degree-1) + 3*(this->degree-1) + j,face_renumber[i]) =
586 dofs_subcell[1](1, i % dofs_1d) *
587 dofs_subcell[1](2 + j, (i - (i % dofs_1d)) / dofs_1d);
589 this->interface_constraints(5 + 4*(this->degree-1) + 4*(this->degree-1) + j,face_renumber[i]) =
590 dofs_subcell[0](2 + j, i % dofs_1d) *
591 dofs_subcell[0](0, (i - (i % dofs_1d)) / dofs_1d);
592 this->interface_constraints(5 + 4*(this->degree-1) + 5*(this->degree-1) + j,face_renumber[i]) =
593 dofs_subcell[1](2 + j, i % dofs_1d) *
594 dofs_subcell[0](0, (i - (i % dofs_1d)) / dofs_1d);
596 this->interface_constraints(5 + 4*(this->degree-1) + 6*(this->degree-1) + j,face_renumber[i]) =
597 dofs_subcell[0](2 + j, i % dofs_1d) *
598 dofs_subcell[1](1, (i - (i % dofs_1d)) / dofs_1d);
599 this->interface_constraints(5 + 4*(this->degree-1) + 7*(this->degree-1) + j,face_renumber[i]) =
600 dofs_subcell[1](2 + j, i % dofs_1d) *
601 dofs_subcell[1](1, (i - (i % dofs_1d)) / dofs_1d);
605 for (
unsigned int j=0; j<(this->degree-1); j++)
606 for (
unsigned int k=0; k<(this->degree-1); k++)
609 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1),face_renumber[i]) =
610 dofs_subcell[0](2 + j, i % dofs_1d) *
611 dofs_subcell[0](2 + k, (i - (i % dofs_1d)) / dofs_1d);
613 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1) + (this->degree-1)*(this->degree-1),face_renumber[i]) =
614 dofs_subcell[1](2 + j, i % dofs_1d) *
615 dofs_subcell[0](2 + k, (i - (i % dofs_1d)) / dofs_1d);
617 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1) + 2*(this->degree-1)*(this->degree-1),face_renumber[i]) =
618 dofs_subcell[0](2 + j, i % dofs_1d) *
619 dofs_subcell[1](2 + k, (i - (i % dofs_1d)) / dofs_1d);
621 this->interface_constraints(5 + 12*(this->degree-1) + j + k*(this->degree-1) + 3*(this->degree-1)*(this->degree-1),face_renumber[i]) =
622 dofs_subcell[1](2 + j, i % dofs_1d) *
623 dofs_subcell[1](2 + k, (i - (i % dofs_1d)) / dofs_1d);
644 const unsigned int dofs_1d = 2*this->dofs_per_vertex + this->dofs_per_line;
645 const std::vector<unsigned int> &renumber=
646 this->poly_space.get_numbering();
648 for (
unsigned int c=0; c<GeometryInfo<dim>::max_children_per_cell; ++c)
650 this->prolongation[iso][c].reinit (this->dofs_per_cell, this->dofs_per_cell);
651 this->restriction[iso][c].reinit (this->dofs_per_cell, this->dofs_per_cell);
658 for (
unsigned int c=0; c<GeometryInfo<dim>::max_children_per_cell; ++c)
660 this->prolongation[iso][c].fill (dofs_subcell[c]);
661 this->restriction[iso][c].fill (dofs_cell[c]);
676 for (
unsigned int j=0; j<this->dofs_per_cell; ++j)
677 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
682 for (
unsigned int c=0; c<GeometryInfo<2>::max_children_per_cell; ++c)
685 const unsigned int c0 = c%2;
687 const unsigned int c1 = c/2;
689 this->prolongation[iso][c](j,i) =
690 dofs_subcell[c0](renumber[j] % dofs_1d,
691 renumber[i] % dofs_1d) *
692 dofs_subcell[c1]((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d,
693 (renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d);
695 this->restriction[iso][c](j,i) =
696 dofs_cell[c0](renumber[j] % dofs_1d,
697 renumber[i] % dofs_1d) *
698 dofs_cell[c1]((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d,
699 (renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d);
706 for (
unsigned int c=0; c<GeometryInfo<3>::max_children_per_cell; ++c)
709 const unsigned int c0 = c%2;
711 const unsigned int c1 = (c%4)/2;
713 const unsigned int c2 = c/4;
715 this->prolongation[iso][c](j,i) =
716 dofs_subcell[c0](renumber[j] % dofs_1d,
717 renumber[i] % dofs_1d) *
718 dofs_subcell[c1](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d) % dofs_1d,
719 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d) % dofs_1d) *
720 dofs_subcell[c2](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d - (((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d,
721 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d - (((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d);
723 this->restriction[iso][c](j,i) =
724 dofs_cell[c0](renumber[j] % dofs_1d,
725 renumber[i] % dofs_1d) *
726 dofs_cell[c1](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d) % dofs_1d,
727 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d) % dofs_1d) *
728 dofs_cell[c2](((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d - (((renumber[j] - (renumber[j] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d,
729 ((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d - (((renumber[i] - (renumber[i] % dofs_1d)) / dofs_1d ) % dofs_1d)) / dofs_1d);
745 unsigned int n = this->degree+1;
746 for (
unsigned int i=1; i<dim; ++i)
749 this->generalized_support_points.resize(n);
751 const std::vector<unsigned int> &index_map_inverse=
752 this->poly_space.get_numbering_inverse();
783 for (
unsigned int iz=0; iz <= ((dim>2) ? this->degree : 0) ; ++iz)
784 for (
unsigned int iy=0; iy <= ((dim>1) ? this->degree : 0) ; ++iy)
785 for (
unsigned int ix=0; ix<=this->degree; ++ix)
811 this->generalized_support_points[index_map_inverse[k++]] = p;
858 (dynamic_cast<const FEQHierarchical *>(&x_source_fe) != 0),
860 ExcInterpolationNotImplemented());
862 Assert (interpolation_matrix.
n() == this->dofs_per_face,
864 this->dofs_per_face));
888 ExcInterpolationNotImplemented ());
889 interpolation_matrix = 0;
901 for (
unsigned int i = 0; i < this->dofs_per_face; ++i)
902 interpolation_matrix (i, i) = 1;
909 for (
unsigned int i = 0; i < GeometryInfo<3>::vertices_per_face; ++i)
910 interpolation_matrix (i, i) = 1;
912 for (
unsigned int i = 0; i < this->degree - 1; ++i)
914 for (
unsigned int j = 0; j < GeometryInfo<3>::lines_per_face; ++j)
915 interpolation_matrix (
919 for (
unsigned int j = 0; j < this->degree - 1; ++j)
920 interpolation_matrix (
936 const unsigned int subface,
946 (dynamic_cast<const FEQHierarchical *>(&x_source_fe) != 0),
948 ExcInterpolationNotImplemented());
950 Assert (interpolation_matrix.
n() == this->dofs_per_face,
952 this->dofs_per_face));
975 ExcInterpolationNotImplemented ());
985 interpolation_matrix (0, 0) = 1.0;
986 interpolation_matrix (1, 0) = 0.5;
987 interpolation_matrix (1, 1) = 0.5;
989 for (
unsigned int dof = 2; dof < this->dofs_per_face;)
991 interpolation_matrix (1, dof) = -1.0;
997 for (
int i = 2; i < (int) this->dofs_per_face; ++i)
999 interpolation_matrix (i, i) = std::pow (0.5, i);
1001 int factorial_j = factorial_i;
1002 int factorial_ij = 1;
1004 for (
int j = i + 1; j < (int) this->dofs_per_face; ++j)
1006 factorial_ij *= j - i;
1010 interpolation_matrix (i, j)
1011 = -1.0 * std::pow (0.5, j) *
1012 factorial_j / (factorial_i * factorial_ij);
1015 interpolation_matrix (i, j)
1016 = std::pow (0.5, j) *
1017 factorial_j / (factorial_i * factorial_ij);
1026 interpolation_matrix (0, 0) = 0.5;
1027 interpolation_matrix (0, 1) = 0.5;
1029 for (
unsigned int dof = 2; dof < this->dofs_per_face;)
1031 interpolation_matrix (0, dof) = -1.0;
1035 interpolation_matrix (1, 1) = 1.0;
1037 int factorial_i = 1;
1039 for (
int i = 2; i < (int) this->dofs_per_face; ++i)
1041 interpolation_matrix (i, i) = std::pow (0.5, i);
1043 int factorial_j = factorial_i;
1044 int factorial_ij = 1;
1046 for (
int j = i + 1; j < (int) this->dofs_per_face; ++j)
1048 factorial_ij *= j - i;
1050 interpolation_matrix (i, j)
1051 = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1066 interpolation_matrix (0, 0) = 1.0;
1067 interpolation_matrix (1, 0) = 0.5;
1068 interpolation_matrix (1, 1) = 0.5;
1069 interpolation_matrix (2, 0) = 0.5;
1070 interpolation_matrix (2, 2) = 0.5;
1072 for (
unsigned int i = 0; i < this->degree - 1;)
1074 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1075 interpolation_matrix (3, i + line * (this->degree - 1) + 4) = -0.5;
1077 for (
unsigned int j = 0; j < this->degree - 1;)
1079 interpolation_matrix (3, i + (j + 4) * this->degree - j) = 1.0;
1083 interpolation_matrix (1, i + 2 * (this->degree + 1)) = -1.0;
1084 interpolation_matrix (2, i + 4) = -1.0;
1088 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1089 interpolation_matrix (3, vertex) = 0.25;
1091 int factorial_i = 1;
1093 for (
int i = 2; i <= (int) this->degree; ++i)
1095 double tmp = std::pow (0.5, i);
1096 interpolation_matrix (i + 2, i + 2) = tmp;
1097 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1099 interpolation_matrix (i + source_fe.
degree + 1, i + 2) = tmp;
1100 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1101 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 2 * this->degree) = tmp;
1102 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1105 for (
unsigned int j = 0; j < this->degree - 1;)
1107 interpolation_matrix (i + source_fe.
degree + 1, (i + 2) * this->degree + j + 2 - i) = tmp;
1108 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + (j + 4) * this->degree - j - 2) = tmp;
1112 int factorial_k = 1;
1114 for (
int j = 2; j <= (int) this->degree; ++j)
1116 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1118 int factorial_kl = 1;
1119 int factorial_l = factorial_k;
1121 for (
int k = j + 1; k < (int) this->degree; ++k)
1123 factorial_kl *= k - j;
1127 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);
1130 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);
1135 int factorial_j = factorial_i;
1136 int factorial_ij = 1;
1138 for (
int j = i + 1; j <= (int) this->degree; ++j)
1140 factorial_ij *= j - i;
1145 tmp = -1.0 * std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1146 interpolation_matrix (i + 2, j + 2) = tmp;
1147 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1150 for (
int k = 2; k <= (int) this->degree; ++k)
1152 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1154 int factorial_l = factorial_k;
1155 int factorial_kl = 1;
1157 for (
int l = k + 1; l <= (int) this->degree; ++l)
1159 factorial_kl *= l - k;
1163 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);
1166 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);
1171 interpolation_matrix (i + source_fe.
degree + 1, j + 2) = tmp;
1172 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1173 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 2 * this->degree) = tmp;
1174 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1177 for (
unsigned int k = 0; k < this->degree - 1;)
1179 interpolation_matrix (i + source_fe.
degree + 1, (j + 2) * this->degree + k + 2 - j) = tmp;
1180 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + (k + 4) * this->degree - k - 2) = tmp;
1186 tmp = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1187 interpolation_matrix (i + 2, j + 2) = tmp;
1188 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1191 for (
int k = 2; k <= (int) this->degree; ++k)
1193 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1195 int factorial_l = factorial_k;
1196 int factorial_kl = 1;
1198 for (
int l = k + 1; l <= (int) this->degree; ++l)
1200 factorial_kl *= l - k;
1204 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);
1207 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);
1212 interpolation_matrix (i + source_fe.
degree + 1, j + 2) = tmp;
1213 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1214 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 2 * this->degree) = tmp;
1215 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1218 for (
unsigned int k = 0; k < this->degree - 1;)
1220 interpolation_matrix (i + source_fe.
degree + 1, (j + 2) * this->degree + k + 2 - j) = tmp;
1221 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + (k + 4) * this->degree - k - 2) = tmp;
1233 interpolation_matrix (0, 0) = 0.5;
1234 interpolation_matrix (0, 1) = 0.5;
1235 interpolation_matrix (1, 1) = 1.0;
1236 interpolation_matrix (3, 1) = 0.5;
1237 interpolation_matrix (3, 3) = 0.5;
1239 for (
unsigned int i = 0; i < this->degree - 1;)
1241 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1242 interpolation_matrix (2, i + line * (this->degree - 1) + 4) = -0.5;
1244 for (
unsigned int j = 0; j < this->degree - 1;)
1246 interpolation_matrix (2, i + (j + 4) * this->degree - j) = 1.0;
1250 interpolation_matrix (0, i + 2 * (this->degree + 1)) = -1.0;
1251 interpolation_matrix (3, i + this->degree + 3) = -1.0;
1255 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1256 interpolation_matrix (2, vertex) = 0.25;
1258 int factorial_i = 1;
1260 for (
int i = 2; i <= (int) this->degree; ++i)
1262 double tmp = std::pow (0.5, i + 1);
1263 interpolation_matrix (i + 2, i + 2) = tmp;
1264 interpolation_matrix (i + 2, i + this->degree + 1) = tmp;
1265 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 2 * this->degree) = tmp;
1266 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1269 for (
unsigned int j = 0; j < this->degree - 1;)
1271 interpolation_matrix (i + 2, j + (i + 2) * this->degree + 2 - i) = tmp;
1272 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + (j + 4) * this->degree - j - 2) = tmp;
1277 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1278 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1280 int factorial_j = factorial_i;
1281 int factorial_ij = 1;
1283 for (
int j = i + 1; j <= (int) this->degree; ++j)
1285 factorial_ij *= j - i;
1287 tmp = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1288 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1289 int factorial_k = 1;
1291 for (
int k = 2; k <= (int) this->degree; ++k)
1293 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1295 int factorial_l = factorial_k;
1296 int factorial_kl = 1;
1298 for (
int l = k + 1; l <= (int) this->degree; ++l)
1300 factorial_kl *= l - k;
1304 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);
1307 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);
1313 for (
unsigned int k = 0; k < this->degree - 1;)
1315 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + (k + 4) * this->degree - k - 2) = tmp;
1320 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 2 * this->degree) = tmp;
1321 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1326 interpolation_matrix (i + 2, j + 2) = tmp;
1327 interpolation_matrix (i + 2, j + this->degree + 1) = tmp;
1328 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = 2.0 * tmp;
1331 for (
unsigned int k = 0; k < this->degree - 1;)
1333 interpolation_matrix (i + 2, k + (j + 2) * this->degree + 2 - j) = tmp;
1338 int factorial_k = 1;
1340 for (
int j = 2; j <= (int) this->degree; ++j)
1342 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1344 int factorial_l = factorial_k;
1345 int factorial_kl = 1;
1347 for (
int k = j + 1; k <= (int) this->degree; ++k)
1349 factorial_kl *= k - j;
1353 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);
1356 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);
1366 interpolation_matrix (0, 0) = 0.5;
1367 interpolation_matrix (0, 2) = 0.5;
1368 interpolation_matrix (2, 2) = 1.0;
1369 interpolation_matrix (3, 2) = 0.5;
1370 interpolation_matrix (3, 3) = 0.5;
1372 for (
unsigned int i = 0; i < this->degree - 1;)
1374 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1375 interpolation_matrix (1, i + line * (this->degree - 1) + 4) = -0.5;
1377 for (
unsigned int j = 0; j < this->degree - 1;)
1379 interpolation_matrix (1, i + (j + 4) * this->degree - j) = 1.0;
1383 interpolation_matrix (0, i + 4) = -1.0;
1384 interpolation_matrix (3, i + 3 * this->degree + 1) = -1.0;
1388 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1389 interpolation_matrix (1, vertex) = 0.25;
1391 int factorial_i = 1;
1393 for (
int i = 2; i <= (int) this->degree; ++i)
1395 double tmp = std::pow (0.5, i);
1396 interpolation_matrix (i + 2, i + 2) = tmp;
1397 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1399 interpolation_matrix (i + source_fe.
degree + 1, i + 2) = tmp;
1400 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1401 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1402 interpolation_matrix (i + 2 * source_fe.
degree, i + 3 * this->degree - 1) = tmp;
1405 for (
unsigned int j = 0; j < this->degree - 1;)
1407 interpolation_matrix (i + source_fe.
degree + 1, j + (i + 2) * this->degree + 2 - i) = tmp;
1408 interpolation_matrix (i + 2 * source_fe.
degree, i + (j + 4) * this->degree - j - 2) = tmp;
1412 int factorial_k = 1;
1414 for (
int j = 2; j <= (int) this->degree; ++j)
1416 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1418 int factorial_kl = 1;
1419 int factorial_l = factorial_k;
1421 for (
int k = j + 1; k <= (int) this->degree; ++k)
1423 factorial_kl *= k - j;
1425 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);
1430 int factorial_j = factorial_i;
1431 int factorial_ij = 1;
1433 for (
int j = i + 1; j <= (int) this->degree; ++j)
1435 factorial_ij *= j - i;
1437 tmp = std::pow (0.5, j) * factorial_j / (factorial_i * factorial_ij);
1438 interpolation_matrix (i + 2, j + 2) = tmp;
1441 for (
unsigned int k = 0; k < this->degree - 1;)
1443 interpolation_matrix (i + source_fe.
degree + 1, k + (j + 2) * this->degree + 2 - j) = tmp;
1448 interpolation_matrix (i + source_fe.
degree + 1, j + 2) = tmp;
1449 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1454 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1455 interpolation_matrix (i + 2 * source_fe.
degree, j + 3 * this->degree - 1) = tmp;
1457 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1458 int factorial_k = 1;
1460 for (
int k = 2; k <= (int) this->degree; ++k)
1462 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1464 int factorial_l = factorial_k;
1465 int factorial_kl = 1;
1467 for (
int l = k + 1; l <= (int) this->degree; ++l)
1469 factorial_kl *= l - k;
1471 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);
1477 for (
unsigned int k = 0; k < this->degree - 1;)
1479 interpolation_matrix (i + 2 * source_fe.
degree, j + (k + 4) * this->degree - k - 2) = tmp;
1490 for (
unsigned int vertex = 0; vertex < GeometryInfo<3>::vertices_per_face; ++vertex)
1491 interpolation_matrix (0, vertex) = 0.25;
1493 for (
unsigned int i = 0; i < this->degree - 1;)
1495 for (
unsigned int line = 0; line < GeometryInfo<3>::lines_per_face; ++line)
1496 interpolation_matrix (0, i + line * (this->degree - 1) + 4) = -0.5;
1498 for (
unsigned int j = 0; j < this->degree - 1;)
1500 interpolation_matrix (0, i + (j + 4) * this->degree - j) = 1.0;
1504 interpolation_matrix (1, i + 4) = -1.0;
1505 interpolation_matrix (2, i + 3 * this->degree + 1) = -1.0;
1509 interpolation_matrix (1, 0) = 0.5;
1510 interpolation_matrix (1, 1) = 0.5;
1511 interpolation_matrix (2, 2) = 0.5;
1512 interpolation_matrix (2, 3) = 0.5;
1513 interpolation_matrix (3, 3) = 1.0;
1515 int factorial_i = 1;
1517 for (
int i = 2; i <= (int) this->degree; ++i)
1519 double tmp = std::pow (0.5, i + 1);
1520 interpolation_matrix (i + 2, i + 2) = tmp;
1521 interpolation_matrix (i + 2, i + this->degree + 1) = tmp;
1522 interpolation_matrix (i + 2 * source_fe.
degree, i + 2 * this->degree) = tmp;
1523 interpolation_matrix (i + 2 * source_fe.
degree, i + 3 * this->degree - 1) = tmp;
1526 for (
unsigned int j = 0; j < this->degree - 1;)
1528 interpolation_matrix (i + 2, j + (i + 2) * this->degree + 2 - i) = tmp;
1529 interpolation_matrix (i + 2 * source_fe.
degree, i + (j + 4) * this->degree - 2) = tmp;
1534 interpolation_matrix (i + source_fe.
degree + 1, i + this->degree + 1) = tmp;
1535 interpolation_matrix (i + 3 * source_fe.
degree - 1, i + 3 * this->degree - 1) = tmp;
1536 int factorial_k = 1;
1538 for (
int j = 2; j <= (int) this->degree; ++j)
1540 interpolation_matrix (i + (j + 2) * source_fe.
degree - j, i + (j + 2) * this->degree - j) = std::pow (0.5, i + j);
1542 int factorial_l = factorial_k;
1543 int factorial_kl = 1;
1545 for (
int k = j + 1; k <= (int) this->degree; ++k)
1547 factorial_kl *= k - j;
1549 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);
1554 int factorial_j = factorial_i;
1555 int factorial_ij = 1;
1557 for (
int j = i + 1; j <= (int) this->degree; ++j)
1559 factorial_ij *= j - i;
1561 tmp = std::pow (0.5, j + 1) * factorial_j / (factorial_i * factorial_ij);
1562 interpolation_matrix (i + 2, j + 2) = tmp;
1563 interpolation_matrix (i + 2, j + this->degree + 1) = tmp;
1564 interpolation_matrix (i + 2 * source_fe.
degree, j + 2 * this->degree) = tmp;
1565 interpolation_matrix (i + 2 * source_fe.
degree, j + 3 * this->degree - 1) = tmp;
1567 interpolation_matrix (i + source_fe.
degree + 1, j + this->degree + 1) = tmp;
1568 interpolation_matrix (i + 3 * source_fe.
degree - 1, j + 3 * this->degree - 1) = tmp;
1569 int factorial_k = 1;
1571 for (
int k = 2; k <= (int) this->degree; ++k)
1573 interpolation_matrix (i + (k + 2) * source_fe.
degree - k, j + (k + 2) * this->degree - k) = tmp * std::pow (0.5, k);
1575 int factorial_l = factorial_k;
1576 int factorial_kl = 1;
1578 for (
int l = k + 1; l <= (int) this->degree; ++l)
1580 factorial_kl *= l - k;
1582 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);
1588 for (
unsigned int k = 0; k < this->degree - 1;)
1590 interpolation_matrix (i + 2, k + (j + 2) * this->degree + 2 - j) = tmp;
1591 interpolation_matrix (i + 2 * source_fe.
degree, j + (k + 4) * this->degree - 2) = tmp;
1607 const unsigned int codim = dim-1;
1610 unsigned int n = this->degree+1;
1611 for (
unsigned int i=1; i<codim; ++i)
1612 n *= this->degree+1;
1614 this->generalized_face_support_points.resize(n);
1619 for (
unsigned int iz=0; iz <= ((codim>2) ? this->degree : 0) ; ++iz)
1620 for (
unsigned int iy=0; iy <= ((codim>1) ? this->degree : 0) ; ++iy)
1621 for (
unsigned int ix=0; ix<=this->degree; ++ix)
1647 this->generalized_face_support_points[face_renumber[k++]] = p;
1654 std::vector<unsigned int>
1657 std::vector<unsigned int> dpo(dim+1, 1U);
1658 for (
unsigned int i=1; i<dpo.size(); ++i)
1659 dpo[i]=dpo[i-1]*(deg-1);
1666 std::vector<unsigned int>
1677 const unsigned int n = degree+1;
1716 unsigned int next_index = 0;
1718 h2l[next_index++] = 0;
1719 h2l[next_index++] = 1;
1720 h2l[next_index++] = n;
1721 h2l[next_index++] = n+1;
1724 h2l[next_index++] = (2+i)*n;
1727 h2l[next_index++] = (2+i)*n+1;
1730 h2l[next_index++] = 2+i;
1733 h2l[next_index++] = n+2+i;
1739 h2l[next_index++] = (2+i)*n+2+j;
1748 unsigned int next_index = 0;
1749 const unsigned int n2=n*n;
1752 h2l[next_index++] = 0;
1753 h2l[next_index++] = 1;
1754 h2l[next_index++] = n;
1755 h2l[next_index++] = n+1;
1757 h2l[next_index++] = n2;
1758 h2l[next_index++] = n2+1;
1759 h2l[next_index++] = n2+n;
1760 h2l[next_index++] = n2+n+1;
1765 h2l[next_index++] = (2+i)*n;
1767 h2l[next_index++] = (2+i)*n+1;
1769 h2l[next_index++] = 2+i;
1771 h2l[next_index++] = n+2+i;
1774 h2l[next_index++] = n2+(2+i)*n;
1776 h2l[next_index++] = n2+(2+i)*n+1;
1778 h2l[next_index++] = n2+2+i;
1780 h2l[next_index++] = n2+n+2+i;
1783 h2l[next_index++] = (2+i)*n2;
1785 h2l[next_index++] = (2+i)*n2+1;
1787 h2l[next_index++] = (2+i)*n2+n;
1789 h2l[next_index++] = (2+i)*n2+n+1;
1797 h2l[next_index++] = (2+i)*n2+(2+j)*n;
1801 h2l[next_index++] = (2+i)*n2+(2+j)*n+1;
1805 h2l[next_index++] = (2+i)*n2+2+j;
1809 h2l[next_index++] = (2+i)*n2+n+2+j;
1813 h2l[next_index++] = (2+i)*n+2+j;
1817 h2l[next_index++] = n2+(2+i)*n+2+j;
1825 h2l[next_index++] = (2+i)*n2+(2+j)*n+2+k;
1840 std::vector<unsigned int>
1846 hierarchic_to_fe_q_hierarchical_numbering (fe_data));
1852 std::vector<unsigned int>
1855 return std::vector<unsigned int> ();
1862 const unsigned int face_index)
const 1864 Assert (shape_index < this->dofs_per_cell,
1876 return (((shape_index == 0) && (face_index == 0)) ||
1877 ((shape_index == 1) && (face_index == 1)));
1886 const unsigned int face_index)
const 1888 Assert (shape_index < this->dofs_per_cell,
1897 if (((dim==2) && (shape_index>=this->first_quad_index))
1899 ((dim==3) && (shape_index>=this->first_hex_index)))
1904 if (shape_index < this->first_line_index)
1911 const unsigned int vertex_no = shape_index;
1914 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_face; ++i)
1919 else if (shape_index < this->first_quad_index)
1922 const unsigned int line_index
1923 = (shape_index - this->first_line_index) / this->dofs_per_line;
1927 for (
unsigned int i=0; i<GeometryInfo<dim>::lines_per_face; ++i)
1932 else if (shape_index < this->first_hex_index)
1935 const unsigned int quad_index
1936 = (shape_index - this->first_quad_index) / this->dofs_per_quad;
1937 Assert (static_cast<signed int>(quad_index) <
1950 return (quad_index == face_index);
1972 std::vector<unsigned int>
1975 Assert ((sub_degree>0) && (sub_degree<=this->degree),
1980 std::vector<unsigned int> embedding_dofs (sub_degree+1);
1981 for (
unsigned int i=0; i<(sub_degree+1); ++i)
1982 embedding_dofs[i] = i;
1984 return embedding_dofs;
1990 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
1991 embedding_dofs[i] = i;
1993 return embedding_dofs;
1995 else if (sub_degree==this->degree)
1997 std::vector<unsigned int> embedding_dofs (this->dofs_per_cell);
1998 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
1999 embedding_dofs[i] = i;
2001 return embedding_dofs;
2004 if ((dim==2) || (dim==3))
2006 std::vector<unsigned int> embedding_dofs ( (dim==2) ?
2007 (sub_degree+1) * (sub_degree+1) :
2008 (sub_degree+1) * (sub_degree+1) * (sub_degree+1) );
2010 for (
unsigned int i=0; i<( (dim==2) ?
2011 (sub_degree+1) * (sub_degree+1) :
2012 (sub_degree+1) * (sub_degree+1) * (sub_degree+1) ); ++i)
2016 embedding_dofs[i] = i;
2026 line * (this->degree-1) + j;
2042 face * (this->degree-1) * (this->degree-1) +
2043 k * (this->degree-1) + j;
2064 l * (this->degree-1) * (this->degree-1) + k * (this->degree-1) + j;
2068 return embedding_dofs;
2073 return std::vector<unsigned int> ();
2080 std::pair<Table<2,bool>, std::vector<unsigned int> >
2084 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
2085 constant_modes(0,i) =
true;
2087 constant_modes(0,i) =
false;
2088 return std::pair<Table<2,bool>, std::vector<unsigned int> >
2089 (constant_modes, std::vector<unsigned int>(1, 0));
2105 #include "fe_q_hierarchical.inst" 2108 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)
virtual FiniteElement< dim > * clone() const
#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 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)
virtual void interpolate(std::vector< double > &local_dofs, const std::vector< double > &values) const 1
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()