GEOS
|
The DoFManager is responsible for allocating global dofs, constructing sparsity patterns, and generally simplifying the interaction between PhysicsSolvers and linear algebra operations. More...
#include <DofManager.hpp>
Classes | |
struct | FieldSupport |
Describes field support on a single mesh body/level. More... | |
struct | SubComponent |
Describes a selection of components from a DoF field. More... | |
Public Types | |
enum class | Connector { Elem , Face , Edge , Node , None , Stencil } |
Enumeration of geometric objects for connectivity type. Note that this enum is nearly identical to FieldLocation, but we keep both for code readability in function calls. More... | |
enum class | LocalReorderingType { None , ReverseCutHillMcKee } |
Indicates the type of (local to a rank) reordering applied to a given field. More... | |
using | CompMask = ComponentMask< MAX_COMP > |
Type of component mask used by DofManager. | |
Public Member Functions | |
DofManager (string name) | |
Constructor. More... | |
DofManager (DofManager const &)=delete | |
Deleted copy constructor. | |
DofManager (DofManager &&)=default | |
Move constructor. | |
DofManager & | operator= (DofManager const &)=delete |
Deleted copy assignment. More... | |
DofManager & | operator= (DofManager &&)=default |
Defaulted move assignment. More... | |
void | clear () |
Remove all fields and couplings and re-enable addition of new fields. | |
void | setDomain (DomainPartition &domain) |
Assign a domain. More... | |
void | addField (string const &fieldName, FieldLocation location, integer components, std::vector< FieldSupport > const ®ions={}) |
Add a new field and enumerate its degrees-of-freedom. More... | |
void | addField (string const &fieldName, FieldLocation location, integer components, map< std::pair< string, string >, array1d< string > > const ®ions) |
Add a new field and enumerate its degrees-of-freedom. More... | |
void | setLocalReorderingType (string const &fieldName, LocalReorderingType const reorderingType) |
Set the local reodering of the dof numbers. More... | |
void | disableGlobalCouplingForEquation (string const &fieldName, integer const c) |
Disable the global coupling for a given equation. More... | |
void | disableGlobalCouplingForEquations (string const &fieldName, arrayView1d< integer const > const components) |
Disable the global coupling for a set of equations. More... | |
void | addCoupling (string const &rowFieldName, string const &colFieldName, Connector connectivity, std::vector< FieldSupport > const ®ions={}, bool symmetric=true) |
Add coupling between two fields. More... | |
void | addCoupling (string const &rowFieldName, string const &colFieldName, Connector connectivity, map< std::pair< string, string >, array1d< string > > const ®ions, bool symmetric=true) |
Add coupling between two fields. More... | |
void | addCoupling (string const &fieldName, FluxApproximationBase const &stencils) |
Special interface for self-connectivity through a stencil. More... | |
void | reorderByRank () |
Finish populating fields and apply appropriate dof renumbering. More... | |
bool | fieldExists (string const &name) const |
Check if string key is already being used. More... | |
string const & | getKey (string const &fieldName) const |
Return the key used to record the field in the DofManager. More... | |
globalIndex | numGlobalDofs (string const &fieldName) const |
globalIndex | numGlobalDofs () const |
localIndex | numLocalDofs (string const &fieldName) const |
localIndex | numLocalDofs () const |
globalIndex | rankOffset (string const &fieldName) const |
globalIndex | rankOffset () const |
integer | numComponents (string const &fieldName="") const |
integer | numComponents () const |
FieldLocation | location (string const &fieldName) const |
Get the support location type of the field. More... | |
globalIndex | globalOffset (string const &fieldName) const |
array1d< integer > | numComponentsPerField () const |
Return an array of number of components per field, sorted by field registration order. More... | |
template<typename CONTAINER > | |
void | getLocalDofComponentLabels (CONTAINER &labels) const |
Fill a container with unique dof labels for each local dof. More... | |
void | setSparsityPattern (SparsityPattern< globalIndex > &pattern) const |
Populate sparsity pattern of the entire system matrix. More... | |
void | copyVectorToField (arrayView1d< real64 const > const &localVector, string const &srcFieldName, string const &dstFieldName, real64 scalingFactor, CompMask mask=CompMask(MAX_COMP, true)) const |
Copy values from LA vectors to simulation data arrays. More... | |
template<typename SCALING_FACTOR_TYPE > | |
void | addVectorToField (arrayView1d< real64 const > const &localVector, string const &srcFieldName, string const &dstFieldName, SCALING_FACTOR_TYPE const &scalingFactor, CompMask mask=CompMask(MAX_COMP, true)) const |
Add values from LA vectors to simulation data arrays. More... | |
void | copyFieldToVector (arrayView1d< real64 > const &localVector, string const &srcFieldName, string const &dstFieldName, real64 scalingFactor, CompMask mask=CompMask(MAX_COMP, true)) const |
Copy values from simulation data arrays to vectors. More... | |
void | addFieldToVector (arrayView1d< real64 > const &localVector, string const &srcFieldName, string const &dstFieldName, real64 scalingFactor, CompMask mask=CompMask(MAX_COMP, true)) const |
Add values from a simulation data array to a DOF vector. More... | |
std::vector< SubComponent > | filterDofs (std::vector< SubComponent > const &excluded) const |
Create a dof selection by filtering out excluded components. More... | |
void | setupFrom (DofManager const &source, std::vector< SubComponent > const &selection) |
Populate this manager from another using a sub-selection of fields/components. More... | |
template<typename MATRIX > | |
void | makeRestrictor (std::vector< SubComponent > const &selection, MPI_Comm const &comm, bool transpose, MATRIX &restrictor) const |
Create a matrix that restricts vectors and matrices to a subset of DOFs. More... | |
void | printFieldInfo (std::ostream &os=std::cout) const |
Print the summary of declared fields and coupling. More... | |
Static Public Attributes | |
static constexpr int | MAX_COMP = 32 |
Maximum number of components in a field. | |
The DoFManager is responsible for allocating global dofs, constructing sparsity patterns, and generally simplifying the interaction between PhysicsSolvers and linear algebra operations.
Definition at line 43 of file DofManager.hpp.
|
strong |
Enumeration of geometric objects for connectivity type. Note that this enum is nearly identical to FieldLocation, but we keep both for code readability in function calls.
Definition at line 103 of file DofManager.hpp.
|
strong |
Indicates the type of (local to a rank) reordering applied to a given field.
Enumerator | |
---|---|
None | Do not reorder the variables. |
ReverseCutHillMcKee | Use reverve CutHill-McKee reordering algorithm. |
Definition at line 116 of file DofManager.hpp.
|
explicit |
Constructor.
[in] | name | a unique name for this DoF manager |
void geos::DofManager::addCoupling | ( | string const & | fieldName, |
FluxApproximationBase const & | stencils | ||
) |
Special interface for self-connectivity through a stencil.
[in] | fieldName | name of the field (this is only for diagonal blocks) |
[in] | stencils | a pointer to FluxApproximation storing the stencils |
The field must be defined on element support. The set of regions is taken automatically from the field definition.
void geos::DofManager::addCoupling | ( | string const & | rowFieldName, |
string const & | colFieldName, | ||
Connector | connectivity, | ||
map< std::pair< string, string >, array1d< string > > const & | regions, | ||
bool | symmetric = true |
||
) |
Add coupling between two fields.
The connectivity argument defines how the two fields couple. If the first field has support location A, the second field has support location B, and the connecting object is C, the sparsity pattern will be defined as (AC)(CB). The final argument indicates if the coupling is symmetric, in the sense that there is a two-way coupling between the fields. Without this argument, a nonzero block will be added to the system matrix for block AB, but block BA will remain zero (one-way coupling).
When the number of components is greater than one, we always assume they are tightly coupled to one another and form a dense block. The sparsity pattern LC*CL is then interpreted as the super-node pattern, containing dense sub-blocks.
[in] | rowFieldName | string the name of the row field. |
[in] | colFieldName | string the name of the col field. |
[in] | connectivity | Connectivity through what they are connected. |
[in] | regions | names of regions where this coupling is defined. |
[in] | symmetric | bool is it symmetric, i.e., both row-col and col-row? |
void geos::DofManager::addCoupling | ( | string const & | rowFieldName, |
string const & | colFieldName, | ||
Connector | connectivity, | ||
std::vector< FieldSupport > const & | regions = {} , |
||
bool | symmetric = true |
||
) |
Add coupling between two fields.
The connectivity argument defines how the two fields couple. If the first field has support location A, the second field has support location B, and the connecting object is C, the sparsity pattern will be defined as (AC)(CB). The final argument indicates if the coupling is symmetric, in the sense that there is a two-way coupling between the fields. Without this argument, a nonzero block will be added to the system matrix for block AB, but block BA will remain zero (one-way coupling).
When the number of components is greater than one, we always assume they are tightly coupled to one another and form a dense block. The sparsity pattern LC*CL is then interpreted as the super-node pattern, containing dense sub-blocks.
[in] | rowFieldName | string the name of the row field. |
[in] | colFieldName | string the name of the col field. |
[in] | connectivity | Connectivity through what they are connected. |
[in] | regions | names of regions where this coupling is defined. |
[in] | symmetric | bool is it symmetric, i.e., both row-col and col-row? |
void geos::DofManager::addField | ( | string const & | fieldName, |
FieldLocation | location, | ||
integer | components, | ||
map< std::pair< string, string >, array1d< string > > const & | regions | ||
) |
Add a new field and enumerate its degrees-of-freedom.
[in] | fieldName | the name of the field |
[in] | location | type of mesh objects the field is defined on |
[in] | components | number of components |
[in] | regions | list of region names the field is defined on (if empty, selects all regions) |
Overload for map< string, array1d< string > > bodyFieldSupport used by physics solvers.
void geos::DofManager::addField | ( | string const & | fieldName, |
FieldLocation | location, | ||
integer | components, | ||
std::vector< FieldSupport > const & | regions = {} |
||
) |
Add a new field and enumerate its degrees-of-freedom.
[in] | fieldName | the name of the field |
[in] | location | type of mesh objects the field is defined on |
[in] | components | number of components |
[in] | regions | list of region names the field is defined on (if empty, selects all regions) |
void geos::DofManager::addFieldToVector | ( | arrayView1d< real64 > const & | localVector, |
string const & | srcFieldName, | ||
string const & | dstFieldName, | ||
real64 | scalingFactor, | ||
CompMask | mask = CompMask(MAX_COMP, true) |
||
) | const |
Add values from a simulation data array to a DOF vector.
localVector | target vector |
srcFieldName | name of the source field (view wrapper key on the manager) |
dstFieldName | name of the destination field (as defined in DofManager) |
scalingFactor | a factor to scale vector values by |
mask | component selection mask |
void geos::DofManager::addVectorToField | ( | arrayView1d< real64 const > const & | localVector, |
string const & | srcFieldName, | ||
string const & | dstFieldName, | ||
SCALING_FACTOR_TYPE const & | scalingFactor, | ||
CompMask | mask = CompMask(MAX_COMP, true) |
||
) | const |
Add values from LA vectors to simulation data arrays.
localVector | source local vector |
srcFieldName | name of the source field (as defined in DofManager) |
dstFieldName | name of the destination field (view wrapper key on the manager) |
scalingFactor | a factor to scale vector values by |
mask | component selection mask |
void geos::DofManager::copyFieldToVector | ( | arrayView1d< real64 > const & | localVector, |
string const & | srcFieldName, | ||
string const & | dstFieldName, | ||
real64 | scalingFactor, | ||
CompMask | mask = CompMask(MAX_COMP, true) |
||
) | const |
Copy values from simulation data arrays to vectors.
localVector | target LA vector |
srcFieldName | name of the source field (view wrapper key on the manager) |
dstFieldName | name of the destination field (as defined in DofManager) |
scalingFactor | a factor to scale vector values by |
mask | component selection mask |
void geos::DofManager::copyVectorToField | ( | arrayView1d< real64 const > const & | localVector, |
string const & | srcFieldName, | ||
string const & | dstFieldName, | ||
real64 | scalingFactor, | ||
CompMask | mask = CompMask(MAX_COMP, true) |
||
) | const |
Copy values from LA vectors to simulation data arrays.
localVector | source local vector |
srcFieldName | name of the source field (as defined in DofManager) |
dstFieldName | name of the destination field (view wrapper key on the manager) |
scalingFactor | a factor to scale vector values by |
mask | component selection mask |
void geos::DofManager::disableGlobalCouplingForEquation | ( | string const & | fieldName, |
integer const | c | ||
) |
Disable the global coupling for a given equation.
[in] | fieldName | the name of the field |
[in] | c | the index of the equation |
void geos::DofManager::disableGlobalCouplingForEquations | ( | string const & | fieldName, |
arrayView1d< integer const > const | components | ||
) |
Disable the global coupling for a set of equations.
[in] | fieldName | the name of the field |
[in] | components | the indices of the equations |
bool geos::DofManager::fieldExists | ( | string const & | name | ) | const |
Check if string key is already being used.
name | field key to check |
std::vector< SubComponent > geos::DofManager::filterDofs | ( | std::vector< SubComponent > const & | excluded | ) | const |
Create a dof selection by filtering out excluded components.
excluded | a list of dof components to exclude |
Return the key used to record the field in the DofManager.
[in] | fieldName | string the name of the field. |
|
inline |
Fill a container with unique dof labels for each local dof.
CONTAINER | type of container to fill |
labels | the container to fill |
The labels are assigned starting from zero in increasing order of field registration. Labels are repeated for each support point of a field.
Definition at line 364 of file DofManager.hpp.
globalIndex geos::DofManager::globalOffset | ( | string const & | fieldName | ) | const |
[in] | fieldName | name of the field. |
FieldLocation geos::DofManager::location | ( | string const & | fieldName | ) | const |
Get the support location type of the field.
[in] | fieldName | name of the field |
void geos::DofManager::makeRestrictor | ( | std::vector< SubComponent > const & | selection, |
MPI_Comm const & | comm, | ||
bool | transpose, | ||
MATRIX & | restrictor | ||
) | const |
Create a matrix that restricts vectors and matrices to a subset of DOFs.
MATRIX | type of matrix used for restrictor |
selection | a list of fields to select; each entry is a struct containing the name of the field and low and high selected component indices |
comm | the MPI communicator to use in the operator |
transpose | if true , the transpose (prolongation) operator will be created |
restrictor | resulting operator |
integer geos::DofManager::numComponents | ( | ) | const |
fieldName | name of the field |
Return an array of number of components per field, sorted by field registration order.
globalIndex geos::DofManager::numGlobalDofs | ( | ) | const |
globalIndex geos::DofManager::numGlobalDofs | ( | string const & | fieldName | ) | const |
fieldName | the name of the field |
localIndex geos::DofManager::numLocalDofs | ( | ) | const |
localIndex geos::DofManager::numLocalDofs | ( | string const & | fieldName | ) | const |
fieldName | name of the field |
|
default |
Defaulted move assignment.
|
delete |
Deleted copy assignment.
void geos::DofManager::printFieldInfo | ( | std::ostream & | os = std::cout | ) | const |
Print the summary of declared fields and coupling.
os | output stream |
globalIndex geos::DofManager::rankOffset | ( | ) | const |
globalIndex geos::DofManager::rankOffset | ( | string const & | fieldName | ) | const |
fieldName | name of the field |
void geos::DofManager::reorderByRank | ( | ) |
Finish populating fields and apply appropriate dof renumbering.
This function must be called after all field and coupling information has been added. It adjusts DoF index arrays to account for presence of other fields (in a global monolithic fashion).
void geos::DofManager::setDomain | ( | DomainPartition & | domain | ) |
Assign a domain.
domain | the target domain (non-const access required for allocating index arrays) |
void geos::DofManager::setLocalReorderingType | ( | string const & | fieldName, |
LocalReorderingType const | reorderingType | ||
) |
Set the local reodering of the dof numbers.
[in] | fieldName | the name of the field |
[in] | reorderingType | the reordering type |
void geos::DofManager::setSparsityPattern | ( | SparsityPattern< globalIndex > & | pattern | ) | const |
Populate sparsity pattern of the entire system matrix.
[out] | pattern | the target sparsity pattern |
void geos::DofManager::setupFrom | ( | DofManager const & | source, |
std::vector< SubComponent > const & | selection | ||
) |
Populate this manager from another using a sub-selection of fields/components.
source | source dof manager |
selection | selection of fields/components |