18#ifndef LIBMESH_STATIC_CONDENSATION_H
19#define LIBMESH_STATIC_CONDENSATION_H
21#include "libmesh/libmesh_config.h"
30#if defined(LIBMESH_HAVE_EIGEN) && defined(LIBMESH_HAVE_PETSC)
32#include "libmesh/petsc_matrix_shell_matrix.h"
33#include "libmesh/id_types.h"
34#include "libmesh/libmesh_common.h"
35#include "libmesh/dense_matrix.h"
36#include "libmesh/variable.h"
37#include "libmesh/sparsity_pattern.h"
39#include <unordered_map>
44#include "libmesh/ignore_warnings.h"
46#include "libmesh/restore_warnings.h"
60class StaticCondensationPreconditioner;
61class StaticCondensationDofMap;
63typedef Eigen::Matrix<Number, Eigen::Dynamic, Eigen::Dynamic>
EigenMatrix;
71 const DofMap & full_dof_map,
95 virtual void clear() noexcept override;
97 virtual
void zero() override;
103 virtual
void close() override;
124 const std::vector<numeric_index_type> & rows,
125 const std::vector<numeric_index_type> & cols)
override;
128 const std::vector<numeric_index_type> & dof_indices)
override;
138 virtual bool closed()
const override;
147 std::vector<numeric_index_type> & indices,
148 std::vector<Number> & values)
const override;
209 const std::vector<dof_id_type> & elem_dof_indices,
210 std::vector<Number> & elem_dof_values_vec,
245 typename std::remove_const<
decltype(
Acc.partialPivLu())>::type
AccFactor;
279 std::unique_ptr<StaticCondensationPreconditioner>
_scp;
304 libmesh_assert_msg(
_reduced_solver,
"Reduced system solver not built yet");
312#include "libmesh/sparse_matrix.h"
313#include <unordered_set>
320class StaticCondensationPreconditioner;
321class StaticCondensationDofMap;
323class StaticCondensation :
public SparseMatrix<Number>
326 StaticCondensation(
const MeshBase &,
328 const DofMap & full_dof_map,
329 StaticCondensationDofMap & reduced_dof_map);
331 const std::unordered_set<unsigned int> &
uncondensed_vars()
const { libmesh_not_implemented(); }
335 libmesh_not_implemented();
346 libmesh_not_implemented();
349 virtual void clear()
override { libmesh_not_implemented(); }
350 virtual void zero()
override { libmesh_not_implemented(); }
351 virtual std::unique_ptr<SparseMatrix<Number>>
zero_clone()
const override
353 libmesh_not_implemented();
355 virtual std::unique_ptr<SparseMatrix<Number>>
clone()
const override
357 libmesh_not_implemented();
359 virtual void close()
override { libmesh_not_implemented(); }
368 libmesh_not_implemented();
372 libmesh_not_implemented();
375 const std::vector<numeric_index_type> &,
376 const std::vector<numeric_index_type> &)
override
378 libmesh_not_implemented();
381 const std::vector<numeric_index_type> &)
override
383 libmesh_not_implemented();
387 libmesh_not_implemented();
391 libmesh_not_implemented();
393 virtual Real l1_norm()
const override { libmesh_not_implemented(); }
395 virtual bool closed()
const override { libmesh_not_implemented(); }
398 libmesh_not_implemented();
403 std::vector<numeric_index_type> &,
404 std::vector<Number> &)
const override
406 libmesh_not_implemented();
408 void init() { libmesh_not_implemented(); }
409 void setup() { libmesh_not_implemented(); }
Defines a dense matrix for use in Finite Element-type computations.
This class handles the numbering of degrees of freedom on a mesh.
This is the base class from which all geometric element types are derived.
This base class can be inherited from to provide interfaces to linear solvers from different packages...
This is the MeshBase class.
Provides a uniform interface to vector storage schemes for different linear algebra libraries.
This class allows to use a PETSc shell matrix as a PetscMatrix.
A class holding degree of freedom information pertinent to static condensation.
virtual numeric_index_type row_start() 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 numeric_index_type col_stop() const override
virtual void get_diagonal(NumericVector< Number > &dest) const override
Copies the diagonal part of the matrix into dest.
virtual Number operator()(const numeric_index_type, const numeric_index_type) const override
virtual void clear() override
clear() is called from the destructor, so it should not throw.
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,...
DenseMatrix< Number > _size_one_mat
Helper data member for adding individual matrix elements.
virtual void get_diagonal(NumericVector< Number > &) const override
Copies the diagonal part of the matrix into dest.
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...
void set_current_elem(const Elem &elem)
Set the current element.
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 add(const Number, const SparseMatrix< Number > &) override
Compute for scalar a, matrix X.
virtual std::unique_ptr< SparseMatrix< Number > > clone() const override
dof_id_type _current_elem_id
The current element ID.
virtual void init(ParallelType) override
Initialize this matrix using the sparsity structure computed by dof_map.
virtual numeric_index_type n() const override
virtual Real l1_norm() const override
std::unique_ptr< LinearSolver< Number > > _reduced_solver
The solver for the uncondensed degrees of freedom.
virtual void clear() noexcept override
clear() is called from the destructor, so it should not throw.
void set_current_elem(const Elem &)
virtual bool initialized() const override
ParallelType _parallel_type
The parallel type to use for the reduced matrix.
virtual numeric_index_type row_stop() const override
virtual numeric_index_type row_stop() const override
virtual void close() override
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
virtual bool require_sparsity_pattern() const override
virtual std::unique_ptr< SparseMatrix< Number > > zero_clone() 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 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 get_transpose(SparseMatrix< Number > &) const override
Copies the transpose of the matrix into dest, which may be *this.
virtual SparseMatrix< Number > & operator=(const SparseMatrix< Number > &) override
This looks like a copy assignment operator, but note that, unlike normal copy assignment operators,...
virtual Real l1_norm() const 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 Real linfty_norm() const override
virtual SolverPackage solver_package() override
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 numeric_index_type, const numeric_index_type, const Number) override
Add value to the element (i,j).
virtual numeric_index_type col_start() const override
std::unique_ptr< NumericVector< Number > > _ghosted_full_sol
This is a ghosted representation of the full (uncondensed + condensed) solution. Note that.
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.
LinearSolver< Number > & reduced_system_solver()
const std::unordered_set< unsigned int > & uncondensed_vars() const
virtual numeric_index_type m() const override
void dont_condense_vars(const std::unordered_set< unsigned int > &)
virtual Real linfty_norm() const override
virtual bool closed() const override
virtual void zero() override
Set all entries to 0.
virtual std::unique_ptr< SparseMatrix< Number > > clone() const override
virtual numeric_index_type m() const override
StaticCondensationDofMap & _reduced_dof_map
bool _uncondensed_dofs_only
whether this matrix represents uncondensed dofs only.
virtual void set(const numeric_index_type, const numeric_index_type, const Number) override
Set the element (i,j) to value.
void uncondensed_dofs_only()
Sets whether this matrix represents uncondensed dofs only.
virtual std::unique_ptr< SparseMatrix< Number > > zero_clone() const override
StaticCondensationPreconditioner & get_preconditioner()
Get the preconditioning wrapper.
std::unique_ptr< NumericVector< Number > > _reduced_rhs
RHS corresponding to the uncondensed degrees of freedom.
std::unordered_map< dof_id_type, MatrixData > _elem_to_matrix_data
A map from element ID to Schur complement data.
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.
void apply(const NumericVector< Number > &, NumericVector< Number > &)
std::unique_ptr< SparseMatrix< Number > > _reduced_sys_mat
global sparse matrix for the uncondensed degrees of freedom
void dont_condense_vars(const std::unordered_set< unsigned int > &vars)
Add vars to the list of variables not to condense.
std::unique_ptr< NumericVector< Number > > _reduced_sol
solution for the uncondensed degrees of freedom
virtual void get_transpose(SparseMatrix< Number > &dest) const override
Copies the transpose of the matrix into dest, which may be *this.
virtual SolverPackage solver_package() override
virtual SparseMatrix< Number > & operator=(const SparseMatrix< Number > &) override
This looks like a copy assignment operator, but note that, unlike normal copy assignment operators,...
virtual numeric_index_type row_start() const override
bool _have_cached_values
Whether we have cached values via add_XXX()
void init()
Size the element matrices.
std::unique_ptr< StaticCondensationPreconditioner > _scp
Preconditioner object which will call back to us for the preconditioning action.
void apply(const NumericVector< Number > &full_rhs, NumericVector< Number > &full_sol)
Perform our three stages, forward_elimination(), a solve() on the condensed system,...
virtual void close() override
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
const DofMap & _full_dof_map
virtual void add(const numeric_index_type i, const numeric_index_type j, const Number value) override
Add value to the element (i,j).
bool _sc_is_initialized
Whether our object has been initialized.
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...
virtual ~StaticCondensation()
virtual void zero() override
Set all entries to 0.
virtual void get_row(numeric_index_type, std::vector< numeric_index_type > &, std::vector< Number > &) const override
Get a row from the matrix.
virtual Number operator()(const numeric_index_type i, const numeric_index_type j) const override
const SparseMatrix< Number > & get_condensed_mat() const
void setup()
A no-op to be consistent with shimming from the StaticCondenstionPreconditioner.
virtual bool closed() const override
Manages consistently variables, degrees of freedom, and coefficient vectors.
The libMesh namespace provides an interface to certain functionality in the library.
Eigen::Matrix< Number, Eigen::Dynamic, Eigen::Dynamic > EigenMatrix
ParallelType
Defines an enum for parallel data structure types.
dof_id_type numeric_index_type
SolverPackage
Defines an enum for various linear solver packages.
Eigen::Matrix< Number, Eigen::Dynamic, 1 > EigenVector
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Data stored on a per-element basis used to compute element Schur complements and their applications t...
std::remove_const< decltype(Acc.partialPivLu())>::type AccFactor
EigenMatrix Auu
uncondensed-uncondensed matrix entries
EigenMatrix Acc
condensed-condensed matrix entries
EigenMatrix Auc
uncondensed-condensed matrix entries
EigenMatrix Acu
condensed-uncondensed matrix entries