18 : cOre(const_cast<
MoFEM::
Core &>(core)), dEbug(false) {}
28 boost::shared_ptr<NumeredDofEntity_multiIndex> dofs;
33 for (
auto fit = fe_ptr->begin(); fit != fe_ptr->end(); fit++) {
34 if ((fit->get()->getId() & problem_ptr->
getBitFEId()).any()) {
35 fields_ids |= fit->get()->getBitFieldIdRow();
41 for (
auto fit = fe_ptr->begin(); fit != fe_ptr->end(); fit++) {
42 if ((fit->get()->getId() & problem_ptr->
getBitFEId()).any()) {
43 fields_ids |= fit->get()->getBitFieldIdCol();
49 "Has to be ROW or COLUMN");
52 map<std::string, std::pair<int, int>> fields_map;
55 for (
auto fit = fields_ptr->begin(); fit != fields_ptr->end(); fit++) {
56 if ((fit->get()->getId() & fields_ids).any()) {
57 fields_map[fit->get()->getName()].first = field++;
58 fields_map[fit->get()->getName()].second = fit->get()->getNbOfCoeffs();
63 CHKERR PetscSectionCreate(PETSC_COMM_WORLD, s);
64 CHKERR PetscSectionSetNumFields(*s, fields_map.size());
65 for (
auto mit = fields_map.begin(); mit != fields_map.end(); mit++) {
66 CHKERR PetscSectionSetFieldName(*s, mit->second.first, mit->first.c_str());
67 CHKERR PetscSectionSetFieldComponents(*s, mit->second.first,
73 auto dit = dofs->begin();
74 auto hi_dit = dofs->end();
75 for (; dit != hi_dit;) {
76 if (
static_cast<int>(dit->get()->getPart()) == proc) {
77 const auto &ent_uid = dit->get()->getEntLocalUniqueId();
78 while (dit != hi_dit && dit->get()->getEntLocalUniqueId() == ent_uid) {
89 CHKERR PetscLayoutCreate(PETSC_COMM_WORLD, &layout);
90 CHKERR PetscLayoutSetBlockSize(layout, 1);
91 CHKERR PetscLayoutSetLocalSize(layout, nb_charts);
92 CHKERR PetscLayoutSetUp(layout);
94 CHKERR PetscLayoutGetRange(layout, &rstart, &rend);
95 CHKERR PetscLayoutDestroy(&layout);
96 CHKERR PetscSectionSetChart(*s, rstart, rend);
100 auto dit = dofs->begin();
101 auto hi_dit = dofs->end();
103 for (; dit != hi_dit;) {
104 if (
static_cast<int>(dit->get()->getPart()) == proc) {
106 const auto &
field_name = dit->get()->getName();
109 const auto &ent_uid = dit->get()->getEntLocalUniqueId();
110 while (dit != hi_dit && dit->get()->getEntLocalUniqueId() == ent_uid) {
111 const DofIdx loc_idx = dit->get()->getPetscLocalDofIdx();
117 if (fields_map.find(
field_name) == fields_map.end()) {
118 MOFEM_LOG_C(
"SELF", Sev::warning,
"Warning: Field %s not found",
119 dit->get()->getName().c_str());
121 CHKERR PetscSectionAddDof(*s, point,
dd);
123 CHKERR PetscSectionSetFieldDof(*s, point, field,
dd);
134 CHKERR PetscSectionSetUp(*s);
145 "Section not created");
171 auto lo = dofs_ptr->get<
Part_mi_tag>().lower_bound(rank);
172 auto hi = dofs_ptr->get<
Part_mi_tag>().upper_bound(rank);
173 const int size = std::distance(lo, hi);
176 CHKERR PetscMalloc(size *
sizeof(
int), &
id);
178 for (; lo != hi; ++lo, ++id_it)
179 *id_it = (*lo)->getPetscGlobalDofIdx();
182 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, size,
id, PETSC_OWN_POINTER, is);
206 int max_order, IS *is)
const {
212 typedef multi_index_container<
213 boost::shared_ptr<NumeredDofEntity>,
225 NumeredDofEntity_order_view_multiIndex;
229 NumeredDofEntity_order_view_multiIndex dofs_by_order;
230 auto insert_part_range = [&dofs_by_order, rank](
auto &dofs) {
231 dofs_by_order.insert(dofs_by_order.end(), dofs.lower_bound(rank),
232 dofs.upper_bound(rank));
246 auto lo = dofs_by_order.get<
Order_mi_tag>().lower_bound(min_order);
247 auto hi = dofs_by_order.get<
Order_mi_tag>().upper_bound(max_order);
248 const int size = std::distance(lo, hi);
250 CHKERR PetscMalloc(size *
sizeof(
int), &
id);
252 for (; lo != hi; ++lo, ++id_it)
253 *id_it = (*lo)->getPetscGlobalDofIdx();
256 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, size,
id, PETSC_OWN_POINTER, is);
273 const std::string problem_name,
RowColData rc,
const std::string field,
274 int min_coeff_idx,
int max_coeff_idx, IS *is,
Range *ents_ptr)
const {
282 DofsByUId::iterator it, hi_it;
303 std::vector<int> idx_vec;
304 idx_vec.reserve(std::distance(it, hi_it));
305 for (; it != hi_it; ++it) {
307 auto true_if_dof_on_entity = [&]() {
309 return ents_ptr->find((*it)->getEnt()) != ents_ptr->end();
316 const auto coeff_idx = (*it)->getDofCoeffIdx();
319 (*it)->getPetscLocalDofIdx() >= nb_loc_dofs ||
321 coeff_idx < min_coeff_idx || coeff_idx > max_coeff_idx
330 if (true_if_dof_on_entity()) {
331 idx_vec.emplace_back((*it)->getPetscGlobalDofIdx());
337 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
338 std::copy(idx_vec.begin(), idx_vec.end(),
id);
340 PETSC_OWN_POINTER, is);
346 const std::string problem_name,
RowColData rc,
const std::string field,
348 Range *ents_ptr)
const {
352 max_coeff_idx, &is, ents_ptr);
358 const std::vector<boost::weak_ptr<NumeredDofEntity>> &dofs_vec,
362 std::vector<int> idx_vec;
363 idx_vec.reserve(dofs_vec.size());
364 for (
auto &dof : dofs_vec) {
365 if (
auto d = dof.lock()) {
366 idx_vec.emplace_back(
d->getPetscGlobalDofIdx());
372 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
373 std::copy(idx_vec.begin(), idx_vec.end(),
id);
374 CHKERR ISCreateGeneral(comm, idx_vec.size(),
id, PETSC_OWN_POINTER, &is_raw);
382 const std::vector<boost::weak_ptr<NumeredDofEntity>> &dofs_vec,
386 std::vector<int> idx_vec;
387 idx_vec.reserve(dofs_vec.size());
388 for (
auto &dof : dofs_vec) {
389 if (
auto d = dof.lock()) {
390 idx_vec.emplace_back(
d->getPetscLocalDofIdx());
396 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
397 std::copy(idx_vec.begin(), idx_vec.end(),
id);
398 CHKERR ISCreateGeneral(PETSC_COMM_SELF, idx_vec.size(),
id, PETSC_OWN_POINTER,
407 const std::string problem_name,
RowColData rc,
const std::string field,
408 int min_coeff_idx,
int max_coeff_idx, IS *is,
Range *ents_ptr)
const {
415 auto get_low_hi_uid = [&]() {
420 auto get_low_hi_uid_by_entities = [&](
auto f,
auto s) {
425 auto get_low_hi = [&](
auto lo_uid,
auto hi_uid) {
427 DofsByUId::iterator it, hi_it;
444 return std::make_pair(it, hi_it);
447 auto check = [&](
auto it) {
448 const auto coeff_idx = (*it)->getDofCoeffIdx();
451 coeff_idx < min_coeff_idx || coeff_idx > max_coeff_idx
459 auto emplace_indices = [&](
auto it,
auto hi_it,
auto &idx_vec) {
460 for (; it != hi_it; ++it) {
462 idx_vec.emplace_back((*it)->getPetscLocalDofIdx());
466 auto [lo_uid, hi_uid] = get_low_hi_uid();
467 auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
468 std::vector<int> idx_vec;
469 idx_vec.reserve(std::distance(lo, hi));
472 for (
auto pit = ents_ptr->const_pair_begin();
473 pit != ents_ptr->const_pair_end(); ++pit) {
474 auto [lo_uid, hi_uid] =
475 get_low_hi_uid_by_entities(pit->first, pit->second);
476 auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
477 emplace_indices(lo, hi, idx_vec);
480 emplace_indices(lo, hi, idx_vec);
484 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
485 std::copy(idx_vec.begin(), idx_vec.end(),
id);
486 CHKERR ISCreateGeneral(PETSC_COMM_SELF, idx_vec.size(),
id, PETSC_OWN_POINTER,
493 const std::string problem_name,
RowColData rc,
const std::string field,
495 Range *ents_ptr)
const {
499 min_coeff_idx, max_coeff_idx, &is,
506 const std::string problem_name,
RowColData rc,
const std::string field,
507 EntityType low_type, EntityType hi_type,
int min_coeff_idx,
508 int max_coeff_idx, IS *is,
Range *ents_ptr)
const {
513 for (; low_type <= hi_type; ++low_type)
514 CHKERR m_field.
get_moab().get_entities_by_type(field_meshset, low_type,
517 ents = intersect(ents, *ents_ptr);
519 max_coeff_idx, is, &ents);
524 const std::string x_problem,
const std::string x_field_name,
526 const std::string y_field_name,
RowColData y_rc, std::vector<int> &idx,
527 std::vector<int> &idy)
const {
536 typedef multi_index_container<
537 boost::shared_ptr<NumeredDofEntity>,
544 tag<Composite_Ent_And_EntDofIdx_mi_tag>,
553 NumeredDofEntity_view_multiIndex;
555 NumeredDofEntity_view_multiIndex dofs_view;
578 "only makes sense for ROWS and COLS");
591 "only makes sense for ROWS and COLS");
594 std::map<int, int> global_dofs_map;
601 for (; dit != hi_dit; ++dit) {
602 if ((*dit)->getPart() == rank) {
604 boost::make_tuple((*dit)->getEnt(), (*dit)->getEntDofIdx()));
606 global_dofs_map[(*x_dit)->getPetscGlobalDofIdx()] =
607 (*dit)->getPetscGlobalDofIdx();
612 idx.resize(global_dofs_map.size());
613 idy.resize(global_dofs_map.size());
615 auto ix = idx.begin();
616 auto iy = idy.begin();
617 for (
auto mit = global_dofs_map.begin(); mit != global_dofs_map.end();
627 const std::string x_problem,
const std::string x_field_name,
629 const std::string y_field_name,
RowColData y_rc, IS *ix, IS *iy)
const {
632 std::vector<int> idx(0), idy(0);
634 x_problem, x_field_name, x_rc, y_problem, y_field_name, y_rc, idx, idy);
635 if (ix != PETSC_NULL) {
637 PETSC_COPY_VALUES, ix);
640 PETSC_COPY_VALUES, iy);
642 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
643 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
649 const std::string x_problem,
RowColData x_rc,
const std::string y_problem,
650 RowColData y_rc, std::vector<int> &idx, std::vector<int> &idy)
const {
657 NumeredDofEntityByLocalIdx::iterator y_dit, hi_y_dit;
687 for (; y_dit != hi_y_dit; y_dit++) {
688 if ((*y_dit)->getPart() != (
unsigned int)m_field.
get_comm_rank()) {
691 NumeredDofEntityByUId::iterator x_dit;
692 x_dit = x_numered_dofs_by_uid->find((*y_dit)->getLocalUniqueId());
693 if (x_dit == x_numered_dofs_by_uid->end())
695 idx.push_back((*x_dit)->getPetscGlobalDofIdx());
696 idy.push_back((*y_dit)->getPetscGlobalDofIdx());
702 const std::string x_problem,
RowColData x_rc,
const std::string y_problem,
706 std::vector<int> idx(0), idy(0);
710 PETSC_COPY_VALUES, ix);
712 PETSC_COPY_VALUES, iy);
714 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
715 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);