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 reference 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 3296 of file ProblemsManager.cpp.

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

◆ 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 3200 of file ProblemsManager.cpp.

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

◆ 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 3247 of file ProblemsManager.cpp.

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

◆ 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 3172 of file ProblemsManager.cpp.

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

◆ 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 non-distributed meshes
Examples
remove_entities_from_problem_not_partitioned.cpp.

Definition at line 2878 of file ProblemsManager.cpp.

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

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:460
MoFEM::UnknownInterface::getInterface
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference 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:318
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:287
EntityHandle
NOISY
@ NOISY
Definition: definitions.h:224
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:136
MoFEM::Interface
DeprecatedCoreInterface Interface
Definition: Interface.hpp:2002
c
const double c
speed of light (cm/ns)
Definition: initial_diffusion.cpp:39
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
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:2878
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:136
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:3200
MoFEM::BlockFieldPair
Problem::BlockFieldPair BlockFieldPair
Definition: ProblemsMultiIndices.hpp:566
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:453
QUIET
@ QUIET
Definition: definitions.h:221
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:429
CHKERRG
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:496
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359