17 #include <deal.II/base/quadrature.h> 18 #include <deal.II/base/quadrature_lib.h> 19 #include <deal.II/base/template_constraints.h> 20 #include <deal.II/fe/fe_dgq.h> 21 #include <deal.II/fe/fe_tools.h> 27 DEAL_II_NAMESPACE_OPEN
38 inline unsigned int int_sqrt (
const unsigned int N)
40 for (
unsigned int i=0; i<=N; ++i)
43 Assert (
false, ExcInternalError());
51 inline unsigned int int_cuberoot (
const unsigned int N)
53 for (
unsigned int i=0; i<=N; ++i)
56 Assert (
false, ExcInternalError());
65 generate_unit_point (
const unsigned int i,
67 const ::internal::int2type<1> )
69 Assert (i<N, ExcInternalError());
74 const double h = 1./(N-1);
84 generate_unit_point (
const unsigned int i,
86 const ::internal::int2type<2> )
88 Assert (i<N, ExcInternalError());
94 Assert (N>=4, ExcInternalError());
95 const unsigned int N1d = int_sqrt(N);
96 const double h = 1./(N1d-1);
110 generate_unit_point (
const unsigned int i,
111 const unsigned int N,
112 const ::internal::int2type<3> )
114 Assert (i<N, ExcInternalError());
119 Assert (N>=8, ExcInternalError());
121 const unsigned int N1d = int_cuberoot(N);
122 const double h = 1./(N1d-1);
134 template <
int dim,
int spacedim>
140 std::vector<bool>(
FiniteElementData<dim>(get_dpo_vector(degree),1, degree).dofs_per_cell, true),
142 get_dpo_vector(degree),1, degree).dofs_per_cell,
std::vector<bool>(1,true)))
150 for (
unsigned int i=0; i<dim; ++i)
156 unsigned int n = degree+1;
157 for (
unsigned int i=1; i<dim; ++i)
162 const double step = 1./
degree;
166 for (
unsigned int iz=0; iz <= ((dim>2) ? degree : 0) ; ++iz)
167 for (
unsigned int iy=0; iy <= ((dim>1) ? degree : 0) ; ++iy)
168 for (
unsigned int ix=0; ix<=
degree; ++ix)
189 template <
int dim,
int spacedim>
214 template <
int dim,
int spacedim>
225 std::ostringstream namebuf;
228 <<
">(" << this->
degree <<
")";
229 return namebuf.str();
234 template <
int dim,
int spacedim>
247 template <
int dim,
int spacedim>
248 std::vector<unsigned int>
251 std::vector<unsigned int> dpo(dim+1, 0U);
253 for (
unsigned int i=1; i<dim; ++i)
260 template <
int dim,
int spacedim>
263 const char direction)
const 265 const unsigned int n = this->
degree+1;
267 for (
unsigned int i=1; i<dim; ++i)
276 for (
unsigned int i=n; i>0;)
286 for (
unsigned int iz=0; iz<((dim>2) ? n:1); ++iz)
287 for (
unsigned int j=0; j<n; ++j)
288 for (
unsigned int i=0; i<n; ++i)
290 unsigned int k = n*i-j+n-1 + n*n*iz;
297 for (
unsigned int iz=0; iz<((dim>2) ? n:1); ++iz)
298 for (
unsigned int iy=0; iy<n; ++iy)
299 for (
unsigned int ix=0; ix<n; ++ix)
301 unsigned int k = n*ix-iy+n-1 + n*n*iz;
308 Assert (dim>2, ExcDimensionMismatch (dim,3));
309 for (
unsigned int iz=0; iz<n; ++iz)
310 for (
unsigned int iy=0; iy<n; ++iy)
311 for (
unsigned int ix=0; ix<n; ++ix)
313 unsigned int k = n*(n*iy-iz+n-1) + ix;
320 Assert (dim>2, ExcDimensionMismatch (dim,3));
321 for (
unsigned int iz=0; iz<n; ++iz)
322 for (
unsigned int iy=0; iy<n; ++iy)
323 for (
unsigned int ix=0; ix<n; ++ix)
325 unsigned int k = n*(n*iy-iz+n-1) + ix;
330 Assert (
false, ExcNotImplemented ());
337 template <
int dim,
int spacedim>
348 typename FE::ExcInterpolationNotImplemented() );
356 ExcDimensionMismatch (interpolation_matrix.
m(),
359 ExcDimensionMismatch (interpolation_matrix.
n(),
378 const Point<dim> p = generate_unit_point (j, this->dofs_per_cell,
381 cell_interpolation(j,i)
385 source_interpolation(j,i)
394 cell_interpolation.
mmult (interpolation_matrix,
395 source_interpolation);
400 if (std::fabs(interpolation_matrix(i,j)) < 1e-15)
401 interpolation_matrix(i,j) = 0.;
412 sum += interpolation_matrix(i,j);
414 Assert (std::fabs(sum-1) < 5e-14*std::max(this->
degree,1U)*dim,
421 template <
int dim,
int spacedim>
433 (void)interpolation_matrix;
436 typename FE::ExcInterpolationNotImplemented());
438 Assert (interpolation_matrix.
m() == 0,
439 ExcDimensionMismatch (interpolation_matrix.
m(),
441 Assert (interpolation_matrix.
n() == 0,
442 ExcDimensionMismatch (interpolation_matrix.
m(),
448 template <
int dim,
int spacedim>
461 (void)interpolation_matrix;
464 typename FE::ExcInterpolationNotImplemented());
466 Assert (interpolation_matrix.
m() == 0,
467 ExcDimensionMismatch (interpolation_matrix.
m(),
469 Assert (interpolation_matrix.
n() == 0,
470 ExcDimensionMismatch (interpolation_matrix.
m(),
476 template <
int dim,
int spacedim>
485 ExcMessage(
"Prolongation matrices are only available for refined cells!"));
490 if (this->
prolongation[refinement_case-1][child].n() == 0)
504 std::vector<std::vector<FullMatrix<double> > >
506 isotropic_matrices.back().
513 isotropic_matrices,
true);
514 this_nonconst.
prolongation[refinement_case-1].swap(isotropic_matrices.back());
542 template <
int dim,
int spacedim>
551 ExcMessage(
"Restriction matrices are only available for refined cells!"));
556 if (this->
restriction[refinement_case-1][child].n() == 0)
561 if (this->
restriction[refinement_case-1][child].n() ==
563 return this->
restriction[refinement_case-1][child];
570 std::vector<std::vector<FullMatrix<double> > >
572 isotropic_matrices.back().
579 isotropic_matrices,
true);
580 this_nonconst.
restriction[refinement_case-1].swap(isotropic_matrices.back());
603 return this->
restriction[refinement_case-1][child];
608 template <
int dim,
int spacedim>
617 template <
int dim,
int spacedim>
618 std::vector<std::pair<unsigned int, unsigned int> >
627 std::vector<std::pair<unsigned int, unsigned int> > ();
632 template <
int dim,
int spacedim>
633 std::vector<std::pair<unsigned int, unsigned int> >
642 std::vector<std::pair<unsigned int, unsigned int> > ();
647 template <
int dim,
int spacedim>
648 std::vector<std::pair<unsigned int, unsigned int> >
657 std::vector<std::pair<unsigned int, unsigned int> > ();
662 template <
int dim,
int spacedim>
669 return FiniteElementDomination::no_requirements;
674 template <
int dim,
int spacedim>
677 const unsigned int face_index)
const 680 ExcIndexRange (shape_index, 0, this->dofs_per_cell));
684 unsigned int n = this->
degree+1;
689 bool support_points_on_boundary =
true;
690 for (
unsigned int d=0; d<dim; ++d)
692 support_points_on_boundary =
false;
693 for (
unsigned int d=0; d<dim; ++d)
695 support_points_on_boundary =
false;
696 if (support_points_on_boundary ==
false)
699 unsigned int n2 = n*n;
711 return (((shape_index == 0) && (face_index == 0)) ||
712 ((shape_index == this->
degree) && (face_index == 1)));
717 if (face_index==0 && (shape_index % n) == 0)
719 if (face_index==1 && (shape_index % n) == this->
degree)
721 if (face_index==2 && shape_index < n)
723 if (face_index==3 && shape_index >= this->dofs_per_cell-n)
730 const unsigned int in2 = shape_index % n2;
733 if (face_index==0 && (shape_index % n) == 0)
736 if (face_index==1 && (shape_index % n) == n-1)
739 if (face_index==2 && in2 < n )
742 if (face_index==3 && in2 >= n2-n)
745 if (face_index==4 && shape_index < n2)
748 if (face_index==5 && shape_index >= this->dofs_per_cell - n2)
754 Assert (
false, ExcNotImplemented());
761 template <
int dim,
int spacedim>
762 std::pair<Table<2,bool>, std::vector<unsigned int> >
766 constant_modes.
fill(
true);
767 return std::pair<Table<2,bool>, std::vector<unsigned int> >
768 (constant_modes, std::vector<unsigned int>(1, 0));
774 template <
int dim,
int spacedim>
778 Assert (
false, ExcNotImplemented ());
784 template <
int dim,
int spacedim>
786 :
FE_DGQ<dim,spacedim>(points)
791 template <
int dim,
int spacedim>
797 std::ostringstream namebuf;
798 bool equidistant =
true;
799 std::vector<double> points(this->
degree+1);
802 for (
unsigned int j=0; j<=this->
degree; j++)
806 for (
unsigned int j=0; j<=this->
degree; j++)
807 if (std::fabs(points[j] - (
double)j/this->
degree) > 1e-15)
813 if (equidistant ==
true)
816 return namebuf.str();
821 bool gauss_lobatto =
true;
822 for (
unsigned int j=0; j<=this->
degree; j++)
823 if (points[j] != points_gl.
point(j)(0))
825 gauss_lobatto =
false;
829 if (gauss_lobatto ==
true)
832 return namebuf.str();
838 for (
unsigned int j=0; j<=this->
degree; j++)
839 if (points[j] != points_g.
point(j)(0))
848 return namebuf.str();
853 bool gauss_log =
true;
854 for (
unsigned int j=0; j<=this->
degree; j++)
855 if (points[j] != points_glog.
point(j)(0))
861 if (gauss_log ==
true)
864 return namebuf.str();
869 return namebuf.str();
874 template <
int dim,
int spacedim>
879 std::vector<Point<1> > qpoints(this->
degree+1);
881 for (
unsigned int i=0; i<=this->
degree; ++i)
891 #include "fe_dgq.inst" 894 DEAL_II_NAMESPACE_CLOSE
virtual FiniteElement< dim, spacedim > * clone() const
virtual FiniteElement< dim, spacedim > * clone() const
static const unsigned int invalid_unsigned_int
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
std::vector< std::vector< FullMatrix< double > > > restriction
const std::vector< Point< dim > > & get_points() const
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const
::ExceptionBase & ExcMessage(std::string arg1)
const unsigned int degree
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
const Point< dim > & point(const unsigned int i) const
#define AssertThrow(cond, exc)
virtual std::size_t memory_consumption() const
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
std::vector< Point< dim > > unit_support_points
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const
std::vector< std::vector< FullMatrix< double > > > prolongation
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
#define Assert(cond, exc)
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
void mmult(FullMatrix< number2 > &C, const FullMatrix< number2 > &B, const bool adding=false) const
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
void rotate_indices(std::vector< unsigned int > &indices, const char direction) const
std::string dim_string(const int dim, const int spacedim)
const unsigned int dofs_per_cell
FE_DGQArbitraryNodes(const Quadrature< 1 > &points)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
const std::vector< unsigned int > & get_numbering_inverse() const
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
double compute_value(const unsigned int i, const Point< dim > &p) const
TensorProductPolynomials< dim > poly_space
void fill(InputIterator entries, const bool C_style_indexing=true)
virtual bool hp_constraints_are_implemented() const
virtual std::string get_name() const
virtual std::string get_name() const