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]);
 
  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();
 
  898        bit_number, get_id_for_min_type<MBVERTEX>());
 
  899    auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
 
  901    if (lo != field_ents.end()) {
 
  903          bit_number, get_id_for_max_type<MBVERTEX>());
 
  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();
 
 1087        bit_number, get_id_for_min_type<MBVERTEX>());
 
 1088    auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
 
 1090    if (lo != ents_field.end()) {
 
 1092          bit_number, get_id_for_max_type<MBVERTEX>());
 
 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 .
#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 multi-index 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 derives data from 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
Get reference to row field entities for the current finite element.
auto getFEName() const
Get the name of the current finite element.
const FieldEntity_vector_view & getDataFieldEnts() const
Get reference to data field entities for the current finite element.
boost::shared_ptr< const NumeredEntFiniteElement > numeredEntFiniteElementPtr
Shared pointer to finite element database structure.
auto & getColFieldEnts() const
Get reference to column field entities for the current finite element.
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.
MultiIndex Tag for field name.
Field data structure for finite element approximation.
FieldSpace getSpace() const
Get field approximation space.
const BitFieldId & getId() const
Get unique field identifier.
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 from 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.
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.
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.