17 #include <deal.II/base/quadrature.h> 18 #include <deal.II/base/qprojector.h> 19 #include <deal.II/base/template_constraints.h> 20 #include <deal.II/base/tensor_product_polynomials.h> 21 #include <deal.II/base/tensor_product_polynomials_const.h> 22 #include <deal.II/base/tensor_product_polynomials_bubbles.h> 23 #include <deal.II/base/polynomials_piecewise.h> 24 #include <deal.II/fe/fe_q_base.h> 25 #include <deal.II/fe/fe_nothing.h> 26 #include <deal.II/fe/fe_tools.h> 27 #include <deal.II/base/quadrature_lib.h> 32 DEAL_II_NAMESPACE_OPEN
42 std::vector<unsigned int>
43 face_lexicographic_to_hierarchic_numbering (
const unsigned int degree)
45 std::vector<unsigned int> dpo(dim, 1U);
46 for (
unsigned int i=1; i<dpo.size(); ++i)
47 dpo[i]=dpo[i-1]*(degree-1);
48 const ::FiniteElementData<dim-1> face_data(dpo,1,degree);
49 std::vector<unsigned int> face_renumber (face_data.dofs_per_cell);
57 std::vector<unsigned int>
58 face_lexicographic_to_hierarchic_numbering<1> (
const unsigned int)
60 return std::vector<unsigned int>();
71 zero_indices (
unsigned int (&indices)[dim])
73 for (
unsigned int d=0; d<dim; ++d)
85 increment_indices (
unsigned int (&indices)[dim],
86 const unsigned int dofs1d)
89 for (
int d=0; d<dim-1; ++d)
90 if (indices[d]==dofs1d)
105 template <
class PolynomialType,
int xdim,
int xspacedim>
112 template <
int spacedim>
121 template <
int spacedim>
123 void initialize_constraints (
const std::vector<
Point<1> > &,
126 const unsigned int dim = 2;
128 unsigned int q_deg = fe.
degree;
176 std::vector<
Point<dim-1> > constraint_points;
182 const unsigned int n=q_deg-1;
183 const double step=1./q_deg;
185 for (
unsigned int i=1; i<=n; ++i)
186 constraint_points.push_back (
189 for (
unsigned int i=1; i<=n; ++i)
190 constraint_points.push_back (
202 const std::vector<unsigned int> &index_map_inverse =
204 const std::vector<unsigned int> face_index_map =
205 FE_Q_Helper::face_lexicographic_to_hierarchic_numbering<dim>(q_deg);
210 for (
unsigned int i=0; i<constraint_points.size(); ++i)
211 for (
unsigned int j=0; j<q_deg+1; ++j)
214 p[0] = constraint_points[i](0);
216 fe.
poly_space.compute_value(index_map_inverse[j], p);
228 template <
int spacedim>
230 void initialize_constraints (
const std::vector<
Point<1> > &,
233 const unsigned int dim = 3;
235 unsigned int q_deg = fe.
degree;
254 std::vector<
Point<dim-1> > constraint_points;
267 const unsigned int n=q_deg-1;
268 const double step=1./q_deg;
269 std::vector<
Point<dim-2> > line_support_points(n);
270 for (
unsigned int i=0; i<n; ++i)
271 line_support_points[i](0)=(i+1)*step;
275 std::vector<
Point<dim-1> > p_line(n);
281 for (
unsigned int i=0; i<n; ++i)
282 constraint_points.push_back (p_line[i] +
Point<dim-1> (0.5, 0));
285 for (
unsigned int i=0; i<n; ++i)
286 constraint_points.push_back (p_line[i] +
Point<dim-1> (0.5, 0));
289 for (
unsigned int i=0; i<n; ++i)
290 constraint_points.push_back (p_line[i] +
Point<dim-1> (0, 0.5));
293 for (
unsigned int i=0; i<n; ++i)
294 constraint_points.push_back (p_line[i] +
Point<dim-1> (0, 0.5));
297 for (
unsigned int face=0; face<
GeometryInfo<dim-1>::faces_per_cell; ++face)
298 for (
unsigned int subface=0;
299 subface<
GeometryInfo<dim-1>::max_children_per_face; ++subface)
302 constraint_points.insert(constraint_points.end(),
303 p_line.begin(), p_line.end());
307 std::vector<
Point<dim-1> > inner_points(n*n);
308 for (
unsigned int i=0, iy=1; iy<=n; ++iy)
309 for (
unsigned int ix=1; ix<=n; ++ix)
313 for (
unsigned int child=0;
314 child<
GeometryInfo<dim-1>::max_children_per_cell; ++child)
315 for (
unsigned int i=0; i<inner_points.size(); ++i)
316 constraint_points.push_back (
322 const unsigned int pnts=(q_deg+1)*(q_deg+1);
326 const std::vector<unsigned int> &index_map_inverse =
328 const std::vector<unsigned int> face_index_map =
329 FE_Q_Helper::face_lexicographic_to_hierarchic_numbering<dim>(q_deg);
337 for (
unsigned int i=0; i<constraint_points.size(); ++i)
339 const double interval = (double) (q_deg * 2);
340 bool mirror[dim - 1];
352 for (
unsigned int k=0; k<dim-1; ++k)
354 const int coord_int =
355 static_cast<int> (constraint_points[i](k) * interval + 0.25);
356 constraint_point(k) = 1.*coord_int / interval;
378 mirror[k] = (constraint_point(k) > 0.5);
380 constraint_point(k) = 1.0 - constraint_point(k);
383 for (
unsigned int j=0; j<pnts; ++j)
385 unsigned int indices[2] = { j % (q_deg+1), j / (q_deg+1) };
387 for (
unsigned int k = 0; k<2; ++k)
389 indices[k] = q_deg - indices[k];
392 new_index = indices[1] * (q_deg + 1) + indices[0];
395 fe.
poly_space.compute_value (index_map_inverse[new_index],
411 template <
class PolynomialType,
int dim,
int spacedim>
413 (
const PolynomialType &poly_space,
415 const std::vector<bool> &restriction_is_additive_flags)
418 std::vector<ComponentMask>(1, std::vector<bool>(1,
true))),
426 template <
class PolynomialType,
int dim,
int spacedim>
430 Assert (points[0][0] == 0,
431 ExcMessage (
"The first support point has to be zero."));
432 Assert (points.back()[0] == 1,
433 ExcMessage (
"The last support point has to be one."));
438 const unsigned int q_dofs_per_cell = Utilities::fixed_power<dim>(q_degree+1);
439 Assert(q_dofs_per_cell == this->dofs_per_cell ||
440 q_dofs_per_cell+1 == this->dofs_per_cell ||
441 q_dofs_per_cell+dim == this->dofs_per_cell , ExcInternalError());
444 std::vector<unsigned int> renumber(q_dofs_per_cell);
448 for (
unsigned int i= q_dofs_per_cell; i<this->dofs_per_cell; ++i)
449 renumber.push_back(i);
450 this->poly_space.set_numbering(renumber);
454 initialize_unit_support_points (points);
455 initialize_unit_face_support_points (points);
458 initialize_constraints (points);
464 this->initialize_quad_dof_index_permutation();
469 template <
class PolynomialType,
int dim,
int spacedim>
480 Assert (interpolation_matrix.
m() == this->dofs_per_cell,
481 ExcDimensionMismatch (interpolation_matrix.
m(),
482 this->dofs_per_cell));
484 ExcDimensionMismatch (interpolation_matrix.
m(),
488 const unsigned int q_dofs_per_cell = Utilities::fixed_power<dim>(q_degree+1);
489 const unsigned int source_q_dofs_per_cell = Utilities::fixed_power<dim>(source_fe->degree+1);
495 for (
unsigned int j=0; j<q_dofs_per_cell; ++j)
498 const Point<dim> p = this->unit_support_points[j];
502 Assert(std::abs(this->poly_space.compute_value (j, p)-1.)<1e-13,
505 for (
unsigned int i=0; i<source_q_dofs_per_cell; ++i)
506 interpolation_matrix(j,i) = source_fe->poly_space.compute_value (i, p);
510 if (q_dofs_per_cell < this->dofs_per_cell)
513 for (
unsigned int i=0; i<source_q_dofs_per_cell; ++i)
514 interpolation_matrix(q_dofs_per_cell, i) = 0.;
515 for (
unsigned int j=0; j<q_dofs_per_cell; ++j)
516 interpolation_matrix(j, source_q_dofs_per_cell) = 0.;
517 interpolation_matrix(q_dofs_per_cell, source_q_dofs_per_cell) = 1.;
521 const double eps = 2e-13*q_degree*dim;
522 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
523 for (
unsigned int j=0; j<source_fe->dofs_per_cell; ++j)
524 if (std::fabs(interpolation_matrix(i,j)) < eps)
525 interpolation_matrix(i,j) = 0.;
529 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
532 for (
unsigned int j=0; j<source_fe->dofs_per_cell; ++j)
533 sum += interpolation_matrix(i,j);
535 Assert (std::fabs(sum-1) < eps, ExcInternalError());
551 ExcDimensionMismatch (interpolation_matrix.
m(),
563 template <
class PolynomialType,
int dim,
int spacedim>
569 Assert (dim > 1, ExcImpossibleInDim(1));
571 interpolation_matrix);
576 template <
class PolynomialType,
int dim,
int spacedim>
580 const unsigned int subface,
584 ExcDimensionMismatch (interpolation_matrix.
m(),
593 Assert (interpolation_matrix.
n() == this->dofs_per_face,
594 ExcDimensionMismatch (interpolation_matrix.
n(),
595 this->dofs_per_face));
602 Assert (this->dofs_per_face <= source_fe->dofs_per_face,
604 ExcInterpolationNotImplemented ()));
608 quad_face_support (source_fe->get_unit_face_support_points ());
613 double eps = 2e-13*q_degree*(dim-1);
626 for (
unsigned int i=0; i<source_fe->dofs_per_face; ++i)
628 const Point<dim> &p = subface_quadrature.point (i);
630 for (
unsigned int j=0; j<this->dofs_per_face; ++j)
632 double matrix_entry = this->shape_value (this->face_to_cell_index(j, 0), p);
637 if (std::fabs (matrix_entry - 1.0) < eps)
639 if (std::fabs (matrix_entry) < eps)
642 interpolation_matrix(i,j) = matrix_entry;
648 for (
unsigned int j=0; j<source_fe->dofs_per_face; ++j)
652 for (
unsigned int i=0; i<this->dofs_per_face; ++i)
653 sum += interpolation_matrix(j,i);
655 Assert (std::fabs(sum-1) < eps, ExcInternalError());
664 ExcInterpolationNotImplemented()));
669 template <
class PolynomialType,
int dim,
int spacedim>
679 template <
class PolynomialType,
int dim,
int spacedim>
680 std::vector<std::pair<unsigned int, unsigned int> >
691 std::vector<std::pair<unsigned int, unsigned int> >
692 (1, std::make_pair (0U, 0U));
698 return std::vector<std::pair<unsigned int, unsigned int> > ();
709 return std::vector<std::pair<unsigned int, unsigned int> > ();
713 Assert (
false, ExcNotImplemented());
714 return std::vector<std::pair<unsigned int, unsigned int> > ();
720 template <
class PolynomialType,
int dim,
int spacedim>
721 std::vector<std::pair<unsigned int, unsigned int> >
738 const unsigned int p = this->degree;
739 const unsigned int q = fe_q_other->degree;
741 std::vector<std::pair<unsigned int, unsigned int> > identities;
743 const std::vector<unsigned int> &index_map_inverse=
744 this->poly_space.get_numbering_inverse();
745 const std::vector<unsigned int> &index_map_inverse_other=
746 fe_q_other->poly_space.get_numbering_inverse();
748 for (
unsigned int i=0; i<p-1; ++i)
749 for (
unsigned int j=0; j<q-1; ++j)
750 if (std::fabs(this->unit_support_points[index_map_inverse[i+1]][0]-
751 fe_q_other->unit_support_points[index_map_inverse_other[j+1]][0])
753 identities.push_back (std::make_pair(i,j));
761 return std::vector<std::pair<unsigned int, unsigned int> > ();
772 return std::vector<std::pair<unsigned int, unsigned int> > ();
776 Assert (
false, ExcNotImplemented());
777 return std::vector<std::pair<unsigned int, unsigned int> > ();
783 template <
class PolynomialType,
int dim,
int spacedim>
784 std::vector<std::pair<unsigned int, unsigned int> >
798 const unsigned int p = this->degree;
799 const unsigned int q = fe_q_other->degree;
801 std::vector<std::pair<unsigned int, unsigned int> > identities;
803 const std::vector<unsigned int> &index_map_inverse=
804 this->poly_space.get_numbering_inverse();
805 const std::vector<unsigned int> &index_map_inverse_other=
806 fe_q_other->poly_space.get_numbering_inverse();
808 for (
unsigned int i1=0; i1<p-1; ++i1)
809 for (
unsigned int i2=0; i2<p-1; ++i2)
810 for (
unsigned int j1=0; j1<q-1; ++j1)
811 for (
unsigned int j2=0; j2<q-1; ++j2)
812 if ((std::fabs(this->unit_support_points[index_map_inverse[i1+1]][0]-
813 fe_q_other->unit_support_points[index_map_inverse_other[j1+1]][0])
816 (std::fabs(this->unit_support_points[index_map_inverse[i2+1]][0]-
817 fe_q_other->unit_support_points[index_map_inverse_other[j2+1]][0])
819 identities.push_back (std::make_pair(i1*(p-1)+i2,
828 return std::vector<std::pair<unsigned int, unsigned int> > ();
839 return std::vector<std::pair<unsigned int, unsigned int> > ();
843 Assert (
false, ExcNotImplemented());
844 return std::vector<std::pair<unsigned int, unsigned int> > ();
850 template <
class PolynomialType,
int dim,
int spacedim>
858 if (this->degree < fe_q_other->degree)
859 return FiniteElementDomination::this_element_dominates;
860 else if (this->degree == fe_q_other->degree)
861 return FiniteElementDomination::either_element_can_dominate;
863 return FiniteElementDomination::other_element_dominates;
867 if (fe_nothing->is_dominating())
869 return FiniteElementDomination::other_element_dominates;
875 return FiniteElementDomination::no_requirements;
879 Assert (
false, ExcNotImplemented());
880 return FiniteElementDomination::neither_element_dominates;
890 template <
class PolynomialType,
int dim,
int spacedim>
894 const std::vector<unsigned int> &index_map_inverse=
895 this->poly_space.get_numbering_inverse();
899 this->unit_support_points.resize(support_quadrature.
size());
901 for (
unsigned int k=0; k<support_quadrature.
size(); k++)
902 this->unit_support_points[index_map_inverse[k]] = support_quadrature.
point(k);
907 template <
class PolynomialType,
int dim,
int spacedim>
915 const unsigned int codim = dim-1;
916 this->unit_face_support_points.resize(Utilities::fixed_power<codim>(q_degree+1));
919 std::vector<unsigned int> face_index_map =
920 FE_Q_Helper::face_lexicographic_to_hierarchic_numbering<dim>(q_degree);
923 this->unit_face_support_points.resize(support_quadrature.
size());
925 for (
unsigned int k=0; k<support_quadrature.
size(); k++)
926 this->unit_face_support_points[face_index_map[k]] = support_quadrature.
point(k);
931 template <
class PolynomialType,
int dim,
int spacedim>
939 Assert (this->adjust_quad_dof_index_for_face_orientation_table.n_elements()==8*this->dofs_per_quad,
942 const unsigned int n=q_degree-1;
943 Assert(n*n==this->dofs_per_quad, ExcInternalError());
946 Table<2,int> &data=this->adjust_quad_dof_index_for_face_orientation_table;
966 for (
unsigned int local=0; local<this->dofs_per_quad; ++local)
970 unsigned int i=local%n,
974 data(local,0)=j + i *n - local;
976 data(local,1)=i + (n-1-j)*n - local;
978 data(local,2)=(n-1-j) + (n-1-i)*n - local;
980 data(local,3)=(n-1-i) + j *n - local;
984 data(local,5)=j + (n-1-i)*n - local;
986 data(local,6)=(n-1-i) + (n-1-j)*n - local;
988 data(local,7)=(n-1-j) + i *n - local;
992 for (
unsigned int i=0; i<this->dofs_per_line; ++i)
993 this->adjust_line_dof_index_for_line_orientation_table[i]=this->dofs_per_line-1-i - i;
998 template <
class PolynomialType,
int dim,
int spacedim>
1002 const unsigned int face,
1003 const bool face_orientation,
1004 const bool face_flip,
1005 const bool face_rotation)
const 1007 Assert (face_index < this->dofs_per_face,
1008 ExcIndexRange(face_index, 0, this->dofs_per_face));
1023 if (face_index < this->first_face_line_index)
1028 const unsigned int face_vertex = face_index / this->dofs_per_vertex;
1029 const unsigned int dof_index_on_vertex = face_index % this->dofs_per_vertex;
1037 * this->dofs_per_vertex
1039 dof_index_on_vertex);
1041 else if (face_index < this->first_face_quad_index)
1046 const unsigned int index = face_index - this->first_face_line_index;
1048 const unsigned int face_line = index / this->dofs_per_line;
1049 const unsigned int dof_index_on_line = index % this->dofs_per_line;
1053 unsigned int adjusted_dof_index_on_line;
1057 Assert (
false, ExcInternalError());
1062 if (face_flip ==
false)
1063 adjusted_dof_index_on_line = dof_index_on_line;
1065 adjusted_dof_index_on_line = this->dofs_per_line - dof_index_on_line - 1;
1076 Assert ((this->dofs_per_line <= 1) ||
1077 ((face_orientation ==
true) &&
1078 (face_flip ==
false) &&
1079 (face_rotation ==
false)),
1080 ExcNotImplemented());
1081 adjusted_dof_index_on_line = dof_index_on_line;
1085 return (this->first_line_index
1090 * this->dofs_per_line
1092 adjusted_dof_index_on_line);
1097 Assert (dim >= 3, ExcInternalError());
1100 const unsigned int index = face_index - this->first_face_quad_index;
1105 Assert ((this->dofs_per_quad <= 1) ||
1106 ((face_orientation ==
true) &&
1107 (face_flip ==
false) &&
1108 (face_rotation ==
false)),
1109 ExcNotImplemented());
1110 return (this->first_quad_index
1111 + face * this->dofs_per_quad
1119 template <
class PolynomialType,
int dim,
int spacedim>
1120 std::vector<unsigned int>
1124 std::vector<unsigned int> dpo(dim+1, 1U);
1125 for (
unsigned int i=1; i<dpo.size(); ++i)
1126 dpo[i]=dpo[i-1]*(deg-1);
1132 template <
class PolynomialType,
int dim,
int spacedim>
1137 Implementation::initialize_constraints (points, *
this);
1142 template <
class PolynomialType,
int dim,
int spacedim>
1151 ExcMessage(
"Prolongation matrices are only available for refined cells!"));
1156 if (this->prolongation[refinement_case-1][child].n() == 0)
1161 if (this->prolongation[refinement_case-1][child].n() ==
1162 this->dofs_per_cell)
1163 return this->prolongation[refinement_case-1][child];
1166 const unsigned int q_dofs_per_cell = Utilities::fixed_power<dim>(q_degree+1);
1174 const double eps = 1e-15*q_degree*dim;
1179 for (
unsigned int i=0; i<q_dofs_per_cell; ++i)
1181 Assert (std::fabs (1.-this->poly_space.compute_value
1182 (i, this->unit_support_points[i])) < eps,
1183 ExcInternalError());
1184 for (
unsigned int j=0; j<q_dofs_per_cell; ++j)
1186 Assert (std::fabs (this->poly_space.compute_value
1187 (i, this->unit_support_points[j])) < eps,
1188 ExcInternalError());
1196 const unsigned int dofs1d = q_degree+1;
1197 std::vector<Table<2,double> >
1199 const std::vector<unsigned int> &index_map_inverse =
1200 this->poly_space.get_numbering_inverse();
1204 unsigned int step_size_diag = 0;
1206 unsigned int factor = 1;
1207 for (
unsigned int d=0; d<dim; ++d)
1209 step_size_diag += factor;
1218 for (
unsigned int j=0; j<dofs1d; ++j)
1220 const unsigned int diag_comp = index_map_inverse[j*step_size_diag];
1221 const Point<dim> p_subcell = this->unit_support_points[diag_comp];
1225 for (
unsigned int i=0; i<dofs1d; ++i)
1226 for (
unsigned int d=0; d<dim; ++d)
1230 point[0] = p_cell[d];
1231 const double cell_value =
1232 this->poly_space.compute_value(index_map_inverse[i], point);
1251 if (std::fabs(cell_value) < eps)
1252 subcell_evaluations[d](j,i) = 0;
1254 subcell_evaluations[d](j,i) = cell_value;
1260 unsigned int j_indices[dim];
1261 FE_Q_Helper::zero_indices<dim> (j_indices);
1262 for (
unsigned int j=0; j<q_dofs_per_cell; j+=dofs1d)
1264 unsigned int i_indices[dim];
1265 FE_Q_Helper::zero_indices<dim> (i_indices);
1266 for (
unsigned int i=0; i<q_dofs_per_cell; i+=dofs1d)
1268 double val_extra_dim = 1.;
1269 for (
unsigned int d=1; d<dim; ++d)
1270 val_extra_dim *= subcell_evaluations[d](j_indices[d-1],
1275 for (
unsigned int jj=0; jj<dofs1d; ++jj)
1277 const unsigned int j_ind = index_map_inverse[j+jj];
1278 for (
unsigned int ii=0; ii<dofs1d; ++ii)
1279 prolongate(j_ind,index_map_inverse[i+ii])
1280 = val_extra_dim * subcell_evaluations[0](jj,ii);
1285 FE_Q_Helper::increment_indices<dim> (i_indices, dofs1d);
1287 Assert (i_indices[dim-1] == 1, ExcInternalError());
1288 FE_Q_Helper::increment_indices<dim> (j_indices, dofs1d);
1293 if (q_dofs_per_cell < this->dofs_per_cell)
1294 prolongate(q_dofs_per_cell,q_dofs_per_cell) = 1.;
1299 for (
unsigned int row=0; row<this->dofs_per_cell; ++row)
1302 for (
unsigned int col=0; col<this->dofs_per_cell; ++col)
1303 sum += prolongate(row,col);
1304 Assert (std::fabs(sum-1.) < eps, ExcInternalError());
1310 (this->prolongation[refinement_case-1][child]));
1314 return this->prolongation[refinement_case-1][child];
1319 template <
class PolynomialType,
int dim,
int spacedim>
1328 ExcMessage(
"Restriction matrices are only available for refined cells!"));
1333 if (this->restriction[refinement_case-1][child].n() == 0)
1338 if (this->restriction[refinement_case-1][child].n() ==
1339 this->dofs_per_cell)
1340 return this->restriction[refinement_case-1][child];
1344 const unsigned int q_dofs_per_cell = Utilities::fixed_power<dim>(q_degree+1);
1368 const double eps = 1e-15*q_degree*dim;
1369 const std::vector<unsigned int> &index_map_inverse =
1370 this->poly_space.get_numbering_inverse();
1372 const unsigned int dofs1d = q_degree+1;
1373 std::vector<Tensor<1,dim> > evaluations1d (dofs1d);
1375 restriction.
reinit(this->dofs_per_cell, this->dofs_per_cell);
1377 for (
unsigned int i=0; i<q_dofs_per_cell; ++i)
1379 unsigned int mother_dof = index_map_inverse[i];
1380 const Point<dim> p_cell = this->unit_support_points[mother_dof];
1393 for (
unsigned int j=0; j<dofs1d; ++j)
1394 for (
unsigned int d=0; d<dim; ++d)
1397 point[0] = p_subcell[d];
1398 evaluations1d[j][d] =
1399 this->poly_space.compute_value(index_map_inverse[j], point);
1401 unsigned int j_indices[dim];
1402 FE_Q_Helper::zero_indices<dim> (j_indices);
1403 double sum_check = 0;
1404 for (
unsigned int j = 0; j<q_dofs_per_cell; j += dofs1d)
1406 double val_extra_dim = 1.;
1407 for (
unsigned int d=1; d<dim; ++d)
1408 val_extra_dim *= evaluations1d[j_indices[d-1]][d];
1409 for (
unsigned int jj=0; jj<dofs1d; ++jj)
1419 = val_extra_dim * evaluations1d[jj][0];
1420 const unsigned int child_dof =
1421 index_map_inverse[j+jj];
1422 if (std::fabs (val-1.) < eps)
1423 restriction(mother_dof,child_dof)=1.;
1424 else if (std::fabs(val) > eps)
1425 restriction(mother_dof,child_dof)=val;
1428 FE_Q_Helper::increment_indices<dim> (j_indices, dofs1d);
1430 Assert (std::fabs(sum_check-1) < eps,
1431 ExcInternalError());
1435 if (q_dofs_per_cell < this->dofs_per_cell)
1436 restriction(this->dofs_per_cell-1,this->dofs_per_cell-1) =
1442 (this->restriction[refinement_case-1][child]));
1445 return this->restriction[refinement_case-1][child];
1455 template <
class PolynomialType,
int dim,
int spacedim>
1458 (
const unsigned int shape_index,
1459 const unsigned int face_index)
const 1461 Assert (shape_index < this->dofs_per_cell,
1462 ExcIndexRange (shape_index, 0, this->dofs_per_cell));
1470 return (((shape_index == 0) && (face_index == 0)) ||
1471 ((shape_index == 1) && (face_index == 1)));
1475 if (((dim==2) && (shape_index>=this->first_quad_index))
1477 ((dim==3) && (shape_index>=this->first_hex_index)))
1481 if (shape_index < this->first_line_index)
1486 const unsigned int vertex_no = shape_index;
1488 ExcInternalError());
1490 for (
unsigned int v=0; v<GeometryInfo<dim>::vertices_per_face; ++v)
1496 else if (shape_index < this->first_quad_index)
1499 const unsigned int line_index
1500 = (shape_index - this->first_line_index) / this->dofs_per_line;
1502 ExcInternalError());
1506 return (line_index == face_index);
1510 const unsigned int lines_per_face =
1513 for (
unsigned int l=0; l<lines_per_face; ++l)
1520 Assert (
false, ExcNotImplemented());
1522 else if (shape_index < this->first_hex_index)
1525 const unsigned int quad_index
1526 = (shape_index - this->first_quad_index) / this->dofs_per_quad;
1527 Assert (static_cast<signed int>(quad_index) <
1529 ExcInternalError());
1533 Assert (dim != 2, ExcInternalError());
1537 return (quad_index == face_index);
1539 Assert (
false, ExcNotImplemented());
1545 Assert (
false, ExcNotImplemented());
1550 Assert (
false, ExcInternalError());
1556 template <
typename PolynomialType,
int dim,
int spacedim>
1557 std::pair<Table<2,bool>, std::vector<unsigned int> >
1565 for (
unsigned int i=0; i<Utilities::fixed_power<dim>(q_degree+1); ++i)
1566 constant_modes(0, i) =
true;
1567 return std::pair<Table<2,bool>, std::vector<unsigned int> >
1568 (constant_modes, std::vector<unsigned int>(1, 0));
1573 #include "fe_q_base.inst" 1575 DEAL_II_NAMESPACE_CLOSE
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)
FE_Q_Base(const PolynomialType &poly_space, const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags)
static const unsigned int invalid_unsigned_int
#define AssertDimension(dim1, dim2)
void swap(TableBase< N, T > &v)
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
FullMatrix< double > interface_constraints
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
::ExceptionBase & ExcMessage(std::string arg1)
const unsigned int degree
const Point< dim > & point(const unsigned int i) const
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)
#define AssertThrow(cond, exc)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
static unsigned int n_children(const RefinementCase< dim > &refinement_case)
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
#define Assert(cond, exc)
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
static void project_to_subface(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)
virtual bool hp_constraints_are_implemented() const
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
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const
unsigned int size() const
const unsigned int dofs_per_cell
void initialize(const std::vector< Point< 1 > > &support_points_1d)
void initialize_unit_face_support_points(const std::vector< Point< 1 > > &points)
void initialize_constraints(const std::vector< Point< 1 > > &points)
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
static void initialize_constraints(const std::vector< Point< 1 > > &, FE_Q_Base< PolynomialType, 1, spacedim > &)
void initialize_quad_dof_index_permutation()
static void project_to_face(const SubQuadrature &quadrature, const unsigned int face_no, std::vector< Point< dim > > &q_points)
void initialize_unit_support_points(const std::vector< Point< 1 > > &points)
const unsigned int dofs_per_face
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
PolynomialType poly_space
TableIndices< 2 > interface_constraints_size() const