libMesh
Classes | Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | Friends | List of all members
libMesh::StaticCondensationDofMap Class Reference

A class holding degree of freedom information pertinent to static condensation. More...

#include <static_condensation_dof_map.h>

Inheritance diagram for libMesh::StaticCondensationDofMap:
[legend]

Classes

struct  DofData
 Data stored on a per-element basis used to compute element Schur complements and their applications to vectors. More...
 

Public Member Functions

 StaticCondensationDofMap (MeshBase &mesh, System &system, const DofMap &dof_map)
 
virtual ~StaticCondensationDofMap ()
 
void reinit ()
 Build the element global to local index maps. More...
 
void dont_condense_vars (const std::unordered_set< unsigned int > &vars)
 Add vars to the list of variables not to condense. More...
 
const std::unordered_set< unsigned int > & uncondensed_vars () const
 
virtual unsigned int n_variables () const override
 
virtual const Variablevariable (const unsigned int c) const override
 
virtual void dof_indices (const Elem *const elem, std::vector< dof_id_type > &di, const unsigned int vn, int p_level=-12345) const override
 Fills the vector di with the global degree of freedom indices for the element. More...
 
virtual void dof_indices (const Node *const node, std::vector< dof_id_type > &di, const unsigned int vn) const override
 Fills the vector di with the global degree of freedom indices for the node, for one variable vn. More...
 
const Systemreduced_system () const
 
bool initialized () const
 Whether we are initialized. More...
 
virtual void clear () override
 
dof_id_type get_reduced_from_global_constraint_dof (dof_id_type full_dof) const
 Retrieve the dof index in the reduced system corresponding to the provided dof index in the full system. More...
 
dof_id_type first_dof (const processor_id_type proc) const
 
dof_id_type first_dof () const
 
dof_id_type end_dof (const processor_id_type proc) const
 
dof_id_type end_dof () const
 
dof_id_type n_dofs () const
 
dof_id_type n_dofs_on_processor (const processor_id_type proc) const
 
dof_id_type n_local_dofs () const
 
dof_id_type n_old_dofs () const
 
dof_id_type first_old_dof (const processor_id_type proc) const
 
dof_id_type first_old_dof () const
 
dof_id_type end_old_dof (const processor_id_type proc) const
 
dof_id_type end_old_dof () const
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Protected Member Functions

std::size_t compute_dof_info (dof_id_type n_local_dofs)
 compute the key degree of freedom information given the local number of degrees of freedom on this process More...
 

Protected Attributes

std::vector< dof_id_type_first_df
 First DOF index on processor p. More...
 
std::vector< dof_id_type_end_df
 Last DOF index (plus 1) on processor p. More...
 
dof_id_type _n_dfs
 Total number of degrees of freedom. More...
 
dof_id_type _n_old_dfs
 Total number of degrees of freedom on old dof objects. More...
 
std::vector< dof_id_type_first_old_df
 First old DOF index on processor p. More...
 
std::vector< dof_id_type_end_old_df
 Last old DOF index (plus 1) on processor p. More...
 
const Parallel::Communicator_communicator
 

Private Member Functions

void add_uncondensed_dof_plus_constraint_dofs (dof_id_type full_dof_number, bool involved_in_constraints, std::unordered_map< dof_id_type, dof_id_type > &uncondensed_global_to_local_map, std::unordered_set< dof_id_type > &local_uncondensed_dofs_set, std::unordered_map< processor_id_type, std::unordered_set< dof_id_type >> &nonlocal_uncondensed_dofs, std::vector< dof_id_type > &elem_uncondensed_dofs, dof_id_type &uncondensed_local_dof_number, std::unordered_set< dof_id_type > &constraint_dofs)
 Add an uncondensed dof potentially along with constraining dofs which themselves must/will also be uncondensed. More...
 
void add_uncondensed_dof (dof_id_type full_dof_number, bool involved_in_constraints, std::unordered_map< dof_id_type, dof_id_type > &uncondensed_global_to_local_map, std::unordered_set< dof_id_type > &local_uncondensed_dofs_set, std::unordered_map< processor_id_type, std::unordered_set< dof_id_type >> &nonlocal_uncondensed_dofs, std::vector< dof_id_type > &elem_uncondensed_dofs, dof_id_type &uncondensed_local_dof_number, std::unordered_set< dof_id_type > &constraint_dofs)
 Add an uncondensed dof. More...
 

Private Attributes

std::unordered_map< dof_id_type, DofData_elem_to_dof_data
 A map from element ID to Schur complement data. More...
 
std::vector< dof_id_type_local_uncondensed_dofs
 All the uncondensed degrees of freedom (numbered in the "full" uncondensed + condensed space). More...
 
MeshBase_mesh
 
System_system
 
const DofMap_dof_map
 
std::unordered_set< unsigned int_uncondensed_vars
 Variables for which we will keep all dofs. More...
 
bool _sc_is_initialized
 Whether our object has been initialized. More...
 
std::vector< Variable_reduced_vars
 The variables in the reduced system. More...
 
System_reduced_system
 A dummyish system to help with DofObjects. More...
 
std::unique_ptr< SparsityPattern::Build_reduced_sp
 Owned storage of the reduced system sparsity pattern. More...
 
std::vector< dof_id_type_reduced_nnz
 Number of on-diagonal nonzeros per row in the reduced system. More...
 
std::vector< dof_id_type_reduced_noz
 Number of off-diagonal nonzeros per row in the reduced system. More...
 
std::unordered_map< dof_id_type, dof_id_type_full_to_reduced_constraint_dofs
 A small map from full system degrees of freedom to reduced/condensed system degrees of freedom involved in constraints. More...
 

Friends

class StaticCondensation
 Friend the static condensation matrix class so they can inspect our degree of freedom data. More...
 

Detailed Description

A class holding degree of freedom information pertinent to static condensation.

Static condensation is a process for reducing the number of unknowns in a linear(ized) system. It is often used in conjunction with a hybridized discontinuous Galerkin (HDG) method to reduce the number of unknowns in the linear system to something more on the order of a continuous Galerkin (CG) method as opposed to a discontinuous Galerkin method. In the HDG example, degrees of freedom on the element interiors are condensed out and only the degrees of freedom on element faces are retained in the condensed system. Static condensation is not only applicable to HDG methods, however. One could also use static condensation with a high order CG method, again removing internal degrees of freedom and leaving those on element boundaries.

Users may query this class for condensed space degree of freedom information associated with elements. Queries with nodes are not supported. This class also holds information for mapping degree of freedom indices in the global, uncondensed space to local element degree of freedom numbers. This information is essential in order to build the element Schur complement matrices that are used to map global system vector and matrix data to the condensed system vector and matrix data

Definition at line 59 of file static_condensation_dof_map.h.

Constructor & Destructor Documentation

◆ StaticCondensationDofMap()

libMesh::StaticCondensationDofMap::StaticCondensationDofMap ( MeshBase mesh,
System system,
const DofMap dof_map 
)

Definition at line 31 of file static_condensation_dof_map.C.

34  : DofMapBase(dof_map.comm()),
35  _mesh(mesh),
36  _system(system),
37  _dof_map(dof_map),
38  _sc_is_initialized(false)
39 {
40  libmesh_experimental();
41 }
MeshBase & mesh
bool _sc_is_initialized
Whether our object has been initialized.
DofMapBase(const Parallel::Communicator &comm)
Definition: dof_map_base.C:23

◆ ~StaticCondensationDofMap()

libMesh::StaticCondensationDofMap::~StaticCondensationDofMap ( )
virtualdefault

Member Function Documentation

◆ add_uncondensed_dof()

void libMesh::StaticCondensationDofMap::add_uncondensed_dof ( dof_id_type  full_dof_number,
bool  involved_in_constraints,
std::unordered_map< dof_id_type, dof_id_type > &  uncondensed_global_to_local_map,
std::unordered_set< dof_id_type > &  local_uncondensed_dofs_set,
std::unordered_map< processor_id_type, std::unordered_set< dof_id_type >> &  nonlocal_uncondensed_dofs,
std::vector< dof_id_type > &  elem_uncondensed_dofs,
dof_id_type uncondensed_local_dof_number,
std::unordered_set< dof_id_type > &  constraint_dofs 
)
private

Add an uncondensed dof.

Parameters
full_dof_numberThe dof id in the full (uncondensed + condensed) system
involved_in_constraintsWhether the full_dof_number is involved in constraints
uncondensed_local_to_global_mapA map from uncondensed full dof numbering to local (element) numbering for a given element
local_uncondensed_dofs_setSet of local uncondensed degrees of freedom (numbered in the full system)
nonlocal_uncondensed_dofsMap from processor IDs to sets of nonlocal uncondensed degrees of freedom (numbered in the full system)
elem_uncondensed_dofsUsed for temporary storage of uncondensed degrees of freedom active on an element
uncondensed_local_dof_numberCounter for number of uncondensed dofs on an element
constraint_dofsSet of degrees of freedom numbered in the full system involved in constraints

Definition at line 45 of file static_condensation_dof_map.C.

References _dof_map, libMesh::DofMap::dof_owner(), and libMesh::DofMap::local_index().

Referenced by add_uncondensed_dof_plus_constraint_dofs().

55 {
56  if (uncondensed_global_to_local_map.count(full_dof_number))
57  // We've already seen this dof on this element
58  return;
59 
60  if (_dof_map.local_index(full_dof_number))
61  local_uncondensed_dofs_set.insert(full_dof_number);
62  else
63  nonlocal_uncondensed_dofs[_dof_map.dof_owner(full_dof_number)].insert(full_dof_number);
64 
65  elem_uncondensed_dofs.push_back(full_dof_number);
66  (uncondensed_global_to_local_map)[full_dof_number] = uncondensed_local_dof_number++;
67  if (involved_in_constraints)
68  constraint_dofs.insert(full_dof_number);
69 }
processor_id_type dof_owner(const dof_id_type dof) const
Definition: dof_map.h:714
bool local_index(dof_id_type dof_index) const
Definition: dof_map.h:846

◆ add_uncondensed_dof_plus_constraint_dofs()

void libMesh::StaticCondensationDofMap::add_uncondensed_dof_plus_constraint_dofs ( dof_id_type  full_dof_number,
bool  involved_in_constraints,
std::unordered_map< dof_id_type, dof_id_type > &  uncondensed_global_to_local_map,
std::unordered_set< dof_id_type > &  local_uncondensed_dofs_set,
std::unordered_map< processor_id_type, std::unordered_set< dof_id_type >> &  nonlocal_uncondensed_dofs,
std::vector< dof_id_type > &  elem_uncondensed_dofs,
dof_id_type uncondensed_local_dof_number,
std::unordered_set< dof_id_type > &  constraint_dofs 
)
private

Add an uncondensed dof potentially along with constraining dofs which themselves must/will also be uncondensed.

Parameters
full_dof_numberThe dof id in the full (uncondensed + condensed) system
involved_in_constraintsWhether the full_dof_number is involved in constraints
uncondensed_local_to_global_mapA map from uncondensed full dof numbering to local (element) numbering for a given element
local_uncondensed_dofs_setSet of local uncondensed degrees of freedom (numbered in the full system)
nonlocal_uncondensed_dofsMap from processor IDs to sets of nonlocal uncondensed degrees of freedom (numbered in the full system)
elem_uncondensed_dofsUsed for temporary storage of uncondensed degrees of freedom active on an element
uncondensed_local_dof_numberCounter for number of uncondensed dofs on an element
constraint_dofsSet of degrees of freedom numbered in the full system involved in constraints

Definition at line 71 of file static_condensation_dof_map.C.

References _dof_map, add_uncondensed_dof(), libMesh::DofMap::get_dof_constraints(), libMesh::libmesh_ignore(), and libMesh::MeshTools::weight().

Referenced by reinit().

81 {
82  const auto & full_dof_constraints = _dof_map.get_dof_constraints();
83  auto it = full_dof_constraints.find(full_dof_number);
84  const bool is_constrained = it != full_dof_constraints.end();
85  involved_in_constraints = involved_in_constraints || is_constrained;
86 
87  this->add_uncondensed_dof(full_dof_number,
88  involved_in_constraints,
89  uncondensed_global_to_local_map,
90  local_uncondensed_dofs_set,
91  nonlocal_uncondensed_dofs,
92  elem_uncondensed_dofs,
93  uncondensed_local_dof_number,
94  constraint_dofs);
95  if (is_constrained)
96  for (const auto [full_constraining_dof, weight] : it->second)
97  {
99  // Our constraining dofs may themselves be constrained
100  this->add_uncondensed_dof_plus_constraint_dofs(full_constraining_dof,
101  /*involved_in_constraints=*/true,
102  uncondensed_global_to_local_map,
103  local_uncondensed_dofs_set,
104  nonlocal_uncondensed_dofs,
105  elem_uncondensed_dofs,
106  uncondensed_local_dof_number,
107  constraint_dofs);
108  }
109 }
void add_uncondensed_dof(dof_id_type full_dof_number, bool involved_in_constraints, std::unordered_map< dof_id_type, dof_id_type > &uncondensed_global_to_local_map, std::unordered_set< dof_id_type > &local_uncondensed_dofs_set, std::unordered_map< processor_id_type, std::unordered_set< dof_id_type >> &nonlocal_uncondensed_dofs, std::vector< dof_id_type > &elem_uncondensed_dofs, dof_id_type &uncondensed_local_dof_number, std::unordered_set< dof_id_type > &constraint_dofs)
Add an uncondensed dof.
void libmesh_ignore(const Args &...)
dof_id_type weight(const MeshBase &mesh, const processor_id_type pid)
Definition: mesh_tools.C:437
const DofConstraints & get_dof_constraints() const
Provide a const accessor to the DofConstraints map.
Definition: dof_map.h:1056
void add_uncondensed_dof_plus_constraint_dofs(dof_id_type full_dof_number, bool involved_in_constraints, std::unordered_map< dof_id_type, dof_id_type > &uncondensed_global_to_local_map, std::unordered_set< dof_id_type > &local_uncondensed_dofs_set, std::unordered_map< processor_id_type, std::unordered_set< dof_id_type >> &nonlocal_uncondensed_dofs, std::vector< dof_id_type > &elem_uncondensed_dofs, dof_id_type &uncondensed_local_dof_number, std::unordered_set< dof_id_type > &constraint_dofs)
Add an uncondensed dof potentially along with constraining dofs which themselves must/will also be un...

◆ clear()

void libMesh::StaticCondensationDofMap::clear ( )
overridevirtual

Reimplemented from libMesh::DofMapBase.

Definition at line 440 of file static_condensation_dof_map.C.

References _elem_to_dof_data, _reduced_nnz, _reduced_noz, _reduced_sp, _reduced_vars, _sc_is_initialized, _uncondensed_vars, and libMesh::DofMapBase::clear().

Referenced by reinit().

441 {
443  _elem_to_dof_data.clear();
444  _uncondensed_vars.clear();
445  _reduced_vars.clear();
446  _reduced_sp = nullptr;
447  _reduced_nnz.clear();
448  _reduced_noz.clear();
449  _sc_is_initialized = false;
450 }
virtual void clear()
Definition: dof_map_base.C:71
std::unordered_set< unsigned int > _uncondensed_vars
Variables for which we will keep all dofs.
std::vector< dof_id_type > _reduced_nnz
Number of on-diagonal nonzeros per row in the reduced system.
std::vector< dof_id_type > _reduced_noz
Number of off-diagonal nonzeros per row in the reduced system.
std::vector< Variable > _reduced_vars
The variables in the reduced system.
std::unordered_map< dof_id_type, DofData > _elem_to_dof_data
A map from element ID to Schur complement data.
bool _sc_is_initialized
Whether our object has been initialized.
std::unique_ptr< SparsityPattern::Build > _reduced_sp
Owned storage of the reduced system sparsity pattern.

◆ comm()

const Parallel::Communicator& libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
A reference to the Parallel::Communicator object used by this mesh.

Definition at line 97 of file parallel_object.h.

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::__libmesh_tao_equality_constraints(), libMesh::__libmesh_tao_equality_constraints_jacobian(), libMesh::__libmesh_tao_gradient(), libMesh::__libmesh_tao_hessian(), libMesh::__libmesh_tao_inequality_constraints(), libMesh::__libmesh_tao_inequality_constraints_jacobian(), libMesh::__libmesh_tao_objective(), libMesh::MeshRefinement::_coarsen_elements(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult_add(), libMesh::MeshRefinement::_refine_elements(), libMesh::MeshRefinement::_smooth_flags(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::RBEIMEvaluation::add_interpolation_data(), libMesh::CondensedEigenSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_variable(), libMesh::System::add_variables(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::Partitioner::build_graph(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::MeshBase::cache_elem_data(), libMesh::System::calculate_norm(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ContinuationSystem::ContinuationSystem(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshTools::create_bounding_box(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::MeshTools::create_subdomain_bounding_box(), libMesh::PetscMatrix< T >::create_submatrix_nosort(), create_wrapped_function(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::RBEIMEvaluation::distribute_bfs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshRefinement::flag_elements_by_mean_stddev(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::RBEIMEvaluation::get_eim_basis_function_node_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_side_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_value(), libMesh::MeshBase::get_info(), libMesh::System::get_info(), libMesh::DofMap::get_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::RBEIMConstruction::get_max_abs_value(), libMesh::RBEIMConstruction::get_node_max_abs_value(), libMesh::RBEIMEvaluation::get_parametrized_function_node_value(), libMesh::RBEIMEvaluation::get_parametrized_function_side_value(), libMesh::RBEIMEvaluation::get_parametrized_function_value(), libMesh::RBEIMConstruction::get_random_point(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::AdvectionSystem::init_data(), libMesh::ClawSystem::init_data(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBEIMConstruction::inner_product(), integrate_function(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_equal_connectivity(), libMesh::MeshTools::libmesh_assert_equal_points(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_constraint_rows(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshTools::libmesh_assert_valid_unique_ids(), libMesh::libmesh_petsc_linesearch_shellfunc(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_recalculate_monitor(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::libmesh_petsc_snes_precheck(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), libMesh::LinearImplicitSystem::LinearImplicitSystem(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshRefinement::make_flags_parallel_consistent(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_new_nodes_parallel_consistent(), libMesh::MeshCommunication::make_node_bcids_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_unique_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshCommunication::make_p_levels_parallel_consistent(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::FEMSystem::mesh_position_set(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::DofMap::n_constrained_dofs(), libMesh::MeshBase::n_constraint_rows(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), MixedOrderTest::n_neighbor_links(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::SparsityPattern::Build::n_nonzeros(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::RBEIMConstruction::node_inner_product(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_n_elem(), libMesh::DistributedMesh::parallel_n_nodes(), libMesh::SparsityPattern::Build::parallel_sync(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::prepare_for_use(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::InterMeshProjection::project_system_vectors(), FEMParameters::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::RBEIMEvaluation::read_in_interior_basis_functions(), libMesh::RBEIMEvaluation::read_in_node_basis_functions(), libMesh::RBEIMEvaluation::read_in_side_basis_functions(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::System::read_legacy_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::MeshRefinement::refine_and_coarsen_elements(), libMesh::SimplexRefiner::refine_via_edges(), reinit(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), scale_mesh_and_plot(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::RBEIMEvaluation::side_distribute_bfs(), libMesh::RBEIMEvaluation::side_gather_bfs(), libMesh::RBEIMConstruction::side_inner_product(), libMesh::Partitioner::single_partition(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::VariationalMeshSmoother::smooth(), libMesh::ClawSystem::solve_conservation_law(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), libMesh::MeshRefinement::test_level_one(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), libMesh::MeshRefinement::test_unflagged(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), VolumeTest::testC0PolygonMethods(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), BoundaryInfoTest::testRenumber(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::MeshRefinement::uniformly_coarsen(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), libMesh::RBEvaluation::write_out_vectors(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file(), and libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

98  { return _communicator; }
const Parallel::Communicator & _communicator

◆ compute_dof_info()

std::size_t libMesh::DofMapBase::compute_dof_info ( dof_id_type  n_local_dofs)
protectedinherited

compute the key degree of freedom information given the local number of degrees of freedom on this process

Returns
The total number of DOFs for the System, summed across all procs.

Referenced by libMesh::DofMap::distribute_dofs(), and reinit().

◆ dof_indices() [1/2]

void libMesh::StaticCondensationDofMap::dof_indices ( const Elem *const  elem,
std::vector< dof_id_type > &  di,
const unsigned int  vn,
int  p_level = -12345 
) const
overridevirtual

Fills the vector di with the global degree of freedom indices for the element.

For one variable, and potentially for a non-default element p refinement level

Implements libMesh::DofMapBase.

Definition at line 423 of file static_condensation_dof_map.C.

References _elem_to_dof_data, and libMesh::DofObject::id().

Referenced by reinit().

427 {
428  di.clear();
429  di = libmesh_map_find(_elem_to_dof_data, elem->id()).reduced_space_indices[vn];
430 }
std::unordered_map< dof_id_type, DofData > _elem_to_dof_data
A map from element ID to Schur complement data.

◆ dof_indices() [2/2]

void libMesh::StaticCondensationDofMap::dof_indices ( const Node *const  node,
std::vector< dof_id_type > &  di,
const unsigned int  vn 
) const
overridevirtual

Fills the vector di with the global degree of freedom indices for the node, for one variable vn.

Implements libMesh::DofMapBase.

Definition at line 432 of file static_condensation_dof_map.C.

435 {
436  libmesh_error_msg("StaticCondensationDofMap dof indices are only meant to be queried with "
437  "elements, not nodes");
438 }

◆ dont_condense_vars()

void libMesh::StaticCondensationDofMap::dont_condense_vars ( const std::unordered_set< unsigned int > &  vars)
inline

Add vars to the list of variables not to condense.

This can be useful when some variable's equation is discretized with a DG method or if including the variable in the condensed block diagonal would result in it being singular

Definition at line 239 of file static_condensation_dof_map.h.

References _uncondensed_vars.

Referenced by libMesh::StaticCondensation::dont_condense_vars().

240 {
241  _uncondensed_vars.insert(vars.begin(), vars.end());
242 }
std::unordered_set< unsigned int > _uncondensed_vars
Variables for which we will keep all dofs.

◆ end_dof() [1/2]

dof_id_type libMesh::DofMapBase::end_dof ( const processor_id_type  proc) const
inlineinherited

◆ end_dof() [2/2]

dof_id_type libMesh::DofMapBase::end_dof ( ) const
inlineinherited

◆ end_old_dof() [1/2]

dof_id_type libMesh::DofMapBase::end_old_dof ( const processor_id_type  proc) const
inlineinherited
Returns
The first old dof index that is after all indices local to processor proc.

Analogous to the end() member function of STL containers.

Definition at line 210 of file dof_map_base.h.

References libMesh::DofMapBase::_end_old_df.

Referenced by libMesh::PetscDMWrapper::init_petscdm(), libMesh::BuildProjectionList::operator()(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), and SystemsTest::testProjectMatrix3D().

211 {
212  libmesh_assert_less(proc, _end_old_df.size());
213  return _end_old_df[proc];
214 }
std::vector< dof_id_type > _end_old_df
Last old DOF index (plus 1) on processor p.
Definition: dof_map_base.h:181

◆ end_old_dof() [2/2]

dof_id_type libMesh::DofMapBase::end_old_dof ( ) const
inlineinherited

Definition at line 140 of file dof_map_base.h.

References libMesh::DofMapBase::end_old_dof(), and libMesh::ParallelObject::processor_id().

Referenced by libMesh::DofMapBase::end_old_dof().

140 { return this->end_old_dof(this->processor_id()); }
dof_id_type end_old_dof() const
Definition: dof_map_base.h:140
processor_id_type processor_id() const

◆ first_dof() [1/2]

dof_id_type libMesh::DofMapBase::first_dof ( const processor_id_type  proc) const
inlineinherited

◆ first_dof() [2/2]

dof_id_type libMesh::DofMapBase::first_dof ( ) const
inlineinherited

◆ first_old_dof() [1/2]

dof_id_type libMesh::DofMapBase::first_old_dof ( const processor_id_type  proc) const
inlineinherited
Returns
The first old dof index that is local to partition proc.

Definition at line 204 of file dof_map_base.h.

References libMesh::DofMapBase::_first_old_df.

Referenced by libMesh::PetscDMWrapper::init_petscdm(), libMesh::BuildProjectionList::operator()(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), and SystemsTest::testProjectMatrix3D().

205 {
206  libmesh_assert_less(proc, _first_old_df.size());
207  return _first_old_df[proc];
208 }
std::vector< dof_id_type > _first_old_df
First old DOF index on processor p.
Definition: dof_map_base.h:176

◆ first_old_dof() [2/2]

dof_id_type libMesh::DofMapBase::first_old_dof ( ) const
inlineinherited

Definition at line 130 of file dof_map_base.h.

References libMesh::DofMapBase::first_old_dof(), and libMesh::ParallelObject::processor_id().

Referenced by libMesh::DofMapBase::first_old_dof().

130 { return this->first_old_dof(this->processor_id()); }
dof_id_type first_old_dof() const
Definition: dof_map_base.h:130
processor_id_type processor_id() const

◆ get_reduced_from_global_constraint_dof()

dof_id_type libMesh::StaticCondensationDofMap::get_reduced_from_global_constraint_dof ( dof_id_type  full_dof) const
inline

Retrieve the dof index in the reduced system corresponding to the provided dof index in the full system.

This dof index should be a dof index involved in constraints

Definition at line 251 of file static_condensation_dof_map.h.

References _full_to_reduced_constraint_dofs.

Referenced by libMesh::StaticCondensation::set().

252 {
253  return libmesh_map_find(_full_to_reduced_constraint_dofs, full_dof);
254 }
std::unordered_map< dof_id_type, dof_id_type > _full_to_reduced_constraint_dofs
A small map from full system degrees of freedom to reduced/condensed system degrees of freedom involv...

◆ initialized()

bool libMesh::StaticCondensationDofMap::initialized ( ) const
inline

Whether we are initialized.

Definition at line 107 of file static_condensation_dof_map.h.

References _sc_is_initialized.

Referenced by libMesh::StaticCondensation::init(), and reinit().

107 { return _sc_is_initialized; }
bool _sc_is_initialized
Whether our object has been initialized.

◆ n_dofs()

dof_id_type libMesh::DofMapBase::n_dofs ( ) const
inlineinherited

◆ n_dofs_on_processor()

dof_id_type libMesh::DofMapBase::n_dofs_on_processor ( const processor_id_type  proc) const
inlineinherited
Returns
The number of degrees of freedom on partition proc.

Definition at line 197 of file dof_map_base.h.

References libMesh::DofMapBase::_end_df, and libMesh::DofMapBase::_first_df.

Referenced by libMesh::DofMapBase::n_local_dofs(), and SystemsTest::testProjectMatrix3D().

198 {
199  libmesh_assert_less(proc, _first_df.size());
200  return cast_int<dof_id_type>(_end_df[proc] - _first_df[proc]);
201 }
std::vector< dof_id_type > _first_df
First DOF index on processor p.
Definition: dof_map_base.h:154
std::vector< dof_id_type > _end_df
Last DOF index (plus 1) on processor p.
Definition: dof_map_base.h:159

◆ n_local_dofs()

dof_id_type libMesh::DofMapBase::n_local_dofs ( ) const
inlineinherited
Returns
The number of degrees of freedom on this processor.

Definition at line 115 of file dof_map_base.h.

References libMesh::DofMapBase::n_dofs_on_processor(), and libMesh::ParallelObject::processor_id().

Referenced by libMesh::DofMap::build_sparsity(), libMesh::StaticCondensation::init(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), and libMesh::DofMap::process_mesh_constraint_rows().

115 { return this->n_dofs_on_processor(this->processor_id()); }
dof_id_type n_dofs_on_processor(const processor_id_type proc) const
Definition: dof_map_base.h:197
processor_id_type processor_id() const

◆ n_old_dofs()

dof_id_type libMesh::DofMapBase::n_old_dofs ( ) const
inlineinherited
Returns
The total number of degrees of freedom on old_dof_objects

Definition at line 123 of file dof_map_base.h.

References libMesh::DofMapBase::_n_old_dfs.

Referenced by libMesh::BuildProjectionList::operator()(), and libMesh::DofMap::SCALAR_dof_indices().

123 { return _n_old_dfs; }
dof_id_type _n_old_dfs
Total number of degrees of freedom on old dof objects.
Definition: dof_map_base.h:171

◆ n_processors()

processor_id_type libMesh::ParallelObject::n_processors ( ) const
inlineinherited
Returns
The number of processors in the group.

Definition at line 103 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and TIMPI::Communicator::size().

Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::DofMap::add_constraints_to_send_list(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::System::add_vector(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::Partitioner::build_graph(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshBase::n_active_elem_on_proc(), libMesh::DofMap::n_dofs_per_processor(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::Partitioner::partition(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::prepare_send_list(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_header(), libMesh::CheckpointIO::read_nodes(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::Partitioner::repartition(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

104  {
105  processor_id_type returnval =
106  cast_int<processor_id_type>(_communicator.size());
107  libmesh_assert(returnval); // We never have an empty comm
108  return returnval;
109  }
const Parallel::Communicator & _communicator
processor_id_type size() const
uint8_t processor_id_type
libmesh_assert(ctx)

◆ n_variables()

unsigned int libMesh::StaticCondensationDofMap::n_variables ( ) const
overridevirtual
Returns
The number of variables in the global solution vector. Defaults to 1, should be 1 for a scalar equation, 3 for 2D incompressible Navier Stokes (u,v,p), etc...

Implements libMesh::DofMapBase.

Definition at line 416 of file static_condensation_dof_map.C.

References _reduced_vars.

416 { return _reduced_vars.size(); }
std::vector< Variable > _reduced_vars
The variables in the reduced system.

◆ processor_id()

processor_id_type libMesh::ParallelObject::processor_id ( ) const
inlineinherited
Returns
The rank of this processor in the group.

Definition at line 114 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, and TIMPI::Communicator::rank().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::MeshFunction::check_found_elem(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::ExodusII_IO_Helper::close(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::compute_communication_map_parameters(), libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::DistributedMesh::delete_elem(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMapBase::first_dof(), libMesh::DofMapBase::first_old_dof(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::Nemesis_IO_Helper::get_cmap_params(), libMesh::Nemesis_IO_Helper::get_eb_info_global(), libMesh::Nemesis_IO_Helper::get_elem_cmap(), libMesh::Nemesis_IO_Helper::get_elem_map(), libMesh::MeshBase::get_info(), libMesh::DofMap::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::MeshBase::get_local_constraints(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), HeatSystem::init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::DofMap::is_evaluable(), libMesh::SparsityPattern::Build::join(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DofMap::local_variable_indices(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), AugmentSparsityOnInterface::mesh_reinit(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::MeshBase::n_constraint_rows(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMapBase::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::DistributedMesh::own_node(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Nemesis_IO_Helper::put_cmap_params(), libMesh::Nemesis_IO_Helper::put_elem_cmap(), libMesh::Nemesis_IO_Helper::put_elem_map(), libMesh::Nemesis_IO_Helper::put_loadbal_param(), libMesh::Nemesis_IO_Helper::put_node_cmap(), libMesh::Nemesis_IO_Helper::put_node_map(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::CheckpointIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::System::read_legacy_data(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::SimplexRefiner::refine_via_edges(), reinit(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_gather_bfs(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), MeshInputTest::testAbaqusRead(), MeshInputTest::testBadGmsh(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaFileMappings(), MeshInputTest::testDynaNoSplines(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshInputTest::testGmshBCIDOverlap(), MeshInputTest::testGoodGmsh(), MeshInputTest::testGoodSTL(), MeshInputTest::testGoodSTLBinary(), MeshInputTest::testLowOrderEdgeBlocks(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::UCDIO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

115  { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const
const Parallel::Communicator & _communicator

◆ reduced_system()

const System & libMesh::StaticCondensationDofMap::reduced_system ( ) const
inline

Definition at line 244 of file static_condensation_dof_map.h.

References _reduced_system, and libMesh::libmesh_assert().

245 {
247  return *_reduced_system;
248 }
System * _reduced_system
A dummyish system to help with DofObjects.
libmesh_assert(ctx)

◆ reinit()

void libMesh::StaticCondensationDofMap::reinit ( )

Build the element global to local index maps.

Definition at line 111 of file static_condensation_dof_map.C.

References libMesh::ParallelObject::_communicator, _dof_map, _elem_to_dof_data, libMesh::DofMapBase::_first_df, _full_to_reduced_constraint_dofs, _local_uncondensed_dofs, _mesh, _reduced_nnz, _reduced_noz, _reduced_sp, _reduced_system, _reduced_vars, _sc_is_initialized, _system, _uncondensed_vars, libMesh::EquationSystems::add_system(), add_uncondensed_dof_plus_constraint_dofs(), libMesh::DofMap::build_sparsity(), clear(), libMesh::ParallelObject::comm(), libMesh::DofMapBase::compute_dof_info(), dof_indices(), libMesh::DofMap::dof_indices(), libMesh::FEType::family, libMesh::DofMapBase::first_dof(), libMesh::System::get_equation_systems(), libMesh::index_range(), libMesh::System::init(), initialized(), libMesh::DofObject::invalid_id, libMesh::invalid_uint, libMesh::System::is_initialized(), libMesh::libmesh_assert(), libMesh::libmesh_ignore(), libMesh::make_range(), libMesh::DofMap::n_variable_groups(), libMesh::Variable::name(), libMesh::MeshTools::Subdivision::next, libMesh::VariableGroup::number(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), TIMPI::pull_parallel_vector_data(), TIMPI::push_parallel_vector_data(), libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), TIMPI::Communicator::set_union(), TIMPI::Communicator::size(), TIMPI::Communicator::sum(), libMesh::Variable::type(), libMesh::DofMap::variable(), and libMesh::DofMap::variable_group().

112 {
113  if (this->initialized())
114  this->clear();
115 
116  std::vector<dof_id_type> elem_dofs, elem_uncondensed_dofs; // only used to satisfy API
117  dof_id_type condensed_local_dof_number = 0, uncondensed_local_dof_number = 0;
118  std::unordered_map<dof_id_type, dof_id_type> *condensed_global_to_local_map = nullptr,
119  *uncondensed_global_to_local_map = nullptr;
120  std::set<unsigned int> full_vars_present_in_reduced_sys;
121  std::unordered_set<dof_id_type> local_uncondensed_dofs_set, constraint_dofs;
122  std::unordered_map<processor_id_type, std::unordered_set<dof_id_type>> nonlocal_uncondensed_dofs;
123 
124  // Handle SCALAR dofs
125  for (const auto vg : make_range(_dof_map.n_variable_groups()))
126  if (const auto & vg_description = _dof_map.variable_group(vg);
127  vg_description.type().family == SCALAR)
128  {
129  std::vector<dof_id_type> scalar_dof_indices;
130  const processor_id_type last_pid = this->comm().size() - 1;
131  for (const auto vg_vn : make_range(vg_description.n_variables()))
132  {
133  const auto vn = vg_description.number(vg_vn);
134  _dof_map.SCALAR_dof_indices(scalar_dof_indices, vn);
135  if (this->comm().rank() == last_pid)
136  local_uncondensed_dofs_set.insert(scalar_dof_indices.begin(),
137  scalar_dof_indices.end());
138  else
139  nonlocal_uncondensed_dofs[last_pid].insert(scalar_dof_indices.begin(),
140  scalar_dof_indices.end());
141  }
142  }
143 
144  auto scalar_dofs_functor =
145  [this,
146  &uncondensed_global_to_local_map,
147  &local_uncondensed_dofs_set,
148  &nonlocal_uncondensed_dofs,
149  &elem_uncondensed_dofs,
150  &uncondensed_local_dof_number,
151  &constraint_dofs](const Elem & /*elem*/,
152  std::vector<dof_id_type> & dof_indices,
153  const std::vector<dof_id_type> & scalar_dof_indices) {
154  dof_indices.insert(dof_indices.end(), scalar_dof_indices.begin(), scalar_dof_indices.end());
155  for (const auto global_dof : scalar_dof_indices)
157  false,
158  *uncondensed_global_to_local_map,
159  local_uncondensed_dofs_set,
160  nonlocal_uncondensed_dofs,
161  elem_uncondensed_dofs,
162  uncondensed_local_dof_number,
163  constraint_dofs);
164  };
165 
166  auto field_dofs_functor = [this,
167  &condensed_local_dof_number,
168  &condensed_global_to_local_map,
169  &uncondensed_global_to_local_map,
170  &local_uncondensed_dofs_set,
171  &nonlocal_uncondensed_dofs,
172  &elem_uncondensed_dofs,
173  &uncondensed_local_dof_number,
174  &constraint_dofs](const Elem & elem,
175  const unsigned int node_num,
176  const unsigned int var_num,
177  std::vector<dof_id_type> & dof_indices,
178  const dof_id_type field_dof) {
179  dof_indices.push_back(field_dof);
180 
181  bool uncondensed_dof = false;
182  if (_uncondensed_vars.count(var_num))
183  {
184  libmesh_assert_msg(
185  node_num == invalid_uint,
186  "Users should not be providing continuous FEM variables to the uncondensed vars API");
187  uncondensed_dof = true;
188  }
189 
190  if (node_num != invalid_uint && !elem.is_internal(node_num))
191  uncondensed_dof = true;
192 
193  if (uncondensed_dof)
195  false,
196  *uncondensed_global_to_local_map,
197  local_uncondensed_dofs_set,
198  nonlocal_uncondensed_dofs,
199  elem_uncondensed_dofs,
200  uncondensed_local_dof_number,
201  constraint_dofs);
202  else
203  (*condensed_global_to_local_map)[field_dof] = condensed_local_dof_number++;
204  };
205 
206  for (auto elem : _mesh.active_local_element_ptr_range())
207  {
208  auto & dof_data = _elem_to_dof_data[elem->id()];
209  condensed_local_dof_number = 0;
210  uncondensed_local_dof_number = 0;
211  condensed_global_to_local_map = &dof_data.condensed_global_to_local_map;
212  uncondensed_global_to_local_map = &dof_data.uncondensed_global_to_local_map;
213 
214  const auto sub_id = elem->subdomain_id();
215  for (const auto vg : make_range(_dof_map.n_variable_groups()))
216  {
217  const auto & var_group = _dof_map.variable_group(vg);
218  for (const auto v : make_range(var_group.n_variables()))
219  {
220  const auto var_num = var_group.number(v);
221  dof_data.reduced_space_indices.resize(var_num + 1);
222  if (!var_group.active_on_subdomain(sub_id))
223  continue;
224  elem_uncondensed_dofs.clear();
225  _dof_map.dof_indices(elem,
226  elem_dofs,
227  var_num,
228  scalar_dofs_functor,
229  field_dofs_functor,
230  elem->p_level());
231  if (!elem_uncondensed_dofs.empty())
232  {
233  auto & var_reduced_space_indices = dof_data.reduced_space_indices[var_num];
234  var_reduced_space_indices.insert(var_reduced_space_indices.end(),
235  elem_uncondensed_dofs.begin(),
236  elem_uncondensed_dofs.end());
237  full_vars_present_in_reduced_sys.insert(var_num);
238  }
239  }
240  }
241  }
242 
243  //
244  // We've built our local uncondensed dofs container ... but only using local element dof_indices
245  // calls. It can be the case that we own a degree of freedom that is not actually needed by our
246  // local element assembly but is needed by other processes element assembly. One example we've run
247  // into of this is a mid-edge coarse element node holding side hierarchic dofs which is also a
248  // fine element's vertex node. This node may be owned by the process holding the fine element
249  // which doesn't need those side hierarchic dofs for its assembly
250  //
251 
252  // Build supported query type. Has to be map to contiguous data for calls to MPI
253  std::unordered_map<processor_id_type, std::vector<dof_id_type>> nonlocal_uncondensed_dofs_mapvec;
254  for (const auto & [pid, set] : nonlocal_uncondensed_dofs)
255  {
256  auto & vec = nonlocal_uncondensed_dofs_mapvec[pid];
257  vec.assign(set.begin(), set.end());
258  }
259  // clear no longer needed memory
260  nonlocal_uncondensed_dofs.clear();
261 
262  auto receive_needed_local_dofs =
263  [&local_uncondensed_dofs_set](processor_id_type,
264  const std::vector<dof_id_type> & local_dofs_to_insert) {
265  local_uncondensed_dofs_set.insert(local_dofs_to_insert.begin(), local_dofs_to_insert.end());
266  };
267 
269  _mesh.comm(), nonlocal_uncondensed_dofs_mapvec, receive_needed_local_dofs);
270 
271  _local_uncondensed_dofs.assign(local_uncondensed_dofs_set.begin(),
272  local_uncondensed_dofs_set.end());
273  local_uncondensed_dofs_set.clear();
274 
275  //
276  // Build the reduced system data
277  //
278 
279  const dof_id_type n_local = _local_uncondensed_dofs.size();
280  dof_id_type n = n_local;
281  this->comm().sum(n);
282 
283  // Get DOF counts on all processors
284  this->compute_dof_info(n_local);
285 
286  // Build a map from the full size problem uncondensed dof indices to the reduced problem
287  // (uncondensed) dof indices
288  std::unordered_map<dof_id_type, dof_id_type> full_dof_to_reduced_dof;
289  const auto local_start = _first_df[this->processor_id()];
290  for (const auto i : index_range(_local_uncondensed_dofs))
291  full_dof_to_reduced_dof[_local_uncondensed_dofs[i]] = i + local_start;
292 
293  // Build the condensed system sparsity pattern
295  this->_mesh, /*calculate_constrained=*/false, /*use_condensed_system=*/true);
296  const auto & nnz = _reduced_sp->get_n_nz();
297  const auto & noz = _reduced_sp->get_n_oz();
298  libmesh_assert(nnz.size() == noz.size());
299 
300  // Optimization for PETSc. This is critical for problems in which there are SCALAR dofs that
301  // introduce dense rows to avoid allocating a dense matrix
302  _reduced_nnz.resize(_local_uncondensed_dofs.size());
303  _reduced_noz.resize(_local_uncondensed_dofs.size());
304  for (const dof_id_type local_reduced_i : index_range(_local_uncondensed_dofs))
305  {
306  const dof_id_type full_i = _local_uncondensed_dofs[local_reduced_i];
307  const dof_id_type local_full_i = full_i - _dof_map.first_dof();
308  libmesh_assert(local_full_i < nnz.size());
309  _reduced_nnz[local_reduced_i] = nnz[local_full_i];
310  _reduced_noz[local_reduced_i] = noz[local_full_i];
311  }
312 
313  //
314  // Now we need to pull our nonlocal data
315  //
316 
317  auto gather_functor = [&full_dof_to_reduced_dof](processor_id_type,
318  const std::vector<dof_id_type> & full_dof_ids,
319  std::vector<dof_id_type> & reduced_dof_ids) {
320  reduced_dof_ids.resize(full_dof_ids.size());
321  for (const auto i : index_range(full_dof_ids))
322  reduced_dof_ids[i] = libmesh_map_find(full_dof_to_reduced_dof, full_dof_ids[i]);
323  };
324 
325  auto action_functor =
326  [&full_dof_to_reduced_dof](processor_id_type,
327  const std::vector<dof_id_type> & full_dof_ids,
328  const std::vector<dof_id_type> & reduced_dof_ids) {
329  for (const auto i : index_range(full_dof_ids))
330  {
331  libmesh_assert(!full_dof_to_reduced_dof.count(full_dof_ids[i]));
332  full_dof_to_reduced_dof[full_dof_ids[i]] = reduced_dof_ids[i];
333  }
334  };
335 
337  nonlocal_uncondensed_dofs_mapvec,
338  gather_functor,
339  action_functor,
341  nonlocal_uncondensed_dofs_mapvec.clear();
342 
343  // Determine the variables with any degrees of freedom present in the reduced system
344  _communicator.set_union(full_vars_present_in_reduced_sys);
345  _reduced_vars.reserve(full_vars_present_in_reduced_sys.size());
346  unsigned int first_local_number = 0;
347  for (const auto i : index_range(full_vars_present_in_reduced_sys))
348  {
349  const auto full_var_num = *std::next(full_vars_present_in_reduced_sys.begin(), i);
350  const auto & full_var = _dof_map.variable(full_var_num);
351  _reduced_vars.push_back(Variable{nullptr,
352  full_var.name(),
353  cast_int<unsigned int>(i),
354  first_local_number,
355  full_var.type()});
356  first_local_number += _reduced_vars.back().n_components(_mesh);
357  }
358 
359  // Now we can finally set our element reduced dof indices
360  std::vector<dof_id_type> var_full_dof_indices;
361  for (auto & [elem, dof_data] : _elem_to_dof_data)
362  {
363  libmesh_ignore(elem);
364  auto & reduced_space_indices = dof_data.reduced_space_indices;
365  // Keep around only those variables which are present in our reduced system
366  {
367  std::size_t i = 0;
368  reduced_space_indices.erase(
369  std::remove_if(
370  reduced_space_indices.begin(),
371  reduced_space_indices.end(),
372  [&full_vars_present_in_reduced_sys, &i](const std::vector<dof_id_type> &) {
373  return !full_vars_present_in_reduced_sys.count(i++);
374  }),
375  reduced_space_indices.end());
376  }
377  libmesh_assert(reduced_space_indices.size() == full_vars_present_in_reduced_sys.size());
378 
379  for (auto & var_dof_indices : reduced_space_indices)
380  {
381  var_full_dof_indices = var_dof_indices;
382  var_dof_indices.clear();
383  for (const auto full_dof : var_full_dof_indices)
384  var_dof_indices.push_back(libmesh_map_find(full_dof_to_reduced_dof, full_dof));
385  }
386  }
387 
388  // Build our dof constraints map
389  for (const auto full_dof : constraint_dofs)
391  libmesh_map_find(full_dof_to_reduced_dof, full_dof);
392  constraint_dofs.clear();
393 
394  // Prevent querying Nodes for dof indices
395  std::vector<unsigned int> nvpg(_reduced_vars.size());
396  for (auto & elem : nvpg)
397  elem = 1;
398 
399  // add_system returns a system if it already exists instead of erroring so there's no harm if
400  // we do this multiple times
401  _reduced_system = &_system.get_equation_systems().add_system("Basic", "reduced");
403  {
405  for (auto * const nd : _mesh.active_node_ptr_range())
406  {
407  nd->set_n_vars_per_group(_reduced_system->number(), nvpg);
408  for (const auto g : index_range(nvpg))
409  nd->set_n_comp_group(_reduced_system->number(), g, 0);
410  }
411  }
412 
413  _sc_is_initialized = true;
414 }
bool is_initialized() const
Definition: system.h:2414
FEFamily family
The type of finite element.
Definition: fe_type.h:221
void pull_parallel_vector_data(const Communicator &comm, const MapToVectors &queries, GatherFunctor &gather_data, const ActionFunctor &act_on_data, const datum *example)
unsigned int n_variable_groups() const
Definition: dof_map.h:632
std::unordered_set< unsigned int > _uncondensed_vars
Variables for which we will keep all dofs.
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
Definition: libmesh.h:310
std::unordered_map< dof_id_type, dof_id_type > _full_to_reduced_constraint_dofs
A small map from full system degrees of freedom to reduced/condensed system degrees of freedom involv...
std::vector< dof_id_type > _reduced_nnz
Number of on-diagonal nonzeros per row in the reduced system.
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Definition: dof_map.C:2229
std::vector< dof_id_type > _first_df
First DOF index on processor p.
Definition: dof_map_base.h:154
std::vector< dof_id_type > _reduced_noz
Number of off-diagonal nonzeros per row in the reduced system.
std::unique_ptr< SparsityPattern::Build > build_sparsity(const MeshBase &mesh, bool calculate_constrained=false, bool use_condensed_system=false) const
Builds a sparsity pattern for matrices using the current degree-of-freedom numbering and coupling...
Definition: dof_map.C:61
const EquationSystems & get_equation_systems() const
Definition: system.h:721
void sum(T &r) const
std::vector< Variable > _reduced_vars
The variables in the reduced system.
const Parallel::Communicator & comm() const
const Parallel::Communicator & _communicator
void init()
Initializes degrees of freedom on the current mesh.
Definition: system.C:197
uint8_t processor_id_type
Definition: id_types.h:104
void SCALAR_dof_indices(std::vector< dof_id_type > &di, const unsigned int vn, const bool old_dofs=false) const
Fills the vector di with the global degree of freedom indices corresponding to the SCALAR variable vn...
Definition: dof_map.C:2612
System * _reduced_system
A dummyish system to help with DofObjects.
const Variable & variable(const unsigned int c) const override
Definition: dof_map.h:2200
std::unordered_map< dof_id_type, DofData > _elem_to_dof_data
A map from element ID to Schur complement data.
processor_id_type size() const
void push_parallel_vector_data(const Communicator &comm, MapToVectors &&data, const ActionFunctor &act_on_data)
uint8_t processor_id_type
void libmesh_ignore(const Args &...)
unsigned int number() const
Definition: system.h:2350
bool _sc_is_initialized
Whether our object has been initialized.
std::vector< dof_id_type > _local_uncondensed_dofs
All the uncondensed degrees of freedom (numbered in the "full" uncondensed + condensed space)...
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
const VariableGroup & variable_group(const unsigned int c) const
Definition: dof_map.h:2190
static const unsigned int next[3]
A lookup table for the increment modulo 3 operation, for iterating through the three nodes per elemen...
virtual void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di, const unsigned int vn, int p_level=-12345) const override
Fills the vector di with the global degree of freedom indices for the element.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
std::size_t compute_dof_info(dof_id_type n_local_dofs)
compute the key degree of freedom information given the local number of degrees of freedom on this pr...
unsigned int number(unsigned int v) const
Definition: variable.h:304
std::unique_ptr< SparsityPattern::Build > _reduced_sp
Owned storage of the reduced system sparsity pattern.
bool initialized() const
Whether we are initialized.
void add_uncondensed_dof_plus_constraint_dofs(dof_id_type full_dof_number, bool involved_in_constraints, std::unordered_map< dof_id_type, dof_id_type > &uncondensed_global_to_local_map, std::unordered_set< dof_id_type > &local_uncondensed_dofs_set, std::unordered_map< processor_id_type, std::unordered_set< dof_id_type >> &nonlocal_uncondensed_dofs, std::vector< dof_id_type > &elem_uncondensed_dofs, dof_id_type &uncondensed_local_dof_number, std::unordered_set< dof_id_type > &constraint_dofs)
Add an uncondensed dof potentially along with constraining dofs which themselves must/will also be un...
dof_id_type first_dof(const processor_id_type proc) const
Definition: dof_map_base.h:185
virtual System & add_system(std::string_view system_type, std::string_view name)
Add the system of type system_type named name to the systems array.
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:117
uint8_t dof_id_type
Definition: id_types.h:67
const FEType & type() const
Definition: variable.h:144
void set_union(T &data, const unsigned int root_id) const

◆ uncondensed_vars()

const std::unordered_set<unsigned int>& libMesh::StaticCondensationDofMap::uncondensed_vars ( ) const
inline
Returns
our list of variables for whom we do not condense out any dofs

Definition at line 84 of file static_condensation_dof_map.h.

References _uncondensed_vars.

Referenced by libMesh::SparsityPattern::Build::sorted_connected_dofs().

84 { return _uncondensed_vars; }
std::unordered_set< unsigned int > _uncondensed_vars
Variables for which we will keep all dofs.

◆ variable()

const Variable & libMesh::StaticCondensationDofMap::variable ( const unsigned int  c) const
overridevirtual
Returns
The variable description object for variable c.

Implements libMesh::DofMapBase.

Definition at line 418 of file static_condensation_dof_map.C.

References _reduced_vars.

419 {
420  return _reduced_vars[c];
421 }
std::vector< Variable > _reduced_vars
The variables in the reduced system.

Friends And Related Function Documentation

◆ StaticCondensation

friend class StaticCondensation
friend

Friend the static condensation matrix class so they can inspect our degree of freedom data.

Definition at line 197 of file static_condensation_dof_map.h.

Member Data Documentation

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _dof_map

const DofMap& libMesh::StaticCondensationDofMap::_dof_map
private

◆ _elem_to_dof_data

std::unordered_map<dof_id_type, DofData> libMesh::StaticCondensationDofMap::_elem_to_dof_data
private

◆ _end_df

std::vector<dof_id_type> libMesh::DofMapBase::_end_df
protectedinherited

◆ _end_old_df

std::vector<dof_id_type> libMesh::DofMapBase::_end_old_df
protectedinherited

Last old DOF index (plus 1) on processor p.

Definition at line 181 of file dof_map_base.h.

Referenced by libMesh::DofMap::clear(), and libMesh::DofMapBase::end_old_dof().

◆ _first_df

std::vector<dof_id_type> libMesh::DofMapBase::_first_df
protectedinherited

◆ _first_old_df

std::vector<dof_id_type> libMesh::DofMapBase::_first_old_df
protectedinherited

First old DOF index on processor p.

Definition at line 176 of file dof_map_base.h.

Referenced by libMesh::DofMap::clear(), and libMesh::DofMapBase::first_old_dof().

◆ _full_to_reduced_constraint_dofs

std::unordered_map<dof_id_type, dof_id_type> libMesh::StaticCondensationDofMap::_full_to_reduced_constraint_dofs
private

A small map from full system degrees of freedom to reduced/condensed system degrees of freedom involved in constraints.

This may be leveraged by StaticCondensation::set during DofMap::enforce_constraints_on_jacobian at the very end of Jacobian evaluation

Definition at line 235 of file static_condensation_dof_map.h.

Referenced by get_reduced_from_global_constraint_dof(), and reinit().

◆ _local_uncondensed_dofs

std::vector<dof_id_type> libMesh::StaticCondensationDofMap::_local_uncondensed_dofs
private

All the uncondensed degrees of freedom (numbered in the "full" uncondensed + condensed space).

This data member is used for creating subvectors corresponding to only uncondensed dofs

Definition at line 205 of file static_condensation_dof_map.h.

Referenced by libMesh::StaticCondensation::apply(), libMesh::StaticCondensation::forward_elimination(), and reinit().

◆ _mesh

MeshBase& libMesh::StaticCondensationDofMap::_mesh
private

Definition at line 207 of file static_condensation_dof_map.h.

Referenced by reinit().

◆ _n_dfs

dof_id_type libMesh::DofMapBase::_n_dfs
protectedinherited

Total number of degrees of freedom.

Definition at line 164 of file dof_map_base.h.

Referenced by libMesh::DofMapBase::clear(), and libMesh::DofMapBase::n_dofs().

◆ _n_old_dfs

dof_id_type libMesh::DofMapBase::_n_old_dfs
protectedinherited

Total number of degrees of freedom on old dof objects.

Definition at line 171 of file dof_map_base.h.

Referenced by libMesh::DofMap::clear(), and libMesh::DofMapBase::n_old_dofs().

◆ _reduced_nnz

std::vector<dof_id_type> libMesh::StaticCondensationDofMap::_reduced_nnz
private

Number of on-diagonal nonzeros per row in the reduced system.

Definition at line 227 of file static_condensation_dof_map.h.

Referenced by clear(), libMesh::StaticCondensation::init(), and reinit().

◆ _reduced_noz

std::vector<dof_id_type> libMesh::StaticCondensationDofMap::_reduced_noz
private

Number of off-diagonal nonzeros per row in the reduced system.

Definition at line 230 of file static_condensation_dof_map.h.

Referenced by clear(), libMesh::StaticCondensation::init(), and reinit().

◆ _reduced_sp

std::unique_ptr<SparsityPattern::Build> libMesh::StaticCondensationDofMap::_reduced_sp
private

Owned storage of the reduced system sparsity pattern.

Definition at line 224 of file static_condensation_dof_map.h.

Referenced by clear(), libMesh::StaticCondensation::init(), and reinit().

◆ _reduced_system

System* libMesh::StaticCondensationDofMap::_reduced_system
private

A dummyish system to help with DofObjects.

Definition at line 221 of file static_condensation_dof_map.h.

Referenced by reduced_system(), and reinit().

◆ _reduced_vars

std::vector<Variable> libMesh::StaticCondensationDofMap::_reduced_vars
private

The variables in the reduced system.

Definition at line 218 of file static_condensation_dof_map.h.

Referenced by clear(), n_variables(), reinit(), and variable().

◆ _sc_is_initialized

bool libMesh::StaticCondensationDofMap::_sc_is_initialized
private

Whether our object has been initialized.

Definition at line 215 of file static_condensation_dof_map.h.

Referenced by clear(), initialized(), and reinit().

◆ _system

System& libMesh::StaticCondensationDofMap::_system
private

Definition at line 208 of file static_condensation_dof_map.h.

Referenced by reinit().

◆ _uncondensed_vars

std::unordered_set<unsigned int> libMesh::StaticCondensationDofMap::_uncondensed_vars
private

Variables for which we will keep all dofs.

Definition at line 212 of file static_condensation_dof_map.h.

Referenced by clear(), dont_condense_vars(), reinit(), and uncondensed_vars().


The documentation for this class was generated from the following files: