|
unsigned int | get_mapping_data_index_offset () const |
|
internal::MatrixFreeFunctions::GeometryType | get_cell_type () const |
|
const internal::MatrixFreeFunctions::ShapeInfo< VectorizedArrayType > & | get_shape_info () const |
|
VectorizedArrayType | JxW (const unsigned int q_point) const |
|
Tensor< 2, dim, VectorizedArrayType > | inverse_jacobian (const unsigned int q_point) const |
|
Tensor< 1, dim, VectorizedArrayType > | get_normal_vector (const unsigned int q_point) const |
|
VectorizedArrayType | read_cell_data (const AlignedVector< VectorizedArrayType > &array) const |
|
template<typename T > |
std::array< T, VectorizedArrayType::size()> | read_cell_data (const AlignedVector< std::array< T, VectorizedArrayType::size()>> &array) const |
|
void | set_cell_data (AlignedVector< VectorizedArrayType > &array, const VectorizedArrayType &value) const |
|
template<typename T > |
void | set_cell_data (AlignedVector< std::array< T, VectorizedArrayType::size()>> &array, const std::array< T, VectorizedArrayType::size()> &value) const |
|
std::array< unsigned int, VectorizedArrayType::size()> | get_cell_ids () const |
|
std::array< unsigned int, VectorizedArrayType::size()> | get_cell_or_face_ids () const |
|
const std::vector< unsigned int > & | get_internal_dof_numbering () const |
|
ArrayView< VectorizedArrayType > | get_scratch_data () const |
|
unsigned int | get_quadrature_index () const |
|
unsigned int | get_current_cell_index () const |
|
unsigned int | get_active_fe_index () const |
|
unsigned int | get_active_quadrature_index () const |
|
|
template<typename VectorType > |
void | read_dof_values (const VectorType &src, const unsigned int first_index=0) |
|
template<typename VectorType > |
void | read_dof_values_plain (const VectorType &src, const unsigned int first_index=0) |
|
template<typename VectorType > |
void | distribute_local_to_global (VectorType &dst, const unsigned int first_index=0, const std::bitset< VectorizedArrayType::size()> &mask=std::bitset< VectorizedArrayType::size()>().flip()) const |
|
template<typename VectorType > |
void | set_dof_values (VectorType &dst, const unsigned int first_index=0, const std::bitset< VectorizedArrayType::size()> &mask=std::bitset< VectorizedArrayType::size()>().flip()) const |
|
template<typename VectorType > |
void | set_dof_values_plain (VectorType &dst, const unsigned int first_index=0, const std::bitset< VectorizedArrayType::size()> &mask=std::bitset< VectorizedArrayType::size()>().flip()) const |
|
|
value_type | get_dof_value (const unsigned int dof) const |
|
void | submit_dof_value (const value_type val_in, const unsigned int dof) |
|
value_type | get_value (const unsigned int q_point) const |
|
void | submit_value (const value_type val_in, const unsigned int q_point) |
|
gradient_type | get_gradient (const unsigned int q_point) const |
|
value_type | get_normal_derivative (const unsigned int q_point) const |
|
void | submit_gradient (const gradient_type grad_in, const unsigned int q_point) |
|
void | submit_normal_derivative (const value_type grad_in, const unsigned int q_point) |
|
Tensor< 1, n_components_, Tensor< 2, dim, VectorizedArrayType > > | get_hessian (const unsigned int q_point) const |
|
gradient_type | get_hessian_diagonal (const unsigned int q_point) const |
|
value_type | get_laplacian (const unsigned int q_point) const |
|
VectorizedArrayType | get_divergence (const unsigned int q_point) const |
|
SymmetricTensor< 2, dim, VectorizedArrayType > | get_symmetric_gradient (const unsigned int q_point) const |
|
Tensor< 1,(dim==2 ? 1 :dim), VectorizedArrayType > | get_curl (const unsigned int q_point) const |
|
void | submit_divergence (const VectorizedArrayType div_in, const unsigned int q_point) |
|
void | submit_symmetric_gradient (const SymmetricTensor< 2, dim, VectorizedArrayType > grad_in, const unsigned int q_point) |
|
void | submit_curl (const Tensor< 1, dim==2 ? 1 :dim, VectorizedArrayType > curl_in, const unsigned int q_point) |
|
value_type | integrate_value () const |
|
|
const VectorizedArrayType * | begin_dof_values () const |
|
VectorizedArrayType * | begin_dof_values () |
|
const VectorizedArrayType * | begin_values () const |
|
VectorizedArrayType * | begin_values () |
|
const VectorizedArrayType * | begin_gradients () const |
|
VectorizedArrayType * | begin_gradients () |
|
const VectorizedArrayType * | begin_hessians () const |
|
VectorizedArrayType * | begin_hessians () |
|
|
| FEEvaluationBase (const MatrixFree< dim, Number, VectorizedArrayType > &matrix_free, const unsigned int dof_no, const unsigned int first_selected_component, const unsigned int quad_no, const unsigned int fe_degree, const unsigned int n_q_points, const bool is_interior_face, const unsigned int active_fe_index, const unsigned int active_quad_index) |
|
| FEEvaluationBase (const Mapping< dim > &mapping, const FiniteElement< dim > &fe, const Quadrature< 1 > &quadrature, const UpdateFlags update_flags, const unsigned int first_selected_component, const FEEvaluationBaseData< dim, Number, is_face, VectorizedArrayType > *other) |
|
| FEEvaluationBase (const FEEvaluationBase &other) |
|
FEEvaluationBase & | operator= (const FEEvaluationBase &other) |
|
template<typename VectorType , typename VectorOperation > |
void | read_write_operation (const VectorOperation &operation, const std::array< VectorType *, n_components_ > &vectors, const std::array< const std::vector< ArrayView< const typename VectorType::value_type >> *, n_components_ > &vectors_sm, const std::bitset< VectorizedArrayType::size()> &mask, const bool apply_constraints=true) const |
|
template<typename VectorType , typename VectorOperation > |
void | read_write_operation_contiguous (const VectorOperation &operation, const std::array< VectorType *, n_components_ > &vectors, const std::array< const std::vector< ArrayView< const typename VectorType::value_type >> *, n_components_ > &vectors_sm, const std::bitset< VectorizedArrayType::size()> &mask) const |
|
template<typename VectorType , typename VectorOperation > |
void | read_write_operation_global (const VectorOperation &operation, const std::array< VectorType *, n_components_ > &vectors) const |
|
|
VectorizedArrayType * | values_dofs [n_components] |
|
VectorizedArrayType * | values_quad |
|
VectorizedArrayType * | gradients_quad |
|
VectorizedArrayType * | hessians_quad |
|
const unsigned int | n_fe_components |
|
bool | dof_values_initialized |
|
bool | values_quad_initialized |
|
bool | gradients_quad_initialized |
|
bool | hessians_quad_initialized |
|
bool | values_quad_submitted |
|
bool | gradients_quad_submitted |
|
const unsigned int | first_selected_component |
|
std::vector< types::global_dof_index > | local_dof_indices |
|
AlignedVector< VectorizedArrayType > * | scratch_data_array |
|
VectorizedArrayType * | scratch_data |
|
const unsigned int | quad_no |
|
const MatrixFree< dim, Number, VectorizedArrayType > * | matrix_info |
|
const internal::MatrixFreeFunctions::DoFInfo * | dof_info |
|
const internal::MatrixFreeFunctions::MappingInfoStorage<(is_face ? dim - 1 :dim), dim, Number, VectorizedArrayType > * | mapping_data |
|
const unsigned int | active_fe_index |
|
const unsigned int | active_quad_index |
|
const internal::MatrixFreeFunctions::MappingInfoStorage<(is_face ? dim - 1 :dim), dim, Number, VectorizedArrayType >::QuadratureDescriptor * | descriptor |
|
const unsigned int | n_quadrature_points |
|
const internal::MatrixFreeFunctions::ShapeInfo< VectorizedArrayType > * | data |
|
const Tensor< 2, dim, VectorizedArrayType > * | jacobian |
|
const VectorizedArrayType * | J_value |
|
const Tensor< 1, dim, VectorizedArrayType > * | normal_vectors |
|
const Tensor< 1, dim, VectorizedArrayType > * | normal_x_jacobian |
|
const Number * | quadrature_weights |
|
unsigned int | cell |
|
bool | is_interior_face |
|
internal::MatrixFreeFunctions::DoFInfo::DoFAccessIndex | dof_access_index |
|
unsigned int | face_no |
|
unsigned int | face_orientation |
|
unsigned int | subface_index |
|
internal::MatrixFreeFunctions::GeometryType | cell_type |
|
std::shared_ptr< internal::MatrixFreeFunctions::MappingDataOnTheFly< dim, Number, VectorizedArrayType > > | mapped_geometry |
|
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
class FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >
This is the base class for the FEEvaluation classes. This class needs usually not be called in user code and does not have any public constructor. The usage is through the class FEEvaluation instead. It implements a reinit method that is used to set pointers so that operations on quadrature points can be performed quickly, access functions to vectors for the FEEvaluationBase::read_dof_values(), FEEvaluationBase::set_dof_values(), and FEEvaluationBase::distribute_local_to_global() functions, as well as methods to access values and gradients of finite element functions. It also inherits the geometry access functions provided by the class FEEvaluationBaseData.
This class has five template arguments:
- Template Parameters
-
dim | Dimension in which this class is to be used |
n_components | Number of vector components when solving a system of PDEs. If the same operation is applied to several components of a PDE (e.g. a vector Laplace equation), they can be applied simultaneously with one call (and often more efficiently) |
Number | Number format, usually double or float |
is_face | Whether the class is used for a cell integrator (with quadrature dimension the same as the space dimension) or for a face integrator (with quadrature dimension one less) |
VectorizedArrayType | Type of array to be woked on in a vectorized fashion, defaults to VectorizedArray<Number> |
- Note
- Currently only VectorizedArray<Number, width> is supported as VectorizedArrayType.
Definition at line 531 of file fe_evaluation.h.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::FEEvaluationBase |
( |
const Mapping< dim > & |
mapping, |
|
|
const FiniteElement< dim > & |
fe, |
|
|
const Quadrature< 1 > & |
quadrature, |
|
|
const UpdateFlags |
update_flags, |
|
|
const unsigned int |
first_selected_component, |
|
|
const FEEvaluationBaseData< dim, Number, is_face, VectorizedArrayType > * |
other |
|
) |
| |
|
protected |
Constructor that comes with reduced functionality and works similar as FEValues. The arguments are similar to the ones passed to the constructor of FEValues, with the notable difference that FEEvaluation expects a one- dimensional quadrature formula, Quadrature<1>, instead of a dim
dimensional one. The finite element can be both scalar or vector valued, but this method always only selects a scalar base element at a time (with n_components
copies as specified by the class template argument). For vector-valued elements, the optional argument first_selected_component
allows to specify the index of the base element to be used for evaluation. Note that the internal data structures always assume that the base element is primitive, non-primitive are not supported currently.
As known from FEValues, a call to the reinit method with a Triangulation::cell_iterator is necessary to make the geometry and degrees of freedom of the current class known. If the iterator includes DoFHandler information (i.e., it is a DoFHandler::cell_iterator or similar), the initialization allows to also read from or write to vectors in the standard way for DoFHandler::active_cell_iterator types for one cell at a time. However, this approach is much slower than the path with MatrixFree with MPI since index translation has to be done. As only one cell at a time is used, this method does not vectorize over several elements (which is most efficient for vector operations), but only possibly within the element if the evaluate/integrate routines are combined inside user code (e.g. for computing cell matrices).
The optional FEEvaluationBaseData object allows several FEEvaluation objects to share the geometry evaluation, i.e., the underlying mapping and quadrature points do only need to be evaluated once. This only works if the quadrature formulas are the same. Otherwise, a new evaluation object is created. Make sure to not pass an optional object around when you intend to use the FEEvaluation object in parallel with another one because otherwise the intended sharing may create race conditions.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
template<typename VectorType >
void FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::read_dof_values |
( |
const VectorType & |
src, |
|
|
const unsigned int |
first_index = 0 |
|
) |
| |
For the vector src
, read out the values on the degrees of freedom of the current cell, and store them internally. Similar functionality as the function DoFAccessor::get_interpolated_dof_values when no constraints are present, but it also includes constraints from hanging nodes, so one can see it as a similar function to AffineConstraints::read_dof_values as well. Note that if vectorization is enabled, the DoF values for several cells are set.
If some constraints on the vector are inhomogeneous, use the function read_dof_values_plain instead and provide the vector with useful data also in constrained positions by calling AffineConstraints::distribute. When accessing vector entries during the solution of linear systems, the temporary solution should always have homogeneous constraints and this method is the correct one.
If the given vector template class is a block vector (determined through the template function 'IsBlockVector<VectorType>::value', which checks for vectors derived from BlockVectorBase) or an std::vector<VectorType> or std::vector<VectorType *>, this function reads n_components
blocks from the block vector starting at the index first_index
. For non-block vectors, first_index
is ignored.
- Note
- If this class was constructed without a MatrixFree object and the information is acquired on the fly through a DoFHandler<dim>::cell_iterator, only one single cell is used by this class and this function extracts the values of the underlying components on the given cell. This call is slower than the ones done through a MatrixFree object and lead to a structure that does not effectively use vectorization in the evaluate routines based on these values (instead, VectorizedArray::size() same copies are worked on).
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
template<typename VectorType >
void FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::read_dof_values_plain |
( |
const VectorType & |
src, |
|
|
const unsigned int |
first_index = 0 |
|
) |
| |
For the vector src
, read out the values on the degrees of freedom of the current cell, and store them internally. Similar functionality as the function DoFAccessor::get_interpolated_dof_values. As opposed to the read_dof_values function, this function reads out the plain entries from vectors, without taking stored constraints into account. This way of access is appropriate when the constraints have been distributed on the vector by a call to AffineConstraints::distribute previously. This function is also necessary when inhomogeneous constraints are to be used, as MatrixFree can only handle homogeneous constraints. Note that if vectorization is enabled, the DoF values for several cells are set.
If the given vector template class is a block vector (determined through the template function 'IsBlockVector<VectorType>::value', which checks for vectors derived from BlockVectorBase) or an std::vector<VectorType> or std::vector<VectorType *>, this function reads n_components
blocks from the block vector starting at the index first_index
. For non-block vectors, first_index
is ignored.
- Note
- If this class was constructed without a MatrixFree object and the information is acquired on the fly through a DoFHandler<dim>::cell_iterator, only one single cell is used by this class and this function extracts the values of the underlying components on the given cell. This call is slower than the ones done through a MatrixFree object and lead to a structure that does not effectively use vectorization in the evaluate routines based on these values (instead, VectorizedArray::size() same copies are worked on).
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
template<typename VectorType >
void FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::distribute_local_to_global |
( |
VectorType & |
dst, |
|
|
const unsigned int |
first_index = 0 , |
|
|
const std::bitset< VectorizedArrayType::size()> & |
mask = std::bitset< VectorizedArrayType::size()>().flip() |
|
) |
| const |
Takes the values stored internally on dof values of the current cell and sums them into the vector dst
. The function also applies constraints during the write operation. The functionality is hence similar to the function AffineConstraints::distribute_local_to_global. If vectorization is enabled, the DoF values for several cells are used.
If the given vector template class is a block vector (determined through the template function 'IsBlockVector<VectorType>::value', which checks for vectors derived from BlockVectorBase) or an std::vector<VectorType> or std::vector<VectorType *>, this function writes to n_components
blocks of the block vector starting at the index first_index
. For non-block vectors, first_index
is ignored.
The mask
can be used to suppress the write access for some of the cells contained in the current cell vectorization batch, e.g. in case of local time stepping, where some cells are excluded from a call. A value of true
in the bitset means that the respective lane index will be processed, whereas a value of false
skips this index. The default setting is a bitset that contains all ones, which will write the accumulated integrals to all cells in the batch.
- Note
- If this class was constructed without a MatrixFree object and the information is acquired on the fly through a DoFHandler<dim>::cell_iterator, only one single cell is used by this class and this function extracts the values of the underlying components on the given cell. This call is slower than the ones done through a MatrixFree object and lead to a structure that does not effectively use vectorization in the evaluate routines based on these values (instead, VectorizedArray::size() same copies are worked on).
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
template<typename VectorType >
void FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::set_dof_values |
( |
VectorType & |
dst, |
|
|
const unsigned int |
first_index = 0 , |
|
|
const std::bitset< VectorizedArrayType::size()> & |
mask = std::bitset< VectorizedArrayType::size()>().flip() |
|
) |
| const |
Takes the values stored internally on dof values of the current cell and writes them into the vector dst
. The function skips the degrees of freedom which are constrained. As opposed to the distribute_local_to_global method, the old values at the position given by the current cell are overwritten. Thus, if a degree of freedom is associated to more than one cell (as usual in continuous finite elements), the values will be overwritten and only the value written last is retained. Please note that in a parallel context this function might also touch degrees of freedom owned by other MPI processes, so that a subsequent update or accumulation of ghost values as done by MatrixFree::loop() might invalidate the degrees of freedom set by this function.
If the given vector template class is a block vector (determined through the template function 'IsBlockVector<VectorType>::value', which checks for vectors derived from BlockVectorBase) or an std::vector<VectorType> or std::vector<VectorType *>, this function writes to n_components
blocks of the block vector starting at the index first_index
. For non-block vectors, first_index
is ignored.
The mask
can be used to suppress the write access for some of the cells contained in the current cell vectorization batch, e.g. in case of local time stepping, where some cells are excluded from a call. A value of true
in the bitset means that the respective lane index will be processed, whereas a value of false
skips this index. The default setting is a bitset that contains all ones, which will write the accumulated integrals to all cells in the batch.
- Note
- If this class was constructed without a MatrixFree object and the information is acquired on the fly through a DoFHandler<dim>::cell_iterator, only one single cell is used by this class and this function extracts the values of the underlying components on the given cell. This call is slower than the ones done through a MatrixFree object and lead to a structure that does not effectively use vectorization in the evaluate routines based on these values (instead, VectorizedArray::size() same copies are worked on).
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
Return the value stored for the local degree of freedom with index dof
. If the object is vector-valued, a vector-valued return argument is given. Thus, the argument dof
can at most run until dofs_per_component
rather than dofs_per_cell
since the different components of a vector-valued FE are return together. Note that when vectorization is enabled, values from several cells are grouped together. If set_dof_values
was called last, the value corresponds to the one set there. If integrate
was called last, it instead corresponds to the value of the integrated function with the test function of the given index.
Note that the derived class FEEvaluationAccess overloads this operation with specializations for the scalar case (n_components == 1) and for the vector-valued case (n_components == dim).
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
Tensor<1, n_components_, Tensor<2, dim, VectorizedArrayType> > FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::get_hessian |
( |
const unsigned int |
q_point | ) |
const |
Return the Hessian of a finite element function at quadrature point number q_point
after a call to FEEvaluation::evaluate(EvaluationFlags::hessians). If only the diagonal or even the trace of the Hessian, the Laplacian, is needed, use the other functions below.
Note that the derived class FEEvaluationAccess overloads this operation with specializations for the scalar case (n_components == 1) and for the vector-valued case (n_components == dim).
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
const VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::begin_values |
( |
| ) |
const |
Return a read-only pointer to the first field of function values on quadrature points. First come the function values on all quadrature points for the first component, then all values for the second component, and so on. This is related to the internal data structures used in this class. The raw data after a call to evaluate
only contains unit cell operations, so possible transformations, quadrature weights etc. must be applied manually. In general, it is safer to use the get_value() function instead, which does all the transformation internally.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::begin_values |
( |
| ) |
|
Return a read and write pointer to the first field of function values on quadrature points. First come the function values on all quadrature points for the first component, then all values for the second component, and so on. This is related to the internal data structures used in this class. The raw data after a call to evaluate
only contains unit cell operations, so possible transformations, quadrature weights etc. must be applied manually. In general, it is safer to use the get_value() function instead, which does all the transformation internally.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
const VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::begin_gradients |
( |
| ) |
const |
Return a read-only pointer to the first field of function gradients on quadrature points. First comes the x-component of the gradient for the first component on all quadrature points, then the y-component, and so on. Next comes the x-component of the second component, and so on. This is related to the internal data structures used in this class. The raw data after a call to evaluate
only contains unit cell operations, so possible transformations, quadrature weights etc. must be applied manually. In general, it is safer to use the get_gradient() function instead, which does all the transformation internally.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::begin_gradients |
( |
| ) |
|
Return a read and write pointer to the first field of function gradients on quadrature points. First comes the x-component of the gradient for the first component on all quadrature points, then the y-component, and so on. Next comes the x-component of the second component, and so on. This is related to the internal data structures used in this class. The raw data after a call to evaluate
only contains unit cell operations, so possible transformations, quadrature weights etc. must be applied manually. In general, it is safer to use the get_gradient() function instead, which does all the transformation internally.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
const VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::begin_hessians |
( |
| ) |
const |
Return a read-only pointer to the first field of function hessians on quadrature points. First comes the xx-component of the hessian for the first component on all quadrature points, then the yy-component, zz- component in (3D), then the xy-component, and so on. Next comes the xx- component of the second component, and so on. This is related to the internal data structures used in this class. The raw data after a call to evaluate
only contains unit cell operations, so possible transformations, quadrature weights etc. must be applied manually. In general, it is safer to use the get_laplacian() or get_hessian() functions instead, which does all the transformation internally.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::begin_hessians |
( |
| ) |
|
Return a read and write pointer to the first field of function hessians on quadrature points. First comes the xx-component of the hessian for the first component on all quadrature points, then the yy-component, zz- component in (3D), then the xy-component, and so on. Next comes the xx- component of the second component, and so on. This is related to the internal data structures used in this class. The raw data after a call to evaluate
only contains unit cell operations, so possible transformations, quadrature weights etc. must be applied manually. In general, it is safer to use the get_laplacian() or get_hessian() functions instead, which does all the transformation internally.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
template<typename VectorType , typename VectorOperation >
void FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::read_write_operation_global |
( |
const VectorOperation & |
operation, |
|
|
const std::array< VectorType *, n_components_ > & |
vectors |
|
) |
| const |
|
protected |
A unified function to read from and write into vectors based on the given template operation for the case when we do not have an underlying MatrixFree object. It can perform the operation for read_dof_values
, distribute_local_to_global
, and set_dof_values
. It performs the operation for several vectors at a time, depending on n_components.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
This field stores the values for local degrees of freedom (e.g. after reading out from a vector but before applying unit cell transformations or before distributing them into a result vector). The methods get_dof_value() and submit_dof_value() read from or write to this field.
The values of this array are stored in the start section of scratch_data_array
. Due to its access as a thread local memory, the memory can get reused between different calls. As opposed to requesting memory on the stack, this approach allows for very large polynomial degrees.
Definition at line 1250 of file fe_evaluation.h.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::values_quad |
|
protected |
This field stores the values of the finite element function on quadrature points after applying unit cell transformations or before integrating. The methods get_value() and submit_value() access this field.
The values of this array are stored in the start section of scratch_data_array
. Due to its access as a thread local memory, the memory can get reused between different calls. As opposed to requesting memory on the stack, this approach allows for very large polynomial degrees.
Definition at line 1263 of file fe_evaluation.h.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::gradients_quad |
|
protected |
This field stores the gradients of the finite element function on quadrature points after applying unit cell transformations or before integrating. The methods get_gradient() and submit_gradient() (as well as some specializations like get_symmetric_gradient() or get_divergence()) access this field.
The values of this array are stored in the start section of scratch_data_array
. Due to its access as a thread local memory, the memory can get reused between different calls. As opposed to requesting memory on the stack, this approach allows for very large polynomial degrees.
Definition at line 1278 of file fe_evaluation.h.
template<int dim, int n_components_, typename Number, bool is_face = false, typename VectorizedArrayType = VectorizedArray<Number>>
VectorizedArrayType* FEEvaluationBase< dim, n_components_, Number, is_face, VectorizedArrayType >::hessians_quad |
|
protected |
This field stores the Hessians of the finite element function on quadrature points after applying unit cell transformations. The methods get_hessian(), get_laplacian(), get_hessian_diagonal() access this field.
The values of this array are stored in the start section of scratch_data_array
. Due to its access as a thread local memory, the memory can get reused between different calls. As opposed to requesting memory on the stack, this approach allows for very large polynomial degrees.
Definition at line 1291 of file fe_evaluation.h.