21 #ifndef PATCH_POINT_VALUES_HH_
22 #define PATCH_POINT_VALUES_HH_
24 #include <Eigen/Dense>
35 template<
unsigned int spacedim>
class ElOp;
133 template<
unsigned int spacedim = 3>
197 elOp.allocate_result(sizes[elOp.size_type()], *
patch_arena_);
217 for (
uint i_col=0; i_col<coords.n_cols; ++i_col)
218 for (
uint i_row=0; i_row<coords.n_rows; ++i_row) {
219 coords_mat(i_row, i_col)(i_elem) = coords(i_row, i_col);
238 for (
uint i_col=0; i_col<elm_coords.n_cols; ++i_col)
239 for (
uint i_row=0; i_row<elm_coords.n_rows; ++i_row) {
240 coords_mat(i_row, i_col)(i_elem) = elm_coords(i_row, i_col);
248 for (
uint i_col=0; i_col<side_coords.n_cols; ++i_col)
249 for (
uint i_row=0; i_row<side_coords.n_rows; ++i_row) {
250 coords_mat(i_row, i_col)(i_elem) = side_coords(i_row, i_col);
268 uint point_pos = i_point_on_elem *
n_elems_ + elem_table_row;
287 uint point_pos = i_point_on_side *
n_elems_ + elem_table_row;
333 ElOp<spacedim> op_accessor(this->
dim_, shape, reinit_f, size_type, input_ops_vec, n_dofs);
371 const auto &op_matrix =
operations_[op_idx].result_matrix();
373 for (
uint i=0; i<3; ++i)
374 val(i) = op_matrix(i)(op_matrix_idx);
387 const auto &op_matrix =
operations_[op_idx].result_matrix();
389 for (
uint i=0; i<3; ++i)
390 for (
uint j=0; j<3; ++j)
391 val(i,j) = op_matrix(i,j)(op_matrix_idx);
414 stream <<
"Point vals: " << std::endl;
416 const auto &
mat = op.result_matrix();
417 for (
uint i_mat=0; i_mat<
mat.rows()*
mat.cols(); ++i_mat) {
418 if (
mat(i_mat).data_size()==0) stream <<
"<empty>";
420 const double *vals =
mat(i_mat).data_ptr();
421 for (
size_t i_val=0; i_val<
mat(i_mat).data_size(); ++i_val)
422 stream << vals[i_val] <<
" ";
426 stream <<
" --- end of operation ---" << std::endl;
432 if (
int_table_(i_row).data_size()==0) stream <<
"<empty>";
435 for (
size_t i_val=0; i_val<
int_table_(i_row).data_size(); ++i_val)
436 stream << vals[i_val] <<
" ";
453 {
"el_coords",
"jacobian",
"inv_jac",
"jac_det",
"pt_coords",
"weights",
"JxW",
"",
"",
"",
"",
"" },
454 {
"el_coords",
"el_jac",
"el_inv_jac",
"side_coords",
"side_jac",
"side_jac_det",
"exp_el_coords",
"exp_el_jac",
"exp_el_inv_jac",
455 "exp_side_coords",
"exp_side_jac",
"exp_side_jac_det",
"pt_coords",
"weights",
"JxW",
"normal_vec",
"",
"",
"",
"",
"" }
457 stream << std::setfill(
' ') <<
" Operation" << setw(12) <<
"" <<
"Shape" << setw(2) <<
""
458 <<
"n DOFs" << setw(2) <<
"" <<
"Input operations" << endl;
460 stream <<
" " << std::left << setw(20) << op_names[bulk_side][i] <<
"" <<
" " << setw(6) <<
operations_[i].format_shape() <<
"" <<
" "
461 << setw(7) <<
operations_[i].n_dofs() <<
"" <<
" ";
463 for (
auto i_o : input_ops) stream << op_names[bulk_side][i_o] <<
" ";
506 friend class ElOp<spacedim>;
507 template<
unsigned int dim>
509 template<
unsigned int dim>
511 template<
unsigned int dim>
518 template<
unsigned int spacedim = 3>
533 if (shape_vec.size() == 1) shape_vec.push_back(1);
589 result_ = Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>(
shape_[0],
shape_[1]);
595 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> &
result_matrix() {
600 const Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> &
result_matrix()
const {
608 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>
result_;
626 auto &op = operations[vector_sym_grad_op_idx];
627 auto &grad_vector_value = operations[ op.input_ops()[0] ].result_matrix();
628 auto &sym_grad_value = op.result_matrix();
629 sym_grad_value = 0.5 * (grad_vector_value.transpose() + grad_vector_value);
633 auto &op = operations[vector_divergence_op_idx];
634 auto &grad_vector_value = operations[ op.input_ops()[0] ].result_matrix();
635 auto &divergence_value = op.result_matrix();
636 divergence_value(0,0) = grad_vector_value(0,0) + grad_vector_value(1,1) + grad_vector_value(2,2);
643 template<
unsigned int dim>
647 auto &jac_value = op.result_matrix();
648 const auto &coords_value = operations[ op.input_ops()[0] ].result_matrix();
649 for (
unsigned int i=0; i<3; i++)
650 for (
unsigned int j=0; j<dim; j++)
651 jac_value(i,j) = coords_value(i,j+1) - coords_value(i,0);
653 template<
unsigned int dim>
657 auto &inv_jac_value = op.result_matrix();
658 const auto &jac_value = operations[ op.input_ops()[0] ].result_matrix();
659 inv_jac_value = eigen_arena_tools::inverse<3, dim>(jac_value);
661 template<
unsigned int dim>
665 auto &jac_det_value = op.result_matrix();
666 const auto &jac_value = operations[ op.input_ops()[0] ].result_matrix();
667 jac_det_value(0,0) = eigen_arena_tools::determinant<3, dim>(jac_value).abs();
676 op.allocate_result(point_weights.size(), *arena);
677 auto &weights_value = op.result_matrix();
678 for (
uint i=0; i<point_weights.size(); ++i)
679 weights_value(0,0)(i) = point_weights[i];
683 auto &weights_value = operations[ op.input_ops()[0] ].result_matrix();
684 auto &jac_det_value = operations[ op.input_ops()[1] ].result_matrix();
688 auto &jxw_value = op.result_matrix();
689 jxw_value(0,0) = jxw_ovec.
get_vec();
693 auto &op = operations[scalar_shape_op_idx];
694 uint n_dofs = shape_values.size();
695 uint n_points = shape_values[0].size();
696 uint n_elem = op.result_matrix()(0).data_size() / n_points;
698 auto &shape_matrix = op.result_matrix();
701 for (
uint i=0; i<n_elem; ++i) {
706 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof)
707 for (
uint i_p=0; i_p<n_points; ++i_p)
708 ref_vec(i_dof * n_points + i_p) = shape_values[i_dof][i_p];
710 shape_matrix(0) = shape_ovec.
get_vec();
713 auto &op = operations[vector_shape_op_idx];
714 uint n_dofs = shape_values.size();
715 uint n_points = shape_values[0].size();
716 uint n_elem = op.result_matrix()(0).data_size() / n_points;
718 auto &shape_matrix = op.result_matrix();
719 Eigen::Matrix<ArenaVec<double>, 3, 1> ref_shape_vec;
720 Eigen::Matrix<ArenaOVec<double>, 3, 1> ref_shape_ovec;
722 for (
uint i=0; i<n_elem; ++i) {
725 for (
uint c=0; c<3; ++c) {
726 ref_shape_vec(c) =
ArenaVec<double>(n_points * n_dofs, op.result_matrix()(0).arena());
727 ref_shape_ovec(c) =
ArenaOVec(ref_shape_vec(c));
730 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof)
731 for (
uint i_p=0; i_p<n_points; ++i_p)
732 for (
uint c=0; c<3; ++c)
733 ref_shape_vec(c,0)(i_dof * n_points + i_p) = shape_values[i_dof][i_p](c);
734 Eigen::Matrix<ArenaOVec<double>, 1, 3> shape_omatrix = elem_ovec * ref_shape_ovec.transpose();
735 for (
uint c=0; c<3; ++c)
736 shape_matrix(c) = shape_omatrix(0,c).
get_vec();
752 template<
unsigned int dim>
755 auto &op = operations[scalar_shape_grads_op_idx];
756 auto &inv_jac_vec = operations[ op.input_ops()[0] ].result_matrix();
757 uint n_points = ref_shape_grads.size();
758 uint n_dofs = ref_shape_grads[0].size();
760 Eigen::Matrix<ArenaVec<double>, dim, 1> ref_grads_vec;
761 Eigen::Matrix<ArenaOVec<double>, dim, 1> ref_grads_ovec;
762 for (
uint i=0; i<ref_grads_vec.rows(); ++i) {
763 ref_grads_vec(i) =
ArenaVec<double>(n_points * n_dofs, op.result_matrix()(0).arena());
764 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof)
765 for (
uint i_p=0; i_p<n_points; ++i_p)
766 ref_grads_vec(i)(i_dof * n_points + i_p) = ref_shape_grads[i_p][i_dof](i);
767 ref_grads_ovec(i) =
ArenaOVec(ref_grads_vec(i));
770 Eigen::Matrix<ArenaOVec<double>, dim, 3> inv_jac_ovec;
771 for (
uint i=0; i<dim*3; ++i) {
772 inv_jac_ovec(i) =
ArenaOVec(inv_jac_vec(i));
775 auto &result_vec = op.result_matrix();
776 Eigen::Matrix<ArenaOVec<double>, 3, 1> result_ovec = inv_jac_ovec.transpose() * ref_grads_ovec;
777 for (
uint i=0; i<3; ++i) {
778 result_vec(i) = result_ovec(i).get_vec();
781 template<
unsigned int dim>
784 auto &op = operations[vector_shape_grads_op_idx];
785 auto &inv_jac_vec = operations[ op.input_ops()[0] ].result_matrix();
786 uint n_points = ref_shape_grads.size();
787 uint n_dofs = ref_shape_grads[0].size();
789 Eigen::Matrix<ArenaVec<double>, dim, 3> ref_grads_vec;
790 Eigen::Matrix<ArenaOVec<double>, dim, 3> ref_grads_ovec;
791 for (
uint i=0; i<ref_grads_vec.rows()*ref_grads_vec.cols(); ++i) {
792 ref_grads_vec(i) =
ArenaVec<double>(n_points * n_dofs, op.result_matrix()(0).arena());
793 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof)
794 for (
uint i_p=0; i_p<n_points; ++i_p)
795 ref_grads_vec(i)(i_dof * n_points + i_p) = ref_shape_grads[i_p][i_dof](i);
796 ref_grads_ovec(i) =
ArenaOVec(ref_grads_vec(i));
799 Eigen::Matrix<ArenaOVec<double>, dim, 3> inv_jac_ovec;
800 for (
uint i=0; i<dim*3; ++i) {
801 inv_jac_ovec(i) =
ArenaOVec(inv_jac_vec(i));
804 auto &result_vec = op.result_matrix();
805 Eigen::Matrix<ArenaOVec<double>, 3, 3> result_ovec = inv_jac_ovec.transpose() * ref_grads_ovec;
806 for (
uint i=0; i<9; ++i) {
807 result_vec(i) = result_ovec(i).get_vec();
810 template<
unsigned int dim>
839 template<
unsigned int dim>
875 template<
unsigned int dim>
879 auto &jac_value = op.result_matrix();
880 const auto &coords_value = operations[ op.input_ops()[0] ].result_matrix();
881 for (
unsigned int i=0; i<3; i++)
882 for (
unsigned int j=0; j<dim; j++)
883 jac_value(i,j) = coords_value(i,j+1) - coords_value(i,0);
885 template<
unsigned int dim>
888 auto &inv_jac_value = op.result_matrix();
889 const auto &jac_value = operations[ op.input_ops()[0] ].result_matrix();
890 inv_jac_value = eigen_arena_tools::inverse<3, dim>(jac_value);
892 template<
unsigned int dim>
896 auto &jac_value = op.result_matrix();
897 const auto &coords_value = operations[ op.input_ops()[0] ].result_matrix();
898 for (
unsigned int i=0; i<3; i++)
899 for (
unsigned int j=0; j<dim-1; j++)
900 jac_value(i,j) = coords_value(i,j+1) - coords_value(i,0);
902 template<
unsigned int dim>
906 auto &jac_det_value = op.result_matrix();
907 const auto &jac_value = operations[ op.input_ops()[0] ].result_matrix();
917 op.allocate_result(point_weights.size(), *arena);
918 auto &weights_value = op.result_matrix();
919 for (
uint i=0; i<point_weights.size(); ++i)
920 weights_value(0,0)(i) = point_weights[i];
924 auto &weights_value = operations[ op.input_ops()[0] ].result_matrix();
925 auto &jac_det_value = operations[ op.input_ops()[1] ].result_matrix();
929 auto &jxw_value = op.result_matrix();
930 jxw_value(0,0) = jxw_ovec.
get_vec();
932 template<
unsigned int dim>
935 auto &normal_value = op.result_matrix();
936 auto &inv_jac_mat_value = operations[ op.input_ops()[0] ].result_matrix();
939 ArenaVec<double> norm_vec( normal_value(0).data_size(), normal_value(0).arena() );
940 Eigen::VectorXd A(3);
941 for (
uint i=0; i<normal_value(0).data_size(); ++i) {
942 A(0) = normal_value(0)(i);
943 A(1) = normal_value(1)(i);
944 A(2) = normal_value(2)(i);
945 norm_vec(i) = A.norm();
948 size_t points_per_side = el_table(4).
data_size() / el_table(3).data_size();
949 size_t n_points = el_table(3).data_size();
950 for (
uint i=0; i<3; ++i) {
951 normal_value(i) = normal_value(i) / norm_vec;
952 ArenaVec<double> expand_vec( normal_value(i).data_size() * points_per_side, normal_value(i).arena() );
954 expand_vec(j) = normal_value(i)(j % n_points);
956 normal_value(i) = expand_vec;
961 uint n_dofs = shape_values[0][0].size();
962 uint n_sides = el_table(3).data_size();
963 uint n_patch_points = el_table(4).data_size();
965 auto &op = operations[scalar_shape_op_idx];
966 auto &scalar_shape_value = op.result_matrix();
967 scalar_shape_value(0) =
ArenaVec<double>(n_dofs*n_patch_points, scalar_shape_value(0).arena());
969 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof) {
970 uint dof_shift = i_dof * n_patch_points;
971 for (
uint i_pt=0; i_pt<n_patch_points; ++i_pt)
972 scalar_shape_value(0)(i_pt + dof_shift) = shape_values[el_table(4)(i_pt)][i_pt / n_sides][i_dof];
977 uint n_dofs = shape_values[0][0].size();
978 uint n_sides = el_table(3).data_size();
979 uint n_patch_points = el_table(4).data_size();
981 auto &op = operations[vector_shape_op_idx];
982 auto &vector_shape_value = op.result_matrix();
983 for (
uint c=0; c<3; c++)
984 vector_shape_value(c) =
ArenaVec<double>(n_dofs*n_patch_points, vector_shape_value(c).arena());
986 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof) {
987 uint dof_shift = i_dof * n_patch_points;
988 for (
uint i_pt=0; i_pt<n_patch_points; ++i_pt)
989 for (
uint c=0; c<3; c++)
990 vector_shape_value(c)(i_pt + dof_shift) = shape_values[el_table(4)(i_pt)][i_pt / n_sides][i_dof](c);
997 template<
unsigned int dim>
1000 uint n_points = ref_shape_grads[0].size();
1001 uint n_dofs = ref_shape_grads[0][0].size();
1002 uint n_sides = el_table(3).data_size();
1003 uint n_patch_points = el_table(4).data_size();
1006 auto &op = operations[scalar_shape_grads_op_idx];
1007 auto &grad_scalar_shape_value = op.result_matrix();
1010 auto &inv_jac_value = operations[ op.input_ops()[0] ].result_matrix();
1011 Eigen::Matrix<ArenaVec<double>, dim, 3> inv_jac_expd_value;
1012 for (
uint i=0; i<dim*3; ++i) {
1013 inv_jac_expd_value(i) =
ArenaVec<double>( n_dofs*n_patch_points, inv_jac_value(i).arena() );
1014 for (
uint j=0; j<n_dofs*n_patch_points; ++j)
1015 inv_jac_expd_value(i)(j) = inv_jac_value(i)(j%n_sides);
1019 Eigen::Matrix<ArenaVec<double>, dim, 1> ref_shape_grads_expd;
1020 for (
uint i=0; i<dim; ++i) {
1021 ref_shape_grads_expd(i) =
ArenaVec<double>( n_dofs*n_patch_points, inv_jac_value(0).arena() );
1023 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof) {
1024 for (
uint i_pt=0; i_pt<n_points; ++i_pt) {
1025 uint i_begin = (i_dof * n_points + i_pt) * n_sides;
1026 for (
uint i_sd=0; i_sd<n_sides; ++i_sd) {
1027 for (
uint i_c=0; i_c<dim; ++i_c) {
1028 ref_shape_grads_expd(i_c)(i_begin + i_sd) = ref_shape_grads[el_table(3)(i_sd)][i_pt][i_dof][i_c];
1035 grad_scalar_shape_value = inv_jac_expd_value.transpose() * ref_shape_grads_expd;
1037 template<
unsigned int dim>
1040 uint n_points = ref_shape_grads[0].size();
1041 uint n_dofs = ref_shape_grads[0][0].size();
1042 uint n_sides = el_table(3).data_size();
1043 uint n_patch_points = el_table(4).data_size();
1046 auto &op = operations[vector_shape_grads_op_idx];
1047 auto &grad_scalar_shape_value = op.result_matrix();
1050 auto &inv_jac_value = operations[ op.input_ops()[0] ].result_matrix();
1051 Eigen::Matrix<ArenaVec<double>, dim, 3> inv_jac_expd_value;
1052 for (
uint i=0; i<dim*3; ++i) {
1053 inv_jac_expd_value(i) =
ArenaVec<double>( n_dofs*n_patch_points, inv_jac_value(i).arena() );
1054 for (
uint j=0; j<n_dofs*n_patch_points; ++j)
1055 inv_jac_expd_value(i)(j) = inv_jac_value(i)(j%n_sides);
1059 Eigen::Matrix<ArenaVec<double>, dim, 3> ref_shape_grads_expd;
1060 for (
uint i=0; i<3*dim; ++i) {
1061 ref_shape_grads_expd(i) =
ArenaVec<double>( n_dofs*n_patch_points, inv_jac_value(0).arena() );
1063 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof) {
1064 for (
uint i_pt=0; i_pt<n_points; ++i_pt) {
1065 uint i_begin = (i_dof * n_points + i_pt) * n_sides;
1066 for (
uint i_sd=0; i_sd<n_sides; ++i_sd) {
1067 for (
uint i_c=0; i_c<3*dim; ++i_c) {
1068 ref_shape_grads_expd(i_c)(i_begin + i_sd) = ref_shape_grads[el_table(3)(i_sd)][i_pt][i_dof][i_c];
1075 grad_scalar_shape_value = inv_jac_expd_value.transpose() * ref_shape_grads_expd;
1089 template<
unsigned int dim>
1092 template<
unsigned int dim>
1106 auto &result_vec = op.result_matrix();
1107 for (
uint i=0;i<result_vec(0,0).data_size(); ++i) {
1108 result_vec(0,0)(i) = 1.0;
1117 template<
unsigned int spacedim = 3>
1140 template<
unsigned int dim>
1172 template<
unsigned int spacedim = 3>
1195 template<
unsigned int dim>
#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.
size_t data_size() const
Getter for data_size_.
Class represents element or FE operations.
ElOp(uint dim, std::initializer_list< uint > shape, ReinitFunction reinit_f, OpSizeType size_type, std::vector< uint > input_ops={}, uint n_dofs=1)
Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic > & result_matrix()
Return map referenced result as Eigen::Matrix.
void allocate_result(size_t data_size, PatchArena &arena)
std::string format_shape() const
std::vector< uint > input_ops_
Indices of operations in PatchPointValues::operations_ vector on which ElOp is depended.
std::vector< uint > set_shape_vec(std::initializer_list< uint > shape) const
Aligns shape_vec to 2 items (equal to matrix number of dimensions)
Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic > result_
Result matrix of operation.
std::vector< uint > shape_
Shape of stored data (size of vector or number of rows and cols of matrix)
const std::vector< uint > & shape() const
Getter for shape_.
const std::vector< uint > & input_ops() const
Getter for input_ops_.
OpSizeType size_type_
Type of operation by size of vector (element, point or fixed size)
const Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic > & result_matrix() const
Same as previous but return const reference.
uint n_dofs() const
Getter for n_dofs_.
ReinitFunction reinit_func
Pointer to patch reinit function of element data table specialized by operation.
void reinit_function(std::vector< ElOp< spacedim >> &operations, IntTableArena &int_table)
Call reinit function on element table if function is defined.
uint n_dofs_
Number of DOFs of FE operations (or 1 in case of element operations)
uint dim() const
Getter for dimension.
OpSizeType size_type() const
Getter for size_type_.
Bulk data specialization, order of item in operations_ vector corresponds to the BulkOps enum.
PatchPointValues(uint dim, uint quad_order, AssemblyArena &asm_arena)
Constructor.
void init()
Initialize operations vector.
Bulk Side specialization, order of item in operations_ vector corresponds to the SideOps enum.
PatchPointValues(uint dim, uint quad_order, AssemblyArena &asm_arena)
Constructor.
void init()
Initialize operations vector.
void print_data_tables(ostream &stream, bool points, bool ints) const
PatchPointValues(uint dim, AssemblyArena &asm_arena)
AssemblyArena & asm_arena_
Reference to global assembly arena of PatchFeValues.
std::vector< OpSizeType > row_sizes_
hold sizes of rows by type of operation
std::vector< uint > points_map_
Map of point patch indices to ElOp::result_ and int_table_ tables.
std::vector< unsigned int > fe_ops_indices_
Indices of FE operations in operations_ vector.
uint register_bulk_point(uint elem_table_row, uint value_patch_idx, uint elem_idx, uint i_point_on_elem)
uint register_element(arma::mat coords, uint element_patch_idx)
void resize_tables(uint n_elems, uint n_points)
Resize data tables. Method is called before reinit of patch.
unsigned int get_fe_op(FEOps fe_op) const
Return index of FE operation in operations_ vector.
ElOp< spacedim > & make_fe_op(std::initializer_list< uint > shape, ReinitFunction reinit_f, std::vector< uint > input_ops_vec, uint n_dofs, OpSizeType size_type=pointOp)
void set_fe_op(FEOps fe_op, unsigned int op_vec_idx)
Set index of FE operation in operations_ vector.
std::vector< ElOp< spacedim > > operations_
Vector of all defined operations.
Quadrature * get_quadrature() const
Getter for quadrature.
uint n_elems() const
Getter for n_elems_.
uint i_elem_
Index of registered element in table, helper value used during patch creating.
void reset()
Reset number of columns (points and elements)
uint n_points() const
Getter for n_points_.
ElOp< spacedim > & make_fixed_op(std::initializer_list< uint > shape, ReinitFunction reinit_f)
std::vector< uint > elements_map_
Map of element patch indices to ElOp::result_ and int_table_ tables.
uint dim() const
Getter for dim_.
Tensor tensor_value(uint op_idx, uint point_idx, uint i_dof=0) const
Scalar scalar_value(uint op_idx, uint point_idx, uint i_dof=0) const
void init_finalize(PatchArena *patch_arena)
uint register_side(arma::mat elm_coords, arma::mat side_coords, uint side_idx)
uint register_side_point(uint elem_table_row, uint value_patch_idx, uint elem_idx, uint side_idx, uint i_point_on_side)
uint n_points_
Number of points in patch.
void print_operations(ostream &stream, uint bulk_side) const
Quadrature * quad_
Quadrature of given dimension and order passed in constructor.
ElOp< spacedim > & make_new_op(std::initializer_list< uint > shape, ReinitFunction reinit_f, std::vector< uint > input_ops_vec, OpSizeType size_type=pointOp)
std::vector< OpSizeType > int_sizes_
Set size and type of rows of int_table_, value is set implicitly in constructor of descendants.
Vector vector_value(uint op_idx, uint point_idx, uint i_dof=0) const
PatchArena * patch_arena_
Pointer to global patch arena of PatchFeValues.
uint n_elems_
Number of elements in patch.
Symmetric Gauss-Legendre quadrature formulae on simplices.
Base class for quadrature rules on simplices in arbitrary dimensions.
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 ElementValues calculates data related to transformation of reference cell to actual cell (Jacob...
ArmaMat< double, N, M > mat
@ opCoords
operations evaluated on quadrature points
@ opInvJac
inverse Jacobian
@ opWeights
weight of quadrature point
@ opJac
Jacobian of element.
@ opElCoords
operations evaluated on elements
@ opJxW
JxW value of quadrature point.
@ opNormalVec
normal vector of quadrature point
@ opSideCoords
operations evaluated on sides
@ opJxW
JxW value of quadrature point.
@ opCoords
operations evaluated on quadrature points
@ opElCoords
operations evaluated on elements
@ opElJac
Jacobian of element.
@ opWeights
weight of quadrature point
@ opSideJac
Jacobian of element.
@ OpNItems
Holds number of valid FE operations and value of invalid FE operation.
@ opVectorShape
Vector shape operation.
@ opVectorDivergence
Vector divergence.
@ opVectorSymGrad
Vector symmetric gradient.
@ opGradScalarShape
Scalar shape gradient.
@ opGradVectorShape
Vector shape gradient.
@ opScalarShape
Scalar shape operation.
std::function< void(std::vector< ElOp< 3 > > &, IntTableArena &)> ReinitFunction
Type for conciseness.
OpSizeType
Distinguishes operations by type and size of output rows.
@ 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
Definitions of particular quadrature rules on simplices.
Defines reinit operations on bulk points.
static void ptop_vector_contravariant_shape_grads(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED std::vector< std::vector< arma::mat > > ref_shape_grads, FMT_UNUSED uint vector_shape_grads_op_idx)
static void elop_inv_jac(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_vector_shape(std::vector< ElOp< 3 >> &operations, std::vector< std::vector< arma::vec3 > > shape_values, uint vector_shape_op_idx)
static void ptop_vector_contravariant_shape(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED std::vector< std::vector< arma::vec3 > > shape_values, FMT_UNUSED uint vector_shape_op_idx)
static void ptop_scalar_shape_grads(std::vector< ElOp< 3 >> &operations, std::vector< std::vector< arma::mat > > ref_shape_grads, uint scalar_shape_grads_op_idx)
static void ptop_vector_piola_shape(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED std::vector< std::vector< arma::vec3 > > shape_values, FMT_UNUSED uint vector_shape_op_idx)
static void elop_jac(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_vector_piola_shape_grads(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED std::vector< std::vector< arma::mat > > ref_shape_grads, FMT_UNUSED uint vector_shape_grads_op_idx)
static void elop_jac_det(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_JxW(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_weights(std::vector< ElOp< 3 >> &operations, PatchArena *arena, const std::vector< double > &point_weights)
static void ptop_scalar_shape(std::vector< ElOp< 3 >> &operations, std::vector< std::vector< double > > shape_values, uint scalar_shape_op_idx)
static void ptop_vector_shape_grads(std::vector< ElOp< 3 >> &operations, std::vector< std::vector< arma::mat > > ref_shape_grads, uint vector_shape_grads_op_idx)
static void ptop_coords(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
Defines common functionality of reinit operations.
static void ptop_vector_divergence(std::vector< ElOp< 3 >> &operations, uint vector_divergence_op_idx)
Common reinit function of vector divergence on bulk and side points.
static void ptop_vector_sym_grad(std::vector< ElOp< 3 >> &operations, uint vector_sym_grad_op_idx)
Common reinit function of vector symmetric gradient on bulk and side points.
static void op_base(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
Defines reinit operations on side points.
static void ptop_vector_shape(std::vector< ElOp< 3 >> &operations, IntTableArena &el_table, std::vector< std::vector< std::vector< arma::vec3 > > > shape_values, uint vector_shape_op_idx)
static void ptop_vector_shape_grads(std::vector< ElOp< 3 >> &operations, IntTableArena &el_table, std::vector< std::vector< std::vector< arma::mat > > > ref_shape_grads, uint vector_shape_grads_op_idx)
static void elop_el_jac(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void elop_sd_jac_det(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void elop_sd_jac(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_normal_vec(std::vector< ElOp< 3 >> &operations, IntTableArena &el_table)
static void ptop_weights(std::vector< ElOp< 3 >> &operations, PatchArena *arena, const std::vector< double > &point_weights)
static void ptop_scalar_shape_grads(std::vector< ElOp< 3 >> &operations, IntTableArena &el_table, std::vector< std::vector< std::vector< arma::mat > > > ref_shape_grads, uint scalar_shape_grads_op_idx)
static void ptop_scalar_shape(std::vector< ElOp< 3 >> &operations, IntTableArena &el_table, std::vector< std::vector< std::vector< double > > > shape_values, uint scalar_shape_op_idx)
static void ptop_vector_contravariant_shape_grads(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table, FMT_UNUSED std::vector< std::vector< std::vector< arma::mat > > > ref_shape_grads, FMT_UNUSED uint vector_shape_grads_op_idx)
static void ptop_vector_contravariant_shape(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table, FMT_UNUSED std::vector< std::vector< std::vector< arma::vec3 > > > shape_values, FMT_UNUSED uint vector_shape_op_idx)
static void elop_el_inv_jac(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_vector_piola_shape(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table, FMT_UNUSED std::vector< std::vector< std::vector< arma::vec3 > > > shape_values, FMT_UNUSED uint vector_shape_op_idx)
static void ptop_JxW(std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_coords(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table)
static void ptop_vector_piola_shape_grads(FMT_UNUSED std::vector< ElOp< 3 >> &operations, FMT_UNUSED IntTableArena &el_table, FMT_UNUSED std::vector< std::vector< std::vector< arma::mat > > > ref_shape_grads, FMT_UNUSED uint vector_shape_grads_op_idx)