18 #include <deal.II/base/quadrature.h> 19 #include <deal.II/base/qprojector.h> 20 #include <deal.II/base/template_constraints.h> 21 #include <deal.II/base/std_cxx11/unique_ptr.h> 22 #include <deal.II/fe/fe_q_bubbles.h> 23 #include <deal.II/fe/fe_nothing.h> 24 #include <deal.II/fe/fe_tools.h> 25 #include <deal.II/fe/fe_values.h> 26 #include <deal.II/fe/mapping_q1.h> 27 #include <deal.II/base/quadrature_lib.h> 28 #include <deal.II/dofs/dof_accessor.h> 29 #include <deal.II/dofs/dof_handler.h> 30 #include <deal.II/grid/tria.h> 32 #include <deal.II/grid/grid_generator.h> 38 DEAL_II_NAMESPACE_OPEN
45 template <
int dim,
int spacedim>
50 const bool isotropic_only)
53 const unsigned int degree = fe.
degree;
56 std_cxx11::unique_ptr<Quadrature<dim> > q_fine;
81 Assert(q_fine.get() != NULL, ExcInternalError());
82 const unsigned int nq = q_fine->size();
85 unsigned int ref_case = (isotropic_only)
88 for (; ref_case <= RefinementCase<dim>::isotropic_refinement; ++ref_case)
93 for (
unsigned int i=0; i<nc; ++i)
95 Assert(matrices[ref_case-1][i].n() == dpc,
96 ExcDimensionMismatch(matrices[ref_case-1][i].n(),dpc));
97 Assert(matrices[ref_case-1][i].m() == dpc,
98 ExcDimensionMismatch(matrices[ref_case-1][i].m(),dpc));
108 dh.distribute_dofs(fe);
114 const unsigned int n_dofs = dh.n_dofs();
119 std::vector<std::vector<types::global_dof_index> > child_ldi
120 (nc, std::vector<types::global_dof_index>(fe.
dofs_per_cell));
123 unsigned int child_no = 0;
124 typename ::DoFHandler<dim>::active_cell_iterator cell
126 for (; cell!=dh.end(); ++cell, ++child_no)
129 cell->get_dof_indices(child_ldi[child_no]);
131 for (
unsigned int q=0; q<nq; ++q)
132 for (
unsigned int i=0; i<dpc; ++i)
133 for (
unsigned int j=0; j<dpc; ++j)
135 const unsigned int gdi=child_ldi[child_no][i];
136 const unsigned int gdj=child_ldi[child_no][j];
137 fine_mass(gdi, gdj)+=fine.shape_value(i,q)
138 *fine.shape_value(j,q)
141 for (
unsigned int k=0; k<dim; ++k)
142 quad_tmp(k) = fine.quadrature_point(q)(k);
143 coarse_rhs_matrix(gdi, j)
144 +=fine.shape_value(i,q)
152 fine_mass.gauss_jordan();
153 fine_mass.mmult(solution, coarse_rhs_matrix);
156 for (
unsigned int child_no=0; child_no<nc; ++child_no)
157 for (
unsigned int i=0; i<dpc; ++i)
158 for (
unsigned int j=0; j<dpc; ++j)
160 const unsigned int gdi=child_ldi[child_no][i];
162 if (std::fabs(solution(gdi, j)) > 1.e-12)
163 matrices[ref_case-1][child_no](i,j)=solution(gdi, j);
171 template <
int dim,
int spacedim>
179 get_riaf_vector(q_degree)),
180 n_bubbles((q_degree<=1)?1:dim)
183 ExcMessage (
"This element can only be used for polynomial degrees " 184 "greater than zero"));
186 std::vector<Point<1> > support_points_1d(q_degree+1);
187 for (
unsigned int i=0; i<=q_degree; ++i)
188 support_points_1d[i][0] = static_cast<double>(i)/q_degree;
194 for (
unsigned int d=0; d<dim; ++d)
203 FE_Q_Bubbles_Helper::compute_embedding_matrices
213 template <
int dim,
int spacedim>
224 const unsigned int q_degree = points.
size()-1;
227 ExcMessage (
"This element can only be used for polynomial degrees " 234 for (
unsigned int d=0; d<dim; ++d)
236 for (
unsigned int i=0; i<
n_bubbles; ++i)
243 FE_Q_Bubbles_Helper::compute_embedding_matrices
252 template <
int dim,
int spacedim>
260 std::ostringstream namebuf;
262 const unsigned int n_points = this->
degree;
263 std::vector<double> points(n_points);
266 unsigned int index = 0;
271 if ((dim>1) ? (unit_support_points[j](1)==0 &&
272 ((dim>2) ? unit_support_points[j](2)==0:
true)) :
true)
275 points[index] = unit_support_points[j](0);
277 points[n_points-1] = unit_support_points[j](0);
279 points[index-1] = unit_support_points[j](0);
286 ExcMessage (
"Could not decode support points in one coordinate direction."));
289 for (
unsigned int j=0; j<n_points; j++)
290 if (std::fabs(points[j] - (
double)j/(this->degree-1)) > 1e-15)
297 namebuf <<
"FE_Q_Bubbles<" << dim <<
">(" << this->degree-1 <<
")";
304 for (
unsigned int j=0; j<n_points; j++)
305 if (points[j] != points_gl.
point(j)(0))
311 namebuf <<
"FE_Q_Bubbles<" << dim <<
">(QGaussLobatto(" << this->degree <<
"))";
313 namebuf <<
"FE_Q_Bubbles<" << dim <<
">(QUnknownNodes(" << this->degree-1 <<
"))";
315 return namebuf.str();
320 template <
int dim,
int spacedim>
329 template <
int dim,
int spacedim>
332 const std::vector<double> &values)
const 335 ExcDimensionMismatch(values.size(),
338 ExcDimensionMismatch(local_dofs.size(),this->
dofs_per_cell));
342 std::copy(values.begin(), values.end(), local_dofs.begin());
345 for (
unsigned int i = 0; i<
n_bubbles; ++i)
346 local_dofs[local_dofs.size()-i-1] = 0.;
351 template <
int dim,
int spacedim>
355 unsigned int offset)
const 358 ExcDimensionMismatch(values.size(),
361 ExcDimensionMismatch(local_dofs.size(),this->
dofs_per_cell));
363 ExcDimensionMismatch(values[0].size(),offset+this->
n_components()));
367 const std::pair<unsigned int, unsigned int> index
369 local_dofs[i] = values[i](offset+index.first);
373 for (
unsigned int i = 0; i<
n_bubbles; ++i)
374 local_dofs[local_dofs.size()-i-1] = 0.;
379 template <
int dim,
int spacedim>
382 std::vector<double> &local_dofs,
383 const VectorSlice<
const std::vector<std::vector<double> > > &values)
const 386 ExcDimensionMismatch(values.size(),
389 ExcDimensionMismatch(local_dofs.size(),this->
dofs_per_cell));
391 ExcDimensionMismatch(values.size(), this->
n_components()));
395 const std::pair<unsigned int, unsigned int> index
397 local_dofs[i] = values[index.first][i];
401 for (
unsigned int i = 0; i<
n_bubbles; ++i)
402 local_dofs[local_dofs.size()-i-1] = 0.;
407 template <
int dim,
int spacedim>
421 (dynamic_cast<const FEQBUBBLES *>(&x_source_fe) != 0)
424 ExcInterpolationNotImplemented());
426 ExcDimensionMismatch (interpolation_matrix.
m(),
429 ExcDimensionMismatch (interpolation_matrix.
m(),
433 if (dynamic_cast<const FEQBUBBLES *>(&x_source_fe)->degree == this->degree)
434 for (
unsigned int i=0; i<interpolation_matrix.
m(); ++i)
435 interpolation_matrix.
set(i,i,1.);
438 Assert(
false,
typename FEL::ExcInterpolationNotImplemented())
443 template <
int dim,
int spacedim>
447 unsigned int n_cont_dofs = Utilities::fixed_power<dim>(q_deg+1);
448 const unsigned int n_bubbles = (q_deg<=1?1:dim);
449 return std::vector<bool> (n_cont_dofs+
n_bubbles,
true);
454 template <
int dim,
int spacedim>
455 std::vector<unsigned int>
458 std::vector<unsigned int> dpo(dim+1, 1U);
459 for (
unsigned int i=1; i<dpo.size(); ++i)
460 dpo[i]=dpo[i-1]*(q_deg-1);
462 dpo[dim]+=(q_deg<=1?1:dim);
468 template <
int dim,
int spacedim>
471 (
const unsigned int shape_index,
472 const unsigned int face_index)
const 483 template <
int dim,
int spacedim>
486 (
const unsigned int child,
492 ExcMessage(
"Prolongation matrices are only available for refined cells!"));
497 ExcMessage(
"This prolongation matrix has not been computed yet!"));
504 template <
int dim,
int spacedim>
507 (
const unsigned int child,
513 ExcMessage(
"Restriction matrices are only available for refined cells!"));
518 ExcMessage(
"This restriction matrix has not been computed yet!"));
521 return this->
restriction[refinement_case-1][child];
525 #include "fe_q_bubbles.inst" 527 DEAL_II_NAMESPACE_CLOSE
Transformed quadrature weights.
const unsigned int n_bubbles
std::vector< std::vector< FullMatrix< double > > > restriction
#define AssertDimension(dim1, dim2)
const std::vector< Point< dim > > & get_points() const
::ExceptionBase & ExcMessage(std::string arg1)
const unsigned int degree
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
const Point< dim > & point(const unsigned int i) const
active_cell_iterator begin_active(const unsigned int level=0) const
Transformed quadrature points.
#define AssertThrow(cond, exc)
std::vector< Point< dim > > unit_support_points
void set(const size_type i, const size_type j, const number value)
virtual void execute_coarsening_and_refinement()
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case) const
static unsigned int n_children(const RefinementCase< dim > &refinement_case)
std::vector< std::vector< FullMatrix< double > > > prolongation
#define Assert(cond, exc)
virtual FiniteElement< dim, spacedim > * clone() const
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case) const
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
virtual void interpolate(std::vector< double > &local_dofs, const std::vector< double > &values) const
virtual std::string get_name() const =0
virtual std::string get_name() const
unsigned int size() const
const unsigned int dofs_per_cell
void initialize(const std::vector< Point< 1 > > &support_points_1d)
virtual double shape_value(const unsigned int i, const Point< dim > &p) const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
unsigned int n_components() const
unsigned int n_dofs_per_cell() const
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
static std::vector< bool > get_riaf_vector(const unsigned int degree)
void hyper_cube(Triangulation< dim, spacedim > &tria, const double left=0., const double right=1., const bool colorize=false)
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
FE_Q_Bubbles(const unsigned int p)