v0.14.0
Files | Functions
Index sets (IS)

Construct index sets for MoFEM problems. More...

Collaboration diagram for Index sets (IS):

Files

file  FieldBlas.hpp
 Field basic algebra.
 
file  ISManager.cpp
 IS creating.
 
file  ISManager.hpp
 Interface managing IS.
 

Functions

MoFEMErrorCode MoFEM::ISManager::sectionCreate (const std::string problem_name, PetscSection *s, const RowColData row_col=COL) const
 Create global selection. More...
 
SmartPetscObj< PetscSection > MoFEM::ISManager::sectionCreate (const std::string problem_name, const RowColData row_col=COL) const
 Create global selection. More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateProblemOrder (const std::string problem_name, RowColData rc, int min_order, int max_order, IS *is) const
 create IS for given order range (collective) More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRank (const std::string problem_name, RowColData rc, const std::string field, int min_coeff_idx, int max_coeff_idx, IS *is, Range *ents=nullptr) const
 create IS for given problem, field and rank range (collective) More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRank (const std::string problem_name, RowColData rc, const std::string field, int min_coeff_idx, int max_coeff_idx, SmartPetscObj< IS > &smart_is, Range *ents=nullptr) const
 IS for given problem, field and rank range (collective) More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRankLocal (const std::string problem_name, RowColData rc, const std::string field, int min_coeff_idx, int max_coeff_idx, IS *is, Range *ents=nullptr) const
 create IS for given problem, field and rank range (collective) More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRankLocal (const std::string problem_name, RowColData rc, const std::string field, int min_coeff_idx, int max_coeff_idx, SmartPetscObj< IS > &smart_is, Range *ents=nullptr) const
 IS for given problem, field and rank range (collective) More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndEntityType (const std::string problem_name, RowColData rc, const std::string field, EntityType low_type, EntityType hi_type, int min_coeff_idx, int max_coeff_idx, IS *is, Range *ents=nullptr) const
 create IS for given problem, field and type range (collective) More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemFieldToOtherProblemField (const std::string x_problem, const std::string x_field_name, RowColData x_rc, const std::string y_problem, const std::string y_field_name, RowColData y_rc, std::vector< int > &idx, std::vector< int > &idy) const
 create IS for give two problems and field More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemFieldToOtherProblemField (const std::string x_problem, const std::string x_field_name, RowColData x_rc, const std::string y_problem, const std::string y_field_name, RowColData y_rc, IS *ix, IS *iy) const
 create IS for give two problems and field More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemToOtherProblem (const std::string x_problem, RowColData x_rc, const std::string y_problem, RowColData y_rc, std::vector< int > &idx, std::vector< int > &idy) const
 Create is from one problem to other problem. More...
 
MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemToOtherProblem (const std::string x_problem, RowColData x_rc, const std::string y_problem, RowColData y_rc, IS *ix, IS *iy) const
 Create is from one problem to other problem. More...
 

Detailed Description

Construct index sets for MoFEM problems.

Function Documentation

◆ isCreateFromProblemFieldToOtherProblemField() [1/2]

MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemFieldToOtherProblemField ( const std::string  x_problem,
const std::string  x_field_name,
RowColData  x_rc,
const std::string  y_problem,
const std::string  y_field_name,
RowColData  y_rc,
IS *  ix,
IS *  iy 
) const

create IS for give two problems and field

Indices are sorted by global PETSc index in problem_x.

Parameters
x_problemname of problem
x_field_namename of field in problem_x
x_rcthat is ROW or COL
y_problemname of problem
y_field_namename of field in problem_y
y_rcthat is ROW or COL
Return values
ixIS indexes in problem_x (can be PETSC_NULL)
iyIS indexes in problem_y

Definition at line 577 of file ISManager.cpp.

580  {
582  const MoFEM::Interface &m_field = cOre;
583  std::vector<int> idx(0), idy(0);
585  x_problem, x_field_name, x_rc, y_problem, y_field_name, y_rc, idx, idy);
586  if (ix != PETSC_NULL) {
587  CHKERR ISCreateGeneral(m_field.get_comm(), idx.size(), &idx[0],
588  PETSC_COPY_VALUES, ix);
589  }
590  CHKERR ISCreateGeneral(m_field.get_comm(), idy.size(), &idy[0],
591  PETSC_COPY_VALUES, iy);
592  if (dEbug) {
593  ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
594  ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
595  }
597 }

◆ isCreateFromProblemFieldToOtherProblemField() [2/2]

MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemFieldToOtherProblemField ( const std::string  x_problem,
const std::string  x_field_name,
RowColData  x_rc,
const std::string  y_problem,
const std::string  y_field_name,
RowColData  y_rc,
std::vector< int > &  idx,
std::vector< int > &  idy 
) const

create IS for give two problems and field

Note that indices are ordered in ascending order of local indices in problem_y

Parameters
x_problemname of problem
x_field_namename of field in problem_x
x_rcthat is ROW or COL
y_problemname of problem
y_field_namename of field in problem_y
y_rcthat is ROW or COL
Return values
idxindexes in problem_x
idyindexes in problem_y

Definition at line 474 of file ISManager.cpp.

478  {
479  const MoFEM::Interface &m_field = cOre;
480  const Problem *px_ptr;
481  const Problem *py_ptr;
483 
484  CHKERR m_field.get_problem(x_problem, &px_ptr);
485  CHKERR m_field.get_problem(y_problem, &py_ptr);
486 
487  typedef multi_index_container<
488  boost::shared_ptr<NumeredDofEntity>,
489 
490  indexed_by<
491 
492  sequenced<>,
493 
494  ordered_non_unique<
495  tag<Composite_Ent_And_EntDofIdx_mi_tag>,
496  composite_key<
497  NumeredDofEntity,
502 
503  >>
504  NumeredDofEntity_view_multiIndex;
505 
506  NumeredDofEntity_view_multiIndex dofs_view;
507 
508  auto x_bit_number = m_field.get_field_bit_number(x_field_name);
509 
510  switch (x_rc) {
511  case ROW:
512  dofs_view.insert(
513  dofs_view.end(),
514  px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().lower_bound(
515  FieldEntity::getLoBitNumberUId(x_bit_number)),
516  px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
517  FieldEntity::getHiBitNumberUId(x_bit_number)));
518  break;
519  case COL:
520  dofs_view.insert(
521  dofs_view.end(),
522  px_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
523  FieldEntity::getLoBitNumberUId(x_bit_number)),
524  px_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
525  FieldEntity::getHiBitNumberUId(x_bit_number)));
526  break;
527  default:
528  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
529  "only makes sense for ROWS and COLS");
530  }
531 
532  decltype(py_ptr->numeredRowDofsPtr) dofs_ptr;
533  switch (y_rc) {
534  case ROW:
535  dofs_ptr = py_ptr->numeredRowDofsPtr;
536  break;
537  case COL:
538  dofs_ptr = py_ptr->numeredColDofsPtr;
539  break;
540  default:
541  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
542  "only makes sense for ROWS and COLS");
543  }
544 
545  std::map<int, int> global_dofs_map;
546  const auto y_bit_number = m_field.get_field_bit_number(y_field_name);
547  auto dit = dofs_ptr->get<Unique_mi_tag>().lower_bound(
548  FieldEntity::getLoBitNumberUId(y_bit_number));
549  auto hi_dit = dofs_ptr->get<Unique_mi_tag>().upper_bound(
550  FieldEntity::getHiBitNumberUId(y_bit_number));
551  const auto rank = m_field.get_comm_rank();
552  for (; dit != hi_dit; ++dit) {
553  if ((*dit)->getPart() == rank) {
554  auto x_dit = dofs_view.get<Composite_Ent_And_EntDofIdx_mi_tag>().find(
555  boost::make_tuple((*dit)->getEnt(), (*dit)->getEntDofIdx()));
556  if (x_dit != dofs_view.get<Composite_Ent_And_EntDofIdx_mi_tag>().end()) {
557  global_dofs_map[(*x_dit)->getPetscGlobalDofIdx()] =
558  (*dit)->getPetscGlobalDofIdx();
559  }
560  }
561  }
562 
563  idx.resize(global_dofs_map.size());
564  idy.resize(global_dofs_map.size());
565  {
566  auto ix = idx.begin();
567  auto iy = idy.begin();
568  for (auto mit = global_dofs_map.begin(); mit != global_dofs_map.end();
569  mit++, ix++, iy++) {
570  *ix = mit->first;
571  *iy = mit->second;
572  }
573  }
575 }

◆ isCreateFromProblemToOtherProblem() [1/2]

MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemToOtherProblem ( const std::string  x_problem,
RowColData  x_rc,
const std::string  y_problem,
RowColData  y_rc,
IS *  ix,
IS *  iy 
) const

Create is from one problem to other problem.

Parameters
x_problem
x_rc
y_problem
y_rc
ix
iy
Returns
MoFEMErrorCode

Definition at line 652 of file ISManager.cpp.

654  {
655  const MoFEM::Interface &m_field = cOre;
657  std::vector<int> idx(0), idy(0);
658  CHKERR isCreateFromProblemToOtherProblem(x_problem, x_rc, y_problem, y_rc,
659  idx, idy);
660  CHKERR ISCreateGeneral(m_field.get_comm(), idx.size(), &idx[0],
661  PETSC_COPY_VALUES, ix);
662  CHKERR ISCreateGeneral(m_field.get_comm(), idy.size(), &idy[0],
663  PETSC_COPY_VALUES, iy);
664  if (dEbug) {
665  ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
666  ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
667  }
669 }

◆ isCreateFromProblemToOtherProblem() [2/2]

MoFEMErrorCode MoFEM::ISManager::isCreateFromProblemToOtherProblem ( const std::string  x_problem,
RowColData  x_rc,
const std::string  y_problem,
RowColData  y_rc,
std::vector< int > &  idx,
std::vector< int > &  idy 
) const

Create is from one problem to other problem.

Parameters
x_problem
x_rc
y_problem
y_rc
idx
idy
Returns
MoFEMErrorCode

Definition at line 599 of file ISManager.cpp.

601  {
602  const MoFEM::Interface &m_field = cOre;
603  const Problem *px_ptr;
604  const Problem *py_ptr;
606  CHKERR m_field.get_problem(x_problem, &px_ptr);
607  CHKERR m_field.get_problem(y_problem, &py_ptr);
608  NumeredDofEntityByLocalIdx::iterator y_dit, hi_y_dit;
609  switch (y_rc) {
610  case ROW:
611  y_dit =
612  py_ptr->numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(0);
613  hi_y_dit =
614  py_ptr->numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(
615  py_ptr->getNbLocalDofsRow()); // should be lower
616  break;
617  case COL:
618  y_dit =
619  py_ptr->numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(0);
620  hi_y_dit =
621  py_ptr->numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(
622  py_ptr->getNbLocalDofsCol()); // should be lower
623  break;
624  default:
625  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
626  }
627  const NumeredDofEntityByUId *x_numered_dofs_by_uid;
628  switch (x_rc) {
629  case ROW:
630  x_numered_dofs_by_uid = &(px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>());
631  break;
632  case COL:
633  x_numered_dofs_by_uid = &(px_ptr->numeredColDofsPtr->get<Unique_mi_tag>());
634  break;
635  default:
636  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
637  }
638  for (; y_dit != hi_y_dit; y_dit++) {
639  if ((*y_dit)->getPart() != (unsigned int)m_field.get_comm_rank()) {
640  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "data inconsistency");
641  }
642  NumeredDofEntityByUId::iterator x_dit;
643  x_dit = x_numered_dofs_by_uid->find((*y_dit)->getLocalUniqueId());
644  if (x_dit == x_numered_dofs_by_uid->end())
645  continue;
646  idx.push_back((*x_dit)->getPetscGlobalDofIdx());
647  idy.push_back((*y_dit)->getPetscGlobalDofIdx());
648  }
650 }

◆ isCreateProblemFieldAndEntityType()

MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndEntityType ( const std::string  problem_name,
RowColData  rc,
const std::string  field,
EntityType  low_type,
EntityType  hi_type,
int  min_coeff_idx,
int  max_coeff_idx,
IS *  is,
Range ents = nullptr 
) const

create IS for given problem, field and type range (collective)

Parameters
problem
rc
field
low_type
hi_type
min_coeff_idx
max_coeff_idx
is
ents
Returns
MoFEMErrorCode

Definition at line 456 of file ISManager.cpp.

459  {
460  const MoFEM::Interface &m_field = cOre;
462  EntityHandle field_meshset = m_field.get_field_meshset(field);
463  Range ents;
464  for (; low_type <= hi_type; ++low_type)
465  CHKERR m_field.get_moab().get_entities_by_type(field_meshset, low_type,
466  ents, true);
467  if (ents_ptr)
468  ents = intersect(ents, *ents_ptr);
469  CHKERR isCreateProblemFieldAndRank(problem_name, rc, field, min_coeff_idx,
470  max_coeff_idx, is, &ents);
472 }

◆ isCreateProblemFieldAndRank() [1/2]

MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRank ( const std::string  problem_name,
RowColData  rc,
const std::string  field,
int  min_coeff_idx,
int  max_coeff_idx,
IS *  is,
Range ents = nullptr 
) const

create IS for given problem, field and rank range (collective)

Parameters
problemname
rcROW or COL
fieldname
min_coeff_idx
max_coeff_idx
entsif not null get dofs only on given entities
Return values
isout value

Definition at line 272 of file ISManager.cpp.

274  {
275  const MoFEM::Interface &m_field = cOre;
276  const Problem *problem_ptr;
278  CHKERR m_field.get_problem(problem_name, &problem_ptr);
279  const auto bit_number = m_field.get_field_bit_number(field);
280 
282  DofsByUId::iterator it, hi_it;
283  int nb_loc_dofs;
284  switch (rc) {
285  case ROW:
286  nb_loc_dofs = problem_ptr->getNbLocalDofsRow();
287  it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().lower_bound(
288  FieldEntity::getLoBitNumberUId(bit_number));
289  hi_it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
290  FieldEntity::getHiBitNumberUId(bit_number));
291  break;
292  case COL:
293  nb_loc_dofs = problem_ptr->getNbLocalDofsCol();
294  it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
295  FieldEntity::getLoBitNumberUId(bit_number));
296  hi_it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
297  FieldEntity::getHiBitNumberUId(bit_number));
298  break;
299  default:
300  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
301  }
302 
303  std::vector<int> idx_vec;
304  idx_vec.reserve(std::distance(it, hi_it));
305  for (; it != hi_it; ++it) {
306 
307  auto true_if_dof_on_entity = [&]() {
308  if (ents_ptr) {
309  return ents_ptr->find((*it)->getEnt()) != ents_ptr->end();
310  } else {
311  return true;
312  }
313  };
314 
315  auto check = [&]() {
316  const auto coeff_idx = (*it)->getDofCoeffIdx();
317  if (
318 
319  (*it)->getPetscLocalDofIdx() >= nb_loc_dofs ||
320 
321  coeff_idx < min_coeff_idx || coeff_idx > max_coeff_idx
322 
323  )
324  return false;
325  else
326  return true;
327  };
328 
329  if (check()) {
330  if (true_if_dof_on_entity()) {
331  idx_vec.emplace_back((*it)->getPetscGlobalDofIdx());
332  }
333  }
334  }
335 
336  int *id;
337  CHKERR PetscMalloc(idx_vec.size() * sizeof(int), &id);
338  std::copy(idx_vec.begin(), idx_vec.end(), id);
339  CHKERR ISCreateGeneral(m_field.get_comm(), idx_vec.size(), id,
340  PETSC_OWN_POINTER, is);
341 
343 }

◆ isCreateProblemFieldAndRank() [2/2]

MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRank ( const std::string  problem_name,
RowColData  rc,
const std::string  field,
int  min_coeff_idx,
int  max_coeff_idx,
SmartPetscObj< IS > &  smart_is,
Range ents = nullptr 
) const

IS for given problem, field and rank range (collective)

Parameters
problemname
rcROW or COL
fieldname
min_coeff_idx
max_coeff_idx
entsif not null get dofs only on given entities
Return values
isout value

Definition at line 345 of file ISManager.cpp.

348  {
350  IS is;
351  CHKERR isCreateProblemFieldAndRank(problem_name, rc, field, min_coeff_idx,
352  max_coeff_idx, &is, ents_ptr);
353  smart_is = SmartPetscObj<IS>(is);
355 }

◆ isCreateProblemFieldAndRankLocal() [1/2]

MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRankLocal ( const std::string  problem_name,
RowColData  rc,
const std::string  field,
int  min_coeff_idx,
int  max_coeff_idx,
IS *  is,
Range ents = nullptr 
) const

create IS for given problem, field and rank range (collective)

Parameters
problemname
rcROW or COL
fieldname
min_coeff_idx
max_coeff_idx
entsif not null get dofs only on given entities
Return values
isout value

Definition at line 357 of file ISManager.cpp.

359  {
360  const MoFEM::Interface &m_field = cOre;
361  const Problem *problem_ptr;
363  CHKERR m_field.get_problem(problem_name, &problem_ptr);
364  const auto bit_number = m_field.get_field_bit_number(field);
365 
366  auto get_low_hi_uid = [&]() {
367  return std::make_pair(FieldEntity::getLoBitNumberUId(bit_number),
368  FieldEntity::getHiBitNumberUId(bit_number));
369  };
370 
371  auto get_low_hi_uid_by_entities = [&](auto f, auto s) {
372  return std::make_pair(DofEntity::getLoFieldEntityUId(bit_number, f),
373  DofEntity::getHiFieldEntityUId(bit_number, s));
374  };
375 
376  auto get_low_hi = [&](auto lo_uid, auto hi_uid) {
378  DofsByUId::iterator it, hi_it;
379  switch (rc) {
380  case ROW:
381  it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().lower_bound(
382  lo_uid);
383  hi_it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
384  hi_uid);
385  break;
386  case COL:
387  it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
388  lo_uid);
389  hi_it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
390  hi_uid);
391  break;
392  default:
393  THROW_MESSAGE("not implemented");
394  }
395  return std::make_pair(it, hi_it);
396  };
397 
398  auto check = [&](auto it) {
399  const auto coeff_idx = (*it)->getDofCoeffIdx();
400  if (
401 
402  coeff_idx < min_coeff_idx || coeff_idx > max_coeff_idx
403 
404  )
405  return false;
406  else
407  return true;
408  };
409 
410  auto emplace_indices = [&](auto it, auto hi_it, auto &idx_vec) {
411  for (; it != hi_it; ++it) {
412  if (check(it))
413  idx_vec.emplace_back((*it)->getPetscLocalDofIdx());
414  }
415  };
416 
417  auto [lo_uid, hi_uid] = get_low_hi_uid();
418  auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
419  std::vector<int> idx_vec;
420  idx_vec.reserve(std::distance(lo, hi));
421 
422  if (ents_ptr) {
423  for (auto pit = ents_ptr->const_pair_begin();
424  pit != ents_ptr->const_pair_end(); ++pit) {
425  auto [lo_uid, hi_uid] =
426  get_low_hi_uid_by_entities(pit->first, pit->second);
427  auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
428  emplace_indices(lo, hi, idx_vec);
429  }
430  } else {
431  emplace_indices(lo, hi, idx_vec);
432  }
433 
434  int *id;
435  CHKERR PetscMalloc(idx_vec.size() * sizeof(int), &id);
436  std::copy(idx_vec.begin(), idx_vec.end(), id);
437  CHKERR ISCreateGeneral(PETSC_COMM_SELF, idx_vec.size(), id, PETSC_OWN_POINTER,
438  is);
439 
441 }

◆ isCreateProblemFieldAndRankLocal() [2/2]

MoFEMErrorCode MoFEM::ISManager::isCreateProblemFieldAndRankLocal ( const std::string  problem_name,
RowColData  rc,
const std::string  field,
int  min_coeff_idx,
int  max_coeff_idx,
SmartPetscObj< IS > &  smart_is,
Range ents = nullptr 
) const

IS for given problem, field and rank range (collective)

Parameters
problemname
rcROW or COL
fieldname
min_coeff_idx
max_coeff_idx
entsif not null get dofs only on given entities
Return values
isout value

Definition at line 443 of file ISManager.cpp.

446  {
448  IS is;
449  CHKERR isCreateProblemFieldAndRankLocal(problem_name, rc, field,
450  min_coeff_idx, max_coeff_idx, &is,
451  ents_ptr);
452  smart_is = SmartPetscObj<IS>(is);
454 }

◆ isCreateProblemOrder()

MoFEMErrorCode MoFEM::ISManager::isCreateProblemOrder ( const std::string  problem_name,
RowColData  rc,
int  min_order,
int  max_order,
IS *  is 
) const

create IS for given order range (collective)

Parameters
problemname
rcROW or COL
min_order
max_order
Return values
isout value

Definition at line 204 of file ISManager.cpp.

206  {
207  const MoFEM::Interface &m_field = cOre;
208  const Problem *problem_ptr;
210  CHKERR m_field.get_problem(problem_name, &problem_ptr);
211 
212  typedef multi_index_container<
213  boost::shared_ptr<NumeredDofEntity>,
214 
215  indexed_by<
216 
217  sequenced<>,
218 
219  ordered_non_unique<
220  tag<Order_mi_tag>,
223 
224  >>
225  NumeredDofEntity_order_view_multiIndex;
226 
227  const int rank = m_field.get_comm_rank();
228 
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));
233  };
234 
235  switch (rc) {
236  case ROW:
237  insert_part_range(problem_ptr->numeredRowDofsPtr->get<Part_mi_tag>());
238  break;
239  case COL:
240  insert_part_range(problem_ptr->numeredColDofsPtr->get<Part_mi_tag>());
241  break;
242  default:
243  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
244  }
245 
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);
249  int *id;
250  CHKERR PetscMalloc(size * sizeof(int), &id);
251  int *id_it = id;
252  for (; lo != hi; ++lo, ++id_it)
253  *id_it = (*lo)->getPetscGlobalDofIdx();
254  sort(id, &id[size]);
255 
256  CHKERR ISCreateGeneral(PETSC_COMM_WORLD, size, id, PETSC_OWN_POINTER, is);
257 
259 }

◆ sectionCreate() [1/2]

SmartPetscObj< PetscSection > MoFEM::ISManager::sectionCreate ( const std::string  problem_name,
const RowColData  row_col = COL 
) const

Create global selection.

Create section for given problem, such that points are sorted by UId, and number of dofs on point is equal to number of dofs on entity

It takes all fields

Parameters
problem_name
fields_list
s
row_colROE or COL, default is ROW
Returns
error code

Definition at line 140 of file ISManager.cpp.

141  {
142 
143  PetscSection s;
144  CHK_THROW_MESSAGE(sectionCreate(problem_name, &s, row_col),
145  "Section not created");
146  return SmartPetscObj<PetscSection>(s, false);
147 }

◆ sectionCreate() [2/2]

MoFEMErrorCode MoFEM::ISManager::sectionCreate ( const std::string  problem_name,
PetscSection *  s,
const RowColData  row_col = COL 
) const

Create global selection.

Create section for given problem, such that points are sorted by UId, and number of dofs on point is equal to number of dofs on entity

It takes all fields

Parameters
problem_name
fields_list
s
row_colROE or COL, default is ROW
Returns
error code

Definition at line 20 of file ISManager.cpp.

22  {
23  const MoFEM::Interface &m_field = cOre;
24  const Problem *problem_ptr = m_field.get_problem(problem_name);
25  auto fields_ptr = m_field.get_fields();
26  auto fe_ptr = m_field.get_finite_elements();
28  boost::shared_ptr<NumeredDofEntity_multiIndex> dofs;
29  BitFieldId fields_ids(0);
30  switch (row_col) {
31  case ROW:
32  dofs = problem_ptr->numeredRowDofsPtr;
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();
36  }
37  }
38  break;
39  case COL:
40  dofs = problem_ptr->numeredColDofsPtr;
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();
44  }
45  }
46  break;
47  default:
48  SETERRQ(PETSC_COMM_WORLD, MOFEM_DATA_INCONSISTENCY,
49  "Has to be ROW or COLUMN");
50  }
51  // get fields names on the problem
52  map<std::string, std::pair<int, int>> fields_map;
53  {
54  int field = 0;
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();
59  }
60  }
61  }
62  const int proc = m_field.get_comm_rank();
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,
68  mit->second.second);
69  }
70  // determine number of points
71  int nb_charts = 0;
72  {
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) {
79  ++dit;
80  }
81  ++nb_charts;
82  } else {
83  ++dit;
84  }
85  }
86  }
87  // get layout, i.e. chart
88  PetscLayout layout;
89  CHKERR PetscLayoutCreate(PETSC_COMM_WORLD, &layout);
90  CHKERR PetscLayoutSetBlockSize(layout, 1);
91  CHKERR PetscLayoutSetLocalSize(layout, nb_charts);
92  CHKERR PetscLayoutSetUp(layout);
93  int rstart, rend;
94  CHKERR PetscLayoutGetRange(layout, &rstart, &rend);
95  CHKERR PetscLayoutDestroy(&layout);
96  CHKERR PetscSectionSetChart(*s, rstart, rend);
97 
98  // loop of all dofs
99  {
100  auto dit = dofs->begin();
101  auto hi_dit = dofs->end();
102  int point = rstart;
103  for (; dit != hi_dit;) {
104  if (static_cast<int>(dit->get()->getPart()) == proc) {
105 
106  const auto &field_name = dit->get()->getName();
107 
108  int dd = 0;
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();
112  if (loc_idx >= 0)
113  ++dd;
114  ++dit;
115  }
116 
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());
120  } else {
121  CHKERR PetscSectionAddDof(*s, point, dd);
122  int field = fields_map.at(field_name).first;
123  CHKERR PetscSectionSetFieldDof(*s, point, field, dd);
124  }
125 
126  ++point;
127 
128  } else {
129  ++dit;
130  }
131  }
132  }
133  // cerr << "done " << proc << endl;
134  CHKERR PetscSectionSetUp(*s);
135  // cerr << "end " << proc << endl;
137 }
MoFEM::ISManager::isCreateProblemFieldAndRank
MoFEMErrorCode isCreateProblemFieldAndRank(const std::string problem_name, RowColData rc, const std::string field, int min_coeff_idx, int max_coeff_idx, IS *is, Range *ents=nullptr) const
create IS for given problem, field and rank range (collective)
Definition: ISManager.cpp:272
EntityHandle
MoFEM::CoreInterface::get_comm
virtual MPI_Comm & get_comm() const =0
CHK_THROW_MESSAGE
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
Definition: definitions.h:596
MoFEM::ISManager::isCreateFromProblemFieldToOtherProblemField
MoFEMErrorCode isCreateFromProblemFieldToOtherProblemField(const std::string x_problem, const std::string x_field_name, RowColData x_rc, const std::string y_problem, const std::string y_field_name, RowColData y_rc, std::vector< int > &idx, std::vector< int > &idy) const
create IS for give two problems and field
Definition: ISManager.cpp:474
MoFEM::CoreInterface::get_field_bit_number
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
MoFEM::NumeredDofEntity::interface_type_DofEntity
interface_DofEntity< DofEntity > interface_type_DofEntity
Definition: DofsMultiIndices.hpp:232
MoFEM::CoreInterface::get_comm_rank
virtual int get_comm_rank() const =0
MoFEM::Types::BitFieldId
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
Definition: Types.hpp:42
MoFEM::CoreInterface::get_problem
virtual const Problem * get_problem(const std::string problem_name) const =0
Get the problem object.
MoFEM::CoreInterface::get_finite_elements
virtual const FiniteElement_multiIndex * get_finite_elements() const =0
Get the finite elements object.
MoFEM::CoreInterface::get_field_meshset
virtual EntityHandle get_field_meshset(const std::string name) const =0
get field meshset
THROW_MESSAGE
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Definition: definitions.h:561
MoFEM::DeprecatedCoreInterface
Deprecated interface functions.
Definition: DeprecatedCoreInterface.hpp:16
ROW
@ ROW
Definition: definitions.h:123
MoFEM::NumeredDofEntityByUId
NumeredDofEntity_multiIndex::index< Unique_mi_tag >::type NumeredDofEntityByUId
Numbered DoF multi-index by UId.
Definition: DofsMultiIndices.hpp:476
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:535
MoFEM::CoreInterface::get_moab
virtual moab::Interface & get_moab()=0
MoFEM::ISManager::cOre
const MoFEM::Interface & cOre
Definition: ISManager.hpp:28
MOFEM_LOG_C
#define MOFEM_LOG_C(channel, severity, format,...)
Definition: LogManager.hpp:311
convert.type
type
Definition: convert.py:64
MoFEM::FieldEntity::getLoBitNumberUId
static UId getLoBitNumberUId(const FieldBitNumber bit_number)
Definition: FieldEntsMultiIndices.hpp:222
COL
@ COL
Definition: definitions.h:123
MoFEM::interface_DofEntity< DofEntity >::getEnt
EntityHandle getEnt() const
Definition: DofsMultiIndices.hpp:192
MoFEM::ISManager::dEbug
bool dEbug
Definition: ISManager.hpp:29
MoFEM::ISManager::isCreateProblemFieldAndRankLocal
MoFEMErrorCode isCreateProblemFieldAndRankLocal(const std::string problem_name, RowColData rc, const std::string field, int min_coeff_idx, int max_coeff_idx, IS *is, Range *ents=nullptr) const
create IS for given problem, field and rank range (collective)
Definition: ISManager.cpp:357
MoFEM::DofEntity::getLoFieldEntityUId
static UId getLoFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
Definition: DofsMultiIndices.hpp:69
field_name
constexpr auto field_name
Definition: poisson_2d_homogeneous.cpp:13
MoFEM::CoreInterface::get_fields
virtual const Field_multiIndex * get_fields() const =0
Get the fields object.
Range
FTensor::dd
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
Definition: ddTensor0.hpp:33
MoFEM::Types::ApproximationOrder
int ApproximationOrder
Approximation on the entity.
Definition: Types.hpp:26
MoFEM::interface_DofEntity< DofEntity >::getDofOrder
ApproximationOrder getDofOrder() const
Definition: DofsMultiIndices.hpp:195
MoFEM::DofEntity::getHiFieldEntityUId
static UId getHiFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
Definition: DofsMultiIndices.hpp:75
HenckyOps::f
auto f
Definition: HenckyOps.hpp:15
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
MoFEM::FieldEntity::getHiBitNumberUId
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
Definition: FieldEntsMultiIndices.hpp:228
MoFEM::ISManager::isCreateFromProblemToOtherProblem
MoFEMErrorCode isCreateFromProblemToOtherProblem(const std::string x_problem, RowColData x_rc, const std::string y_problem, RowColData y_rc, std::vector< int > &idx, std::vector< int > &idy) const
Create is from one problem to other problem.
Definition: ISManager.cpp:599
MoFEM::ISManager::sectionCreate
MoFEMErrorCode sectionCreate(const std::string problem_name, PetscSection *s, const RowColData row_col=COL) const
Create global selection.
Definition: ISManager.cpp:20
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
MOFEM_NOT_IMPLEMENTED
@ MOFEM_NOT_IMPLEMENTED
Definition: definitions.h:32
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
MoFEM::interface_DofEntity< DofEntity >::getEntDofIdx
DofIdx getEntDofIdx() const
Definition: DofsMultiIndices.hpp:186
MoFEM::Types::DofIdx
int DofIdx
Index of DOF.
Definition: Types.hpp:18