https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Namespaces | Functions
PetscDMMoose.h File Reference

Go to the source code of this file.

Namespaces

namespace  libMesh
 The following methods are specializations for using the libMesh::Parallel::packed_range_* routines for std::strings.
 

Functions

PetscErrorCode DMMooseRegisterAll ()
 
PetscErrorCode DMCreateMoose (MPI_Comm comm, NonlinearSystemBase &nl, const libMesh::DofMapBase &dof_map, const libMesh::System &system, const std::string &dm_name, DM *dm)
 Create a MOOSE DM.
 
PetscErrorCode DMMooseReset (DM)
 
PetscErrorCode DMMooseSetNonlinearSystem (DM, NonlinearSystemBase &)
 
PetscErrorCode DMMooseGetNonlinearSystem (DM, NonlinearSystemBase *&)
 
PetscErrorCode DMMooseSetDofMap (DM, const libMesh::DofMapBase &)
 
PetscErrorCode DMMooseGetBlocks (DM, std::vector< std::string > &)
 
PetscErrorCode DMMooseGetVariables (DM, std::vector< std::string > &)
 
PetscErrorCode DMMooseGetSides (DM, std::set< std::string > &)
 
PetscErrorCode DMMooseGetUnSides (DM, std::set< std::string > &)
 
PetscErrorCode DMMooseGetContacts (DM, std::vector< std::pair< std::string, std::string > > &, std::vector< bool > &)
 
PetscErrorCode DMMooseGetUnContacts (DM, std::vector< std::pair< std::string, std::string > > &, std::vector< bool > &)
 
PetscErrorCode DMMooseSetBlocks (DM, const std::vector< std::string > &)
 
PetscErrorCode DMMooseSetVariables (DM, const std::vector< std::string > &)
 
PetscErrorCode DMMooseSetSides (DM, const std::set< std::string > &)
 
PetscErrorCode DMMooseSetUnSides (DM, const std::set< std::string > &)
 
PetscErrorCode DMMooseSetContacts (DM, const std::vector< std::pair< std::string, std::string > > &, const std::vector< bool > &)
 
PetscErrorCode DMMooseSetUnContacts (DM, const std::vector< std::pair< std::string, std::string > > &, const std::vector< bool > &)
 
PetscErrorCode DMMooseSetSplitNames (DM, const std::vector< std::string > &)
 
PetscErrorCode DMMooseGetSplitNames (DM, const std::vector< std::string > &)
 
PetscErrorCode DMMooseSetSplitVars (DM, const std::string &, const std::set< std::string > &)
 
PetscErrorCode DMMooseGetSplitVars (DM, const std::string &, std::set< std::string > &)
 
PetscErrorCode DMMooseSetSplitBlocks (DM, const std::string &, const std::set< std::string > &)
 
PetscErrorCode DMMooseGetSplitBlocks (DM, const std::string &, std::set< std::string > &)
 
PetscErrorCode DMMooseSetSplitSides (DM, const std::string &, const std::set< std::string > &)
 
PetscErrorCode DMMooseGetSplitSides (DM, const std::string &, std::set< std::string > &)
 
PetscErrorCode SNESUpdateDMMoose (SNES snes, PetscInt iteration)
 

Function Documentation

◆ DMCreateMoose()

PetscErrorCode DMCreateMoose ( MPI_Comm  comm,
NonlinearSystemBase nl,
const libMesh::DofMapBase dof_map,
const libMesh::System system,
const std::string &  dm_name,
DM *  dm 
)
extern

Create a MOOSE DM.

Parameters
commThe communicator that the DM should use
nlThe nonlinear system context that the DM is associated with
dof_mapA reference to the DoFMap, which you can get from the system
dm_nameA name to associate with the DM
dmA pointer to the PETSc DM

Referenced by FieldSplitPreconditionerTempl< Base >::createMooseDM().

◆ DMMooseGetBlocks()

PetscErrorCode DMMooseGetBlocks ( DM  dm,
std::vector< std::string > &  block_names 
)
extern

Definition at line 201 of file PetscDMMoose.C.

202{
205 DM_Moose * dmm = (DM_Moose *)dm->data;
206 for (const auto & it : *(dmm->_block_ids))
207 block_names.push_back(it.first);
208 PetscFunctionReturn(PETSC_SUCCESS);
209}
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
PetscFunctionBegin
PetscErrorCode DMMooseValidityCheck(DM dm)

◆ DMMooseGetContacts()

PetscErrorCode DMMooseGetContacts ( DM  ,
std::vector< std::pair< std::string, std::string > > &  ,
std::vector< bool > &   
)
extern

◆ DMMooseGetNonlinearSystem()

PetscErrorCode DMMooseGetNonlinearSystem ( DM  dm,
NonlinearSystemBase *&  nl 
)
extern

Definition at line 444 of file PetscDMMoose.C.

445{
448 DM_Moose * dmm = (DM_Moose *)(dm->data);
449 nl = dmm->_nl;
450 PetscFunctionReturn(PETSC_SUCCESS);
451}
NonlinearSystemBase * _nl

Referenced by DMMooseFunction(), DMMooseJacobian(), and DMVariableBounds_Moose().

◆ DMMooseGetSides()

PetscErrorCode DMMooseGetSides ( DM  ,
std::set< std::string > &   
)
extern

◆ DMMooseGetSplitBlocks()

PetscErrorCode DMMooseGetSplitBlocks ( DM  ,
const std::string &  ,
std::set< std::string > &   
)
extern

◆ DMMooseGetSplitNames()

PetscErrorCode DMMooseGetSplitNames ( DM  ,
const std::vector< std::string > &   
)
extern

◆ DMMooseGetSplitSides()

PetscErrorCode DMMooseGetSplitSides ( DM  ,
const std::string &  ,
std::set< std::string > &   
)
extern

◆ DMMooseGetSplitVars()

PetscErrorCode DMMooseGetSplitVars ( DM  ,
const std::string &  ,
std::set< std::string > &   
)
extern

◆ DMMooseGetUnContacts()

PetscErrorCode DMMooseGetUnContacts ( DM  ,
std::vector< std::pair< std::string, std::string > > &  ,
std::vector< bool > &   
)
extern

◆ DMMooseGetUnSides()

PetscErrorCode DMMooseGetUnSides ( DM  ,
std::set< std::string > &   
)
extern

◆ DMMooseGetVariables()

PetscErrorCode DMMooseGetVariables ( DM  dm,
std::vector< std::string > &  var_names 
)
extern

Definition at line 212 of file PetscDMMoose.C.

213{
216 DM_Moose * dmm = (DM_Moose *)(dm->data);
217 for (const auto & it : *(dmm->_var_ids))
218 var_names.push_back(it.first);
219 PetscFunctionReturn(PETSC_SUCCESS);
220}

◆ DMMooseRegisterAll()

PetscErrorCode DMMooseRegisterAll ( )
extern

Definition at line 2178 of file PetscDMMoose.C.

2179{
2180 static PetscBool DMMooseRegisterAllCalled = PETSC_FALSE;
2181
2183 if (!DMMooseRegisterAllCalled)
2184 {
2185 LibmeshPetscCallQ(DMRegister(DMMOOSE, DMCreate_Moose));
2186 DMMooseRegisterAllCalled = PETSC_TRUE;
2187 }
2188 PetscFunctionReturn(PETSC_SUCCESS);
2189}
EXTERN_C_BEGIN PetscErrorCode DMCreate_Moose(DM dm)

Referenced by FieldSplitPreconditioner::setupDM(), and StaticCondensationFieldSplitPreconditioner::setupDM().

◆ DMMooseReset()

PetscErrorCode DMMooseReset ( DM  dm)
extern

Definition at line 1610 of file PetscDMMoose.C.

1611{
1612 PetscBool ismoose;
1613 DM_Moose * dmm = (DM_Moose *)(dm->data);
1614
1616 LibmeshPetscCallQ(PetscObjectTypeCompare((PetscObject)dm, DMMOOSE, &ismoose));
1617 if (!ismoose)
1618 PetscFunctionReturn(PETSC_SUCCESS);
1619 if (!dmm->_nl)
1620 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "No Moose system set for DM_Moose");
1621 LibmeshPetscCallQ(ISDestroy(&dmm->_embedding));
1622 for (auto & it : *(dmm->_splits))
1623 {
1624 DM_Moose::SplitInfo & split = it.second;
1625 LibmeshPetscCallQ(ISDestroy(&split._rembedding));
1626 if (split._dm)
1628 }
1629 dm->setupcalled = PETSC_FALSE;
1630 PetscFunctionReturn(PETSC_SUCCESS);
1631}
PetscErrorCode DMMooseReset(DM dm)
PETSC_ERR_ARG_WRONGSTATE
tbb::split split

Referenced by DMMooseReset(), and SNESUpdateDMMoose().

◆ DMMooseSetBlocks()

PetscErrorCode DMMooseSetBlocks ( DM  ,
const std::vector< std::string > &   
)
extern

◆ DMMooseSetContacts()

PetscErrorCode DMMooseSetContacts ( DM  ,
const std::vector< std::pair< std::string, std::string > > &  ,
const std::vector< bool > &   
)
extern

◆ DMMooseSetDofMap()

PetscErrorCode DMMooseSetDofMap ( DM  dm,
const libMesh::DofMapBase dof_map 
)
extern

Definition at line 237 of file PetscDMMoose.C.

238{
241 if (dm->setupcalled)
242 SETERRQ(((PetscObject)dm)->comm,
244 "Cannot reset the degree of freedom map after DM has been set up.");
245 DM_Moose * dmm = (DM_Moose *)(dm->data);
246 dmm->_dof_map = &dof_map;
247 PetscFunctionReturn(PETSC_SUCCESS);
248}
const libMesh::DofMapBase * _dof_map

Referenced by DMCreateMoose().

◆ DMMooseSetNonlinearSystem()

PetscErrorCode DMMooseSetNonlinearSystem ( DM  dm,
NonlinearSystemBase nl 
)
extern

Definition at line 223 of file PetscDMMoose.C.

224{
227 if (dm->setupcalled)
228 SETERRQ(((PetscObject)dm)->comm,
230 "Cannot reset the NonlinearSystem after DM has been set up.");
231 DM_Moose * dmm = (DM_Moose *)(dm->data);
232 dmm->_nl = &nl;
233 PetscFunctionReturn(PETSC_SUCCESS);
234}

Referenced by DMCreateMoose().

◆ DMMooseSetSides()

PetscErrorCode DMMooseSetSides ( DM  dm,
const std::set< std::string > &  sides 
)
extern

Definition at line 338 of file PetscDMMoose.C.

339{
340 DM_Moose * dmm = (DM_Moose *)dm->data;
341
344 if (dm->setupcalled)
345 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Not for an already setup DM");
346 if (dmm->_sides)
347 delete dmm->_sides;
348 dmm->_sides = new std::set<std::string>(sides);
349 PetscFunctionReturn(PETSC_SUCCESS);
350}
char ** sides

◆ DMMooseSetSplitBlocks()

PetscErrorCode DMMooseSetSplitBlocks ( DM  ,
const std::string &  ,
const std::set< std::string > &   
)
extern

◆ DMMooseSetSplitNames()

PetscErrorCode DMMooseSetSplitNames ( DM  dm,
const std::vector< std::string > &  split_names 
)
extern

Definition at line 454 of file PetscDMMoose.C.

455{
458 DM_Moose * dmm = (DM_Moose *)(dm->data);
459
460 if (dmm->_splits)
461 {
462 for (auto & it : *(dmm->_splits))
463 {
464 LibmeshPetscCallQ(DMDestroy(&(it.second._dm)));
465 LibmeshPetscCallQ(ISDestroy(&(it.second._rembedding)));
466 }
467 delete dmm->_splits;
468 dmm->_splits = LIBMESH_PETSC_NULLPTR;
469 }
470 if (dmm->_splitlocs)
471 {
472 delete dmm->_splitlocs;
473 dmm->_splitlocs = LIBMESH_PETSC_NULLPTR;
474 }
475 dmm->_splits = new std::map<std::string, DM_Moose::SplitInfo>();
476 dmm->_splitlocs = new std::multimap<std::string, unsigned int>();
477 for (unsigned int i = 0; i < split_names.size(); ++i)
478 {
480 info._dm = LIBMESH_PETSC_NULLPTR;
481 info._rembedding = LIBMESH_PETSC_NULLPTR;
482 std::string name = split_names[i];
483 (*dmm->_splits)[name] = info;
484 dmm->_splitlocs->insert(std::make_pair(name, i));
485 }
486 PetscFunctionReturn(PETSC_SUCCESS);
487}
MPI_Info info
std::string name(const ElemQuality q)
std::multimap< std::string, unsigned int > * _splitlocs
std::map< std::string, SplitInfo > * _splits

Referenced by if().

◆ DMMooseSetSplitSides()

PetscErrorCode DMMooseSetSplitSides ( DM  ,
const std::string &  ,
const std::set< std::string > &   
)
extern

◆ DMMooseSetSplitVars()

PetscErrorCode DMMooseSetSplitVars ( DM  ,
const std::string &  ,
const std::set< std::string > &   
)
extern

◆ DMMooseSetUnContacts()

PetscErrorCode DMMooseSetUnContacts ( DM  ,
const std::vector< std::pair< std::string, std::string > > &  ,
const std::vector< bool > &   
)
extern

◆ DMMooseSetUnSides()

PetscErrorCode DMMooseSetUnSides ( DM  dm,
const std::set< std::string > &  unsides 
)
extern

Definition at line 353 of file PetscDMMoose.C.

354{
355 DM_Moose * dmm = (DM_Moose *)dm->data;
356
359 if (dm->setupcalled)
360 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Not for an already setup DM");
361 if (dmm->_unsides)
362 delete dmm->_unsides;
363 dmm->_unsides = new std::set<std::string>(unsides);
364 PetscFunctionReturn(PETSC_SUCCESS);
365}

◆ DMMooseSetVariables()

PetscErrorCode DMMooseSetVariables ( DM  ,
const std::vector< std::string > &   
)
extern

◆ SNESUpdateDMMoose()

PetscErrorCode SNESUpdateDMMoose ( SNES  snes,
PetscInt  iteration 
)
extern

Definition at line 2139 of file PetscDMMoose.C.

2140{
2141 /* This is called any time the structure of the problem changes in a way that affects the Jacobian
2142 sparsity pattern.
2143 For example, this may happen when NodeFaceConstraints change Jacobian's sparsity pattern based
2144 on newly-detected Penetration.
2145 In that case certain preconditioners (e.g., PCASM) will not work, unless we tell them that the
2146 sparsity pattern has changed.
2147 For now we are rebuilding the whole KSP, when necessary.
2148 */
2149 DM dm;
2150 KSP ksp;
2151 const char * prefix;
2152 MPI_Comm comm;
2153 PC pc;
2154
2156 if (iteration)
2157 {
2158 /* TODO: limit this only to situations when displaced (un)contact splits are present, as is
2159 * DisplacedProblem(). */
2160 LibmeshPetscCallQ(SNESGetDM(snes, &dm));
2162 LibmeshPetscCallQ(DMSetUp(dm));
2163 LibmeshPetscCallQ(SNESGetKSP(snes, &ksp));
2164 /* Should we rebuild the whole KSP? */
2165 LibmeshPetscCallQ(PetscObjectGetOptionsPrefix((PetscObject)ksp, &prefix));
2166 LibmeshPetscCallQ(PetscObjectGetComm((PetscObject)ksp, &comm));
2167 LibmeshPetscCallQ(PCCreate(comm, &pc));
2168 LibmeshPetscCallQ(PCSetDM(pc, dm));
2169 LibmeshPetscCallQ(PCSetOptionsPrefix(pc, prefix));
2170 LibmeshPetscCallQ(PCSetFromOptions(pc));
2171 LibmeshPetscCallQ(KSPSetPC(ksp, pc));
2172 LibmeshPetscCallQ(PCDestroy(&pc));
2173 }
2174 PetscFunctionReturn(PETSC_SUCCESS);
2175}