 |
| v0.14.0
|
Construct index sets for MoFEM problems.
More...
|
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::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) More...
|
|
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) 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...
|
|
Construct index sets for MoFEM problems.
◆ 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_problem | name of problem |
x_field_name | name of field in problem_x |
x_rc | that is ROW or COL |
y_problem | name of problem |
y_field_name | name of field in problem_y |
y_rc | that is ROW or COL |
- Return values
-
ix | IS indexes in problem_x (can be PETSC_NULL) |
iy | IS indexes in problem_y |
Definition at line 626 of file ISManager.cpp.
632 std::vector<int> idx(0), idy(0);
634 x_problem, x_field_name, x_rc, y_problem, y_field_name, y_rc, idx, idy);
635 if (ix != PETSC_NULL) {
637 PETSC_COPY_VALUES, ix);
640 PETSC_COPY_VALUES, iy);
642 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
643 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
◆ 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_problem | name of problem |
x_field_name | name of field in problem_x |
x_rc | that is ROW or COL |
y_problem | name of problem |
y_field_name | name of field in problem_y |
y_rc | that is ROW or COL |
- Return values
-
idx | indexes in problem_x |
idy | indexes in problem_y |
Definition at line 523 of file ISManager.cpp.
529 const Problem *px_ptr;
530 const Problem *py_ptr;
536 typedef multi_index_container<
537 boost::shared_ptr<NumeredDofEntity>,
544 tag<Composite_Ent_And_EntDofIdx_mi_tag>,
553 NumeredDofEntity_view_multiIndex;
555 NumeredDofEntity_view_multiIndex dofs_view;
563 px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().lower_bound(
565 px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
571 px_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
573 px_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
578 "only makes sense for ROWS and COLS");
581 decltype(py_ptr->numeredRowDofsPtr) dofs_ptr;
584 dofs_ptr = py_ptr->numeredRowDofsPtr;
587 dofs_ptr = py_ptr->numeredColDofsPtr;
591 "only makes sense for ROWS and COLS");
594 std::map<int, int> global_dofs_map;
596 auto dit = dofs_ptr->get<Unique_mi_tag>().lower_bound(
598 auto hi_dit = dofs_ptr->get<Unique_mi_tag>().upper_bound(
601 for (; dit != hi_dit; ++dit) {
602 if ((*dit)->getPart() == rank) {
603 auto x_dit = dofs_view.get<Composite_Ent_And_EntDofIdx_mi_tag>().find(
604 boost::make_tuple((*dit)->getEnt(), (*dit)->getEntDofIdx()));
605 if (x_dit != dofs_view.get<Composite_Ent_And_EntDofIdx_mi_tag>().end()) {
606 global_dofs_map[(*x_dit)->getPetscGlobalDofIdx()] =
607 (*dit)->getPetscGlobalDofIdx();
612 idx.resize(global_dofs_map.size());
613 idy.resize(global_dofs_map.size());
615 auto ix = idx.begin();
616 auto iy = idy.begin();
617 for (
auto mit = global_dofs_map.begin(); mit != global_dofs_map.end();
◆ 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 701 of file ISManager.cpp.
706 std::vector<int> idx(0), idy(0);
710 PETSC_COPY_VALUES, ix);
712 PETSC_COPY_VALUES, iy);
714 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
715 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
◆ 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 648 of file ISManager.cpp.
652 const Problem *px_ptr;
653 const Problem *py_ptr;
657 NumeredDofEntityByLocalIdx::iterator y_dit, hi_y_dit;
661 py_ptr->numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(0);
663 py_ptr->numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(
664 py_ptr->getNbLocalDofsRow());
668 py_ptr->numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(0);
670 py_ptr->numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(
671 py_ptr->getNbLocalDofsCol());
679 x_numered_dofs_by_uid = &(px_ptr->numeredRowDofsPtr->get<Unique_mi_tag>());
682 x_numered_dofs_by_uid = &(px_ptr->numeredColDofsPtr->get<Unique_mi_tag>());
687 for (; y_dit != hi_y_dit; y_dit++) {
688 if ((*y_dit)->getPart() != (
unsigned int)m_field.
get_comm_rank()) {
691 NumeredDofEntityByUId::iterator x_dit;
692 x_dit = x_numered_dofs_by_uid->find((*y_dit)->getLocalUniqueId());
693 if (x_dit == x_numered_dofs_by_uid->end())
695 idx.push_back((*x_dit)->getPetscGlobalDofIdx());
696 idy.push_back((*y_dit)->getPetscGlobalDofIdx());
◆ isCreateProblemBrokenFieldAndRank()
IS for given problem, field and rank range (collective)
- Parameters
-
dofs_vec | vector of dofs |
smart_is | IS |
- Return values
-
Definition at line 357 of file ISManager.cpp.
362 std::vector<int> idx_vec;
363 idx_vec.reserve(dofs_vec.size());
364 for (
auto &dof : dofs_vec) {
365 if (
auto d = dof.lock()) {
366 idx_vec.emplace_back(
d->getPetscGlobalDofIdx());
372 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
373 std::copy(idx_vec.begin(), idx_vec.end(),
id);
374 CHKERR ISCreateGeneral(comm, idx_vec.size(),
id, PETSC_OWN_POINTER, &is_raw);
376 smart_is = SmartPetscObj<IS>(is_raw);
◆ isCreateProblemBrokenFieldAndRankLocal()
IS for given problem, field and rank range (collective)
- Parameters
-
dofs_vec | vector of dofs |
smart_is | IS |
- Return values
-
Definition at line 381 of file ISManager.cpp.
386 std::vector<int> idx_vec;
387 idx_vec.reserve(dofs_vec.size());
388 for (
auto &dof : dofs_vec) {
389 if (
auto d = dof.lock()) {
390 idx_vec.emplace_back(
d->getPetscLocalDofIdx());
396 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
397 std::copy(idx_vec.begin(), idx_vec.end(),
id);
398 CHKERR ISCreateGeneral(PETSC_COMM_SELF, idx_vec.size(),
id, PETSC_OWN_POINTER,
401 smart_is = SmartPetscObj<IS>(is_raw);
◆ 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 505 of file ISManager.cpp.
513 for (; low_type <= hi_type; ++low_type)
514 CHKERR m_field.
get_moab().get_entities_by_type(field_meshset, low_type,
517 ents = intersect(ents, *ents_ptr);
519 max_coeff_idx, is, &ents);
◆ 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
-
problem | name |
rc | ROW or COL |
field | name |
min_coeff_idx | |
max_coeff_idx | |
ents | if not null get dofs only on given entities |
- Return values
-
Definition at line 272 of file ISManager.cpp.
276 const Problem *problem_ptr;
282 DofsByUId::iterator it, hi_it;
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(
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(
303 std::vector<int> idx_vec;
304 idx_vec.reserve(std::distance(it, hi_it));
305 for (; it != hi_it; ++it) {
307 auto true_if_dof_on_entity = [&]() {
309 return ents_ptr->find((*it)->getEnt()) != ents_ptr->end();
316 const auto coeff_idx = (*it)->getDofCoeffIdx();
319 (*it)->getPetscLocalDofIdx() >= nb_loc_dofs ||
321 coeff_idx < min_coeff_idx || coeff_idx > max_coeff_idx
330 if (true_if_dof_on_entity()) {
331 idx_vec.emplace_back((*it)->getPetscGlobalDofIdx());
337 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
338 std::copy(idx_vec.begin(), idx_vec.end(),
id);
340 PETSC_OWN_POINTER, is);
◆ 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
-
problem | name |
rc | ROW or COL |
field | name |
min_coeff_idx | |
max_coeff_idx | |
ents | if not null get dofs only on given entities |
- Return values
-
Definition at line 345 of file ISManager.cpp.
352 max_coeff_idx, &is, ents_ptr);
353 smart_is = SmartPetscObj<IS>(is);
◆ 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
-
problem | name |
rc | ROW or COL |
field | name |
min_coeff_idx | |
max_coeff_idx | |
ents | if not null get dofs only on given entities |
- Return values
-
Definition at line 406 of file ISManager.cpp.
410 const Problem *problem_ptr;
415 auto get_low_hi_uid = [&]() {
420 auto get_low_hi_uid_by_entities = [&](
auto f,
auto s) {
425 auto get_low_hi = [&](
auto lo_uid,
auto hi_uid) {
427 DofsByUId::iterator it, hi_it;
430 it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().lower_bound(
432 hi_it = problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>().upper_bound(
436 it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().lower_bound(
438 hi_it = problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>().upper_bound(
444 return std::make_pair(it, hi_it);
447 auto check = [&](
auto it) {
448 const auto coeff_idx = (*it)->getDofCoeffIdx();
451 coeff_idx < min_coeff_idx || coeff_idx > max_coeff_idx
459 auto emplace_indices = [&](
auto it,
auto hi_it,
auto &idx_vec) {
460 for (; it != hi_it; ++it) {
462 idx_vec.emplace_back((*it)->getPetscLocalDofIdx());
466 auto [lo_uid, hi_uid] = get_low_hi_uid();
467 auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
468 std::vector<int> idx_vec;
469 idx_vec.reserve(std::distance(lo, hi));
472 for (
auto pit = ents_ptr->const_pair_begin();
473 pit != ents_ptr->const_pair_end(); ++pit) {
474 auto [lo_uid, hi_uid] =
475 get_low_hi_uid_by_entities(pit->first, pit->second);
476 auto [lo, hi] = get_low_hi(lo_uid, hi_uid);
477 emplace_indices(lo, hi, idx_vec);
480 emplace_indices(lo, hi, idx_vec);
484 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
485 std::copy(idx_vec.begin(), idx_vec.end(),
id);
486 CHKERR ISCreateGeneral(PETSC_COMM_SELF, idx_vec.size(),
id, PETSC_OWN_POINTER,
◆ 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
-
problem | name |
rc | ROW or COL |
field | name |
min_coeff_idx | |
max_coeff_idx | |
ents | if not null get dofs only on given entities |
- Return values
-
Definition at line 492 of file ISManager.cpp.
499 min_coeff_idx, max_coeff_idx, &is,
501 smart_is = SmartPetscObj<IS>(is);
◆ 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
-
problem | name |
rc | ROW or COL |
min_order | |
max_order | |
- Return values
-
Definition at line 204 of file ISManager.cpp.
208 const Problem *problem_ptr;
212 typedef multi_index_container<
213 boost::shared_ptr<NumeredDofEntity>,
225 NumeredDofEntity_order_view_multiIndex;
229 NumeredDofEntity_order_view_multiIndex dofs_by_order;
230 auto insert_part_range = [&dofs_by_order, rank](
auto &dofs) {
231 dofs_by_order.insert(dofs_by_order.end(), dofs.lower_bound(rank),
232 dofs.upper_bound(rank));
237 insert_part_range(problem_ptr->numeredRowDofsPtr->get<Part_mi_tag>());
240 insert_part_range(problem_ptr->numeredColDofsPtr->get<Part_mi_tag>());
246 auto lo = dofs_by_order.get<Order_mi_tag>().lower_bound(min_order);
247 auto hi = dofs_by_order.get<Order_mi_tag>().upper_bound(max_order);
248 const int size = std::distance(lo, hi);
250 CHKERR PetscMalloc(size *
sizeof(
int), &
id);
252 for (; lo != hi; ++lo, ++id_it)
253 *id_it = (*lo)->getPetscGlobalDofIdx();
256 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, size,
id, PETSC_OWN_POINTER, is);
◆ 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_col | ROE or COL, default is ROW |
- Returns
- error code
Definition at line 140 of file ISManager.cpp.
145 "Section not created");
146 return SmartPetscObj<PetscSection>(s,
false);
◆ 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_col | ROE or COL, default is ROW |
- Returns
- error code
Definition at line 20 of file ISManager.cpp.
24 const Problem *problem_ptr = m_field.
get_problem(problem_name);
28 boost::shared_ptr<NumeredDofEntity_multiIndex> dofs;
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();
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();
49 "Has to be ROW or COLUMN");
52 map<std::string, std::pair<int, int>> fields_map;
55 for (
auto fit = fields_ptr->begin(); fit != fields_ptr->end(); fit++) {
56 if ((fit->get()->getId() & fields_ids).any()) {
57 fields_map[fit->get()->getName()].first = field++;
58 fields_map[fit->get()->getName()].second = fit->get()->getNbOfCoeffs();
63 CHKERR PetscSectionCreate(PETSC_COMM_WORLD, s);
64 CHKERR PetscSectionSetNumFields(*s, fields_map.size());
65 for (
auto mit = fields_map.begin(); mit != fields_map.end(); mit++) {
66 CHKERR PetscSectionSetFieldName(*s, mit->second.first, mit->first.c_str());
67 CHKERR PetscSectionSetFieldComponents(*s, mit->second.first,
73 auto dit = dofs->begin();
74 auto hi_dit = dofs->end();
75 for (; dit != hi_dit;) {
76 if (
static_cast<int>(dit->get()->getPart()) == proc) {
77 const auto &ent_uid = dit->get()->getEntLocalUniqueId();
78 while (dit != hi_dit && dit->get()->getEntLocalUniqueId() == ent_uid) {
89 CHKERR PetscLayoutCreate(PETSC_COMM_WORLD, &layout);
90 CHKERR PetscLayoutSetBlockSize(layout, 1);
91 CHKERR PetscLayoutSetLocalSize(layout, nb_charts);
92 CHKERR PetscLayoutSetUp(layout);
94 CHKERR PetscLayoutGetRange(layout, &rstart, &rend);
95 CHKERR PetscLayoutDestroy(&layout);
96 CHKERR PetscSectionSetChart(*s, rstart, rend);
100 auto dit = dofs->begin();
101 auto hi_dit = dofs->end();
103 for (; dit != hi_dit;) {
104 if (
static_cast<int>(dit->get()->getPart()) == proc) {
106 const auto &
field_name = dit->get()->getName();
109 const auto &ent_uid = dit->get()->getEntLocalUniqueId();
110 while (dit != hi_dit && dit->get()->getEntLocalUniqueId() == ent_uid) {
111 const DofIdx loc_idx = dit->get()->getPetscLocalDofIdx();
117 if (fields_map.find(
field_name) == fields_map.end()) {
118 MOFEM_LOG_C(
"SELF", Sev::warning,
"Warning: Field %s not found",
119 dit->get()->getName().c_str());
121 CHKERR PetscSectionAddDof(*s, point,
dd);
123 CHKERR PetscSectionSetFieldDof(*s, point, field,
dd);
134 CHKERR PetscSectionSetUp(*s);
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 MPI_Comm & get_comm() const =0
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
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 FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
interface_DofEntity< DofEntity > interface_type_DofEntity
virtual int get_comm_rank() const =0
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
virtual const Problem * get_problem(const std::string problem_name) const =0
Get the problem object.
virtual const FiniteElement_multiIndex * get_finite_elements() const =0
Get the finite elements object.
virtual EntityHandle get_field_meshset(const std::string name) const =0
get field meshset
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Deprecated interface functions.
NumeredDofEntity_multiIndex::index< Unique_mi_tag >::type NumeredDofEntityByUId
Numbered DoF multi-index by UId.
#define CHKERR
Inline error check.
virtual moab::Interface & get_moab()=0
const MoFEM::Interface & cOre
#define MOFEM_LOG_C(channel, severity, format,...)
static UId getLoBitNumberUId(const FieldBitNumber bit_number)
EntityHandle getEnt() const
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)
static UId getLoFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
constexpr auto field_name
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)
int ApproximationOrder
Approximation on the entity.
ApproximationOrder getDofOrder() const
static UId getHiFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
@ MOFEM_DATA_INCONSISTENCY
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
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.
MoFEMErrorCode sectionCreate(const std::string problem_name, PetscSection *s, const RowColData row_col=COL) const
Create global selection.
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
DofIdx getEntDofIdx() const