v0.15.0
Loading...
Searching...
No Matches
Files | Classes | 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.
 

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::isCreateProblemBrokenFieldAndRank (const std::vector< boost::weak_ptr< NumeredDofEntity > > &dofs_vec, SmartPetscObj< IS > &smart_is, MPI_Comm comm=PETSC_COMM_SELF) const
 IS for given problem, field and rank range (collective)
 
MoFEMErrorCode MoFEM::ISManager::isCreateProblemBrokenFieldAndRankLocal (const std::vector< boost::weak_ptr< NumeredDofEntity > > &dofs_vec, SmartPetscObj< IS > &smart_is) 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

#include <src/interfaces/ISManager.hpp>

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_NULLPTR)
iyIS indexes in problem_y

Definition at line 629 of file ISManager.cpp.

632 {
634 const MoFEM::Interface &m_field = cOre;
635 std::vector<int> idx(0), idy(0);
637 x_problem, x_field_name, x_rc, y_problem, y_field_name, y_rc, idx, idy);
638 if (ix != PETSC_NULLPTR) {
639 CHKERR ISCreateGeneral(m_field.get_comm(), idx.size(), &idx[0],
640 PETSC_COPY_VALUES, ix);
641 }
642 CHKERR ISCreateGeneral(m_field.get_comm(), idy.size(), &idy[0],
643 PETSC_COPY_VALUES, iy);
644 if (dEbug) {
645 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
646 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
647 }
649}
#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

#include <src/interfaces/ISManager.hpp>

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 526 of file ISManager.cpp.

530 {
531 const MoFEM::Interface &m_field = cOre;
532 const Problem *px_ptr;
533 const Problem *py_ptr;
535
536 CHKERR m_field.get_problem(x_problem, &px_ptr);
537 CHKERR m_field.get_problem(y_problem, &py_ptr);
538
539 typedef multi_index_container<
540 boost::shared_ptr<NumeredDofEntity>,
541
542 indexed_by<
543
544 sequenced<>,
545
546 ordered_non_unique<
547 tag<Composite_Ent_And_EntDofIdx_mi_tag>,
548 composite_key<
549 NumeredDofEntity,
554
555 >>
556 NumeredDofEntity_view_multiIndex;
557
558 NumeredDofEntity_view_multiIndex dofs_view;
559
560 auto x_bit_number = m_field.get_field_bit_number(x_field_name);
561
562 switch (x_rc) {
563 case ROW:
564 dofs_view.insert(
565 dofs_view.end(),
566 px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().lower_bound(
567 FieldEntity::getLoBitNumberUId(x_bit_number)),
568 px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
569 FieldEntity::getHiBitNumberUId(x_bit_number)));
570 break;
571 case COL:
572 dofs_view.insert(
573 dofs_view.end(),
574 px_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
575 FieldEntity::getLoBitNumberUId(x_bit_number)),
576 px_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
577 FieldEntity::getHiBitNumberUId(x_bit_number)));
578 break;
579 default:
580 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
581 "only makes sense for ROWS and COLS");
582 }
583
584 decltype(py_ptr->numeredRowDofsPtr) dofs_ptr;
585 switch (y_rc) {
586 case ROW:
587 dofs_ptr = py_ptr->numeredRowDofsPtr;
588 break;
589 case COL:
590 dofs_ptr = py_ptr->numeredColDofsPtr;
591 break;
592 default:
593 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
594 "only makes sense for ROWS and COLS");
595 }
596
597 std::map<int, int> global_dofs_map;
598 const auto y_bit_number = m_field.get_field_bit_number(y_field_name);
599 auto dit = dofs_ptr->get<Unique_mi_tag>().lower_bound(
600 FieldEntity::getLoBitNumberUId(y_bit_number));
601 auto hi_dit = dofs_ptr->get<Unique_mi_tag>().upper_bound(
602 FieldEntity::getHiBitNumberUId(y_bit_number));
603 const auto rank = m_field.get_comm_rank();
604 for (; dit != hi_dit; ++dit) {
605 if ((*dit)->getPart() == rank) {
606 auto x_dit = dofs_view.get<Composite_Ent_And_EntDofIdx_mi_tag>().find(
607 boost::make_tuple((*dit)->getEnt(), (*dit)->getEntDofIdx()));
608 if (x_dit != dofs_view.get<Composite_Ent_And_EntDofIdx_mi_tag>().end()) {
609 global_dofs_map[(*x_dit)->getPetscGlobalDofIdx()] =
610 (*dit)->getPetscGlobalDofIdx();
611 }
612 }
613 }
614
615 idx.resize(global_dofs_map.size());
616 idy.resize(global_dofs_map.size());
617 {
618 auto ix = idx.begin();
619 auto iy = idy.begin();
620 for (auto mit = global_dofs_map.begin(); mit != global_dofs_map.end();
621 mit++, ix++, iy++) {
622 *ix = mit->first;
623 *iy = mit->second;
624 }
625 }
627}
@ 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

#include <src/interfaces/ISManager.hpp>

Create is from one problem to other problem.

Parameters
x_problem
x_rc
y_problem
y_rc
ix
iy
Returns
MoFEMErrorCode

Definition at line 704 of file ISManager.cpp.

706 {
707 const MoFEM::Interface &m_field = cOre;
709 std::vector<int> idx(0), idy(0);
710 CHKERR isCreateFromProblemToOtherProblem(x_problem, x_rc, y_problem, y_rc,
711 idx, idy);
712 CHKERR ISCreateGeneral(m_field.get_comm(), idx.size(), &idx[0],
713 PETSC_COPY_VALUES, ix);
714 CHKERR ISCreateGeneral(m_field.get_comm(), idy.size(), &idy[0],
715 PETSC_COPY_VALUES, iy);
716 if (dEbug) {
717 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
718 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
719 }
721}
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

#include <src/interfaces/ISManager.hpp>

Create is from one problem to other problem.

Parameters
x_problem
x_rc
y_problem
y_rc
idx
idy
Returns
MoFEMErrorCode

Definition at line 651 of file ISManager.cpp.

653 {
654 const MoFEM::Interface &m_field = cOre;
655 const Problem *px_ptr;
656 const Problem *py_ptr;
658 CHKERR m_field.get_problem(x_problem, &px_ptr);
659 CHKERR m_field.get_problem(y_problem, &py_ptr);
660 NumeredDofEntityByLocalIdx::iterator y_dit, hi_y_dit;
661 switch (y_rc) {
662 case ROW:
663 y_dit =
664 py_ptr->numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(0);
665 hi_y_dit =
666 py_ptr->numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(
667 py_ptr->getNbLocalDofsRow()); // should be lower
668 break;
669 case COL:
670 y_dit =
671 py_ptr->numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(0);
672 hi_y_dit =
673 py_ptr->numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(
674 py_ptr->getNbLocalDofsCol()); // should be lower
675 break;
676 default:
677 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
678 }
679 const NumeredDofEntityByUId *x_numered_dofs_by_uid;
680 switch (x_rc) {
681 case ROW:
682 x_numered_dofs_by_uid = &(px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>());
683 break;
684 case COL:
685 x_numered_dofs_by_uid = &(px_ptr->numeredColDofsPtr->get<Unique_mi_tag>());
686 break;
687 default:
688 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
689 }
690 for (; y_dit != hi_y_dit; y_dit++) {
691 if ((*y_dit)->getPart() != (unsigned int)m_field.get_comm_rank()) {
692 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "data inconsistency");
693 }
694 NumeredDofEntityByUId::iterator x_dit;
695 x_dit = x_numered_dofs_by_uid->find((*y_dit)->getLocalUniqueId());
696 if (x_dit == x_numered_dofs_by_uid->end())
697 continue;
698 idx.push_back((*x_dit)->getPetscGlobalDofIdx());
699 idy.push_back((*y_dit)->getPetscGlobalDofIdx());
700 }
702}
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
NumeredDofEntity_multiIndex::index< Unique_mi_tag >::type NumeredDofEntityByUId
Numbered DoF multi-index by UId.
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredRowDofsPtr
store DOFs on rows for this problem

◆ isCreateProblemBrokenFieldAndRank()

MoFEMErrorCode MoFEM::ISManager::isCreateProblemBrokenFieldAndRank ( const std::vector< boost::weak_ptr< NumeredDofEntity > > &  dofs_vec,
SmartPetscObj< IS > &  smart_is,
MPI_Comm  comm = PETSC_COMM_SELF 
) const

#include <src/interfaces/ISManager.hpp>

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

Parameters
dofs_vecvector of dofs
smart_isIS
Return values
isout value
isout value

Definition at line 357 of file ISManager.cpp.

359 {
361
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());
367 }
368 }
369
370 IS is_raw;
371 int *id;
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);
375
376 smart_is = SmartPetscObj<IS>(is_raw);
377
379}

◆ isCreateProblemBrokenFieldAndRankLocal()

MoFEMErrorCode MoFEM::ISManager::isCreateProblemBrokenFieldAndRankLocal ( const std::vector< boost::weak_ptr< NumeredDofEntity > > &  dofs_vec,
SmartPetscObj< IS > &  smart_is 
) const

#include <src/interfaces/ISManager.hpp>

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

Parameters
dofs_vecvector of dofs
smart_isIS
Return values
isout value
isout value

Definition at line 381 of file ISManager.cpp.

383 {
385
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());
391 }
392 }
393
394 IS is_raw;
395 int *id;
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,
399 &is_raw);
400
401 smart_is = SmartPetscObj<IS>(is_raw);
402
404}

◆ 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

#include <src/interfaces/ISManager.hpp>

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 508 of file ISManager.cpp.

511 {
512 const MoFEM::Interface &m_field = cOre;
514 EntityHandle field_meshset = m_field.get_field_meshset(field);
515 Range ents;
516 for (; low_type <= hi_type; ++low_type)
517 CHKERR m_field.get_moab().get_entities_by_type(field_meshset, low_type,
518 ents, true);
519 if (ents_ptr)
520 ents = intersect(ents, *ents_ptr);
521 CHKERR isCreateProblemFieldAndRank(problem_name, rc, field, min_coeff_idx,
522 max_coeff_idx, is, &ents);
524}
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

#include <src/interfaces/ISManager.hpp>

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

#include <src/interfaces/ISManager.hpp>

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

#include <src/interfaces/ISManager.hpp>

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 406 of file ISManager.cpp.

408 {
409 const MoFEM::Interface &m_field = cOre;
410 const Problem *problem_ptr;
412 CHKERR m_field.get_problem(problem_name, &problem_ptr);
413 const auto bit_number = m_field.get_field_bit_number(field);
414
415 auto get_low_hi_uid = [&]() {
416 return std::make_pair(FieldEntity::getLoBitNumberUId(bit_number),
418 };
419
420 auto get_low_hi_uid_by_entities = [&](auto f, auto s) {
421 return std::make_pair(DofEntity::getLoFieldEntityUId(bit_number, f),
422 DofEntity::getHiFieldEntityUId(bit_number, s));
423 };
424
425 auto get_low_hi = [&](auto lo_uid, auto hi_uid) {
426 using DofsByUId = NumeredDofEntity_multiIndex::index<Unique_mi_tag>::type;
427 DofsByUId::iterator it, hi_it;
428 switch (rc) {
429 case ROW:
430 it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().lower_bound(
431 lo_uid);
432 hi_it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
433 hi_uid);
434 break;
435 case COL:
436 it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
437 lo_uid);
438 hi_it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
439 hi_uid);
440 break;
441 default:
442 THROW_MESSAGE("not implemented");
443 }
444 return std::make_pair(it, hi_it);
445 };
446
447 auto check = [&](auto it) {
448 if ((*it)->getPetscLocalDofIdx() < 0)
449 return false;
450
451 const auto coeff_idx = (*it)->getDofCoeffIdx();
452 if (
453
454 coeff_idx < min_coeff_idx || coeff_idx > max_coeff_idx
455
456 )
457 return false;
458 else
459 return true;
460 };
461
462 auto emplace_indices = [&](auto it, auto hi_it, auto &idx_vec) {
463 for (; it != hi_it; ++it) {
464 if (check(it))
465 idx_vec.emplace_back((*it)->getPetscLocalDofIdx());
466 }
467 };
468
469 auto [lo_uid, hi_uid] = get_low_hi_uid();
470 auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
471 std::vector<int> idx_vec;
472 idx_vec.reserve(std::distance(lo, hi));
473
474 if (ents_ptr) {
475 for (auto pit = ents_ptr->const_pair_begin();
476 pit != ents_ptr->const_pair_end(); ++pit) {
477 auto [lo_uid, hi_uid] =
478 get_low_hi_uid_by_entities(pit->first, pit->second);
479 auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
480 emplace_indices(lo, hi, idx_vec);
481 }
482 } else {
483 emplace_indices(lo, hi, idx_vec);
484 }
485
486 int *id;
487 CHKERR PetscMalloc(idx_vec.size() * sizeof(int), &id);
488 std::copy(idx_vec.begin(), idx_vec.end(), id);
489 CHKERR ISCreateGeneral(PETSC_COMM_SELF, idx_vec.size(), id, PETSC_OWN_POINTER,
490 is);
491
493}
#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

#include <src/interfaces/ISManager.hpp>

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 495 of file ISManager.cpp.

498 {
500 IS is;
501 CHKERR isCreateProblemFieldAndRankLocal(problem_name, rc, field,
502 min_coeff_idx, max_coeff_idx, &is,
503 ents_ptr);
504 smart_is = SmartPetscObj<IS>(is);
506}
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

#include <src/interfaces/ISManager.hpp>

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

#include <src/interfaces/ISManager.hpp>

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_colROW or COL, default is COL
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

#include <src/interfaces/ISManager.hpp>

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_colROW or COL, default is COL
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