18 : cOre(const_cast<
MoFEM::
Core &>(core)), dEbug(false) {}
28 boost::shared_ptr<NumeredDofEntity_multiIndex> dofs;
33 for (
auto fit = fe_ptr->begin(); fit != fe_ptr->end(); fit++) {
34 if ((fit->get()->getId() & problem_ptr->
getBitFEId()).any()) {
35 fields_ids |= fit->get()->getBitFieldIdRow();
41 for (
auto fit = fe_ptr->begin(); fit != fe_ptr->end(); fit++) {
42 if ((fit->get()->getId() & problem_ptr->
getBitFEId()).any()) {
43 fields_ids |= fit->get()->getBitFieldIdCol();
49 "Has to be ROW or COLUMN");
52 map<std::string, std::pair<int, int>> fields_map;
55 for (
auto fit = fields_ptr->begin(); fit != fields_ptr->end(); fit++) {
56 if ((fit->get()->getId() & fields_ids).any()) {
57 fields_map[fit->get()->getName()].first = field++;
58 fields_map[fit->get()->getName()].second = fit->get()->getNbOfCoeffs();
63 CHKERR PetscSectionCreate(PETSC_COMM_WORLD, s);
64 CHKERR PetscSectionSetNumFields(*s, fields_map.size());
65 for (
auto mit = fields_map.begin(); mit != fields_map.end(); mit++) {
66 CHKERR PetscSectionSetFieldName(*s, mit->second.first, mit->first.c_str());
67 CHKERR PetscSectionSetFieldComponents(*s, mit->second.first,
73 auto dit = dofs->begin();
74 auto hi_dit = dofs->end();
75 for (; dit != hi_dit;) {
76 if (
static_cast<int>(dit->get()->getPart()) == proc) {
77 const auto &ent_uid = dit->get()->getEntLocalUniqueId();
78 while (dit != hi_dit && dit->get()->getEntLocalUniqueId() == ent_uid) {
89 CHKERR PetscLayoutCreate(PETSC_COMM_WORLD, &layout);
90 CHKERR PetscLayoutSetBlockSize(layout, 1);
91 CHKERR PetscLayoutSetLocalSize(layout, nb_charts);
92 CHKERR PetscLayoutSetUp(layout);
94 CHKERR PetscLayoutGetRange(layout, &rstart, &rend);
95 CHKERR PetscLayoutDestroy(&layout);
96 CHKERR PetscSectionSetChart(*s, rstart, rend);
100 auto dit = dofs->begin();
101 auto hi_dit = dofs->end();
103 for (; dit != hi_dit;) {
104 if (
static_cast<int>(dit->get()->getPart()) == proc) {
106 const auto &
field_name = dit->get()->getName();
109 const auto &ent_uid = dit->get()->getEntLocalUniqueId();
110 while (dit != hi_dit && dit->get()->getEntLocalUniqueId() == ent_uid) {
111 const DofIdx loc_idx = dit->get()->getPetscLocalDofIdx();
117 if (fields_map.find(
field_name) == fields_map.end()) {
118 MOFEM_LOG_C(
"SELF", Sev::warning,
"Warning: Field %s not found",
119 dit->get()->getName().c_str());
121 CHKERR PetscSectionAddDof(*s, point, dd);
123 CHKERR PetscSectionSetFieldDof(*s, point, field, dd);
134 CHKERR PetscSectionSetUp(*s);
145 "Section not created");
171 auto lo = dofs_ptr->get<
Part_mi_tag>().lower_bound(rank);
172 auto hi = dofs_ptr->get<
Part_mi_tag>().upper_bound(rank);
173 const int size = std::distance(lo, hi);
176 CHKERR PetscMalloc(size *
sizeof(
int), &
id);
178 for (; lo != hi; ++lo, ++id_it)
179 *id_it = (*lo)->getPetscGlobalDofIdx();
182 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, size,
id, PETSC_OWN_POINTER, is);
199 int max_order, IS *is)
const {
205 typedef multi_index_container<
206 boost::shared_ptr<NumeredDofEntity>,
218 NumeredDofEntity_order_view_multiIndex;
222 NumeredDofEntity_order_view_multiIndex dofs_by_order;
223 auto insert_part_range = [&dofs_by_order, rank](
auto &dofs) {
224 dofs_by_order.insert(dofs_by_order.end(), dofs.lower_bound(rank),
225 dofs.upper_bound(rank));
239 auto lo = dofs_by_order.get<
Order_mi_tag>().lower_bound(min_order);
240 auto hi = dofs_by_order.get<
Order_mi_tag>().upper_bound(max_order);
241 const int size = std::distance(lo, hi);
243 CHKERR PetscMalloc(size *
sizeof(
int), &
id);
245 for (; lo != hi; ++lo, ++id_it)
246 *id_it = (*lo)->getPetscGlobalDofIdx();
249 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, size,
id, PETSC_OWN_POINTER, is);
266 const std::string problem_name,
RowColData rc,
const std::string field,
267 int min_coeff_idx,
int max_coeff_idx, IS *is,
Range *ents_ptr)
const {
274 typedef NumeredDofEntity_multiIndex::index<Unique_mi_tag>::type DofsByUId;
275 DofsByUId::iterator it, hi_it;
296 std::vector<int> idx_vec;
297 idx_vec.reserve(std::distance(it, hi_it));
298 for (; it != hi_it; ++it) {
300 auto true_if_dof_on_entity = [&]() {
302 return ents_ptr->find((*it)->getEnt()) != ents_ptr->end();
309 const auto ceff_idx = (*it)->getDofCoeffIdx();
312 (*it)->getPetscLocalDofIdx() >= nb_loc_dofs ||
314 ceff_idx < min_coeff_idx || ceff_idx > max_coeff_idx
323 if (true_if_dof_on_entity()) {
324 idx_vec.emplace_back((*it)->getPetscGlobalDofIdx());
330 CHKERR PetscMalloc(idx_vec.size() *
sizeof(
int), &
id);
331 std::copy(idx_vec.begin(), idx_vec.end(),
id);
332 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, idx_vec.size(),
id,
333 PETSC_OWN_POINTER, is);
339 const std::string problem_name,
RowColData rc,
const std::string field,
341 Range *ents_ptr)
const {
345 max_coeff_idx, &is, ents_ptr);
351 const std::string problem_name,
RowColData rc,
const std::string field,
353 int max_coeff_idx, IS *is,
Range *ents_ptr)
const {
358 for (; low_type <= hi_type; ++low_type)
359 CHKERR m_field.
get_moab().get_entities_by_type(field_meshset, low_type,
362 ents = intersect(ents, *ents_ptr);
364 max_coeff_idx, is, &ents);
369 const std::string x_problem,
const std::string x_field_name,
371 const std::string y_field_name,
RowColData y_rc, std::vector<int> &idx,
372 std::vector<int> &idy)
const {
381 typedef multi_index_container<
382 boost::shared_ptr<NumeredDofEntity>,
389 tag<Composite_Ent_And_EntDofIdx_mi_tag>,
398 NumeredDofEntity_view_multiIndex;
400 NumeredDofEntity_view_multiIndex dofs_view;
423 "only makes sense for ROWS and COLS");
436 "only makes sense for ROWS and COLS");
439 std::map<int, int> global_dofs_map;
446 for (; dit != hi_dit; ++dit) {
447 if ((*dit)->getPart() == rank) {
449 boost::make_tuple((*dit)->getEnt(), (*dit)->getEntDofIdx()));
451 global_dofs_map[(*x_dit)->getPetscGlobalDofIdx()] =
452 (*dit)->getPetscGlobalDofIdx();
457 idx.resize(global_dofs_map.size());
458 idy.resize(global_dofs_map.size());
460 auto ix = idx.begin();
461 auto iy = idy.begin();
462 for (
auto mit = global_dofs_map.begin(); mit != global_dofs_map.end();
472 const std::string x_problem,
const std::string x_field_name,
474 const std::string y_field_name,
RowColData y_rc, IS *ix, IS *iy)
const {
476 std::vector<int> idx(0), idy(0);
478 x_problem, x_field_name, x_rc, y_problem, y_field_name, y_rc, idx, idy);
479 if (ix != PETSC_NULL) {
480 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, idx.size(), &idx[0],
481 PETSC_COPY_VALUES, ix);
483 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, idy.size(), &idy[0],
484 PETSC_COPY_VALUES, iy);
486 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
487 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
493 const std::string x_problem,
RowColData x_rc,
const std::string y_problem,
494 RowColData y_rc, std::vector<int> &idx, std::vector<int> &idy)
const {
501 NumeredDofEntityByLocalIdx::iterator y_dit, hi_y_dit;
531 for (; y_dit != hi_y_dit; y_dit++) {
532 if ((*y_dit)->getPart() != (
unsigned int)m_field.
get_comm_rank()) {
535 NumeredDofEntityByUId::iterator x_dit;
536 x_dit = x_numered_dofs_by_uid->find((*y_dit)->getLocalUniqueId());
537 if (x_dit == x_numered_dofs_by_uid->end())
539 idx.push_back((*x_dit)->getPetscGlobalDofIdx());
540 idy.push_back((*y_dit)->getPetscGlobalDofIdx());
546 const std::string x_problem,
RowColData x_rc,
const std::string y_problem,
549 std::vector<int> idx(0), idy(0);
552 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, idx.size(), &idx[0],
553 PETSC_COPY_VALUES, ix);
554 CHKERR ISCreateGeneral(PETSC_COMM_WORLD, idy.size(), &idy[0],
555 PETSC_COPY_VALUES, iy);
557 ISView(*ix, PETSC_VIEWER_STDOUT_WORLD);
558 ISView(*iy, PETSC_VIEWER_STDOUT_WORLD);
#define MOFEM_LOG_C(channel, severity, format,...)
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(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 ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
NumeredDofEntity_multiIndex::index< Unique_mi_tag >::type NumeredDofEntityByUId
Numbered DoF multi-index by UId.
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 const Field_multiIndex * get_fields() const =0
Get the fields object.
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
MoFEMErrorCode sectionCreate(const std::string problem_name, PetscSection *s, const RowColData row_col=COL) const
Create global selection.
MoFEMErrorCode 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 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 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 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)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
int ApproximationOrder
Approximation on the entity.
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
implementation of Data Operators for Forces and Sources
constexpr auto field_name
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
virtual moab::Interface & get_moab()=0
virtual EntityHandle get_field_meshset(const std::string name) const =0
get field meshset
virtual int get_comm_rank() const =0
Deprecated interface functions.
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
static UId getLoBitNumberUId(const FieldBitNumber bit_number)
Section manager is used to create indexes and sections.
MoFEMErrorCode isCreateProblem(const std::string problem_name, RowColData rc, IS *is) const
Create IS for problem.
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
const MoFEM::Interface & cOre
ISManager(const MoFEM::Core &core)
keeps information about indexed dofs for the problem
interface_DofEntity< DofEntity > interface_type_DofEntity
MultiIndex Tag for field order.
keeps basic data about problem
DofIdx getNbLocalDofsRow() const
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredRowDofsPtr
store DOFs on rows for this problem
BitFEId getBitFEId() const
DofIdx getNbLocalDofsCol() const
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredColDofsPtr
store DOFs on columns for this problem
intrusive_ptr for managing petsc objects
base class for all interface classes
DofIdx getEntDofIdx() const
ApproximationOrder getDofOrder() const
EntityHandle getEnt() const