v0.14.0
Loading...
Searching...
No Matches
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.
 

Classes

struct  MoFEM::ISManager
 Section manager is used to create indexes and sections. More...
 

Functions

MoFEMErrorCode MoFEM::ISManager::sectionCreate (const std::string problem_name, PetscSection *s, const RowColData row_col=COL) const
 Create global selection.
 
SmartPetscObj< PetscSection > MoFEM::ISManager::sectionCreate (const std::string problem_name, const RowColData row_col=COL) const
 Create global selection.
 
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)
 
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)
 
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)
 
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)
 
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)
 
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)
 
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
 
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
 
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.
 
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.
 

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}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
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
virtual MPI_Comm & get_comm() const =0
Deprecated interface functions.
const MoFEM::Interface & cOre
Definition ISManager.hpp:28

◆ 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}
@ COL
@ ROW
@ MOFEM_NOT_IMPLEMENTED
Definition definitions.h:32
virtual const Problem * get_problem(const std::string problem_name) const =0
Get the problem object.
int DofIdx
Index of DOF.
Definition Types.hpp:18
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
virtual int get_comm_rank() const =0
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
static UId getLoBitNumberUId(const FieldBitNumber bit_number)
interface_DofEntity< DofEntity > interface_type_DofEntity

◆ 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}
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.

◆ 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}
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
NumeredDofEntity_multiIndex::index< Unique_mi_tag >::type NumeredDofEntityByUId
Numbered DoF multi-index by UId.

◆ 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}
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)
virtual moab::Interface & get_moab()=0
virtual EntityHandle get_field_meshset(const std::string name) const =0
get field meshset

◆ 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
281 using DofsByUId = NumeredDofEntity_multiIndex::index<Unique_mi_tag>::type;
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(
289 hi_it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
291 break;
292 case COL:
293 nb_loc_dofs = problem_ptr->getNbLocalDofsCol();
294 it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
296 hi_it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
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),
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) {
377 using DofsByUId = NumeredDofEntity_multiIndex::index<Unique_mi_tag>::type;
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}
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
static UId getLoFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
static UId getHiFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)

◆ 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}
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)

◆ 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}
int ApproximationOrder
Approximation on the entity.
Definition Types.hpp:26

◆ 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}
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
MoFEMErrorCode sectionCreate(const std::string problem_name, PetscSection *s, const RowColData row_col=COL) const
Create global selection.
Definition ISManager.cpp:20

◆ 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}
#define MOFEM_LOG_C(channel, severity, format,...)
virtual const FiniteElement_multiIndex * get_finite_elements() const =0
Get the finite elements object.
virtual const Field_multiIndex * get_fields() const =0
Get the fields object.
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
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
Definition Types.hpp:42
constexpr auto field_name