52 dataH1Master(*dataOnMaster[
H1].get()),
53 dataH1Slave(*dataOnSlave[
H1].get()),
54 dataNoFieldSlave(*dataOnSlave[
NOFIELD].get()),
55 dataNoFieldMaster(*dataOnMaster[
NOFIELD].get()),
56 dataHcurlMaster(*dataOnMaster[
HCURL].get()),
57 dataHcurlSlave(*dataOnSlave[
HCURL].get()),
58 dataHdivMaster(*dataOnMaster[
HDIV].get()),
59 dataL2Master(*dataOnMaster[
L2].get()),
60 dataHdivSlave(*dataOnSlave[
HDIV].get()),
61 dataL2Slave(*dataOnSlave[
L2].get()), opContravariantTransform() {
88 "Problem with creation data on element");
123 double *shape_ptr_master =
126 shape_ptr_master, 1);
127 double *shape_ptr_slave =
151 auto get_coord_and_normal = [&]() {
156 coords.resize(num_nodes * 3,
false);
170 auto get_vec_ptr = [](
VectorDouble &vec_double,
int r = 0) {
172 &vec_double(r + 0), &vec_double(r + 1), &vec_double(r + 2));
175 auto t_coords_master = get_vec_ptr(
coords);
176 auto t_coords_slave = get_vec_ptr(
coords, 9);
177 auto t_normal_master = get_vec_ptr(
normal);
178 auto t_normal_slave = get_vec_ptr(
normal, 3);
187 &diff_ptr[0], &diff_ptr[1]);
195 for (
int nn = 0; nn != 3; ++nn) {
196 t_t1_master(
i) += t_coords_master(
i) * t_diff(N0);
197 t_t1_slave(
i) += t_coords_slave(
i) * t_diff(N0);
203 aRea[0] = sqrt(t_normal_master(
i) * t_normal_master(
i)) / 2.;
204 aRea[1] = sqrt(t_normal_slave(
i) * t_normal_slave(
i)) / 2.;
213 CHKERR get_coord_and_normal();
251 for (EntityType
t = MBVERTEX;
t != MBMAXTYPE; ++
t) {
252 data.spacesOnEntities[
t].reset();
253 data.basesOnEntities[
t].reset();
256 data.basesOnSpaces[s].reset();
265 if (shift != 0 && shift != 6) {
267 "Wrong shift for contact prism element");
270 data.
bAse = copy_data.bAse;
271 for (
auto t : {MBVERTEX, MBEDGE, MBTRI}) {
278 for (
int ii = 0; ii != 3; ++ii) {
280 copy_data.dataOnEntities[MBEDGE][ii + shift].getSense();
282 copy_data.dataOnEntities[MBEDGE][ii + shift].getOrder();
287 copy_data.dataOnEntities[MBTRI][3].getSense();
289 copy_data.dataOnEntities[MBTRI][3].getOrder();
292 copy_data.dataOnEntities[MBTRI][4].getSense();
294 copy_data.dataOnEntities[MBTRI][4].getOrder();
304 if (shift != 3 && shift != 4) {
306 "Wrong shift for contact prism element");
309 data.
bAse = copy_data.bAse;
311 for (
auto t : {MBVERTEX, MBTRI}) {
317 auto &cpy_ent_dat = copy_data.dataOnEntities[MBTRI][shift];
319 ent_dat.getBase() = cpy_ent_dat.getBase();
320 ent_dat.getSpace() = cpy_ent_dat.getSpace();
321 ent_dat.getSense() = ent_dat.getSense();
322 ent_dat.getOrder() = cpy_ent_dat.getOrder();
335 int rule =
getRule(order_row, order_col, order_data);
347 "Number of Gauss Points at Master triangle is different than slave");
378 for (
int dd = 0; dd < 3; dd++) {
462 "Not yet implemented");
466 "Not yet implemented");
471 "Not yet implemented");
485 constexpr std::array<UserDataOperator::OpType, 2> types{
486 UserDataOperator::OPROW, UserDataOperator::OPCOL};
487 std::array<std::string, 2> last_eval_field_name{std::string(), std::string()};
492 for (; oit != hi_oit; oit++) {
496 if (oit->opType == UserDataOperator::OPSPACE) {
499 switch (oit->sPace) {
510 "Not implemented for this space <%s>",
516 dataOnSlave[oit->sPace]->resetFieldDependentData();
526 boost::shared_ptr<EntitiesFieldData> op_master_data[2];
527 boost::shared_ptr<EntitiesFieldData> op_slave_data[2];
529 for (
int ss = 0; ss != 2; ss++) {
532 !ss ? oit->rowFieldName : oit->colFieldName;
541 if ((oit->getNumeredEntFiniteElementPtr()->getBitFieldIdData() &
545 "no data field < %s > on finite element < %s >",
548 if (oit->getOpType() & types[ss] ||
549 oit->getOpType() & UserDataOperator::OPROWCOL) {
563 "Not implemented for this space <%s>",
573 boost::weak_ptr<EntityCacheNumeredDofs>
574 operator()(boost::shared_ptr<FieldEntity> &e) {
575 return e->entityCacheRowDofs;
581 MBPRISM, Extractor());
584 boost::weak_ptr<EntityCacheNumeredDofs>
585 operator()(boost::shared_ptr<FieldEntity> &e) {
586 return e->entityCacheColDofs;
591 MBPRISM, Extractor());
601 auto get_indices = [&](
auto &master,
auto &slave,
auto &ents,
605 master.dataOnEntities[MBVERTEX][0].getIndices(),
606 master.dataOnEntities[MBVERTEX][0].getLocalIndices(),
607 slave.dataOnEntities[MBVERTEX][0].getIndices(),
608 slave.dataOnEntities[MBVERTEX][0].getLocalIndices(), ex);
616 slave_data.dataOnEntities[MBVERTEX][0].getFieldData(),
618 slave_data.dataOnEntities[MBVERTEX][0].getFieldDofs(),
620 slave_data.dataOnEntities[MBVERTEX][0].getFieldEntities(),
622 slave_data.dataOnEntities[MBVERTEX][0].getSpace(),
624 slave_data.dataOnEntities[MBVERTEX][0].getBase());
630 boost::weak_ptr<EntityCacheNumeredDofs>
631 operator()(boost::shared_ptr<FieldEntity> &e) {
632 return e->entityCacheRowDofs;
636 CHKERR get_indices(*op_master_data[ss], *op_slave_data[ss],
640 boost::weak_ptr<EntityCacheNumeredDofs>
641 operator()(boost::shared_ptr<FieldEntity> &e) {
642 return e->entityCacheColDofs;
646 CHKERR get_indices(*op_master_data[ss], *op_slave_data[ss],
650 CHKERR get_data(*op_master_data[ss], *op_slave_data[ss]);
659 "Not implemented for this space <%s>",
671 type = cast_oit->getFaceType();
672 if (((oit->getOpType() & UserDataOperator::OPROW) ||
673 (oit->getOpType() & UserDataOperator::OPCOL)) &&
674 ((type & UserDataOperator::FACEMASTERMASTER) ||
675 (type & UserDataOperator::FACEMASTERSLAVE) ||
676 (type & UserDataOperator::FACESLAVEMASTER) ||
677 (type & UserDataOperator::FACESLAVESLAVE))) {
679 "Wrong combination of FaceType and OpType, OPROW or OPCOL "
680 "combined with face-face OpType");
683 if ((oit->getOpType() & UserDataOperator::OPROWCOL) &&
684 ((type & UserDataOperator::FACEMASTER) ||
685 (type & UserDataOperator::FACESLAVE))) {
687 "Wrong combination of FaceType and OpType, OPROWCOL "
688 "combined with face-face OpType");
693 "Face type is not set");
696 type = UserDataOperator::FACEMASTER | UserDataOperator::FACESLAVE |
697 UserDataOperator::FACEMASTERMASTER |
698 UserDataOperator::FACEMASTERSLAVE |
699 UserDataOperator::FACESLAVEMASTER |
700 UserDataOperator::FACESLAVESLAVE;
703 if (oit->getOpType() & UserDataOperator::OPROW &&
704 (type & UserDataOperator::FACEMASTER)) {
706 CHKERR oit->opRhs(*op_master_data[0],
false);
711 if (oit->getOpType() & UserDataOperator::OPROW &&
712 (type & UserDataOperator::FACESLAVE)) {
714 CHKERR oit->opRhs(*op_slave_data[0],
false);
719 if (oit->getOpType() & UserDataOperator::OPCOL &&
720 (type & UserDataOperator::FACEMASTER)) {
722 CHKERR oit->opRhs(*op_master_data[1],
false);
727 if (oit->getOpType() & UserDataOperator::OPCOL &&
728 (type & UserDataOperator::FACESLAVE)) {
730 CHKERR oit->opRhs(*op_slave_data[1],
false);
735 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
736 (type & UserDataOperator::FACEMASTERMASTER)) {
738 CHKERR oit->opLhs(*op_master_data[0], *op_master_data[1]);
743 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
744 (type & UserDataOperator::FACEMASTERSLAVE)) {
746 CHKERR oit->opLhs(*op_master_data[0], *op_slave_data[1]);
751 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
752 (type & UserDataOperator::FACESLAVEMASTER)) {
754 CHKERR oit->opLhs(*op_slave_data[0], *op_master_data[1]);
759 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
760 (type & UserDataOperator::FACESLAVESLAVE)) {
762 CHKERR oit->opLhs(*op_slave_data[0], *op_slave_data[1]);
773 const std::string &
field_name,
const EntityType type_lo,
774 const EntityType type_hi)
const {
777 auto reset_data = [type_lo, type_hi](
auto &data) {
778 for (EntityType
t = type_lo;
t != type_hi; ++
t) {
779 for (
auto &dat : data.dataOnEntities[
t]) {
783 dat.getFieldData().resize(0,
false);
784 dat.getFieldDofs().resize(0,
false);
785 dat.getFieldEntities().resize(0,
false);
789 reset_data(master_data);
790 reset_data(slave_data);
796 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
798 if (lo != field_ents.end()) {
801 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
803 for (
auto it = lo; it != hi; ++it)
804 if (
auto e = it->lock()) {
806 auto get_data = [&](
auto &data,
auto type,
auto side) {
807 auto &dat = data.dataOnEntities[type][side];
808 auto &ent_field_dofs = dat.getFieldDofs();
809 auto &ent_field_data = dat.getFieldData();
810 dat.getFieldEntities().resize(1,
false);
811 dat.getFieldEntities()[0] = e.get();
812 dat.getBase() = e->getApproxBase();
813 dat.getSpace() = e->getSpace();
814 const int ent_order = e->getMaxOrder();
816 dat.getOrder() > ent_order ? dat.getOrder() : ent_order;
817 const auto dof_ent_field_data = e->getEntFieldData();
818 const int nb_dofs_on_ent = e->getNbDofsOnEnt();
819 ent_field_data.resize(nb_dofs_on_ent,
false);
820 noalias(ent_field_data) = e->getEntFieldData();
821 ent_field_dofs.resize(nb_dofs_on_ent,
false);
822 std::fill(ent_field_dofs.begin(), ent_field_dofs.end(),
nullptr);
823 if (
auto cache = e->entityCacheDataDofs.lock()) {
824 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
825 ent_field_dofs[(*dit)->getEntDofIdx()] =
831 const EntityType type = e->getEntType();
832 const int side = e->getSideNumberPtr()->side_number;
838 get_data(master_data, type, side);
840 get_data(slave_data, type, side - 6);
846 get_data(master_data, type, 0);
848 get_data(slave_data, type, 0);
853 "Entity type not implemented (FIXME)");
856 const int brother_side = e->getSideNumberPtr()->brother_side_number;
857 if (brother_side != -1)
859 "Case with brother side not implemented (FIXME)");
880 auto set_zero = [](
auto &nodes_data,
auto &nodes_dofs,
auto &field_entities) {
881 nodes_data.resize(0,
false);
882 nodes_dofs.resize(0,
false);
883 field_entities.resize(0,
false);
885 set_zero(master_nodes_data, master_nodes_dofs, master_field_entities);
886 set_zero(slave_nodes_data, slave_nodes_dofs, slave_field_entities);
891 auto bit_number = (*field_it)->getBitNumber();
892 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
893 master_space = slave_space = (*field_it)->getSpace();
894 master_base = slave_base = (*field_it)->getApproxBase();
899 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
901 if (lo != field_ents.end()) {
904 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
908 for (
auto it = lo; it != hi; ++it) {
909 if (
auto e = it->lock()) {
910 nb_dofs += e->getEntFieldData().size();
916 auto init_set = [&](
auto &nodes_data,
auto &nodes_dofs,
917 auto &field_entities) {
918 constexpr int num_nodes = 3;
919 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
920 nodes_data.resize(max_nb_dofs,
false);
921 nodes_dofs.resize(max_nb_dofs,
false);
922 field_entities.resize(num_nodes,
false);
924 fill(nodes_dofs.begin(), nodes_dofs.end(),
nullptr);
925 fill(field_entities.begin(), field_entities.end(),
nullptr);
928 init_set(master_nodes_data, master_nodes_dofs, master_field_entities);
929 init_set(slave_nodes_data, slave_nodes_dofs, slave_field_entities);
931 for (
auto it = lo; it != hi; ++it) {
932 if (
auto e = it->lock()) {
934 const auto &sn = e->getSideNumberPtr();
935 int side = sn->side_number;
937 auto set_data = [&](
auto &nodes_data,
auto &nodes_dofs,
938 auto &field_entities,
int side,
int pos) {
939 field_entities[side] = e.get();
940 if (
auto cache = e->entityCacheDataDofs.lock()) {
941 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1];
943 const auto dof_idx = (*dit)->getEntDofIdx();
944 nodes_data[pos + dof_idx] = (*dit)->getFieldData();
945 nodes_dofs[pos + dof_idx] =
952 set_data(master_nodes_data, master_nodes_dofs,
953 master_field_entities, side, side * nb_dofs_on_vert);
955 set_data(slave_nodes_data, slave_nodes_dofs,
956 slave_field_entities, (side - 3),
957 (side - 3) * nb_dofs_on_vert);
959 const int brother_side = sn->brother_side_number;
960 if (brother_side != -1)
962 "Not implemented (FIXME please)");
973template <
typename EXTRACTOR>
977 const EntityType type_lo,
const EntityType type_hi,
978 EXTRACTOR &&extractor)
const {
981 auto clear_data = [type_lo, type_hi](
auto &data) {
982 for (EntityType
t = type_lo;
t != type_hi; ++
t) {
983 for (
auto &d : data.dataOnEntities[
t]) {
984 d.getIndices().resize(0,
false);
985 d.getLocalIndices().resize(0,
false);
990 clear_data(master_data);
991 clear_data(slave_data);
996 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
998 if (lo != ents_field.end()) {
1001 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid,
cmp_uid_hi);
1004 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
1006 for (
auto it = lo; it != hi; ++it)
1007 if (
auto e = it->lock()) {
1009 const EntityType type = e->getEntType();
1010 const int side = e->getSideNumberPtr()->side_number;
1011 const int brother_side = e->getSideNumberPtr()->brother_side_number;
1012 if (brother_side != -1)
1014 "Not implemented case");
1016 auto get_indices = [&](
auto &data,
const auto type,
const auto side) {
1017 if (
auto cache = extractor(e).lock()) {
1018 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
1019 auto &dof = (**dit);
1020 auto &dat = data.dataOnEntities[type][side];
1021 auto &ent_field_indices = dat.getIndices();
1022 auto &ent_field_local_indices = dat.getLocalIndices();
1023 if (ent_field_indices.empty()) {
1024 const int nb_dofs_on_ent = dof.getNbDofsOnEnt();
1025 ent_field_indices.resize(nb_dofs_on_ent,
false);
1026 ent_field_local_indices.resize(nb_dofs_on_ent,
false);
1027 std::fill(ent_field_indices.data().begin(),
1028 ent_field_indices.data().end(), -1);
1029 std::fill(ent_field_local_indices.data().begin(),
1030 ent_field_local_indices.data().end(), -1);
1032 const int idx = dof.getEntDofIdx();
1033 ent_field_indices[idx] = dof.getPetscGlobalDofIdx();
1034 ent_field_local_indices[idx] = dof.getPetscLocalDofIdx();
1043 get_indices(master_data, type, side);
1045 get_indices(slave_data, type, side - 6);
1051 get_indices(master_data, type, 0);
1053 get_indices(slave_data, type, 0);
1058 "Entity type not implemented");
1067template <
typename EXTRACTOR>
1072 EXTRACTOR &&extractor)
const {
1075 master_nodes_indices.resize(0,
false);
1076 master_local_nodes_indices.resize(0,
false);
1077 slave_nodes_indices.resize(0,
false);
1078 slave_local_nodes_indices.resize(0,
false);
1083 auto bit_number = (*field_it)->getBitNumber();
1084 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
1088 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
1090 if (lo != ents_field.end()) {
1093 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid,
cmp_uid_hi);
1097 for (
auto it = lo; it != hi; ++it) {
1098 if (
auto e = it->lock()) {
1099 if (
auto cache = extractor(e).lock()) {
1100 nb_dofs += std::distance(cache->loHi[0], cache->loHi[1]);
1107 constexpr int num_nodes = 3;
1108 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
1110 auto set_vec_size = [&](
auto &nodes_indices,
1111 auto &local_nodes_indices) {
1112 nodes_indices.resize(max_nb_dofs,
false);
1113 local_nodes_indices.resize(max_nb_dofs,
false);
1114 std::fill(nodes_indices.begin(), nodes_indices.end(), -1);
1115 std::fill(local_nodes_indices.begin(), local_nodes_indices.end(),
1119 set_vec_size(master_nodes_indices, master_local_nodes_indices);
1120 set_vec_size(slave_nodes_indices, slave_local_nodes_indices);
1122 for (
auto it = lo; it != hi; ++it) {
1123 if (
auto e = it->lock()) {
1125 const int side = e->getSideNumberPtr()->side_number;
1126 const int brother_side =
1127 e->getSideNumberPtr()->brother_side_number;
1128 if (brother_side != -1)
1130 "Not implemented case");
1132 auto get_indices = [&](
auto &nodes_indices,
1133 auto &local_nodes_indices,
1135 if (
auto cache = extractor(e).lock()) {
1136 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1];
1138 const int idx = (*dit)->getPetscGlobalDofIdx();
1139 const int local_idx = (*dit)->getPetscLocalDofIdx();
1141 side * nb_dofs_on_vert + (*dit)->getDofCoeffIdx();
1142 nodes_indices[pos] = idx;
1143 local_nodes_indices[pos] = local_idx;
1149 get_indices(master_nodes_indices, master_local_nodes_indices,
1152 get_indices(slave_nodes_indices, slave_local_nodes_indices,
1168ContactPrismElementForcesAndSourcesCore::UserDataOperator::loopSideVolumes(
1169 const string fe_name,
1171 const int side_type,
const EntityHandle ent_for_side) {
1172 return loopSide(fe_name, &fe_method, side_type, ent_for_side);
#define CATCH_OP_ERRORS(OP)
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
#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
@ LASTSPACE
FieldSpace in [ 0, LASTSPACE )
@ NOFIELD
scalar or vector of scalars describe (no true field)
@ HCURL
field with continuous tangents
@ HDIV
field with continuous normal traction
@ CONTINUOUS
Regular field.
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.
virtual const Field * get_field_structure(const std::string &name, enum MoFEMTypes bh=MF_EXIST) const =0
get field structure
FTensor::Index< 'i', SPACE_DIM > i
const double v
phase velocity of light in medium (cm/ns)
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.
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
UBlasVector< int > VectorInt
implementation of Data Operators for Forces and Sources
static auto cmp_uid_lo(const boost::weak_ptr< FieldEntity > &a, const UId &b)
EntityHandle get_id_for_max_type()
static auto cmp_uid_hi(const UId &b, const boost::weak_ptr< FieldEntity > &a)
EntityHandle get_id_for_min_type()
std::vector< boost::weak_ptr< FieldEntity > > FieldEntity_vector_view
Field_multiIndex::index< FieldName_mi_tag >::type::iterator field_it
ublas::vector< FieldEntity *, FieldEntAllocator > VectorFieldEntities
ublas::vector< FEDofEntity *, DofsAllocator > VectorDofs
constexpr double t
plate stiffness
constexpr auto field_name
#define QUAD_2D_TABLE_SIZE
static QUAD *const QUAD_2D_TABLE[]
const Field_multiIndex * fieldsPtr
raw pointer to fields container
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
virtual moab::Interface & get_moab()=0
virtual MoFEMErrorCode opRhs(EntitiesFieldData &data, const bool error_if_no_base=false)
Deprecated interface functions.
this class derive data form other data structure
Class used to pass element data to calculate base functions on tet,triangle,edge.
Data on single entity (This is passed as argument to DataOperator::doWork)
data structure for finite element entity
std::array< std::bitset< LASTSPACE >, MBMAXTYPE > spacesOnEntities
spaces on entity types
std::bitset< LASTBASE > bAse
bases on element
std::array< boost::ptr_vector< EntData >, MBMAXTYPE > dataOnEntities
std::array< std::bitset< LASTBASE >, LASTSPACE > basesOnSpaces
base on spaces
std::array< std::bitset< LASTBASE >, LASTSPACE > brokenBasesOnSpaces
base on spaces
std::array< std::bitset< LASTBASE >, MBMAXTYPE > basesOnEntities
bases on entity types
keeps information about indexed dofs for the finite element
auto & getRowFieldEnts() const
auto getFEName() const
get finite element name
const FieldEntity_vector_view & getDataFieldEnts() const
boost::shared_ptr< const NumeredEntFiniteElement > numeredEntFiniteElementPtr
auto & getColFieldEnts() const
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.
MultiIndex Tag for field name.
Provide data structure for (tensor) field approximation.
FieldSpace getSpace() const
Get field approximation space.
const BitFieldId & getId() const
Get unique field id.
MoFEMErrorCode loopSide(const string &fe_name, ForcesAndSourcesCore *side_fe, const size_t dim, const EntityHandle ent_for_side=0, boost::shared_ptr< Range > fe_range=nullptr, const int verb=QUIET, const LogManager::SeverityLevel sev=Sev::noisy, AdjCache *adj_cache=nullptr)
User calls this function to loop over elements on the side of face. This function calls finite elemen...
structure to get information form mofem into EntitiesFieldData
int getMaxRowOrder() const
Get max order of approximation for field in rows.
auto & getUserPolynomialBase()
Get the User Polynomial Base object.
MoFEMErrorCode getSpacesAndBaseOnEntities(EntitiesFieldData &data) const
Get field approximation space and base on entities.
virtual MoFEMErrorCode setGaussPts(int order_row, int order_col, int order_data)
set user specific integration rule
EntitiesFieldData & dataH1
virtual int getRule(int order_row, int order_col, int order_data)
another variant of getRule
boost::ptr_deque< UserDataOperator > opPtrVector
Vector of finite element users data operators.
MoFEMErrorCode getEntitySense(const EntityType type, boost::ptr_vector< EntitiesFieldData::EntData > &data) const
get sense (orientation) of entity
const std::array< boost::shared_ptr< EntitiesFieldData >, LASTSPACE > dataOnElement
Entity data on element entity rows fields.
int getMaxColOrder() const
Get max order of approximation for field in columns.
MoFEMErrorCode getEntityDataOrder(const EntityType type, const FieldSpace space, boost::ptr_vector< EntitiesFieldData::EntData > &data) const
Get the entity data order.
int getMaxDataOrder() const
Get max order of approximation for data fields.
MoFEMErrorCode createDataOnElement(EntityType type)
Create a entity data on element object.
Calculate base functions on triangle.