https://mooseframework.inl.gov
Functions
PetscDMMoose.h File Reference

Go to the source code of this file.

Functions

PetscErrorCode DMMooseRegisterAll ()
 
PetscErrorCode DMCreateMoose (MPI_Comm comm, NonlinearSystemBase &nl, const std::string &dm_name, DM *dm)
 Create a MOOSE DM. More...
 
PetscErrorCode DMMooseReset (DM)
 
PetscErrorCode DMMooseSetNonlinearSystem (DM, NonlinearSystemBase &)
 
PetscErrorCode DMMooseGetNonlinearSystem (DM, NonlinearSystemBase *&)
 
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 std::string &  dm_name,
DM *  dm 
)

Create a MOOSE DM.

Parameters
commThe communicator that the DM should use
nlThe nonlinear system context that the DM is associated with
dm_nameA name to associate with the DM
dmA pointer to the PETSc DM

Definition at line 2044 of file PetscDMMoose.C.

Referenced by DMCreateFieldDecomposition_Moose(), and Moose::PetscSupport::petscSetupDM().

2045 {
2047  LibmeshPetscCallQ(DMCreate(comm, dm));
2048  LibmeshPetscCallQ(DMSetType(*dm, DMMOOSE));
2050  LibmeshPetscCallQ(DMMooseSetName(*dm, dm_name));
2051  PetscFunctionReturn(PETSC_SUCCESS);
2052 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
PetscErrorCode DMMooseSetNonlinearSystem(DM dm, NonlinearSystemBase &nl)
Definition: PetscDMMoose.C:223
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
PetscErrorCode DMMooseSetName(DM dm, const std::string &dm_name)
Definition: PetscDMMoose.C:237

◆ DMMooseGetBlocks()

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

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
PetscFunctionBegin
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
PetscErrorCode DMMooseValidityCheck(DM dm)
Definition: PetscDMMoose.C:130
std::map< std::string, subdomain_id_type > * _block_ids
Definition: PetscDMMoose.C:62
for(PetscInt i=0;i< nvars;++i)

◆ DMMooseGetContacts()

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

◆ DMMooseGetNonlinearSystem()

PetscErrorCode DMMooseGetNonlinearSystem ( DM  ,
NonlinearSystemBase *&   
)

Definition at line 416 of file PetscDMMoose.C.

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

417 {
420  DM_Moose * dmm = (DM_Moose *)(dm->data);
421  nl = dmm->_nl;
422  PetscFunctionReturn(PETSC_SUCCESS);
423 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
NonlinearSystemBase * _nl
Definition: PetscDMMoose.C:55
PetscErrorCode DMMooseValidityCheck(DM dm)
Definition: PetscDMMoose.C:130

◆ DMMooseGetSides()

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

◆ DMMooseGetSplitBlocks()

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

◆ DMMooseGetSplitNames()

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

◆ DMMooseGetSplitSides()

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

◆ DMMooseGetSplitVars()

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

◆ DMMooseGetUnContacts()

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

◆ DMMooseGetUnSides()

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

◆ DMMooseGetVariables()

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

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 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
std::map< std::string, unsigned int > * _var_ids
Definition: PetscDMMoose.C:58
PetscFunctionReturn(PETSC_SUCCESS)
PetscErrorCode DMMooseValidityCheck(DM dm)
Definition: PetscDMMoose.C:130

◆ DMMooseRegisterAll()

PetscErrorCode DMMooseRegisterAll ( )

Definition at line 2156 of file PetscDMMoose.C.

Referenced by Moose::PetscSupport::petscSetupDM().

2157 {
2158  static PetscBool DMMooseRegisterAllCalled = PETSC_FALSE;
2159 
2161  if (!DMMooseRegisterAllCalled)
2162  {
2163  LibmeshPetscCallQ(DMRegister(DMMOOSE, DMCreate_Moose));
2164  DMMooseRegisterAllCalled = PETSC_TRUE;
2165  }
2166  PetscFunctionReturn(PETSC_SUCCESS);
2167 }
PetscFunctionBegin
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
EXTERN_C_BEGIN PetscErrorCode DMCreate_Moose(DM dm)
PetscFunctionReturn(PETSC_SUCCESS)

◆ DMMooseReset()

PetscErrorCode DMMooseReset ( DM  )

Definition at line 1594 of file PetscDMMoose.C.

Referenced by SNESUpdateDMMoose().

1595 {
1596  PetscBool ismoose;
1597  DM_Moose * dmm = (DM_Moose *)(dm->data);
1598 
1600  LibmeshPetscCallQ(PetscObjectTypeCompare((PetscObject)dm, DMMOOSE, &ismoose));
1601  if (!ismoose)
1602  PetscFunctionReturn(PETSC_SUCCESS);
1603  if (!dmm->_nl)
1604  SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "No Moose system set for DM_Moose");
1605  LibmeshPetscCallQ(ISDestroy(&dmm->_embedding));
1606  for (auto & it : *(dmm->_splits))
1607  {
1608  DM_Moose::SplitInfo & split = it.second;
1609  LibmeshPetscCallQ(ISDestroy(&split._rembedding));
1610  if (split._dm)
1612  }
1613  dm->setupcalled = PETSC_FALSE;
1614  PetscFunctionReturn(PETSC_SUCCESS);
1615 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
PetscErrorCode DMMooseReset(DM dm)
PETSC_ERR_ARG_WRONGSTATE
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
IS _embedding
Definition: PetscDMMoose.C:99
std::map< std::string, SplitInfo > * _splits
Definition: PetscDMMoose.C:97
tbb::split split
NonlinearSystemBase * _nl
Definition: PetscDMMoose.C:55

◆ DMMooseSetBlocks()

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

◆ DMMooseSetContacts()

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

◆ DMMooseSetNonlinearSystem()

PetscErrorCode DMMooseSetNonlinearSystem ( DM  ,
NonlinearSystemBase  
)

Definition at line 223 of file PetscDMMoose.C.

Referenced by DMCreateMoose().

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 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
PETSC_ERR_ARG_WRONGSTATE
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
NonlinearSystemBase * _nl
Definition: PetscDMMoose.C:55
PetscErrorCode DMMooseValidityCheck(DM dm)
Definition: PetscDMMoose.C:130

◆ DMMooseSetSides()

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

Definition at line 310 of file PetscDMMoose.C.

311 {
312  DM_Moose * dmm = (DM_Moose *)dm->data;
313 
316  if (dm->setupcalled)
317  SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Not for an already setup DM");
318  if (dmm->_sides)
319  delete dmm->_sides;
320  dmm->_sides = new std::set<std::string>(sides);
321  PetscFunctionReturn(PETSC_SUCCESS);
322 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
PETSC_ERR_ARG_WRONGSTATE
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
std::set< std::string > * _sides
Definition: PetscDMMoose.C:65
char ** sides
PetscFunctionReturn(PETSC_SUCCESS)
PetscErrorCode DMMooseValidityCheck(DM dm)
Definition: PetscDMMoose.C:130

◆ DMMooseSetSplitBlocks()

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

◆ DMMooseSetSplitNames()

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

Definition at line 426 of file PetscDMMoose.C.

Referenced by if().

427 {
430  DM_Moose * dmm = (DM_Moose *)(dm->data);
431 
432  if (dmm->_splits)
433  {
434  for (auto & it : *(dmm->_splits))
435  {
436  LibmeshPetscCallQ(DMDestroy(&(it.second._dm)));
437  LibmeshPetscCallQ(ISDestroy(&(it.second._rembedding)));
438  }
439  delete dmm->_splits;
440  dmm->_splits = LIBMESH_PETSC_NULLPTR;
441  }
442  if (dmm->_splitlocs)
443  {
444  delete dmm->_splitlocs;
445  dmm->_splitlocs = LIBMESH_PETSC_NULLPTR;
446  }
447  dmm->_splits = new std::map<std::string, DM_Moose::SplitInfo>();
448  dmm->_splitlocs = new std::multimap<std::string, unsigned int>();
449  for (unsigned int i = 0; i < split_names.size(); ++i)
450  {
452  info._dm = LIBMESH_PETSC_NULLPTR;
453  info._rembedding = LIBMESH_PETSC_NULLPTR;
454  std::string name = split_names[i];
455  (*dmm->_splits)[name] = info;
456  dmm->_splitlocs->insert(std::make_pair(name, i));
457  }
458  PetscFunctionReturn(PETSC_SUCCESS);
459 }
std::string name(const ElemQuality q)
MPI_Info info
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
std::map< std::string, SplitInfo > * _splits
Definition: PetscDMMoose.C:97
PetscErrorCode DMMooseValidityCheck(DM dm)
Definition: PetscDMMoose.C:130
std::multimap< std::string, unsigned int > * _splitlocs
Definition: PetscDMMoose.C:91

◆ DMMooseSetSplitSides()

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

◆ DMMooseSetSplitVars()

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

◆ DMMooseSetUnContacts()

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

◆ DMMooseSetUnSides()

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

Definition at line 325 of file PetscDMMoose.C.

326 {
327  DM_Moose * dmm = (DM_Moose *)dm->data;
328 
331  if (dm->setupcalled)
332  SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Not for an already setup DM");
333  if (dmm->_unsides)
334  delete dmm->_unsides;
335  dmm->_unsides = new std::set<std::string>(unsides);
336  PetscFunctionReturn(PETSC_SUCCESS);
337 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
PETSC_ERR_ARG_WRONGSTATE
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)
std::set< std::string > * _unsides
Definition: PetscDMMoose.C:68
PetscErrorCode DMMooseValidityCheck(DM dm)
Definition: PetscDMMoose.C:130

◆ DMMooseSetVariables()

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

◆ SNESUpdateDMMoose()

PetscErrorCode SNESUpdateDMMoose ( SNES  snes,
PetscInt  iteration 
)

Definition at line 2117 of file PetscDMMoose.C.

2118 {
2119  /* This is called any time the structure of the problem changes in a way that affects the Jacobian
2120  sparsity pattern.
2121  For example, this may happen when NodeFaceConstraints change Jacobian's sparsity pattern based
2122  on newly-detected Penetration.
2123  In that case certain preconditioners (e.g., PCASM) will not work, unless we tell them that the
2124  sparsity pattern has changed.
2125  For now we are rebuilding the whole KSP, when necessary.
2126  */
2127  DM dm;
2128  KSP ksp;
2129  const char * prefix;
2130  MPI_Comm comm;
2131  PC pc;
2132 
2134  if (iteration)
2135  {
2136  /* TODO: limit this only to situations when displaced (un)contact splits are present, as is
2137  * DisplacedProblem(). */
2138  LibmeshPetscCallQ(SNESGetDM(snes, &dm));
2140  LibmeshPetscCallQ(DMSetUp(dm));
2141  LibmeshPetscCallQ(SNESGetKSP(snes, &ksp));
2142  /* Should we rebuild the whole KSP? */
2143  LibmeshPetscCallQ(PetscObjectGetOptionsPrefix((PetscObject)ksp, &prefix));
2144  LibmeshPetscCallQ(PetscObjectGetComm((PetscObject)ksp, &comm));
2145  LibmeshPetscCallQ(PCCreate(comm, &pc));
2146  LibmeshPetscCallQ(PCSetDM(pc, dm));
2147  LibmeshPetscCallQ(PCSetOptionsPrefix(pc, prefix));
2148  LibmeshPetscCallQ(PCSetFromOptions(pc));
2149  LibmeshPetscCallQ(KSPSetPC(ksp, pc));
2150  LibmeshPetscCallQ(PCDestroy(&pc));
2151  }
2152  PetscFunctionReturn(PETSC_SUCCESS);
2153 }
PetscErrorCode PetscOptionItems *PetscErrorCode DM dm
PetscFunctionBegin
PetscErrorCode DMMooseReset(DM dm)
LibmeshPetscCallQ(DMMooseValidityCheck(dm))
PetscFunctionReturn(PETSC_SUCCESS)