libMesh
Loading...
Searching...
No Matches
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.
 
void dont_condense_vars (const std::unordered_set< unsigned int > &vars)
 Add vars to the list of variables not to condense.
 
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.
 
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.
 
const Systemreduced_system () const
 
const MeshBasemesh () const
 
bool initialized () const
 Whether we are initialized.
 
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.
 
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
 

Protected Attributes

std::vector< dof_id_type_first_df
 First DOF index on processor p.
 
std::vector< dof_id_type_end_df
 Last DOF index (plus 1) on processor p.
 
dof_id_type _n_dfs
 Total number of degrees of freedom.
 
dof_id_type _n_old_dfs
 Total number of degrees of freedom on old dof objects.
 
std::vector< dof_id_type_first_old_df
 First old DOF index on processor p.
 
std::vector< dof_id_type_end_old_df
 Last old DOF index (plus 1) on processor p.
 
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.
 
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.
 

Private Attributes

std::unordered_map< dof_id_type, DofData_elem_to_dof_data
 A map from element ID to Schur complement data.
 
std::vector< dof_id_type_local_uncondensed_dofs
 All the uncondensed degrees of freedom (numbered in the "full" uncondensed + condensed space).
 
MeshBase_mesh
 
System_system
 
const DofMap_dof_map
 
std::unordered_set< unsigned int_uncondensed_vars
 Variables for which we will keep all dofs.
 
bool _sc_is_initialized
 Whether our object has been initialized.
 
std::vector< Variable_reduced_vars
 The variables in the reduced system.
 
System_reduced_system
 A dummyish system to help with DofObjects.
 
std::unique_ptr< SparsityPattern::Build_reduced_sp
 Owned storage of the reduced system sparsity pattern.
 
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::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.
 

Friends

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

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),
39{
40 libmesh_experimental();
41}
DofMapBase(const Parallel::Communicator &comm)
bool _sc_is_initialized
Whether our object has been initialized.

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

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:815
bool local_index(dof_id_type dof_index) const
Definition dof_map.h:967

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

Referenced by add_uncondensed_dof_plus_constraint_dofs().

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

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 {
98 libmesh_ignore(weight);
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}
const DofConstraints & get_dof_constraints() const
Provide a const accessor to the DofConstraints map.
Definition dof_map.h:1177
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...
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 &...)

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

Referenced by add_uncondensed_dof_plus_constraint_dofs(), and reinit().

◆ clear()

void libMesh::StaticCondensationDofMap::clear ( )
overridevirtual

Reimplemented from libMesh::DofMapBase.

Definition at line 443 of file static_condensation_dof_map.C.

444{
446 _elem_to_dof_data.clear();
447 _uncondensed_vars.clear();
448 _reduced_vars.clear();
449 _reduced_sp = nullptr;
450 _reduced_nnz.clear();
451 _reduced_noz.clear();
452 _sc_is_initialized = false;
453}
virtual void clear()
std::unordered_set< unsigned int > _uncondensed_vars
Variables for which we will keep all dofs.
std::unique_ptr< SparsityPattern::Build > _reduced_sp
Owned storage of the reduced system sparsity pattern.
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.
std::vector< dof_id_type > _reduced_noz
Number of off-diagonal nonzeros per row in the reduced system.
std::vector< dof_id_type > _reduced_nnz
Number of on-diagonal nonzeros per row in the reduced system.

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().

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

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

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::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult_add(), 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::System::add_matrix(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::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::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::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::MeshBase::cache_elem_data(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), libMesh::MeshBase::complete_preparation(), 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::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), PetscSolverConfiguration::configure_solver(), 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::MeshBase::detect_interior_parents(), 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::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::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::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(), libMesh::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::StaticCondensation::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::LocationMap< T >::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), ElasticitySystem::init_data(), 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::Modification::interpolate_surface(), 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_snes_mffd_interface(), libMesh::libmesh_petsc_snes_postcheck(), 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::MeshCommunication::make_elems_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::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::PetscVector< T >::operator=(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::ReplicatedMesh::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(), LaplaceSystem::postprocess(), PoissonSystem::postprocess(), 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(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), FEMParameters::read(), libMesh::EquationSystems::read(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::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::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::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::SimplexRefiner::refine_via_edges(), reinit(), libMesh::BoundaryInfo::remove_edge_id(), libMesh::BoundaryInfo::remove_node_id(), libMesh::BoundaryInfo::remove_shellface_id(), libMesh::BoundaryInfo::remove_side_id(), 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::NoxNonlinearSolver< Number >::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::MeshBase::sync_subdomain_name_map(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), CheckpointIOTest::testC0PolygonCheckpoint(), VolumeTest::testC0PolygonMethods(), CheckpointIOTest::testC0PolyhedronCheckpoint(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriEdge3ToTri7CenterFixup(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectScalarCoarsening(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), BoundaryMeshSubdomainTest::testSingleSubdomain(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_assembly(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::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::RBConstruction::write_riesz_representors_to_files(), libMesh::TransientRBConstruction::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().

◆ 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 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 426 of file static_condensation_dof_map.C.

430{
431 di.clear();
432 di = libmesh_map_find(_elem_to_dof_data, elem->id()).reduced_space_indices[vn];
433}

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

Referenced by reinit().

◆ 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 435 of file static_condensation_dof_map.C.

438{
439 libmesh_error_msg("StaticCondensationDofMap dof indices are only meant to be queried with "
440 "elements, not nodes");
441}

◆ 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 244 of file static_condensation_dof_map.h.

245{
246 _uncondensed_vars.insert(vars.begin(), vars.end());
247}

References _uncondensed_vars.

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

◆ end_dof() [1/2]

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

◆ end_dof() [2/2]

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

◆ end_old_dof() [1/2]

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

Definition at line 140 of file dof_map_base.h.

140{ return this->end_old_dof(this->processor_id()); }
dof_id_type end_old_dof() const

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

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

◆ end_old_dof() [2/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.

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.

References libMesh::DofMapBase::_end_old_df.

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

◆ first_dof() [1/2]

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

◆ first_dof() [2/2]

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

◆ first_old_dof() [1/2]

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

Definition at line 130 of file dof_map_base.h.

130{ return this->first_old_dof(this->processor_id()); }
dof_id_type first_old_dof() const

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

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

◆ first_old_dof() [2/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.

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.

References libMesh::DofMapBase::_first_old_df.

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

◆ 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 256 of file static_condensation_dof_map.h.

257{
258 return libmesh_map_find(_full_to_reduced_constraint_dofs, full_dof);
259}
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...

References _full_to_reduced_constraint_dofs.

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

◆ initialized()

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

Whether we are initialized.

Definition at line 112 of file static_condensation_dof_map.h.

112{ return _sc_is_initialized; }

References _sc_is_initialized.

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

◆ mesh()

const MeshBase & libMesh::StaticCondensationDofMap::mesh ( ) const
inline

Definition at line 107 of file static_condensation_dof_map.h.

107{ return _mesh; }

References _mesh.

Referenced by libMesh::DofMap::add_constraints_to_send_list().

◆ n_dofs()

dof_id_type libMesh::DofMapBase::n_dofs ( ) const
inlineinherited
Returns
The total number of degrees of freedom in the problem.

Definition at line 105 of file dof_map_base.h.

105{ return _n_dfs; }
dof_id_type _n_dfs
Total number of degrees of freedom.

References libMesh::DofMapBase::_n_dfs.

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

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

198{
199 libmesh_assert_less(proc, _first_df.size());
200 return cast_int<dof_id_type>(_end_df[proc] - _first_df[proc]);
201}

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

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

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

115{ return this->n_dofs_on_processor(this->processor_id()); }
dof_id_type n_dofs_on_processor(const processor_id_type proc) const

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

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

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

123{ return _n_old_dfs; }
dof_id_type _n_old_dfs
Total number of degrees of freedom on old dof objects.

References libMesh::DofMapBase::_n_old_dfs.

Referenced by libMesh::BuildProjectionList::operator()().

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

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 }
processor_id_type size() const
libmesh_assert(ctx)
uint8_t processor_id_type
Definition id_types.h:104

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and libMesh::Parallel::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::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::DistributedMesh::DistributedMesh(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< T >::is_effectively_ghosted(), libMesh::NumericVector< T >::is_effectively_serial(), 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::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::MeshBase::partition(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::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::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::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().

◆ 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 419 of file static_condensation_dof_map.C.

419{ return _reduced_vars.size(); }

References _reduced_vars.

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

115 { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const

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

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), 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::MeshCommunication::delete_remote_elements(), libMesh::DistributedMesh::DistributedMesh(), 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::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::MeshTools::Modification::interpolate_surface(), libMesh::SparsityPattern::Build::join(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::TransientRBEvaluation::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(), main(), 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::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::XdrIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), libMesh::EquationSystems::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::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(), 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(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), MeshInputTest::testAbaqusRead(), MeshInputTest::testBadGmsh(), BoundaryInfoTest::testBoundaryIDs(), 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(), BoundaryInfoTest::testInternalBoundary(), MeshInputTest::testLowOrderEdgeBlocks(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), BoundaryMeshSubdomainTest::testSingleSubdomain(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::Parallel::Packing< Elem * >::unpack(), libMesh::Parallel::Packing< Node * >::unpack(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_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::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::UCDIO::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::ExodusII_IO_Helper::write_nodesets(), libMesh::Nemesis_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::ExodusII_IO_Helper::write_sidesets(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

◆ reduced_system()

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

Definition at line 249 of file static_condensation_dof_map.h.

250{
252 return *_reduced_system;
253}
System * _reduced_system
A dummyish system to help with DofObjects.

References _reduced_system, and libMesh::libmesh_assert().

◆ reinit()

void libMesh::StaticCondensationDofMap::reinit ( )

Build the element global to local index maps.

Definition at line 111 of file static_condensation_dof_map.C.

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();
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
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
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 // We don't want to write the reduced system
415
416 _sc_is_initialized = true;
417}
void set_union(T &data, const unsigned int root_id) const
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...
dof_id_type first_dof(const processor_id_type proc) const
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Definition dof_map.C:2201
const VariableGroup & variable_group(const unsigned int c) const
Definition dof_map.h:2348
const Variable & variable(const unsigned int c) const override
Definition dof_map.h:2358
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:2605
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:63
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition dof_object.h:473
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.
const Parallel::Communicator & comm() const
std::vector< dof_id_type > _local_uncondensed_dofs
All the uncondensed degrees of freedom (numbered in the "full" uncondensed + condensed space).
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.
bool initialized() const
Whether we are initialized.
virtual unsigned int n_variables() const override
bool is_initialized() const
Definition system.h:2457
bool & hide_output()
Definition system.h:1852
void init()
Initializes degrees of freedom on the current mesh.
Definition system.C:196
unsigned int number() const
Definition system.h:2393
const EquationSystems & get_equation_systems() const
Definition system.h:767
unsigned int number(unsigned int v) const
Definition variable.h:316
unsigned int n_components() const
Definition variable.C:23
void pull_parallel_vector_data(const Communicator &comm, const MapToVectors &queries, GatherFunctor &gather_data, const ActionFunctor &act_on_data, const datum *example)
void push_parallel_vector_data(const Communicator &comm, MapToVectors &&data, const ActionFunctor &act_on_data)
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:153
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:303
uint8_t dof_id_type
Definition id_types.h:67
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:176

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(), libMesh::DofMap::dof_indices(), dof_indices(), libMesh::FEType::family, libMesh::DofMapBase::first_dof(), libMesh::System::get_equation_systems(), libMesh::System::hide_output(), 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::Variable::n_components(), libMesh::DofMap::n_variable_groups(), libMesh::Variable::name(), libMesh::System::number(), libMesh::VariableGroup::number(), libMesh::ParallelObject::processor_id(), TIMPI::pull_parallel_vector_data(), TIMPI::push_parallel_vector_data(), libMesh::Parallel::Communicator::rank(), libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::Parallel::Communicator::set_union(), libMesh::Parallel::Communicator::size(), libMesh::Parallel::Communicator::sum(), libMesh::Variable::type(), libMesh::DofMap::variable(), and libMesh::DofMap::variable_group().

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

84{ return _uncondensed_vars; }

References _uncondensed_vars.

Referenced by libMesh::SparsityPattern::Build::sorted_connected_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 421 of file static_condensation_dof_map.C.

422{
423 return _reduced_vars[c];
424}

References _reduced_vars.

Friends And Related Symbol Documentation

◆ StaticCondensation

friend class StaticCondensation
friend

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

Definition at line 202 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::DofMapBase::end_old_dof().

◆ _first_df

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

First DOF index on processor p.

Definition at line 154 of file dof_map_base.h.

Referenced by libMesh::DofMapBase::clear(), libMesh::DofMapBase::first_dof(), libMesh::DofMapBase::n_dofs_on_processor(), and reinit().

◆ _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::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 240 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 210 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 212 of file static_condensation_dof_map.h.

Referenced by mesh(), and 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::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 232 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 235 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 229 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 226 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 223 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 220 of file static_condensation_dof_map.h.

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

◆ _system

System& libMesh::StaticCondensationDofMap::_system
private

Definition at line 213 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 217 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: