19 if (
auto a_ptr =
a.lock()) {
20 if (a_ptr->getLocalUniqueId() < b)
30 if (
auto a_ptr =
a.lock()) {
31 if (b < a_ptr->getLocalUniqueId())
43 mField(m_field), getRuleHook(0), setRuleHook(0),
61 dataOnElement[
HCURL]),
67 dataNoField(*dataOnElement[
NOFIELD].get()),
68 dataH1(*dataOnElement[
H1].get()), dataHcurl(*dataOnElement[
HCURL].get()),
69 dataHdiv(*dataOnElement[
HDIV].get()), dataL2(*dataOnElement[
L2].get()),
70 lastEvaluatedElementEntityType(MBMAXTYPE), sidePtrFE(nullptr),
71 refinePtrFE(nullptr) {
85 const EntityType type,
86 boost::ptr_vector<EntitiesFieldData::EntData> &data)
const {
91 if (sit != side_table.end()) {
93 for (; sit != hi_sit; ++sit) {
94 if (
const auto side_number = (*sit)->side_number; side_number >= 0) {
95 const int brother_side_number = (*sit)->brother_side_number;
96 const int sense = (*sit)->sense;
98 data[side_number].getSense() = sense;
99 if (brother_side_number != -1)
100 data[brother_side_number].getSense() = sense;
109template <
typename ENTMULTIINDEX>
112 for (
auto ent_field_weak_ptr : multi_index)
113 if (
auto e = ent_field_weak_ptr.lock()) {
114 const int order = e->getMaxOrder();
115 max_order = (max_order <
order) ?
order : max_order;
123 if (
auto ptr = e.lock()) {
124 const int order = ptr->getMaxOrder();
125 max_order = (max_order <
order) ?
order : max_order;
140 const EntityType type,
const FieldSpace space,
141 boost::ptr_vector<EntitiesFieldData::EntData> &data)
const {
144 auto set_order = [&]() {
148 for (
unsigned int s = 0; s != data.size(); ++s)
149 data[s].getOrder() = 0;
154 r.first != r.second; ++r.first) {
156 const auto field_bit_number = (*r.first)->getBitNumber();
159 auto lo = std::lower_bound(data_field_ent.begin(), data_field_ent.end(),
161 if (lo != data_field_ent.end()) {
165 std::upper_bound(lo, data_field_ent.end(), hi_uid,
cmp_uid_hi);
166 for (; lo != hi; ++lo) {
168 if (
auto ptr = lo->lock()) {
171 auto sit = side_table.find(e.getEnt());
172 if (sit != side_table.end()) {
174 if (
const auto side_number = side->side_number;
177 auto &dat = data[side_number];
179 dat.getOrder() > ent_order ? dat.getOrder() : ent_order;
183 "Entity on side of the element not found");
192 auto set_order_on_brother = [&]() {
197 if (sit != side_table.end()) {
199 for (; sit != hi_sit; ++sit) {
200 const int brother_side_number = (*sit)->brother_side_number;
201 if (brother_side_number != -1) {
202 const int side_number = (*sit)->side_number;
203 data[brother_side_number].getOrder() = data[side_number].getOrder();
211 CHKERR set_order_on_brother();
218template <
typename EXTRACTOR>
222 EXTRACTOR &&extractor)
const {
230 if ((*field_it)->getBitNumber() != bit_number)
234 bit_number, get_id_for_min_type<MBVERTEX>());
235 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
237 if (lo != ents_field.end()) {
239 bit_number, get_id_for_max_type<MBVERTEX>());
240 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid,
cmp_uid_hi);
243 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
244 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
247 for (
auto it = lo; it != hi; ++it) {
248 if (
auto e = it->lock()) {
249 if (
auto cache = extractor(e).lock()) {
250 if (cache->loHi[0] != cache->loHi[1]) {
251 nb_dofs += std::distance(cache->loHi[0], cache->loHi[1]);
259 nodes_indices.resize(max_nb_dofs,
false);
260 local_nodes_indices.resize(max_nb_dofs,
false);
262 nodes_indices.resize(0,
false);
263 local_nodes_indices.resize(0,
false);
266 if (nb_dofs != max_nb_dofs) {
267 std::fill(nodes_indices.begin(), nodes_indices.end(), -1);
268 std::fill(local_nodes_indices.begin(), local_nodes_indices.end(), -1);
271 for (
auto it = lo; it != hi; ++it) {
272 if (
auto e = it->lock()) {
273 auto side_ptr = e->getSideNumberPtr();
274 if (
const auto side_number = side_ptr->side_number;
276 const auto brother_side_number = side_ptr->brother_side_number;
277 if (
auto cache = extractor(e).lock()) {
278 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
280 const int idx = dof.getPetscGlobalDofIdx();
281 const int local_idx = dof.getPetscLocalDofIdx();
283 side_number * nb_dofs_on_vert + dof.getDofCoeffIdx();
284 nodes_indices[pos] = idx;
285 local_nodes_indices[pos] = local_idx;
286 if (brother_side_number != -1) {
287 const int elem_idx = brother_side_number * nb_dofs_on_vert +
288 (*dit)->getDofCoeffIdx();
289 nodes_indices[elem_idx] = idx;
290 local_nodes_indices[elem_idx] = local_idx;
298 nodes_indices.resize(0,
false);
299 local_nodes_indices.resize(0,
false);
303 nodes_indices.resize(0,
false);
304 local_nodes_indices.resize(0,
false);
312 const int bit_number)
const {
315 boost::weak_ptr<EntityCacheNumeredDofs>
316 operator()(boost::shared_ptr<FieldEntity> &e) {
317 return e->entityCacheRowDofs;
329 const int bit_number)
const {
332 boost::weak_ptr<EntityCacheNumeredDofs>
333 operator()(boost::shared_ptr<FieldEntity> &e) {
334 return e->entityCacheColDofs;
344template <
typename EXTRACTOR>
348 const EntityType type_hi, EXTRACTOR &&extractor)
const {
351 for (EntityType
t = type_lo;
t != type_hi; ++
t) {
353 dat.getIndices().resize(0,
false);
354 dat.getLocalIndices().resize(0,
false);
360 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
362 if (lo != ents_field.end()) {
365 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid,
cmp_uid_hi);
368 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
370 for (
auto it = lo; it != hi; ++it)
371 if (
auto e = it->lock()) {
373 const EntityType type = e->getEntType();
374 auto side_ptr = e->getSideNumberPtr();
375 if (
const auto side = side_ptr->side_number; side >= 0) {
376 const auto nb_dofs_on_ent = e->getNbDofsOnEnt();
377 const auto brother_side = side_ptr->brother_side_number;
379 auto &ent_field_indices = dat.getIndices();
380 auto &ent_field_local_indices = dat.getLocalIndices();
382 ent_field_indices.resize(nb_dofs_on_ent,
false);
383 ent_field_local_indices.resize(nb_dofs_on_ent,
false);
384 std::fill(ent_field_indices.data().begin(),
385 ent_field_indices.data().end(), -1);
386 std::fill(ent_field_local_indices.data().begin(),
387 ent_field_local_indices.data().end(), -1);
389 if (
auto cache = extractor(e).lock()) {
390 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
391 const int idx = (*dit)->getEntDofIdx();
392 ent_field_indices[idx] = (*dit)->getPetscGlobalDofIdx();
393 ent_field_local_indices[idx] = (*dit)->getPetscLocalDofIdx();
397 if (brother_side != -1) {
399 dat_brother.getIndices().resize(nb_dofs_on_ent,
false);
400 dat_brother.getLocalIndices().resize(nb_dofs_on_ent,
false);
401 noalias(dat_brother.getIndices()) = dat.getIndices();
402 noalias(dat_brother.getLocalIndices()) = dat.getLocalIndices();
414 const EntityType type_hi)
const {
417 boost::weak_ptr<EntityCacheNumeredDofs>
418 operator()(boost::shared_ptr<FieldEntity> &e) {
419 return e->entityCacheRowDofs;
429 const EntityType type_hi)
const {
432 boost::weak_ptr<EntityCacheNumeredDofs>
433 operator()(boost::shared_ptr<FieldEntity> &e) {
434 return e->entityCacheColDofs;
443 const int bit_number, boost::shared_ptr<FENumeredDofEntity_multiIndex> dofs,
450 indices.resize(std::distance(dit, hi_dit));
451 for (; dit != hi_dit; dit++) {
452 int idx = (*dit)->getPetscGlobalDofIdx();
453 indices[(*dit)->getDofCoeffIdx()] = idx;
460 const int bit_number)
const {
465 "data.dataOnEntities[MBENTITYSET] is empty");
475 const int bit_number)
const {
480 "data.dataOnEntities[MBENTITYSET] is empty");
499 nodes_indices.resize(field_struture->
getNbOfCoeffs() * num_nodes,
false);
500 std::fill(nodes_indices.begin(), nodes_indices.end(), -1);
504 auto siit = side_table.get<1>().lower_bound(boost::make_tuple(MBVERTEX, 0));
506 side_table.get<1>().lower_bound(boost::make_tuple(MBVERTEX, 10000));
509 for (; siit != hi_siit; siit++, nn++) {
510 if (siit->get()->side_number >= 0) {
517 for (; dit != hi_dit; dit++) {
518 nodes_indices[siit->get()->side_number * (*dit)->getNbOfCoeffs() +
519 (*dit)->getDofCoeffIdx()] =
520 (*dit)->getPetscGlobalDofIdx();
525 nodes_indices.resize(0,
false);
533 EntityType type,
int side_number,
VectorInt &indices)
const {
541 side_table.get<1>().lower_bound(boost::make_tuple(type, side_number));
543 side_table.get<1>().upper_bound(boost::make_tuple(type, side_number));
545 for (; siit != hi_siit; siit++) {
546 if (siit->get()->side_number >= 0) {
554 indices.resize(std::distance(dit, hi_dit));
555 for (; dit != hi_dit; dit++) {
557 indices[(*dit)->getEntDofIdx()] = (*dit)->getPetscGlobalDofIdx();
573 EntityType type,
int side_number,
576 type, side_number, indices);
587 EntityType type,
int side_number,
590 type, side_number, indices);
600 for (
auto &dat : data->dataOnEntities) {
601 for (
auto &ent_dat : dat) {
602 ent_dat.getEntDataBitRefLevel().clear();
609 for (
auto it : field_ents) {
610 if (
auto e = it.lock()) {
613 const EntityType type = e->getEntType();
614 const signed char side = e->getSideNumberPtr()->side_number;
617 if (type == MBVERTEX) {
618 auto &dat = data->dataOnEntities[type][0];
620 dat.getEntDataBitRefLevel()[side] = e->getBitRefLevel();
622 auto &dat = data->dataOnEntities[type][side];
623 dat.getEntDataBitRefLevel().resize(1,
false);
624 dat.getEntDataBitRefLevel()[0] = e->getBitRefLevel();
630 auto &dat = data->dataOnEntities[MBENTITYSET][0];
631 dat.getEntDataBitRefLevel().resize(1,
false);
632 dat.getEntDataBitRefLevel()[0] = e->getBitRefLevel();
643 const int bit_number)
const {
645 auto get_nodes_field_data = [&](
VectorDouble &nodes_data,
652 nodes_data.resize(0,
false);
653 nodes_dofs.resize(0,
false);
654 field_entities.resize(0,
false);
661 if ((*field_it)->getBitNumber() != bit_number)
664 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
665 space = (*field_it)->getSpace();
666 base = (*field_it)->getApproxBase();
670 bit_number, get_id_for_min_type<MBVERTEX>());
671 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
673 if (lo != field_ents.end()) {
675 bit_number, get_id_for_max_type<MBVERTEX>());
676 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
680 for (
auto it = lo; it != hi; ++it) {
681 if (
auto e = it->lock()) {
682 if (
auto cache = e->entityCacheDataDofs.lock()) {
683 if (cache->loHi[0] != cache->loHi[1]) {
684 nb_dofs += std::distance(cache->loHi[0], cache->loHi[1]);
694 bb_node_order.resize(num_nodes,
false);
695 bb_node_order.clear();
696 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
697 nodes_data.resize(max_nb_dofs,
false);
698 nodes_dofs.resize(max_nb_dofs,
false);
699 field_entities.resize(num_nodes,
false);
700 std::fill(nodes_data.begin(), nodes_data.end(), 0);
701 std::fill(nodes_dofs.begin(), nodes_dofs.end(),
nullptr);
702 std::fill(field_entities.begin(), field_entities.end(),
nullptr);
704 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
706 for (
auto it = lo; it != hi; ++it) {
707 if (
auto e = it->lock()) {
708 const auto &sn = e->getSideNumberPtr();
711 if (
const auto side_number = sn->side_number;
713 const int brother_side_number = sn->brother_side_number;
715 field_entities[side_number] = e.get();
716 if (brother_side_number != -1) {
717 brother_ents_vec.emplace_back(e);
718 field_entities[side_number] = field_entities[side_number];
721 bb_node_order[side_number] = e->getMaxOrder();
722 int pos = side_number * nb_dofs_on_vert;
723 auto ent_filed_data_vec = e->getEntFieldData();
724 if (
auto cache = e->entityCacheDataDofs.lock()) {
725 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1];
727 const auto dof_idx = (*dit)->getEntDofIdx();
728 nodes_data[pos + dof_idx] = ent_filed_data_vec[dof_idx];
729 nodes_dofs[pos + dof_idx] =
737 for (
auto &it : brother_ents_vec) {
738 if (
const auto e = it.lock()) {
740 const int side_number = sn->side_number;
741 const int brother_side_number = sn->brother_side_number;
742 bb_node_order[brother_side_number] = bb_node_order[side_number];
743 int pos = side_number * nb_dofs_on_vert;
744 int brother_pos = brother_side_number * nb_dofs_on_vert;
745 for (
int ii = 0; ii != nb_dofs_on_vert; ++ii) {
746 nodes_data[brother_pos] = nodes_data[pos];
747 nodes_dofs[brother_pos] = nodes_dofs[pos];
761 return get_nodes_field_data(
772 const EntityType type_hi)
const {
774 for (EntityType
t = type_lo;
t != type_hi; ++
t) {
779 dat.getFieldData().resize(0,
false);
780 dat.getFieldDofs().resize(0,
false);
781 dat.getFieldEntities().resize(0,
false);
788 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
790 if (lo != field_ents.end()) {
793 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
796 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
798 for (
auto it = lo; it != hi; ++it)
799 if (
auto e = it->lock()) {
800 auto side_ptr = e->getSideNumberPtr();
801 if (
const auto side = side_ptr->side_number; side >= 0) {
802 const EntityType type = e->getEntType();
804 auto &ent_field = dat.getFieldEntities();
805 auto &ent_field_dofs = dat.getFieldDofs();
806 auto &ent_field_data = dat.getFieldData();
808 const int brother_side = side_ptr->brother_side_number;
809 if (brother_side != -1)
810 brother_ents_vec.emplace_back(e);
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;
818 auto ent_data = e->getEntFieldData();
819 ent_field_data.resize(ent_data.size(),
false);
820 noalias(ent_field_data) = ent_data;
821 ent_field_dofs.resize(ent_data.size(),
false);
822 std::fill(ent_field_dofs.begin(), ent_field_dofs.end(),
nullptr);
823 ent_field.resize(1,
false);
824 ent_field[0] = e.get();
825 if (
auto cache = e->entityCacheDataDofs.lock()) {
826 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
827 ent_field_dofs[(*dit)->getEntDofIdx()] =
834 for (
auto &it : brother_ents_vec) {
835 if (
const auto e = it.lock()) {
836 const EntityType type = e->getEntType();
837 const int side = e->getSideNumberPtr()->side_number;
838 const int brother_side = e->getSideNumberPtr()->brother_side_number;
841 dat_brother.getBase() = dat.getBase();
842 dat_brother.getSpace() = dat.getSpace();
843 dat_brother.getOrder() = dat.getOrder();
844 dat_brother.getFieldData() = dat.getFieldData();
845 dat_brother.getFieldDofs() = dat.getFieldDofs();
846 dat_brother.getFieldEntities() = dat.getFieldEntities();
861 ent_field_data.resize(0,
false);
862 ent_field_dofs.resize(0,
false);
863 ent_field.resize(0,
false);
867 bit_number, get_id_for_min_type<MBVERTEX>());
868 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
870 if (lo != field_ents.end()) {
872 ent_field.resize(field_ents.size(),
false);
873 std::fill(ent_field.begin(), ent_field.end(),
nullptr);
876 bit_number, get_id_for_max_type<MBENTITYSET>());
877 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
881 for (
auto it = lo; it != hi; ++it, ++side)
882 if (
auto e = it->lock()) {
884 const auto size = e->getNbDofsOnEnt();
885 ent_field_data.resize(size,
false);
886 ent_field_dofs.resize(size,
false);
887 ent_field[side] = e.get();
888 noalias(ent_field_data) = e->getEntFieldData();
890 if (
auto cache = e->entityCacheDataDofs.lock()) {
891 for (
auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
892 ent_field_dofs[(*dit)->getEntDofIdx()] =
905 const int bit_number)
const {
909 "No space to insert data");
929 const auto nb_faces = CN::NumSubEntities(type, 2);
933 auto side_ptr_it = side_table.get<1>().lower_bound(
934 boost::make_tuple(CN::TypeDimensionMap[2].first, 0));
935 auto hi_side_ptr_it = side_table.get<1>().upper_bound(
936 boost::make_tuple(CN::TypeDimensionMap[2].second, 100));
938 for (; side_ptr_it != hi_side_ptr_it; ++side_ptr_it) {
939 const auto side = (*side_ptr_it)->side_number;
940 const auto sense = (*side_ptr_it)->sense;
941 const auto offset = (*side_ptr_it)->offset;
943 EntityType face_type;
946 CN::SubEntityVertexIndices(type, 2, side, face_type, nb_nodes_face);
947 face_nodes.resize(nb_faces, nb_nodes_face);
948 face_nodes_order.resize(nb_faces, nb_nodes_face);
951 for (
int n = 0;
n != nb_nodes_face; ++
n)
952 face_nodes_order(side,
n) = (
n + offset) % nb_nodes_face;
954 for (
int n = 0;
n != nb_nodes_face; ++
n)
955 face_nodes_order(side,
n) =
956 (nb_nodes_face - (
n - offset) % nb_nodes_face) % nb_nodes_face;
958 for (
int n = 0;
n != nb_nodes_face; ++
n)
959 face_nodes(side,
n) = face_indices[face_nodes_order(side,
n)];
962 const auto face_ent = (*side_ptr_it)->ent;
968 nb_nodes_face,
true);
969 face_nodes.resize(nb_faces, nb_nodes_face);
970 for (
int nn = 0; nn != nb_nodes_face; ++nn) {
971 if (face_nodes(side, nn) !=
974 std::find(conn_ele, &conn_ele[num_nodes_ele], conn_face[nn]))) {
976 "Wrong face numeration");
996 for (EntityType
t = MBVERTEX;
t != MBMAXTYPE; ++
t) {
1010 if (
auto ptr = e.lock()) {
1012 const EntityType type = ptr->getEntType();
1019 switch (continuity) {
1028 "Continuity not defined");
1031 data.
bAse.set(approx);
1039 "data fields ents not allocated on element");
1041 for (
auto space = 0; space !=
LASTSPACE; ++space)
1044 "Discontinuous and continuous bases on the same space");
1064 auto get_elem_base = [&](
auto base) {
1069 "Functions generating approximation base not defined");
1075 "Functions generating user approximation base not defined");
1080 auto get_ctx = [&](
auto space,
auto base,
auto continuity) {
1081 return boost::make_shared<EntPolynomialBaseCtx>(
1087 return elem_base->getValue(
gaussPts, ctx);
1090 for (
int space =
H1; space !=
LASTSPACE; ++space) {
1096 "Discontinuous and continuous bases on the same space");
1119 dataOnElement[space]->dataOnEntities[MBVERTEX][0].getDiffNSharedPtr(
1141 auto &bb_node_order = data.
dataOnEntities[MBVERTEX][0].getBBNodeOrder();
1144 auto bit_number = field_ptr->getBitNumber();
1146 bit_number, get_id_for_min_type<MBVERTEX>());
1147 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
1149 if (lo != field_ents.end()) {
1151 bit_number, get_id_for_max_type<MBVERTEX>());
1152 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
1155 for (
auto it = lo; it != hi; ++it)
1156 if (
auto first_e = it->lock()) {
1157 space = first_e->getSpace();
1158 base = first_e->getApproxBase();
1160 bb_node_order.resize(num_nodes,
false);
1161 bb_node_order.clear();
1163 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
1165 for (; it != hi; ++it) {
1166 if (
auto e = it->lock()) {
1167 const auto &sn = e->getSideNumberPtr();
1168 const int side_number = sn->side_number;
1169 const int brother_side_number = sn->brother_side_number;
1170 if (brother_side_number != -1)
1171 brother_ents_vec.emplace_back(e);
1172 bb_node_order[side_number] = e->getMaxOrder();
1176 for (
auto &it : brother_ents_vec) {
1177 if (
const auto e = it.lock()) {
1178 const auto &sn = e->getSideNumberPtr();
1179 const int side_number = sn->side_number;
1180 const int brother_side_number = sn->brother_side_number;
1181 bb_node_order[brother_side_number] = bb_node_order[side_number];
1194 const EntityType type_lo,
1195 const EntityType type_hi) {
1197 for (EntityType
t = MBEDGE;
t != MBPOLYHEDRON; ++
t) {
1202 dat.getFieldData().resize(0,
false);
1203 dat.getFieldDofs().resize(0,
false);
1208 auto bit_number = field_ptr->getBitNumber();
1211 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
1213 if (lo != field_ents.end()) {
1216 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid,
cmp_uid_hi);
1218 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
1219 for (; lo != hi; ++lo) {
1220 if (
auto e = lo->lock()) {
1221 if (
auto cache = e->entityCacheDataDofs.lock()) {
1222 if (cache->loHi[0] != cache->loHi[1]) {
1223 if (
const auto side = e->getSideNumberPtr()->side_number;
1225 const EntityType type = e->getEntType();
1227 const int brother_side =
1228 e->getSideNumberPtr()->brother_side_number;
1229 if (brother_side != -1)
1230 brother_ents_vec.emplace_back(e);
1231 dat.getBase() = e->getApproxBase();
1232 dat.getSpace() = e->getSpace();
1233 const auto ent_order = e->getMaxOrder();
1235 dat.getOrder() > ent_order ? dat.getOrder() : ent_order;
1242 for (
auto &ent_ptr : brother_ents_vec) {
1243 if (
auto e = ent_ptr.lock()) {
1244 const EntityType type = e->getEntType();
1245 const int side = e->getSideNumberPtr()->side_number;
1246 const int brother_side = e->getSideNumberPtr()->brother_side_number;
1249 dat_brother.getBase() = dat.getBase();
1250 dat_brother.getSpace() = dat.getSpace();
1251 dat_brother.getOrder() = dat.getOrder();
1259 if (
auto ent_data_ptr = e.lock()) {
1261 auto space = ent_data_ptr->getSpace();
1262 for (EntityType
t = MBVERTEX;
t != MBPOLYHEDRON; ++
t) {
1264 for (
auto &ptr : dat.getBBAlphaIndicesByOrderArray())
1266 for (
auto &ptr : dat.getBBNByOrderArray())
1268 for (
auto &ptr : dat.getBBDiffNByOrderArray())
1276 auto check_space = [&](
const auto space) {
1279 for (
auto t = MBVERTEX;
t <= ele_type; ++
t) {
1285 for (
auto t = MBEDGE;
t <= ele_type; ++
t) {
1291 for (
auto t = MBTRI;
t <= ele_type; ++
t) {
1304 std::set<string> fields_list;
1306 if (
auto ent_data_ptr = e.lock()) {
1309 if (fields_list.find(
field_name) == fields_list.end()) {
1310 auto field_ptr = ent_data_ptr->getFieldRawPtr();
1311 auto space = ent_data_ptr->getSpace();
1315 if (check_space(space)) {
1317 if (ent_data_ptr->getContinuity() !=
CONTINUOUS)
1319 "Broken space not implemented");
1323 boost::make_shared<EntPolynomialBaseCtx>(
1341 for (
int space =
H1; space !=
LASTSPACE; ++space) {
1349#define LOG_FUNCTION_NAME_WITH_OP_NAME(OP, CHANNEL, SEV) \
1350 MOFEM_LOG(CHANNEL, SEV) \
1351 << "(Calling user data operator " \
1352 << boost::typeindex::type_id_runtime(OP).pretty_name() << " rowField " \
1353 << (OP).rowFieldName << " colField " << (OP).colFieldName << ") "
1355#define CATCH_OP_ERRORS(OP) \
1356 catch (MoFEMExceptionInitial const &ex) { \
1357 LOG_FUNCTION_NAME_WITH_OP_NAME(OP, "SELF", Sev::error) \
1358 << "in " << PETSC_FUNCTION_NAME; \
1359 return PetscError(PETSC_COMM_SELF, ex.lINE, PETSC_FUNCTION_NAME, __FILE__, \
1360 ex.errorCode, PETSC_ERROR_INITIAL, "%s", ex.what()); \
1362 catch (MoFEMExceptionRepeat const &ex) { \
1363 LOG_FUNCTION_NAME_WITH_OP_NAME(OP, "SELF", Sev::error) \
1364 << "in " << PETSC_FUNCTION_NAME; \
1365 return PetscError(PETSC_COMM_SELF, ex.lINE, PETSC_FUNCTION_NAME, __FILE__, \
1366 ex.errorCode, PETSC_ERROR_REPEAT, " "); \
1368 catch (MoFEMException const &ex) { \
1369 LOG_FUNCTION_NAME_WITH_OP_NAME(OP, "SELF", Sev::error) \
1370 << "in " << PETSC_FUNCTION_NAME; \
1371 SETERRQ(PETSC_COMM_SELF, ex.errorCode, "%s", ex.errorMessage); \
1373 catch (std::exception const &ex) { \
1374 LOG_FUNCTION_NAME_WITH_OP_NAME(OP, "SELF", Sev::error) \
1375 << "\nError: " << ex.what() << " at " << __LINE__ << " : " __FILE__ \
1376 << " in " << PETSC_FUNCTION_NAME; \
1377 SETERRQ(PETSC_COMM_SELF, MOFEM_STD_EXCEPTION_THROW, "%s", \
1378 "std::exception"); \
1382 #define LOG_OP(OP) \
1383 LOG_FUNCTION_NAME_WITH_OP_NAME(OP, "WORLD", Sev::noisy) \
1384 << "\nLocation: at " << __LINE__ << " : " __FILE__ << " in " \
1385 << PETSC_FUNCTION_NAME;
1396 std::array<const Field *, 3> field_struture;
1399 std::array<FieldSpace, 2> space;
1400 std::array<FieldApproximationBase, 2> base;
1402 constexpr std::array<UDO::OpType, 2> types = {UDO::OPROW, UDO::OPCOL};
1403 std::array<int, 2> last_eval_field_id = {0, 0};
1405 std::array<boost::shared_ptr<EntitiesFieldData>, 2> op_data;
1407 auto swap_bases = [&](
auto &op) {
1409 for (
size_t ss = 0; ss != 2; ++ss) {
1410 if (op.getOpType() & types[ss] || op.getOpType() & UDO::OPROWCOL) {
1427 auto evaluate_op_space = [&](
auto &op) {
1432 std::fill(last_eval_field_id.begin(), last_eval_field_id.end(), 0);
1452 for (EntityType
t = MBVERTEX;
t != MBMAXTYPE; ++
t) {
1454 e.getSpace() = op.sPace;
1471 auto set_op_entities_data = [&](
auto ss,
auto &op) {
1475 if ((op.getNumeredEntFiniteElementPtr()->getBitFieldIdData() &
1479 "no data field < %s > on finite element < %s >",
1487 for (
auto &data : op_data[ss]->dataOnEntities[MBENTITYSET]) {
1488 CHKERR data.resetFieldDependentData();
1491 auto get_data_for_nodes = [&]() {
1502 auto get_data_for_entities = [&]() {
1512 auto get_data_for_meshset = [&]() {
1523 switch (space[ss]) {
1525 CHKERR get_data_for_nodes();
1528 CHKERR get_data_for_entities();
1533 CHKERR get_data_for_nodes();
1536 CHKERR get_data_for_entities();
1543 CHKERR get_data_for_meshset();
1548 "not implemented for this space < %s >",
1555 auto evaluate_op_for_fields = [&](
auto &op) {
1558 if (op.getOpType() & UDO::OPROW) {
1561 CHKERR op.opRhs(*op_data[0],
false);
1566 if (op.getOpType() & UDO::OPCOL) {
1569 CHKERR op.opRhs(*op_data[1],
false);
1574 if (op.getOpType() & UDO::OPROWCOL) {
1577 CHKERR op.opLhs(*op_data[0], *op_data[1]);
1591 for (; oit != hi_oit; oit++) {
1596 CHKERR oit->setPtrFE(
this);
1598 if ((oit->opType & UDO::OPSPACE) == UDO::OPSPACE) {
1601 CHKERR evaluate_op_space(*oit);
1605 (oit->opType & (UDO::OPROW | UDO::OPCOL | UDO::OPROWCOL)) ==
1613 for (
size_t ss = 0; ss != 2; ss++) {
1618 "Not set Field name in operator %ld (0-row, 1-column) in "
1621 (boost::typeindex::type_id_runtime(*oit).pretty_name())
1628 space[ss] = field_struture[ss]->getSpace();
1629 base[ss] = field_struture[ss]->getApproxBase();
1634 for (
size_t ss = 0; ss != 2; ss++) {
1636 if (oit->getOpType() & types[ss] ||
1637 oit->getOpType() & UDO::OPROWCOL) {
1638 if (last_eval_field_id[ss] != field_id[ss]) {
1639 CHKERR set_op_entities_data(ss, *oit);
1640 last_eval_field_id[ss] = field_id[ss];
1648 CHKERR evaluate_op_for_fields(*oit);
1654 for (
int i = 0;
i != 5; ++
i)
1655 if (oit->opType & (1 <<
i))
1656 MOFEM_LOG(
"SELF", Sev::error) << UDO::OpTypeNames[
i];
1658 "Impossible operator type");
1666const char *
const ForcesAndSourcesCore::UserDataOperator::OpTypeNames[] = {
1667 "OPROW",
" OPCOL",
"OPROWCOL",
"OPSPACE",
"OPLAST"};
1670 const std::string
field_name,
const EntityType type,
const int side,
1687 const std::string
field_name,
const EntityType type,
const int side,
1719 const EntityHandle ent_for_side, boost::shared_ptr<Range> fe_range,
1723 const auto *problem_ptr = getFEMethod()->problemPtr;
1725 problem_ptr->numeredFiniteElementsPtr->get<
Unique_mi_tag>();
1727 auto fe_miit = ptrFE->mField.get_finite_elements()
1730 if (fe_miit != ptrFE->mField.get_finite_elements()
1736 side_fe->
feName = fe_name;
1749 std::vector<boost::weak_ptr<NumeredEntFiniteElement>> fe_vec;
1750 auto get_numered_fe_ptr = [&](
auto &fe_uid,
Range &&adjacent_ents)
1751 -> std::vector<boost::weak_ptr<NumeredEntFiniteElement>> & {
1752 fe_vec.reserve(adjacent_ents.size());
1753 for (
auto fe_ent : adjacent_ents) {
1754 auto miit = numered_fe.find(
1756 if (miit != numered_fe.end()) {
1757 fe_vec.emplace_back(*miit);
1763 auto get_bit_entity_adjacency = [&]() {
1764 Range adjacent_ents;
1767 ent, side_dim, adjacent_ents),
1768 "getAdjacenciesAny failed");
1769 return adjacent_ents;
1772 auto get_bit_meshset_entities = [&]() {
1773 auto &
bit = getFEMethod()->numeredEntFiniteElementPtr->getBitRefLevel();
1774 Range ents = *fe_range;
1778 "filterEntitiesByRefLevel failed");
1782 auto get_adj = [&](
auto &fe_uid,
auto get_adj_fun)
1783 -> std::vector<boost::weak_ptr<NumeredEntFiniteElement>> & {
1786 return (*adj_cache).at(ent);
1787 }
catch (
const std::out_of_range &) {
1788 return (*adj_cache)[ent] = get_numered_fe_ptr(fe_uid, get_adj_fun());
1791 return get_numered_fe_ptr(fe_uid, get_adj_fun());
1798 "No range of finite elements");
1800 auto adj = (!fe_range)
1801 ? get_adj((*fe_miit)->getFEUId(), get_bit_entity_adjacency)
1802 : get_adj((*fe_miit)->getFEUId(), get_bit_meshset_entities);
1804 if (verb >=
VERBOSE && !adj.empty())
1805 MOFEM_LOG(
"SELF", sev) <<
"Number of side finite elements " << adj.size();
1809 for (
auto fe_weak_ptr : adj) {
1810 if (
auto fe_ptr = fe_weak_ptr.lock()) {
1813 <<
"Side finite element " <<
"(" << nn <<
"): " << *fe_ptr;
1836 auto fe_miit = fes.find(fe_name);
1837 if (fe_miit != fes.end()) {
1839 this_fe->
feName = fe_name;
1859 <<
"This finite element: " << *getNumeredEntFiniteElementPtr();
1865 auto get_numered_fe_ptr = [&](
auto &fe_uid,
auto fe_ent) {
1868 ->problemPtr->numeredFiniteElementsPtr->get<
Unique_mi_tag>();
1869 auto it = numered_fe.find(
1871 boost::shared_ptr<const NumeredEntFiniteElement> this_numered_fe_ptr;
1872 if (it != numered_fe.end()) {
1873 this_numered_fe_ptr = *it;
1875 return this_numered_fe_ptr;
1878 auto this_numered_fe_ptr = get_numered_fe_ptr(
1879 (*fe_miit)->getFEUId(), getNumeredEntFiniteElementPtr()->getEnt());
1880 if (this_numered_fe_ptr) {
1884 <<
"This finite element: " << *this_numered_fe_ptr;
1903 auto fe_miit = fes.find(fe_name);
1904 if (fe_miit != fes.end()) {
1906 const auto *problem_ptr = getFEMethod()->problemPtr;
1908 problem_ptr->numeredFiniteElementsPtr->get<
Unique_mi_tag>();
1910 parent_fe->
feName = fe_name;
1920 const auto parent_ent = getNumeredEntFiniteElementPtr()->getParentEnt();
1922 parent_ent, (*fe_miit)->getFEUId()));
1923 if (miit != numered_fe.end()) {
1925 MOFEM_LOG(
"SELF", sev) <<
"Parent finite element: " << **miit;
1934 MOFEM_LOG(
"SELF", sev) <<
"Parent finite element: no parent";
1950 auto fe_miit = ptrFE->mField.get_finite_elements()
1953 if (fe_miit != ptrFE->mField.get_finite_elements()
1957 const auto *problem_ptr = getFEMethod()->problemPtr;
1958 auto &ref_ents = *getPtrFE()->mField.get_ref_ents();
1960 problem_ptr->numeredFiniteElementsPtr->get<
Unique_mi_tag>();
1962 const auto parent_ent = getNumeredEntFiniteElementPtr()->getEnt();
1963 const auto parent_type = getNumeredEntFiniteElementPtr()->getEntType();
1966 boost::make_tuple(parent_type, parent_ent));
1968 if (
auto size = std::distance(range.first, range.second)) {
1970 std::vector<EntityHandle> childs_vec;
1971 childs_vec.reserve(size);
1972 for (; range.first != range.second; ++range.first)
1973 childs_vec.emplace_back((*range.first)->getEnt());
1977 if ((childs_vec.back() - childs_vec.front() + 1) == size)
1978 childs =
Range(childs_vec.front(), childs_vec.back());
1980 childs.insert_list(childs_vec.begin(), childs_vec.end());
1982 child_fe->
feName = fe_name;
1998 for (
auto p = childs.pair_begin(); p != childs.pair_end(); ++p) {
2002 p->first, (*fe_miit)->getFEUId()));
2005 p->second, (*fe_miit)->getFEUId()));
2007 for (; miit != hi_miit; ++miit) {
2011 <<
"Child finite element " <<
"(" << nn <<
"): " << **miit;
2028 boost::shared_ptr<Range> fe_range,
const int verb,
2034 auto fe_miit = fes.find(fe_name);
2035 if (fe_miit != fes.end()) {
2037 const auto *problem_ptr = getFEMethod()->problemPtr;
2039 problem_ptr->numeredFiniteElementsPtr->get<
Unique_mi_tag>();
2041 range_fe->
feName = fe_name;
2051 auto get_numered_fe_ptr = [&](
auto &fe_uid,
auto fe_range,
auto execute) {
2055 for (
auto p = fe_range->pair_begin(); p != fe_range->pair_end(); ++p) {
2056 auto first = p->first;
2057 auto second = p->second;
2058 auto lo = numered_fe.lower_bound(
2060 auto hi = numered_fe.upper_bound(
2062 for (; lo != hi; ++lo) {
2063 CHKERR execute(lo, nn++);
2070 auto execute = [&](
auto lo,
auto nn) {
2073 MOFEM_LOG(
"SELF", sev) <<
"Range finite element: " << **lo;
2082 CHKERR get_numered_fe_ptr((*fe_miit)->getFEUId(), fe_range, execute);
2110ForcesAndSourcesCore::UserDataOperator::UserDataOperator(
const FieldSpace space,
2113 :
DataOperator(symm), opType(type), sPace(space), ptrFE(nullptr) {}
2115ForcesAndSourcesCore::UserDataOperator::UserDataOperator(
2116 const std::string
field_name,
const char type,
const bool symm)
2120ForcesAndSourcesCore::UserDataOperator::UserDataOperator(
2121 const std::string row_field_name,
const std::string col_field_name,
2122 const char type,
const bool symm)
2123 :
DataOperator(symm), opType(type), rowFieldName(row_field_name),
2124 colFieldName(col_field_name), sPace(
LASTSPACE), ptrFE(nullptr) {}
2142 <<
"No method operator() overloaded on element entity on finite "
2144 << boost::typeindex::type_id_runtime(*this).pretty_name() <<
">";
2163 "User operator and finite element do not work together");
#define CATCH_OP_ERRORS(OP)
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ USER_BASE
user implemented approximation base
@ AINSWORTH_BERNSTEIN_BEZIER_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
FieldContinuity
Field continuity.
@ CONTINUOUS
Regular field.
@ DISCONTINUOUS
Broken continuity (No effect on L2 space)
static const char *const FieldSpaceNames[]
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
@ 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.
multi_index_container< boost::shared_ptr< NumeredDofEntity >, indexed_by< ordered_unique< tag< Unique_mi_tag >, const_mem_fun< NumeredDofEntity::interface_type_DofEntity, UId, &NumeredDofEntity::getLocalUniqueId > >, ordered_non_unique< tag< Part_mi_tag >, member< NumeredDofEntity, unsigned int, &NumeredDofEntity::pArt > >, ordered_non_unique< tag< Idx_mi_tag >, member< NumeredDofEntity, DofIdx, &NumeredDofEntity::dofIdx > >, ordered_non_unique< tag< PetscGlobalIdx_mi_tag >, member< NumeredDofEntity, DofIdx, &NumeredDofEntity::petscGloablDofIdx > >, ordered_non_unique< tag< PetscLocalIdx_mi_tag >, member< NumeredDofEntity, DofIdx, &NumeredDofEntity::petscLocalDofIdx > >, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< NumeredDofEntity::interface_type_DofEntity, EntityHandle, &NumeredDofEntity::getEnt > > > > NumeredDofEntity_multiIndex
MultiIndex container keeps NumeredDofEntity.
multi_index_container< boost::shared_ptr< SideNumber >, indexed_by< ordered_unique< member< SideNumber, EntityHandle, &SideNumber::ent > >, ordered_non_unique< composite_key< SideNumber, const_mem_fun< SideNumber, EntityType, &SideNumber::getEntType >, member< SideNumber, signed char, &SideNumber::side_number > > > > > SideNumber_multiIndex
SideNumber_multiIndex for SideNumber.
virtual MoFEMErrorCode getAdjacenciesAny(const EntityHandle from_entity, const int to_dimension, Range &adj_entities) const
Get the adjacencies associated with a entity to entities of a specified dimension.
virtual const Field * get_field_structure(const std::string &name, enum MoFEMTypes bh=MF_EXIST) const =0
get field structure
#define MOFEM_LOG(channel, severity)
Log.
SeverityLevel
Severity levels.
FTensor::Index< 'i', SPACE_DIM > i
const double n
refractive index of diffusive medium
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITFEID_SIZE > BitFEId
Finite element Id.
int ApproximationOrder
Approximation on the entity.
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
UBlasVector< int > VectorInt
implementation of Data Operators for Forces and Sources
auto type_from_handle(const EntityHandle h)
get type from entity handle
static MoFEMErrorCode get_value(MatrixDouble &pts_x, MatrixDouble &pts_t, TYPE *ctx)
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
static int getMaxOrder(const ENTMULTIINDEX &multi_index)
ublas::vector< FEDofEntity *, DofsAllocator > VectorDofs
constexpr double t
plate stiffness
constexpr auto field_name
int loopSize
local number oe methods to process
MoFEMErrorCode copyBasicMethod(const BasicMethod &basic)
Copy data from other base method to this base method.
int getLoopSize() const
get loop size
boost::function< MoFEMErrorCode()> preProcessHook
Hook function for pre-processing.
const Field_multiIndex * fieldsPtr
raw pointer to fields container
int nInTheLoop
number currently of processed method
const Problem * problemPtr
raw pointer to problem
boost::function< MoFEMErrorCode()> operatorHook
Hook function for operator.
boost::weak_ptr< CacheTuple > cacheWeakPtr
int getNinTheLoop() const
get number of evaluated element in the loop
boost::function< MoFEMErrorCode()> postProcessHook
Hook function for post-processing.
MoFEMErrorCode filterEntitiesByRefLevel(const BitRefLevel bit, const BitRefLevel mask, Range &ents, int verb=QUIET) const
filter entities by bit ref level
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
virtual moab::Interface & get_moab()=0
virtual BitFieldId get_field_id(const std::string &name) const =0
Get field Id.
base operator to do operations at Gauss Pt. level
static bool getDefTypeMap(const EntityType fe_type, const EntityType ent_type)
Deprecated interface functions.
this class derive data form other data structure
UId getLocalUniqueIdCalculate() const
Generate UId for finite element entity.
Data on single entity (This is passed as argument to DataOperator::doWork)
data structure for finite element entity
MatrixInt facesNodes
nodes on finite element faces
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
MatrixInt facesNodesOrder
order of face nodes on element
std::array< std::bitset< LASTBASE >, MBMAXTYPE > basesOnEntities
bases on entity types
keeps information about indexed dofs for the finite element
std::string feName
Name of finite element.
auto & getRowFieldEnts() const
auto getFEName() const
get finite element name
const FieldEntity_vector_view & getDataFieldEnts() const
boost::shared_ptr< FieldEntity_vector_view > & getDataFieldEntsPtr() const
auto getColDofsPtr() const
EntityHandle getFEEntityHandle() const
auto getNumberOfNodes() const
auto getRowDofsPtr() const
boost::shared_ptr< const NumeredEntFiniteElement > numeredEntFiniteElementPtr
auto & getColFieldEnts() const
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.
static UId getLoBitNumberUId(const FieldBitNumber bit_number)
static UId getLoLocalEntityBitNumber(const char bit_number, const EntityHandle ent)
static UId getHiLocalEntityBitNumber(const char bit_number, const EntityHandle ent)
Provide data structure for (tensor) field approximation.
FieldCoefficientsNumber getNbOfCoeffs() const
Get number of field coefficients.
FieldSpace getSpace() const
Get field approximation space.
FieldBitNumber getBitNumber() const
Get number of set bit in Field ID. Each field has uid, get getBitNumber get number of bit set for giv...
ForcesAndSourcesCore * ptrFE
std::map< EntityHandle, std::vector< boost::weak_ptr< NumeredEntFiniteElement > > > AdjCache
structure to get information form mofem into EntitiesFieldData
MoFEMErrorCode loopOverOperators()
Iterate user data operators.
MoFEMErrorCode getProblemNodesRowIndices(const std::string &field_name, VectorInt &nodes_indices) const
MoFEMErrorCode getEntityIndices(EntitiesFieldData &data, const int bit_number, FieldEntity_vector_view &ents_field, const EntityType type_lo, const EntityType type_hi, EXTRACTOR &&extractor) const
MoFEMErrorCode getEntityRowIndices(EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
MoFEMErrorCode getRowNodesIndices(EntitiesFieldData &data, const int bit_number) const
get row node indices from FENumeredDofEntity_multiIndex
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 getProblemTypeColIndices(const std::string &field_name, EntityType type, int side_number, VectorInt &indices) const
MoFEMErrorCode getNoFieldIndices(const int bit_number, boost::shared_ptr< FENumeredDofEntity_multiIndex > dofs, VectorInt &nodes_indices) const
get NoField indices
virtual MoFEMErrorCode operator()()
function is run for every finite element
MoFEMErrorCode getFaceNodes(EntitiesFieldData &data) const
Get nodes on faces.
const std::array< boost::shared_ptr< EntitiesFieldData >, LASTSPACE > derivedDataOnElement
Entity data on element entity columns fields.
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
MoFEMErrorCode getNodesIndices(const int bit_number, FieldEntity_vector_view &ents_field, VectorInt &nodes_indices, VectorInt &local_nodes_indices, EXTRACTOR &&extractor) const
get node indices
MoFEMErrorCode getEntityFieldData(EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
MoFEMErrorCode setRefineFEPtr(const ForcesAndSourcesCore *refine_fe_ptr)
Set the pointer to face element refined.
auto & getElementPolynomialBase()
Get the Entity Polynomial Base object.
ForcesAndSourcesCore * sidePtrFE
Element to integrate on the sides.
ForcesAndSourcesCore(Interface &m_field)
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.
MoFEMErrorCode getProblemNodesColIndices(const std::string &field_name, VectorInt &nodes_indices) const
MoFEMErrorCode calHierarchicalBaseFunctionsOnElement()
Calculate base functions.
MatrixDouble gaussPts
Matrix of integration points.
MoFEMErrorCode calBernsteinBezierBaseFunctionsOnElement()
Calculate Bernstein-Bezier base.
virtual MoFEMErrorCode preProcess()
function is run at the beginning of loop
MoFEMErrorCode getColNodesIndices(EntitiesFieldData &data, const int bit_number) const
get col node indices from FENumeredDofEntity_multiIndex
MoFEMErrorCode setSideFEPtr(const ForcesAndSourcesCore *side_fe_ptr)
Set the pointer to face element on the side.
int getMaxColOrder() const
Get max order of approximation for field in columns.
MoFEMErrorCode getProblemNodesIndices(const std::string &field_name, const NumeredDofEntity_multiIndex &dofs, VectorInt &nodes_indices) const
get indices of nodal indices which are declared for problem but not this particular element
GaussHookFun setRuleHook
Set function to calculate integration rule.
MoFEMErrorCode getBitRefLevelOnData()
MoFEMErrorCode getNodesFieldData(EntitiesFieldData &data, const int bit_number) const
Get data on nodes.
MoFEMErrorCode getEntityColIndices(EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
MoFEMErrorCode getEntityDataOrder(const EntityType type, const FieldSpace space, boost::ptr_vector< EntitiesFieldData::EntData > &data) const
Get the entity data order.
ForcesAndSourcesCore * refinePtrFE
Element to integrate parent or child.
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 getProblemTypeRowIndices(const std::string &field_name, EntityType type, int side_number, VectorInt &indices) const
MoFEMErrorCode getProblemTypeIndices(const std::string &field_name, const NumeredDofEntity_multiIndex &dofs, EntityType type, int side_number, VectorInt &indices) const
get indices by type (generic function) which are declared for problem but not this particular element
RuleHookFun getRuleHook
Hook to get rule.
MoFEMErrorCode createDataOnElement(EntityType type)
Create a entity data on element object.
virtual MoFEMErrorCode postProcess()
function is run at the end of loop
MoFEMErrorCode copyKsp(const KspMethod &ksp)
copy data form another method
MoFEMErrorCode copyPetscData(const PetscData &petsc_data)
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredRowDofsPtr
store DOFs on rows for this problem
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredColDofsPtr
store DOFs on columns for this problem
MoFEMErrorCode copySnes(const SnesMethod &snes)
Copy snes data.
MoFEMErrorCode copyTs(const TSMethod &ts)
Copy TS solver data.
boost::shared_ptr< SideNumber > getSideNumberPtr() const