19 #ifndef OP_FUNCTION_HH_
20 #define OP_FUNCTION_HH_
63 template<
unsigned int dim,
class ElDomain,
class Domain,
unsigned int spacedim = 3>
69 this->
domain_ = Domain::domain();
78 for (
uint i_col=0; i_col<ElDomain::n_nodes(dim); ++i_col)
79 for (
uint i_row=0; i_row<spacedim; ++i_row) {
80 result(i_row, i_col)(i_elm) = ( *
ppv.template node<ElDomain>(i_elm, i_col) )(i_row);
87 template<
unsigned int dim,
class ElDomain,
class Domain,
unsigned int spacedim = 3>
94 this->
domain_ = Domain::domain();
101 for (
unsigned int i=0; i<spacedim; i++)
102 for (
unsigned int j=0; j<ElDomain::n_nodes(dim)-1; j++)
103 jac_value(i,j) = coords_value(i,j+1) - coords_value(i,0);
108 template<
unsigned int dim,
class ElDomain,
class Domain,
unsigned int spacedim = 3>
115 this->
domain_ = Domain::domain();
142 jac_det_value(0,0)(i) = 1.0;
151 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
158 this->
domain_ = Domain::domain();
165 inv_jac_value = eigen_arena_tools::inverse<spacedim, dim>(jac_value);
170 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
177 this->
domain_ = Domain::domain();
187 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
194 this->
domain_ = Domain::domain();
198 for (
uint i=0; i<point_weights_vec.size(); ++i)
199 this->
result_(0)(i) = point_weights_vec[i];
209 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
216 this->
domain_ = Domain::domain();
232 template<
unsigned int dim,
unsigned int spacedim = 3>
250 Eigen::VectorXd A(3);
251 for (
uint i=0; i<normal_value(0).data_size(); ++i) {
252 A(0) = normal_value(0)(i);
253 A(1) = normal_value(1)(i);
254 A(2) = normal_value(2)(i);
255 norm_vec(i) = A.norm();
258 for (
uint i=0; i<spacedim; ++i) {
259 normal_value(i) = normal_value(i) / norm_vec;
265 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
272 this->
domain_ = Domain::domain();
273 Quadrature *quad = pfev.get_bulk_quadrature(dim);
278 for (
unsigned int i_p = 0; i_p < n_points; i_p++)
279 for (
unsigned int i_dof = 0; i_dof < this->
n_dofs_; i_dof++)
280 ref_scalar_value(i_dof)(i_p) = fe->shape_value(i_dof, quad->
point<dim>(i_p));
287 template<
unsigned int dim,
unsigned int spacedim>
295 Quadrature *quad = pfev.get_side_quadrature(dim);
300 for (
unsigned int s=0; s<dim+1; ++s) {
302 for (
unsigned int i_p = 0; i_p < n_points; i_p++)
303 for (
unsigned int i_dof = 0; i_dof < this->
n_dofs_; i_dof++)
304 ref_scalar_value(s, i_dof)(i_p) = fe->shape_value(i_dof, side_q.
point<dim>(i_p));
312 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
319 this->
domain_ = Domain::domain();
320 Quadrature *quad = pfev.get_bulk_quadrature(dim);
327 for (
uint i_p=0; i_p<n_points; ++i_p)
328 for (
uint c=0; c<spacedim; ++c)
329 ref_vector_value(c, i_dof)(i_p) = fe->shape_value(i_dof, quad->
point<dim>(i_p), c);
336 template<
unsigned int dim,
unsigned int spacedim>
344 Quadrature *quad = pfev.get_side_quadrature(dim);
350 for (
unsigned int s=0; s<dim+1; ++s) {
352 for (
unsigned int i_p = 0; i_p < n_points; i_p++)
353 for (
unsigned int i_dof = 0; i_dof < this->
n_dofs_; i_dof++)
354 for (
uint c=0; c<spacedim; ++c)
355 ref_vector_value(s,3*i_dof+c)(i_p) = fe->shape_value(i_dof, side_q.
point<dim>(i_p), c);
363 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
370 this->
domain_ = Domain::domain();
371 Quadrature *quad = pfev.get_bulk_quadrature(dim);
376 for (
uint i_row=0; i_row<ref_scalar_value.rows(); ++i_row)
378 for (
uint i_p=0; i_p<n_points; ++i_p)
379 ref_scalar_value(i_row, i_dof)(i_p) = fe->shape_grad(i_dof, quad->
point<dim>(i_p))[i_row];
386 template<
unsigned int dim,
unsigned int spacedim>
394 Quadrature *quad = pfev.get_side_quadrature(dim);
399 for (
unsigned int s=0; s<dim+1; ++s) {
402 for (
uint i_p=0; i_p<n_points; ++i_p)
403 for (
uint c=0; c<dim; ++c)
404 ref_scalar_value(s,dim*i_dof+c)(i_p) = fe->shape_grad(i_dof, side_q.
point<dim>(i_p))[c];
412 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
419 this->
domain_ = Domain::domain();
420 Quadrature *quad = pfev.get_bulk_quadrature(dim);
425 for (
uint i_c=0; i_c<spacedim; ++i_c) {
426 for (
uint i_dim=0; i_dim<dim; ++i_dim)
428 for (
uint i_p=0; i_p<n_points; ++i_p)
429 ref_vector_value(i_dim,3*i_dof+i_c)(i_p) = fe->shape_grad(i_dof, quad->
point<dim>(i_p), i_c)[i_dim];
437 template<
unsigned int dim,
unsigned int spacedim>
445 Quadrature *quad = pfev.get_side_quadrature(dim);
447 uint n_sides = dim+1;
451 for (
uint i_sd=0; i_sd<n_sides; ++i_sd) {
453 for (
uint i_c=0; i_c<spacedim; ++i_c)
454 for (
uint i_dim=0; i_dim<dim; ++i_dim)
456 for (
uint i_p=0; i_p<n_points; ++i_p)
457 ref_vector_value(i_sd*dim+i_dim, 3*i_dof+i_c)(i_p) = fe->shape_grad(i_dof, side_q.
point<dim>(i_p), i_c)[i_dim];
465 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
473 this->
domain_ = Domain::domain();
485 for (
uint i=0; i<n_elem; ++i) {
490 Eigen::Vector<ArenaOVec<double>, Eigen::Dynamic> ref_ovec(
n_dofs);
495 Eigen::Vector<ArenaOVec<double>, Eigen::Dynamic> result_ovec = elem_ovec * ref_ovec;
497 result_vec(i) = result_ovec(i).
get_vec();
503 template<
unsigned int dim,
unsigned int spacedim>
527 for (
uint i_pt=0; i_pt<n_patch_points; ++i_pt) {
528 result_vec(i_dof)(i_pt) = ref_vec(
ppv.
int_table_(4)(i_pt), i_dof)(i_pt / n_sides);
535 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
542 this->
domain_ = Domain::domain();
554 for (
uint i=0; i<n_elem; ++i) {
559 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_shape_ovec(3,
n_dofs);
561 ref_shape_ovec(c) =
ArenaOVec(ref_shape_vec(c));
564 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> result_ovec = elem_ovec * ref_shape_ovec;
566 result_vec(c) = result_ovec(c).
get_vec();
574 template<
unsigned int dim,
unsigned int spacedim>
600 for (
uint i_pt=0; i_pt<n_patch_points; ++i_pt)
601 for (
uint c=0; c<spacedim; c++)
602 result_vec(c,i_dof)(i_pt) = ref_shape_vec(
ppv.
int_table_(4)(i_pt),3*i_dof+c)(i_pt / n_sides);
614 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
621 this->
domain_ = Domain::domain();
622 switch (fe->fe_type()) {
630 ASSERT_PERMANENT(
false).error(
"Shape vector for FEVectorContravariant is not implemented yet!\n");
636 ASSERT_PERMANENT(
false).error(
"Shape vector for FEVectorPiola is not implemented yet!\n");
641 ASSERT(
false).error(
"Type of FiniteElement of grad_vector_shape accessor must be FEVector, FEVectorPiola or FEVectorContravariant!\n");
655 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
663 this->
domain_ = Domain::domain();
674 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_grads_ovec(this->
dim_, n_dofs);
676 ref_grads_ovec(i) =
ArenaOVec(ref_grads_vec(i));
679 Eigen::Matrix<ArenaOVec<double>, dim, 3> inv_jac_ovec;
680 for (
uint i=0; i<this->
dim_*spacedim; ++i) {
681 inv_jac_ovec(i) =
ArenaOVec(inv_jac_vec(i));
685 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> result_ovec = inv_jac_ovec.transpose() * ref_grads_ovec;
687 result_vec(i) = result_ovec(i).get_vec();
693 template<
unsigned int dim,
unsigned int spacedim>
714 uint n_points = ref_shape_grads(0).data_size();
720 Eigen::Matrix<ArenaVec<double>, dim, 3> inv_jac_expd_value;
721 for (
uint i=0; i<dim*3; ++i) {
723 for (
uint j=0; j<n_patch_points; ++j)
724 inv_jac_expd_value(i)(j) = inv_jac_value(i)(j%n_sides);
728 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_shape_grads_expd(dim,
n_dofs);
733 for (
uint i_pt=0; i_pt<n_points; ++i_pt) {
734 uint i_begin = i_pt * n_sides;
735 for (
uint i_sd=0; i_sd<n_sides; ++i_sd) {
736 for (
uint i_c=0; i_c<dim; ++i_c) {
737 ref_shape_grads_expd(i_c, i_dof)(i_begin + i_sd) = ref_shape_grads(
ppv.
int_table_(3)(i_sd), i_dof*dim+i_c)(i_pt);
744 grad_scalar_shape_value = inv_jac_expd_value.transpose() * ref_shape_grads_expd;
749 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
756 this->
domain_ = Domain::domain();
768 Eigen::Matrix<ArenaOVec<double>, dim, 3> inv_jac_ovec;
769 for (
uint i=0; i<dim*spacedim; ++i) {
770 inv_jac_ovec(i) =
ArenaOVec(inv_jac_vec(i));
773 Eigen::Matrix<ArenaOVec<double>, dim, spacedim> ref_grads_ovec;
775 for (
uint i=0; i<spacedim*dim; ++i) {
776 ref_grads_ovec(i) =
ArenaOVec(ref_grads_vec(i_dof*3*dim + i));
779 Eigen::Matrix<ArenaOVec<double>, spacedim, spacedim> result_ovec = inv_jac_ovec.transpose() * ref_grads_ovec;
780 for (
uint i=0; i<spacedim; ++i) {
781 for (
uint j=0; j<spacedim; ++j) {
782 result_vec(j,i+spacedim*i_dof) = result_ovec(i,j).get_vec();
793 template<
unsigned int dim,
unsigned int spacedim>
811 uint n_points = ref_vector_grad(0).data_size();
816 Eigen::Matrix<ArenaVec<double>, dim, 3> inv_jac_expd_value;
817 for (
uint i=0; i<dim*3; ++i) {
819 for (
uint j=0; j<n_patch_points; ++j)
820 inv_jac_expd_value(i)(j) = inv_jac_value(i)(j%n_patch_sides);
824 Eigen::Matrix<ArenaVec<double>, dim, 3> ref_shape_grads_expd;
825 for (
uint i=0; i<spacedim*dim; ++i) {
830 for (
uint i_pt=0; i_pt<n_points; ++i_pt) {
831 uint i_begin = i_pt * n_patch_sides;
832 for (
uint i_sd=0; i_sd<n_patch_sides; ++i_sd) {
833 for (
uint i_dim=0; i_dim<dim; ++i_dim) {
834 for (
uint i_c=0; i_c<spacedim; ++i_c) {
835 ref_shape_grads_expd(i_dim, i_c)(i_begin + i_sd) = ref_vector_grad(
ppv.
int_table_(3)(i_sd)*dim+i_dim, 3*i_dof+i_c)(i_pt);
843 res_submat = (inv_jac_expd_value.transpose() * ref_shape_grads_expd).transpose();
855 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
862 this->
domain_ = Domain::domain();
863 switch (fe->fe_type()) {
871 ASSERT_PERMANENT(
false).error(
"Shape vector for FEVectorContravariant is not implemented yet!\n");
877 ASSERT_PERMANENT(
false).error(
"Shape vector for FEVectorPiola is not implemented yet!\n");
882 ASSERT(
false).error(
"Type of FiniteElement of grad_vector_shape accessor must be FEVector, FEVectorPiola or FEVectorContravariant!\n");
896 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
903 this->
domain_ = Domain::domain();
908 for (
uint i_dof=0; i_dof<this->
n_dofs(); ++i_dof) {
909 Eigen::Map< Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> > grad_vector_dof = this->
input_ops(0)->
result_sub_matrix(i_dof);
910 Eigen::Map< Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> > sym_grad_dof = this->
result_sub_matrix(i_dof);
911 sym_grad_dof = 0.5 * (grad_vector_dof.transpose() + grad_vector_dof);
917 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
924 this->
domain_ = Domain::domain();
931 for (
uint i_dof=0; i_dof<this->
n_dofs(); ++i_dof) {
932 Eigen::Map< Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> > grad_vector_dof = this->
input_ops(0)->
result_sub_matrix(i_dof);
933 divergence_value(i_dof) = grad_vector_dof(0,0) + grad_vector_dof(1,1) + grad_vector_dof(2,2);
939 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
946 this->
domain_ = Domain::domain();
#define ASSERT_PERMANENT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
ArenaVec< T > get_vec() const
Convert ArenaOVec to ArenaVec and its.
Abstract class for the description of a general finite element on a reference simplex in dim dimensio...
Class used as template type for type resolution Bulk / Side.
static ElemDomain domain()
static constexpr uint n_nodes(uint dim)
void eval() override
Reinit function of operation. Implementation in descendants.
Coords(PatchFEValues< spacedim > &pfev)
Constructor.
Dispatch class of vector values.
PatchOp< spacedim > * in_op_
DispatchGradVectorShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Dispatch class of vector values.
void eval() override
Reinit function of operation. Implementation in descendants.
PatchOp< spacedim > * in_op_
DispatchVectorShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
GradScalarShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Evaluates gradient scalar values.
void eval() override
Reinit function of operation. Implementation in descendants.
GradScalarShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
GradVectorShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
PatchOp< spacedim > & dispatch_op_
Evaluates vector values (FEType == FEVector)
PatchOp< spacedim > & dispatch_op_
void eval() override
Reinit function of operation. Implementation in descendants.
GradVectorShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
InvJac(PatchFEValues< spacedim > &pfev)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
JacDet(PatchFEValues< 3 > &pfev)
Constructor.
Evaluates Jacobian determinants on Bulk (Element) / Side.
JacDet(PatchFEValues< spacedim > &pfev)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Evaluates Jacobians on Bulk (Element) / Side.
Jac(PatchFEValues< spacedim > &pfev)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
JxW(PatchFEValues< spacedim > &pfev)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Evaluates normal vector on side quadrature points.
void eval() override
Reinit function of operation. Implementation in descendants.
NormalVec(PatchFEValues< spacedim > &pfev)
Constructor.
Class represents zero operation of Join quantities.
void eval() override
Reinit function of operation. Implementation in descendants.
OpZero(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Evaluates coordinates of quadrature points - not implemented yet.
PtCoords(PatchFEValues< spacedim > &pfev)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Template specialization of previous: Domain=SideDomain.
void eval() override
Reinit function of operation. Implementation in descendants.
RefGradScalar(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Fixed operation of gradient scalar reference values.
RefGradScalar(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Template specialization of previous: Domain=SideDomain.
void eval() override
Reinit function of operation. Implementation in descendants.
RefGradVector(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Fixed operation of gradient scalar reference values.
void eval() override
Reinit function of operation. Implementation in descendants.
RefGradVector(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Template specialization of previous: Domain=SideDomain.
RefScalar(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Fixed operation of scalar shape reference values.
RefScalar(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Template specialization of previous: Domain=SideDomain.
RefVector(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Fixed operation of vector shape reference values.
void eval() override
Reinit function of operation. Implementation in descendants.
RefVector(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
ScalarShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Evaluates scalar shape values.
ScalarShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Class used as template type for type resolution Bulk / Side.
static constexpr uint n_nodes(uint dim)
static ElemDomain domain()
Evaluates vector vector divergence.
void eval() override
Reinit function of operation. Implementation in descendants.
VectorDivergence(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
VectorShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
PatchOp< spacedim > & dispatch_op_
void eval() override
Reinit function of operation. Implementation in descendants.
Evaluates vector values (FEType == FEVector)
PatchOp< spacedim > & dispatch_op_
void eval() override
Reinit function of operation. Implementation in descendants.
VectorShape(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
Evaluates vector symmetric gradients.
VectorSymGrad(PatchFEValues< spacedim > &pfev, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Weights(PatchFEValues< spacedim > &pfev)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Class represents element or FE operations.
Eigen::Vector< ArenaVec< double >, Eigen::Dynamic > result_
Result matrix of operation.
Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic > > result_sub_matrix(uint i_dof)
Return map referenced result of DOF values as Eigen::Matrix.
uint n_dofs() const
Getter for n_dofs_.
std::vector< PatchOp< spacedim > * > input_ops_
Indices of operations in PatchPointValues::operations_ vector on which PatchOp is depended.
PatchOp< spacedim > * input_ops(uint i_op) const
Return pointer to operation of i_op index in input operation vector.
Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic > > result_matrix()
Return map referenced result as Eigen::Vector.
void allocate_const_result(ArenaVec< double > &value_vec)
ElemDomain domain_
Flag: BulkOp = 0, SideOp = 1.
void allocate_result(size_t data_size, PatchArena &arena)
PatchPointValues< spacedim > & ppv() const
Return reference of PatchPointValues.
virtual void eval()=0
Reinit function of operation. Implementation in descendants.
uint n_dofs_
Number of DOFs of FE operations (or 1 in case of element operations)
PatchFEValues< spacedim > * patch_fe_
Pointer to PatchFEValues object.
PatchArena & patch_arena() const
return reference to patch arena
std::vector< ElementAccessor< spacedim > > elem_list_
List of elements on patch.
Quadrature * get_quadrature() const
Getter for quadrature.
PatchFeData & patch_fe_data_
Reference to PatchFeData structure shared with PatchFeValues.
uint n_points_
Number of points in patch.
uint n_elems_
Number of elements in patch.
Base class for quadrature rules on simplices in arbitrary dimensions.
Quadrature make_from_side(unsigned int sid) const
unsigned int size() const
Returns number of quadrature points.
Armor::ArmaVec< double, point_dim > point(unsigned int i) const
Returns the ith quadrature point.
const std::vector< double > & get_weights() const
Return a reference to the whole array of weights.
static Eigen::Matrix< ArenaVec< double >, dim, 1 > normal_vector_array(ArenaVec< uint > loc_side_idx_vec)
Class FEValues calculates finite element data on the actual cells such as shape function values,...
Base class of FE operations.
ElemDomain
Distinguishes bulk and side domain.
@ pointOp
operation is evaluated on quadrature points
@ elemOp
operation is evaluated on elements or sides
@ fixedSizeOp
operation has fixed size and it is filled during initialization