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();
227 CHKERR getEntitySense<MBEDGE>(data_curl);
228 CHKERR getEntityDataOrder<MBEDGE>(data_curl,
HCURL);
229 CHKERR getEntitySense<MBTRI>(data_curl);
230 CHKERR getEntityDataOrder<MBTRI>(data_curl,
HCURL);
235 CHKERR getEntitySense<MBTRI>(data_div);
236 CHKERR getEntityDataOrder<MBTRI>(data_div,
HDIV);
244 CHKERR getEntitySense<MBTRI>(data_l2);
245 CHKERR getEntityDataOrder<MBTRI>(data_l2,
L2);
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");
364 CHKERR Tools::shapeFunMBTRI<1>(
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]);
675 "Not implemented for this space <%s>",
687 type = cast_oit->getFaceType();
688 if (((oit->getOpType() & UserDataOperator::OPROW) ||
689 (oit->getOpType() & UserDataOperator::OPCOL)) &&
690 ((type & UserDataOperator::FACEMASTERMASTER) ||
691 (type & UserDataOperator::FACEMASTERSLAVE) ||
692 (type & UserDataOperator::FACESLAVEMASTER) ||
693 (type & UserDataOperator::FACESLAVESLAVE))) {
695 "Wrong combination of FaceType and OpType, OPROW or OPCOL "
696 "combined with face-face OpType");
699 if ((oit->getOpType() & UserDataOperator::OPROWCOL) &&
700 ((type & UserDataOperator::FACEMASTER) ||
701 (type & UserDataOperator::FACESLAVE))) {
703 "Wrong combination of FaceType and OpType, OPROWCOL "
704 "combined with face-face OpType");
709 "Face type is not set");
712 type = UserDataOperator::FACEMASTER | UserDataOperator::FACESLAVE |
713 UserDataOperator::FACEMASTERMASTER |
714 UserDataOperator::FACEMASTERSLAVE |
715 UserDataOperator::FACESLAVEMASTER |
716 UserDataOperator::FACESLAVESLAVE;
719 if (oit->getOpType() & UserDataOperator::OPROW &&
720 (type & UserDataOperator::FACEMASTER)) {
722 CHKERR oit->opRhs(*op_master_data[0],
false);
727 if (oit->getOpType() & UserDataOperator::OPROW &&
728 (type & UserDataOperator::FACESLAVE)) {
730 CHKERR oit->opRhs(*op_slave_data[0],
false);
735 if (oit->getOpType() & UserDataOperator::OPCOL &&
736 (type & UserDataOperator::FACEMASTER)) {
738 CHKERR oit->opRhs(*op_master_data[1],
false);
743 if (oit->getOpType() & UserDataOperator::OPCOL &&
744 (type & UserDataOperator::FACESLAVE)) {
746 CHKERR oit->opRhs(*op_slave_data[1],
false);
751 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
752 (type & UserDataOperator::FACEMASTERMASTER)) {
754 CHKERR oit->opLhs(*op_master_data[0], *op_master_data[1]);
759 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
760 (type & UserDataOperator::FACEMASTERSLAVE)) {
762 CHKERR oit->opLhs(*op_master_data[0], *op_slave_data[1]);
767 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
768 (type & UserDataOperator::FACESLAVEMASTER)) {
770 CHKERR oit->opLhs(*op_slave_data[0], *op_master_data[1]);
775 if (oit->getOpType() & UserDataOperator::OPROWCOL &&
776 (type & UserDataOperator::FACESLAVESLAVE)) {
778 CHKERR oit->opLhs(*op_slave_data[0], *op_slave_data[1]);
789 const std::string &
field_name,
const EntityType type_lo,
790 const EntityType type_hi)
const {
793 auto reset_data = [type_lo, type_hi](
auto &data) {
794 for (EntityType
t = type_lo;
t != type_hi; ++
t) {
795 for (
auto &dat : data.dataOnEntities[
t]) {
799 dat.getFieldData().resize(0,
false);
800 dat.getFieldDofs().resize(0,
false);
801 dat.getFieldEntities().resize(0,
false);
805 reset_data(master_data);
806 reset_data(slave_data);
812 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
814 if (lo != field_ents.end()) {
817 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
819 for (
auto it = lo; it != hi; ++it)
820 if (
auto e = it->lock()) {
822 auto get_data = [&](
auto &data,
auto type,
auto side) {
823 auto &dat = data.dataOnEntities[type][side];
824 auto &ent_field_dofs = dat.getFieldDofs();
825 auto &ent_field_data = dat.getFieldData();
826 dat.getFieldEntities().resize(1,
false);
827 dat.getFieldEntities()[0] = e.get();
828 dat.getBase() = e->getApproxBase();
829 dat.getSpace() = e->getSpace();
830 const int ent_order = e->getMaxOrder();
832 dat.getOrder() > ent_order ? dat.getOrder() : ent_order;
833 const auto dof_ent_field_data = e->getEntFieldData();
834 const int nb_dofs_on_ent = e->getNbDofsOnEnt();
835 ent_field_data.resize(nb_dofs_on_ent,
false);
836 noalias(ent_field_data) = e->getEntFieldData();
837 ent_field_dofs.resize(nb_dofs_on_ent,
false);
838 std::fill(ent_field_dofs.begin(), ent_field_dofs.end(),
nullptr);
839 if (
auto cache = e->entityCacheDataDofs.lock()) {
840 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
841 ent_field_dofs[(*dit)->getEntDofIdx()] =
847 const EntityType type = e->getEntType();
848 const int side = e->getSideNumberPtr()->side_number;
854 get_data(master_data, type, side);
856 get_data(slave_data, type, side - 6);
862 get_data(master_data, type, 0);
864 get_data(slave_data, type, 0);
869 "Entity type not implemented (FIXME)");
872 const int brother_side = e->getSideNumberPtr()->brother_side_number;
873 if (brother_side != -1)
875 "Case with brother side not implemented (FIXME)");
896 auto set_zero = [](
auto &nodes_data,
auto &nodes_dofs,
auto &field_entities) {
897 nodes_data.resize(0,
false);
898 nodes_dofs.resize(0,
false);
899 field_entities.resize(0,
false);
901 set_zero(master_nodes_data, master_nodes_dofs, master_field_entities);
902 set_zero(slave_nodes_data, slave_nodes_dofs, slave_field_entities);
907 auto bit_number = (*field_it)->getBitNumber();
908 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
909 master_space = slave_space = (*field_it)->getSpace();
910 master_base = slave_base = (*field_it)->getApproxBase();
914 bit_number, get_id_for_min_type<MBVERTEX>());
915 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
917 if (lo != field_ents.end()) {
919 bit_number, get_id_for_max_type<MBVERTEX>());
920 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
924 for (
auto it = lo; it != hi; ++it) {
925 if (
auto e = it->lock()) {
926 nb_dofs += e->getEntFieldData().size();
932 auto init_set = [&](
auto &nodes_data,
auto &nodes_dofs,
933 auto &field_entities) {
934 constexpr int num_nodes = 3;
935 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
936 nodes_data.resize(max_nb_dofs,
false);
937 nodes_dofs.resize(max_nb_dofs,
false);
938 field_entities.resize(num_nodes,
false);
940 fill(nodes_dofs.begin(), nodes_dofs.end(),
nullptr);
941 fill(field_entities.begin(), field_entities.end(),
nullptr);
944 init_set(master_nodes_data, master_nodes_dofs, master_field_entities);
945 init_set(slave_nodes_data, slave_nodes_dofs, slave_field_entities);
947 for (
auto it = lo; it != hi; ++it) {
948 if (
auto e = it->lock()) {
950 const auto &sn = e->getSideNumberPtr();
951 int side = sn->side_number;
953 auto set_data = [&](
auto &nodes_data,
auto &nodes_dofs,
954 auto &field_entities,
int side,
int pos) {
955 field_entities[side] = e.get();
956 if (
auto cache = e->entityCacheDataDofs.lock()) {
957 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1];
959 const auto dof_idx = (*dit)->getEntDofIdx();
960 nodes_data[pos + dof_idx] = (*dit)->getFieldData();
961 nodes_dofs[pos + dof_idx] =
968 set_data(master_nodes_data, master_nodes_dofs,
969 master_field_entities, side, side * nb_dofs_on_vert);
971 set_data(slave_nodes_data, slave_nodes_dofs,
972 slave_field_entities, (side - 3),
973 (side - 3) * nb_dofs_on_vert);
975 const int brother_side = sn->brother_side_number;
976 if (brother_side != -1)
978 "Not implemented (FIXME please)");
989template <
typename EXTRACTOR>
993 const EntityType type_lo,
const EntityType type_hi,
994 EXTRACTOR &&extractor)
const {
997 auto clear_data = [type_lo, type_hi](
auto &data) {
998 for (EntityType
t = type_lo;
t != type_hi; ++
t) {
999 for (
auto &d : data.dataOnEntities[
t]) {
1000 d.getIndices().resize(0,
false);
1001 d.getLocalIndices().resize(0,
false);
1006 clear_data(master_data);
1007 clear_data(slave_data);
1012 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
1014 if (lo != ents_field.end()) {
1017 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid,
cmp_uid_hi);
1020 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
1022 for (
auto it = lo; it != hi; ++it)
1023 if (
auto e = it->lock()) {
1025 const EntityType type = e->getEntType();
1026 const int side = e->getSideNumberPtr()->side_number;
1027 const int brother_side = e->getSideNumberPtr()->brother_side_number;
1028 if (brother_side != -1)
1030 "Not implemented case");
1032 auto get_indices = [&](
auto &data,
const auto type,
const auto side) {
1033 if (
auto cache = extractor(e).lock()) {
1034 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
1035 auto &dof = (**dit);
1036 auto &dat = data.dataOnEntities[type][side];
1037 auto &ent_field_indices = dat.getIndices();
1038 auto &ent_field_local_indices = dat.getLocalIndices();
1039 if (ent_field_indices.empty()) {
1040 const int nb_dofs_on_ent = dof.getNbDofsOnEnt();
1041 ent_field_indices.resize(nb_dofs_on_ent,
false);
1042 ent_field_local_indices.resize(nb_dofs_on_ent,
false);
1043 std::fill(ent_field_indices.data().begin(),
1044 ent_field_indices.data().end(), -1);
1045 std::fill(ent_field_local_indices.data().begin(),
1046 ent_field_local_indices.data().end(), -1);
1048 const int idx = dof.getEntDofIdx();
1049 ent_field_indices[idx] = dof.getPetscGlobalDofIdx();
1050 ent_field_local_indices[idx] = dof.getPetscLocalDofIdx();
1059 get_indices(master_data, type, side);
1061 get_indices(slave_data, type, side - 6);
1067 get_indices(master_data, type, 0);
1069 get_indices(slave_data, type, 0);
1074 "Entity type not implemented");
1083template <
typename EXTRACTOR>
1088 EXTRACTOR &&extractor)
const {
1091 master_nodes_indices.resize(0,
false);
1092 master_local_nodes_indices.resize(0,
false);
1093 slave_nodes_indices.resize(0,
false);
1094 slave_local_nodes_indices.resize(0,
false);
1099 auto bit_number = (*field_it)->getBitNumber();
1100 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
1103 bit_number, get_id_for_min_type<MBVERTEX>());
1104 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
1106 if (lo != ents_field.end()) {
1108 bit_number, get_id_for_max_type<MBVERTEX>());
1109 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid,
cmp_uid_hi);
1113 for (
auto it = lo; it != hi; ++it) {
1114 if (
auto e = it->lock()) {
1115 if (
auto cache = extractor(e).lock()) {
1116 nb_dofs += std::distance(cache->loHi[0], cache->loHi[1]);
1123 constexpr int num_nodes = 3;
1124 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
1126 auto set_vec_size = [&](
auto &nodes_indices,
1127 auto &local_nodes_indices) {
1128 nodes_indices.resize(max_nb_dofs,
false);
1129 local_nodes_indices.resize(max_nb_dofs,
false);
1130 std::fill(nodes_indices.begin(), nodes_indices.end(), -1);
1131 std::fill(local_nodes_indices.begin(), local_nodes_indices.end(),
1135 set_vec_size(master_nodes_indices, master_local_nodes_indices);
1136 set_vec_size(slave_nodes_indices, slave_local_nodes_indices);
1138 for (
auto it = lo; it != hi; ++it) {
1139 if (
auto e = it->lock()) {
1141 const int side = e->getSideNumberPtr()->side_number;
1142 const int brother_side =
1143 e->getSideNumberPtr()->brother_side_number;
1144 if (brother_side != -1)
1146 "Not implemented case");
1148 auto get_indices = [&](
auto &nodes_indices,
1149 auto &local_nodes_indices,
1151 if (
auto cache = extractor(e).lock()) {
1152 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1];
1154 const int idx = (*dit)->getPetscGlobalDofIdx();
1155 const int local_idx = (*dit)->getPetscLocalDofIdx();
1157 side * nb_dofs_on_vert + (*dit)->getDofCoeffIdx();
1158 nodes_indices[pos] = idx;
1159 local_nodes_indices[pos] = local_idx;
1165 get_indices(master_nodes_indices, master_local_nodes_indices,
1168 get_indices(slave_nodes_indices, slave_local_nodes_indices,
1184ContactPrismElementForcesAndSourcesCore::UserDataOperator::loopSideVolumes(
1185 const string fe_name,
1187 const int side_type,
const EntityHandle ent_for_side) {
1188 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 .
#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()
ublas::vector< FieldEntity *, FieldEntAllocator > VectorFieldEntities
std::vector< boost::weak_ptr< FieldEntity > > FieldEntity_vector_view
Field_multiIndex::index< FieldName_mi_tag >::type::iterator field_it
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
int getNinTheLoop() const
get number of evaluated element in the loop
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.
MoFEMErrorCode getNoFieldRowIndices(EntitiesFieldData &data, const int bit_number) const
get col NoField indices
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.
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 getNoFieldColIndices(EntitiesFieldData &data, const int bit_number) const
get col NoField indices
int getMaxDataOrder() const
Get max order of approximation for data fields.
MoFEMErrorCode getNoFieldFieldData(const int bit_number, VectorDouble &ent_field_data, VectorDofs &ent_field_dofs, VectorFieldEntities &ent_field) const
Get field data on nodes.
MoFEMErrorCode createDataOnElement(EntityType type)
Create a entity data on element object.
Calculate base functions on triangle.