v0.14.0
Public Types | Public Member Functions | Public Attributes | Private Attributes | List of all members
MoFEM::ProblemsManager Struct Reference

Problem manager is used to build and partition problems. More...

#include <src/interfaces/ProblemsManager.hpp>

Inheritance diagram for MoFEM::ProblemsManager:
[legend]
Collaboration diagram for MoFEM::ProblemsManager:
[legend]

Public Types

enum  MarkOP { OR, AND }
 

Public Member Functions

MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 ProblemsManager (const MoFEM::Core &core)
 
virtual ~ProblemsManager ()=default
 
MoFEMErrorCode getOptions ()
 
DEPRECATED MoFEMErrorCode partitionMesh (const Range &ents, const int dim, const int adj_dim, const int n_parts, Tag *th_vertex_weights=nullptr, Tag *th_edge_weights=nullptr, Tag *th_part_weights=nullptr, int verb=VERBOSE, const bool debug=false)
 Set partition tag to each finite element in the problem. More...
 
MoFEMErrorCode buildProblem (const std::string name, const bool square_matrix, int verb=VERBOSE)
 build problem data structures More...
 
MoFEMErrorCode buildProblem (Problem *problem_ptr, const bool square_matrix, int verb=VERBOSE)
 build problem data structures More...
 
MoFEMErrorCode buildProblemOnDistributedMesh (const std::string name, const bool square_matrix, int verb=VERBOSE)
 build problem data structures, assuming that mesh is distributed (collective) More...
 
MoFEMErrorCode buildProblemOnDistributedMesh (Problem *problem_ptr, const bool square_matrix=true, int verb=VERBOSE)
 build problem data structures, assuming that mesh is distributed (collective) More...
 
MoFEMErrorCode buildSubProblem (const std::string out_name, const std::vector< std::string > &fields_row, const std::vector< std::string > &fields_col, const std::string main_problem, const bool square_matrix=true, const map< std::string, boost::shared_ptr< Range >> *entityMapRow=nullptr, const map< std::string, boost::shared_ptr< Range >> *entityMapCol=nullptr, int verb=VERBOSE)
 build sub problem More...
 
MoFEMErrorCode buildComposedProblem (const std::string out_name, const std::vector< std::string > add_row_problems, const std::vector< std::string > add_col_problems, const bool square_matrix=true, int verb=1)
 build composite problem More...
 
MoFEMErrorCode inheritPartition (const std::string name, const std::string problem_for_rows, bool copy_rows, const std::string problem_for_cols, bool copy_cols, int verb=VERBOSE)
 build indexing and partition problem inheriting indexing and partitioning from two other problems More...
 
MoFEMErrorCode partitionSimpleProblem (const std::string name, int verb=VERBOSE)
 partition problem dofs More...
 
MoFEMErrorCode partitionProblem (const std::string name, int verb=VERBOSE)
 partition problem dofs (collective) More...
 
MoFEMErrorCode printPartitionedProblem (const Problem *problem_ptr, int verb=VERBOSE)
 
MoFEMErrorCode debugPartitionedProblem (const Problem *problem_ptr, int verb=VERBOSE)
 
MoFEMErrorCode partitionFiniteElements (const std::string name, bool part_from_moab=false, int low_proc=-1, int hi_proc=-1, int verb=VERBOSE)
 partition finite elements More...
 
MoFEMErrorCode partitionGhostDofs (const std::string name, int verb=VERBOSE)
 determine ghost nodes More...
 
MoFEMErrorCode partitionGhostDofsOnDistributedMesh (const std::string name, int verb=VERBOSE)
 determine ghost nodes on distributed meshes More...
 
MoFEMErrorCode getFEMeshset (const std::string prb_name, const std::string &fe_name, EntityHandle *meshset) const
 create add entities of finite element in the problem More...
 
MoFEMErrorCode getProblemElementsLayout (const std::string name, const std::string &fe_name, PetscLayout *layout) const
 Get layout of elements in the problem. More...
 
MoFEMErrorCode removeDofsOnEntities (const std::string problem_name, const std::string field_name, const Range ents, const int lo_coeff=0, const int hi_coeff=MAX_DOFS_ON_ENTITY, const int lo_order=0, const int hi_order=100, int verb=VERBOSE, const bool debug=false)
 Remove DOFs from problem. More...
 
MoFEMErrorCode removeDofsOnEntitiesNotDistributed (const std::string problem_name, const std::string field_name, const Range ents, const int lo_coeff=0, const int hi_coeff=MAX_DOFS_ON_ENTITY, const int lo_order=0, const int hi_order=100, int verb=VERBOSE, const bool debug=false)
 Remove DOFs from problem. More...
 
MoFEMErrorCode removeDofsOnEntities (const std::string problem_name, const std::string field_name, const BitRefLevel bit_ref_level, const BitRefLevel bit_ref_mask, Range *ents_ptr=nullptr, const int lo_coeff=0, const int hi_coeff=MAX_DOFS_ON_ENTITY, const int lo_order=0, const int hi_order=100, int verb=VERBOSE, const bool debug=false)
 Remove DOFs from problem by bit ref level. More...
 
MoFEMErrorCode removeDofsOnEntitiesNotDistributed (const std::string problem_name, const std::string field_name, const BitRefLevel bit_ref_level, const BitRefLevel bit_ref_mask, Range *ents_ptr=nullptr, const int lo_coeff=0, const int hi_coeff=MAX_DOFS_ON_ENTITY, const int lo_order=0, const int hi_order=100, int verb=VERBOSE, const bool debug=false)
 Remove DOFs from problem. More...
 
MoFEMErrorCode markDofs (const std::string problem_name, RowColData rc, const enum MarkOP op, const Range ents, std::vector< unsigned char > &marker) const
 Create vector with marked indices. More...
 
DEPRECATED MoFEMErrorCode markDofs (const std::string problem_name, RowColData rc, const Range ents, std::vector< unsigned char > &marker) const
 
MoFEMErrorCode modifyMarkDofs (const std::string problem_name, RowColData rc, const std::string field_name, const int lo, const int hi, const enum MarkOP op, const unsigned char c, std::vector< unsigned char > &marker) const
 Mark DOFs. More...
 
MoFEMErrorCode addFieldToEmptyFieldBlocks (const std::string problem_name, const std::string row_field, const std::string col_field) const
 add empty block to problem More...
 
- Public Member Functions inherited from MoFEM::UnknownInterface
template<class IFACE >
MoFEMErrorCode registerInterface (bool error_if_registration_failed=true)
 Register interface. More...
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE *&iface) const
 Get interface refernce to pointer of interface. More...
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE **const iface) const
 Get interface pointer to pointer of interface. More...
 
template<class IFACE , typename boost::enable_if< boost::is_pointer< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get interface pointer to pointer of interface. More...
 
template<class IFACE , typename boost::enable_if< boost::is_reference< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get reference to interface. More...
 
template<class IFACE >
IFACE * getInterface () const
 Function returning pointer to interface. More...
 
virtual ~UnknownInterface ()=default
 

Public Attributes

MoFEM::CorecOre
 
PetscBool buildProblemFromFields
 
PetscBool synchroniseProblemEntities
 DOFs in fields, not from DOFs on elements. More...
 

Private Attributes

PetscLogEvent MOFEM_EVENT_ProblemsManager
 

Additional Inherited Members

- Static Public Member Functions inherited from MoFEM::UnknownInterface
static MoFEMErrorCode getLibVersion (Version &version)
 Get library version. More...
 
static MoFEMErrorCode getFileVersion (moab::Interface &moab, Version &version)
 Get database major version. More...
 
static MoFEMErrorCode setFileVersion (moab::Interface &moab, Version version=Version(MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR, MoFEM_VERSION_BUILD))
 Get database major version. More...
 
static MoFEMErrorCode getInterfaceVersion (Version &version)
 Get database major version. More...
 

Detailed Description

Problem manager is used to build and partition problems.

Examples
boundary_marker.cpp, build_large_problem.cpp, build_problems.cpp, child_and_parent.cpp, continuity_check_on_contact_prism_side_ele.cpp, continuity_check_on_skeleton_3d.cpp, EshelbianPlasticity.cpp, forces_and_sources_testing_edge_element.cpp, forces_and_sources_testing_flat_prism_element.cpp, forces_and_sources_testing_users_base.cpp, free_surface.cpp, hanging_node_approx.cpp, hcurl_divergence_operator_2d.cpp, heat_method.cpp, helmholtz.cpp, level_set.cpp, mesh_insert_interface_atom.cpp, mixed_poisson.cpp, nonlinear_dynamics.cpp, photon_diffusion.cpp, plastic.cpp, plate.cpp, prism_elements_from_surface.cpp, prism_polynomial_approximation.cpp, quad_polynomial_approximation.cpp, reaction_diffusion.cpp, Remodeling.cpp, remove_entities_from_problem.cpp, remove_entities_from_problem_not_partitioned.cpp, seepage.cpp, test_cache_on_entities.cpp, and thermo_elastic.cpp.

Definition at line 21 of file ProblemsManager.hpp.

Member Enumeration Documentation

◆ MarkOP

Enumerator
OR 
AND 

Definition at line 365 of file ProblemsManager.hpp.

365 { OR, AND };

Constructor & Destructor Documentation

◆ ProblemsManager()

MoFEM::ProblemsManager::ProblemsManager ( const MoFEM::Core core)

Definition at line 55 of file ProblemsManager.cpp.

56  : cOre(const_cast<MoFEM::Core &>(core)),
57  buildProblemFromFields(PETSC_FALSE),
58  synchroniseProblemEntities(PETSC_FALSE) {
59  PetscLogEventRegister("ProblemsManager", 0, &MOFEM_EVENT_ProblemsManager);
60 }

◆ ~ProblemsManager()

virtual MoFEM::ProblemsManager::~ProblemsManager ( )
virtualdefault

Member Function Documentation

◆ addFieldToEmptyFieldBlocks()

MoFEMErrorCode MoFEM::ProblemsManager::addFieldToEmptyFieldBlocks ( const std::string  problem_name,
const std::string  row_field,
const std::string  col_field 
) const

add empty block to problem

MatrixManager assumes that all blocks, i.e. all fields combinations are non zero. This is not always the case, to optimise code and reduce memory usage user can specifi which blocks are empty.

Parameters
problem_nameproblem name
row_fieldrow filed name
col_fieldcol field name
Returns
MoFEMErrorCode

Definition at line 3292 of file ProblemsManager.cpp.

3294  {
3295 
3296  Interface &m_field = cOre;
3298 
3299  const auto problem_ptr = m_field.get_problem(problem_name);
3300  auto get_field_id = [&](const std::string field_name) {
3301  return m_field.get_field_structure(field_name)->getId();
3302  };
3303  const auto row_id = get_field_id(row_field);
3304  const auto col_id = get_field_id(col_field);
3305 
3306  problem_ptr->addFieldToEmptyFieldBlocks(BlockFieldPair(row_id, col_id));
3307 
3309 }

◆ debugPartitionedProblem()

MoFEMErrorCode MoFEM::ProblemsManager::debugPartitionedProblem ( const Problem problem_ptr,
int  verb = VERBOSE 
)

Definition at line 2084 of file ProblemsManager.cpp.

2084  {
2085  MoFEM::Interface &m_field = cOre;
2087 
2088  auto save_ent = [](moab::Interface &moab, const std::string name,
2089  const EntityHandle ent) {
2091  EntityHandle out_meshset;
2092  CHKERR moab.create_meshset(MESHSET_SET, out_meshset);
2093  CHKERR moab.add_entities(out_meshset, &ent, 1);
2094  CHKERR moab.write_file(name.c_str(), "VTK", "", &out_meshset, 1);
2095  CHKERR moab.delete_entities(&out_meshset, 1);
2097  };
2098 
2099  if (debug > 0) {
2100 
2102  NumeredDofEntitysByIdx;
2103  NumeredDofEntitysByIdx::iterator dit, hi_dit;
2104  const NumeredDofEntitysByIdx *numered_dofs_ptr[] = {
2105  &(problem_ptr->numeredRowDofsPtr->get<Idx_mi_tag>()),
2106  &(problem_ptr->numeredColDofsPtr->get<Idx_mi_tag>())};
2107 
2108  int *nbdof_ptr[] = {&problem_ptr->nbDofsRow, &problem_ptr->nbDofsCol};
2109  int *local_nbdof_ptr[] = {&problem_ptr->nbLocDofsRow,
2110  &problem_ptr->nbLocDofsCol};
2111 
2112  for (int ss = 0; ss < 2; ss++) {
2113 
2114  dit = numered_dofs_ptr[ss]->begin();
2115  hi_dit = numered_dofs_ptr[ss]->end();
2116  for (; dit != hi_dit; dit++) {
2117  if ((*dit)->getPart() == (unsigned int)m_field.get_comm_rank()) {
2118  if ((*dit)->getPetscLocalDofIdx() < 0) {
2119  std::ostringstream zz;
2120  zz << "rank " << m_field.get_comm_rank() << " " << **dit;
2121  SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2122  "local dof index for %d (0-row, 1-col) not set, i.e. has "
2123  "negative value\n %s",
2124  ss, zz.str().c_str());
2125  }
2126  if ((*dit)->getPetscLocalDofIdx() >= *local_nbdof_ptr[ss]) {
2127  std::ostringstream zz;
2128  zz << "rank " << m_field.get_comm_rank() << " " << **dit;
2129  SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2130  "local dofs for %d (0-row, 1-col) out of range\n %s", ss,
2131  zz.str().c_str());
2132  }
2133  } else {
2134  if ((*dit)->getPetscGlobalDofIdx() < 0) {
2135 
2136  const EntityHandle ent = (*dit)->getEnt();
2137  CHKERR save_ent(
2138  m_field.get_moab(),
2139  "debug_part" +
2140  boost::lexical_cast<std::string>(m_field.get_comm_rank()) +
2141  "_negative_global_index.vtk",
2142  ent);
2143 
2144  std::ostringstream zz;
2145  zz << "rank " << m_field.get_comm_rank() << " "
2146  << dit->get()->getBitRefLevel() << " " << **dit;
2147  SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2148  "global dof index for %d (0-row, 1-col) row not set, i.e. "
2149  "has negative value\n %s",
2150  ss, zz.str().c_str());
2151  }
2152  if ((*dit)->getPetscGlobalDofIdx() >= *nbdof_ptr[ss]) {
2153  std::ostringstream zz;
2154  zz << "rank " << m_field.get_comm_rank() << " nb_dofs "
2155  << *nbdof_ptr[ss] << " " << **dit;
2156  SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2157  "global dofs for %d (0-row, 1-col) out of range\n %s", ss,
2158  zz.str().c_str());
2159  }
2160  }
2161  }
2162  }
2163  }
2165 }

◆ getOptions()

MoFEMErrorCode MoFEM::ProblemsManager::getOptions ( )

Definition at line 62 of file ProblemsManager.cpp.

62  {
63  MoFEM::Interface &m_field = cOre;
65  CHKERR PetscOptionsBegin(m_field.get_comm(), "", "Problem manager", "none");
66  {
67  CHKERR PetscOptionsBool(
68  "-problem_build_from_fields",
69  "Add DOFs to problem directly from fields not through DOFs on elements",
71  }
72  ierr = PetscOptionsEnd();
73  CHKERRG(ierr);
75 }

◆ markDofs() [1/2]

MoFEMErrorCode MoFEM::ProblemsManager::markDofs ( const std::string  problem_name,
RowColData  rc,
const enum MarkOP  op,
const Range  ents,
std::vector< unsigned char > &  marker 
) const

Create vector with marked indices.

Vector with local DOFs marked by entities

Parameters
problem_name
row
ents
marker
Returns
MoFEMErrorCode
Examples
helmholtz.cpp, and test_cache_on_entities.cpp.

Definition at line 3196 of file ProblemsManager.cpp.

3198  {
3199 
3200  Interface &m_field = cOre;
3201  const Problem *problem_ptr;
3203  CHKERR m_field.get_problem(problem_name, &problem_ptr);
3204  boost::shared_ptr<NumeredDofEntity_multiIndex> dofs;
3205  switch (rc) {
3206  case ROW:
3207  dofs = problem_ptr->getNumeredRowDofsPtr();
3208  break;
3209  case COL:
3210  dofs = problem_ptr->getNumeredColDofsPtr();
3211  default:
3212  SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE, "Should be row or column");
3213  }
3214  marker.resize(dofs->size(), 0);
3215  std::vector<unsigned char> marker_tmp;
3216 
3217  switch (op) {
3218  case MarkOP::OR:
3219  for (auto p = ents.pair_begin(); p != ents.pair_end(); ++p) {
3220  auto lo = dofs->get<Ent_mi_tag>().lower_bound(p->first);
3221  auto hi = dofs->get<Ent_mi_tag>().upper_bound(p->second);
3222  for (; lo != hi; ++lo)
3223  marker[(*lo)->getPetscLocalDofIdx()] |= 1;
3224  }
3225  break;
3226  case MarkOP::AND:
3227  marker_tmp.resize(dofs->size(), 0);
3228  for (auto p = ents.pair_begin(); p != ents.pair_end(); ++p) {
3229  auto lo = dofs->get<Ent_mi_tag>().lower_bound(p->first);
3230  auto hi = dofs->get<Ent_mi_tag>().upper_bound(p->second);
3231  for (; lo != hi; ++lo)
3232  marker_tmp[(*lo)->getPetscLocalDofIdx()] = 1;
3233  }
3234  for (int i = 0; i != marker.size(); ++i) {
3235  marker[i] &= marker_tmp[i];
3236  }
3237  break;
3238  }
3239 
3241 }

◆ markDofs() [2/2]

DEPRECATED MoFEMErrorCode MoFEM::ProblemsManager::markDofs ( const std::string  problem_name,
RowColData  rc,
const Range  ents,
std::vector< unsigned char > &  marker 
) const
inline
Deprecated:
use function with MarkOP

Definition at line 387 of file ProblemsManager.hpp.

388  {
389  return markDofs(problem_name, rc, MarkOP::OR, ents, marker);
390  }

◆ modifyMarkDofs()

MoFEMErrorCode MoFEM::ProblemsManager::modifyMarkDofs ( const std::string  problem_name,
RowColData  rc,
const std::string  field_name,
const int  lo,
const int  hi,
const enum MarkOP  op,
const unsigned char  c,
std::vector< unsigned char > &  marker 
) const

Mark DOFs.

Parameters
problem_name
rc
field_name
lo
hi
op
marker
Returns
MoFEMErrorCode

Definition at line 3243 of file ProblemsManager.cpp.

3246  {
3247 
3248  Interface &m_field = cOre;
3249  const Problem *problem_ptr;
3251  CHKERR m_field.get_problem(problem_name, &problem_ptr);
3252  boost::shared_ptr<NumeredDofEntity_multiIndex> dofs;
3253  switch (rc) {
3254  case ROW:
3255  dofs = problem_ptr->getNumeredRowDofsPtr();
3256  break;
3257  case COL:
3258  dofs = problem_ptr->getNumeredColDofsPtr();
3259  default:
3260  SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE, "Should be row or column");
3261  }
3262  marker.resize(dofs->size(), 0);
3263 
3264  auto dof_lo = dofs->get<Unique_mi_tag>().lower_bound(
3265  FieldEntity::getLoBitNumberUId(m_field.get_field_bit_number(field_name)));
3266  auto dof_hi = dofs->get<Unique_mi_tag>().upper_bound(
3267  FieldEntity::getHiBitNumberUId(m_field.get_field_bit_number(field_name)));
3268 
3269  auto marker_ref = [marker](auto &it) -> unsigned int & {
3270  return marker[(*it)->getPetscLocalDofIdx()];
3271  };
3272 
3273  switch (op) {
3274  case MarkOP::OR:
3275  for (; dof_lo != dof_hi; ++dof_lo)
3276  if ((*dof_lo)->getDofCoeffIdx() >= lo &&
3277  (*dof_lo)->getDofCoeffIdx() <= hi)
3278  marker[(*dof_lo)->getPetscLocalDofIdx()] |= c;
3279  break;
3280  case MarkOP::AND:
3281  for (; dof_lo != dof_hi; ++dof_lo)
3282  if ((*dof_lo)->getDofCoeffIdx() >= lo &&
3283  (*dof_lo)->getDofCoeffIdx() <= hi)
3284  marker[(*dof_lo)->getPetscLocalDofIdx()] &= c;
3285  break;
3286  }
3287 
3289 }

◆ printPartitionedProblem()

MoFEMErrorCode MoFEM::ProblemsManager::printPartitionedProblem ( const Problem problem_ptr,
int  verb = VERBOSE 
)

Definition at line 2065 of file ProblemsManager.cpp.

2065  {
2066  MoFEM::Interface &m_field = cOre;
2068 
2069  if (verb > QUIET) {
2070 
2071  MOFEM_LOG("SYNC", Sev::inform)
2072  << problem_ptr->getName() << " Nb. local dof "
2073  << problem_ptr->getNbLocalDofsRow() << " by "
2074  << problem_ptr->getNbLocalDofsCol() << " nb global dofs "
2075  << problem_ptr->getNbDofsRow() << " by " << problem_ptr->getNbDofsCol();
2076 
2077  MOFEM_LOG_SYNCHRONISE(m_field.get_comm())
2078  }
2079 
2081 }

◆ query_interface()

MoFEMErrorCode MoFEM::ProblemsManager::query_interface ( boost::typeindex::type_index  type_index,
UnknownInterface **  iface 
) const
virtual

Implements MoFEM::UnknownInterface.

Definition at line 49 of file ProblemsManager.cpp.

50  {
51  *iface = const_cast<ProblemsManager *>(this);
52  return 0;
53 }

◆ removeDofsOnEntitiesNotDistributed() [1/2]

MoFEMErrorCode MoFEM::ProblemsManager::removeDofsOnEntitiesNotDistributed ( const std::string  problem_name,
const std::string  field_name,
const BitRefLevel  bit_ref_level,
const BitRefLevel  bit_ref_mask,
Range ents_ptr = nullptr,
const int  lo_coeff = 0,
const int  hi_coeff = MAX_DOFS_ON_ENTITY,
const int  lo_order = 0,
const int  hi_order = 100,
int  verb = VERBOSE,
const bool  debug = false 
)

Remove DOFs from problem.

Remove DOFs from problem which are on entities on the given range and given field name. On the finite element level, DOFs can be still accessed however local PETSc indices and global PETSc indices are marked with the index -1.

Note
If the index is marked -1 it is not assembled and dropped by VecSetValues and MatSetValues.
Todo:
Not yet implemented update for AO maps and IS ranges if removed entities in composite problem or sub-problem
Parameters
problem_namename of the problem
field_namename of the field
entsentities on which DOFs are removed
lo_coefflow dof coefficient (rank)
hi_coeffhigh dof coefficient (rank)
verbverbosity level
debugto debug and seek for inconsistencies set to true
Returns
MoFEMErrorCode
Note
Use this function for non distributed meshes

Definition at line 3168 of file ProblemsManager.cpp.

3172  {
3173  MoFEM::Interface &m_field = cOre;
3175 
3176  auto bit_manager = m_field.getInterface<BitRefManager>();
3177 
3178  Range ents;
3179  if (ents_ptr) {
3180  ents = *ents_ptr;
3181  CHKERR bit_manager->filterEntitiesByRefLevel(bit_ref_level, bit_ref_mask,
3182  ents, verb);
3183  } else {
3184  CHKERR bit_manager->getEntitiesByRefLevel(bit_ref_level, bit_ref_mask, ents,
3185  verb);
3186  }
3187 
3189  lo_coeff, hi_coeff, lo_order,
3190  hi_order, verb, debug);
3191 
3193 }

◆ removeDofsOnEntitiesNotDistributed() [2/2]

MoFEMErrorCode MoFEM::ProblemsManager::removeDofsOnEntitiesNotDistributed ( const std::string  problem_name,
const std::string  field_name,
const Range  ents,
const int  lo_coeff = 0,
const int  hi_coeff = MAX_DOFS_ON_ENTITY,
const int  lo_order = 0,
const int  hi_order = 100,
int  verb = VERBOSE,
const bool  debug = false 
)

Remove DOFs from problem.

Remove DOFs from problem which are on entities on the given range and given field name. On the finite element level, DOFs can be still accessed however local PETSc indices and global PETSc indices are marked with the index -1.

Note
If the index is marked -1 it is not assembled and dropped by VecSetValues and MatSetValues.
Todo:
Not yet implemented update for AO maps and IS ranges if removed entities in composite problem or sub-problem
Parameters
problem_namename of the problem
field_namename of the field
entsentities on which DOFs are removed
lo_coefflow dof coefficient (rank)
hi_coeffhigh dof coefficient (rank)
verbverbosity level
debugto debug and seek for inconsistencies set to true
Returns
MoFEMErrorCode
Note
Use this function for nondistributed meshes
Examples
remove_entities_from_problem_not_partitioned.cpp.

Definition at line 2876 of file ProblemsManager.cpp.

2879  {
2880 
2881  MoFEM::Interface &m_field = cOre;
2883 
2884  const Problem *prb_ptr;
2885  CHKERR m_field.get_problem(problem_name, &prb_ptr);
2886 
2887  decltype(prb_ptr->numeredRowDofsPtr) numered_dofs[2] = {
2888  prb_ptr->numeredRowDofsPtr, nullptr};
2889  if (prb_ptr->numeredRowDofsPtr != prb_ptr->numeredColDofsPtr)
2890  numered_dofs[1] = prb_ptr->numeredColDofsPtr;
2891 
2892  int *nbdof_ptr[] = {&prb_ptr->nbDofsRow, &prb_ptr->nbDofsCol};
2893  int *local_nbdof_ptr[] = {&prb_ptr->nbLocDofsRow, &prb_ptr->nbLocDofsCol};
2894  int *ghost_nbdof_ptr[] = {&prb_ptr->nbGhostDofsRow, &prb_ptr->nbGhostDofsCol};
2895 
2896  const int nb_init_row_dofs = prb_ptr->getNbDofsRow();
2897  const int nb_init_col_dofs = prb_ptr->getNbDofsCol();
2898  const int nb_init_loc_row_dofs = prb_ptr->getNbLocalDofsRow();
2899  // const int nb_init_loc_col_dofs = prb_ptr->getNbLocalDofsCol();
2900  const int nb_init_ghost_row_dofs = prb_ptr->getNbGhostDofsRow();
2901  const int nb_init_ghost_col_dofs = prb_ptr->getNbGhostDofsCol();
2902 
2903  const std::array<int, 2> nb_init_dofs = {nb_init_row_dofs, nb_init_col_dofs};
2904 
2905  for (int s = 0; s != 2; ++s)
2906  if (numered_dofs[s]) {
2907 
2908  typedef multi_index_container<
2909 
2910  NumeredDofEntity_multiIndex::iterator, indexed_by<sequenced<>>
2911 
2912  >
2913  NumeredDofEntity_it_view_multiIndex;
2914 
2915  const auto bit_number = m_field.get_field_bit_number(field_name);
2916  NumeredDofEntity_it_view_multiIndex dofs_it_view;
2917 
2918  // Set -1 to global and local dofs indices
2919  for (auto pit = ents.const_pair_begin(); pit != ents.const_pair_end();
2920  ++pit) {
2921  auto lo = numered_dofs[s]->get<Unique_mi_tag>().lower_bound(
2922  DofEntity::getLoFieldEntityUId(bit_number, pit->first));
2923  auto hi = numered_dofs[s]->get<Unique_mi_tag>().upper_bound(
2924  DofEntity::getHiFieldEntityUId(bit_number, pit->second));
2925 
2926  for (; lo != hi; ++lo)
2927  if ((*lo)->getDofCoeffIdx() >= lo_coeff &&
2928  (*lo)->getDofCoeffIdx() <= hi_coeff &&
2929  (*lo)->getDofOrder() >= lo_order &&
2930  (*lo)->getDofOrder() <= hi_order)
2931  dofs_it_view.emplace_back(numered_dofs[s]->project<0>(lo));
2932  }
2933 
2934  if (verb > QUIET) {
2935  for (auto &dof : dofs_it_view)
2936  MOFEM_LOG("SYNC", Sev::noisy) << **dof;
2937  }
2938 
2939  // set negative index
2940  auto mod = NumeredDofEntity_part_and_all_indices_change(-1, -1, -1, -1);
2941  for (auto dit : dofs_it_view) {
2942  bool success = numered_dofs[s]->modify(dit, mod);
2943  if (!success)
2944  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
2945  "can not set negative indices");
2946  }
2947 
2948  // create weak view
2949  std::vector<boost::weak_ptr<NumeredDofEntity>> dosf_weak_view;
2950  dosf_weak_view.reserve(dofs_it_view.size());
2951  for (auto dit : dofs_it_view)
2952  dosf_weak_view.push_back(*dit);
2953 
2954  if (verb >= NOISY)
2955  MOFEM_LOG_C("SYNC", Sev::noisy,
2956  "Number of DOFs in multi-index %d and to delete %d\n",
2957  numered_dofs[s]->size(), dofs_it_view.size());
2958 
2959  // erase dofs from problem
2960  for (auto weak_dit : dosf_weak_view)
2961  if (auto dit = weak_dit.lock()) {
2962  numered_dofs[s]->erase(dit->getLocalUniqueId());
2963  }
2964 
2965  if (verb >= NOISY)
2966  MOFEM_LOG_C("SYNC", Sev::noisy,
2967  "Number of DOFs in multi-index after delete %d\n",
2968  numered_dofs[s]->size());
2969 
2970  // get current number of ghost dofs
2971  int nb_global_dof = 0;
2972  int nb_local_dofs = 0;
2973  int nb_ghost_dofs = 0;
2974 
2975  for (auto dit = numered_dofs[s]->begin(); dit != numered_dofs[s]->end();
2976  ++dit) {
2977 
2978  if ((*dit)->getDofIdx() >= 0) {
2979 
2980  if ((*dit)->getPetscLocalDofIdx() >= 0 &&
2981  (*dit)->getPetscLocalDofIdx() < *(local_nbdof_ptr[s]))
2982  ++nb_local_dofs;
2983  else if ((*dit)->getPetscLocalDofIdx() >= *(local_nbdof_ptr[s]))
2984  ++nb_ghost_dofs;
2985 
2986  ++nb_global_dof;
2987  }
2988  }
2989 
2990  if (debug) {
2991  MPI_Allreduce(&nb_local_dofs, nbdof_ptr[s], 1, MPI_INT, MPI_SUM,
2992  m_field.get_comm());
2993  if (*(nbdof_ptr[s]) != nb_global_dof)
2994  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
2995  "Number of local DOFs do not add up %d != %d",
2996  *(nbdof_ptr[s]), nb_global_dof);
2997  }
2998 
2999  *(nbdof_ptr[s]) = nb_global_dof;
3000  *(local_nbdof_ptr[s]) = nb_local_dofs;
3001  *(ghost_nbdof_ptr[s]) = nb_ghost_dofs;
3002 
3003  // get indices
3004  auto get_indices_by_tag = [&](auto tag) {
3005  std::vector<int> indices;
3006  indices.resize(nb_init_dofs[s], -1);
3007  for (auto dit = numered_dofs[s]->get<Idx_mi_tag>().lower_bound(0);
3008  dit != numered_dofs[s]->get<Idx_mi_tag>().end(); ++dit) {
3009  indices[(*dit)->getDofIdx()] = decltype(tag)::get_index(dit);
3010  }
3011  return indices;
3012  };
3013 
3014  auto renumber = [&](auto tag, auto &indices) {
3016  int idx = 0;
3017  for (auto dit = numered_dofs[s]->get<decltype(tag)>().lower_bound(0);
3018  dit != numered_dofs[s]->get<decltype(tag)>().end(); ++dit) {
3019  indices[(*dit)->getDofIdx()] = idx++;
3020  }
3022  };
3023 
3024  auto get_sub_ao = [&](auto sub_data) {
3025  if (s == 0) {
3026  return sub_data->getSmartRowMap();
3027  } else {
3028  return sub_data->getSmartColMap();
3029  }
3030  };
3031 
3032  auto set_sub_is_and_ao = [&s, &prb_ptr](auto sub_data, auto is, auto ao) {
3033  if (s == 0) {
3034  sub_data->rowIs = is;
3035  sub_data->rowMap = ao;
3036  } else {
3037  sub_data->colIs = is;
3038  sub_data->colMap = ao;
3039  }
3040  };
3041 
3042  auto apply_symmetry = [&s, &prb_ptr](auto sub_data) {
3043  if (s == 0) {
3044  if (prb_ptr->numeredRowDofsPtr == prb_ptr->numeredColDofsPtr) {
3045  sub_data->colIs = sub_data->getSmartRowIs();
3046  sub_data->colMap = sub_data->getSmartRowMap();
3047  }
3048  }
3049  };
3050 
3051  auto set_sub_data = [&](auto &indices) {
3053  if (auto sub_data = prb_ptr->getSubData()) {
3054  // create is and then map it to main problem of sub-problem
3055  auto sub_is = createISGeneral(m_field.get_comm(), indices.size(),
3056  &*indices.begin(), PETSC_COPY_VALUES);
3057  // get old app, i.e. oroginal befor sub indices, and ao, from
3058  // app, to petsc sub indices.
3059  auto sub_ao = get_sub_ao(sub_data);
3060  CHKERR AOPetscToApplicationIS(sub_ao, sub_is);
3061  sub_ao = createAOMappingIS(sub_is, PETSC_NULL);
3062  // set new sub ao
3063  set_sub_is_and_ao(sub_data, sub_is, sub_ao);
3064  apply_symmetry(sub_data);
3065  } else {
3066  prb_ptr->getSubData() = boost::make_shared<Problem::SubProblemData>();
3067  auto sub_is = createISGeneral(m_field.get_comm(), indices.size(),
3068  &*indices.begin(), PETSC_COPY_VALUES);
3069  auto sub_ao = createAOMappingIS(sub_is, PETSC_NULL);
3070  // set sub is ao
3071  set_sub_is_and_ao(prb_ptr->getSubData(), sub_is, sub_ao);
3072  apply_symmetry(prb_ptr->getSubData());
3073  }
3075  };
3076 
3077  auto global_indices = get_indices_by_tag(PetscGlobalIdx_mi_tag());
3078  auto local_indices = get_indices_by_tag(PetscLocalIdx_mi_tag());
3079  CHKERR set_sub_data(global_indices);
3080  CHKERR renumber(PetscGlobalIdx_mi_tag(), global_indices);
3081  CHKERR renumber(PetscLocalIdx_mi_tag(), local_indices);
3082 
3083  int i = 0;
3084  for (auto dit = numered_dofs[s]->begin(); dit != numered_dofs[s]->end();
3085  ++dit) {
3086  auto idx = (*dit)->getDofIdx();
3087  if (idx >= 0) {
3088  auto mod = NumeredDofEntity_part_and_all_indices_change(
3089  (*dit)->getPart(), i++, global_indices[idx], local_indices[idx]);
3090  bool success = numered_dofs[s]->modify(dit, mod);
3091  if (!success)
3092  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
3093  "can not set negative indices");
3094  } else {
3095  auto mod = NumeredDofEntity_part_and_all_indices_change(
3096  (*dit)->getPart(), -1, -1, -1);
3097  bool success = numered_dofs[s]->modify(dit, mod);
3098  if (!success)
3099  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
3100  "can not set negative indices");
3101  }
3102  };
3103 
3104  if (debug) {
3105  for (auto dof : (*numered_dofs[s])) {
3106  if (dof->getDofIdx() >= 0 && dof->getPetscGlobalDofIdx() < 0) {
3107  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
3108  "Negative global idx");
3109  }
3110  }
3111  }
3112 
3113  } else {
3114 
3115  *(nbdof_ptr[1]) = *(nbdof_ptr[0]);
3116  *(local_nbdof_ptr[1]) = *(local_nbdof_ptr[0]);
3117  *(ghost_nbdof_ptr[1]) = *(ghost_nbdof_ptr[0]);
3118  }
3119 
3120  if (verb >= NOISY)
3121  MOFEM_LOG_SYNCHRONISE(m_field.get_comm());
3122 
3123  if (verb > QUIET) {
3124  MOFEM_LOG_C(
3125  "WORLD", Sev::inform,
3126  "Removed DOFs from problem %s dofs [%d / %d (before %d / %d) global]",
3127  prb_ptr->getName().c_str(), prb_ptr->getNbDofsRow(),
3128  prb_ptr->getNbDofsCol(), nb_init_row_dofs, nb_init_col_dofs);
3129  MOFEM_LOG_C("SYNC", Sev::verbose,
3130  "Removed DOFs from problem %s dofs [ %d / %d "
3131  "(before %d / %d) local, %d / %d (before %d / %d)]",
3132  prb_ptr->getName().c_str(), prb_ptr->getNbLocalDofsRow(),
3133  prb_ptr->getNbLocalDofsCol(), nb_init_loc_row_dofs,
3134  nb_init_loc_row_dofs, prb_ptr->getNbGhostDofsRow(),
3135  prb_ptr->getNbGhostDofsCol(), nb_init_ghost_row_dofs,
3136  nb_init_ghost_col_dofs);
3137  MOFEM_LOG_SYNCHRONISE(m_field.get_comm());
3138  }
3140 }

Member Data Documentation

◆ buildProblemFromFields

PetscBool MoFEM::ProblemsManager::buildProblemFromFields

If set to true, problem is build from

Definition at line 30 of file ProblemsManager.hpp.

◆ cOre

MoFEM::Core& MoFEM::ProblemsManager::cOre

Definition at line 26 of file ProblemsManager.hpp.

◆ MOFEM_EVENT_ProblemsManager

PetscLogEvent MoFEM::ProblemsManager::MOFEM_EVENT_ProblemsManager
private

Definition at line 427 of file ProblemsManager.hpp.

◆ synchroniseProblemEntities

PetscBool MoFEM::ProblemsManager::synchroniseProblemEntities

DOFs in fields, not from DOFs on elements.

Definition at line 33 of file ProblemsManager.hpp.


The documentation for this struct was generated from the following files:
MoFEMFunctionReturnHot
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:447
MoFEM::UnknownInterface::getInterface
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.
Definition: UnknownInterface.hpp:93
MoFEM::createAOMappingIS
auto createAOMappingIS(IS isapp, IS ispetsc)
Creates an application mapping using two index sets.
Definition: PetscSmartObj.hpp:302
MoFEM::ProblemsManager::buildProblemFromFields
PetscBool buildProblemFromFields
Definition: ProblemsManager.hpp:30
MoFEM::CoreTmp< 0 >
Core (interface) class.
Definition: Core.hpp:82
ProblemManagerFunctionBegin
#define ProblemManagerFunctionBegin
Definition: ProblemsManager.cpp:8
MoFEM::createISGeneral
auto createISGeneral(MPI_Comm comm, PetscInt n, const PetscInt idx[], PetscCopyMode mode)
Creates a data structure for an index set containing a list of integers.
Definition: PetscSmartObj.hpp:283
EntityHandle
NOISY
@ NOISY
Definition: definitions.h:211
MoFEM::CoreInterface::get_comm
virtual MPI_Comm & get_comm() const =0
MoFEM::CoreInterface::get_field_bit_number
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
MoFEM::CoreInterface::get_comm_rank
virtual int get_comm_rank() const =0
MoFEM::CoreInterface::get_problem
virtual const Problem * get_problem(const std::string problem_name) const =0
Get the problem object.
MoFEM::ProblemsManager::OR
@ OR
Definition: ProblemsManager.hpp:365
MOFEM_IMPOSSIBLE_CASE
@ MOFEM_IMPOSSIBLE_CASE
Definition: definitions.h:35
MoFEM::DeprecatedCoreInterface
Deprecated interface functions.
Definition: DeprecatedCoreInterface.hpp:16
ROW
@ ROW
Definition: definitions.h:123
MoFEM::Interface
DeprecatedCoreInterface Interface
Definition: Interface.hpp:1975
c
const double c
speed of light (cm/ns)
Definition: initial_diffusion.cpp:39
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:535
MoFEM::CoreInterface::get_moab
virtual moab::Interface & get_moab()=0
MoFEM::ProblemsManager::cOre
MoFEM::Core & cOre
Definition: ProblemsManager.hpp:26
MoFEM::ProblemsManager::removeDofsOnEntitiesNotDistributed
MoFEMErrorCode removeDofsOnEntitiesNotDistributed(const std::string problem_name, const std::string field_name, const Range ents, const int lo_coeff=0, const int hi_coeff=MAX_DOFS_ON_ENTITY, const int lo_order=0, const int hi_order=100, int verb=VERBOSE, const bool debug=false)
Remove DOFs from problem.
Definition: ProblemsManager.cpp:2876
MOFEM_LOG_C
#define MOFEM_LOG_C(channel, severity, format,...)
Definition: LogManager.hpp:311
convert.type
type
Definition: convert.py:64
MOFEM_LOG_SYNCHRONISE
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
Definition: LogManager.hpp:345
MoFEM::FieldEntity::getLoBitNumberUId
static UId getLoBitNumberUId(const FieldBitNumber bit_number)
Definition: FieldEntsMultiIndices.hpp:222
COL
@ COL
Definition: definitions.h:123
MoFEM::ProblemsManager::markDofs
MoFEMErrorCode markDofs(const std::string problem_name, RowColData rc, const enum MarkOP op, const Range ents, std::vector< unsigned char > &marker) const
Create vector with marked indices.
Definition: ProblemsManager.cpp:3196
MoFEM::BlockFieldPair
Problem::BlockFieldPair BlockFieldPair
Definition: ProblemsMultiIndices.hpp:562
MOFEM_OPERATION_UNSUCCESSFUL
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition: definitions.h:34
debug
static const bool debug
Definition: dm_create_subdm.cpp:12
i
FTensor::Index< 'i', SPACE_DIM > i
Definition: hcurl_divergence_operator_2d.cpp:27
MoFEM::DofEntity::getLoFieldEntityUId
static UId getLoFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
Definition: DofsMultiIndices.hpp:69
field_name
constexpr auto field_name
Definition: poisson_2d_homogeneous.cpp:13
MoFEM::ProblemsManager::AND
@ AND
Definition: ProblemsManager.hpp:365
MoFEM::Problem::numeredRowDofsPtr
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredRowDofsPtr
store DOFs on rows for this problem
Definition: ProblemsMultiIndices.hpp:73
Range
MoFEM::ProblemsManager::MOFEM_EVENT_ProblemsManager
PetscLogEvent MOFEM_EVENT_ProblemsManager
Definition: ProblemsManager.hpp:427
MOFEM_LOG
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308
MoFEM::DofEntity::getHiFieldEntityUId
static UId getHiFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
Definition: DofsMultiIndices.hpp:75
MoFEM::ProblemsManager::synchroniseProblemEntities
PetscBool synchroniseProblemEntities
DOFs in fields, not from DOFs on elements.
Definition: ProblemsManager.hpp:33
MoFEM::Exceptions::ierr
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
MoFEM::ProblemsManager::ProblemsManager
ProblemsManager(const MoFEM::Core &core)
Definition: ProblemsManager.cpp:55
MoFEM::FieldEntity::getHiBitNumberUId
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
Definition: FieldEntsMultiIndices.hpp:228
marker
auto marker
set bit to marker
Definition: hanging_node_approx.cpp:82
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:440
QUIET
@ QUIET
Definition: definitions.h:208
convert.int
int
Definition: convert.py:64
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
CHKERRG
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:483
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346