Files
mfem/linalg/matrix.hpp
T

123 lines
3.8 KiB
C++

// Copyright (c) 2010-2020, Lawrence Livermore National Security, LLC. Produced
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
// LICENSE and NOTICE for details. LLNL-CODE-806117.
//
// This file is part of the MFEM library. For more information and source code
// availability visit https://mfem.org.
//
// MFEM is free software; you can redistribute it and/or modify it under the
// terms of the BSD-3 license. We welcome feedback and contributions, see file
// CONTRIBUTING.md for details.
#ifndef MFEM_MATRIX
#define MFEM_MATRIX
#include "../general/array.hpp"
#include "../general/globals.hpp"
#include "operator.hpp"
namespace mfem
{
// Abstract data types matrix, inverse matrix
class MatrixInverse;
/// Abstract data type matrix
class Matrix : public Operator
{
friend class MatrixInverse;
public:
/// Defines matrix diagonal policy upon elimination of rows and/or columns.
enum DiagonalPolicy
{
DIAG_ZERO, ///< Set the diagonal value to zero
DIAG_ONE, ///< Set the diagonal value to one
DIAG_KEEP ///< Keep the diagonal value
};
/// Creates a square matrix of size s.
explicit Matrix(int s) : Operator(s) { }
/// Creates a matrix of the given height and width.
explicit Matrix(int h, int w) : Operator(h, w) { }
/// Returns whether the matrix is a square matrix.
bool IsSquare() const { return (height == width); };
/// Returns reference to a_{ij}.
virtual double &Elem(int i, int j) = 0;
/// Returns constant reference to a_{ij}.
virtual const double &Elem(int i, int j) const = 0;
/// Returns a pointer to (an approximation) of the matrix inverse.
virtual MatrixInverse *Inverse() const = 0;
/// Finalizes the matrix initialization.
virtual void Finalize(int) { }
/// Prints matrix to stream out.
virtual void Print (std::ostream & out = mfem::out, int width_ = 4) const;
/// Destroys matrix.
virtual ~Matrix() { }
};
/// Abstract data type for matrix inverse
class MatrixInverse : public Solver
{
public:
MatrixInverse() { }
/// Creates approximation of the inverse of square matrix
MatrixInverse(const Matrix &mat)
: Solver(mat.height, mat.width) { }
};
/// Abstract data type for sparse matrices
class AbstractSparseMatrix : public Matrix
{
public:
/// Creates a square matrix of the given size.
explicit AbstractSparseMatrix(int s = 0) : Matrix(s) { }
/// Creates a matrix of the given height and width.
explicit AbstractSparseMatrix(int h, int w) : Matrix(h, w) { }
/// Returns the number of non-zeros in a matrix
virtual int NumNonZeroElems() const = 0;
/// Gets the columns indexes and values for row *row*.
/** Returns:
- 0 if @a cols and @a srow are copies of the values in the matrix.
- 1 if @a cols and @a srow are views of the values in the matrix. */
virtual int GetRow(const int row, Array<int> &cols, Vector &srow) const = 0;
/** @brief If the matrix is square, this method will place 1 on the diagonal
(i,i) if row i has "almost" zero l1-norm.
If entry (i,i) does not belong to the sparsity pattern of A, then an
error will occur. */
virtual void EliminateZeroRows(const double threshold = 1e-12) = 0;
/// Matrix-Vector Multiplication y = A*x
virtual void Mult(const Vector &x, Vector &y) const = 0;
/// Matrix-Vector Multiplication y = y + val*A*x
virtual void AddMult(const Vector &x, Vector &y,
const double val = 1.) const = 0;
/// MatrixTranspose-Vector Multiplication y = A'*x
virtual void MultTranspose(const Vector &x, Vector &y) const = 0;
/// MatrixTranspose-Vector Multiplication y = y + val*A'*x
virtual void AddMultTranspose(const Vector &x, Vector &y,
const double val = 1.) const = 0;
/// Destroys AbstractSparseMatrix.
virtual ~AbstractSparseMatrix() { }
};
}
#endif