 |
| 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)
396 const FieldSpace space, boost::shared_ptr<VectorDouble> det_jac_ptr,
397 boost::shared_ptr<double> scale_det_ptr =
nullptr);
415 template <
int FE_DIM,
int PROBLEM_DIM,
int SPACE_DIM>
struct AddHOOps;
420 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
421 std::vector<FieldSpace> spaces, std::string geom_field_name =
"",
422 boost::shared_ptr<MatrixDouble> jac =
nullptr,
423 boost::shared_ptr<VectorDouble> det =
nullptr,
424 boost::shared_ptr<MatrixDouble> inv_jac =
nullptr);
430 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
431 std::vector<FieldSpace> spaces, std::string geom_field_name =
"",
432 boost::shared_ptr<MatrixDouble> jac =
nullptr,
433 boost::shared_ptr<VectorDouble> det =
nullptr,
434 boost::shared_ptr<MatrixDouble> inv_jac =
nullptr);
440 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
441 std::vector<FieldSpace> spaces, std::string geom_field_name =
"");
446 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
447 std::vector<FieldSpace> space, std::string geom_field_name =
"");
453 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
454 std::vector<FieldSpace> space, std::string geom_field_name =
"");
460 add(boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
461 std::vector<FieldSpace> space, std::string geom_field_name =
"",
462 boost::shared_ptr<MatrixDouble> jac =
nullptr,
463 boost::shared_ptr<VectorDouble> det =
nullptr,
464 boost::shared_ptr<MatrixDouble> inv_jac =
nullptr);
467 template <
int FIELD_DIM>
475 if (
type == MBVERTEX)
476 getCoordsAtGaussPts().clear();
478 auto t_coords = getFTensor1CoordsAtGaussPts();
479 const auto nb_integration_pts = data.
getN().size1();
480 const auto nb_base_functions = data.
getN().size2();
481 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
484 for (; bb != nb_dofs; ++bb) {
485 t_coords(
i) += t_base * t_dof(
i);
489 for (; bb < nb_base_functions; ++bb)
497 template <
int FIELD_DIM>
508 &
m(0, 0), &
m(0, 1), &
m(0, 2));
514 int nb_gauss_pts = data.
getN().size1();
515 auto &tangent1_at_gauss_pts = getTangent1AtGaussPts();
516 auto &tangent2_at_gauss_pts = getTangent2AtGaussPts();
517 tangent1_at_gauss_pts.resize(nb_gauss_pts, 3,
false);
518 tangent2_at_gauss_pts.resize(nb_gauss_pts, 3,
false);
522 tangent1_at_gauss_pts.clear();
523 tangent2_at_gauss_pts.clear();
530 if (2 * data.
getN().size2() != data.
getDiffN().size2()) {
532 "expected two direcatives in local element coordinates");
536 "expected that number of dofs is multiplicative of field "
543 for (; nn != nb_dofs; nn++) {
549 "Data inconsistency for base %s",
557 const int nb_base_functions = data.
getN().size2();
560 auto t_t1 = get_ftensor1(tangent1_at_gauss_pts);
561 auto t_t2 = get_ftensor1(tangent2_at_gauss_pts);
562 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
565 for (; bb != nb_dofs /
FIELD_DIM; ++bb) {
567 t_t1(
i) += t_data(
i) * t_diff_base(N0);
568 t_t2(
i) += t_data(
i) * t_diff_base(N1);
573 for (; bb != nb_base_functions; ++bb) {
586 if (moab::CN::Dimension(
type) == 2) {
588 auto &normal_at_gauss_pts = getNormalsAtGaussPts();
589 auto &tangent1_at_gauss_pts = getTangent1AtGaussPts();
590 auto &tangent2_at_gauss_pts = getTangent2AtGaussPts();
592 const auto nb_gauss_pts = tangent1_at_gauss_pts.size1();
593 normal_at_gauss_pts.resize(nb_gauss_pts, 3,
false);
595 auto t_normal = get_ftensor1(normal_at_gauss_pts);
596 auto t_t1 = get_ftensor1(tangent1_at_gauss_pts);
597 auto t_t2 = get_ftensor1(tangent2_at_gauss_pts);
598 for (
unsigned int gg = 0; gg != nb_gauss_pts; ++gg) {
612 template <
int FIELD_DIM>
620 return *tangentsAtPts;
622 return getTangentAtGaussPts();
625 auto &tangent = get_tangent();
626 int nb_gauss_pts = getGaussPts().size2();
628 if (
type == MBVERTEX) {
629 tangent.resize(nb_gauss_pts, 3,
false);
635 const int nb_base_functions = data.
getN().size2();
636 double *diff_base_function = &*data.
getDiffN().data().begin();
637 auto tangent_at_gauss_pts =
638 getFTensor1FromPtr<FIELD_DIM, 3>(&*tangent.data().begin());
644 "Inconsistent number of dofs and filed dimension");
646 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
649 for (; bb < size; ++bb) {
650 tangent_at_gauss_pts(
i) += field_data(
i) * (*diff_base_function);
652 ++diff_base_function;
654 for (; bb != nb_base_functions; ++bb) {
655 ++diff_base_function;
657 ++tangent_at_gauss_pts;
675 template <
typename E>
677 bool hcurl,
bool hdiv,
bool l2) {
678 std::vector<FieldSpace> spaces;
680 spaces.push_back(
H1);
682 spaces.push_back(
HCURL);
684 spaces.push_back(
HDIV);
686 spaces.push_back(
L2);
700 template <
typename E>
702 bool hcurl,
bool hdiv) {
703 std::vector<FieldSpace> spaces;
705 spaces.push_back(
HCURL);
707 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.
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.
OpScaleBaseBySpaceInverseOfMeasure(const FieldSpace space, boost::shared_ptr< VectorDouble > det_jac_ptr, boost::shared_ptr< double > scale_det_ptr=nullptr)
@ HCURL
field with continuous tangents
@ MOFEM_DATA_INCONSISTENCY
OpGetHONormalsOnFace(std::string field_name)
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.
#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