19 #ifndef OP_FUNCTION_HH_
20 #define OP_FUNCTION_HH_
83 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
88 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, Domain::n_nodes(dim)}) {
89 this->
domain_ = Domain::domain();
94 uint n_elems = Domain::n_mesh_entities(
ppv);
98 for (
uint i_elm=0; i_elm<n_elems; ++i_elm)
99 for (
uint i_col=0; i_col<Domain::n_nodes(dim); ++i_col)
100 for (
uint i_row=0; i_row<spacedim; ++i_row) {
101 result(i_row, i_col)(i_elm) = ( *Domain::node(
ppv, i_elm, i_col) )(i_row);
108 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
113 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, Domain::n_nodes(dim)-1})
115 this->
domain_ = Domain::domain();
122 for (
unsigned int i=0; i<spacedim; i++)
123 for (
unsigned int j=0; j<Domain::n_nodes(dim)-1; j++)
124 jac_value(i,j) = coords_value(i,j+1) - coords_value(i,0);
129 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
134 :
PatchOp<spacedim>(dim, pfev, quad, {1})
136 this->
domain_ = Domain::domain();
153 :
PatchOp<3>(1, pfev, quad, {1})
160 uint n_sides =
ppv.n_mesh_items();
163 for (
uint i=0;i<n_sides; ++i) {
164 jac_det_value(0,0)(i) = 1.0;
173 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
178 :
PatchOp<spacedim>(dim, pfev, quad, {dim, spacedim})
180 this->
domain_ = Domain::domain();
187 inv_jac_value = eigen_arena_tools::inverse<spacedim, dim>(jac_value);
195 template<
unsigned int spacedim = 3>
211 Eigen::Map<Eigen::Matrix<
ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> &source,
212 Eigen::Map<Eigen::Matrix<
ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> &target) {
219 for (
uint i_dof=0; i_dof<n_dofs; ++i_dof) {
220 for (
uint i_pt=0; i_pt<n_patch_points; ++i_pt)
229 Eigen::Map<Eigen::Matrix<
ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> &source,
234 for (
uint i_dof=0; i_dof<op.
n_dofs(); ++i_dof) {
236 uint i_begin = i_pt * n_sides;
237 for (
uint i_sd=0; i_sd<n_sides; ++i_sd) {
238 for (
uint i_c=0; i_c<dim; ++i_c) {
250 Eigen::Map<Eigen::Matrix<
ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> &source,
255 uint n_points = source(0).data_size();
257 for (
uint i_pt=0; i_pt<n_points; ++i_pt) {
258 uint i_begin = i_pt * n_sides;
259 for (
uint i_sd=0; i_sd<n_sides; ++i_sd) {
260 for (
uint i_dim=0; i_dim<shape_m; ++i_dim) {
261 for (
uint i_c=0; i_c<shape_n; ++i_c) {
273 Eigen::Map<Eigen::Matrix<
ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> &source,
274 Eigen::Map<Eigen::Matrix<
ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> &target) {
279 for (
uint i_c=0; i_c<spacedim*dim; ++i_c) {
281 for (
uint i_el=0; i_el<n_elems; ++i_el)
282 for (
uint i_pt=0; i_pt<n_elem_points; ++i_pt) {
299 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
304 :
PatchOp<spacedim>(dim, pfev, quad, {dim+1})
306 this->
domain_ = Domain::domain();
307 double n_points = quad->size();
309 for (
uint i_p=0; i_p<n_points; ++i_p) {
311 for (
uint i_c=0; i_c<dim+1; ++i_c)
312 this->
result_(i_c)(i_p) = ref_bar_coords[i_c];
326 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
331 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim})
333 this->
domain_ = Domain::domain();
344 uint n_elems =
ppv.n_mesh_items();
345 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> coords_vec(spacedim, Domain::n_nodes(dim));
346 Eigen::Matrix<ArenaOVec<double>, spacedim, Domain::n_nodes(dim)> coords_ovec;
347 for (
uint i=0; i<spacedim*Domain::n_nodes(dim); ++i) {
354 Eigen::Vector<ArenaOVec<double>, Eigen::Dynamic> ref_bary_ovec(Domain::n_nodes(dim));
355 for (
uint i=0; i<Domain::n_nodes(dim); ++i) {
360 Eigen::Vector<ArenaOVec<double>, Eigen::Dynamic> result_ovec = coords_ovec * ref_bary_ovec;
361 for (
uint i=0; i<spacedim; ++i) {
362 result_vec(i) = result_ovec(i).get_vec();
371 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
376 :
PatchOp<spacedim>(dim, pfev, quad, {1})
378 this->
domain_ = Domain::domain();
382 for (
uint i=0; i<point_weights_vec.size(); ++i)
383 this->
result_(0)(i) = point_weights_vec[i];
393 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
398 :
PatchOp<spacedim>(dim, pfev, quad, {1})
400 this->
domain_ = Domain::domain();
411 uint n_elems =
ppv.n_mesh_items();
422 template<
unsigned int dim,
unsigned int spacedim>
427 :
PatchOp<spacedim>(dim, pfev, quad, {1})
445 template<
unsigned int dim,
unsigned int spacedim = 3>
450 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim})
462 uint n_sides =
ppv.n_mesh_items();
463 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> inv_jac_value(dim, spacedim);
464 for (
uint i=0; i<dim*spacedim; ++i) {
467 for (
uint i_c=0; i_c<dim*spacedim; ++i_c) {
474 Eigen::VectorXd A(3);
475 for (
uint i=0; i<normal_value(0).data_size(); ++i) {
476 A(0) = normal_value(0)(i);
477 A(1) = normal_value(1)(i);
478 A(2) = normal_value(2)(i);
479 norm_vec(i) = A.norm();
482 for (
uint i=0; i<spacedim; ++i) {
483 normal_value(i) = normal_value(i) / norm_vec;
489 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
494 :
PatchOp<spacedim>(dim, pfev, quad, {1}, fe->n_dofs())
496 this->
domain_ = Domain::domain();
497 uint n_points = quad->size();
501 for (
unsigned int i_p = 0; i_p < n_points; i_p++)
502 for (
unsigned int i_dof = 0; i_dof < this->
n_dofs_; i_dof++)
503 ref_scalar_value(i_dof)(i_p) = fe->shape_value(i_dof, quad->point<dim>(i_p));
510 template<
unsigned int dim,
unsigned int spacedim>
515 :
PatchOp<spacedim>(dim, pfev, quad, {dim+1}, fe->n_dofs())
518 uint n_points = quad->size();
522 for (
unsigned int s=0; s<dim+1; ++s) {
524 for (
unsigned int i_p = 0; i_p < n_points; i_p++)
525 for (
unsigned int i_dof = 0; i_dof < this->
n_dofs_; i_dof++)
526 ref_scalar_value(s, i_dof)(i_p) = fe->shape_value(i_dof, side_q.
point<dim>(i_p));
534 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
539 :
PatchOp<spacedim>(dim, pfev, quad, {fe->n_components()}, fe->n_dofs())
541 this->
domain_ = Domain::domain();
542 uint n_points = quad->size();
548 for (
uint i_p=0; i_p<n_points; ++i_p)
549 for (
uint c=0; c<fe->n_components(); ++c)
550 ref_vector_value(c, i_dof)(i_p) = fe->shape_value(i_dof, quad->point<dim>(i_p), c);
557 template<
unsigned int dim,
unsigned int spacedim>
562 :
PatchOp<spacedim>(dim, pfev, quad, {dim+1, fe->n_components()}, fe->n_dofs())
565 uint n_points = quad->size();
570 for (
unsigned int s=0; s<dim+1; ++s) {
572 for (
unsigned int i_p = 0; i_p < n_points; i_p++)
573 for (
unsigned int i_dof = 0; i_dof < this->
n_dofs_; i_dof++)
574 for (
uint c=0; c<fe->n_components(); ++c)
575 ref_vector_value(s,fe->n_components()*i_dof+c)(i_p) = fe->shape_value(i_dof, side_q.
point<dim>(i_p), c);
583 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
588 :
PatchOp<spacedim>(dim, pfev, quad, {dim, 1}, fe->n_dofs())
590 this->
domain_ = Domain::domain();
591 uint n_points = quad->size();
595 for (
uint i_row=0; i_row<ref_scalar_value.rows(); ++i_row)
597 for (
uint i_p=0; i_p<n_points; ++i_p)
598 ref_scalar_value(i_row, i_dof)(i_p) = fe->shape_grad(i_dof, quad->point<dim>(i_p))[i_row];
605 template<
unsigned int dim,
unsigned int spacedim>
610 :
PatchOp<spacedim>(dim, pfev, quad, {dim+1, dim}, fe->n_dofs())
613 uint n_points = quad->size();
617 for (
unsigned int s=0; s<dim+1; ++s) {
620 for (
uint i_p=0; i_p<n_points; ++i_p)
621 for (
uint c=0; c<dim; ++c)
622 ref_scalar_value(s,dim*i_dof+c)(i_p) = fe->shape_grad(i_dof, side_q.
point<dim>(i_p))[c];
630 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
635 :
PatchOp<spacedim>(dim, pfev, quad, {dim, fe->n_components()}, fe->n_dofs())
637 this->
domain_ = Domain::domain();
638 uint n_points = quad->size();
644 for (
uint i_dim=0; i_dim<dim; ++i_dim)
646 for (
uint i_p=0; i_p<n_points; ++i_p)
647 ref_vector_value(i_dim,
n_comp*i_dof+i_c)(i_p) = fe->shape_grad(i_dof, quad->point<dim>(i_p), i_c)[i_dim];
655 template<
unsigned int dim,
unsigned int spacedim>
660 :
PatchOp<spacedim>(dim, pfev, quad, {(dim+1)*dim, fe->n_components()}, fe->n_dofs())
663 uint n_points = quad->size();
664 uint n_sides = dim+1;
669 for (
uint i_sd=0; i_sd<n_sides; ++i_sd) {
672 for (
uint i_dim=0; i_dim<dim; ++i_dim)
674 for (
uint i_p=0; i_p<n_points; ++i_p)
675 ref_vector_value(i_sd*dim+i_dim,
n_comp*i_dof+i_c)(i_p) = fe->shape_grad(i_dof, side_q.
point<dim>(i_p), i_c)[i_dim];
683 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
688 :
PatchOp<spacedim>(dim, pfev, quad, {1}, fe->n_dofs())
691 this->
domain_ = Domain::domain();
700 uint n_elem = this->
ppv().n_mesh_items();
703 for (
uint i=0; i<n_elem; ++i) {
708 Eigen::Vector<ArenaOVec<double>, Eigen::Dynamic> ref_ovec(
n_dofs);
713 Eigen::Vector<ArenaOVec<double>, Eigen::Dynamic> result_ovec = elem_ovec * ref_ovec;
715 result_vec(i) = result_ovec(i).
get_vec();
721 template<
unsigned int dim,
unsigned int spacedim>
726 :
PatchOp<spacedim>(dim, pfev, quad, {1}, fe->n_dofs())
745 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
752 this->
domain_ = Domain::domain();
761 uint n_elem = this->
ppv().n_mesh_items();
764 for (
uint i=0; i<n_elem; ++i) {
769 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_shape_ovec(spacedim,
n_dofs);
771 ref_shape_ovec(c) =
ArenaOVec(ref_shape_vec(c));
774 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> result_ovec = elem_ovec * ref_shape_ovec;
776 result_vec(c) = result_ovec(c).
get_vec();
784 template<
unsigned int dim,
unsigned int spacedim>
802 for (
uint c=0; c<spacedim; c++)
811 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
818 this->
domain_ = Domain::domain();
834 uint n_elems =
ppv.n_mesh_items();
835 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> jac_vec(spacedim, dim);
836 for (
uint i=0; i<spacedim*dim; ++i) {
839 for (
uint i_c=0; i_c<spacedim*dim; ++i_c) {
845 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> jac_div_det_vec = jac_vec / jac_det_vec;
846 Eigen::Matrix<ArenaOVec<double>, spacedim, dim> jac_div_det_ovec;
847 for (
uint c=0; c<spacedim*dim; ++c) {
851 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_shape_ovec(dim,
n_dofs);
856 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> result_ovec = jac_div_det_ovec * ref_shape_ovec;
858 result_vec(c) = result_ovec(c).get_vec();
867 template<
unsigned int dim,
unsigned int spacedim>
883 uint n_sides =
ppv.n_mesh_items();
894 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> jac_vec(spacedim, dim);
895 for (
uint i=0; i<spacedim*dim; ++i) {
898 for (
uint i_c=0; i_c<spacedim*dim; ++i_c) {
905 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> jac_div_det_vec = jac_vec / jac_det_vec;
906 Eigen::Matrix<ArenaOVec<double>, spacedim, dim> jac_div_det_ovec;
907 for (
uint c=0; c<spacedim*dim; ++c) {
908 jac_div_det_ovec(c) =
ArenaOVec(jac_div_det_vec(c));
913 for (
uint i=0; i<n_points_per_side; ++i) {
914 side_points_vec(i) = 1.0;
917 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> expand_jac_div_det_ovec = jac_div_det_ovec * side_points_ovec;
918 Eigen::Matrix<ArenaVec<double>, spacedim, dim> expand_jac_div_det_vec;
919 for (
uint c=0; c<spacedim*this->
dim_; ++c) {
920 expand_jac_div_det_vec(c) = expand_jac_div_det_ovec(c).
get_vec();
923 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> expand_ref_vec(dim,
n_dofs);
930 result_vec = expand_jac_div_det_vec * expand_ref_vec;
941 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
946 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim}, fe->n_dofs()),
in_op_(
nullptr)
948 this->
domain_ = Domain::domain();
949 switch (fe->fe_type()) {
957 ASSERT_PERMANENT(
false).error(
"Shape vector for FEVectorContravariant is not implemented yet!\n");
963 in_op_ =
new VectorPiolaShape<dim, Domain, spacedim>(pfev, quad, fe, *
this);
967 ASSERT(
false).error(
"Type of FiniteElement of grad_vector_shape accessor must be FEVector, FEVectorPiola or FEVectorContravariant!\n");
981 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
986 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, 1}, fe->n_dofs())
989 this->
domain_ = Domain::domain();
1002 uint n_elems =
ppv.n_mesh_items();
1003 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> inv_jac_vec(dim, spacedim);
1004 for (
uint i=0; i<dim*spacedim; ++i) {
1007 for (
uint i_c=0; i_c<dim*spacedim; ++i_c) {
1011 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_grads_ovec(this->
dim_, n_dofs);
1013 ref_grads_ovec(i) =
ArenaOVec(ref_grads_vec(i));
1016 Eigen::Matrix<ArenaOVec<double>, dim, 3> inv_jac_ovec;
1017 for (
uint i=0; i<this->
dim_*spacedim; ++i) {
1018 inv_jac_ovec(i) =
ArenaOVec(inv_jac_vec(i));
1022 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> result_ovec = inv_jac_ovec.transpose() * ref_grads_ovec;
1024 result_vec(i) = result_ovec(i).get_vec();
1030 template<
unsigned int dim,
unsigned int spacedim>
1035 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, 1}, fe->n_dofs())
1049 uint n_sides =
ppv.n_mesh_items();
1056 Eigen::Matrix<ArenaVec<double>, dim, spacedim> inv_jac_expd_value;
1057 Eigen::Map<Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> inv_jac_expd_map(inv_jac_expd_value.data(), dim, spacedim);
1061 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_shape_grads_expd(dim,
n_dofs);
1068 grad_scalar_shape_value = inv_jac_expd_value.transpose() * ref_shape_grads_expd;
1073 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
1078 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, spacedim}, fe->n_dofs()),
dispatch_op_(dispatch_op)
1080 this->
domain_ = Domain::domain();
1094 uint n_elems =
ppv.n_mesh_items();
1095 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> inv_jac_vec(dim, spacedim);
1096 for (
uint i=0; i<dim*spacedim; ++i) {
1099 for (
uint i_c=0; i_c<dim*spacedim; ++i_c) {
1103 Eigen::Matrix<ArenaOVec<double>, dim, 3> inv_jac_ovec;
1104 for (
uint i=0; i<dim*spacedim; ++i) {
1105 inv_jac_ovec(i) =
ArenaOVec(inv_jac_vec(i));
1108 Eigen::Matrix<ArenaOVec<double>, dim, spacedim> ref_grads_ovec;
1110 for (
uint i=0; i<spacedim*dim; ++i) {
1111 ref_grads_ovec(i) =
ArenaOVec(ref_grads_vec(i_dof*3*dim + i));
1114 Eigen::Matrix<ArenaOVec<double>, spacedim, spacedim> result_ovec = inv_jac_ovec.transpose() * ref_grads_ovec;
1115 for (
uint i=0; i<spacedim; ++i) {
1116 for (
uint j=0; j<spacedim; ++j) {
1117 result_vec(j,i+spacedim*i_dof) = result_ovec(i,j).get_vec();
1128 template<
unsigned int dim,
unsigned int spacedim>
1133 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, spacedim}, fe->n_dofs()),
dispatch_op_(dispatch_op)
1146 uint n_patch_sides =
ppv.n_mesh_items();
1150 Eigen::Matrix<ArenaVec<double>, dim, spacedim> inv_jac_expd_value;
1151 Eigen::Map<Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> inv_jac_expd_map(inv_jac_expd_value.data(), dim, spacedim);
1155 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_shape_grads_expd(dim, spacedim);
1156 for (
uint i=0; i<spacedim*dim; ++i) {
1165 res_submat = (inv_jac_expd_value.transpose() * ref_shape_grads_expd).transpose();
1174 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
1179 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, spacedim}, fe->n_dofs()),
dispatch_op_(dispatch_op)
1181 this->
domain_ = Domain::domain();
1196 uint n_elems =
ppv.n_mesh_items();
1200 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> inv_jac_vec(dim, spacedim);
1201 for (
uint i=0; i<dim*spacedim; ++i) {
1204 for (
uint i_c=0; i_c<spacedim*dim; ++i_c) {
1210 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> inv_jac_div_det_vec = inv_jac_vec / jac_det_vec;
1211 Eigen::Matrix<ArenaOVec<double>, dim, spacedim> inv_jac_div_det_ovec;
1212 for (
uint c=0; c<dim*spacedim; ++c) {
1216 Eigen::Matrix<ArenaVec<double>, spacedim, dim> jac_vec;
1217 Eigen::Map<Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic>> jac_vec_map(jac_vec.data(), spacedim, dim);
1220 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> ref_grads_ovec(dim, dim);
1222 for (
uint i=0; i<dim*dim; ++i) {
1223 ref_grads_ovec(i) =
ArenaOVec(ref_grads_vec(i_dof*dim*dim + i));
1226 Eigen::Matrix<ArenaOVec<double>, spacedim, dim> inv_jac_multi_ref_ovec = inv_jac_div_det_ovec.transpose() * ref_grads_ovec;
1227 Eigen::Matrix<ArenaVec<double>, spacedim, dim> inv_jac_multi_ref_vec;
1228 for (
uint i=0; i<spacedim*dim; ++i) {
1229 inv_jac_multi_ref_vec(i) = inv_jac_multi_ref_ovec(i);
1232 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> sub_result_vec = inv_jac_multi_ref_vec * jac_vec.transpose();
1233 for (
uint i=0; i<spacedim; ++i) {
1234 for (
uint j=0; j<spacedim; ++j) {
1235 result_vec(j,i+spacedim*i_dof) = sub_result_vec(i,j);
1246 template<
unsigned int dim,
unsigned int spacedim>
1251 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, spacedim}, fe->n_dofs()),
dispatch_op_(dispatch_op)
1267 uint n_sides =
ppv.n_mesh_items();
1273 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> inv_jac_vec(dim, spacedim);
1274 for (
uint i_c=0; i_c<dim*spacedim; ++i_c) {
1278 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> jac_vec(spacedim, dim);
1279 Eigen::Matrix<ArenaOVec<double>, spacedim, dim> jac_ovec;
1280 for (
uint i_c=0; i_c<spacedim*dim; ++i_c) {
1289 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> inv_jac_div_det_vec = inv_jac_vec / jac_det_vec;
1290 Eigen::Matrix<ArenaOVec<double>, dim, spacedim> inv_jac_div_det_ovec;
1291 for (
uint c=0; c<dim*spacedim; ++c) {
1297 for (
uint i=0; i<n_points_per_side; ++i) {
1298 side_points_vec(i) = 1.0;
1301 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> expand_inv_jac_div_det_ovec = inv_jac_div_det_ovec * side_points_ovec;
1302 Eigen::Matrix<ArenaVec<double>, dim, spacedim> expand_inv_jac_div_det_vec;
1303 for (
uint c=0; c<spacedim*dim; ++c) {
1304 expand_inv_jac_div_det_vec(c) = expand_inv_jac_div_det_ovec(c).
get_vec();
1306 Eigen::Matrix<ArenaOVec<double>, Eigen::Dynamic, Eigen::Dynamic> expand_jac_ovec = jac_ovec * side_points_ovec;
1307 Eigen::Matrix<ArenaVec<double>, spacedim, dim> expand_jac_vec;
1308 for (
uint c=0; c<spacedim*dim; ++c) {
1309 expand_jac_vec(c) = expand_jac_ovec(c).
get_vec();
1312 Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> expand_ref_vec(dim, dim);
1313 for (
uint c=0; c<dim*dim; c++)
1322 res_submat = expand_inv_jac_div_det_vec.transpose() * expand_ref_vec * expand_jac_vec.transpose();
1333 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
1338 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, spacedim}, fe->n_dofs()),
in_op_(
nullptr)
1340 this->
domain_ = Domain::domain();
1341 switch (fe->fe_type()) {
1349 ASSERT_PERMANENT(
false).error(
"Shape vector for FEVectorContravariant is not implemented yet!\n");
1355 in_op_ =
new GradVectorPiolaShape<dim, Domain, spacedim>(pfev, quad, fe, *
this);
1359 ASSERT(
false).error(
"Type of FiniteElement of grad_vector_shape accessor must be FEVector, FEVectorPiola or FEVectorContravariant!\n");
1373 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
1378 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, spacedim}, fe->n_dofs())
1380 this->
domain_ = Domain::domain();
1385 for (
uint i_dof=0; i_dof<this->
n_dofs(); ++i_dof) {
1386 Eigen::Map< Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> > grad_vector_dof = this->
input_ops(0)->
result_sub_matrix(i_dof);
1387 Eigen::Map< Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> > sym_grad_dof = this->
result_sub_matrix(i_dof);
1388 sym_grad_dof = 0.5 * (grad_vector_dof.transpose() + grad_vector_dof);
1394 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
1399 :
PatchOp<spacedim>(dim, pfev, quad, {1}, fe->n_dofs())
1401 this->
domain_ = Domain::domain();
1408 for (
uint i_dof=0; i_dof<this->
n_dofs(); ++i_dof) {
1409 Eigen::Map< Eigen::Matrix<ArenaVec<double>, Eigen::Dynamic, Eigen::Dynamic> > grad_vector_dof = this->
input_ops(0)->
result_sub_matrix(i_dof);
1410 divergence_value(i_dof) = grad_vector_dof(0,0) + grad_vector_dof(1,1) + grad_vector_dof(2,2);
1416 template<
unsigned int dim,
class Domain,
unsigned int spacedim = 3>
1421 :
PatchOp<spacedim>(dim, pfev, quad, {spacedim, spacedim}, fe->n_dofs())
1423 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)
static NodeAccessor< 3 > node(PatchPointValues< 3 > &ppv, unsigned int i_elm, unsigned int i_n)
Return i_n-th node of i_elm-th element stored in PatchPointValues::elem_dim_list_.
static uint n_mesh_entities(PatchPointValues< 3 > &ppv)
Return number of mesh entities (in this case elements) on patch.
void eval() override
Reinit function of operation. Implementation in descendants.
Coords(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
Constructor.
Dispatch class of vector values.
PatchOp< spacedim > * in_op_
void eval() override
Reinit function of operation. Implementation in descendants.
DispatchGradVectorShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Dispatch class of vector values.
void eval() override
Reinit function of operation. Implementation in descendants.
PatchOp< spacedim > * in_op_
DispatchVectorShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
static void copy_ref_side_on_quads_data(PatchOp< spacedim > &op, unsigned int i_comp, Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic >> &source, Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic >> &target)
FuncHelper()
Forbidden constructor.
static void copy_patch_elem_on_domain_data(PatchOp< spacedim > &op, unsigned int dim, Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic >> &source, Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic >> &target)
static void copy_ref_side_on_sides_vector_data(PatchOp< spacedim > &op, unsigned int dim, Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic >> &source, Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic > &target)
static void fill_reduce_element_data_vec(PatchPointValues< spacedim > &ppv, ArenaVec< double > &source, ArenaVec< double > &target)
static void copy_ref_side_on_sides_tensor_data(PatchOp< spacedim > &op, unsigned int i_dof, unsigned int shape_m, unsigned int shape_n, Eigen::Map< Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic >> &source, Eigen::Matrix< ArenaVec< double >, Eigen::Dynamic, Eigen::Dynamic > &target)
void eval() override
Reinit function of operation. Implementation in descendants.
GradScalarShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Evaluates gradient scalar values.
GradScalarShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
void eval() override
Reinit function of operation. Implementation in descendants.
GradVectorPiolaShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
PatchOp< spacedim > & dispatch_op_
Evaluates vector values (FEType == FEVectorPiola)
void eval() override
Reinit function of operation. Implementation in descendants.
GradVectorPiolaShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, 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.
PatchOp< spacedim > & dispatch_op_
GradVectorShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
Evaluates vector values (FEType == FEVector)
GradVectorShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, 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.
void eval() override
Reinit function of operation. Implementation in descendants.
InvJac(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
Constructor.
JacDet(PatchFEValues< 3 > &pfev, const Quadrature *quad)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Evaluates Jacobian determinants on Bulk (Element) / Side.
JacDet(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Evaluates Jacobians on Bulk (Element) / Side.
Jac(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
JxW(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
JxW(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
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, const Quadrature *quad)
Constructor.
Class represents zero operation of Join quantities.
void eval() override
Reinit function of operation. Implementation in descendants.
OpZero(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
PtCoords(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
void eval() override
Reinit function of operation. Implementation in descendants.
RefBaryCoords(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
Constructor.
Template specialization of previous: Domain=SideDomain.
void eval() override
Reinit function of operation. Implementation in descendants.
RefGradScalar(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Fixed operation of gradient scalar reference values.
void eval() override
Reinit function of operation. Implementation in descendants.
RefGradScalar(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Template specialization of previous: Domain=SideDomain.
RefGradVector(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Fixed operation of gradient scalar reference values.
void eval() override
Reinit function of operation. Implementation in descendants.
RefGradVector(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Template specialization of previous: Domain=SideDomain.
RefScalar(PatchFEValues< spacedim > &pfev, const Quadrature *quad, 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, const Quadrature *quad, 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, const Quadrature *quad, 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, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
ScalarShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
Evaluates scalar shape values.
void eval() override
Reinit function of operation. Implementation in descendants.
ScalarShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Class used as template type for type resolution Bulk / Side.
static constexpr uint n_nodes(uint dim)
static uint n_mesh_entities(PatchPointValues< 3 > &ppv)
Return number of mesh entities (in this case sides) on patch.
static ElemDomain domain()
static NodeAccessor< 3 > node(PatchPointValues< 3 > &ppv, unsigned int i_elm, unsigned int i_n)
Return i_n-th node of i_elm-th side stored in PatchPointValues::side_list_.
Evaluates vector vector divergence.
void eval() override
Reinit function of operation. Implementation in descendants.
VectorDivergence(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
void eval() override
Reinit function of operation. Implementation in descendants.
VectorPiolaShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
PatchOp< spacedim > & dispatch_op_
Evaluates vector values (FEType == FEVectorPiola)
void eval() override
Reinit function of operation. Implementation in descendants.
VectorPiolaShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
PatchOp< spacedim > & dispatch_op_
PatchOp< spacedim > & dispatch_op_
VectorShape(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
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, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe, PatchOp< spacedim > &dispatch_op)
Constructor.
Evaluates vector symmetric gradients.
void eval() override
Reinit function of operation. Implementation in descendants.
VectorSymGrad(PatchFEValues< spacedim > &pfev, const Quadrature *quad, std::shared_ptr< FiniteElement< dim >> fe)
Constructor.
Weights(PatchFEValues< spacedim > &pfev, const Quadrature *quad)
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.
const std::vector< uint > & shape() const
Getter for shape_.
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)
unsigned int quad_size() const
Return size of quadrature.
PatchPointValues< spacedim > & ppv() const
Return reference of PatchPointValues.
PatchArena & patch_arena() const
return reference to patch arena
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.
uint n_mesh_items() const
Getter for n_mesh_items__.
ElemDimList< spacedim > * elem_dim_list_
Number and list of elements on patch.
std::vector< Side > side_list_
List of sides on patch.
Base class for quadrature rules on simplices in arbitrary dimensions.
Quadrature make_from_side(unsigned int sid) const
Armor::ArmaVec< double, point_dim > point(unsigned int i) const
Returns the ith quadrature point.
static BaryPoint local_to_bary(const LocalPoint &lp)
Converts from local to barycentric coordinates.
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.
@ patch_elem_on_domain
Index of patch element for each bulk element or side.
@ ref_side_on_sides
Ref index of side in element for each side in patch.
@ ref_side_on_quads
Ref index of side in element for each quadrature point in patch.