6#ifndef __HO_DATA_OPERATORS_HPP__
7#define __HO_DATA_OPERATORS_HPP__
29 boost::shared_ptr<MatrixDouble>
jacPtr;
40template <
int FIELD_DIM = 3>
74 using OpSetHOInvJacToScalarBasesImpl::OpSetHOInvJacToScalarBasesImpl;
94 boost::shared_ptr<MatrixDouble> inv_jac_ptr)
99 "Pointer for invJacPtr not allocated");
144template <
int SPACE_DIM>
166 "Pointer for detPtr not allocated");
184 boost::shared_ptr<VectorDouble> det_ptr,
185 boost::shared_ptr<MatrixDouble> jac_ptr)
210 boost::shared_ptr<MatrixDouble> jac_inv_ptr)
218 "Pointer for jacPtr not allocated");
280template <
int FIELD_DIM = 3>
303 boost::shared_ptr<MatrixDouble> normals_at_gauss_pts =
nullptr)
322 boost::shared_ptr<MatrixDouble> tangent_at_pts =
nullptr)
341 boost::shared_ptr<MatrixDouble> normals_at_pts =
nullptr,
342 boost::shared_ptr<MatrixDouble> tangent1_at_pts =
nullptr,
343 boost::shared_ptr<MatrixDouble> tangent2_at_pts =
nullptr)
347 if (normals_at_pts || tangent1_at_pts || tangent2_at_pts)
348 if (normals_at_pts && tangent1_at_pts && tangent2_at_pts)
350 "All elements in constructor have to set pointer");
368template <
int FIELD_DIM = 3>
374 boost::shared_ptr<MatrixDouble> tangents_at_pts =
nullptr)
397 boost::shared_ptr<VectorDouble> det_jac_ptr,
398 boost::shared_ptr<double> scale_det_ptr =
nullptr);
417template <
int FE_DIM,
int PROBLEM_DIM,
int SPACE_DIM>
struct AddHOOps;
422 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
423 std::vector<FieldSpace> spaces, std::string geom_field_name =
"",
424 boost::shared_ptr<MatrixDouble> jac =
nullptr,
425 boost::shared_ptr<VectorDouble> det =
nullptr,
426 boost::shared_ptr<MatrixDouble> inv_jac =
nullptr);
432 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
433 std::vector<FieldSpace> spaces, std::string geom_field_name =
"",
434 boost::shared_ptr<MatrixDouble> jac =
nullptr,
435 boost::shared_ptr<VectorDouble> det =
nullptr,
436 boost::shared_ptr<MatrixDouble> inv_jac =
nullptr);
442 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
443 std::vector<FieldSpace> spaces, std::string geom_field_name =
"");
448 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
449 std::vector<FieldSpace> space, std::string geom_field_name =
"");
455 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
456 std::vector<FieldSpace> space, std::string geom_field_name =
"");
462 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
463 std::vector<FieldSpace> space, std::string geom_field_name =
"",
464 boost::shared_ptr<MatrixDouble> jac =
nullptr,
465 boost::shared_ptr<VectorDouble> det =
nullptr,
466 boost::shared_ptr<MatrixDouble> inv_jac =
nullptr);
469template <
int FIELD_DIM>
477 if (type == MBVERTEX)
478 getCoordsAtGaussPts().clear();
480 auto t_coords = getFTensor1CoordsAtGaussPts();
481 const auto nb_integration_pts = data.
getN().size1();
482 const auto nb_base_functions = data.
getN().size2();
483 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
486 for (; bb != nb_dofs; ++bb) {
487 t_coords(
i) += t_base * t_dof(
i);
491 for (; bb < nb_base_functions; ++bb)
499template <
int FIELD_DIM>
510 &
m(0, 0), &
m(0, 1), &
m(0, 2));
516 int nb_gauss_pts = data.
getN().size1();
517 auto &tangent1_at_gauss_pts = getTangent1AtGaussPts();
518 auto &tangent2_at_gauss_pts = getTangent2AtGaussPts();
519 tangent1_at_gauss_pts.resize(nb_gauss_pts, 3,
false);
520 tangent2_at_gauss_pts.resize(nb_gauss_pts, 3,
false);
524 tangent1_at_gauss_pts.clear();
525 tangent2_at_gauss_pts.clear();
532 if (2 * data.
getN().size2() != data.
getDiffN().size2()) {
534 "expected two derivative in local element coordinates");
538 "expected that number of dofs is multiplicative of field "
545 for (; nn != nb_dofs; nn++) {
551 "Data inconsistency for base %s",
559 const int nb_base_functions = data.
getN().size2();
562 auto t_t1 = get_ftensor1(tangent1_at_gauss_pts);
563 auto t_t2 = get_ftensor1(tangent2_at_gauss_pts);
564 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
567 for (; bb != nb_dofs /
FIELD_DIM; ++bb) {
569 t_t1(
i) += t_data(
i) * t_diff_base(N0);
570 t_t2(
i) += t_data(
i) * t_diff_base(N1);
575 for (; bb != nb_base_functions; ++bb) {
588 if (moab::CN::Dimension(type) == 2) {
590 auto &normal_at_gauss_pts = getNormalsAtGaussPts();
591 auto &tangent1_at_gauss_pts = getTangent1AtGaussPts();
592 auto &tangent2_at_gauss_pts = getTangent2AtGaussPts();
594 const auto nb_gauss_pts = tangent1_at_gauss_pts.size1();
595 normal_at_gauss_pts.resize(nb_gauss_pts, 3,
false);
597 auto t_normal = get_ftensor1(normal_at_gauss_pts);
598 auto t_t1 = get_ftensor1(tangent1_at_gauss_pts);
599 auto t_t2 = get_ftensor1(tangent2_at_gauss_pts);
600 for (
unsigned int gg = 0; gg != nb_gauss_pts; ++gg) {
614template <
int FIELD_DIM>
622 return *tangentsAtPts;
624 return getTangentAtGaussPts();
627 auto &tangent = get_tangent();
628 int nb_gauss_pts = getGaussPts().size2();
630 if (type == MBVERTEX) {
631 tangent.resize(nb_gauss_pts, 3,
false);
637 const int nb_base_functions = data.
getN().size2();
638 double *diff_base_function = &*data.
getDiffN().data().begin();
639 auto tangent_at_gauss_pts =
646 "Inconsistent number of dofs and field dimension");
648 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
651 for (; bb < size; ++bb) {
652 tangent_at_gauss_pts(
i) += field_data(
i) * (*diff_base_function);
654 ++diff_base_function;
656 for (; bb != nb_base_functions; ++bb) {
657 ++diff_base_function;
659 ++tangent_at_gauss_pts;
679 bool hcurl,
bool hdiv,
bool l2) {
680 std::vector<FieldSpace> spaces;
682 spaces.push_back(
H1);
684 spaces.push_back(
HCURL);
686 spaces.push_back(
HDIV);
688 spaces.push_back(
L2);
704 bool hcurl,
bool hdiv) {
705 std::vector<FieldSpace> spaces;
707 spaces.push_back(
HCURL);
709 spaces.push_back(
HDIV);
ForcesAndSourcesCore::UserDataOperator UserDataOperator
FieldApproximationBase
approximation base
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FieldSpace
approximation spaces
@ L2
field with C-1 continuity
@ HCURL
field with continuous tangents
@ HDIV
field with continuous normal traction
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
static const char *const ApproximationBaseNames[]
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
constexpr std::enable_if<(Dim0<=2 &&Dim1<=2), Tensor2_Expr< Levi_Civita< T >, T, Dim0, Dim1, i, j > >::type levi_civita(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
levi_civita functions to make for easy adhoc use
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
MoFEMErrorCode addHOOpsFace3D(const std::string field, E &e, bool hcurl, bool hdiv)
FTensor::Tensor1< FTensor::PackPtr< double *, S >, DIM > getFTensor1FromPtr(double *ptr)
Make Tensor1 from pointer.
MoFEMErrorCode addHOOpsVol(const std::string field, E &e, bool h1, bool hcurl, bool hdiv, bool l2)
constexpr auto field_name
FTensor::Index< 'm', 3 > m
Add operators pushing bases from local to physical configuration.
bool & doVertices
\deprectaed If false skip vertices
bool & doEdges
\deprectaed If false skip edges
default operator for EDGE element
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
FieldApproximationBase & getBase()
Get approximation base.
MatrixDouble & getDiffN(const FieldApproximationBase base)
get derivatives of base functions
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
const VectorDouble & getFieldData() const
get dofs values
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1FieldData()
Return FTensor of rank 1, i.e. vector from field data coefficients.
const VectorDofs & getFieldDofs() const
get dofs data stature FEDofEntity
default operator for TRI element
@ OPROW
operator doWork function is executed on FE rows
@ OPSPACE
operator do Work is execute on space data
structure to get information form mofem into EntitiesFieldData
friend class UserDataOperator
Calculate HO coordinates at gauss points.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
OpCalculateHOCoords(const std::string field_name)
boost::shared_ptr< MatrixDouble > jacPtr
Calculate jacobian for face element.
Calculate jacobian on Hex or other volume which is not simplex.
boost::shared_ptr< MatrixDouble > jacPtr
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
OpCalculateHOJacForVolume(boost::shared_ptr< MatrixDouble > jac_ptr)
Calculate normals at Gauss points of triangle element.
OpGetHONormalsOnFace(std::string field_name)
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Calculate tangent vector on edge form HO geometry approximation.
boost::shared_ptr< MatrixDouble > tangentsAtPts
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
OpGetHOTangentsOnEdge(std::string field_name, boost::shared_ptr< MatrixDouble > tangents_at_pts=nullptr)
Scale base functions by inverses of measure of element.
boost::shared_ptr< VectorDouble > detJacPtr
FieldApproximationBase fieldBase
boost::shared_ptr< double > scaleDetPtr
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
OpScaleBaseBySpaceInverseOfMeasure(const FieldSpace space, const FieldApproximationBase base, boost::shared_ptr< VectorDouble > det_jac_ptr, boost::shared_ptr< double > scale_det_ptr=nullptr)
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Set inverse jacobian to base functions.
transform local reference derivatives of shape function to global derivatives if higher order geometr...
boost::shared_ptr< MatrixDouble > invJacPtr
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
OpSetHOInvJacVectorBase(const FieldSpace space, boost::shared_ptr< MatrixDouble > inv_jac_ptr)
MatrixDouble diffHdivInvJac
Modify integration weights on face to take in account higher-order geometry.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Modify integration weights on face to take in account higher-order geometry.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Set inverse jacobian to base functions.
OpSetHOWeights(boost::shared_ptr< VectorDouble > det_ptr)
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
boost::shared_ptr< VectorDouble > detPtr
Transform local reference derivatives of shape functions to global derivatives.
OpSetInvJacToScalarBasesBasic(FieldSpace space, boost::shared_ptr< MatrixDouble > inv_jac_ptr)