49 template<
unsigned int dim,
unsigned int spacedim>
56 jacobians.resize(size);
59 determinants.resize(size);
63 JxW_values.resize(size);
66 inverse_jacobians.resize(size);
75 shape_gradients.resize(size,
vector<arma::vec::fixed<spacedim> >(n_comp));
82 normal_vectors.resize(size);
86 template<
unsigned int dim,
unsigned int spacedim>
92 switch (fv.
get_fe()->type_) {
106 ASSERT_DBG(fe_sys !=
nullptr).error(
"Mixed system must be represented by FESystem.");
111 unsigned int comp_offset = 0;
112 for (
auto fe : fe_sys->
fe())
132 comp_offset += fe->n_space_components(spacedim);
140 template<
unsigned int dim,
unsigned int spacedim>
142 : mapping(NULL), quadrature(NULL), fe(NULL), mapping_data(NULL), fe_data(NULL)
148 template<
unsigned int dim,
unsigned int spacedim>
156 template<
unsigned int dim,
unsigned int spacedim>
167 ASSERT_DBG(_fe.
n_components() == spacedim*spacedim).error(
"FETensor must have spacedim*spacedim components.");
183 template<
unsigned int dim,
unsigned int spacedim>
188 arma::mat shape_values(
fe->n_dofs(),
fe->n_components());
189 for (
unsigned int i=0; i<q->
size(); i++)
191 for (
unsigned int j=0; j<
fe->n_dofs(); j++)
193 for (
unsigned int c=0; c<
fe->n_components(); c++)
194 shape_values(j,c) =
fe->shape_value(j, q->
point(i), c);
200 arma::mat grad(dim,
fe->n_components());
201 for (
unsigned int i=0; i<q->
size(); i++)
203 for (
unsigned int j=0; j<
fe->n_dofs(); j++)
206 for (
unsigned int c=0; c<
fe->n_components(); c++)
207 grad.col(c) +=
fe->shape_grad(j, q->
point(i), c);
218 template<
unsigned int dim,
unsigned int spacedim>
227 template<
unsigned int dim,
unsigned int spacedim>
232 return data.shape_values[point_no][function_no];
236 template<
unsigned int dim,
unsigned int spacedim>
241 return data.shape_gradients[point_no][function_no];
245 template<
unsigned int dim,
unsigned int spacedim>
247 const unsigned int point_no,
248 const unsigned int comp)
const 257 template<
unsigned int dim,
unsigned int spacedim>
259 const unsigned int point_no,
260 const unsigned int comp)
const 269 template<
unsigned int dim,
unsigned int spacedim>
276 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
277 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
282 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
283 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
288 template<
unsigned int dim,
unsigned int spacedim>
296 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
297 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
300 for (
unsigned int c=0; c<spacedim; c++)
301 data.shape_values[i][j*spacedim+c] = fv_vec[c];
308 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
309 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
312 for (
unsigned int c=0; c<spacedim; c++)
313 data.shape_gradients[i][j*spacedim+c] = grads.col(c);
319 template<
unsigned int dim,
unsigned int spacedim>
327 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
328 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
331 for (
unsigned int c=0; c<spacedim; c++)
332 data.shape_values[i][j*spacedim+c] = fv_vec[c];
339 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
340 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
343 for (
unsigned int c=0; c<spacedim; c++)
344 data.shape_gradients[i][j*spacedim+c] = grads.col(c);
350 template<
unsigned int dim,
unsigned int spacedim>
358 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
359 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
362 for (
unsigned int c=0; c<spacedim; c++)
363 data.shape_values[i][j*spacedim+c] = fv_vec(c);
370 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
371 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
374 /
data.determinants[i];
375 for (
unsigned int c=0; c<spacedim; c++)
376 data.shape_gradients[i][j*spacedim+c] = grads.col(c);
382 template<
unsigned int dim,
unsigned int spacedim>
390 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
391 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
394 for (
unsigned int c=0; c<spacedim*spacedim; c++)
395 data.shape_values[i][j*spacedim*spacedim+c] = fv_vec[c];
402 for (
unsigned int i = 0; i < fe_data.
n_points; i++)
403 for (
unsigned int j = 0; j < fe_data.
n_dofs; j++)
406 for (
unsigned int c=0; c<spacedim*spacedim; c++)
407 data.shape_gradients[i][j*spacedim*spacedim+c] = grads.col(c);
413 template<
unsigned int dim,
unsigned int spacedim>
420 ASSERT_DBG(fe_sys !=
nullptr).error(
"Mixed system must be represented by FESystem.");
421 for (
unsigned int f=0; f<fe_sys->
fe().size(); f++)
430 unsigned int n_space_components =
fe->n_space_components(spacedim);
436 unsigned int comp_offset = 0;
437 unsigned int shape_offset = 0;
438 for (
unsigned int f=0; f<fe_sys->
fe().size(); f++)
440 unsigned int n_sub_space_components = fe_sys->
fe()[f]->n_space_components(spacedim);
443 for (
unsigned int i=0; i<fe_data.
n_points; i++)
444 for (
unsigned int n=0; n<fe_sys->
fe()[f]->n_dofs(); n++)
445 for (
unsigned int c=0; c<n_sub_space_components; c++)
446 data.shape_values[i][shape_offset+n_space_components*n+comp_offset+c] =
fe_values_vec[f]->
data.shape_values[i][n*n_sub_space_components+c];
448 comp_offset += n_sub_space_components;
449 shape_offset += fe_sys->
fe()[f]->n_dofs()*n_space_components;
457 unsigned int comp_offset = 0;
458 unsigned int shape_offset = 0;
459 for (
unsigned int f=0; f<fe_sys->
fe().size(); f++)
461 unsigned int n_sub_space_components = fe_sys->
fe()[f]->n_space_components(spacedim);
464 for (
unsigned int i=0; i<fe_data.
n_points; i++)
465 for (
unsigned int n=0; n<fe_sys->
fe()[f]->n_dofs(); n++)
466 for (
unsigned int c=0; c<n_sub_space_components; c++)
467 data.shape_gradients[i][shape_offset+n_space_components*n+comp_offset+c] =
fe_values_vec[f]->
data.shape_gradients[i][n*n_sub_space_components+c];
469 comp_offset += n_sub_space_components;
470 shape_offset += fe_sys->
fe()[f]->n_dofs()*n_space_components;
477 template<
unsigned int dim,
unsigned int spacedim>
500 ASSERT(
false).error(
"Not implemented.");
511 template<
unsigned int dim,
unsigned int spacedim>
518 this->
allocate(_mapping, _quadrature, _fe, _flags);
528 ASSERT_DBG(fe !=
nullptr).error(
"Mixed system must be represented by FESystem.");
530 for (
auto fe_sub : fe->
fe())
537 template<
unsigned int dim,
unsigned int spacedim>
541 this->
data.present_cell = &cell;
544 this->
mapping->fill_fe_values(cell,
560 template<
unsigned int dim,
unsigned int spacedim>
569 this->
allocate(_mapping, *q, _fe, _flags);
571 for (
unsigned int sid = 0; sid < RefElement<dim>::n_sides; sid++)
573 for (
unsigned int pid = 0; pid < RefElement<dim>::n_side_permutations; pid++)
586 ASSERT_DBG(fe !=
nullptr).error(
"Mixed system must be represented by FESystem.");
588 for (
auto fe_sub : fe->
fe())
595 template<
unsigned int dim,
unsigned int spacedim>
598 for (
unsigned int sid=0; sid<RefElement<dim>::n_sides; sid++)
600 for (
unsigned int pid=0; pid<RefElement<dim>::n_side_permutations; pid++)
613 template<
unsigned int dim,
unsigned int spacedim>
619 this->
data.present_cell = &cell;
624 this->
mapping->fill_fe_side_values(cell,
UpdateFlags
Enum type UpdateFlags indicates which quantities are to be recomputed on each finite element cell...
void fill_vec_contravariant_data(const FEInternalData &fe_data)
Compute shape functions and gradients on the actual cell for vectorial FE.
const std::vector< std::shared_ptr< FiniteElement< dim > > > & fe()
Transformed quadrature weight for cell sides.
#define ASSERT_EQ_DBG(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
void reinit(ElementAccessor< 3 > &cell, unsigned int sid)
Update cell-dependent data (gradients, Jacobians etc.)
void fill_scalar_data(const FEInternalData &fe_data)
Compute shape functions and gradients on the actual cell for scalar FE.
arma::vec::fixed< spacedim > shape_grad_component(const unsigned int function_no, const unsigned int point_no, const unsigned int comp) const
Return the gradient of the function_no-th shape function at the point_no-th quadrature point...
Determinant of the Jacobian.
void fill_data(const FEInternalData &fe_data)
Computes the shape function values and gradients on the actual cell and fills the FEValues structure...
void allocate(Mapping< dim, spacedim > &_mapping, Quadrature< dim > &_quadrature, FiniteElement< dim > &_fe, UpdateFlags flags)
Allocates space for computed data.
MappingInternalData * mapping_data
Precomputed mapping data.
void initialize(FEValuesBase &fv)
UpdateFlags update_each(UpdateFlags flags)
Determine quantities to be recomputed on each cell.
FEValuesBase()
Default constructor.
Class FEValues calculates finite element data on the actual cells such as shape function values...
FEValuesData< dim, spacedim > data
Data computed by the mapping and finite element.
Class FESystem for compound finite elements.
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
FEInternalData * fe_data
Precomputed finite element data.
FiniteElement< dim > * get_fe() const
Returns the finite element in use.
void allocate(unsigned int size, UpdateFlags flags, unsigned n_comp)
Resize the data arrays.
Base class for quadrature rules on simplices in arbitrary dimensions.
unsigned int n_components_
Number of components of the FE.
virtual ~FESideValues()
Destructor.
FEValues(Mapping< dim, spacedim > &_mapping, Quadrature< dim > &_quadrature, FiniteElement< dim > &_fe, UpdateFlags _flags)
Constructor.
Transformed quadrature points.
Abstract class for the mapping between reference and actual cell.
Compound finite element on dim dimensional simplex.
void fill_tensor_data(const FEInternalData &fe_data)
Compute shape functions and gradients on the actual cell for tensorial FE.
unsigned int n_sides() const
void fill_system_data(const FEInternalData &fe_data)
Compute shape functions and gradients on the actual cell for mixed system of FE.
void fill_vec_piola_data(const FEInternalData &fe_data)
Compute shape functions and gradients on the actual cell for Raviart-Thomas FE.
unsigned int n_components() const
Returns numer of components of the basis function.
Basic definitions of numerical quadrature rules.
const Quadrature< dim-1 > * sub_quadrature
Quadrature for the integration on the element sides.
Shape function gradients.
MappingInternalData * side_mapping_data[RefElement< dim >::n_sides][RefElement< dim >::n_side_permutations]
Quadrature< dim > side_quadrature[RefElement< dim >::n_sides][RefElement< dim >::n_side_permutations]
FEInternalData * init_fe_data(const Quadrature< dim > *q)
Precompute finite element data on reference element.
FEInternalData(unsigned int np, unsigned int nd)
Quadrature< dim > * quadrature
The quadrature rule used to calculate integrals.
double shape_value(const unsigned int function_no, const unsigned int point_no)
Return the value of the function_no-th shape function at the point_no-th quadrature point...
Class Mapping calculates data related to the mapping of the reference cell to the actual cell...
void fill_vec_data(const FEInternalData &fe_data)
Compute shape functions and gradients on the actual cell for vectorial FE.
std::vector< std::vector< arma::mat > > ref_shape_grads
Precomputed gradients of basis functions at the quadrature points.
FEInternalData * side_fe_data[RefElement< dim >::n_sides][RefElement< dim >::n_side_permutations]
FESideValues(Mapping< dim, spacedim > &_mapping, Quadrature< dim-1 > &_sub_quadrature, FiniteElement< dim > &_fe, UpdateFlags flags)
Constructor.
ViewsCache views_cache_
Auxiliary storage of FEValuesViews accessors.
Mapping< dim, spacedim > * mapping
The mapping from the reference cell to the actual cell.
const unsigned int size() const
Returns number of quadrature points.
double shape_value_component(const unsigned int function_no, const unsigned int point_no, const unsigned int comp) const
Return the value of the function_no-th shape function at the point_no-th quadrature point...
FiniteElement< dim > * fe
The used finite element.
arma::vec::fixed< spacedim > shape_grad(const unsigned int function_no, const unsigned int point_no)
Return the gradient of the function_no-th shape function at the point_no-th quadrature point...
const arma::vec::fixed< dim > & point(const unsigned int i) const
Returns the ith quadrature point.
Calculates finite element data on the actual cell.
unsigned int n_points
Number of quadrature points.
#define OLD_ASSERT_EQUAL(a, b)
std::vector< std::shared_ptr< FEValuesBase< dim, spacedim > > > fe_values_vec
Vector of FEValues for sub-elements of FESystem.
Structure for storing the precomputed finite element data.
std::vector< std::vector< arma::vec > > ref_shape_values
Precomputed values of basis functions at the quadrature points.
Abstract class for description of finite elements.
Abstract class for the description of a general finite element on a reference simplex in dim dimensio...
Base class for FEValues and FESideValues.
unsigned int n_dofs
Number of dofs (shape functions).
unsigned int permutation_idx(unsigned int prm_idx) const
Return permutation_idx of given index.
void reinit(ElementAccessor< 3 > &cell)
Update cell-dependent data (gradients, Jacobians etc.)
Transformed quadrature weights.
FEType type_
Type of FiniteElement.
Calculates finite element data on a side.
#define ASSERT_LT_DBG(a, b)
Definition of comparative assert macro (Less Than) only for debug mode.