v0.13.2
Loading...
Searching...
No Matches
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
virtual MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const =0
 
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
EshelbianPlasticity.cpp, Remodeling.cpp, 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, forces_and_sources_testing_edge_element.cpp, forces_and_sources_testing_flat_prism_element.cpp, forces_and_sources_testing_users_base.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, remove_entities_from_problem.cpp, remove_entities_from_problem_not_partitioned.cpp, and test_cache_on_entities.cpp.

Definition at line 21 of file ProblemsManager.hpp.

Member Enumeration Documentation

◆ MarkOP

Enumerator
OR 
AND 

Definition at line 365 of file ProblemsManager.hpp.

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}
Core (interface) class.
Definition: Core.hpp:82
PetscLogEvent MOFEM_EVENT_ProblemsManager
PetscBool synchroniseProblemEntities
DOFs in fields, not from DOFs on elements.

◆ ~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(EmptyFieldBlocks(row_id, col_id));
3311
3313}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
Problem::EmptyFieldBlocks EmptyFieldBlocks
DeprecatedCoreInterface Interface
Definition: Interface.hpp:1975
constexpr auto field_name

◆ debugPartitionedProblem()

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

Definition at line 2086 of file ProblemsManager.cpp.

2086 {
2087 MoFEM::Interface &m_field = cOre;
2089
2090 auto save_ent = [](moab::Interface &moab, const std::string name,
2091 const EntityHandle ent) {
2093 EntityHandle out_meshset;
2094 CHKERR moab.create_meshset(MESHSET_SET, out_meshset);
2095 CHKERR moab.add_entities(out_meshset, &ent, 1);
2096 CHKERR moab.write_file(name.c_str(), "VTK", "", &out_meshset, 1);
2097 CHKERR moab.delete_entities(&out_meshset, 1);
2099 };
2100
2101 if (debug > 0) {
2102
2103 typedef NumeredDofEntity_multiIndex::index<Idx_mi_tag>::type
2104 NumeredDofEntitysByIdx;
2105 NumeredDofEntitysByIdx::iterator dit, hi_dit;
2106 const NumeredDofEntitysByIdx *numered_dofs_ptr[] = {
2107 &(problem_ptr->numeredRowDofsPtr->get<Idx_mi_tag>()),
2108 &(problem_ptr->numeredColDofsPtr->get<Idx_mi_tag>())};
2109
2110 int *nbdof_ptr[] = {&problem_ptr->nbDofsRow, &problem_ptr->nbDofsCol};
2111 int *local_nbdof_ptr[] = {&problem_ptr->nbLocDofsRow,
2112 &problem_ptr->nbLocDofsCol};
2113
2114 for (int ss = 0; ss < 2; ss++) {
2115
2116 dit = numered_dofs_ptr[ss]->begin();
2117 hi_dit = numered_dofs_ptr[ss]->end();
2118 for (; dit != hi_dit; dit++) {
2119 if ((*dit)->getPart() == (unsigned int)m_field.get_comm_rank()) {
2120 if ((*dit)->getPetscLocalDofIdx() < 0) {
2121 std::ostringstream zz;
2122 zz << "rank " << m_field.get_comm_rank() << " " << **dit;
2123 SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2124 "local dof index for %d (0-row, 1-col) not set, i.e. has "
2125 "negative value\n %s",
2126 ss, zz.str().c_str());
2127 }
2128 if ((*dit)->getPetscLocalDofIdx() >= *local_nbdof_ptr[ss]) {
2129 std::ostringstream zz;
2130 zz << "rank " << m_field.get_comm_rank() << " " << **dit;
2131 SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2132 "local dofs for %d (0-row, 1-col) out of range\n %s", ss,
2133 zz.str().c_str());
2134 }
2135 } else {
2136 if ((*dit)->getPetscGlobalDofIdx() < 0) {
2137
2138 const EntityHandle ent = (*dit)->getEnt();
2139 CHKERR save_ent(
2140 m_field.get_moab(),
2141 "debug_part" +
2142 boost::lexical_cast<std::string>(m_field.get_comm_rank()) +
2143 "_negative_global_index.vtk",
2144 ent);
2145
2146 std::ostringstream zz;
2147 zz << "rank " << m_field.get_comm_rank() << " "
2148 << dit->get()->getBitRefLevel() << " " << **dit;
2149 SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2150 "global dof index for %d (0-row, 1-col) row not set, i.e. "
2151 "has negative value\n %s",
2152 ss, zz.str().c_str());
2153 }
2154 if ((*dit)->getPetscGlobalDofIdx() >= *nbdof_ptr[ss]) {
2155 std::ostringstream zz;
2156 zz << "rank " << m_field.get_comm_rank() << " nb_dofs "
2157 << *nbdof_ptr[ss] << " " << **dit;
2158 SETERRQ2(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
2159 "global dofs for %d (0-row, 1-col) out of range\n %s", ss,
2160 zz.str().c_str());
2161 }
2162 }
2163 }
2164 }
2165 }
2167}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:447
@ MOFEM_IMPOSSIBLE_CASE
Definition: definitions.h:35
#define CHKERR
Inline error check.
Definition: definitions.h:535
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:440
static const bool debug
virtual moab::Interface & get_moab()=0
virtual int get_comm_rank() const =0
Deprecated interface functions.

◆ 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();
75}
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:483
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
virtual MPI_Comm & get_comm() const =0

◆ 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}
static Index< 'p', 3 > p
#define ProblemManagerFunctionBegin
@ COL
Definition: definitions.h:123
@ ROW
Definition: definitions.h:123
auto marker
set bit to marker
FTensor::Index< 'i', SPACE_DIM > i

◆ 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 }
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.

◆ 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}
const double c
speed of light (cm/ns)
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
static UId getLoBitNumberUId(const FieldBitNumber bit_number)

◆ printPartitionedProblem()

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

Definition at line 2067 of file ProblemsManager.cpp.

2067 {
2068 MoFEM::Interface &m_field = cOre;
2070
2071 if (verb > QUIET) {
2072
2073 MOFEM_LOG("SYNC", Sev::inform)
2074 << problem_ptr->getName() << " Nb. local dof "
2075 << problem_ptr->getNbLocalDofsRow() << " by "
2076 << problem_ptr->getNbLocalDofsCol() << " nb global dofs "
2077 << problem_ptr->getNbDofsRow() << " by " << problem_ptr->getNbDofsCol();
2078
2080 }
2081
2083}
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
Definition: LogManager.hpp:345
@ QUIET
Definition: definitions.h:208
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308

◆ 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}
ProblemsManager(const MoFEM::Core &core)

◆ 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 nondistributed 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}
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.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.

◆ 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 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 } else {
3039 sub_data->colIs = is;
3040 sub_data->colMap = ao;
3041 }
3042 };
3043
3044 auto apply_symmetry = [&s, &prb_ptr](auto sub_data) {
3045 if (s == 0) {
3046 if (prb_ptr->numeredRowDofsPtr == prb_ptr->numeredColDofsPtr) {
3047 sub_data->colIs = sub_data->getSmartRowIs();
3048 sub_data->colMap = sub_data->getSmartRowMap();
3049 }
3050 }
3051 };
3052
3053 auto set_sub_data = [&](auto &indices) {
3055 if (auto sub_data = prb_ptr->getSubData()) {
3056 // create is and then map it to main problem of sub-problem
3057 auto sub_is = createISGeneral(m_field.get_comm(), indices.size(),
3058 &*indices.begin(), PETSC_COPY_VALUES);
3059 // get old app, i.e. oroginal befor sub indices, and ao, from
3060 // app, to petsc sub indices.
3061 auto sub_ao = get_sub_ao(sub_data);
3062 CHKERR AOPetscToApplicationIS(sub_ao, sub_is);
3063 sub_ao = createAOMappingIS(sub_is, PETSC_NULL);
3064 // set new sub ao
3065 set_sub_is_and_ao(sub_data, sub_is, sub_ao);
3066 apply_symmetry(sub_data);
3067 } else {
3068 prb_ptr->getSubData() = boost::make_shared<Problem::SubProblemData>();
3069 auto sub_is = createISGeneral(m_field.get_comm(), indices.size(),
3070 &*indices.begin(), PETSC_COPY_VALUES);
3071 auto sub_ao = createAOMappingIS(sub_is, PETSC_NULL);
3072 // set sub is ao
3073 set_sub_is_and_ao(prb_ptr->getSubData(), sub_is, sub_ao);
3074 apply_symmetry(prb_ptr->getSubData());
3075 }
3077 };
3078
3079 auto global_indices = get_indices_by_tag(PetscGlobalIdx_mi_tag());
3080 auto local_indices = get_indices_by_tag(PetscLocalIdx_mi_tag());
3081 CHKERR set_sub_data(global_indices);
3082 CHKERR renumber(PetscGlobalIdx_mi_tag(), global_indices);
3083 CHKERR renumber(PetscLocalIdx_mi_tag(), local_indices);
3084
3085 int i = 0;
3086 for (auto dit = numered_dofs[s]->begin(); dit != numered_dofs[s]->end();
3087 ++dit) {
3088 auto idx = (*dit)->getDofIdx();
3089 if (idx >= 0) {
3090 auto mod = NumeredDofEntity_part_and_all_indices_change(
3091 (*dit)->getPart(), i++, global_indices[idx], local_indices[idx]);
3092 bool success = numered_dofs[s]->modify(dit, mod);
3093 if (!success)
3094 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
3095 "can not set negative indices");
3096 } else {
3097 auto mod = NumeredDofEntity_part_and_all_indices_change(
3098 (*dit)->getPart(), -1, -1, -1);
3099 bool success = numered_dofs[s]->modify(dit, mod);
3100 if (!success)
3101 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
3102 "can not set negative indices");
3103
3104 }
3105 };
3106
3107 if (debug) {
3108 for (auto dof : (*numered_dofs[s])) {
3109 if (dof->getDofIdx() >= 0 && dof->getPetscGlobalDofIdx() < 0) {
3110 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
3111 "Negative global idx");
3112 }
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)
3126
3127 if (verb > QUIET) {
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);
3142 }
3144}
#define MOFEM_LOG_C(channel, severity, format,...)
Definition: LogManager.hpp:311
@ NOISY
Definition: definitions.h:211
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition: definitions.h:34
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
virtual const Problem * get_problem(const std::string problem_name) const =0
Get the problem object.
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.
auto createAOMappingIS(IS isapp, IS ispetsc)
Creates an application mapping using two index sets.
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
static UId getLoFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
static UId getHiFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredRowDofsPtr
store DOFs on rows for this problem

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: