libMesh
Loading...
Searching...
No Matches
Classes | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
libMesh::StaticCondensation Class Referenceabstract

#include <static_condensation.h>

Inheritance diagram for libMesh::StaticCondensation:
[legend]

Classes

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

Public Member Functions

 StaticCondensation (const MeshBase &mesh, System &system, const DofMap &full_dof_map, StaticCondensationDofMap &reduced_dof_map)
 
virtual ~StaticCondensation ()
 
virtual SparseMatrix< Number > & operator= (const SparseMatrix< Number > &) override
 This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual.
 
virtual SolverPackage solver_package () override
 
virtual void init (const numeric_index_type m, const numeric_index_type n, const numeric_index_type m_l, const numeric_index_type n_l, const numeric_index_type nnz=30, const numeric_index_type noz=10, const numeric_index_type blocksize=1) override
 Initialize SparseMatrix with the specified sizes.
 
virtual void init (const ParallelType type) override
 Initialize this matrix using the sparsity structure computed by dof_map.
 
virtual bool initialized () const override
 
virtual void clear () noexcept override
 clear() is called from the destructor, so it should not throw.
 
virtual void zero () override
 Set all entries to 0.
 
virtual std::unique_ptr< SparseMatrix< Number > > zero_clone () const override
 
virtual std::unique_ptr< SparseMatrix< Number > > clone () const override
 
virtual void close () override
 Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across processors.
 
virtual numeric_index_type m () const override
 
virtual numeric_index_type n () const override
 
virtual numeric_index_type row_start () const override
 
virtual numeric_index_type row_stop () const override
 
virtual numeric_index_type col_start () const override
 
virtual numeric_index_type col_stop () const override
 
virtual void set (const numeric_index_type i, const numeric_index_type j, const Number value) override
 Set the element (i,j) to value.
 
virtual void add (const numeric_index_type i, const numeric_index_type j, const Number value) override
 Add value to the element (i,j).
 
virtual void add_matrix (const DenseMatrix< Number > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) override
 Add the full matrix dm to the SparseMatrix.
 
virtual void add_matrix (const DenseMatrix< Number > &dm, const std::vector< numeric_index_type > &dof_indices) override
 Same as add_matrix, but assumes the row and column maps are the same.
 
virtual void add (const Number a, const SparseMatrix< Number > &X) override
 Compute \( A \leftarrow A + a*X \) for scalar a, matrix X.
 
virtual Number operator() (const numeric_index_type i, const numeric_index_type j) const override
 
virtual Real l1_norm () const override
 
virtual Real linfty_norm () const override
 
virtual bool closed () const override
 
virtual void print_personal (std::ostream &os=libMesh::out) const override
 Print the contents of the matrix to the screen in a package-personalized style, if available.
 
virtual void get_diagonal (NumericVector< Number > &dest) const override
 Copies the diagonal part of the matrix into dest.
 
virtual void get_transpose (SparseMatrix< Number > &dest) const override
 Copies the transpose of the matrix into dest, which may be *this.
 
virtual void get_row (numeric_index_type i, std::vector< numeric_index_type > &indices, std::vector< Number > &values) const override
 Get a row from the matrix.
 
void init ()
 Size the element matrices.
 
void setup ()
 A no-op to be consistent with shimming from the StaticCondenstionPreconditioner.
 
void apply (const NumericVector< Number > &full_rhs, NumericVector< Number > &full_sol)
 Perform our three stages, forward_elimination(), a solve() on the condensed system, and finally a backwards_substitution()
 
const SparseMatrix< Number > & get_condensed_mat () const
 
void set_current_elem (const Elem &elem)
 Set the current element.
 
StaticCondensationPreconditionerget_preconditioner ()
 Get the preconditioning wrapper.
 
LinearSolver< Number > & reduced_system_solver ()
 
virtual bool require_sparsity_pattern () const override
 
void uncondensed_dofs_only ()
 Sets whether this matrix represents uncondensed dofs only.
 
void dont_condense_vars (const std::unordered_set< unsigned int > &vars)
 Add vars to the list of variables not to condense.
 
 StaticCondensation (const MeshBase &, const System &, const DofMap &full_dof_map, StaticCondensationDofMap &reduced_dof_map)
 
const std::unordered_set< unsigned int > & uncondensed_vars () const
 
StaticCondensationPreconditionerget_preconditioner ()
 
virtual SparseMatrix< Number > & operator= (const SparseMatrix< Number > &) override
 This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual.
 
virtual SolverPackage solver_package () override
 
virtual void init (const numeric_index_type, const numeric_index_type, const numeric_index_type, const numeric_index_type, const numeric_index_type=30, const numeric_index_type=10, const numeric_index_type=1) override
 Initialize SparseMatrix with the specified sizes.
 
virtual void init (ParallelType) override
 Initialize this matrix using the sparsity structure computed by dof_map.
 
virtual void clear () override
 clear() is called from the destructor, so it should not throw.
 
virtual void zero () override
 Set all entries to 0.
 
virtual std::unique_ptr< SparseMatrix< Number > > zero_clone () const override
 
virtual std::unique_ptr< SparseMatrix< Number > > clone () const override
 
virtual void close () override
 Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across processors.
 
virtual numeric_index_type m () const override
 
virtual numeric_index_type n () const override
 
virtual numeric_index_type row_start () const override
 
virtual numeric_index_type row_stop () const override
 
virtual numeric_index_type col_start () const override
 
virtual numeric_index_type col_stop () const override
 
virtual void set (const numeric_index_type, const numeric_index_type, const Number) override
 Set the element (i,j) to value.
 
virtual void add (const numeric_index_type, const numeric_index_type, const Number) override
 Add value to the element (i,j).
 
virtual void add_matrix (const DenseMatrix< Number > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &) override
 Add the full matrix dm to the SparseMatrix.
 
virtual void add_matrix (const DenseMatrix< Number > &, const std::vector< numeric_index_type > &) override
 Same as add_matrix, but assumes the row and column maps are the same.
 
virtual void add (const Number, const SparseMatrix< Number > &) override
 Compute \( A \leftarrow A + a*X \) for scalar a, matrix X.
 
virtual Number operator() (const numeric_index_type, const numeric_index_type) const override
 
virtual Real l1_norm () const override
 
virtual Real linfty_norm () const override
 
virtual bool closed () const override
 
virtual void print_personal (std::ostream &=libMesh::out) const override
 Print the contents of the matrix to the screen in a package-personalized style, if available.
 
virtual void get_diagonal (NumericVector< Number > &) const override
 Copies the diagonal part of the matrix into dest.
 
virtual void get_transpose (SparseMatrix< Number > &) const override
 Copies the transpose of the matrix into dest, which may be *this.
 
virtual void get_row (numeric_index_type, std::vector< numeric_index_type > &, std::vector< Number > &) const override
 Get a row from the matrix.
 
void init ()
 
void setup ()
 
void apply (const NumericVector< Number > &, NumericVector< Number > &)
 
void set_current_elem (const Elem &)
 
void dont_condense_vars (const std::unordered_set< unsigned int > &)
 
Mat mat ()
 
Mat mat () const
 
void set_destroy_mat_on_exit (bool destroy=true)
 If set to false, we don't delete the Mat on destruction and allow instead for PETSc to manage it.
 
void swap (PetscMatrixBase< T > &)
 Swaps the internal data pointers of two PetscMatrices, no actual values are swapped.
 
void set_context ()
 Set the context (ourself) for _mat.
 
virtual numeric_index_type local_m () const final
 Get the number of rows owned by this process.
 
virtual numeric_index_type local_n () const final
 Get the number of columns owned by this process.
 
void attach_dof_map (const DofMap &dof_map)
 Set a pointer to the DofMap to use.
 
void attach_sparsity_pattern (const SparsityPattern::Build &sp)
 Set a pointer to a sparsity pattern to use.
 
virtual bool need_full_sparsity_pattern () const
 
virtual void update_sparsity_pattern (const SparsityPattern::Graph &)
 Updates the matrix sparsity pattern.
 
virtual void zero_rows (std::vector< numeric_index_type > &rows, T diag_value=0.0)
 Sets all row entries to 0 then puts diag_value in the diagonal entry.
 
virtual void flush ()
 For PETSc matrix , this function is similar to close but without shrinking memory.
 
virtual void set (const numeric_index_type i, const numeric_index_type j, const T value)=0
 Set the element (i,j) to value.
 
virtual void add (const numeric_index_type i, const numeric_index_type j, const T value)=0
 Add value to the element (i,j).
 
virtual void add (const T a, const SparseMatrix< T > &X)=0
 Compute \( A \leftarrow A + a*X \) for scalar a, matrix X.
 
virtual void add_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
 Add the full matrix dm to the SparseMatrix.
 
virtual void add_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &dof_indices)=0
 Same as add_matrix, but assumes the row and column maps are the same.
 
virtual void add_block_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &brows, const std::vector< numeric_index_type > &bcols)
 Add the full matrix dm to the SparseMatrix.
 
virtual void add_block_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &dof_indices)
 Same as add_block_matrix(), but assumes the row and column maps are the same.
 
virtual void matrix_matrix_mult (SparseMatrix< T > &, SparseMatrix< T > &, bool)
 Compute Y = A*X for matrix X.
 
virtual void add_sparse_matrix (const SparseMatrix< T > &, const std::map< numeric_index_type, numeric_index_type > &, const std::map< numeric_index_type, numeric_index_type > &, const T)
 Add scalar* spm to the rows and cols of this matrix (A): A(rows[i], cols[j]) += scalar * spm(i,j)
 
Real l1_norm_diff (const SparseMatrix< T > &other_mat) const
 
virtual std::size_t n_nonzeros () const
 
void print (std::ostream &os=libMesh::out, const bool sparse=false) const
 Print the contents of the matrix to the screen in a uniform style, regardless of matrix/solver package being used.
 
void print (const std::string &filename) const
 Print the contents of the matrix to a file, with a file format depending on the extension of filename.
 
void print (std::ostream &os, const bool sparse) const
 
virtual void print_coreform_hdf5 (const std::string &filename, const std::string &groupname="extraction") const
 Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm, putting CSR sparse matrix data in the group given by groupname.
 
virtual void print_matlab (const std::string &="") const
 Print the contents of the matrix in Matlab's sparse matrix format.
 
virtual void print_petsc_binary (const std::string &filename) const
 Write the contents of the matrix to a file in PETSc's binary sparse matrix format.
 
virtual void print_petsc_hdf5 (const std::string &filename) const
 Write the contents of the matrix to a file in PETSc's HDF5 sparse matrix format.
 
virtual void read (const std::string &filename)
 Read the contents of the matrix from a file, with the file format inferred from the extension of filename.
 
virtual void read_coreform_hdf5 (const std::string &filename, const std::string &groupname="extraction")
 Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm, expecing sparse matrix data in the group given by groupname.
 
virtual void read_matlab (const std::string &filename)
 Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc.
 
virtual void read_petsc_binary (const std::string &filename)
 Read the contents of the matrix from a file in PETSc's binary sparse matrix format.
 
virtual void read_petsc_hdf5 (const std::string &filename)
 Read the contents of the matrix from a file in PETSc's HDF5 sparse matrix format.
 
virtual void create_submatrix (SparseMatrix< T > &submatrix, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) const
 This function creates a matrix called "submatrix" which is defined by the row and column indices given in the "rows" and "cols" entries.
 
virtual void create_submatrix_nosort (SparseMatrix< T > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &) const
 Similar to the above function, this function creates a submatrix which is defined by the indices given in the rows and cols vectors.
 
virtual void reinit_submatrix (SparseMatrix< T > &submatrix, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) const
 This function is similar to the one above, but it allows you to reuse the existing sparsity pattern of "submatrix" instead of reallocating it again.
 
void vector_mult (NumericVector< T > &dest, const NumericVector< T > &arg) const
 Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest.
 
void vector_mult_add (NumericVector< T > &dest, const NumericVector< T > &arg) const
 Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest.
 
virtual void get_diagonal (NumericVector< T > &dest) const =0
 Copies the diagonal part of the matrix into dest.
 
virtual void get_transpose (SparseMatrix< T > &dest) const =0
 Copies the transpose of the matrix into dest, which may be *this.
 
virtual void get_row (numeric_index_type i, std::vector< numeric_index_type > &indices, std::vector< T > &values) const =0
 Get a row from the matrix.
 
virtual void scale (const T scale)
 Scales all elements of this matrix by scale.
 
virtual bool supports_hash_table () const
 
void use_hash_table (bool use_hash)
 Sets whether to use hash table assembly.
 
bool use_hash_table () const
 
virtual void restore_original_nonzero_pattern ()
 Reset the memory storage of the matrix.
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
void attach_dof_map (const DofMap &dof_map)
 Set a pointer to the DofMap to use.
 
void attach_sparsity_pattern (const SparsityPattern::Build &sp)
 Set a pointer to a sparsity pattern to use.
 
virtual bool need_full_sparsity_pattern () const
 
virtual void update_sparsity_pattern (const SparsityPattern::Graph &)
 Updates the matrix sparsity pattern.
 
virtual void zero_rows (std::vector< numeric_index_type > &rows, Number diag_value=0.0)
 Sets all row entries to 0 then puts diag_value in the diagonal entry.
 
virtual void flush ()
 For PETSc matrix , this function is similar to close but without shrinking memory.
 
virtual numeric_index_type local_m () const
 Get the number of rows owned by this process.
 
virtual numeric_index_type local_n () const
 Get the number of columns owned by this process.
 
virtual void add_block_matrix (const DenseMatrix< Number > &dm, const std::vector< numeric_index_type > &brows, const std::vector< numeric_index_type > &bcols)
 Add the full matrix dm to the SparseMatrix.
 
virtual void add_block_matrix (const DenseMatrix< Number > &dm, const std::vector< numeric_index_type > &dof_indices)
 Same as add_block_matrix(), but assumes the row and column maps are the same.
 
virtual void matrix_matrix_mult (SparseMatrix< Number > &, SparseMatrix< Number > &, bool)
 Compute Y = A*X for matrix X.
 
virtual void add_sparse_matrix (const SparseMatrix< Number > &, const std::map< numeric_index_type, numeric_index_type > &, const std::map< numeric_index_type, numeric_index_type > &, const Number)
 Add scalar* spm to the rows and cols of this matrix (A): A(rows[i], cols[j]) += scalar * spm(i,j)
 
Real l1_norm_diff (const SparseMatrix< Number > &other_mat) const
 
virtual std::size_t n_nonzeros () const
 
void print (std::ostream &os=libMesh::out, const bool sparse=false) const
 Print the contents of the matrix to the screen in a uniform style, regardless of matrix/solver package being used.
 
void print (const std::string &filename) const
 Print the contents of the matrix to a file, with a file format depending on the extension of filename.
 
virtual void print_coreform_hdf5 (const std::string &filename, const std::string &groupname="extraction") const
 Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm, putting CSR sparse matrix data in the group given by groupname.
 
virtual void print_matlab (const std::string &="") const
 Print the contents of the matrix in Matlab's sparse matrix format.
 
virtual void print_petsc_binary (const std::string &filename) const
 Write the contents of the matrix to a file in PETSc's binary sparse matrix format.
 
virtual void print_petsc_hdf5 (const std::string &filename) const
 Write the contents of the matrix to a file in PETSc's HDF5 sparse matrix format.
 
virtual void read (const std::string &filename)
 Read the contents of the matrix from a file, with the file format inferred from the extension of filename.
 
virtual void read_coreform_hdf5 (const std::string &filename, const std::string &groupname="extraction")
 Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm, expecing sparse matrix data in the group given by groupname.
 
virtual void read_matlab (const std::string &filename)
 Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc.
 
virtual void read_petsc_binary (const std::string &filename)
 Read the contents of the matrix from a file in PETSc's binary sparse matrix format.
 
virtual void read_petsc_hdf5 (const std::string &filename)
 Read the contents of the matrix from a file in PETSc's HDF5 sparse matrix format.
 
virtual void create_submatrix (SparseMatrix< Number > &submatrix, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) const
 This function creates a matrix called "submatrix" which is defined by the row and column indices given in the "rows" and "cols" entries.
 
virtual void create_submatrix_nosort (SparseMatrix< Number > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &) const
 Similar to the above function, this function creates a submatrix which is defined by the indices given in the rows and cols vectors.
 
virtual void reinit_submatrix (SparseMatrix< Number > &submatrix, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) const
 This function is similar to the one above, but it allows you to reuse the existing sparsity pattern of "submatrix" instead of reallocating it again.
 
void vector_mult (NumericVector< Number > &dest, const NumericVector< Number > &arg) const
 Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest.
 
void vector_mult_add (NumericVector< Number > &dest, const NumericVector< Number > &arg) const
 Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest.
 
virtual void scale (const Number scale)
 Scales all elements of this matrix by scale.
 
virtual bool supports_hash_table () const
 
void use_hash_table (bool use_hash)
 Sets whether to use hash table assembly.
 
bool use_hash_table () const
 
virtual void restore_original_nonzero_pattern ()
 Reset the memory storage of the matrix.
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static PetscMatrixBase< T > * get_context (Mat mat, const TIMPI::Communicator &comm)
 
static std::unique_ptr< SparseMatrix< T > > build (const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
 Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
 
static std::string get_info ()
 Gets a string containing the reference information.
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out.
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects.
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info().
 
static void disable_print_counter_info ()
 
static std::unique_ptr< SparseMatrix< Number > > build (const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
 Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
 
static std::string get_info ()
 Gets a string containing the reference information.
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out.
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects.
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info().
 
static void disable_print_counter_info ()
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information.
 
typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information.
 

Protected Member Functions

virtual void _get_submatrix (SparseMatrix< T > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &, const bool) const
 Protected implementation of the create_submatrix and reinit_submatrix routines.
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter.
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter.
 
virtual void _get_submatrix (SparseMatrix< Number > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &, const bool) const
 Protected implementation of the create_submatrix and reinit_submatrix routines.
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter.
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter.
 

Protected Attributes

Mat _mat
 PETSc matrix datatype to store values.
 
bool _destroy_mat_on_exit
 This boolean value should only be set to false for the constructor which takes a PETSc Mat object.
 
DofMap const * _dof_map
 The DofMap object associated with this object.
 
SparsityPattern::Build const * _sp
 The sparsity pattern associated with this object.
 
bool _is_initialized
 Flag indicating whether or not the matrix has been initialized.
 
bool _use_hash_table
 Flag indicating whether the matrix is assembled using a hash table.
 
const Parallel::Communicator_communicator
 
DofMap const * _dof_map
 The DofMap object associated with this object.
 
SparsityPattern::Build const * _sp
 The sparsity pattern associated with this object.
 
bool _is_initialized
 Flag indicating whether or not the matrix has been initialized.
 
bool _use_hash_table
 Flag indicating whether the matrix is assembled using a hash table.
 
const Parallel::Communicator_communicator
 

Static Protected Attributes

static Counts _counts
 Actually holds the data.
 
static Threads::atomic< unsigned int_n_objects
 The number of objects.
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting.
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called.
 
static Counts _counts
 Actually holds the data.
 
static Threads::atomic< unsigned int_n_objects
 The number of objects.
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting.
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called.
 

Private Member Functions

void forward_elimination (const NumericVector< Number > &full_rhs)
 Takes an incoming "full" RHS from the solver, where full means the union of uncondensed and condennsed dofs, and condenses it down into the condensed _reduced_rhs data member using element Schur complements.
 
void backwards_substitution (const NumericVector< Number > &full_rhs, NumericVector< Number > &full_sol)
 After performing the solve with the _reduced_rhs and Schur complement matrix (_reduced_sys_mat) to determine the _reduced_sol, we use the uncondensed full_rhs along with the _reduced_sol to back substitute into the full_sol, which is the final output data of the static condensation preconditioner application.
 

Static Private Member Functions

static void set_local_vectors (const NumericVector< Number > &global_vector, const std::vector< dof_id_type > &elem_dof_indices, std::vector< Number > &elem_dof_values_vec, EigenVector &elem_dof_values)
 Retrieves the degree of freedom values from global_vector corresponding to elem_dof_indices, filling both elem_dof_values_vec and elem_dof_values.
 

Private Attributes

std::unordered_map< dof_id_type, MatrixData_elem_to_matrix_data
 A map from element ID to Schur complement data.
 
const MeshBase_mesh
 
System_system
 
const DofMap_full_dof_map
 
StaticCondensationDofMap_reduced_dof_map
 
std::unique_ptr< SparseMatrix< Number > > _reduced_sys_mat
 global sparse matrix for the uncondensed degrees of freedom
 
std::unique_ptr< NumericVector< Number > > _reduced_sol
 solution for the uncondensed degrees of freedom
 
std::unique_ptr< NumericVector< Number > > _reduced_rhs
 RHS corresponding to the uncondensed degrees of freedom.
 
std::unique_ptr< LinearSolver< Number > > _reduced_solver
 The solver for the uncondensed degrees of freedom.
 
std::unique_ptr< NumericVector< Number > > _ghosted_full_sol
 This is a ghosted representation of the full (uncondensed + condensed) solution. Note that.
 
dof_id_type _current_elem_id
 The current element ID.
 
DenseMatrix< Number_size_one_mat
 Helper data member for adding individual matrix elements.
 
std::unique_ptr< StaticCondensationPreconditioner_scp
 Preconditioner object which will call back to us for the preconditioning action.
 
bool _sc_is_initialized
 Whether our object has been initialized.
 
bool _have_cached_values
 Whether we have cached values via add_XXX()
 
ParallelType _parallel_type
 The parallel type to use for the reduced matrix.
 
bool _uncondensed_dofs_only
 whether this matrix represents uncondensed dofs only.
 
const bool _omit_constrained_dofs
 Whether to omit constrained degrees of freedom.
 

Detailed Description

Definition at line 66 of file static_condensation.h.

Member Typedef Documentation

◆ Counts [1/2]

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

◆ Counts [2/2]

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

Constructor & Destructor Documentation

◆ StaticCondensation() [1/2]

libMesh::StaticCondensation::StaticCondensation ( const MeshBase mesh,
System system,
const DofMap full_dof_map,
StaticCondensationDofMap reduced_dof_map 
)

Definition at line 39 of file static_condensation.C.

43 : PetscMatrixShellMatrix<Number>(full_dof_map.comm()),
44 _mesh(mesh),
45 _system(system),
46 _full_dof_map(full_dof_map),
47 _reduced_dof_map(reduced_dof_map),
49 _sc_is_initialized(false),
53{
55 _scp = std::make_unique<StaticCondensationPreconditioner>(*this);
56}
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition dof_object.h:473
DenseMatrix< Number > _size_one_mat
Helper data member for adding individual matrix elements.
dof_id_type _current_elem_id
The current element ID.
ParallelType _parallel_type
The parallel type to use for the reduced matrix.
StaticCondensationDofMap & _reduced_dof_map
bool _uncondensed_dofs_only
whether this matrix represents uncondensed dofs only.
bool _have_cached_values
Whether we have cached values via add_XXX()
std::unique_ptr< StaticCondensationPreconditioner > _scp
Preconditioner object which will call back to us for the preconditioning action.
bool _sc_is_initialized
Whether our object has been initialized.
MeshBase & mesh
template class LIBMESH_EXPORT PetscMatrixShellMatrix< Number >

References _scp, _size_one_mat, and libMesh::DenseMatrix< T >::resize().

◆ ~StaticCondensation()

libMesh::StaticCondensation::~StaticCondensation ( )
virtualdefault

◆ StaticCondensation() [2/2]

libMesh::StaticCondensation::StaticCondensation ( const MeshBase ,
const System ,
const DofMap full_dof_map,
StaticCondensationDofMap reduced_dof_map 
)

Definition at line 489 of file static_condensation.C.

493 : SparseMatrix<Number>(full_dof_map.comm())
494{
495 libmesh_error_msg(
496 "Static condensation requires configuring libMesh with PETSc and Eigen support");
497}
template class LIBMESH_EXPORT SparseMatrix< Number >

Member Function Documentation

◆ _get_submatrix() [1/2]

virtual void libMesh::SparseMatrix< Number >::_get_submatrix ( SparseMatrix< Number > &  ,
const std::vector< numeric_index_type > &  ,
const std::vector< numeric_index_type > &  ,
const bool   
) const
inlineprotectedvirtualinherited

Protected implementation of the create_submatrix and reinit_submatrix routines.

Note
This function must be overridden in derived classes for it to work properly!

Definition at line 654 of file sparse_matrix.h.

658 {
659 libmesh_not_implemented();
660 }

◆ _get_submatrix() [2/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::_get_submatrix ( SparseMatrix< T > &  ,
const std::vector< numeric_index_type > &  ,
const std::vector< numeric_index_type > &  ,
const bool   
) const
inlineprotectedvirtualinherited

Protected implementation of the create_submatrix and reinit_submatrix routines.

Note
This function must be overridden in derived classes for it to work properly!

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 654 of file sparse_matrix.h.

658 {
659 libmesh_not_implemented();
660 }

Referenced by libMesh::SparseMatrix< T >::create_submatrix(), and libMesh::SparseMatrix< T >::reinit_submatrix().

◆ add() [1/6]

void libMesh::StaticCondensation::add ( const Number  a,
const SparseMatrix< Number > &  X 
)
overridevirtual

Compute \( A \leftarrow A + a*X \) for scalar a, matrix X.

Implements libMesh::SparseMatrix< Number >.

Definition at line 345 of file static_condensation.C.

346{
347 libmesh_not_implemented();
348}

◆ add() [2/6]

virtual void libMesh::StaticCondensation::add ( const Number  a,
const SparseMatrix< Number > &  X 
)
inlineoverridevirtual

Compute \( A \leftarrow A + a*X \) for scalar a, matrix X.

Implements libMesh::SparseMatrix< Number >.

Definition at line 385 of file static_condensation.h.

386 {
387 libmesh_not_implemented();
388 }

◆ add() [3/6]

void libMesh::StaticCondensation::add ( const numeric_index_type  i,
const numeric_index_type  j,
const Number  value 
)
overridevirtual

Add value to the element (i,j).

Throws an error if the entry does not exist. Zero values can be "added" to non-existent entries.

Implements libMesh::SparseMatrix< Number >.

Definition at line 270 of file static_condensation.C.

273{
274 _size_one_mat(0, 0) = value;
275 this->add_matrix(_size_one_mat, {i}, {j});
276}
virtual void add_matrix(const DenseMatrix< Number > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) override
Add the full matrix dm to the SparseMatrix.
static const bool value
Definition xdr_io.C:55

References _size_one_mat, add_matrix(), and value.

◆ add() [4/6]

template<typename T >
virtual void libMesh::SparseMatrix< T >::add ( const numeric_index_type  i,
const numeric_index_type  j,
const T  value 
)
pure virtualinherited

◆ add() [5/6]

virtual void libMesh::StaticCondensation::add ( const numeric_index_type  i,
const numeric_index_type  j,
const Number  value 
)
inlineoverridevirtual

Add value to the element (i,j).

Throws an error if the entry does not exist. Zero values can be "added" to non-existent entries.

Implements libMesh::SparseMatrix< Number >.

Definition at line 370 of file static_condensation.h.

371 {
372 libmesh_not_implemented();
373 }

◆ add() [6/6]

template<typename T >
virtual void libMesh::SparseMatrix< T >::add ( const T  a,
const SparseMatrix< T > &  X 
)
pure virtualinherited

◆ add_block_matrix() [1/4]

void libMesh::SparseMatrix< Number >::add_block_matrix ( const DenseMatrix< Number > &  dm,
const std::vector< numeric_index_type > &  brows,
const std::vector< numeric_index_type > &  bcols 
)
virtualinherited

Add the full matrix dm to the SparseMatrix.

This is useful for adding an element matrix at assembly time. The matrix is assumed blocked, and brow, bcol correspond to the block row and column indices.

Definition at line 329 of file sparse_matrix.C.

122{
123 libmesh_assert_equal_to (dm.m() / brows.size(), dm.n() / bcols.size());
124
125 const numeric_index_type blocksize = cast_int<numeric_index_type>
126 (dm.m() / brows.size());
127
128 libmesh_assert_equal_to (dm.m()%blocksize, 0);
129 libmesh_assert_equal_to (dm.n()%blocksize, 0);
130
131 std::vector<numeric_index_type> rows, cols;
132
133 rows.reserve(blocksize*brows.size());
134 cols.reserve(blocksize*bcols.size());
135
136 for (auto & row : brows)
137 {
138 numeric_index_type i = row * blocksize;
139
140 for (unsigned int v=0; v<blocksize; v++)
141 rows.push_back(i++);
142 }
143
144 for (auto & col : bcols)
145 {
146 numeric_index_type j = col * blocksize;
147
148 for (unsigned int v=0; v<blocksize; v++)
149 cols.push_back(j++);
150 }
151
152 this->add_matrix (dm, rows, cols);
153}
virtual void add_matrix(const DenseMatrix< Number > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
dof_id_type numeric_index_type
Definition id_types.h:99

◆ add_block_matrix() [2/4]

virtual void libMesh::SparseMatrix< Number >::add_block_matrix ( const DenseMatrix< Number > &  dm,
const std::vector< numeric_index_type > &  dof_indices 
)
inlinevirtualinherited

Same as add_block_matrix(), but assumes the row and column maps are the same.

Thus the matrix dm must be square.

Definition at line 337 of file sparse_matrix.h.

339 { this->add_block_matrix (dm, dof_indices, dof_indices); }
virtual void add_block_matrix(const DenseMatrix< Number > &dm, const std::vector< numeric_index_type > &brows, const std::vector< numeric_index_type > &bcols)
Add the full matrix dm to the SparseMatrix.

◆ add_block_matrix() [3/4]

template<typename T >
void libMesh::SparseMatrix< T >::add_block_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  brows,
const std::vector< numeric_index_type > &  bcols 
)
virtualinherited

Add the full matrix dm to the SparseMatrix.

This is useful for adding an element matrix at assembly time. The matrix is assumed blocked, and brow, bcol correspond to the block row and column indices.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 119 of file sparse_matrix.C.

122{
123 libmesh_assert_equal_to (dm.m() / brows.size(), dm.n() / bcols.size());
124
125 const numeric_index_type blocksize = cast_int<numeric_index_type>
126 (dm.m() / brows.size());
127
128 libmesh_assert_equal_to (dm.m()%blocksize, 0);
129 libmesh_assert_equal_to (dm.n()%blocksize, 0);
130
131 std::vector<numeric_index_type> rows, cols;
132
133 rows.reserve(blocksize*brows.size());
134 cols.reserve(blocksize*bcols.size());
135
136 for (auto & row : brows)
137 {
138 numeric_index_type i = row * blocksize;
139
140 for (unsigned int v=0; v<blocksize; v++)
141 rows.push_back(i++);
142 }
143
144 for (auto & col : bcols)
145 {
146 numeric_index_type j = col * blocksize;
147
148 for (unsigned int v=0; v<blocksize; v++)
149 cols.push_back(j++);
150 }
151
152 this->add_matrix (dm, rows, cols);
153}

Referenced by libMesh::SparseMatrix< T >::add_block_matrix().

◆ add_block_matrix() [4/4]

template<typename T >
virtual void libMesh::SparseMatrix< T >::add_block_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  dof_indices 
)
inlinevirtualinherited

Same as add_block_matrix(), but assumes the row and column maps are the same.

Thus the matrix dm must be square.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 337 of file sparse_matrix.h.

339 { this->add_block_matrix (dm, dof_indices, dof_indices); }

References libMesh::SparseMatrix< T >::add_block_matrix().

◆ add_matrix() [1/6]

virtual void libMesh::StaticCondensation::add_matrix ( const DenseMatrix< Number > &  dm,
const std::vector< numeric_index_type > &  dof_indices 
)
inlineoverridevirtual

Same as add_matrix, but assumes the row and column maps are the same.

Thus the matrix dm must be square.

Implements libMesh::SparseMatrix< Number >.

Definition at line 380 of file static_condensation.h.

382 {
383 libmesh_not_implemented();
384 }

◆ add_matrix() [2/6]

virtual void libMesh::StaticCondensation::add_matrix ( const DenseMatrix< Number > &  dm,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
)
inlineoverridevirtual

Add the full matrix dm to the SparseMatrix.

This is useful for adding an element matrix at assembly time.

Implements libMesh::SparseMatrix< Number >.

Definition at line 374 of file static_condensation.h.

377 {
378 libmesh_not_implemented();
379 }

◆ add_matrix() [3/6]

void libMesh::StaticCondensation::add_matrix ( const DenseMatrix< Number > &  dm,
const std::vector< numeric_index_type > &  dof_indices 
)
overridevirtual

Same as add_matrix, but assumes the row and column maps are the same.

Thus the matrix dm must be square.

Implements libMesh::SparseMatrix< Number >.

Definition at line 339 of file static_condensation.C.

341{
342 this->add_matrix(dm, dof_indices, dof_indices);
343}

References add_matrix().

◆ add_matrix() [4/6]

void libMesh::StaticCondensation::add_matrix ( const DenseMatrix< Number > &  dm,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
)
overridevirtual

Add the full matrix dm to the SparseMatrix.

This is useful for adding an element matrix at assembly time.

Implements libMesh::SparseMatrix< Number >.

Definition at line 278 of file static_condensation.C.

281{
282 if (rows.empty() || cols.empty())
283 return;
284
286 auto & matrix_data = libmesh_map_find(_elem_to_matrix_data, _current_elem_id);
287 const auto & dof_data = libmesh_map_find(_reduced_dof_map._elem_to_dof_data, _current_elem_id);
289
290 auto info_from_index = [&dof_data](const auto global_index) {
291 auto index_it = dof_data.condensed_global_to_local_map.find(global_index);
292 const bool index_is_condensed = index_it != dof_data.condensed_global_to_local_map.end();
293 if (!index_is_condensed)
294 {
295 index_it = dof_data.uncondensed_global_to_local_map.find(global_index);
296 if (index_it == dof_data.uncondensed_global_to_local_map.end())
297 libmesh_error_msg("Failed to find the global index "
298 << global_index
299 << " in our current element's degree of freedom information. One way "
300 "this can happen is when using a discontinuous Galerkin method, "
301 "adding element matrices to both + and - sides of a face");
302 }
303 else
304 // We found the dof in the condensed container. Let's assert that it's not also in the
305 // uncondensed container
306 libmesh_assert(dof_data.uncondensed_global_to_local_map.find(global_index) ==
307 dof_data.uncondensed_global_to_local_map.end());
308
309 return std::make_pair(index_is_condensed, index_it->second);
310 };
311
312 for (const auto i : make_range(dm.m()))
313 for (const auto j : make_range(dm.n()))
314 {
315 const auto global_i = rows[i];
316 const auto global_j = cols[j];
317 const auto [i_is_condensed, local_i] = info_from_index(global_i);
318 const auto [j_is_condensed, local_j] = info_from_index(global_j);
319 if (i_is_condensed)
320 {
321 if (j_is_condensed)
322 mat = &matrix_data.Acc;
323 else
324 mat = &matrix_data.Acu;
325 }
326 else
327 {
328 if (j_is_condensed)
329 mat = &matrix_data.Auc;
330 else
331 mat = &matrix_data.Auu;
332 }
333 (*mat)(local_i, local_j) += dm(i, j);
334 }
335
336 _have_cached_values = true;
337}
std::unordered_map< dof_id_type, DofData > _elem_to_dof_data
A map from element ID to Schur complement data.
virtual numeric_index_type n() const override
virtual numeric_index_type m() const override
std::unordered_map< dof_id_type, MatrixData > _elem_to_matrix_data
A map from element ID to Schur complement data.
libmesh_assert(ctx)
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
MatrixXcd EigenMatrix

References _current_elem_id, libMesh::StaticCondensationDofMap::_elem_to_dof_data, _elem_to_matrix_data, _have_cached_values, _reduced_dof_map, libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), libMesh::DenseMatrixBase< T >::m(), libMesh::make_range(), libMesh::PetscMatrixBase< T >::mat(), and libMesh::DenseMatrixBase< T >::n().

Referenced by add(), and add_matrix().

◆ add_matrix() [5/6]

template<typename T >
virtual void libMesh::SparseMatrix< T >::add_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  dof_indices 
)
pure virtualinherited

◆ add_matrix() [6/6]

template<typename T >
virtual void libMesh::SparseMatrix< T >::add_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
)
pure virtualinherited

◆ add_sparse_matrix() [1/2]

virtual void libMesh::SparseMatrix< Number >::add_sparse_matrix ( const SparseMatrix< Number > &  ,
const std::map< numeric_index_type, numeric_index_type > &  ,
const std::map< numeric_index_type, numeric_index_type > &  ,
const Number   
)
inlinevirtualinherited

Add scalar* spm to the rows and cols of this matrix (A): A(rows[i], cols[j]) += scalar * spm(i,j)

Definition at line 356 of file sparse_matrix.h.

360 { libmesh_not_implemented(); }

◆ add_sparse_matrix() [2/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::add_sparse_matrix ( const SparseMatrix< T > &  ,
const std::map< numeric_index_type, numeric_index_type > &  ,
const std::map< numeric_index_type, numeric_index_type > &  ,
const T   
)
inlinevirtualinherited

Add scalar* spm to the rows and cols of this matrix (A): A(rows[i], cols[j]) += scalar * spm(i,j)

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 356 of file sparse_matrix.h.

360 { libmesh_not_implemented(); }

◆ apply() [1/2]

void libMesh::StaticCondensation::apply ( const NumericVector< Number > &  ,
NumericVector< Number > &   
)
inline

Definition at line 410 of file static_condensation.h.

410{ libmesh_not_implemented(); }

◆ apply() [2/2]

void libMesh::StaticCondensation::apply ( const NumericVector< Number > &  full_rhs,
NumericVector< Number > &  full_sol 
)

Perform our three stages, forward_elimination(), a solve() on the condensed system, and finally a backwards_substitution()

Definition at line 457 of file static_condensation.C.

459{
460 forward_elimination(full_rhs);
461 // Apparently PETSc will send us the yvec without zeroing it ahead of time. This can be a poor
462 // initial guess for the Krylov solve as well as lead to bewildered users who expect their initial
463 // residual norm to equal the norm of the RHS
464 full_parallel_sol.zero();
465 _reduced_sol = full_parallel_sol.get_subvector(_reduced_dof_map._local_uncondensed_dofs);
467 // Must restore to the full solution because during backwards substitution we will need to be able
468 // to read ghosted dofs and we don't support ghosting of subvectors
469 full_parallel_sol.restore_subvector(std::move(_reduced_sol),
471 *_ghosted_full_sol = full_parallel_sol;
472 backwards_substitution(full_rhs, full_parallel_sol);
473}
std::vector< dof_id_type > _local_uncondensed_dofs
All the uncondensed degrees of freedom (numbered in the "full" uncondensed + condensed space).
void backwards_substitution(const NumericVector< Number > &full_rhs, NumericVector< Number > &full_sol)
After performing the solve with the _reduced_rhs and Schur complement matrix (_reduced_sys_mat) to de...
std::unique_ptr< LinearSolver< Number > > _reduced_solver
The solver for the uncondensed degrees of freedom.
std::unique_ptr< NumericVector< Number > > _ghosted_full_sol
This is a ghosted representation of the full (uncondensed + condensed) solution. Note that.
std::unique_ptr< NumericVector< Number > > _reduced_rhs
RHS corresponding to the uncondensed degrees of freedom.
std::unique_ptr< SparseMatrix< Number > > _reduced_sys_mat
global sparse matrix for the uncondensed degrees of freedom
std::unique_ptr< NumericVector< Number > > _reduced_sol
solution for the uncondensed degrees of freedom
void forward_elimination(const NumericVector< Number > &full_rhs)
Takes an incoming "full" RHS from the solver, where full means the union of uncondensed and condennse...

References _ghosted_full_sol, libMesh::StaticCondensationDofMap::_local_uncondensed_dofs, _reduced_dof_map, _reduced_rhs, _reduced_sol, _reduced_solver, _reduced_sys_mat, backwards_substitution(), forward_elimination(), libMesh::NumericVector< T >::get_subvector(), libMesh::NumericVector< T >::restore_subvector(), and libMesh::NumericVector< T >::zero().

Referenced by libMesh::StaticCondensationPreconditioner::apply().

◆ attach_dof_map() [1/2]

template<typename T >
void libMesh::SparseMatrix< T >::attach_dof_map ( const DofMap dof_map)
inherited

Set a pointer to the DofMap to use.

If a separate sparsity pattern is not being used, use the one from the DofMap.

The lifetime of dof_map must exceed the lifetime of this.

Definition at line 100 of file sparse_matrix.C.

101{
102 _dof_map = &dof_map;
103 if (!_sp)
104 _sp = dof_map.get_sparsity_pattern();
105}
DofMap const * _dof_map
The DofMap object associated with this object.
SparsityPattern::Build const * _sp
The sparsity pattern associated with this object.
const SparsityPattern::Graph & get_sparsity_pattern() const
Rows of sparse matrix indices, indexed by the offset from the first DoF on this processor.

References libMesh::DofMap::get_sparsity_pattern().

Referenced by libMesh::Problem_Interface::computeJacobian(), DMlibMeshJacobian(), and libMesh::DofMap::update_sparsity_pattern().

◆ attach_dof_map() [2/2]

void libMesh::SparseMatrix< Number >::attach_dof_map ( const DofMap dof_map)
inherited

Set a pointer to the DofMap to use.

If a separate sparsity pattern is not being used, use the one from the DofMap.

The lifetime of dof_map must exceed the lifetime of this.

Definition at line 141 of file sparse_matrix.C.

101{
102 _dof_map = &dof_map;
103 if (!_sp)
104 _sp = dof_map.get_sparsity_pattern();
105}

◆ attach_sparsity_pattern() [1/2]

void libMesh::SparseMatrix< Number >::attach_sparsity_pattern ( const SparsityPattern::Build sp)
inherited

Set a pointer to a sparsity pattern to use.

Useful in cases where a matrix requires a wider (or for efficiency narrower) pattern than most matrices in the system, or in cases where no system sparsity pattern is being calculated by the DofMap.

The lifetime of sp must exceed the lifetime of this.

Definition at line 151 of file sparse_matrix.C.

111{
112 _sp = &sp;
113}

◆ attach_sparsity_pattern() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::attach_sparsity_pattern ( const SparsityPattern::Build sp)
inherited

Set a pointer to a sparsity pattern to use.

Useful in cases where a matrix requires a wider (or for efficiency narrower) pattern than most matrices in the system, or in cases where no system sparsity pattern is being calculated by the DofMap.

The lifetime of sp must exceed the lifetime of this.

Definition at line 110 of file sparse_matrix.C.

111{
112 _sp = &sp;
113}

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

◆ backwards_substitution()

void libMesh::StaticCondensation::backwards_substitution ( const NumericVector< Number > &  full_rhs,
NumericVector< Number > &  full_sol 
)
private

After performing the solve with the _reduced_rhs and Schur complement matrix (_reduced_sys_mat) to determine the _reduced_sol, we use the uncondensed full_rhs along with the _reduced_sol to back substitute into the full_sol, which is the final output data of the static condensation preconditioner application.

Definition at line 419 of file static_condensation.C.

421{
422 std::vector<dof_id_type> elem_condensed_dofs, elem_uncondensed_dofs;
423 std::vector<Number> elem_condensed_rhs_vec, elem_uncondensed_sol_vec;
424 EigenVector elem_condensed_rhs, elem_uncondensed_sol, elem_condensed_sol;
425
426 for (auto elem : _mesh.active_local_element_ptr_range())
427 {
428 auto & matrix_data = libmesh_map_find(_elem_to_matrix_data, elem->id());
429 const auto & dof_data = libmesh_map_find(_reduced_dof_map._elem_to_dof_data, elem->id());
430 elem_condensed_dofs.resize(dof_data.condensed_global_to_local_map.size());
431 elem_uncondensed_dofs.resize(dof_data.uncondensed_global_to_local_map.size());
432 for (const auto & [global_dof, local_dof] : dof_data.condensed_global_to_local_map)
433 {
434 libmesh_assert(local_dof < elem_condensed_dofs.size());
435 elem_condensed_dofs[local_dof] = global_dof;
436 }
437 for (const auto & [global_dof, local_dof] : dof_data.uncondensed_global_to_local_map)
438 {
439 libmesh_assert(local_dof < elem_uncondensed_dofs.size());
440 elem_uncondensed_dofs[local_dof] = global_dof;
441 }
442
443 set_local_vectors(full_rhs, elem_condensed_dofs, elem_condensed_rhs_vec, elem_condensed_rhs);
445 elem_uncondensed_dofs,
446 elem_uncondensed_sol_vec,
447 elem_uncondensed_sol);
448
449 elem_condensed_sol =
450 matrix_data.AccFactor.solve(elem_condensed_rhs - matrix_data.Acu * elem_uncondensed_sol);
451 full_sol.insert(elem_condensed_sol.data(), elem_condensed_dofs);
452 }
453
454 full_sol.close();
455}
virtual void close()=0
Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across ...
virtual void insert(const T *v, const std::vector< numeric_index_type > &dof_indices)
Inserts the entries of v in *this at the locations specified by v.
static void set_local_vectors(const NumericVector< Number > &global_vector, const std::vector< dof_id_type > &elem_dof_indices, std::vector< Number > &elem_dof_values_vec, EigenVector &elem_dof_values)
Retrieves the degree of freedom values from global_vector corresponding to elem_dof_indices,...
VectorXcd EigenVector

References libMesh::StaticCondensationDofMap::_elem_to_dof_data, _elem_to_matrix_data, _ghosted_full_sol, _mesh, _reduced_dof_map, libMesh::NumericVector< T >::close(), libMesh::NumericVector< T >::insert(), libMesh::libmesh_assert(), and set_local_vectors().

Referenced by apply().

◆ build() [1/2]

template<typename T >
std::unique_ptr< SparseMatrix< T > > libMesh::SparseMatrix< T >::build ( const Parallel::Communicator comm,
const SolverPackage  solver_package = libMesh::default_solver_package(),
const MatrixBuildType  matrix_build_type = MatrixBuildType::AUTOMATIC 
)
staticinherited

Builds a SparseMatrix<T> using the linear solver package specified by solver_package.

Definition at line 193 of file sparse_matrix.C.

196{
197 // Avoid unused parameter warnings when no solver packages are enabled.
199
200 if (matrix_build_type == MatrixBuildType::DIAGONAL)
201 return std::make_unique<DiagonalMatrix<T>>(comm);
202
203 // Build the appropriate vector
204 switch (solver_package)
205 {
206
207#ifdef LIBMESH_HAVE_LASPACK
208 case LASPACK_SOLVERS:
209 return std::make_unique<LaspackMatrix<T>>(comm);
210#endif
211
212
213#ifdef LIBMESH_HAVE_PETSC
214 case PETSC_SOLVERS:
215 return std::make_unique<PetscMatrix<T>>(comm);
216#endif
217
218
219#ifdef LIBMESH_TRILINOS_HAVE_EPETRA
220 case TRILINOS_SOLVERS:
221 return std::make_unique<EpetraMatrix<T>>(comm);
222#endif
223
224
225#ifdef LIBMESH_HAVE_EIGEN
226 case EIGEN_SOLVERS:
227 return std::make_unique<EigenSparseMatrix<T>>(comm);
228#endif
229
230 default:
231 libmesh_error_msg("ERROR: Unrecognized solver package: " << solver_package);
232 }
233}
const Parallel::Communicator & comm() const
virtual SolverPackage solver_package()=0
void libmesh_ignore(const Args &...)

References libMesh::DIAGONAL, libMesh::EIGEN_SOLVERS, libMesh::LASPACK_SOLVERS, libMesh::libmesh_ignore(), libMesh::PETSC_SOLVERS, and libMesh::TRILINOS_SOLVERS.

Referenced by libMesh::CondensedEigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::CondensedEigenSystem::copy_super_to_sub(), init(), main(), libMesh::DofMap::process_mesh_constraint_rows(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), and SystemsTest::testProjectMatrix3D().

◆ build() [2/2]

std::unique_ptr< SparseMatrix< Number > > libMesh::SparseMatrix< Number >::build ( const Parallel::Communicator comm,
const SolverPackage  solver_package = libMesh::default_solver_package(),
const MatrixBuildType  matrix_build_type = MatrixBuildType::AUTOMATIC 
)
staticinherited

Builds a SparseMatrix<T> using the linear solver package specified by solver_package.

Definition at line 123 of file sparse_matrix.C.

196{
197 // Avoid unused parameter warnings when no solver packages are enabled.
198 libmesh_ignore(comm);
199
200 if (matrix_build_type == MatrixBuildType::DIAGONAL)
201 return std::make_unique<DiagonalMatrix<T>>(comm);
202
203 // Build the appropriate vector
204 switch (solver_package)
205 {
206
207#ifdef LIBMESH_HAVE_LASPACK
208 case LASPACK_SOLVERS:
209 return std::make_unique<LaspackMatrix<T>>(comm);
210#endif
211
212
213#ifdef LIBMESH_HAVE_PETSC
214 case PETSC_SOLVERS:
215 return std::make_unique<PetscMatrix<T>>(comm);
216#endif
217
218
219#ifdef LIBMESH_TRILINOS_HAVE_EPETRA
220 case TRILINOS_SOLVERS:
221 return std::make_unique<EpetraMatrix<T>>(comm);
222#endif
223
224
225#ifdef LIBMESH_HAVE_EIGEN
226 case EIGEN_SOLVERS:
227 return std::make_unique<EigenSparseMatrix<T>>(comm);
228#endif
229
230 default:
231 libmesh_error_msg("ERROR: Unrecognized solver package: " << solver_package);
232 }
233}

◆ clear() [1/2]

void libMesh::StaticCondensation::clear ( )
overridevirtualnoexcept

clear() is called from the destructor, so it should not throw.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 75 of file static_condensation.C.

76{
78
80 _reduced_sys_mat.reset();
81 _reduced_sol.reset();
82 _reduced_rhs.reset();
83 _reduced_solver.reset();
85 _have_cached_values = false;
86 _sc_is_initialized = false;
87}
virtual void clear() noexcept override
clear() is called from the destructor, so it should not throw.

References _current_elem_id, _elem_to_matrix_data, _have_cached_values, _reduced_rhs, _reduced_sol, _reduced_solver, _reduced_sys_mat, _sc_is_initialized, libMesh::PetscMatrixBase< T >::clear(), and libMesh::DofObject::invalid_id.

Referenced by libMesh::StaticCondensationPreconditioner::clear().

◆ clear() [2/2]

virtual void libMesh::StaticCondensation::clear ( )
inlineoverridevirtual

clear() is called from the destructor, so it should not throw.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 349 of file static_condensation.h.

349{ libmesh_not_implemented(); }

◆ clone() [1/2]

std::unique_ptr< SparseMatrix< Number > > libMesh::StaticCondensation::clone ( ) const
overridevirtual
Returns
A smart pointer to a copy of this matrix.
Note
This must be overridden in the derived classes.

Implements libMesh::SparseMatrix< T >.

Definition at line 70 of file static_condensation.C.

71{
72 libmesh_not_implemented();
73}

◆ clone() [2/2]

virtual std::unique_ptr< SparseMatrix< Number > > libMesh::StaticCondensation::clone ( ) const
inlineoverridevirtual
Returns
A smart pointer to a copy of this matrix.
Note
This must be overridden in the derived classes.

Implements libMesh::SparseMatrix< T >.

Definition at line 355 of file static_condensation.h.

356 {
357 libmesh_not_implemented();
358 }

◆ close() [1/2]

void libMesh::StaticCondensation::close ( )
overridevirtual

Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across processors.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 185 of file static_condensation.C.

186{
189 {
190 bool closed = _reduced_sys_mat->closed();
191 // closed is not collective
193 if (!closed)
194 _reduced_sys_mat->close();
195 return;
196 }
197
198 DenseMatrix<Number> shim;
199 std::vector<dof_id_type> reduced_space_indices;
200 for (auto & [elem_id, matrix_data] : _elem_to_matrix_data)
201 {
202 const auto & dof_data = libmesh_map_find(_reduced_dof_map._elem_to_dof_data, elem_id);
203 reduced_space_indices.clear();
204
205 // The result matrix is either a Schur complement or it's simply the result of summing element
206 // matrices of the uncondensed degrees of freedom
207 EigenMatrix result = matrix_data.Auu;
209 {
210 matrix_data.AccFactor = matrix_data.Acc.partialPivLu();
211 result -= matrix_data.Auc * matrix_data.AccFactor.solve(matrix_data.Acu);
212 }
213 shim.resize(result.rows(), result.cols());
214 for (const auto i : make_range(result.rows()))
215 for (const auto j : make_range(result.cols()))
216 shim(i, j) = result(i, j);
217 for (const auto & var_reduced_space_indices : dof_data.reduced_space_indices)
218 reduced_space_indices.insert(reduced_space_indices.end(),
219 var_reduced_space_indices.begin(),
220 var_reduced_space_indices.end());
221 _reduced_sys_mat->add_matrix(shim, reduced_space_indices);
222 }
223
224 _reduced_sys_mat->close();
225
226 _have_cached_values = false;
227}
void max(const T &r, T &o, Request &req) const
void min(const T &r, T &o, Request &req) const
const Parallel::Communicator & _communicator
virtual bool closed() const override

References libMesh::ParallelObject::_communicator, libMesh::StaticCondensationDofMap::_elem_to_dof_data, _elem_to_matrix_data, _have_cached_values, _reduced_dof_map, _reduced_sys_mat, _uncondensed_dofs_only, closed(), libMesh::make_range(), libMesh::Parallel::Communicator::max(), libMesh::Parallel::Communicator::min(), and libMesh::DenseMatrix< T >::resize().

◆ close() [2/2]

virtual void libMesh::StaticCondensation::close ( )
inlineoverridevirtual

Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across processors.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 359 of file static_condensation.h.

359{ libmesh_not_implemented(); }

◆ closed() [1/2]

bool libMesh::StaticCondensation::closed ( ) const
overridevirtual
Returns
true if the matrix has been assembled.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 229 of file static_condensation.C.

230{
231 return _reduced_sys_mat->closed() && !_have_cached_values;
232}

References _have_cached_values, and _reduced_sys_mat.

Referenced by close(), and setup().

◆ closed() [2/2]

virtual bool libMesh::StaticCondensation::closed ( ) const
inlineoverridevirtual
Returns
true if the matrix has been assembled.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 395 of file static_condensation.h.

395{ libmesh_not_implemented(); }

◆ col_start() [1/2]

virtual numeric_index_type libMesh::StaticCondensation::col_start ( ) const
inlineoverridevirtual
Returns
The index of the first matrix column owned by this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 113 of file static_condensation.h.

113{ return this->row_start(); }
virtual numeric_index_type row_start() const override

References row_start().

◆ col_start() [2/2]

virtual numeric_index_type libMesh::StaticCondensation::col_start ( ) const
inlineoverridevirtual
Returns
The index of the first matrix column owned by this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 364 of file static_condensation.h.

364{ libmesh_not_implemented(); }

◆ col_stop() [1/2]

virtual numeric_index_type libMesh::StaticCondensation::col_stop ( ) const
inlineoverridevirtual
Returns
The index of the last matrix column (+1) owned by this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 115 of file static_condensation.h.

115{ return this->row_stop(); }
virtual numeric_index_type row_stop() const override

References row_stop().

◆ col_stop() [2/2]

virtual numeric_index_type libMesh::StaticCondensation::col_stop ( ) const
inlineoverridevirtual
Returns
The index of the last matrix column (+1) owned by this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 365 of file static_condensation.h.

365{ libmesh_not_implemented(); }

◆ comm() [1/2]

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; }

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(), 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(), libMesh::StaticCondensationDofMap::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().

◆ comm() [2/2]

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; }

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(), 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(), libMesh::StaticCondensationDofMap::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().

◆ create_submatrix() [1/2]

virtual void libMesh::SparseMatrix< Number >::create_submatrix ( SparseMatrix< Number > &  submatrix,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
) const
inlinevirtualinherited

This function creates a matrix called "submatrix" which is defined by the row and column indices given in the "rows" and "cols" entries.

Currently this operation is only defined for the PetscMatrixBase subclasses. Note: The rows and cols vectors need to be sorted; Use the nosort version below if rows and cols vectors are not sorted; The rows and cols only contain indices that are owned by this processor.

Definition at line 534 of file sparse_matrix.h.

537 {
538 this->_get_submatrix(submatrix,
539 rows,
540 cols,
541 false); // false means DO NOT REUSE submatrix
542 }
virtual void _get_submatrix(SparseMatrix< Number > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &, const bool) const
Protected implementation of the create_submatrix and reinit_submatrix routines.

◆ create_submatrix() [2/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::create_submatrix ( SparseMatrix< T > &  submatrix,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
) const
inlinevirtualinherited

This function creates a matrix called "submatrix" which is defined by the row and column indices given in the "rows" and "cols" entries.

Currently this operation is only defined for the PetscMatrixBase subclasses. Note: The rows and cols vectors need to be sorted; Use the nosort version below if rows and cols vectors are not sorted; The rows and cols only contain indices that are owned by this processor.

Definition at line 534 of file sparse_matrix.h.

537 {
538 this->_get_submatrix(submatrix,
539 rows,
540 cols,
541 false); // false means DO NOT REUSE submatrix
542 }

References libMesh::SparseMatrix< T >::_get_submatrix().

Referenced by libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::libmesh_petsc_DMCreateInterpolation(), and libMesh::CondensedEigenSystem::solve().

◆ create_submatrix_nosort() [1/2]

virtual void libMesh::SparseMatrix< Number >::create_submatrix_nosort ( SparseMatrix< Number > &  ,
const std::vector< numeric_index_type > &  ,
const std::vector< numeric_index_type > &   
) const
inlinevirtualinherited

Similar to the above function, this function creates a submatrix which is defined by the indices given in the rows and cols vectors.

Note: Both rows and cols can be unsorted; Use the above function for better efficiency if your indices are sorted; rows and cols can contain indices that are owned by other processors.

Definition at line 552 of file sparse_matrix.h.

555 {
556 libmesh_not_implemented();
557 }

◆ create_submatrix_nosort() [2/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::create_submatrix_nosort ( SparseMatrix< T > &  ,
const std::vector< numeric_index_type > &  ,
const std::vector< numeric_index_type > &   
) const
inlinevirtualinherited

Similar to the above function, this function creates a submatrix which is defined by the indices given in the rows and cols vectors.

Note: Both rows and cols can be unsorted; Use the above function for better efficiency if your indices are sorted; rows and cols can contain indices that are owned by other processors.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 552 of file sparse_matrix.h.

555 {
556 libmesh_not_implemented();
557 }

◆ disable_print_counter_info() [1/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

101{
102 _enable_print_counter = false;
103 return;
104}
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.

References libMesh::ReferenceCounter::_enable_print_counter.

◆ disable_print_counter_info() [2/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

101{
102 _enable_print_counter = false;
103 return;
104}

References libMesh::ReferenceCounter::_enable_print_counter.

◆ dont_condense_vars() [1/2]

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

Definition at line 413 of file static_condensation.h.

413{}

◆ dont_condense_vars() [2/2]

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

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 477 of file static_condensation.C.

478{
480}
void dont_condense_vars(const std::unordered_set< unsigned int > &vars)
Add vars to the list of variables not to condense.

References _reduced_dof_map, and libMesh::StaticCondensationDofMap::dont_condense_vars().

Referenced by main().

◆ enable_print_counter_info() [1/2]

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info().

Enabled by default.

Definition at line 94 of file reference_counter.C.

95{
97 return;
98}

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ enable_print_counter_info() [2/2]

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info().

Enabled by default.

Definition at line 94 of file reference_counter.C.

95{
97 return;
98}

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ flush() [1/2]

virtual void libMesh::SparseMatrix< Number >::flush ( )
inlinevirtualinherited

For PETSc matrix , this function is similar to close but without shrinking memory.

This is useful when we want to switch between ADD_VALUES and INSERT_VALUES. close should be called before using the matrix.

Definition at line 244 of file sparse_matrix.h.

244{ close(); }
virtual void close()=0
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...

◆ flush() [2/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::flush ( )
inlinevirtualinherited

For PETSc matrix , this function is similar to close but without shrinking memory.

This is useful when we want to switch between ADD_VALUES and INSERT_VALUES. close should be called before using the matrix.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 244 of file sparse_matrix.h.

244{ close(); }

References libMesh::SparseMatrix< T >::close().

◆ forward_elimination()

void libMesh::StaticCondensation::forward_elimination ( const NumericVector< Number > &  full_rhs)
private

Takes an incoming "full" RHS from the solver, where full means the union of uncondensed and condennsed dofs, and condenses it down into the condensed _reduced_rhs data member using element Schur complements.

Definition at line 383 of file static_condensation.C.

384{
385 std::vector<dof_id_type> elem_condensed_dofs;
386 std::vector<Number> elem_condensed_rhs_vec;
387 EigenVector elem_condensed_rhs, elem_uncondensed_rhs;
388
389 full_rhs.create_subvector(
390 *_reduced_rhs, _reduced_dof_map._local_uncondensed_dofs, /*all_global_entries=*/false);
391
392 std::vector<dof_id_type> reduced_space_indices;
393 for (auto elem : _mesh.active_local_element_ptr_range())
394 {
395 auto & matrix_data = libmesh_map_find(_elem_to_matrix_data, elem->id());
396 reduced_space_indices.clear();
397 const auto & dof_data = libmesh_map_find(_reduced_dof_map._elem_to_dof_data, elem->id());
398 for (const auto & var_reduced_space_indices : dof_data.reduced_space_indices)
399 reduced_space_indices.insert(reduced_space_indices.end(),
400 var_reduced_space_indices.begin(),
401 var_reduced_space_indices.end());
402 elem_condensed_dofs.resize(dof_data.condensed_global_to_local_map.size());
403 for (const auto & [global_dof, local_dof] : dof_data.condensed_global_to_local_map)
404 {
405 libmesh_assert(local_dof < elem_condensed_dofs.size());
406 elem_condensed_dofs[local_dof] = global_dof;
407 }
408
409 set_local_vectors(full_rhs, elem_condensed_dofs, elem_condensed_rhs_vec, elem_condensed_rhs);
410 elem_uncondensed_rhs = -matrix_data.Auc * matrix_data.AccFactor.solve(elem_condensed_rhs);
411
412 libmesh_assert(cast_int<std::size_t>(elem_uncondensed_rhs.size()) ==
413 reduced_space_indices.size());
414 _reduced_rhs->add_vector(elem_uncondensed_rhs.data(), reduced_space_indices);
415 }
416 _reduced_rhs->close();
417}
virtual void create_subvector(NumericVector< T > &, const std::vector< numeric_index_type > &, bool=true) const
Fills in subvector from this vector using the indices in rows.

References libMesh::StaticCondensationDofMap::_elem_to_dof_data, _elem_to_matrix_data, libMesh::StaticCondensationDofMap::_local_uncondensed_dofs, _mesh, _reduced_dof_map, _reduced_rhs, libMesh::NumericVector< T >::create_subvector(), libMesh::libmesh_assert(), and set_local_vectors().

Referenced by apply().

◆ get_condensed_mat()

const SparseMatrix< Number > & libMesh::StaticCondensation::get_condensed_mat ( ) const
inline

Definition at line 296 of file static_condensation.h.

297{
299 return *_reduced_sys_mat;
300}

References _reduced_sys_mat, and libMesh::libmesh_assert().

◆ get_context()

template<typename T >
PetscMatrixBase< T > * libMesh::PetscMatrixBase< T >::get_context ( Mat  mat,
const TIMPI::Communicator comm 
)
staticinherited
Returns
The context for mat if it exists, else a nullptr

Definition at line 116 of file petsc_matrix_base.C.

117{
118 void * ctx;
119 PetscContainer container;
120 LibmeshPetscCall2(comm, PetscObjectQuery((PetscObject)mat, "PetscMatrixCtx", (PetscObject *)&container));
121 if (!container)
122 return nullptr;
123
124 LibmeshPetscCall2(comm, PetscContainerGetPointer(container, &ctx));
126 return static_cast<PetscMatrixBase<T> *>(ctx);
127}

References libMesh::ctx, and libMesh::libmesh_assert().

Referenced by DMlibMeshJacobian(), and form_matrixA().

◆ get_diagonal() [1/3]

virtual void libMesh::StaticCondensation::get_diagonal ( NumericVector< Number > &  dest) const
inlineoverridevirtual

Copies the diagonal part of the matrix into dest.

Implements libMesh::SparseMatrix< Number >.

Definition at line 400 of file static_condensation.h.

400{ libmesh_not_implemented(); }

◆ get_diagonal() [2/3]

void libMesh::StaticCondensation::get_diagonal ( NumericVector< Number > &  dest) const
overridevirtual

Copies the diagonal part of the matrix into dest.

Implements libMesh::SparseMatrix< Number >.

Definition at line 361 of file static_condensation.C.

361{ libmesh_not_implemented(); }

◆ get_diagonal() [3/3]

template<typename T >
virtual void libMesh::SparseMatrix< T >::get_diagonal ( NumericVector< T > &  dest) const
pure virtualinherited

◆ get_info() [1/2]

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48{
49#if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50
51 std::ostringstream oss;
52
53 oss << '\n'
54 << " ---------------------------------------------------------------------------- \n"
55 << "| Reference count information |\n"
56 << " ---------------------------------------------------------------------------- \n";
57
58 for (const auto & [name, cd] : _counts)
59 oss << "| " << name << " reference count information:\n"
60 << "| Creations: " << cd.first << '\n'
61 << "| Destructions: " << cd.second << '\n';
62
63 oss << " ---------------------------------------------------------------------------- \n";
64
65 return oss.str();
66
67#else
68
69 return "";
70
71#endif
72}
static Counts _counts
Actually holds the data.
std::string name(const ElemQuality q)
This function returns a string containing some name for q.

References libMesh::ReferenceCounter::_counts.

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_info() [2/2]

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48{
49#if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50
51 std::ostringstream oss;
52
53 oss << '\n'
54 << " ---------------------------------------------------------------------------- \n"
55 << "| Reference count information |\n"
56 << " ---------------------------------------------------------------------------- \n";
57
58 for (const auto & [name, cd] : _counts)
59 oss << "| " << name << " reference count information:\n"
60 << "| Creations: " << cd.first << '\n'
61 << "| Destructions: " << cd.second << '\n';
62
63 oss << " ---------------------------------------------------------------------------- \n";
64
65 return oss.str();
66
67#else
68
69 return "";
70
71#endif
72}

References libMesh::ReferenceCounter::_counts.

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_preconditioner() [1/2]

StaticCondensationPreconditioner & libMesh::StaticCondensation::get_preconditioner ( )
inline

Get the preconditioning wrapper.

Definition at line 181 of file static_condensation.h.

181{ return *_scp; }

References _scp.

Referenced by libMesh::ImplicitSystem::setup_static_condensation_preconditioner().

◆ get_preconditioner() [2/2]

StaticCondensationPreconditioner & libMesh::StaticCondensation::get_preconditioner ( )
inline

Definition at line 332 of file static_condensation.h.

332{ libmesh_not_implemented(); }

◆ get_row() [1/3]

void libMesh::StaticCondensation::get_row ( numeric_index_type  i,
std::vector< numeric_index_type > &  indices,
std::vector< Number > &  values 
) const
overridevirtual

Get a row from the matrix.

Parameters
iThe matrix row to get
indicesA container that will be filled with the column indices corresponding to (possibly) non-zero values
valuesA container holding the column values

Implements libMesh::SparseMatrix< Number >.

Definition at line 365 of file static_condensation.C.

368{
369 libmesh_not_implemented();
370}

◆ get_row() [2/3]

template<typename T >
virtual void libMesh::SparseMatrix< T >::get_row ( numeric_index_type  i,
std::vector< numeric_index_type > &  indices,
std::vector< T > &  values 
) const
pure virtualinherited

Get a row from the matrix.

Parameters
iThe matrix row to get
indicesA container that will be filled with the column indices corresponding to (possibly) non-zero values
valuesA container holding the column values

Implemented in libMesh::PetscMFFDMatrix< Number >, libMesh::StaticCondensation, libMesh::DiagonalMatrix< T >, libMesh::EigenSparseMatrix< T >, libMesh::LaspackMatrix< T >, libMesh::PetscMatrix< T >, libMesh::PetscMFFDMatrix< T >, libMesh::EpetraMatrix< T >, and libMesh::StaticCondensation.

Referenced by libMesh::MeshBase::copy_constraint_rows().

◆ get_row() [3/3]

virtual void libMesh::StaticCondensation::get_row ( numeric_index_type  i,
std::vector< numeric_index_type > &  indices,
std::vector< Number > &  values 
) const
inlineoverridevirtual

Get a row from the matrix.

Parameters
iThe matrix row to get
indicesA container that will be filled with the column indices corresponding to (possibly) non-zero values
valuesA container holding the column values

Implements libMesh::SparseMatrix< Number >.

Definition at line 402 of file static_condensation.h.

405 {
406 libmesh_not_implemented();
407 }

◆ get_transpose() [1/3]

virtual void libMesh::StaticCondensation::get_transpose ( SparseMatrix< Number > &  dest) const
inlineoverridevirtual

Copies the transpose of the matrix into dest, which may be *this.

Implements libMesh::SparseMatrix< Number >.

Definition at line 401 of file static_condensation.h.

401{ libmesh_not_implemented(); }

◆ get_transpose() [2/3]

void libMesh::StaticCondensation::get_transpose ( SparseMatrix< Number > &  dest) const
overridevirtual

Copies the transpose of the matrix into dest, which may be *this.

Implements libMesh::SparseMatrix< Number >.

Definition at line 363 of file static_condensation.C.

363{ libmesh_not_implemented(); }

◆ get_transpose() [3/3]

template<typename T >
virtual void libMesh::SparseMatrix< T >::get_transpose ( SparseMatrix< T > &  dest) const
pure virtualinherited

◆ increment_constructor_count() [1/2]

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

184{
185 libmesh_try
186 {
187 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188 std::pair<unsigned int, unsigned int> & p = _counts[name];
189 p.first++;
190 }
191 libmesh_catch (...)
192 {
193 auto stream = libMesh::err.get();
194 stream->exceptions(stream->goodbit); // stream must not throw
195 libMesh::err << "Encountered unrecoverable error while calling "
196 << "ReferenceCounter::increment_constructor_count() "
197 << "for a(n) " << name << " object." << std::endl;
198 std::terminate();
199 }
200}
streamT * get()
Rather than implement every ostream/ios/ios_base function, we'll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition threads.C:30
OStreamProxy err

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), and libMesh::ReferenceCountedObject< T >::ReferenceCountedObject().

◆ increment_constructor_count() [2/2]

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

184{
185 libmesh_try
186 {
187 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188 std::pair<unsigned int, unsigned int> & p = _counts[name];
189 p.first++;
190 }
191 libmesh_catch (...)
192 {
193 auto stream = libMesh::err.get();
194 stream->exceptions(stream->goodbit); // stream must not throw
195 libMesh::err << "Encountered unrecoverable error while calling "
196 << "ReferenceCounter::increment_constructor_count() "
197 << "for a(n) " << name << " object." << std::endl;
198 std::terminate();
199 }
200}

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), and libMesh::ReferenceCountedObject< T >::ReferenceCountedObject().

◆ increment_destructor_count() [1/2]

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

208{
209 libmesh_try
210 {
211 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212 std::pair<unsigned int, unsigned int> & p = _counts[name];
213 p.second++;
214 }
215 libmesh_catch (...)
216 {
217 auto stream = libMesh::err.get();
218 stream->exceptions(stream->goodbit); // stream must not throw
219 libMesh::err << "Encountered unrecoverable error while calling "
220 << "ReferenceCounter::increment_destructor_count() "
221 << "for a(n) " << name << " object." << std::endl;
222 std::terminate();
223 }
224}

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::~ReferenceCountedObject().

◆ increment_destructor_count() [2/2]

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

208{
209 libmesh_try
210 {
211 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212 std::pair<unsigned int, unsigned int> & p = _counts[name];
213 p.second++;
214 }
215 libmesh_catch (...)
216 {
217 auto stream = libMesh::err.get();
218 stream->exceptions(stream->goodbit); // stream must not throw
219 libMesh::err << "Encountered unrecoverable error while calling "
220 << "ReferenceCounter::increment_destructor_count() "
221 << "for a(n) " << name << " object." << std::endl;
222 std::terminate();
223 }
224}

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::~ReferenceCountedObject().

◆ init() [1/6]

void libMesh::StaticCondensation::init ( )

Size the element matrices.

Definition at line 120 of file static_condensation.C.

121{
122 if (this->initialized())
123 return;
124
126
127 // This API is public, so it can be called without going through the other init overloads which
128 // would give us an indication of what kind of parallel type the user wants. If we've gotten no
129 // indication so far, we will default to parallel
133
134 for (const auto & [elem_id, dof_data] : _reduced_dof_map._elem_to_dof_data)
135 {
136 auto & matrix_data = _elem_to_matrix_data[elem_id];
137
138 const auto condensed_dof_size = dof_data.condensed_global_to_local_map.size();
139 const auto uncondensed_dof_size = dof_data.uncondensed_global_to_local_map.size();
140
141 matrix_data.Acc.setZero(condensed_dof_size, condensed_dof_size);
142 matrix_data.Acu.setZero(condensed_dof_size, uncondensed_dof_size);
143 matrix_data.Auc.setZero(uncondensed_dof_size, condensed_dof_size);
144 matrix_data.Auu.setZero(uncondensed_dof_size, uncondensed_dof_size);
145 }
146
147 //
148 // Build the reduced system data
149 //
150 const auto n = _reduced_dof_map.n_dofs();
151 const auto n_local =
154 _reduced_solver->init((_system.name() + "_condensed_").c_str());
156 // Init the RHS vector so we can conveniently get processor row offsets
157 _reduced_rhs->init(n, n_local);
158
159 // Initialize the reduced system matrix
162 if (auto * const petsc_mat = dynamic_cast<PetscMatrix<Number> *>(_reduced_sys_mat.get()))
163 {
164 // Optimization for PETSc. This is critical for problems in which there are SCALAR dofs that
165 // introduce dense rows to avoid allocating a dense matrix
166 petsc_mat->init(
168 }
169 else
170 {
171 const auto & nnz = _sp->get_n_nz();
172 const auto & noz = _sp->get_n_oz();
173 const auto nz = nnz.empty() ? dof_id_type(0) : *std::max_element(nnz.begin(), nnz.end());
174 const auto oz = noz.empty() ? dof_id_type(0) : *std::max_element(noz.begin(), noz.end());
175 _reduced_sys_mat->init(n, n, n_local, n_local, nz, oz);
176 }
177
178 // Build ghosted full solution vector. Note that this is, in general, *not equal* to the system
179 // solution, e.g. this may correspond to the solution for the Newton *update*
181
182 _sc_is_initialized = true;
183}
dof_id_type n_dofs() const
dof_id_type n_local_dofs() const
static std::unique_ptr< LinearSolver< T > > build(const libMesh::Parallel::Communicator &comm_in, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a LinearSolver using the linear solver package specified by solver_package.
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
static std::unique_ptr< SparseMatrix< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
const std::vector< dof_id_type > & get_n_oz() const
The number of off-processor nonzeros in my portion of the global matrix.
const std::vector< dof_id_type > & get_n_nz() const
The number of on-processor nonzeros in my portion of the global matrix.
std::unique_ptr< SparsityPattern::Build > _reduced_sp
Owned storage of the reduced system sparsity pattern.
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.
bool initialized() const
Whether we are initialized.
virtual bool initialized() const override
const std::string & name() const
Definition system.h:2385
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition system.h:1667
template class LIBMESH_EXPORT PetscMatrix< Number >
uint8_t dof_id_type
Definition id_types.h:67

References libMesh::StaticCondensationDofMap::_elem_to_dof_data, _elem_to_matrix_data, _ghosted_full_sol, _parallel_type, _reduced_dof_map, libMesh::StaticCondensationDofMap::_reduced_nnz, libMesh::StaticCondensationDofMap::_reduced_noz, _reduced_rhs, _reduced_solver, libMesh::StaticCondensationDofMap::_reduced_sp, _reduced_sys_mat, _sc_is_initialized, libMesh::SparseMatrix< Number >::_sp, _system, libMesh::LinearSolver< T >::build(), libMesh::SparseMatrix< T >::build(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::System::current_local_solution, libMesh::SparsityPattern::Build::get_n_nz(), libMesh::SparsityPattern::Build::get_n_oz(), libMesh::StaticCondensationDofMap::initialized(), initialized(), libMesh::INVALID_PARALLELIZATION, libMesh::libmesh_assert(), n(), libMesh::DofMapBase::n_dofs(), libMesh::DofMapBase::n_local_dofs(), libMesh::System::name(), libMesh::PARALLEL, and libMesh::SERIAL.

Referenced by init(), and init().

◆ init() [2/6]

void libMesh::StaticCondensation::init ( )
inline

Definition at line 408 of file static_condensation.h.

408{ libmesh_not_implemented(); }

◆ init() [3/6]

void libMesh::StaticCondensation::init ( const numeric_index_type  m,
const numeric_index_type  n,
const numeric_index_type  m_l,
const numeric_index_type  n_l,
const numeric_index_type  = 30,
const numeric_index_type  = 10,
const numeric_index_type  blocksize = 1 
)
overridevirtual

Initialize SparseMatrix with the specified sizes.

Parameters
mThe global number of rows.
nThe global number of columns.
m_lThe local number of rows.
n_lThe local number of columns.
nnzThe number of on-diagonal nonzeros per row (defaults to 30).
nozThe number of off-diagonal nonzeros per row (defaults to 10).
blocksizeOptional value indicating dense coupled blocks for systems with multiple variables all of the same type.

Reimplemented from libMesh::PetscMatrixShellMatrix< Number >.

Definition at line 89 of file static_condensation.C.

96{
97 if (!this->initialized())
98 {
99 PetscMatrixShellMatrix<Number>::init(m, n, m_l, n_l, nnz, noz, blocksize);
100 _parallel_type = ((m == m_l) && (this->n_processors() > 1)) ? SERIAL : PARALLEL;
101 this->init();
102 }
103}
processor_id_type n_processors() const
virtual void init(const numeric_index_type m, const numeric_index_type n, const numeric_index_type m_l, const numeric_index_type n_l, const numeric_index_type=30, const numeric_index_type=10, const numeric_index_type blocksize=1) override
Initialize SparseMatrix with the specified sizes.
void init()
Size the element matrices.

References _parallel_type, init(), libMesh::PetscMatrixShellMatrix< T >::init(), initialized(), m(), n(), libMesh::ParallelObject::n_processors(), libMesh::PARALLEL, and libMesh::SERIAL.

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

◆ init() [4/6]

virtual void libMesh::StaticCondensation::init ( const numeric_index_type  m,
const numeric_index_type  n,
const numeric_index_type  m_l,
const numeric_index_type  n_l,
const numeric_index_type  = 30,
const numeric_index_type  = 10,
const numeric_index_type  blocksize = 1 
)
inlineoverridevirtual

Initialize SparseMatrix with the specified sizes.

Parameters
mThe global number of rows.
nThe global number of columns.
m_lThe local number of rows.
n_lThe local number of columns.
nnzThe number of on-diagonal nonzeros per row (defaults to 30).
nozThe number of off-diagonal nonzeros per row (defaults to 10).
blocksizeOptional value indicating dense coupled blocks for systems with multiple variables all of the same type.

Reimplemented from libMesh::PetscMatrixShellMatrix< Number >.

Definition at line 338 of file static_condensation.h.

345 {
346 libmesh_not_implemented();
347 }

◆ init() [5/6]

void libMesh::StaticCondensation::init ( const ParallelType  )
overridevirtual

Initialize this matrix using the sparsity structure computed by dof_map.

Parameters
typeThe serial/parallel/ghosted type of the matrix

Reimplemented from libMesh::PetscMatrixShellMatrix< Number >.

Definition at line 105 of file static_condensation.C.

106{
107 if (!this->initialized())
108 {
110 _parallel_type = type;
111 this->init();
112 }
113}

References _parallel_type, init(), libMesh::PetscMatrixShellMatrix< T >::init(), and initialized().

◆ init() [6/6]

virtual void libMesh::StaticCondensation::init ( ParallelType  )
inlineoverridevirtual

Initialize this matrix using the sparsity structure computed by dof_map.

Parameters
typeThe serial/parallel/ghosted type of the matrix

Reimplemented from libMesh::PetscMatrixShellMatrix< Number >.

Definition at line 348 of file static_condensation.h.

348{ libmesh_not_implemented(); }

◆ initialized()

bool libMesh::StaticCondensation::initialized ( ) const
overridevirtual
Returns
true if the matrix has been initialized, false otherwise.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 115 of file static_condensation.C.

References _sc_is_initialized, and libMesh::SparseMatrix< T >::initialized().

Referenced by init(), init(), init(), and libMesh::StaticCondensationPreconditioner::initialized().

◆ l1_norm() [1/2]

Real libMesh::StaticCondensation::l1_norm ( ) const
overridevirtual
Returns
The \( \ell_1 \)-norm of the matrix, that is the max column sum: \( |M|_1 = \max_{j} \sum_{i} |M_{ij}| \)

This is the natural matrix norm that is compatible with the \( \ell_1 \)-norm for vectors, i.e. \( |Mv|_1 \leq |M|_1 |v|_1 \). (cf. Haemmerlin-Hoffmann : Numerische Mathematik)

Implements libMesh::SparseMatrix< T >.

Definition at line 355 of file static_condensation.C.

355{ libmesh_not_implemented(); }

◆ l1_norm() [2/2]

virtual Real libMesh::StaticCondensation::l1_norm ( ) const
inlineoverridevirtual
Returns
The \( \ell_1 \)-norm of the matrix, that is the max column sum: \( |M|_1 = \max_{j} \sum_{i} |M_{ij}| \)

This is the natural matrix norm that is compatible with the \( \ell_1 \)-norm for vectors, i.e. \( |Mv|_1 \leq |M|_1 |v|_1 \). (cf. Haemmerlin-Hoffmann : Numerische Mathematik)

Implements libMesh::SparseMatrix< T >.

Definition at line 393 of file static_condensation.h.

393{ libmesh_not_implemented(); }

◆ l1_norm_diff() [1/2]

Real libMesh::SparseMatrix< Number >::l1_norm_diff ( const SparseMatrix< Number > &  other_mat) const
inherited
Returns
The l1_norm() of the difference of this and other_mat

Definition at line 396 of file sparse_matrix.C.

1363{
1364 auto diff_mat = this->clone();
1365 diff_mat->add(-1.0, other_mat);
1366 return diff_mat->l1_norm();
1367}
virtual std::unique_ptr< SparseMatrix< Number > > clone() const=0

◆ l1_norm_diff() [2/2]

template<typename T >
Real libMesh::SparseMatrix< T >::l1_norm_diff ( const SparseMatrix< T > &  other_mat) const
inherited
Returns
The l1_norm() of the difference of this and other_mat

Definition at line 1362 of file sparse_matrix.C.

1363{
1364 auto diff_mat = this->clone();
1365 diff_mat->add(-1.0, other_mat);
1366 return diff_mat->l1_norm();
1367}

Referenced by libMesh::l1_norm_diff().

◆ linfty_norm() [1/2]

Real libMesh::StaticCondensation::linfty_norm ( ) const
overridevirtual
Returns
The \( \ell_{\infty} \)-norm of the matrix, that is the max row sum:

\( |M|_{\infty} = \max_{i} \sum_{j} |M_{ij}| \)

This is the natural matrix norm that is compatible to the \( \ell_{\infty} \)-norm of vectors, i.e. \( |Mv|_{\infty} \leq |M|_{\infty} |v|_{\infty} \). (cf. Haemmerlin-Hoffmann : Numerische Mathematik)

Implements libMesh::SparseMatrix< T >.

Definition at line 357 of file static_condensation.C.

357{ libmesh_not_implemented(); }

◆ linfty_norm() [2/2]

virtual Real libMesh::StaticCondensation::linfty_norm ( ) const
inlineoverridevirtual
Returns
The \( \ell_{\infty} \)-norm of the matrix, that is the max row sum:

\( |M|_{\infty} = \max_{i} \sum_{j} |M_{ij}| \)

This is the natural matrix norm that is compatible to the \( \ell_{\infty} \)-norm of vectors, i.e. \( |Mv|_{\infty} \leq |M|_{\infty} |v|_{\infty} \). (cf. Haemmerlin-Hoffmann : Numerische Mathematik)

Implements libMesh::SparseMatrix< T >.

Definition at line 394 of file static_condensation.h.

394{ libmesh_not_implemented(); }

◆ local_m() [1/2]

virtual numeric_index_type libMesh::SparseMatrix< Number >::local_m ( ) const
inlinevirtualinherited

Get the number of rows owned by this process.

Definition at line 254 of file sparse_matrix.h.

254{ return row_stop() - row_start(); }
virtual numeric_index_type row_stop() const=0
virtual numeric_index_type row_start() const=0

◆ local_m() [2/2]

template<typename T >
numeric_index_type libMesh::PetscMatrixBase< T >::local_m ( ) const
finalvirtualinherited

Get the number of rows owned by this process.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 142 of file petsc_matrix_base.C.

143{
144 libmesh_assert (this->initialized());
145
146 PetscInt m = 0;
147
148 LibmeshPetscCall(MatGetLocalSize (this->_mat, &m, NULL));
149
150 return static_cast<numeric_index_type>(m);
151}
virtual numeric_index_type m() const override
Mat _mat
PETSc matrix datatype to store values.

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ local_n() [1/2]

virtual numeric_index_type libMesh::SparseMatrix< Number >::local_n ( ) const
inlinevirtualinherited

Get the number of columns owned by this process.

Definition at line 259 of file sparse_matrix.h.

259{ return col_stop() - col_start(); }
virtual numeric_index_type col_stop() const=0
virtual numeric_index_type col_start() const=0

◆ local_n() [2/2]

template<typename T >
numeric_index_type libMesh::PetscMatrixBase< T >::local_n ( ) const
finalvirtualinherited

Get the number of columns owned by this process.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 166 of file petsc_matrix_base.C.

167{
168 libmesh_assert (this->initialized());
169
170 PetscInt n = 0;
171
172 LibmeshPetscCall(MatGetLocalSize (this->_mat, NULL, &n));
173
174 return static_cast<numeric_index_type>(n);
175}
virtual numeric_index_type n() const override

◆ m() [1/2]

numeric_index_type libMesh::StaticCondensation::m ( ) const
overridevirtual
Returns
The row-dimension of the matrix.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 249 of file static_condensation.C.

249{ return _full_dof_map.n_dofs(); }
dof_id_type n_dofs(const unsigned int vn) const
Definition dof_map.h:776

References _full_dof_map, and libMesh::DofMap::n_dofs().

Referenced by init(), and n().

◆ m() [2/2]

virtual numeric_index_type libMesh::StaticCondensation::m ( ) const
inlineoverridevirtual
Returns
The row-dimension of the matrix.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 360 of file static_condensation.h.

360{ libmesh_not_implemented(); }

◆ mat() [1/2]

template<typename T >
Mat libMesh::PetscMatrixBase< T >::mat ( )
inlineinherited

◆ mat() [2/2]

template<typename T >
Mat libMesh::PetscMatrixBase< T >::mat ( ) const
inlineinherited

Definition at line 121 of file petsc_matrix_base.h.

121{ libmesh_assert(_mat); return _mat; }

References libMesh::PetscMatrixBase< T >::_mat, and libMesh::libmesh_assert().

◆ matrix_matrix_mult() [1/2]

virtual void libMesh::SparseMatrix< Number >::matrix_matrix_mult ( SparseMatrix< Number > &  ,
SparseMatrix< Number > &  ,
bool   
)
inlinevirtualinherited

Compute Y = A*X for matrix X.

Definition at line 349 of file sparse_matrix.h.

350 { libmesh_not_implemented(); }

◆ matrix_matrix_mult() [2/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::matrix_matrix_mult ( SparseMatrix< T > &  ,
SparseMatrix< T > &  ,
bool   
)
inlinevirtualinherited

Compute Y = A*X for matrix X.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 349 of file sparse_matrix.h.

350 { libmesh_not_implemented(); }

◆ n() [1/2]

virtual numeric_index_type libMesh::StaticCondensation::n ( ) const
inlineoverridevirtual
Returns
The column-dimension of the matrix.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 107 of file static_condensation.h.

107{ return this->m(); }

References m().

Referenced by init(), and init().

◆ n() [2/2]

virtual numeric_index_type libMesh::StaticCondensation::n ( ) const
inlineoverridevirtual
Returns
The column-dimension of the matrix.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 361 of file static_condensation.h.

361{ libmesh_not_implemented(); }

◆ n_nonzeros() [1/2]

std::size_t libMesh::SparseMatrix< Number >::n_nonzeros ( ) const
virtualinherited
Returns
the global number of non-zero entries in the matrix sparsity pattern

Definition at line 407 of file sparse_matrix.C.

267{
268 if (!_sp)
269 return 0;
270 return _sp->n_nonzeros();
271}
std::size_t n_nonzeros() const
The total number of nonzeros in the global matrix.

◆ n_nonzeros() [2/2]

template<typename T >
std::size_t libMesh::SparseMatrix< T >::n_nonzeros ( ) const
virtualinherited
Returns
the global number of non-zero entries in the matrix sparsity pattern

Definition at line 266 of file sparse_matrix.C.

267{
268 if (!_sp)
269 return 0;
270 return _sp->n_nonzeros();
271}

◆ n_objects() [1/2]

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

86 { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ n_objects() [2/2]

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

86 { return _n_objects; }

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ n_processors() [1/2]

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
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(), 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_processors() [2/2]

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 }

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

◆ need_full_sparsity_pattern() [1/2]

template<typename T >
virtual bool libMesh::SparseMatrix< T >::need_full_sparsity_pattern ( ) const
inlinevirtualinherited
Returns
true if this sparse matrix format needs to be fed the graph of the sparse matrix.

This is true for LaspackMatrix, but not PetscMatrixBase subclasses. In the case where the full graph is not required, we can efficiently approximate it to provide a good estimate of the required size of the sparse matrix.

Reimplemented in libMesh::LaspackMatrix< T >, and libMesh::EpetraMatrix< T >.

Definition at line 162 of file sparse_matrix.h.

163 { return false; }

Referenced by libMesh::DofMap::attach_matrix(), and libMesh::DofMap::update_sparsity_pattern().

◆ need_full_sparsity_pattern() [2/2]

virtual bool libMesh::SparseMatrix< Number >::need_full_sparsity_pattern ( ) const
inlinevirtualinherited
Returns
true if this sparse matrix format needs to be fed the graph of the sparse matrix.

This is true for LaspackMatrix, but not PetscMatrixBase subclasses. In the case where the full graph is not required, we can efficiently approximate it to provide a good estimate of the required size of the sparse matrix.

Definition at line 162 of file sparse_matrix.h.

163 { return false; }

◆ operator()() [1/2]

Number libMesh::StaticCondensation::operator() ( const numeric_index_type  i,
const numeric_index_type  j 
) const
overridevirtual
Returns
A copy of matrix entry (i,j).
Note
This may be an expensive operation, and you should always be careful where you call this function.

Implements libMesh::SparseMatrix< T >.

Definition at line 350 of file static_condensation.C.

351{
352 libmesh_not_implemented();
353}

◆ operator()() [2/2]

virtual Number libMesh::StaticCondensation::operator() ( const numeric_index_type  i,
const numeric_index_type  j 
) const
inlineoverridevirtual
Returns
A copy of matrix entry (i,j).
Note
This may be an expensive operation, and you should always be careful where you call this function.

Implements libMesh::SparseMatrix< T >.

Definition at line 389 of file static_condensation.h.

390 {
391 libmesh_not_implemented();
392 }

◆ operator=() [1/2]

SparseMatrix< Number > & libMesh::StaticCondensation::operator= ( const SparseMatrix< Number > &  )
overridevirtual

This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual.

This function should be overridden in derived classes so that they can be copied correctly via references to the base class. This design usually isn't a good idea in general, but in this context it works because we usually don't have a mix of different kinds of SparseMatrix active in the library at a single time.

Returns
A reference to *this as the base type.

Reimplemented from libMesh::SparseMatrix< Number >.

Definition at line 60 of file static_condensation.C.

61{
62 libmesh_not_implemented();
63}

◆ operator=() [2/2]

virtual SparseMatrix< Number > & libMesh::StaticCondensation::operator= ( const SparseMatrix< Number > &  )
inlineoverridevirtual

This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual.

This function should be overridden in derived classes so that they can be copied correctly via references to the base class. This design usually isn't a good idea in general, but in this context it works because we usually don't have a mix of different kinds of SparseMatrix active in the library at a single time.

Returns
A reference to *this as the base type.

Reimplemented from libMesh::PetscMatrixShellMatrix< Number >.

Definition at line 333 of file static_condensation.h.

334 {
335 libmesh_not_implemented();
336 }

◆ print() [1/5]

template<typename T >
void libMesh::SparseMatrix< T >::print ( const std::string &  filename) const
inherited

Print the contents of the matrix to a file, with a file format depending on the extension of filename.

Definition at line 754 of file sparse_matrix.C.

755{
756 {
757 std::ofstream outstr (filename.c_str());
758 libmesh_error_msg_if
759 (!outstr.good(), "ERROR: cannot write to file:\n\t" <<
760 filename);
761 }
762
763 std::string_view basename = Utility::basename_of(filename);
764
765 const bool gzipped_file = Utility::ends_with(filename, ".gz");
766
767 if (gzipped_file)
768 basename.remove_suffix(3);
769
770 if (Utility::ends_with(basename, ".matlab") ||
771 Utility::ends_with(basename, ".m"))
772 this->print_matlab(filename);
773 else if (Utility::ends_with(basename, ".petsc64"))
774 {
775#ifndef LIBMESH_HAVE_PETSC
776 libmesh_error_msg("Cannot load PETSc matrix file " <<
777 filename << " without PETSc-enabled libMesh.");
778#elif LIBMESH_DOF_ID_BYTES != 8
779 libmesh_error_msg("Cannot load 64-bit PETSc matrix file " <<
780 filename << " with non-64-bit libMesh.");
781#endif
782 if (gzipped_file)
783 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
784 this->print_petsc_binary(filename);
785 }
786 else if (Utility::ends_with(basename, ".petsc32"))
787 {
788#ifndef LIBMESH_HAVE_PETSC
789 libmesh_error_msg("Cannot load PETSc matrix file " <<
790 filename << " without PETSc-enabled libMesh.");
791#elif LIBMESH_DOF_ID_BYTES != 4
792 libmesh_error_msg("Cannot load 32-bit PETSc matrix file " <<
793 filename << " with non-32-bit libMesh.");
794#endif
795 if (gzipped_file)
796 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
797 this->print_petsc_binary(filename);
798 }
799 else if (Utility::ends_with(basename, ".h5"))
800 {
801 if (gzipped_file)
802 libmesh_not_implemented_msg("Gzipped HDF5 matrices are not currently supported");
803 this->print_coreform_hdf5(filename);
804 }
805 else
806 libmesh_error_msg(" ERROR: Unrecognized matrix file extension on: "
807 << basename
808 << "\n I understand the following:\n\n"
809 << " *.h5 -- CoreForm HDF5 sparse matrix format\n"
810 << " *.matlab -- Matlab sparse matrix format\n"
811 << " *.matlab.gz -- Matlab sparse matrix format, gzipped\n"
812 << " *.m -- Matlab sparse matrix format\n"
813 << " *.m.gz -- Matlab sparse matrix format, gzipped\n"
814 << " *.petsc32 -- PETSc binary format, 32-bit\n"
815 << " *.petsc64 -- PETSc binary format, 64-bit\n"
816 );
817}
virtual void print_coreform_hdf5(const std::string &filename, const std::string &groupname="extraction") const
Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm,...
virtual void print_petsc_binary(const std::string &filename) const
Write the contents of the matrix to a file in PETSc's binary sparse matrix format.
virtual void print_matlab(const std::string &="") const
Print the contents of the matrix in Matlab's sparse matrix format.
bool ends_with(std::string_view superstring, std::string_view suffix)
Look for a substring at the very end of a string.
Definition utility.C:213
std::string_view basename_of(const std::string &fullname)
Definition utility.C:108

References libMesh::Utility::basename_of(), and libMesh::Utility::ends_with().

◆ print() [2/5]

void libMesh::SparseMatrix< Number >::print ( const std::string &  filename) const
inherited

Print the contents of the matrix to a file, with a file format depending on the extension of filename.

Definition at line 454 of file sparse_matrix.C.

755{
756 {
757 std::ofstream outstr (filename.c_str());
758 libmesh_error_msg_if
759 (!outstr.good(), "ERROR: cannot write to file:\n\t" <<
760 filename);
761 }
762
763 std::string_view basename = Utility::basename_of(filename);
764
765 const bool gzipped_file = Utility::ends_with(filename, ".gz");
766
767 if (gzipped_file)
768 basename.remove_suffix(3);
769
770 if (Utility::ends_with(basename, ".matlab") ||
771 Utility::ends_with(basename, ".m"))
772 this->print_matlab(filename);
773 else if (Utility::ends_with(basename, ".petsc64"))
774 {
775#ifndef LIBMESH_HAVE_PETSC
776 libmesh_error_msg("Cannot load PETSc matrix file " <<
777 filename << " without PETSc-enabled libMesh.");
778#elif LIBMESH_DOF_ID_BYTES != 8
779 libmesh_error_msg("Cannot load 64-bit PETSc matrix file " <<
780 filename << " with non-64-bit libMesh.");
781#endif
782 if (gzipped_file)
783 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
784 this->print_petsc_binary(filename);
785 }
786 else if (Utility::ends_with(basename, ".petsc32"))
787 {
788#ifndef LIBMESH_HAVE_PETSC
789 libmesh_error_msg("Cannot load PETSc matrix file " <<
790 filename << " without PETSc-enabled libMesh.");
791#elif LIBMESH_DOF_ID_BYTES != 4
792 libmesh_error_msg("Cannot load 32-bit PETSc matrix file " <<
793 filename << " with non-32-bit libMesh.");
794#endif
795 if (gzipped_file)
796 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
797 this->print_petsc_binary(filename);
798 }
799 else if (Utility::ends_with(basename, ".h5"))
800 {
801 if (gzipped_file)
802 libmesh_not_implemented_msg("Gzipped HDF5 matrices are not currently supported");
803 this->print_coreform_hdf5(filename);
804 }
805 else
806 libmesh_error_msg(" ERROR: Unrecognized matrix file extension on: "
807 << basename
808 << "\n I understand the following:\n\n"
809 << " *.h5 -- CoreForm HDF5 sparse matrix format\n"
810 << " *.matlab -- Matlab sparse matrix format\n"
811 << " *.matlab.gz -- Matlab sparse matrix format, gzipped\n"
812 << " *.m -- Matlab sparse matrix format\n"
813 << " *.m.gz -- Matlab sparse matrix format, gzipped\n"
814 << " *.petsc32 -- PETSc binary format, 32-bit\n"
815 << " *.petsc64 -- PETSc binary format, 64-bit\n"
816 );
817}

◆ print() [3/5]

void libMesh::SparseMatrix< Complex >::print ( std::ostream &  os,
const bool  sparse 
) const
inherited

Definition at line 159 of file sparse_matrix.C.

160{
161 // std::complex<>::operator<<() is defined, but use this form
162
163 if (sparse)
164 {
165 libmesh_not_implemented();
166 }
167
168 os << "Real part:" << std::endl;
169 for (auto i : make_range(this->m()))
170 {
171 for (auto j : make_range(this->n()))
172 os << std::setw(8) << (*this)(i,j).real() << " ";
173 os << std::endl;
174 }
175
176 os << std::endl << "Imaginary part:" << std::endl;
177 for (auto i : make_range(this->m()))
178 {
179 for (auto j : make_range(this->n()))
180 os << std::setw(8) << (*this)(i,j).imag() << " ";
181 os << std::endl;
182 }
183}
virtual numeric_index_type n() const =0
virtual numeric_index_type m() const =0
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)
boost::multiprecision::float128 imag(const boost::multiprecision::float128)

References libMesh::make_range().

◆ print() [4/5]

template<typename T >
void libMesh::SparseMatrix< T >::print ( std::ostream &  os = libMesh::out,
const bool  sparse = false 
) const
inherited

Print the contents of the matrix to the screen in a uniform style, regardless of matrix/solver package being used.

Definition at line 275 of file sparse_matrix.C.

276{
277 parallel_object_only();
278
279 libmesh_assert (this->initialized());
280
281 const numeric_index_type first_dof = this->row_start(),
282 end_dof = this->row_stop();
283
284 // We'll print the matrix from processor 0 to make sure
285 // it's serialized properly
286 if (this->processor_id() == 0)
287 {
288 libmesh_assert_equal_to (first_dof, 0);
289 for (numeric_index_type i : make_range(end_dof))
290 {
291 if (sparse)
292 {
293 for (auto j : make_range(this->n()))
294 {
295 T c = (*this)(i,j);
296 if (c != static_cast<T>(0.0))
297 {
298 os << i << " " << j << " " << c << std::endl;
299 }
300 }
301 }
302 else
303 {
304 for (auto j : make_range(this->n()))
305 os << (*this)(i,j) << " ";
306 os << std::endl;
307 }
308 }
309
310 std::vector<numeric_index_type> ibuf, jbuf;
311 std::vector<T> cbuf;
312 numeric_index_type currenti = end_dof;
313 for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
314 {
315 this->comm().receive(p, ibuf);
316 this->comm().receive(p, jbuf);
317 this->comm().receive(p, cbuf);
318 libmesh_assert_equal_to (ibuf.size(), jbuf.size());
319 libmesh_assert_equal_to (ibuf.size(), cbuf.size());
320
321 if (ibuf.empty())
322 continue;
323 libmesh_assert_greater_equal (ibuf.front(), currenti);
324 libmesh_assert_greater_equal (ibuf.back(), ibuf.front());
325
326 std::size_t currentb = 0;
327 for (;currenti <= ibuf.back(); ++currenti)
328 {
329 if (sparse)
330 {
331 for (numeric_index_type j=0; j<this->n(); j++)
332 {
333 if (currentb < ibuf.size() &&
334 ibuf[currentb] == currenti &&
335 jbuf[currentb] == j)
336 {
337 os << currenti << " " << j << " " << cbuf[currentb] << std::endl;
338 currentb++;
339 }
340 }
341 }
342 else
343 {
344 for (auto j : make_range(this->n()))
345 {
346 if (currentb < ibuf.size() &&
347 ibuf[currentb] == currenti &&
348 jbuf[currentb] == j)
349 {
350 os << cbuf[currentb] << " ";
351 currentb++;
352 }
353 else
354 os << static_cast<T>(0.0) << " ";
355 }
356 os << std::endl;
357 }
358 }
359 }
360 if (!sparse)
361 {
362 for (; currenti != this->m(); ++currenti)
363 {
364 for (numeric_index_type j=0; j<this->n(); j++)
365 os << static_cast<T>(0.0) << " ";
366 os << std::endl;
367 }
368 }
369 }
370 else
371 {
372 std::vector<numeric_index_type> ibuf, jbuf;
373 std::vector<T> cbuf;
374
375 // We'll assume each processor has access to entire
376 // matrix rows, so (*this)(i,j) is valid if i is a local index.
377 for (numeric_index_type i : make_range(first_dof, end_dof))
378 {
379 for (auto j : make_range(this->n()))
380 {
381 T c = (*this)(i,j);
382 if (c != static_cast<T>(0.0))
383 {
384 ibuf.push_back(i);
385 jbuf.push_back(j);
386 cbuf.push_back(c);
387 }
388 }
389 }
390 this->comm().send(0,ibuf);
391 this->comm().send(0,jbuf);
392 this->comm().send(0,cbuf);
393 }
394}
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
processor_id_type processor_id() const

References libMesh::initialized(), libMesh::libmesh_assert(), and libMesh::make_range().

Referenced by libMesh::EigenSparseMatrix< T >::print_personal(), and libMesh::LaspackMatrix< T >::print_personal().

◆ print() [5/5]

void libMesh::SparseMatrix< Number >::print ( std::ostream &  os = libMesh::out,
const bool  sparse = false 
) const
inherited

Print the contents of the matrix to the screen in a uniform style, regardless of matrix/solver package being used.

Definition at line 413 of file sparse_matrix.C.

276{
277 parallel_object_only();
278
279 libmesh_assert (this->initialized());
280
281 const numeric_index_type first_dof = this->row_start(),
282 end_dof = this->row_stop();
283
284 // We'll print the matrix from processor 0 to make sure
285 // it's serialized properly
286 if (this->processor_id() == 0)
287 {
288 libmesh_assert_equal_to (first_dof, 0);
289 for (numeric_index_type i : make_range(end_dof))
290 {
291 if (sparse)
292 {
293 for (auto j : make_range(this->n()))
294 {
295 T c = (*this)(i,j);
296 if (c != static_cast<T>(0.0))
297 {
298 os << i << " " << j << " " << c << std::endl;
299 }
300 }
301 }
302 else
303 {
304 for (auto j : make_range(this->n()))
305 os << (*this)(i,j) << " ";
306 os << std::endl;
307 }
308 }
309
310 std::vector<numeric_index_type> ibuf, jbuf;
311 std::vector<T> cbuf;
312 numeric_index_type currenti = end_dof;
313 for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
314 {
315 this->comm().receive(p, ibuf);
316 this->comm().receive(p, jbuf);
317 this->comm().receive(p, cbuf);
318 libmesh_assert_equal_to (ibuf.size(), jbuf.size());
319 libmesh_assert_equal_to (ibuf.size(), cbuf.size());
320
321 if (ibuf.empty())
322 continue;
323 libmesh_assert_greater_equal (ibuf.front(), currenti);
324 libmesh_assert_greater_equal (ibuf.back(), ibuf.front());
325
326 std::size_t currentb = 0;
327 for (;currenti <= ibuf.back(); ++currenti)
328 {
329 if (sparse)
330 {
331 for (numeric_index_type j=0; j<this->n(); j++)
332 {
333 if (currentb < ibuf.size() &&
334 ibuf[currentb] == currenti &&
335 jbuf[currentb] == j)
336 {
337 os << currenti << " " << j << " " << cbuf[currentb] << std::endl;
338 currentb++;
339 }
340 }
341 }
342 else
343 {
344 for (auto j : make_range(this->n()))
345 {
346 if (currentb < ibuf.size() &&
347 ibuf[currentb] == currenti &&
348 jbuf[currentb] == j)
349 {
350 os << cbuf[currentb] << " ";
351 currentb++;
352 }
353 else
354 os << static_cast<T>(0.0) << " ";
355 }
356 os << std::endl;
357 }
358 }
359 }
360 if (!sparse)
361 {
362 for (; currenti != this->m(); ++currenti)
363 {
364 for (numeric_index_type j=0; j<this->n(); j++)
365 os << static_cast<T>(0.0) << " ";
366 os << std::endl;
367 }
368 }
369 }
370 else
371 {
372 std::vector<numeric_index_type> ibuf, jbuf;
373 std::vector<T> cbuf;
374
375 // We'll assume each processor has access to entire
376 // matrix rows, so (*this)(i,j) is valid if i is a local index.
377 for (numeric_index_type i : make_range(first_dof, end_dof))
378 {
379 for (auto j : make_range(this->n()))
380 {
381 T c = (*this)(i,j);
382 if (c != static_cast<T>(0.0))
383 {
384 ibuf.push_back(i);
385 jbuf.push_back(j);
386 cbuf.push_back(c);
387 }
388 }
389 }
390 this->comm().send(0,ibuf);
391 this->comm().send(0,jbuf);
392 this->comm().send(0,cbuf);
393 }
394}
uint8_t processor_id_type

◆ print_coreform_hdf5() [1/2]

template<typename T >
void libMesh::SparseMatrix< T >::print_coreform_hdf5 ( const std::string &  filename,
const std::string &  groupname = "extraction" 
) const
virtualinherited

Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm, putting CSR sparse matrix data in the group given by groupname.

Definition at line 521 of file sparse_matrix.C.

523{
524#if defined(LIBMESH_USE_COMPLEX_NUMBERS) || !defined(LIBMESH_HAVE_HDF5)
525 // TODO: HDF5 version 2.0.0 and later adds native support for
526 // complex numbers with the H5T_NATIVE_DOUBLE_COMPLEX type [0], so
527 // we could consider supporting T==std::complex<Real> in the future.
528 // [0]: https://forum.hdfgroup.org/t/coming-in-the-next-hdf5-release-native-support-for-complex-number-datatypes/13543
529 libmesh_ignore(filename, groupname);
530 libmesh_error_msg("ERROR: need HDF5 support to handle .h5 files!!!");
531#else
532 LOG_SCOPE("print_coreform_hdf5()", "SparseMatrix");
533
534 // In this implementation, we copy the SparseMatrix entries into a
535 // std::vector<double>, so this won't work for any Number type for
536 // which sizeof(Number) > sizeof(double).
537 if constexpr (sizeof(T) > sizeof(double))
538 libmesh_not_implemented();
539
540 const numeric_index_type first_dof = this->row_start(),
541 end_dof = this->row_stop();
542
543 std::vector<std::size_t> cols, row_offsets;
544 std::vector<double> vals;
545
546 if (this->processor_id() == 0)
547 row_offsets.push_back(0);
548
549 for (numeric_index_type i : make_range(first_dof, end_dof))
550 {
551 for (auto j : make_range(this->n()))
552 {
553 T c = (*this)(i,j);
554 if (c != static_cast<T>(0.0))
555 {
556 cols.push_back(j);
557 vals.push_back(c);
558 }
559 }
560 // This is a *local* row offset; proc 0 may need to adjust later
561 row_offsets.push_back(cols.size());
562 }
563
564 if (this->processor_id() == 0)
565 {
566 const hid_t file = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC,
567 H5P_DEFAULT, H5P_DEFAULT);
568 if (file == H5I_INVALID_HID)
569 libmesh_file_error(filename);
570
571 const hid_t group =
572 H5Gcreate2(file, groupname.c_str(), H5P_DEFAULT, H5P_DEFAULT,
573 H5P_DEFAULT);
574 check_open(filename, group, groupname);
575
576 auto write_size_attribute = [&filename, &group]
577 (const std::string & attribute_name, unsigned long long writeval)
578 {
579 const hid_t fspace = H5Screate(H5S_SCALAR);
580 check_hdf5(filename, fspace, attribute_name + " fspace");
581
582 const hid_t attr = H5Acreate2(group, attribute_name.c_str(),
583 H5T_STD_I64LE, fspace,
584 H5P_DEFAULT, H5P_DEFAULT);
585 check_hdf5(filename, attr, attribute_name);
586
587 // HDF5 is supposed to handle both upscaling and endianness
588 // conversions here
589 const herr_t errval = H5Awrite(attr, H5T_NATIVE_ULLONG, &writeval);
590 check_hdf5(filename, errval, attribute_name + " write");
591
592 H5Aclose(attr);
593 H5Sclose(fspace);
594 };
595
596 write_size_attribute("num_cols", this->n());
597 write_size_attribute("num_rows", this->m());
598
599 auto write_vector = [&filename, &group]
600 (const std::string & dataname, auto hdf5_file_type,
601 auto hdf5_native_type, auto & datavec)
602 {
603 const hsize_t len[1] = {cast_int<hsize_t>(datavec.size())};
604
605 const hid_t space = H5Screate_simple(1, len, nullptr);
606 check_hdf5(filename, space, dataname + " space");
607
608 const hid_t data =
609 H5Dcreate2(group, dataname.c_str(), hdf5_file_type, space,
610 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
611 check_hdf5(filename, data, dataname + " data");
612
613 const hid_t errval =
614 H5Dwrite(data, hdf5_native_type, H5S_ALL, H5S_ALL,
615 H5P_DEFAULT, datavec.data());
616 check_hdf5(filename, errval, dataname + " write");
617
618 H5Dclose(data);
619 H5Sclose(space);
620 };
621
622 std::vector<std::size_t> vals_sizes, first_dofs;
623 this->comm().gather(0, vals.size(), vals_sizes);
624 this->comm().gather(0, cast_int<std::size_t>(first_dof), first_dofs);
625 first_dofs.push_back(this->m());
626
627 this->comm().allgather(cols);
628 this->comm().allgather(vals);
629 this->comm().allgather(row_offsets);
630
631 libmesh_assert_equal_to(vals.size(),
632 cols.size());
633 libmesh_assert_equal_to(vals.size(),
634 std::accumulate(vals_sizes.begin(),
635 vals_sizes.end(),
636 std::size_t(0)));
637
638 std::size_t extra_offset = 0;
639 for (auto p : make_range(processor_id_type(1), this->n_processors()))
640 {
641 extra_offset += vals_sizes[p-1];
642 for (auto i : make_range(first_dofs[p]+1, first_dofs[p+1]+1))
643 row_offsets[i] += extra_offset;
644 }
645
646 write_vector("cols", H5T_STD_U64LE, H5T_NATIVE_ULLONG, cols);
647 write_vector("row_offsets", H5T_STD_U64LE, H5T_NATIVE_ULLONG, row_offsets);
648 write_vector("vals", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE, vals);
649
650 H5Gclose(group);
651 H5Fclose(file);
652 }
653 else
654 {
655 std::vector<std::size_t> dummy;
656 this->comm().gather(0, vals.size(), dummy);
657 this->comm().gather(0, cast_int<std::size_t>(first_dof), dummy);
658 this->comm().allgather(cols);
659 this->comm().allgather(vals);
660 this->comm().allgather(row_offsets);
661 }
662#endif // LIBMESH_HAVE_HDF5
663}
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
void allgather(const T &send_data, std::vector< T, A > &recv_data) const

◆ print_coreform_hdf5() [2/2]

void libMesh::SparseMatrix< Number >::print_coreform_hdf5 ( const std::string &  filename,
const std::string &  groupname = "extraction" 
) const
virtualinherited

Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm, putting CSR sparse matrix data in the group given by groupname.

Definition at line 461 of file sparse_matrix.C.

523{
524#if defined(LIBMESH_USE_COMPLEX_NUMBERS) || !defined(LIBMESH_HAVE_HDF5)
525 // TODO: HDF5 version 2.0.0 and later adds native support for
526 // complex numbers with the H5T_NATIVE_DOUBLE_COMPLEX type [0], so
527 // we could consider supporting T==std::complex<Real> in the future.
528 // [0]: https://forum.hdfgroup.org/t/coming-in-the-next-hdf5-release-native-support-for-complex-number-datatypes/13543
529 libmesh_ignore(filename, groupname);
530 libmesh_error_msg("ERROR: need HDF5 support to handle .h5 files!!!");
531#else
532 LOG_SCOPE("print_coreform_hdf5()", "SparseMatrix");
533
534 // In this implementation, we copy the SparseMatrix entries into a
535 // std::vector<double>, so this won't work for any Number type for
536 // which sizeof(Number) > sizeof(double).
537 if constexpr (sizeof(T) > sizeof(double))
538 libmesh_not_implemented();
539
540 const numeric_index_type first_dof = this->row_start(),
541 end_dof = this->row_stop();
542
543 std::vector<std::size_t> cols, row_offsets;
544 std::vector<double> vals;
545
546 if (this->processor_id() == 0)
547 row_offsets.push_back(0);
548
549 for (numeric_index_type i : make_range(first_dof, end_dof))
550 {
551 for (auto j : make_range(this->n()))
552 {
553 T c = (*this)(i,j);
554 if (c != static_cast<T>(0.0))
555 {
556 cols.push_back(j);
557 vals.push_back(c);
558 }
559 }
560 // This is a *local* row offset; proc 0 may need to adjust later
561 row_offsets.push_back(cols.size());
562 }
563
564 if (this->processor_id() == 0)
565 {
566 const hid_t file = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC,
567 H5P_DEFAULT, H5P_DEFAULT);
568 if (file == H5I_INVALID_HID)
569 libmesh_file_error(filename);
570
571 const hid_t group =
572 H5Gcreate2(file, groupname.c_str(), H5P_DEFAULT, H5P_DEFAULT,
573 H5P_DEFAULT);
574 check_open(filename, group, groupname);
575
576 auto write_size_attribute = [&filename, &group]
577 (const std::string & attribute_name, unsigned long long writeval)
578 {
579 const hid_t fspace = H5Screate(H5S_SCALAR);
580 check_hdf5(filename, fspace, attribute_name + " fspace");
581
582 const hid_t attr = H5Acreate2(group, attribute_name.c_str(),
583 H5T_STD_I64LE, fspace,
584 H5P_DEFAULT, H5P_DEFAULT);
585 check_hdf5(filename, attr, attribute_name);
586
587 // HDF5 is supposed to handle both upscaling and endianness
588 // conversions here
589 const herr_t errval = H5Awrite(attr, H5T_NATIVE_ULLONG, &writeval);
590 check_hdf5(filename, errval, attribute_name + " write");
591
592 H5Aclose(attr);
593 H5Sclose(fspace);
594 };
595
596 write_size_attribute("num_cols", this->n());
597 write_size_attribute("num_rows", this->m());
598
599 auto write_vector = [&filename, &group]
600 (const std::string & dataname, auto hdf5_file_type,
601 auto hdf5_native_type, auto & datavec)
602 {
603 const hsize_t len[1] = {cast_int<hsize_t>(datavec.size())};
604
605 const hid_t space = H5Screate_simple(1, len, nullptr);
606 check_hdf5(filename, space, dataname + " space");
607
608 const hid_t data =
609 H5Dcreate2(group, dataname.c_str(), hdf5_file_type, space,
610 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
611 check_hdf5(filename, data, dataname + " data");
612
613 const hid_t errval =
614 H5Dwrite(data, hdf5_native_type, H5S_ALL, H5S_ALL,
615 H5P_DEFAULT, datavec.data());
616 check_hdf5(filename, errval, dataname + " write");
617
618 H5Dclose(data);
619 H5Sclose(space);
620 };
621
622 std::vector<std::size_t> vals_sizes, first_dofs;
623 this->comm().gather(0, vals.size(), vals_sizes);
624 this->comm().gather(0, cast_int<std::size_t>(first_dof), first_dofs);
625 first_dofs.push_back(this->m());
626
627 this->comm().allgather(cols);
628 this->comm().allgather(vals);
629 this->comm().allgather(row_offsets);
630
631 libmesh_assert_equal_to(vals.size(),
632 cols.size());
633 libmesh_assert_equal_to(vals.size(),
634 std::accumulate(vals_sizes.begin(),
635 vals_sizes.end(),
636 std::size_t(0)));
637
638 std::size_t extra_offset = 0;
639 for (auto p : make_range(processor_id_type(1), this->n_processors()))
640 {
641 extra_offset += vals_sizes[p-1];
642 for (auto i : make_range(first_dofs[p]+1, first_dofs[p+1]+1))
643 row_offsets[i] += extra_offset;
644 }
645
646 write_vector("cols", H5T_STD_U64LE, H5T_NATIVE_ULLONG, cols);
647 write_vector("row_offsets", H5T_STD_U64LE, H5T_NATIVE_ULLONG, row_offsets);
648 write_vector("vals", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE, vals);
649
650 H5Gclose(group);
651 H5Fclose(file);
652 }
653 else
654 {
655 std::vector<std::size_t> dummy;
656 this->comm().gather(0, vals.size(), dummy);
657 this->comm().gather(0, cast_int<std::size_t>(first_dof), dummy);
658 this->comm().allgather(cols);
659 this->comm().allgather(vals);
660 this->comm().allgather(row_offsets);
661 }
662#endif // LIBMESH_HAVE_HDF5
663}

◆ print_info() [1/2]

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

82{
84 out_stream << ReferenceCounter::get_info();
85}
static std::string get_info()
Gets a string containing the reference information.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ print_info() [2/2]

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

82{
84 out_stream << ReferenceCounter::get_info();
85}

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ print_matlab() [1/2]

void libMesh::SparseMatrix< Number >::print_matlab ( const std::string &  name = "") const
virtualinherited

Print the contents of the matrix in Matlab's sparse matrix format.

Optionally prints the matrix to the file named name. If name is not specified it is dumped to the screen.

Definition at line 469 of file sparse_matrix.C.

399{
400 parallel_object_only();
401
402 libmesh_assert (this->initialized());
403
404 const numeric_index_type first_dof = this->row_start(),
405 end_dof = this->row_stop();
406
407 // We'll print the matrix from processor 0 to make sure
408 // it's serialized properly
409 if (this->processor_id() == 0)
410 {
411 std::unique_ptr<std::ofstream> file;
412
413 if (name != "")
414 file = std::make_unique<std::ofstream>(name.c_str());
415
416 std::ostream & os = (name == "") ? libMesh::out : *file;
417
418 std::size_t sparsity_nonzeros = this->n_nonzeros();
419
420 std::size_t real_nonzeros = 0;
421
422 libmesh_assert_equal_to(first_dof, 0);
423 for (numeric_index_type i : make_range(end_dof))
424 {
425 for (auto j : make_range(this->n()))
426 {
427 T c = (*this)(i,j);
428 if (c != static_cast<T>(0.0))
429 ++real_nonzeros;
430 }
431 }
432
433
434 for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
435 {
436 std::size_t nonzeros_on_p = 0;
437 this->comm().receive(p, nonzeros_on_p);
438 real_nonzeros += nonzeros_on_p;
439 }
440
441 if (sparsity_nonzeros &&
442 sparsity_nonzeros != real_nonzeros)
443 libmesh_warning(sparsity_nonzeros <<
444 " nonzeros allocated, but " <<
445 real_nonzeros << " used.");
446
447 // We probably want to be more consistent than that, if our
448 // sparsity is overallocated.
449
450 // Print a header similar to PETSc's mat_view ascii_matlab
451 os << "%Mat Object: () " << this->n_processors() << " MPI processes\n"
452 << "% type: " << (this->n_processors() > 1 ? "mpi" : "seq") << "aij\n"
453 << "% Size = " << this->m() << ' ' << this->n() << '\n'
454 << "% Nonzeros = " << real_nonzeros << '\n'
455 << "zzz = zeros(" << real_nonzeros << ",3);\n"
456 << "zzz = [\n";
457
458 for (numeric_index_type i : make_range(end_dof))
459 {
460 // FIXME - we need a base class way to iterate over a
461 // SparseMatrix row.
462 for (auto j : make_range(this->n()))
463 {
464 T c = (*this)(i,j);
465 if (c != static_cast<T>(0.0))
466 {
467 // Convert from 0-based to 1-based indexing
468 os << (i+1) << ' ' << (j+1) << " " << c << '\n';
469 }
470 }
471 }
472
473 std::vector<numeric_index_type> ibuf, jbuf;
474 std::vector<T> cbuf;
475 for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
476 {
477 this->comm().receive(p, ibuf);
478 this->comm().receive(p, jbuf);
479 this->comm().receive(p, cbuf);
480 libmesh_assert_equal_to (ibuf.size(), jbuf.size());
481 libmesh_assert_equal_to (ibuf.size(), cbuf.size());
482
483 for (auto n : index_range(ibuf))
484 os << ibuf[n] << ' ' << jbuf[n] << " " << cbuf[n] << '\n';
485 }
486
487 os << "];\n" << "Mat_sparse = spconvert(zzz);" << std::endl;
488 }
489 else
490 {
491 std::vector<numeric_index_type> ibuf, jbuf;
492 std::vector<T> cbuf;
493 std::size_t my_nonzeros = 0;
494
495 // We'll assume each processor has access to entire
496 // matrix rows, so (*this)(i,j) is valid if i is a local index.
497 for (numeric_index_type i : make_range(first_dof, end_dof))
498 {
499 for (auto j : make_range(this->n()))
500 {
501 T c = (*this)(i,j);
502 if (c != static_cast<T>(0.0))
503 {
504 ibuf.push_back(i);
505 jbuf.push_back(j);
506 cbuf.push_back(c);
507 ++my_nonzeros;
508 }
509 }
510 }
511 this->comm().send(0,my_nonzeros);
512 this->comm().send(0,ibuf);
513 this->comm().send(0,jbuf);
514 this->comm().send(0,cbuf);
515 }
516}
virtual std::size_t n_nonzeros() 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:153
OStreamProxy out

◆ print_matlab() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::print_matlab ( const std::string &  name = "") const
virtualinherited

Print the contents of the matrix in Matlab's sparse matrix format.

Optionally prints the matrix to the file named name. If name is not specified it is dumped to the screen.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 398 of file sparse_matrix.C.

399{
400 parallel_object_only();
401
402 libmesh_assert (this->initialized());
403
404 const numeric_index_type first_dof = this->row_start(),
405 end_dof = this->row_stop();
406
407 // We'll print the matrix from processor 0 to make sure
408 // it's serialized properly
409 if (this->processor_id() == 0)
410 {
411 std::unique_ptr<std::ofstream> file;
412
413 if (name != "")
414 file = std::make_unique<std::ofstream>(name.c_str());
415
416 std::ostream & os = (name == "") ? libMesh::out : *file;
417
418 std::size_t sparsity_nonzeros = this->n_nonzeros();
419
420 std::size_t real_nonzeros = 0;
421
422 libmesh_assert_equal_to(first_dof, 0);
423 for (numeric_index_type i : make_range(end_dof))
424 {
425 for (auto j : make_range(this->n()))
426 {
427 T c = (*this)(i,j);
428 if (c != static_cast<T>(0.0))
429 ++real_nonzeros;
430 }
431 }
432
433
434 for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
435 {
436 std::size_t nonzeros_on_p = 0;
437 this->comm().receive(p, nonzeros_on_p);
438 real_nonzeros += nonzeros_on_p;
439 }
440
441 if (sparsity_nonzeros &&
442 sparsity_nonzeros != real_nonzeros)
443 libmesh_warning(sparsity_nonzeros <<
444 " nonzeros allocated, but " <<
445 real_nonzeros << " used.");
446
447 // We probably want to be more consistent than that, if our
448 // sparsity is overallocated.
449
450 // Print a header similar to PETSc's mat_view ascii_matlab
451 os << "%Mat Object: () " << this->n_processors() << " MPI processes\n"
452 << "% type: " << (this->n_processors() > 1 ? "mpi" : "seq") << "aij\n"
453 << "% Size = " << this->m() << ' ' << this->n() << '\n'
454 << "% Nonzeros = " << real_nonzeros << '\n'
455 << "zzz = zeros(" << real_nonzeros << ",3);\n"
456 << "zzz = [\n";
457
458 for (numeric_index_type i : make_range(end_dof))
459 {
460 // FIXME - we need a base class way to iterate over a
461 // SparseMatrix row.
462 for (auto j : make_range(this->n()))
463 {
464 T c = (*this)(i,j);
465 if (c != static_cast<T>(0.0))
466 {
467 // Convert from 0-based to 1-based indexing
468 os << (i+1) << ' ' << (j+1) << " " << c << '\n';
469 }
470 }
471 }
472
473 std::vector<numeric_index_type> ibuf, jbuf;
474 std::vector<T> cbuf;
475 for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
476 {
477 this->comm().receive(p, ibuf);
478 this->comm().receive(p, jbuf);
479 this->comm().receive(p, cbuf);
480 libmesh_assert_equal_to (ibuf.size(), jbuf.size());
481 libmesh_assert_equal_to (ibuf.size(), cbuf.size());
482
483 for (auto n : index_range(ibuf))
484 os << ibuf[n] << ' ' << jbuf[n] << " " << cbuf[n] << '\n';
485 }
486
487 os << "];\n" << "Mat_sparse = spconvert(zzz);" << std::endl;
488 }
489 else
490 {
491 std::vector<numeric_index_type> ibuf, jbuf;
492 std::vector<T> cbuf;
493 std::size_t my_nonzeros = 0;
494
495 // We'll assume each processor has access to entire
496 // matrix rows, so (*this)(i,j) is valid if i is a local index.
497 for (numeric_index_type i : make_range(first_dof, end_dof))
498 {
499 for (auto j : make_range(this->n()))
500 {
501 T c = (*this)(i,j);
502 if (c != static_cast<T>(0.0))
503 {
504 ibuf.push_back(i);
505 jbuf.push_back(j);
506 cbuf.push_back(c);
507 ++my_nonzeros;
508 }
509 }
510 }
511 this->comm().send(0,my_nonzeros);
512 this->comm().send(0,ibuf);
513 this->comm().send(0,jbuf);
514 this->comm().send(0,cbuf);
515 }
516}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ print_personal() [1/2]

virtual void libMesh::StaticCondensation::print_personal ( std::ostream &  os = libMesh::out) const
inlineoverridevirtual

Print the contents of the matrix to the screen in a package-personalized style, if available.

Implements libMesh::SparseMatrix< T >.

Definition at line 396 of file static_condensation.h.

397 {
398 libmesh_not_implemented();
399 }

◆ print_personal() [2/2]

void libMesh::StaticCondensation::print_personal ( std::ostream &  os = libMesh::out) const
overridevirtual

Print the contents of the matrix to the screen in a package-personalized style, if available.

Implements libMesh::SparseMatrix< T >.

Definition at line 359 of file static_condensation.C.

359{ libmesh_not_implemented(); }

◆ print_petsc_binary() [1/2]

void libMesh::SparseMatrix< Number >::print_petsc_binary ( const std::string &  filename) const
virtualinherited

Write the contents of the matrix to a file in PETSc's binary sparse matrix format.

Definition at line 475 of file sparse_matrix.C.

669{
670 libmesh_not_implemented_msg
671 ("libMesh cannot write PETSc binary-format files from non-PETSc matrices");
672}

◆ print_petsc_binary() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::print_petsc_binary ( const std::string &  filename) const
virtualinherited

Write the contents of the matrix to a file in PETSc's binary sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 668 of file sparse_matrix.C.

669{
670 libmesh_not_implemented_msg
671 ("libMesh cannot write PETSc binary-format files from non-PETSc matrices");
672}

◆ print_petsc_hdf5() [1/2]

void libMesh::SparseMatrix< Number >::print_petsc_hdf5 ( const std::string &  filename) const
virtualinherited

Write the contents of the matrix to a file in PETSc's HDF5 sparse matrix format.

Definition at line 481 of file sparse_matrix.C.

678{
679 libmesh_not_implemented_msg
680 ("libMesh cannot write PETSc HDF5-format files from non-PETSc matrices");
681}

◆ print_petsc_hdf5() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::print_petsc_hdf5 ( const std::string &  filename) const
virtualinherited

Write the contents of the matrix to a file in PETSc's HDF5 sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 677 of file sparse_matrix.C.

678{
679 libmesh_not_implemented_msg
680 ("libMesh cannot write PETSc HDF5-format files from non-PETSc matrices");
681}

◆ processor_id() [1/2]

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(), libMesh::StaticCondensationDofMap::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().

◆ processor_id() [2/2]

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()); }

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(), libMesh::StaticCondensationDofMap::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().

◆ read() [1/2]

void libMesh::SparseMatrix< Number >::read ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file, with the file format inferred from the extension of filename.

Definition at line 487 of file sparse_matrix.C.

687{
688 {
689 std::ifstream in (filename.c_str());
690 libmesh_error_msg_if
691 (!in.good(), "ERROR: cannot read file:\n\t" <<
692 filename);
693 }
694
695 std::string_view basename = Utility::basename_of(filename);
696
697 const bool gzipped_file = Utility::ends_with(filename, ".gz");
698
699 if (gzipped_file)
700 basename.remove_suffix(3);
701
702 if (Utility::ends_with(basename, ".matlab") ||
703 Utility::ends_with(basename, ".m"))
704 this->read_matlab(filename);
705 else if (Utility::ends_with(basename, ".petsc64"))
706 {
707#ifndef LIBMESH_HAVE_PETSC
708 libmesh_error_msg("Cannot load PETSc matrix file " <<
709 filename << " without PETSc-enabled libMesh.");
710#elif LIBMESH_DOF_ID_BYTES != 8
711 libmesh_error_msg("Cannot load 64-bit PETSc matrix file " <<
712 filename << " with non-64-bit libMesh.");
713#endif
714 if (gzipped_file)
715 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
716 this->read_petsc_binary(filename);
717 }
718 else if (Utility::ends_with(basename, ".petsc32"))
719 {
720#ifndef LIBMESH_HAVE_PETSC
721 libmesh_error_msg("Cannot load PETSc matrix file " <<
722 filename << " without PETSc-enabled libMesh.");
723#elif LIBMESH_DOF_ID_BYTES != 4
724 libmesh_error_msg("Cannot load 32-bit PETSc matrix file " <<
725 filename << " with non-32-bit libMesh.");
726#endif
727 if (gzipped_file)
728 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
729 this->read_petsc_binary(filename);
730 }
731 else if (Utility::ends_with(basename, ".h5"))
732 {
733 if (gzipped_file)
734 libmesh_not_implemented_msg("Gzipped HDF5 matrices are not currently supported");
735 this->read_coreform_hdf5(filename);
736 }
737 else
738 libmesh_error_msg(" ERROR: Unrecognized matrix file extension on: "
739 << basename
740 << "\n I understand the following:\n\n"
741 << " *.h5 -- CoreForm HDF5 sparse matrix format\n"
742 << " *.matlab -- Matlab sparse matrix format\n"
743 << " *.matlab.gz -- Matlab sparse matrix format, gzipped\n"
744 << " *.m -- Matlab sparse matrix format\n"
745 << " *.m.gz -- Matlab sparse matrix format, gzipped\n"
746 << " *.petsc32 -- PETSc binary format, 32-bit\n"
747 << " *.petsc64 -- PETSc binary format, 64-bit\n"
748 );
749}
virtual void read_coreform_hdf5(const std::string &filename, const std::string &groupname="extraction")
Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm,...
virtual void read_matlab(const std::string &filename)
Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc.
virtual void read_petsc_binary(const std::string &filename)
Read the contents of the matrix from a file in PETSc's binary sparse matrix format.

◆ read() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::read ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file, with the file format inferred from the extension of filename.

Definition at line 686 of file sparse_matrix.C.

687{
688 {
689 std::ifstream in (filename.c_str());
690 libmesh_error_msg_if
691 (!in.good(), "ERROR: cannot read file:\n\t" <<
692 filename);
693 }
694
695 std::string_view basename = Utility::basename_of(filename);
696
697 const bool gzipped_file = Utility::ends_with(filename, ".gz");
698
699 if (gzipped_file)
700 basename.remove_suffix(3);
701
702 if (Utility::ends_with(basename, ".matlab") ||
703 Utility::ends_with(basename, ".m"))
704 this->read_matlab(filename);
705 else if (Utility::ends_with(basename, ".petsc64"))
706 {
707#ifndef LIBMESH_HAVE_PETSC
708 libmesh_error_msg("Cannot load PETSc matrix file " <<
709 filename << " without PETSc-enabled libMesh.");
710#elif LIBMESH_DOF_ID_BYTES != 8
711 libmesh_error_msg("Cannot load 64-bit PETSc matrix file " <<
712 filename << " with non-64-bit libMesh.");
713#endif
714 if (gzipped_file)
715 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
716 this->read_petsc_binary(filename);
717 }
718 else if (Utility::ends_with(basename, ".petsc32"))
719 {
720#ifndef LIBMESH_HAVE_PETSC
721 libmesh_error_msg("Cannot load PETSc matrix file " <<
722 filename << " without PETSc-enabled libMesh.");
723#elif LIBMESH_DOF_ID_BYTES != 4
724 libmesh_error_msg("Cannot load 32-bit PETSc matrix file " <<
725 filename << " with non-32-bit libMesh.");
726#endif
727 if (gzipped_file)
728 libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
729 this->read_petsc_binary(filename);
730 }
731 else if (Utility::ends_with(basename, ".h5"))
732 {
733 if (gzipped_file)
734 libmesh_not_implemented_msg("Gzipped HDF5 matrices are not currently supported");
735 this->read_coreform_hdf5(filename);
736 }
737 else
738 libmesh_error_msg(" ERROR: Unrecognized matrix file extension on: "
739 << basename
740 << "\n I understand the following:\n\n"
741 << " *.h5 -- CoreForm HDF5 sparse matrix format\n"
742 << " *.matlab -- Matlab sparse matrix format\n"
743 << " *.matlab.gz -- Matlab sparse matrix format, gzipped\n"
744 << " *.m -- Matlab sparse matrix format\n"
745 << " *.m.gz -- Matlab sparse matrix format, gzipped\n"
746 << " *.petsc32 -- PETSc binary format, 32-bit\n"
747 << " *.petsc64 -- PETSc binary format, 64-bit\n"
748 );
749}

References libMesh::Utility::basename_of(), and libMesh::Utility::ends_with().

◆ read_coreform_hdf5() [1/2]

template<typename T >
void libMesh::SparseMatrix< T >::read_coreform_hdf5 ( const std::string &  filename,
const std::string &  groupname = "extraction" 
)
virtualinherited

Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm, expecing sparse matrix data in the group given by groupname.

This will be initialized with the sparsity from the file, linearly partitioned onto the number of processors available unless this matrix is pre-sized and pre-partitionsed.

Definition at line 822 of file sparse_matrix.C.

824{
825#ifndef LIBMESH_HAVE_HDF5
826 libmesh_ignore(filename, groupname);
827 libmesh_error_msg("ERROR: need HDF5 support to handle .h5 files!!!");
828#else
829 LOG_SCOPE("read_coreform_hdf5()", "SparseMatrix");
830
831 std::size_t num_rows = 0, num_cols = 0;
832
833 // These are only used on pid 0, but avoid "uninitialized" warnings
834 hid_t group = H5I_INVALID_HID;
835 hid_t file = H5I_INVALID_HID;
836
837 if (this->processor_id() == 0)
838 {
839 file = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
840
841 if (file == H5I_INVALID_HID)
842 libmesh_file_error(filename);
843
844 group = H5Gopen(file, groupname.c_str(), H5P_DEFAULT);
845 check_open(filename, group, groupname);
846
847 auto read_size_attribute = [&filename, &group]
848 (const std::string & attribute_name)
849 {
850 unsigned long long returnval = 0;
851
852 const hid_t attr = H5Aopen(group, attribute_name.c_str(), H5P_DEFAULT);
853 check_open(filename, attr, attribute_name);
854
855 const hid_t attr_type = H5Aget_type(attr);
856 check_hdf5(filename, attr_type, attribute_name + " type");
857
858 // HDF5 will convert between the file's integer type and ours, but
859 // we do expect an integer type.
860 if (H5Tget_class(attr_type) != H5T_INTEGER)
861 libmesh_error_msg("Non-integer type for " + attribute_name + " in " + filename);
862
863 H5Tclose(attr_type);
864
865 // HDF5 is supposed to handle both upscaling and endianness
866 // conversions here
867 const herr_t errval = H5Aread(attr, H5T_NATIVE_ULLONG, &returnval);
868 check_hdf5(filename, errval, attribute_name + " read");
869
870 H5Aclose(attr);
871
872 return returnval;
873 };
874
875 num_cols = read_size_attribute("num_cols");
876 num_rows = read_size_attribute("num_rows");
877
878 this->comm().broadcast(num_cols);
879 this->comm().broadcast(num_rows);
880 }
881 else
882 {
883 this->comm().broadcast(num_cols);
884 this->comm().broadcast(num_rows);
885 }
886
887 numeric_index_type new_row_start, new_row_stop,
888 new_col_start, new_col_stop;
889
890 // If we need to reinit, we need to determine which rows+columns
891 // each processor is in charge of.
892 std::vector<numeric_index_type> new_row_starts, new_row_stops,
893 new_col_starts, new_col_stops;
894
895 if (this->initialized() &&
896 num_cols == this->n() &&
897 num_rows == this->m())
898 {
899 new_row_start = this->row_start(),
900 new_row_stop = this->row_stop();
901
902 new_col_start = this->col_start(),
903 new_col_stop = this->col_stop();
904 }
905 else
906 {
907 // Determine which rows/columns each processor will be in charge of
908 new_row_start = this->processor_id() * num_rows / this->n_processors(),
909 new_row_stop = (this->processor_id()+1) * num_rows / this->n_processors();
910
911 new_col_start = this->processor_id() * num_cols / this->n_processors(),
912 new_col_stop = (this->processor_id()+1) * num_cols / this->n_processors();
913 }
914
915 this->comm().gather(0, new_row_start, new_row_starts);
916 this->comm().gather(0, new_row_stop, new_row_stops);
917 this->comm().gather(0, new_col_start, new_col_starts);
918 this->comm().gather(0, new_col_stop, new_col_stops);
919
920 numeric_index_type on_diagonal_nonzeros = 0,
921 off_diagonal_nonzeros = 0;
922
923 std::vector<std::size_t> cols, row_offsets;
924 std::vector<double> vals;
925
926 if (this->processor_id() == 0)
927 {
928 auto read_vector = [&filename, &group]
929 (const std::string & dataname, auto hdf5_class,
930 auto hdf5_type, auto & datavec)
931 {
932 const hid_t data = H5Dopen1(group, dataname.c_str());
933 check_open(filename, data, dataname.c_str());
934
935 const hid_t data_type = H5Dget_type(data);
936 check_hdf5(filename, data_type, dataname + " type");
937
938 // HDF5 will convert between the file's integer type and ours, but
939 // we do expect an integer type.
940 if (H5Tget_class(data_type) != hdf5_class)
941 libmesh_error_msg("Unexpected type for " + dataname + " in " + filename);
942
943 H5Tclose(data_type);
944
945 const hid_t dataspace = H5Dget_space(data);
946 check_hdf5(filename, dataspace, dataname + " space");
947
948 int ndims = H5Sget_simple_extent_ndims(dataspace);
949 if (ndims != 1)
950 libmesh_error_msg("Non-vector space for " + dataname + " in " + filename);
951
952 hsize_t len, maxlen;
953 herr_t errval = H5Sget_simple_extent_dims(dataspace, &len, &maxlen);
954 check_hdf5(filename, errval, dataname + " dims");
955
956 datavec.resize(len);
957
958 errval = H5Dread(data, hdf5_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, datavec.data());
959 check_hdf5(filename, errval, dataname + " read");
960
961 H5Dclose(data);
962 };
963
964 read_vector("cols", H5T_INTEGER, H5T_NATIVE_ULLONG, cols);
965 read_vector("row_offsets", H5T_INTEGER, H5T_NATIVE_ULLONG, row_offsets);
966 read_vector("vals", H5T_FLOAT, H5T_NATIVE_DOUBLE, vals);
967
968 if (cols.size() != vals.size())
969 libmesh_error_msg("Inconsistent cols/vals sizes in " + filename);
970
971 if (row_offsets.size() != num_rows + 1)
972 libmesh_error_msg("Inconsistent row_offsets size in " + filename);
973
974 // Data for the row we're working on
975 numeric_index_type current_row = 0;
976 processor_id_type current_proc = 0;
977 numeric_index_type current_on_diagonal_nonzeros = 0;
978 numeric_index_type current_off_diagonal_nonzeros = 0;
979 if (row_offsets[0] != 0)
980 libmesh_error_msg("Unexpected row_offsets[0] in " + filename);
981
982 for (auto i : index_range(cols))
983 {
984 while (row_offsets[current_row+1] <= i)
985 {
986 ++current_row;
987 if (row_offsets[current_row] < row_offsets[current_row-1])
988 libmesh_error_msg("Non-monotonic row_offsets in " + filename);
989 current_on_diagonal_nonzeros = 0;
990 current_off_diagonal_nonzeros = 0;
991 }
992
993 while (current_row >= new_row_stops[current_proc])
994 ++current_proc;
995
996 // 0-based indexing in file
997 if (cols[i] >= new_col_starts[current_proc] &&
998 cols[i] < new_col_stops[current_proc])
999 {
1000 ++current_on_diagonal_nonzeros;
1001 on_diagonal_nonzeros =
1002 std::max(on_diagonal_nonzeros,
1003 current_on_diagonal_nonzeros);
1004 }
1005 else
1006 {
1007 ++current_off_diagonal_nonzeros;
1008 off_diagonal_nonzeros =
1009 std::max(off_diagonal_nonzeros,
1010 current_off_diagonal_nonzeros);
1011 }
1012 }
1013 }
1014
1015 this->comm().broadcast(on_diagonal_nonzeros);
1016 this->comm().broadcast(off_diagonal_nonzeros);
1017
1018 this->init(num_rows, num_cols,
1019 new_row_stop-new_row_start,
1020 new_col_stop-new_col_start,
1021 on_diagonal_nonzeros,
1022 off_diagonal_nonzeros);
1023
1024 // Set the matrix values last.
1025 if (this->processor_id() == 0)
1026 {
1027 numeric_index_type current_row = 0;
1028 for (auto i : index_range(cols))
1029 {
1030 while (row_offsets[current_row+1] <= i)
1031 {
1032 ++current_row;
1033 libmesh_assert_greater_equal (row_offsets[current_row],
1034 row_offsets[current_row-1]);
1035 }
1036 this->set(current_row, cols[i], vals[i]);
1037 }
1038
1039 H5Gclose(group);
1040 H5Fclose(file);
1041 }
1042
1043 this->close();
1044#endif // LIBMESH_HAVE_HDF5
1045}
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
virtual void init(const numeric_index_type m, const numeric_index_type n, const numeric_index_type m_l, const numeric_index_type n_l, const numeric_index_type nnz=30, const numeric_index_type noz=10, const numeric_index_type blocksize=1)=0
Initialize SparseMatrix with the specified sizes.
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value)=0
Set the element (i,j) to value.
MPI_Datatype data_type

References libMesh::index_range(), libMesh::initialized(), and libMesh::libmesh_ignore().

◆ read_coreform_hdf5() [2/2]

void libMesh::SparseMatrix< Number >::read_coreform_hdf5 ( const std::string &  filename,
const std::string &  groupname = "extraction" 
)
virtualinherited

Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm, expecing sparse matrix data in the group given by groupname.

This will be initialized with the sparsity from the file, linearly partitioned onto the number of processors available unless this matrix is pre-sized and pre-partitionsed.

Definition at line 498 of file sparse_matrix.C.

824{
825#ifndef LIBMESH_HAVE_HDF5
826 libmesh_ignore(filename, groupname);
827 libmesh_error_msg("ERROR: need HDF5 support to handle .h5 files!!!");
828#else
829 LOG_SCOPE("read_coreform_hdf5()", "SparseMatrix");
830
831 std::size_t num_rows = 0, num_cols = 0;
832
833 // These are only used on pid 0, but avoid "uninitialized" warnings
834 hid_t group = H5I_INVALID_HID;
835 hid_t file = H5I_INVALID_HID;
836
837 if (this->processor_id() == 0)
838 {
839 file = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
840
841 if (file == H5I_INVALID_HID)
842 libmesh_file_error(filename);
843
844 group = H5Gopen(file, groupname.c_str(), H5P_DEFAULT);
845 check_open(filename, group, groupname);
846
847 auto read_size_attribute = [&filename, &group]
848 (const std::string & attribute_name)
849 {
850 unsigned long long returnval = 0;
851
852 const hid_t attr = H5Aopen(group, attribute_name.c_str(), H5P_DEFAULT);
853 check_open(filename, attr, attribute_name);
854
855 const hid_t attr_type = H5Aget_type(attr);
856 check_hdf5(filename, attr_type, attribute_name + " type");
857
858 // HDF5 will convert between the file's integer type and ours, but
859 // we do expect an integer type.
860 if (H5Tget_class(attr_type) != H5T_INTEGER)
861 libmesh_error_msg("Non-integer type for " + attribute_name + " in " + filename);
862
863 H5Tclose(attr_type);
864
865 // HDF5 is supposed to handle both upscaling and endianness
866 // conversions here
867 const herr_t errval = H5Aread(attr, H5T_NATIVE_ULLONG, &returnval);
868 check_hdf5(filename, errval, attribute_name + " read");
869
870 H5Aclose(attr);
871
872 return returnval;
873 };
874
875 num_cols = read_size_attribute("num_cols");
876 num_rows = read_size_attribute("num_rows");
877
878 this->comm().broadcast(num_cols);
879 this->comm().broadcast(num_rows);
880 }
881 else
882 {
883 this->comm().broadcast(num_cols);
884 this->comm().broadcast(num_rows);
885 }
886
887 numeric_index_type new_row_start, new_row_stop,
888 new_col_start, new_col_stop;
889
890 // If we need to reinit, we need to determine which rows+columns
891 // each processor is in charge of.
892 std::vector<numeric_index_type> new_row_starts, new_row_stops,
893 new_col_starts, new_col_stops;
894
895 if (this->initialized() &&
896 num_cols == this->n() &&
897 num_rows == this->m())
898 {
899 new_row_start = this->row_start(),
900 new_row_stop = this->row_stop();
901
902 new_col_start = this->col_start(),
903 new_col_stop = this->col_stop();
904 }
905 else
906 {
907 // Determine which rows/columns each processor will be in charge of
908 new_row_start = this->processor_id() * num_rows / this->n_processors(),
909 new_row_stop = (this->processor_id()+1) * num_rows / this->n_processors();
910
911 new_col_start = this->processor_id() * num_cols / this->n_processors(),
912 new_col_stop = (this->processor_id()+1) * num_cols / this->n_processors();
913 }
914
915 this->comm().gather(0, new_row_start, new_row_starts);
916 this->comm().gather(0, new_row_stop, new_row_stops);
917 this->comm().gather(0, new_col_start, new_col_starts);
918 this->comm().gather(0, new_col_stop, new_col_stops);
919
920 numeric_index_type on_diagonal_nonzeros = 0,
921 off_diagonal_nonzeros = 0;
922
923 std::vector<std::size_t> cols, row_offsets;
924 std::vector<double> vals;
925
926 if (this->processor_id() == 0)
927 {
928 auto read_vector = [&filename, &group]
929 (const std::string & dataname, auto hdf5_class,
930 auto hdf5_type, auto & datavec)
931 {
932 const hid_t data = H5Dopen1(group, dataname.c_str());
933 check_open(filename, data, dataname.c_str());
934
935 const hid_t data_type = H5Dget_type(data);
936 check_hdf5(filename, data_type, dataname + " type");
937
938 // HDF5 will convert between the file's integer type and ours, but
939 // we do expect an integer type.
940 if (H5Tget_class(data_type) != hdf5_class)
941 libmesh_error_msg("Unexpected type for " + dataname + " in " + filename);
942
943 H5Tclose(data_type);
944
945 const hid_t dataspace = H5Dget_space(data);
946 check_hdf5(filename, dataspace, dataname + " space");
947
948 int ndims = H5Sget_simple_extent_ndims(dataspace);
949 if (ndims != 1)
950 libmesh_error_msg("Non-vector space for " + dataname + " in " + filename);
951
952 hsize_t len, maxlen;
953 herr_t errval = H5Sget_simple_extent_dims(dataspace, &len, &maxlen);
954 check_hdf5(filename, errval, dataname + " dims");
955
956 datavec.resize(len);
957
958 errval = H5Dread(data, hdf5_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, datavec.data());
959 check_hdf5(filename, errval, dataname + " read");
960
961 H5Dclose(data);
962 };
963
964 read_vector("cols", H5T_INTEGER, H5T_NATIVE_ULLONG, cols);
965 read_vector("row_offsets", H5T_INTEGER, H5T_NATIVE_ULLONG, row_offsets);
966 read_vector("vals", H5T_FLOAT, H5T_NATIVE_DOUBLE, vals);
967
968 if (cols.size() != vals.size())
969 libmesh_error_msg("Inconsistent cols/vals sizes in " + filename);
970
971 if (row_offsets.size() != num_rows + 1)
972 libmesh_error_msg("Inconsistent row_offsets size in " + filename);
973
974 // Data for the row we're working on
975 numeric_index_type current_row = 0;
976 processor_id_type current_proc = 0;
977 numeric_index_type current_on_diagonal_nonzeros = 0;
978 numeric_index_type current_off_diagonal_nonzeros = 0;
979 if (row_offsets[0] != 0)
980 libmesh_error_msg("Unexpected row_offsets[0] in " + filename);
981
982 for (auto i : index_range(cols))
983 {
984 while (row_offsets[current_row+1] <= i)
985 {
986 ++current_row;
987 if (row_offsets[current_row] < row_offsets[current_row-1])
988 libmesh_error_msg("Non-monotonic row_offsets in " + filename);
989 current_on_diagonal_nonzeros = 0;
990 current_off_diagonal_nonzeros = 0;
991 }
992
993 while (current_row >= new_row_stops[current_proc])
994 ++current_proc;
995
996 // 0-based indexing in file
997 if (cols[i] >= new_col_starts[current_proc] &&
998 cols[i] < new_col_stops[current_proc])
999 {
1000 ++current_on_diagonal_nonzeros;
1001 on_diagonal_nonzeros =
1002 std::max(on_diagonal_nonzeros,
1003 current_on_diagonal_nonzeros);
1004 }
1005 else
1006 {
1007 ++current_off_diagonal_nonzeros;
1008 off_diagonal_nonzeros =
1009 std::max(off_diagonal_nonzeros,
1010 current_off_diagonal_nonzeros);
1011 }
1012 }
1013 }
1014
1015 this->comm().broadcast(on_diagonal_nonzeros);
1016 this->comm().broadcast(off_diagonal_nonzeros);
1017
1018 this->init(num_rows, num_cols,
1019 new_row_stop-new_row_start,
1020 new_col_stop-new_col_start,
1021 on_diagonal_nonzeros,
1022 off_diagonal_nonzeros);
1023
1024 // Set the matrix values last.
1025 if (this->processor_id() == 0)
1026 {
1027 numeric_index_type current_row = 0;
1028 for (auto i : index_range(cols))
1029 {
1030 while (row_offsets[current_row+1] <= i)
1031 {
1032 ++current_row;
1033 libmesh_assert_greater_equal (row_offsets[current_row],
1034 row_offsets[current_row-1]);
1035 }
1036 this->set(current_row, cols[i], vals[i]);
1037 }
1038
1039 H5Gclose(group);
1040 H5Fclose(file);
1041 }
1042
1043 this->close();
1044#endif // LIBMESH_HAVE_HDF5
1045}

◆ read_matlab() [1/2]

void libMesh::SparseMatrix< Number >::read_matlab ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc.

If the size and sparsity of the matrix in filename appears consistent with the existing sparsity of this then the existing parallel decomposition and sparsity will be retained. If not, then this will be initialized with the sparsity from the file, linearly partitioned onto the number of processors available.

Definition at line 512 of file sparse_matrix.C.

1051{
1052 LOG_SCOPE("read_matlab()", "SparseMatrix");
1053
1054#ifndef LIBMESH_HAVE_CXX11_REGEX
1055 libmesh_not_implemented(); // What is your compiler?!? Email us!
1056 libmesh_ignore(filename);
1057#else
1058 parallel_object_only();
1059
1060 const bool gzipped_file = Utility::ends_with(filename, ".gz");
1061
1062 // The sizes we get from the file
1063 std::size_t m = 0,
1064 n = 0;
1065
1066 // If we don't already have this size, we'll need to reinit, and
1067 // determine which rows+columns each processor is in charge of.
1068 std::vector<numeric_index_type> new_row_starts, new_row_stops,
1069 new_col_starts, new_col_stops;
1070
1071 numeric_index_type new_row_start, new_row_stop,
1072 new_col_start, new_col_stop;
1073
1074 // We'll read through the file three times: once to get a reliable
1075 // value for the matrix size (so we can divvy it up among
1076 // processors), then again to get the sparsity to send to each
1077 // processor, then a final time to get the entries to send to each
1078 // processor.
1079 //
1080 // We'll use an istream here; it might be an ifstream if we're
1081 // opening a raw ASCII file or a gzstream if we're opening a
1082 // compressed one.
1083 std::unique_ptr<std::istream> file;
1084
1085 // We'll need a temporary structure to cache matrix entries, because
1086 // we need to read through the whole file before we know the size
1087 // and sparsity structure with which we can init().
1088 //
1089 // Reading through the file three times via `seekg` doesn't work
1090 // with our gzstream wrapper, and seems to take three times as long
1091 // even with a plain ifstream. What happened to disk caching!?
1092 std::vector<std::tuple<numeric_index_type, numeric_index_type, T>> entries;
1093
1094 // First read through the file, saving size and entry data
1095 {
1096 // We'll read the matrix on processor 0 rather than try to juggle
1097 // parallel I/O.
1098 if (this->processor_id() == 0)
1099 {
1100 // We'll be using regular expressions to make ourselves slightly
1101 // more robust to formatting.
1102 const std::regex start_regex // assignment like "zzz = ["
1103 ("\\s*\\w+\\s*=\\s*\\[");
1104 const std::regex end_regex // end of assignment
1105 ("^[^%]*\\]");
1106
1107 if (gzipped_file)
1108 {
1109#ifdef LIBMESH_HAVE_GZSTREAM
1110 auto inf = std::make_unique<igzstream>();
1111 libmesh_assert(inf);
1112 inf->open(filename.c_str(), std::ios::in);
1113 file = std::move(inf);
1114#else
1115 libmesh_error_msg("ERROR: need gzstream to handle .gz files!!!");
1116#endif
1117 }
1118 else
1119 {
1120 auto inf = std::make_unique<std::ifstream>();
1121 libmesh_assert(inf);
1122
1123 std::string new_name = Utility::unzip_file(filename);
1124
1125 inf->open(new_name.c_str(), std::ios::in);
1126 file = std::move(inf);
1127 }
1128
1129 // If we have a matrix with all-zero trailing rows, the only
1130 // way to get the size is if it ended up in a comment
1131 const std::regex size_regex // comment like "% size = 8 8"
1132 ("%\\s*[Ss][Ii][Zz][Ee]\\s*=\\s*(\\d+)\\s+(\\d+)");
1133 const std::string whitespace = " \t";
1134
1135 bool have_started = false;
1136 bool have_ended = false;
1137 std::size_t largest_i_seen = 0, largest_j_seen = 0;
1138
1139 // Data for the row we're working on
1140 // Use 1-based indexing for current_row, as in the file
1141 std::size_t current_row = 1;
1142
1143 for (std::string line; std::getline(*file, line);)
1144 {
1145 std::smatch sm;
1146
1147 // First, try to match an entry. This is the most common
1148 // case so we won't rely on slow std::regex for it.
1149 // stringstream is at least an improvement over that.
1150
1151 // Look for row/col/val like "1 1 -2.0e-4"
1152
1153 std::istringstream l(line);
1154
1155 std::size_t i, j;
1156 T value;
1157
1158 l >> i >> j >> value;
1159
1160 if (!l.fail())
1161 {
1162 libmesh_error_msg_if
1163 (!have_started, "Confused by premature entries in matrix file " << filename);
1164
1165 entries.emplace_back(cast_int<numeric_index_type>(i),
1166 cast_int<numeric_index_type>(j),
1167 value);
1168
1169 libmesh_error_msg_if
1170 (!i || !j, "Expected 1-based indexing in matrix file "
1171 << filename);
1172
1173 current_row = std::max(current_row, i);
1174
1175 libmesh_error_msg_if
1176 (i < current_row,
1177 "Can't handle out-of-order entries in matrix file "
1178 << filename);
1179
1180 largest_i_seen = std::max(i, largest_i_seen);
1181 largest_j_seen = std::max(j, largest_j_seen);
1182 }
1183
1184 else if (std::regex_search(line, sm, size_regex))
1185 {
1186 const std::string msize = sm[1];
1187 const std::string nsize = sm[2];
1188 m = std::stoull(msize);
1189 n = std::stoull(nsize);
1190 }
1191
1192 else if (std::regex_search(line, start_regex))
1193 have_started = true;
1194
1195 else if (std::regex_search(line, end_regex))
1196 {
1197 have_ended = true;
1198 break;
1199 }
1200 }
1201
1202 libmesh_error_msg_if
1203 (!have_started, "Confused by missing assignment beginning in matrix file " << filename);
1204
1205 libmesh_error_msg_if
1206 (!have_ended, "Confused by missing assignment ending in matrix file " << filename);
1207
1208 libmesh_error_msg_if
1209 (m > largest_i_seen, "Confused by missing final row(s) in matrix file " << filename);
1210
1211 libmesh_error_msg_if
1212 (m > 0 && m < largest_i_seen, "Confused by extra final row(s) in matrix file " << filename);
1213
1214 if (!m)
1215 m = largest_i_seen;
1216
1217 libmesh_error_msg_if
1218 (n > largest_j_seen, "Confused by missing final column(s) in matrix file " << filename);
1219
1220 libmesh_error_msg_if
1221 (n > 0 && n < largest_j_seen, "Confused by extra final column(s) in matrix file " << filename);
1222
1223 if (!n)
1224 n = largest_j_seen;
1225
1226 this->comm().broadcast(m);
1227 this->comm().broadcast(n);
1228 }
1229 else
1230 {
1231 this->comm().broadcast(m);
1232 this->comm().broadcast(n);
1233 }
1234
1235 if (this->initialized() &&
1236 m == this->m() &&
1237 n == this->n())
1238 {
1239 new_row_start = this->row_start(),
1240 new_row_stop = this->row_stop();
1241
1242 new_col_start = this->col_start(),
1243 new_col_stop = this->col_stop();
1244 }
1245 else
1246 {
1247 // Determine which rows/columns each processor will be in charge of
1248 new_row_start = this->processor_id() * m / this->n_processors(),
1249 new_row_stop = (this->processor_id()+1) * m / this->n_processors();
1250
1251 new_col_start = this->processor_id() * n / this->n_processors(),
1252 new_col_stop = (this->processor_id()+1) * n / this->n_processors();
1253 }
1254
1255 this->comm().gather(0, new_row_start, new_row_starts);
1256 this->comm().gather(0, new_row_stop, new_row_stops);
1257 this->comm().gather(0, new_col_start, new_col_starts);
1258 this->comm().gather(0, new_col_stop, new_col_stops);
1259
1260 } // Done reading entry data and broadcasting matrix size
1261
1262 // Calculate the matrix sparsity and initialize it second
1263 {
1264 // Deduce the sparsity pattern, or at least the maximum number of
1265 // on- and off- diagonal non-zeros per row.
1266 numeric_index_type on_diagonal_nonzeros =0,
1267 off_diagonal_nonzeros =0;
1268
1269 if (this->processor_id() == 0)
1270 {
1271 // Data for the row we're working on
1272 // Use 1-based indexing for current_row, as in the file
1273 numeric_index_type current_row = 1;
1274 processor_id_type current_proc = 0;
1275 numeric_index_type current_on_diagonal_nonzeros = 0;
1276 numeric_index_type current_off_diagonal_nonzeros = 0;
1277
1278 for (auto [i, j, value] : entries)
1279 {
1280 if (i > current_row)
1281 {
1282 current_row = i;
1283 // +1 for 1-based indexing in file
1284 while (current_row >= (new_row_stops[current_proc]+1))
1285 ++current_proc;
1286 current_on_diagonal_nonzeros = 0;
1287 current_off_diagonal_nonzeros = 0;
1288 }
1289
1290 // +1 for 1-based indexing in file
1291 if (j >= (new_col_starts[current_proc]+1) &&
1292 j < (new_col_stops[current_proc]+1))
1293 {
1294 ++current_on_diagonal_nonzeros;
1295 on_diagonal_nonzeros =
1296 std::max(on_diagonal_nonzeros,
1297 current_on_diagonal_nonzeros);
1298 }
1299 else
1300 {
1301 ++current_off_diagonal_nonzeros;
1302 off_diagonal_nonzeros =
1303 std::max(off_diagonal_nonzeros,
1304 current_off_diagonal_nonzeros);
1305 }
1306 }
1307 }
1308
1309 this->comm().broadcast(on_diagonal_nonzeros);
1310 this->comm().broadcast(off_diagonal_nonzeros);
1311
1312 this->init(m, n,
1313 new_row_stop-new_row_start,
1314 new_col_stop-new_col_start,
1315 on_diagonal_nonzeros,
1316 off_diagonal_nonzeros);
1317 }
1318
1319 // Set the matrix values last.
1320 // Convert from 1-based to 0-based indexing
1321 if (this->processor_id() == 0)
1322 for (auto [i, j, value] : entries)
1323 this->set(i-1, j-1, value);
1324
1325 this->close();
1326#endif
1327}

◆ read_matlab() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::read_matlab ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc.

If the size and sparsity of the matrix in filename appears consistent with the existing sparsity of this then the existing parallel decomposition and sparsity will be retained. If not, then this will be initialized with the sparsity from the file, linearly partitioned onto the number of processors available.

Definition at line 1050 of file sparse_matrix.C.

1051{
1052 LOG_SCOPE("read_matlab()", "SparseMatrix");
1053
1054#ifndef LIBMESH_HAVE_CXX11_REGEX
1055 libmesh_not_implemented(); // What is your compiler?!? Email us!
1056 libmesh_ignore(filename);
1057#else
1058 parallel_object_only();
1059
1060 const bool gzipped_file = Utility::ends_with(filename, ".gz");
1061
1062 // The sizes we get from the file
1063 std::size_t m = 0,
1064 n = 0;
1065
1066 // If we don't already have this size, we'll need to reinit, and
1067 // determine which rows+columns each processor is in charge of.
1068 std::vector<numeric_index_type> new_row_starts, new_row_stops,
1069 new_col_starts, new_col_stops;
1070
1071 numeric_index_type new_row_start, new_row_stop,
1072 new_col_start, new_col_stop;
1073
1074 // We'll read through the file three times: once to get a reliable
1075 // value for the matrix size (so we can divvy it up among
1076 // processors), then again to get the sparsity to send to each
1077 // processor, then a final time to get the entries to send to each
1078 // processor.
1079 //
1080 // We'll use an istream here; it might be an ifstream if we're
1081 // opening a raw ASCII file or a gzstream if we're opening a
1082 // compressed one.
1083 std::unique_ptr<std::istream> file;
1084
1085 // We'll need a temporary structure to cache matrix entries, because
1086 // we need to read through the whole file before we know the size
1087 // and sparsity structure with which we can init().
1088 //
1089 // Reading through the file three times via `seekg` doesn't work
1090 // with our gzstream wrapper, and seems to take three times as long
1091 // even with a plain ifstream. What happened to disk caching!?
1092 std::vector<std::tuple<numeric_index_type, numeric_index_type, T>> entries;
1093
1094 // First read through the file, saving size and entry data
1095 {
1096 // We'll read the matrix on processor 0 rather than try to juggle
1097 // parallel I/O.
1098 if (this->processor_id() == 0)
1099 {
1100 // We'll be using regular expressions to make ourselves slightly
1101 // more robust to formatting.
1102 const std::regex start_regex // assignment like "zzz = ["
1103 ("\\s*\\w+\\s*=\\s*\\[");
1104 const std::regex end_regex // end of assignment
1105 ("^[^%]*\\]");
1106
1107 if (gzipped_file)
1108 {
1109#ifdef LIBMESH_HAVE_GZSTREAM
1110 auto inf = std::make_unique<igzstream>();
1111 libmesh_assert(inf);
1112 inf->open(filename.c_str(), std::ios::in);
1113 file = std::move(inf);
1114#else
1115 libmesh_error_msg("ERROR: need gzstream to handle .gz files!!!");
1116#endif
1117 }
1118 else
1119 {
1120 auto inf = std::make_unique<std::ifstream>();
1121 libmesh_assert(inf);
1122
1123 std::string new_name = Utility::unzip_file(filename);
1124
1125 inf->open(new_name.c_str(), std::ios::in);
1126 file = std::move(inf);
1127 }
1128
1129 // If we have a matrix with all-zero trailing rows, the only
1130 // way to get the size is if it ended up in a comment
1131 const std::regex size_regex // comment like "% size = 8 8"
1132 ("%\\s*[Ss][Ii][Zz][Ee]\\s*=\\s*(\\d+)\\s+(\\d+)");
1133 const std::string whitespace = " \t";
1134
1135 bool have_started = false;
1136 bool have_ended = false;
1137 std::size_t largest_i_seen = 0, largest_j_seen = 0;
1138
1139 // Data for the row we're working on
1140 // Use 1-based indexing for current_row, as in the file
1141 std::size_t current_row = 1;
1142
1143 for (std::string line; std::getline(*file, line);)
1144 {
1145 std::smatch sm;
1146
1147 // First, try to match an entry. This is the most common
1148 // case so we won't rely on slow std::regex for it.
1149 // stringstream is at least an improvement over that.
1150
1151 // Look for row/col/val like "1 1 -2.0e-4"
1152
1153 std::istringstream l(line);
1154
1155 std::size_t i, j;
1156 T value;
1157
1158 l >> i >> j >> value;
1159
1160 if (!l.fail())
1161 {
1162 libmesh_error_msg_if
1163 (!have_started, "Confused by premature entries in matrix file " << filename);
1164
1165 entries.emplace_back(cast_int<numeric_index_type>(i),
1166 cast_int<numeric_index_type>(j),
1167 value);
1168
1169 libmesh_error_msg_if
1170 (!i || !j, "Expected 1-based indexing in matrix file "
1171 << filename);
1172
1173 current_row = std::max(current_row, i);
1174
1175 libmesh_error_msg_if
1176 (i < current_row,
1177 "Can't handle out-of-order entries in matrix file "
1178 << filename);
1179
1180 largest_i_seen = std::max(i, largest_i_seen);
1181 largest_j_seen = std::max(j, largest_j_seen);
1182 }
1183
1184 else if (std::regex_search(line, sm, size_regex))
1185 {
1186 const std::string msize = sm[1];
1187 const std::string nsize = sm[2];
1188 m = std::stoull(msize);
1189 n = std::stoull(nsize);
1190 }
1191
1192 else if (std::regex_search(line, start_regex))
1193 have_started = true;
1194
1195 else if (std::regex_search(line, end_regex))
1196 {
1197 have_ended = true;
1198 break;
1199 }
1200 }
1201
1202 libmesh_error_msg_if
1203 (!have_started, "Confused by missing assignment beginning in matrix file " << filename);
1204
1205 libmesh_error_msg_if
1206 (!have_ended, "Confused by missing assignment ending in matrix file " << filename);
1207
1208 libmesh_error_msg_if
1209 (m > largest_i_seen, "Confused by missing final row(s) in matrix file " << filename);
1210
1211 libmesh_error_msg_if
1212 (m > 0 && m < largest_i_seen, "Confused by extra final row(s) in matrix file " << filename);
1213
1214 if (!m)
1215 m = largest_i_seen;
1216
1217 libmesh_error_msg_if
1218 (n > largest_j_seen, "Confused by missing final column(s) in matrix file " << filename);
1219
1220 libmesh_error_msg_if
1221 (n > 0 && n < largest_j_seen, "Confused by extra final column(s) in matrix file " << filename);
1222
1223 if (!n)
1224 n = largest_j_seen;
1225
1226 this->comm().broadcast(m);
1227 this->comm().broadcast(n);
1228 }
1229 else
1230 {
1231 this->comm().broadcast(m);
1232 this->comm().broadcast(n);
1233 }
1234
1235 if (this->initialized() &&
1236 m == this->m() &&
1237 n == this->n())
1238 {
1239 new_row_start = this->row_start(),
1240 new_row_stop = this->row_stop();
1241
1242 new_col_start = this->col_start(),
1243 new_col_stop = this->col_stop();
1244 }
1245 else
1246 {
1247 // Determine which rows/columns each processor will be in charge of
1248 new_row_start = this->processor_id() * m / this->n_processors(),
1249 new_row_stop = (this->processor_id()+1) * m / this->n_processors();
1250
1251 new_col_start = this->processor_id() * n / this->n_processors(),
1252 new_col_stop = (this->processor_id()+1) * n / this->n_processors();
1253 }
1254
1255 this->comm().gather(0, new_row_start, new_row_starts);
1256 this->comm().gather(0, new_row_stop, new_row_stops);
1257 this->comm().gather(0, new_col_start, new_col_starts);
1258 this->comm().gather(0, new_col_stop, new_col_stops);
1259
1260 } // Done reading entry data and broadcasting matrix size
1261
1262 // Calculate the matrix sparsity and initialize it second
1263 {
1264 // Deduce the sparsity pattern, or at least the maximum number of
1265 // on- and off- diagonal non-zeros per row.
1266 numeric_index_type on_diagonal_nonzeros =0,
1267 off_diagonal_nonzeros =0;
1268
1269 if (this->processor_id() == 0)
1270 {
1271 // Data for the row we're working on
1272 // Use 1-based indexing for current_row, as in the file
1273 numeric_index_type current_row = 1;
1274 processor_id_type current_proc = 0;
1275 numeric_index_type current_on_diagonal_nonzeros = 0;
1276 numeric_index_type current_off_diagonal_nonzeros = 0;
1277
1278 for (auto [i, j, value] : entries)
1279 {
1280 if (i > current_row)
1281 {
1282 current_row = i;
1283 // +1 for 1-based indexing in file
1284 while (current_row >= (new_row_stops[current_proc]+1))
1285 ++current_proc;
1286 current_on_diagonal_nonzeros = 0;
1287 current_off_diagonal_nonzeros = 0;
1288 }
1289
1290 // +1 for 1-based indexing in file
1291 if (j >= (new_col_starts[current_proc]+1) &&
1292 j < (new_col_stops[current_proc]+1))
1293 {
1294 ++current_on_diagonal_nonzeros;
1295 on_diagonal_nonzeros =
1296 std::max(on_diagonal_nonzeros,
1297 current_on_diagonal_nonzeros);
1298 }
1299 else
1300 {
1301 ++current_off_diagonal_nonzeros;
1302 off_diagonal_nonzeros =
1303 std::max(off_diagonal_nonzeros,
1304 current_off_diagonal_nonzeros);
1305 }
1306 }
1307 }
1308
1309 this->comm().broadcast(on_diagonal_nonzeros);
1310 this->comm().broadcast(off_diagonal_nonzeros);
1311
1312 this->init(m, n,
1313 new_row_stop-new_row_start,
1314 new_col_stop-new_col_start,
1315 on_diagonal_nonzeros,
1316 off_diagonal_nonzeros);
1317 }
1318
1319 // Set the matrix values last.
1320 // Convert from 1-based to 0-based indexing
1321 if (this->processor_id() == 0)
1322 for (auto [i, j, value] : entries)
1323 this->set(i-1, j-1, value);
1324
1325 this->close();
1326#endif
1327}
std::string unzip_file(std::string_view name)
Create an unzipped copy of a bz2 or xz file, returning the name of the now-unzipped file that can be ...
Definition utility.C:164

References libMesh::Utility::ends_with(), libMesh::initialized(), libMesh::libmesh_assert(), libMesh::libmesh_ignore(), libMesh::Utility::unzip_file(), and value.

Referenced by ConstraintOperatorTest::test1DCoarseningNewNodes(), and ConstraintOperatorTest::testCoreform().

◆ read_petsc_binary() [1/2]

void libMesh::SparseMatrix< Number >::read_petsc_binary ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file in PETSc's binary sparse matrix format.

Definition at line 518 of file sparse_matrix.C.

1333{
1334 libmesh_not_implemented_msg
1335 ("libMesh cannot read PETSc binary-format files into non-PETSc matrices");
1336}

◆ read_petsc_binary() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::read_petsc_binary ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file in PETSc's binary sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 1332 of file sparse_matrix.C.

1333{
1334 libmesh_not_implemented_msg
1335 ("libMesh cannot read PETSc binary-format files into non-PETSc matrices");
1336}

◆ read_petsc_hdf5() [1/2]

void libMesh::SparseMatrix< Number >::read_petsc_hdf5 ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file in PETSc's HDF5 sparse matrix format.

Definition at line 524 of file sparse_matrix.C.

1342{
1343 libmesh_not_implemented_msg
1344 ("libMesh cannot read PETSc HDF5-format files into non-PETSc matrices");
1345}

◆ read_petsc_hdf5() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::read_petsc_hdf5 ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file in PETSc's HDF5 sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 1341 of file sparse_matrix.C.

1342{
1343 libmesh_not_implemented_msg
1344 ("libMesh cannot read PETSc HDF5-format files into non-PETSc matrices");
1345}

◆ reduced_system_solver()

LinearSolver< Number > & libMesh::StaticCondensation::reduced_system_solver ( )
inline
Returns
The reduced system linear solver

Definition at line 302 of file static_condensation.h.

303{
304 libmesh_assert_msg(_reduced_solver, "Reduced system solver not built yet");
305 return *_reduced_solver;
306}

References _reduced_solver.

◆ reinit_submatrix() [1/2]

virtual void libMesh::SparseMatrix< Number >::reinit_submatrix ( SparseMatrix< Number > &  submatrix,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
) const
inlinevirtualinherited

This function is similar to the one above, but it allows you to reuse the existing sparsity pattern of "submatrix" instead of reallocating it again.

This should hopefully be more efficient if you are frequently extracting submatrices of the same size.

Definition at line 565 of file sparse_matrix.h.

568 {
569 this->_get_submatrix(submatrix,
570 rows,
571 cols,
572 true); // true means REUSE submatrix
573 }

◆ reinit_submatrix() [2/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::reinit_submatrix ( SparseMatrix< T > &  submatrix,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
) const
inlinevirtualinherited

This function is similar to the one above, but it allows you to reuse the existing sparsity pattern of "submatrix" instead of reallocating it again.

This should hopefully be more efficient if you are frequently extracting submatrices of the same size.

Definition at line 565 of file sparse_matrix.h.

568 {
569 this->_get_submatrix(submatrix,
570 rows,
571 cols,
572 true); // true means REUSE submatrix
573 }

References libMesh::SparseMatrix< T >::_get_submatrix().

◆ require_sparsity_pattern()

virtual bool libMesh::StaticCondensation::require_sparsity_pattern ( ) const
inlineoverridevirtual
Returns
Whether this matrix needs the sparsity pattern computed by the DofMap

Reimplemented from libMesh::PetscMatrixShellMatrix< Number >.

Definition at line 188 of file static_condensation.h.

188{ return false; }

◆ restore_original_nonzero_pattern() [1/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::restore_original_nonzero_pattern ( )
inlinevirtualinherited

Reset the memory storage of the matrix.

Unlike clear(), this does not destroy the matrix but rather will reset the matrix to use the original preallocation or when using hash table matrix assembly (see use_hash_table()) will reset (clear) the hash table used for assembly. In the words of the MatResetPreallocation documentation in PETSc, 'current values in the matrix are lost in this call', so a user can expect to have back their original sparsity pattern in a zeroed state

Reimplemented in libMesh::DiagonalMatrix< T >, and libMesh::PetscMatrix< T >.

Definition at line 644 of file sparse_matrix.h.

644{ libmesh_not_implemented(); }

◆ restore_original_nonzero_pattern() [2/2]

virtual void libMesh::SparseMatrix< Number >::restore_original_nonzero_pattern ( )
inlinevirtualinherited

Reset the memory storage of the matrix.

Unlike clear(), this does not destroy the matrix but rather will reset the matrix to use the original preallocation or when using hash table matrix assembly (see use_hash_table()) will reset (clear) the hash table used for assembly. In the words of the MatResetPreallocation documentation in PETSc, 'current values in the matrix are lost in this call', so a user can expect to have back their original sparsity pattern in a zeroed state

Definition at line 644 of file sparse_matrix.h.

644{ libmesh_not_implemented(); }

◆ row_start() [1/2]

numeric_index_type libMesh::StaticCondensation::row_start ( ) const
overridevirtual
Returns
The index of the first matrix row stored on this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 251 of file static_condensation.C.

251{ return _full_dof_map.first_dof(); }
dof_id_type first_dof(const processor_id_type proc) const

References _full_dof_map, and libMesh::DofMapBase::first_dof().

Referenced by col_start().

◆ row_start() [2/2]

virtual numeric_index_type libMesh::StaticCondensation::row_start ( ) const
inlineoverridevirtual
Returns
The index of the first matrix row stored on this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 362 of file static_condensation.h.

362{ libmesh_not_implemented(); }

◆ row_stop() [1/2]

numeric_index_type libMesh::StaticCondensation::row_stop ( ) const
overridevirtual
Returns
The index of the last matrix row (+1) stored on this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 253 of file static_condensation.C.

253{ return _full_dof_map.end_dof(); }
dof_id_type end_dof(const processor_id_type proc) const

References _full_dof_map, and libMesh::DofMapBase::end_dof().

Referenced by col_stop().

◆ row_stop() [2/2]

virtual numeric_index_type libMesh::StaticCondensation::row_stop ( ) const
inlineoverridevirtual
Returns
The index of the last matrix row (+1) stored on this processor.

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 363 of file static_condensation.h.

363{ libmesh_not_implemented(); }

◆ scale() [1/2]

void libMesh::SparseMatrix< Number >::scale ( const Number  scale)
virtualinherited

Scales all elements of this matrix by scale.

Definition at line 614 of file sparse_matrix.C.

1351{
1352 libmesh_assert(this->closed());
1353
1354 for (const auto i : make_range(this->row_start(), this->row_stop()))
1355 for (const auto j : make_range(this->col_start(), this->col_stop()))
1356 this->set(i, j, (*this)(i, j) * scale);
1357}
virtual void scale(const Number scale)
Scales all elements of this matrix by scale.
virtual bool closed() const=0

◆ scale() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::scale ( const T  scale)
virtualinherited

Scales all elements of this matrix by scale.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 1350 of file sparse_matrix.C.

1351{
1352 libmesh_assert(this->closed());
1353
1354 for (const auto i : make_range(this->row_start(), this->row_stop()))
1355 for (const auto j : make_range(this->col_start(), this->col_stop()))
1356 this->set(i, j, (*this)(i, j) * scale);
1357}

References libMesh::closed(), libMesh::libmesh_assert(), and libMesh::make_range().

◆ set() [1/3]

void libMesh::StaticCondensation::set ( const numeric_index_type  i,
const numeric_index_type  j,
const Number  value 
)
overridevirtual

Set the element (i,j) to value.

Throws an error if the entry does not exist. Zero values can be "stored" in non-existent fields.

Implements libMesh::SparseMatrix< Number >.

Definition at line 255 of file static_condensation.C.

258{
259 const auto reduced_i = _reduced_dof_map.get_reduced_from_global_constraint_dof(full_i);
260 const auto reduced_j = _reduced_dof_map.get_reduced_from_global_constraint_dof(full_j);
261 _reduced_sys_mat->set(reduced_i, reduced_j, val);
262}
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 syst...

References _reduced_dof_map, _reduced_sys_mat, and libMesh::StaticCondensationDofMap::get_reduced_from_global_constraint_dof().

◆ set() [2/3]

template<typename T >
virtual void libMesh::SparseMatrix< T >::set ( const numeric_index_type  i,
const numeric_index_type  j,
const T  value 
)
pure virtualinherited

◆ set() [3/3]

virtual void libMesh::StaticCondensation::set ( const numeric_index_type  i,
const numeric_index_type  j,
const Number  value 
)
inlineoverridevirtual

Set the element (i,j) to value.

Throws an error if the entry does not exist. Zero values can be "stored" in non-existent fields.

Implements libMesh::SparseMatrix< Number >.

Definition at line 366 of file static_condensation.h.

367 {
368 libmesh_not_implemented();
369 }

◆ set_context()

template<typename T >
void libMesh::PetscMatrixBase< T >::set_context ( )
inherited

Set the context (ourself) for _mat.

Definition at line 105 of file petsc_matrix_base.C.

106{
107 libmesh_assert(this->_mat);
108 PetscContainer container;
109 LibmeshPetscCall(PetscContainerCreate(this->comm().get(), &container));
110 LibmeshPetscCall(PetscContainerSetPointer(container, this));
111 LibmeshPetscCall(PetscObjectCompose((PetscObject)(Mat)this->_mat, "PetscMatrixCtx", (PetscObject)container));
112 LibmeshPetscCall(PetscContainerDestroy(&container));
113}
const Elem & get(const ElemType type_in)

References libMesh::libmesh_assert().

Referenced by libMesh::PetscMatrixBase< T >::PetscMatrixBase().

◆ set_current_elem() [1/2]

void libMesh::StaticCondensation::set_current_elem ( const Elem )
inline

Definition at line 412 of file static_condensation.h.

412{}

◆ set_current_elem() [2/2]

void libMesh::StaticCondensation::set_current_elem ( const Elem elem)

Set the current element.

This enables fast lookups of local indices from global indices

Definition at line 264 of file static_condensation.C.

265{
267 _current_elem_id = elem.id();
268}
bool in_threads
A boolean which is true iff we are in a Threads:: function It may be useful to assert(!...
Definition threads.C:33
unsigned int n_threads()

References _current_elem_id, libMesh::DofObject::id(), libMesh::Threads::in_threads, libMesh::libmesh_assert(), and libMesh::n_threads().

Referenced by libMesh::HDGProblem::jacobian().

◆ set_destroy_mat_on_exit()

template<typename T >
void libMesh::PetscMatrixBase< T >::set_destroy_mat_on_exit ( bool  destroy = true)
inherited

If set to false, we don't delete the Mat on destruction and allow instead for PETSc to manage it.

Definition at line 91 of file petsc_matrix_base.C.

92{
94}
bool _destroy_mat_on_exit
This boolean value should only be set to false for the constructor which takes a PETSc Mat object.
void destroy(triangulateio &t, IO_Type)
Frees any memory which has been dynamically allocated by Triangle.

◆ set_local_vectors()

void libMesh::StaticCondensation::set_local_vectors ( const NumericVector< Number > &  global_vector,
const std::vector< dof_id_type > &  elem_dof_indices,
std::vector< Number > &  elem_dof_values_vec,
EigenVector elem_dof_values 
)
staticprivate

Retrieves the degree of freedom values from global_vector corresponding to elem_dof_indices, filling both elem_dof_values_vec and elem_dof_values.

Definition at line 372 of file static_condensation.C.

376{
377 global_vector.get(elem_dof_indices, elem_dof_values_vec);
378 elem_dof_values.resize(elem_dof_indices.size());
379 for (const auto i : index_range(elem_dof_indices))
380 elem_dof_values(i) = elem_dof_values_vec[i];
381}
virtual void get(const std::vector< numeric_index_type > &index, T *values) const
Access multiple components at once.

References libMesh::NumericVector< T >::get(), and libMesh::index_range().

Referenced by backwards_substitution(), and forward_elimination().

◆ setup() [1/2]

void libMesh::StaticCondensation::setup ( )

A no-op to be consistent with shimming from the StaticCondenstionPreconditioner.

"setup" should take place at the end of matrix assembly, e.g. during a call to close()

Definition at line 247 of file static_condensation.C.

247{ libmesh_assert(this->closed()); }

References closed(), and libMesh::libmesh_assert().

Referenced by libMesh::StaticCondensationPreconditioner::setup().

◆ setup() [2/2]

void libMesh::StaticCondensation::setup ( )
inline

Definition at line 409 of file static_condensation.h.

409{ libmesh_not_implemented(); }

◆ solver_package() [1/2]

SolverPackage libMesh::StaticCondensation::solver_package ( )
overridevirtual

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 475 of file static_condensation.C.

SolverPackage default_solver_package()
Definition libmesh.C:1064

References libMesh::default_solver_package().

◆ solver_package() [2/2]

virtual SolverPackage libMesh::StaticCondensation::solver_package ( )
inlineoverridevirtual

Reimplemented from libMesh::PetscMatrixBase< T >.

Definition at line 337 of file static_condensation.h.

337{ libmesh_not_implemented(); }

◆ supports_hash_table() [1/2]

virtual bool libMesh::SparseMatrix< Number >::supports_hash_table ( ) const
inlinevirtualinherited
Returns
Whether the matrix supports hash table assembly

Definition at line 619 of file sparse_matrix.h.

619{ return false; }

◆ supports_hash_table() [2/2]

template<typename T >
virtual bool libMesh::SparseMatrix< T >::supports_hash_table ( ) const
inlinevirtualinherited
Returns
Whether the matrix supports hash table assembly

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 619 of file sparse_matrix.h.

619{ return false; }

◆ swap()

template<typename T >
void libMesh::PetscMatrixBase< T >::swap ( PetscMatrixBase< T > &  m_in)
inherited

Swaps the internal data pointers of two PetscMatrices, no actual values are swapped.

Definition at line 98 of file petsc_matrix_base.C.

99{
100 std::swap(_mat, m_in._mat);
101 std::swap(_destroy_mat_on_exit, m_in._destroy_mat_on_exit);
102}

References libMesh::PetscMatrixBase< T >::_destroy_mat_on_exit, and libMesh::PetscMatrixBase< T >::_mat.

Referenced by DMlibMeshJacobian().

◆ uncondensed_dofs_only()

void libMesh::StaticCondensation::uncondensed_dofs_only ( )
inline

Sets whether this matrix represents uncondensed dofs only.

In that case when building the Schur complement we won't attempt to invert zero element matrices corresponding to the condensed dofs

Definition at line 194 of file static_condensation.h.

194{ _uncondensed_dofs_only = true; }

References _uncondensed_dofs_only.

◆ uncondensed_vars()

const std::unordered_set< unsigned int > & libMesh::StaticCondensation::uncondensed_vars ( ) const
inline

Definition at line 331 of file static_condensation.h.

331{ libmesh_not_implemented(); }

◆ update_sparsity_pattern() [1/2]

template<typename T >
virtual void libMesh::SparseMatrix< T >::update_sparsity_pattern ( const SparsityPattern::Graph )
inlinevirtualinherited

Updates the matrix sparsity pattern.

When your SparseMatrix<T> implementation does not need this data, simply do not override this method.

Reimplemented in libMesh::LaspackMatrix< T >, and libMesh::EpetraMatrix< T >.

Definition at line 175 of file sparse_matrix.h.

175{}

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

◆ update_sparsity_pattern() [2/2]

virtual void libMesh::SparseMatrix< Number >::update_sparsity_pattern ( const SparsityPattern::Graph )
inlinevirtualinherited

Updates the matrix sparsity pattern.

When your SparseMatrix<T> implementation does not need this data, simply do not override this method.

Definition at line 175 of file sparse_matrix.h.

175{}

◆ use_hash_table() [1/4]

template<typename T >
bool libMesh::SparseMatrix< T >::use_hash_table ( ) const
inlineinherited
Returns
Whether this matrix is using hash table assembly. Hash table or hash map assembly means storing maps from i-j locations in the matrix to values. Because it is a hash map as opposed to a contiguous array of data, no preallocation is required to use it

Definition at line 634 of file sparse_matrix.h.

634{ return _use_hash_table; }
bool _use_hash_table
Flag indicating whether the matrix is assembled using a hash table.

References libMesh::SparseMatrix< T >::_use_hash_table.

Referenced by libMesh::SparseMatrix< T >::require_sparsity_pattern().

◆ use_hash_table() [2/4]

bool libMesh::SparseMatrix< Number >::use_hash_table ( ) const
inlineinherited
Returns
Whether this matrix is using hash table assembly. Hash table or hash map assembly means storing maps from i-j locations in the matrix to values. Because it is a hash map as opposed to a contiguous array of data, no preallocation is required to use it

Definition at line 634 of file sparse_matrix.h.

634{ return _use_hash_table; }

◆ use_hash_table() [3/4]

void libMesh::SparseMatrix< Number >::use_hash_table ( bool  use_hash)
inherited

Sets whether to use hash table assembly.

This will error if the passed-in value is true and the matrix type does not support hash tables. Hash table or hash map assembly means storing maps from i-j locations in the matrix to values. Because it is a hash map as opposed to a contiguous array of data, no preallocation is required to use it

Definition at line 627 of file sparse_matrix.h.

693{
694 libmesh_error_msg_if(use_hash && !this->supports_hash_table(),
695 "This matrix class does not support hash table assembly");
696 this->_use_hash_table = use_hash;
697}
virtual bool supports_hash_table() const

◆ use_hash_table() [4/4]

template<typename T >
void libMesh::SparseMatrix< T >::use_hash_table ( bool  use_hash)
inherited

Sets whether to use hash table assembly.

This will error if the passed-in value is true and the matrix type does not support hash tables. Hash table or hash map assembly means storing maps from i-j locations in the matrix to values. Because it is a hash map as opposed to a contiguous array of data, no preallocation is required to use it

Definition at line 692 of file sparse_matrix.h.

693{
694 libmesh_error_msg_if(use_hash && !this->supports_hash_table(),
695 "This matrix class does not support hash table assembly");
696 this->_use_hash_table = use_hash;
697}

Referenced by PetscMatrixTest::testPetscCopyFromHash().

◆ vector_mult() [1/2]

void libMesh::SparseMatrix< Number >::vector_mult ( NumericVector< Number > &  dest,
const NumericVector< Number > &  arg 
) const
inherited

Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest.

Definition at line 579 of file sparse_matrix.C.

239{
240 dest.zero();
241 this->vector_mult_add(dest,arg);
242}
virtual void zero()=0
Set all entries to zero.
void vector_mult_add(NumericVector< Number > &dest, const NumericVector< Number > &arg) const
Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest.

◆ vector_mult() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::vector_mult ( NumericVector< T > &  dest,
const NumericVector< T > &  arg 
) const
inherited

◆ vector_mult_add() [1/2]

void libMesh::SparseMatrix< Number >::vector_mult_add ( NumericVector< Number > &  dest,
const NumericVector< Number > &  arg 
) const
inherited

Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest.

Definition at line 586 of file sparse_matrix.C.

249{
250 /* This functionality is actually implemented in the \p
251 NumericVector class. */
252 dest.add_vector(arg,*this);
253}
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i].

◆ vector_mult_add() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::vector_mult_add ( NumericVector< T > &  dest,
const NumericVector< T > &  arg 
) const
inherited

Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest.

Definition at line 247 of file sparse_matrix.C.

249{
250 /* This functionality is actually implemented in the \p
251 NumericVector class. */
252 dest.add_vector(arg,*this);
253}

References libMesh::NumericVector< T >::add_vector().

Referenced by libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

◆ zero() [1/2]

void libMesh::StaticCondensation::zero ( )
overridevirtual

Set all entries to 0.

Implements libMesh::SparseMatrix< T >.

Definition at line 234 of file static_condensation.C.

235{
236 _reduced_sys_mat->zero();
237 for (auto & [elem_id, matrix_data] : _elem_to_matrix_data)
238 {
239 libmesh_ignore(elem_id);
240 matrix_data.Acc.setZero();
241 matrix_data.Acu.setZero();
242 matrix_data.Auc.setZero();
243 matrix_data.Auu.setZero();
244 }
245}

References _elem_to_matrix_data, _reduced_sys_mat, and libMesh::libmesh_ignore().

Referenced by libMesh::StaticCondensationPreconditioner::zero().

◆ zero() [2/2]

virtual void libMesh::StaticCondensation::zero ( )
inlineoverridevirtual

Set all entries to 0.

Implements libMesh::SparseMatrix< T >.

Definition at line 350 of file static_condensation.h.

350{ libmesh_not_implemented(); }

◆ zero_clone() [1/2]

std::unique_ptr< SparseMatrix< Number > > libMesh::StaticCondensation::zero_clone ( ) const
overridevirtual
Returns
A smart pointer to a copy of this matrix with the same type, size, and partitioning, but with all zero entries.
Note
This must be overridden in the derived classes.

Implements libMesh::SparseMatrix< T >.

Definition at line 65 of file static_condensation.C.

66{
67 libmesh_not_implemented();
68}

◆ zero_clone() [2/2]

virtual std::unique_ptr< SparseMatrix< Number > > libMesh::StaticCondensation::zero_clone ( ) const
inlineoverridevirtual
Returns
A smart pointer to a copy of this matrix with the same type, size, and partitioning, but with all zero entries.
Note
This must be overridden in the derived classes.

Implements libMesh::SparseMatrix< T >.

Definition at line 351 of file static_condensation.h.

352 {
353 libmesh_not_implemented();
354 }

◆ zero_rows() [1/2]

void libMesh::SparseMatrix< Number >::zero_rows ( std::vector< numeric_index_type > &  rows,
Number  diag_value = 0.0 
)
virtualinherited

Sets all row entries to 0 then puts diag_value in the diagonal entry.

Definition at line 231 of file sparse_matrix.C.

259{
260 /* This functionality isn't implemented or stubbed in every subclass yet */
261 libmesh_not_implemented();
262}

◆ zero_rows() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::zero_rows ( std::vector< numeric_index_type > &  rows,
diag_value = 0.0 
)
virtualinherited

Sets all row entries to 0 then puts diag_value in the diagonal entry.

Reimplemented in libMesh::PetscMatrix< T >, and libMesh::DiagonalMatrix< T >.

Definition at line 258 of file sparse_matrix.C.

259{
260 /* This functionality isn't implemented or stubbed in every subclass yet */
261 libmesh_not_implemented();
262}

Member Data Documentation

◆ _communicator [1/2]

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

◆ _communicator [2/2]

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

◆ _counts [1/2]

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _counts [2/2]

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _current_elem_id

dof_id_type libMesh::StaticCondensation::_current_elem_id
private

The current element ID.

This is one half of a key, along with the global index, that maps to a local index

Definition at line 273 of file static_condensation.h.

Referenced by add_matrix(), clear(), and set_current_elem().

◆ _destroy_mat_on_exit

template<typename T >
bool libMesh::PetscMatrixBase< T >::_destroy_mat_on_exit
protectedinherited

This boolean value should only be set to false for the constructor which takes a PETSc Mat object.

Definition at line 186 of file petsc_matrix_base.h.

Referenced by libMesh::PetscMatrixBase< T >::swap().

◆ _dof_map [1/2]

DofMap const* libMesh::SparseMatrix< Number >::_dof_map
protectedinherited

The DofMap object associated with this object.

May be queried for degree-of-freedom counts on processors.

Definition at line 666 of file sparse_matrix.h.

◆ _dof_map [2/2]

template<typename T >
DofMap const* libMesh::SparseMatrix< T >::_dof_map
protectedinherited

The DofMap object associated with this object.

May be queried for degree-of-freedom counts on processors.

Definition at line 666 of file sparse_matrix.h.

◆ _elem_to_matrix_data

std::unordered_map<dof_id_type, MatrixData> libMesh::StaticCondensation::_elem_to_matrix_data
private

A map from element ID to Schur complement data.

Definition at line 249 of file static_condensation.h.

Referenced by add_matrix(), backwards_substitution(), clear(), close(), forward_elimination(), init(), and zero().

◆ _enable_print_counter [1/2]

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _enable_print_counter [2/2]

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _full_dof_map

const DofMap& libMesh::StaticCondensation::_full_dof_map
private

Definition at line 253 of file static_condensation.h.

Referenced by m(), row_start(), and row_stop().

◆ _ghosted_full_sol

std::unique_ptr<NumericVector<Number> > libMesh::StaticCondensation::_ghosted_full_sol
private

This is a ghosted representation of the full (uncondensed + condensed) solution. Note that.

Definition at line 269 of file static_condensation.h.

Referenced by apply(), backwards_substitution(), and init().

◆ _have_cached_values

bool libMesh::StaticCondensation::_have_cached_values
private

Whether we have cached values via add_XXX()

Definition at line 285 of file static_condensation.h.

Referenced by add_matrix(), clear(), close(), and closed().

◆ _is_initialized [1/2]

bool libMesh::SparseMatrix< Number >::_is_initialized
protectedinherited

Flag indicating whether or not the matrix has been initialized.

Definition at line 678 of file sparse_matrix.h.

◆ _is_initialized [2/2]

template<typename T >
bool libMesh::SparseMatrix< T >::_is_initialized
protectedinherited

◆ _mat

template<typename T >
Mat libMesh::PetscMatrixBase< T >::_mat
protectedinherited

◆ _mesh

const MeshBase& libMesh::StaticCondensation::_mesh
private

Definition at line 251 of file static_condensation.h.

Referenced by backwards_substitution(), and forward_elimination().

◆ _mutex [1/2]

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _mutex [2/2]

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_objects [1/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

◆ _n_objects [2/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

◆ _omit_constrained_dofs

const bool libMesh::PetscMatrixShellMatrix< Number >::_omit_constrained_dofs
privateinherited

Whether to omit constrained degrees of freedom.

Definition at line 67 of file petsc_matrix_shell_matrix.h.

◆ _parallel_type

ParallelType libMesh::StaticCondensation::_parallel_type
private

The parallel type to use for the reduced matrix.

Definition at line 288 of file static_condensation.h.

Referenced by init(), init(), and init().

◆ _reduced_dof_map

StaticCondensationDofMap& libMesh::StaticCondensation::_reduced_dof_map
private

◆ _reduced_rhs

std::unique_ptr<NumericVector<Number> > libMesh::StaticCondensation::_reduced_rhs
private

RHS corresponding to the uncondensed degrees of freedom.

This is constructed by applying the element Schur complements to an incoming RHS which contains both condensed and uncondensed degrees of freedom

Definition at line 263 of file static_condensation.h.

Referenced by apply(), clear(), forward_elimination(), and init().

◆ _reduced_sol

std::unique_ptr<NumericVector<Number> > libMesh::StaticCondensation::_reduced_sol
private

solution for the uncondensed degrees of freedom

Definition at line 259 of file static_condensation.h.

Referenced by apply(), and clear().

◆ _reduced_solver

std::unique_ptr<LinearSolver<Number> > libMesh::StaticCondensation::_reduced_solver
private

The solver for the uncondensed degrees of freedom.

Definition at line 265 of file static_condensation.h.

Referenced by apply(), clear(), init(), and reduced_system_solver().

◆ _reduced_sys_mat

std::unique_ptr<SparseMatrix<Number> > libMesh::StaticCondensation::_reduced_sys_mat
private

global sparse matrix for the uncondensed degrees of freedom

Definition at line 257 of file static_condensation.h.

Referenced by apply(), clear(), close(), closed(), get_condensed_mat(), init(), set(), and zero().

◆ _sc_is_initialized

bool libMesh::StaticCondensation::_sc_is_initialized
private

Whether our object has been initialized.

Definition at line 282 of file static_condensation.h.

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

◆ _scp

std::unique_ptr<StaticCondensationPreconditioner> libMesh::StaticCondensation::_scp
private

Preconditioner object which will call back to us for the preconditioning action.

Definition at line 279 of file static_condensation.h.

Referenced by get_preconditioner(), and StaticCondensation().

◆ _size_one_mat

DenseMatrix<Number> libMesh::StaticCondensation::_size_one_mat
private

Helper data member for adding individual matrix elements.

Definition at line 276 of file static_condensation.h.

Referenced by add(), and StaticCondensation().

◆ _sp [1/2]

SparsityPattern::Build const* libMesh::SparseMatrix< Number >::_sp
protectedinherited

The sparsity pattern associated with this object.

Should be queried for entry counts (or with need_full_sparsity_pattern, patterns) when needed.

Definition at line 673 of file sparse_matrix.h.

◆ _sp [2/2]

template<typename T >
SparsityPattern::Build const* libMesh::SparseMatrix< T >::_sp
protectedinherited

The sparsity pattern associated with this object.

Should be queried for entry counts (or with need_full_sparsity_pattern, patterns) when needed.

Definition at line 673 of file sparse_matrix.h.

◆ _system

System& libMesh::StaticCondensation::_system
private

Definition at line 252 of file static_condensation.h.

Referenced by init().

◆ _uncondensed_dofs_only

bool libMesh::StaticCondensation::_uncondensed_dofs_only
private

whether this matrix represents uncondensed dofs only.

In that case when building the Schur complement we won't attempt to invert zero element matrices corresponding to the condensed dofs

Definition at line 293 of file static_condensation.h.

Referenced by close(), and uncondensed_dofs_only().

◆ _use_hash_table [1/2]

bool libMesh::SparseMatrix< Number >::_use_hash_table
protectedinherited

Flag indicating whether the matrix is assembled using a hash table.

Definition at line 683 of file sparse_matrix.h.

◆ _use_hash_table [2/2]

template<typename T >
bool libMesh::SparseMatrix< T >::_use_hash_table
protectedinherited

Flag indicating whether the matrix is assembled using a hash table.

Definition at line 683 of file sparse_matrix.h.

Referenced by libMesh::SparseMatrix< T >::use_hash_table().


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