10 boost::shared_ptr<MatrixDouble> jac_ptr)
14 for (
auto t = MBEDGE;
t != MBMAXTYPE; ++
t)
26 const auto nb_base_functions = data.
getN(
NOBASE).size2();
27 if (nb_base_functions) {
34 if (nb_gauss_pts != data.
getDiffN().size1())
36 "Inconsistent number base functions and gauss points");
37 if (nb_base_functions != data.
getDiffN().size2() / 3)
39 "Inconsistent number of base functions");
40 if (coords.size() != 3 * nb_base_functions)
42 "Number of vertex coordinates and base functions is inconsistent "
44 coords.size() / 3, nb_base_functions);
47 jacPtr->resize(9, nb_gauss_pts,
false);
49 auto t_jac = getFTensor2FromMat<3, 3>(*
jacPtr);
56 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
58 &coords[0], &coords[1], &coords[2]);
59 for (
size_t bb = 0; bb != nb_base_functions; ++bb) {
60 t_jac(
i,
j) += t_coords(
i) * (t_vol_inv_jac(
k,
j) * t_diff_base(
k));
79 return applyTransform<3, 3, 3, 3>(diff_n);
90 CHKERR transform_base(*(
m.second));
95 CHKERR transform_base(*ptr);
112 "This operator can be used only with element with volume dimension");
117 if (diff2_n.size2() % 9)
119 "Inconsistent number of base functions for second derivatives");
121 size_t nb_functions = diff2_n.size2() / 9;
124 if (diff2_n.size1() != getGaussPts().size2())
126 "Wrong number of Gauss Pts %ld != %ld", diff2_n.size1(),
127 getGaussPts().size2());
130 size_t nb_gauss_pts = diff2_n.size1();
132 diffNinvJac.resize(diff2_n.size1(), diff2_n.size2(),
false);
138 auto t_diff2_n = getFTensor2FromPtr<3, 3>(&*diffNinvJac.data().begin());
139 auto t_diff2_n_ref = getFTensor2FromPtr<3, 3>(&*diff2_n.data().begin());
140 auto t_inv_jac = getFTensor2FromMat<3, 3>(*invJacPtr);
141 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg, ++t_inv_jac) {
142 for (
size_t dd = 0; dd != nb_functions; ++dd) {
144 t_inv_jac(
k,
i) * (t_inv_jac(
l,
j) * t_diff2_n_ref(
k,
l));
150 diff2_n.swap(diffNinvJac);
155 if (!(type == MBVERTEX && sPace ==
L2)) {
160 data.
getN(base, BaseDerivatives::SecondDerivative));
163 auto error = [&](
auto &
m) {
167 "Operator do not work for Bernstein-Bezier. This "
177 CHKERR apply_transform(*(
m.second));
184 CHKERR apply_transform(*ptr);
206 data.
getDiffN(base).size2(),
false);
208 unsigned int nb_gauss_pts = data.
getDiffN(base).size1();
209 unsigned int nb_base_functions = data.
getDiffN(base).size2() / 9;
210 if (nb_base_functions == 0)
216 t_inv_diff_n_ptr, &t_inv_diff_n_ptr[
HVEC0_1],
221 auto t_inv_jac = getFTensor2FromMat<3, 3>(*
invJacPtr);
222 for (
unsigned int gg = 0; gg != nb_gauss_pts; ++gg) {
223 for (
unsigned int bb = 0; bb != nb_base_functions; ++bb) {
224 t_inv_diff_n(
i,
j) = t_inv_jac(
k,
j) * t_diff_n(
i,
k);
254 for (
size_t gg = 0; gg != nb_int_pts; ++gg) {
255 t_w *= sqrt(t_normal(
i) * t_normal(
i)) /
a;
261 "Number of rows in getNormalsAtGaussPts should be equal to "
262 "number of integration points, but is not, i.e. %ld != %ld",
279 for (
size_t gg = 0; gg != nb_int_pts; ++gg) {
280 t_w *= sqrt(t_tangent(
i) * t_tangent(
i)) /
a;
286 "Number of rows in getTangentAtGaussPts should be equal to "
287 "number of integration points, but is not, i.e. %ld != %ld",
298 const auto nb_integration_pts =
detPtr->size();
303 "Inconsistent number of data points");
308 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
329 "Pointer for detPtr not allocated");
332 "Pointer for jacPtr not allocated");
340 auto nb_base_functions =
342 auto nb_diff_base_functions =
346 if (nb_diff_base_functions) {
347 if (nb_diff_base_functions != nb_base_functions)
349 "Wrong number base functions %ld != %ld",
350 nb_diff_base_functions, nb_base_functions);
351 if (data.
getDiffN(base).size1() != nb_gauss_pts)
353 "Wrong number integration points");
357 if (nb_gauss_pts && nb_base_functions) {
359 piolaN.resize(nb_gauss_pts, data.
getN(base).size2(),
false);
362 double *t_transformed_n_ptr = &*
piolaN.data().begin();
365 &t_transformed_n_ptr[
HVEC1], &t_transformed_n_ptr[
HVEC2]);
368 auto t_jac = getFTensor2FromMat<3, 3>(*
jacPtr);
370 for (
unsigned int gg = 0; gg != nb_gauss_pts; ++gg) {
371 for (
unsigned int bb = 0; bb != nb_base_functions; ++bb) {
372 const double a = 1. / t_det;
373 t_transformed_n(
i) =
a * (t_jac(
i,
k) * t_n(
k));
384 if (nb_gauss_pts && nb_diff_base_functions) {
389 double *t_transformed_diff_n_ptr = &*
piolaDiffN.data().begin();
391 t_transformed_diff_n(t_transformed_diff_n_ptr,
392 &t_transformed_diff_n_ptr[
HVEC0_1],
393 &t_transformed_diff_n_ptr[
HVEC0_2],
394 &t_transformed_diff_n_ptr[
HVEC1_0],
395 &t_transformed_diff_n_ptr[
HVEC1_1],
396 &t_transformed_diff_n_ptr[
HVEC1_2],
397 &t_transformed_diff_n_ptr[
HVEC2_0],
398 &t_transformed_diff_n_ptr[
HVEC2_1],
399 &t_transformed_diff_n_ptr[
HVEC2_2]);
402 for (
unsigned int gg = 0; gg != nb_gauss_pts; ++gg) {
403 for (
unsigned int bb = 0; bb != nb_diff_base_functions; ++bb) {
404 const double a = 1. / t_det;
405 t_transformed_diff_n(
i,
k) =
a * t_diff_n(
i,
k);
407 ++t_transformed_diff_n;
432 unsigned int nb_gauss_pts = data.
getN(base).size1();
433 unsigned int nb_base_functions = data.
getN(base).size2() / 3;
434 piolaN.resize(nb_gauss_pts, data.
getN(base).size2(),
false);
438 double *t_transformed_n_ptr = &*
piolaN.data().begin();
441 &t_transformed_n_ptr[
HVEC1], &t_transformed_n_ptr[
HVEC2]);
443 double *t_transformed_diff_n_ptr = &*
piolaDiffN.data().begin();
445 t_transformed_diff_n_ptr, &t_transformed_diff_n_ptr[
HVEC0_1],
446 &t_transformed_diff_n_ptr[
HVEC0_2], &t_transformed_diff_n_ptr[
HVEC1_0],
447 &t_transformed_diff_n_ptr[
HVEC1_1], &t_transformed_diff_n_ptr[
HVEC1_2],
448 &t_transformed_diff_n_ptr[
HVEC2_0], &t_transformed_diff_n_ptr[
HVEC2_1],
449 &t_transformed_diff_n_ptr[
HVEC2_2]);
451 auto t_inv_jac = getFTensor2FromMat<3, 3>(*
jacInvPtr);
453 for (
unsigned int gg = 0; gg != nb_gauss_pts; ++gg) {
454 for (
unsigned int bb = 0; bb != nb_base_functions; ++bb) {
455 t_transformed_n(
i) = t_inv_jac(
k,
i) * t_n(
k);
456 t_transformed_diff_n(
i,
k) = t_inv_jac(
j,
i) * t_diff_n(
j,
k);
460 ++t_transformed_diff_n;
473 boost::shared_ptr<MatrixDouble> jac_ptr)
483 const auto nb_gauss_pts = getGaussPts().size2();
485 jacPtr->resize(4, nb_gauss_pts,
false);
486 auto t_jac = getFTensor2FromMat<2, 2>(*jacPtr);
491 auto t_t1 = getFTensor1Tangent1AtGaussPts();
492 auto t_t2 = getFTensor1Tangent2AtGaussPts();
496 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
497 t_jac(
i, N0) = t_t1(
i);
498 t_jac(
i, N1) = t_t2(
i);
516 size_t nb_gauss_pts = getGaussPts().size2();
517 jacPtr->resize(9, nb_gauss_pts,
false);
519 auto t_t1 = getFTensor1Tangent1AtGaussPts();
520 auto t_t2 = getFTensor1Tangent2AtGaussPts();
521 auto t_normal = getFTensor1NormalsAtGaussPts();
527 auto t_jac = getFTensor2FromMat<3, 3>(*jacPtr);
528 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg, ++t_jac) {
530 t_jac(
i, N0) = t_t1(
i);
531 t_jac(
i, N1) = t_t2(
i);
533 const double l = sqrt(t_normal(
j) * t_normal(
j));
535 t_jac(
i, N2) = t_normal(
i) /
l;
550 if (moab::CN::Dimension(type) != 2)
553 auto get_normals_ptr = [&]() {
560 auto apply_transform_nonlinear_geometry = [&](
auto base,
auto nb_gauss_pts,
561 auto nb_base_functions) {
564 auto ptr = get_normals_ptr();
566 &ptr[0], &ptr[1], &ptr[2]);
569 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
570 const auto l2 = t_normal(
i) * t_normal(
i);
571 for (
int bb = 0; bb != nb_base_functions; ++bb) {
572 const auto v = t_base(0);
573 t_base(
i) = (
v / l2) * t_normal(
i);
584 const auto &base_functions = data.
getN(base);
585 const auto nb_gauss_pts = base_functions.size1();
589 const auto nb_base_functions = base_functions.size2() / 3;
590 CHKERR apply_transform_nonlinear_geometry(base, nb_gauss_pts,
602 const auto type_dim = moab::CN::Dimension(type);
603 if (type_dim != 1 && type_dim != 2)
616 &ptr_t1[0], &ptr_t2[0], &ptr_n[0],
618 &ptr_t1[1], &ptr_t2[1], &ptr_n[1],
620 &ptr_t1[2], &ptr_t2[2], &ptr_n[2]);
626 &ptr_t1[0], &ptr_t2[0], &ptr_n[0],
628 &ptr_t1[1], &ptr_t2[1], &ptr_n[1],
630 &ptr_t1[2], &ptr_t2[2], &ptr_n[2]);
638 auto &baseN = data.
getN(base);
639 auto &diffBaseN = data.
getDiffN(base);
641 int nb_dofs = baseN.size2() / 3;
642 int nb_gauss_pts = baseN.size1();
644 piolaN.resize(baseN.size1(), baseN.size2());
645 diffPiolaN.resize(diffBaseN.size1(), diffBaseN.size2());
647 if (nb_dofs > 0 && nb_gauss_pts > 0) {
656 t_transformed_diff_h_curl(
667 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
670 for (
int ll = 0; ll != nb_dofs; ll++) {
671 t_transformed_h_curl(
i) = t_inv_m(
j,
i) * t_h_curl(
j);
672 t_transformed_diff_h_curl(
i,
k) = t_inv_m(
j,
i) * t_diff_h_curl(
j,
k);
674 ++t_transformed_h_curl;
676 ++t_transformed_diff_h_curl;
683 if (cc != nb_gauss_pts * nb_dofs)
708 "Wrong number of integration points %ld!=%ld",
711 auto get_base_at_pts = [&](
auto base) {
718 auto get_tangent_ptr = [&]() {
726 auto get_tangent_at_pts = [&]() {
727 auto ptr = get_tangent_ptr();
729 &ptr[0], &ptr[1], &ptr[2]);
733 auto calculate_squared_edge_length = [&]() {
734 std::vector<double> l1;
736 l1.resize(nb_gauss_pts);
737 auto t_m_at_pts = get_tangent_at_pts();
738 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
739 l1[gg] = t_m_at_pts(
i) * t_m_at_pts(
i);
746 auto l1 = calculate_squared_edge_length();
751 const auto nb_dofs = data.
getN(base).size2() / 3;
753 if (nb_gauss_pts && nb_dofs) {
754 auto t_h_curl = get_base_at_pts(base);
756 auto t_m_at_pts = get_tangent_at_pts();
757 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
758 const double l0 = l1[gg];
759 for (
int ll = 0; ll != nb_dofs; ++ll) {
760 const double val = t_h_curl(0);
761 const double a = val / l0;
762 t_h_curl(
i) = t_m_at_pts(
i) *
a;
770 if (cc != nb_gauss_pts * nb_dofs)
781 boost::shared_ptr<VectorDouble> det_jac_ptr,
782 boost::shared_ptr<double> scale_det_ptr)
783 :
OP(space), fieldSpace(space), fieldBase(base), detJacPtr(det_jac_ptr),
784 scaleDetPtr(scale_det_ptr) {
795 double scale_det = 1.0;
799 auto scale = [&](
auto base) {
801 auto &base_fun = data.
getN(base);
802 if (base_fun.size2()) {
805 const auto nb_int_pts = base_fun.size1();
807 if (nb_int_pts != det_vec.size())
809 "Number of integration pts in detJacPtr does not mush "
810 "number of integration pts in base function");
812 for (
auto gg = 0; gg != nb_int_pts; ++gg) {
813 auto row = ublas::matrix_row<MatrixDouble>(base_fun, gg);
814 row *= scale_det / det_vec[gg];
817 auto &diff_base_fun = data.
getDiffN(base);
818 if (diff_base_fun.size2()) {
819 for (
auto gg = 0; gg != nb_int_pts; ++gg) {
820 auto row = ublas::matrix_row<MatrixDouble>(diff_base_fun, gg);
821 row *= scale_det / det_vec[gg];
863 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
864 std::vector<FieldSpace> spaces, std::string geom_field_name,
865 boost::shared_ptr<MatrixDouble> jac_ptr,
866 boost::shared_ptr<VectorDouble> det_ptr,
867 boost::shared_ptr<MatrixDouble> inv_jac_ptr) {
871 jac_ptr = boost::make_shared<MatrixDouble>();
873 det_ptr = boost::make_shared<VectorDouble>();
875 inv_jac_ptr = boost::make_shared<MatrixDouble>();
877 if (geom_field_name.empty()) {
892 for (
auto s : spaces) {
919 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
920 std::vector<FieldSpace> spaces, std::string geom_field_name,
921 boost::shared_ptr<MatrixDouble> jac_ptr,
922 boost::shared_ptr<VectorDouble> det_ptr,
923 boost::shared_ptr<MatrixDouble> inv_jac_ptr) {
927 jac_ptr = boost::make_shared<MatrixDouble>();
929 det_ptr = boost::make_shared<VectorDouble>();
931 inv_jac_ptr = boost::make_shared<MatrixDouble>();
933 if (geom_field_name.empty()) {
945 for (
auto s : spaces) {
975 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
976 std::vector<FieldSpace> spaces, std::string geom_field_name) {
979 if (geom_field_name.empty()) {
987 for (
auto s : spaces) {
1007 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
1008 std::vector<FieldSpace> spaces, std::string geom_field_name) {
1011 if (geom_field_name.empty()) {
1019 for (
auto s : spaces) {
1034 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
1035 std::vector<FieldSpace> spaces, std::string geom_field_name) {
1038 if (geom_field_name.empty()) {
1045 for (
auto s : spaces) {
1068 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
1069 std::vector<FieldSpace> spaces, std::string geom_field_name,
1070 boost::shared_ptr<MatrixDouble> jac, boost::shared_ptr<VectorDouble> det,
1071 boost::shared_ptr<MatrixDouble> inv_jac) {
1075 jac = boost::make_shared<MatrixDouble>();
1077 det = boost::make_shared<VectorDouble>();
1079 inv_jac = boost::make_shared<MatrixDouble>();
1081 if (geom_field_name.empty()) {
1095 for (
auto s : spaces) {
static MoFEMErrorCode get_jac(EntitiesFieldData::EntData &col_data, int gg, MatrixDouble &jac_stress, MatrixDouble &jac)
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ USER_BASE
user implemented 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
static const char *const FieldSpaceNames[]
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
FTensor::Index< 'i', SPACE_DIM > i
const double v
phase velocity of light in medium (cm/ns)
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
OpSetInvJacHcurlFaceImpl< 2 > OpSetInvJacHcurlFace
OpSetContravariantPiolaTransformOnFace2DImpl< 3 > OpSetContravariantPiolaTransformOnFace2DEmbeddedIn3DSpace
OpSetInvJacHcurlFaceImpl< 3 > OpSetInvJacHcurlFaceEmbeddedIn3DSpace
MoFEMErrorCode invertTensor3by3(ublas::matrix< T, L, A > &jac_data, ublas::vector< T, A > &det_data, ublas::matrix< T, L, A > &inv_jac_data)
Calculate inverse of tensor rank 2 at integration points.
OpSetCovariantPiolaTransformOnFace2DImpl< 2 > OpSetCovariantPiolaTransformOnFace2D
OpSetContravariantPiolaTransformOnFace2DImpl< 2 > OpSetContravariantPiolaTransformOnFace2D
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
OpCalculateHOJacForFaceImpl< 3 > OpCalculateHOJacForFaceEmbeddedIn3DSpace
static auto determinantTensor3by3(T &t)
Calculate the determinant of a 3x3 matrix or a tensor of rank 2.
constexpr double t
plate stiffness
FTensor::Index< 'm', 3 > m
Add operators pushing bases from local to physical configuration.
std::array< bool, MBMAXTYPE > doEntities
If true operator is executed for entity.
virtual MoFEMErrorCode doWork(int row_side, int col_side, EntityType row_type, EntityType col_type, EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
Operator for bi-linear form, usually to calculate values on left hand side.
MatrixDouble & getTangentAtGaussPts()
get tangent vector to edge curve at integration points
FTensor::Tensor1< FTensor::PackPtr< double *, 3 >, DIM > getFTensor1TangentAtGaussPts()
Get tangent vector at integration points.
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor2< FTensor::PackPtr< double *, Tensor_Dim0 *Tensor_Dim1 >, Tensor_Dim0, Tensor_Dim1 > getFTensor2DiffN(FieldApproximationBase base)
Get derivatives of base functions for Hdiv space.
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
virtual std::array< boost::shared_ptr< MatrixDouble >, MaxBernsteinBezierOrder > & getBBDiffNByOrderArray()
MatrixDouble & getDiffN(const FieldApproximationBase base)
get derivatives of base functions
virtual boost::shared_ptr< MatrixDouble > & getNSharedPtr(const FieldApproximationBase base, const BaseDerivatives derivative)
Get shared pointer to base functions with derivatives.
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
virtual std::map< std::string, boost::shared_ptr< MatrixDouble > > & getBBDiffNMap()
get hash map of derivatives base function for BB base, key is a field name
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1N(FieldApproximationBase base)
Get base functions for Hdiv/Hcurl spaces.
virtual boost::shared_ptr< MatrixDouble > & getDiffNSharedPtr(const FieldApproximationBase base)
Get shared pointer to derivatives of base functions.
MatrixDouble & getNormalsAtGaussPts()
if higher order geometry return normals at Gauss pts.
MatrixDouble & getTangent2AtGaussPts()
if higher order geometry return tangent vector to triangle at Gauss pts.
auto getFTensor1NormalsAtGaussPts()
get normal at integration points
MatrixDouble & getTangent1AtGaussPts()
if higher order geometry return tangent vector to triangle at Gauss pts.
auto getFTensor0IntegrationWeight()
Get integration weights.
double getMeasure() const
get measure of element
boost::shared_ptr< const NumeredEntFiniteElement > getNumeredEntFiniteElementPtr() const
Return raw pointer to NumeredEntFiniteElement.
int getFEDim() const
Get dimension of finite element.
MatrixDouble & getGaussPts()
matrix of integration (Gauss) points for Volume Element
Calculate high-order coordinates at Gauss points.
Calculate jacobian for face element.
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)
Constructor for HO Jacobian calculation on volumes.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Calculate normal vectors at Gauss points of face elements.
Calculate tangent vector on edge from HO geometry approximation.
Operator for inverting matrices at integration points.
Make Hdiv space from Hcurl space in 2d.
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 functions to global derivatives.
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.
MatrixDouble diffHdivInvJac
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 into 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 integration weights for higher-order elements.
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
VectorDouble & getCoords()
nodal coordinates
FTensor::Tensor2< double *, 3, 3 > & getInvJac()
get element inverse Jacobian
Volume finite element base.