 |
| v0.14.0
|
Go to the documentation of this file.
6 #ifndef __HO_DATA_OPERATORS_HPP__
7 #define __HO_DATA_OPERATORS_HPP__
29 boost::shared_ptr<MatrixDouble>
jacPtr;
40 template <
int FIELD_DIM = 3>
72 template <
int DIM = 3>
74 using OpSetHOInvJacToScalarBasesImpl::OpSetHOInvJacToScalarBasesImpl;
94 boost::shared_ptr<MatrixDouble> inv_jac_ptr)
99 "Pointer for invJacPtr not allocated");
144 template <
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");
280 template <
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");
368 template <
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);
417 template <
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);
469 template <
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)
499 template <
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 direcatives 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) {
614 template <
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 =
640 getFTensor1FromPtr<FIELD_DIM, 3>(&*tangent.data().begin());
646 "Inconsistent number of dofs and filed 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;
677 template <
typename E>
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);
702 template <
typename E>
704 bool hcurl,
bool hdiv) {
705 std::vector<FieldSpace> spaces;
707 spaces.push_back(
HCURL);
709 spaces.push_back(
HDIV);
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
MoFEMErrorCode addHOOpsFace3D(const std::string field, E &e, bool hcurl, bool hdiv)
Data on single entity (This is passed as argument to DataOperator::doWork)
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
Calculate tangent vector on edge form HO geometry approximation.
@ OPSPACE
operator do Work is execute on space data
OpSetHOWeights(boost::shared_ptr< VectorDouble > det_ptr)
MoFEMErrorCode addHOOpsVol(const std::string field, E &e, bool h1, bool hcurl, bool hdiv, bool l2)
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
const static char *const ApproximationBaseNames[]
@ L2
field with C-1 continuity
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
boost::shared_ptr< MatrixDouble > tangentsAtPts
const VectorDouble & getFieldData() const
get dofs values
OpCalculateHOJacForVolume(boost::shared_ptr< MatrixDouble > jac_ptr)
MatrixDouble & getDiffN(const FieldApproximationBase base)
get derivatives of base functions
boost::shared_ptr< VectorDouble > detJacPtr
Scale base functions by inverses of measure of element.
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
bool & doVertices
\deprectaed If false skip vertices
Calculate HO coordinates at gauss points.
Calculate jacobian for face element.
OpSetInvJacToScalarBasesBasic(FieldSpace space, boost::shared_ptr< MatrixDouble > inv_jac_ptr)
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
FieldSpace
approximation spaces
boost::shared_ptr< MatrixDouble > jacPtr
implementation of Data Operators for Forces and Sources
Calculate jacobian on Hex or other volume which is not simplex.
default operator for TRI element
Set inverse jacobian to base functions.
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
FieldApproximationBase & getBase()
Get approximation base.
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.
OpSetHOInvJacVectorBase(const FieldSpace space, boost::shared_ptr< MatrixDouble > inv_jac_ptr)
Calculate normals at Gauss points of triangle element.
const VectorDofs & getFieldDofs() const
get dofs data stature FEDofEntity
friend class UserDataOperator
FTensor::Index< 'i', SPACE_DIM > i
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
boost::shared_ptr< MatrixDouble > invJacPtr
constexpr auto field_name
Add operators pushing bases from local to physical configuration.
default operator for EDGE element
structure to get information form mofem into EntitiesFieldData
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.
bool & doEdges
\deprectaed If false skip edges
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
OpScaleBaseBySpaceInverseOfMeasure(const FieldSpace space, const FieldApproximationBase base, boost::shared_ptr< VectorDouble > det_jac_ptr, boost::shared_ptr< double > scale_det_ptr=nullptr)
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1FieldData()
Return FTensor of rank 1, i.e. vector from filed data coefficients.
OpGetHOTangentsOnEdge(std::string field_name, boost::shared_ptr< MatrixDouble > tangents_at_pts=nullptr)
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
MatrixDouble diffHdivInvJac
FTensor::Index< 'j', 3 > j
Set inverse jacobian to base functions.
@ HCURL
field with continuous tangents
@ MOFEM_DATA_INCONSISTENCY
OpGetHONormalsOnFace(std::string field_name)
FieldApproximationBase
approximation base
FTensor::Index< 'm', 3 > m
transform local reference derivatives of shape function to global derivatives if higher order geometr...
Modify integration weights on face to take in account higher-order geometry.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
OpCalculateHOCoords(const std::string field_name)
FTensor::Index< 'k', 3 > k
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ HDIV
field with continuous normal traction
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Transform local reference derivatives of shape functions to global derivatives.
FieldApproximationBase fieldBase
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
boost::shared_ptr< double > scaleDetPtr
@ OPROW
operator doWork function is executed on FE rows