15 #include "../config/config.hpp"
54 { data = d; capacity = -h*w; }
61 { data = d;
height = h;
width = w; capacity = -h*w; }
77 inline double *
Data()
const {
return data; }
83 inline const double &
operator()(
int i,
int j)
const;
92 virtual double &
Elem(
int i,
int j);
95 virtual const double &
Elem(
int i,
int j)
const;
98 void Mult(
const double *x,
double *y)
const;
119 double InnerProduct(
const double *x,
const double *y)
const;
136 {
return InnerProduct((
const double *)x, (
const double *)y); }
171 void Norm2(
double *v)
const;
177 double FNorm()
const;
183 { Eigensystem(ev, &evect); }
186 { Eigensystem(ev, &evect); }
189 int Rank(
double tol)
const;
208 void SetRow(
int row,
double value);
210 void SetCol(
int col,
double value);
220 void Diag(
double c,
int n);
222 void Diag(
double *diag,
int n);
257 int row_offset,
int col_offset);
259 void CopyMNDiag(
double c,
int n,
int row_offset,
int col_offset);
261 void CopyMNDiag(
double *diag,
int n,
int row_offset,
int col_offset);
284 virtual void Print(std::ostream &out = std::cout,
int width_ = 4)
const;
285 virtual void PrintMatlab(std::ostream &out = std::cout)
const;
287 virtual void PrintT(std::ostream &out = std::cout,
int width_ = 4)
const;
297 void Add(
const DenseMatrix &A,
const DenseMatrix &B,
298 double alpha, DenseMatrix &C);
301 void Add(
double alpha,
const DenseMatrix &A,
302 double beta,
const DenseMatrix &B, DenseMatrix &C);
305 void Mult(
const DenseMatrix &b,
const DenseMatrix &c, DenseMatrix &a);
308 void AddMult(
const DenseMatrix &b,
const DenseMatrix &c, DenseMatrix &a);
313 void CalcAdjugate(
const DenseMatrix &a, DenseMatrix &adja);
320 void CalcInverse(
const DenseMatrix &a, DenseMatrix &inva);
328 void CalcOrtho(
const DenseMatrix &J, Vector &n);
331 void MultAAt(
const DenseMatrix &a, DenseMatrix &aat);
334 void MultADAt(
const DenseMatrix &A,
const Vector &D, DenseMatrix &ADAt);
337 void AddMultADAt(
const DenseMatrix &A,
const Vector &D, DenseMatrix &ADAt);
340 void MultABt(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &ABt);
343 void MultADBt(
const DenseMatrix &A,
const Vector &D,
344 const DenseMatrix &B, DenseMatrix &ADAt);
347 void AddMultABt(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &ABt);
350 void MultAtB(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &AtB);
353 void AddMult_a_AAt(
double a,
const DenseMatrix &A, DenseMatrix &AAt);
356 void Mult_a_AAt(
double a,
const DenseMatrix &A, DenseMatrix &AAt);
359 void MultVVt(
const Vector &v, DenseMatrix &vvt);
361 void MultVWt(
const Vector &v,
const Vector &w, DenseMatrix &VWt);
364 void AddMultVWt(
const Vector &v,
const Vector &w, DenseMatrix &VWt);
367 void AddMult_a_VWt(
const double a,
const Vector &v,
const Vector &w,
371 void AddMult_a_VVt(
const double a,
const Vector &v, DenseMatrix &VVt);
381 #ifdef MFEM_USE_LAPACK
400 void Mult(
int m,
int n,
double *X)
const;
404 void LSolve(
int m,
int n,
double *X)
const;
408 void USolve(
int m,
int n,
double *X)
const;
412 void Solve(
int m,
int n,
double *X)
const;
419 static void SubMult(
int m,
int n,
int r,
const double *A21,
420 const double *X1,
double *X2);
432 void BlockFactor(
int m,
int n,
double *A12,
double *A21,
double *A22)
const;
450 double *B1,
double *B2)
const;
459 const double *X2,
double *Y1)
const;
522 #ifdef MFEM_USE_LAPACK
549 #ifdef MFEM_USE_LAPACK
589 tdata =
new double[i*j*k];
599 if (own_data) {
delete [] tdata; }
602 tdata =
new double[i*j*k];
608 if (own_data) {
delete [] tdata; }
626 double *
Data() {
return tdata; }
634 if (own_data) {
delete [] tdata; }
643 MFEM_ASSERT(data && i >= 0 && i < height && j >= 0 && j <
width,
"");
649 MFEM_ASSERT(data && i >= 0 && i < height && j >= 0 && j <
width,
"");
virtual void PrintT(std::ostream &out=std::cout, int width_=4) const
Prints the transpose matrix to stream out.
int Size() const
For backward compatibility define Size to be synonym of Width()
void Symmetrize()
(*this) = 1/2 ((*this) + (*this)^t)
void MultABt(const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &ABt)
Multiply a matrix A with the transpose of a matrix B: A*Bt.
void SymmetricScaling(const Vector &s)
SymmetricScaling this = diag(sqrt(s)) * this * diag(sqrt(s))
int CheckFinite(const double *v, const int n)
void AddMultVWt(const Vector &v, const Vector &w, DenseMatrix &VWt)
VWt += v w^t.
DenseMatrix & operator*=(double c)
void GetDiag(Vector &d) const
Returns the diagonal of the matrix.
void UseExternalData(double *ext_data, int i, int j, int k)
void MultVWt(const Vector &v, const Vector &w, DenseMatrix &VWt)
DenseMatrix & operator+=(DenseMatrix &m)
void InvRightScaling(const Vector &s)
InvRightScaling: this = this * diag(1./s);.
const DenseMatrix & operator()(int k) const
void Eigenvalues(Vector &ev)
void SingularValues(Vector &sv) const
DenseMatrix & operator()(int k)
double Det() const
Calculates the determinant of the matrix (for 2x2 or 3x3 matrices)
void Mult(const Table &A, const Table &B, Table &C)
C = A * B (as boolean matrices)
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols.
void BlockFactor(int m, int n, double *A12, double *A21, double *A22) const
void BlockBackSolve(int m, int n, int r, const double *U12, const double *X2, double *Y1) const
double InnerProduct(const double *x, const double *y) const
Compute y^t A x.
void CalcAdjugate(const DenseMatrix &a, DenseMatrix &adja)
void AddMult(const Table &elem_dof, const Vector &x, Vector &y) const
void TestInversion()
Invert and print the numerical conditioning of the inversion.
Data type dense matrix using column-major storage.
void CopyRows(const DenseMatrix &A, int row1, int row2)
Copy rows row1 through row2 from A to *this.
void SetSize(int i, int j, int k)
void Eval(DenseMatrix &M)
Abstract data type for matrix inverse.
void GetInverseMatrix(DenseMatrix &Ainv) const
Compute and return the inverse matrix in Ainv.
void Factor()
Factor the current DenseMatrix, *a.
void GetInverseMatrix(int m, double *X) const
Assuming L.U = P.A factored data of size (m x m), compute X <- A^{-1}.
void CalcOrtho(const DenseMatrix &J, Vector &n)
DenseMatrix & operator=(double c)
Sets the matrix elements equal to constant c.
void Mult_a_AAt(double a, const DenseMatrix &A, DenseMatrix &AAt)
AAt = a * A * A^t.
static void SubMult(int m, int n, int r, const double *A21, const double *X1, double *X2)
const Vector & Eigenvector(int i)
virtual void Mult(const Vector &x, Vector &y) const
Matrix vector multiplication with the inverse of dense matrix.
const double & operator()(int i, int j, int k) const
void Add(const DenseMatrix &A, const DenseMatrix &B, double alpha, DenseMatrix &C)
C = A + alpha*B.
double & operator()(int i, int j)
Returns reference to a_{ij}.
void USolve(int m, int n, double *X) const
double FNorm() const
Compute the Frobenius norm of the matrix.
void MultTranspose(const double *x, double *y) const
Multiply a vector with the transpose matrix.
void CalcAdjugateTranspose(const DenseMatrix &a, DenseMatrix &adjat)
Calculate the transposed adjugate of a matrix (for NxN matrices, N=1,2,3)
double & operator()(int i, int j, int k)
void AddMult(const DenseMatrix &b, const DenseMatrix &c, DenseMatrix &a)
Matrix matrix multiplication. A += B * C.
double operator*(const DenseMatrix &m) const
Matrix inner product: tr(A^t B)
double Singularvalue(int i)
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows.
void Add(const double c, const DenseMatrix &A)
Adds the matrix A multiplied by the number c to the matrix.
void AddMult_a_VWt(const double a, const Vector &v, const Vector &w, DenseMatrix &VWt)
VWt += a * v w^t.
void InvSymmetricScaling(const Vector &s)
InvSymmetricScaling this = diag(sqrt(1./s)) * this * diag(sqrt(1./s))
void BlockForwSolve(int m, int n, int r, const double *L21, double *B1, double *B2) const
DenseMatrixSVD(DenseMatrix &M)
Abstract data type matrix.
void Norm2(double *v) const
Take the 2-norm of the columns of A and store in v.
void Invert()
Replaces the current matrix with its inverse.
virtual ~DenseMatrixInverse()
Destroys dense inverse matrix.
void LSolve(int m, int n, double *X) const
void LeftScaling(const Vector &s)
LeftScaling this = diag(s) * this.
void CopyMNDiag(double c, int n, int row_offset, int col_offset)
Copy c on the diagonal of size n to *this at row_offset, col_offset.
virtual void PrintMatlab(std::ostream &out=std::cout) const
~DenseMatrixEigensystem()
void AddMult_a_VVt(const double a, const Vector &v, DenseMatrix &VVt)
VVt += a * v v^t.
void Neg()
(*this) = -(*this)
virtual void Print(std::ostream &out=std::cout, int width_=4) const
Prints matrix to stream out.
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
void Solve(int m, int n, double *X) const
void SetRow(int r, const Vector &row)
void Getl1Diag(Vector &l) const
Returns the l1 norm of the rows of the matrix v_i = sum_j |a_ij|.
void AddToVector(int offset, Vector &v) const
Add the matrix 'data' to the Vector 'v' at the given 'offset'.
DenseMatrix & Eigenvectors()
void GetColumn(int c, Vector &col) const
void AddMult(const Vector &x, Vector &y) const
y += A.x
void Threshold(double eps)
Replace small entries, abs(a_ij) <= eps, with zero.
void CalcInverse(const DenseMatrix &a, DenseMatrix &inva)
void TestInversion()
Print the numerical conditioning of the inversion: ||A^{-1} A - I||.
double MaxMaxNorm() const
Compute the norm ||A|| = max_{ij} |A_{ij}|.
double * Data() const
Returns vector of the elements.
void Transpose()
(*this) = (*this)^t
void MultVVt(const Vector &v, DenseMatrix &vvt)
Make a matrix from a vector V.Vt.
double Trace() const
Trace of a square matrix.
void AddMultABt(const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &ABt)
ABt += A * B^t.
DenseTensor(int i, int j, int k)
void MultAAt(const DenseMatrix &a, DenseMatrix &aat)
Calculate the matrix A.At.
void GetColumnReference(int c, Vector &col)
void AddMatrix(DenseMatrix &A, int ro, int co)
Perform (ro+i,co+j)+=A(i,j) for 0<=i<A.Height, 0<=j<A.Width.
DenseMatrix(double *d, int h, int w)
void CalcInverseTranspose(const DenseMatrix &a, DenseMatrix &inva)
Calculate the inverse transpose of a matrix (for NxN matrices, N=1,2,3)
void SetDataAndSize(double *d, int s)
DenseMatrix & operator-=(DenseMatrix &m)
void MultADAt(const DenseMatrix &A, const Vector &D, DenseMatrix &ADAt)
ADAt = A D A^t, where D is diagonal.
void CopyCols(const DenseMatrix &A, int col1, int col2)
Copy columns col1 through col2 from A to *this.
virtual MatrixInverse * Inverse() const
Returns a pointer to the inverse matrix.
virtual ~DenseMatrix()
Destroys dense matrix.
void CopyMNt(const DenseMatrix &A, int row_offset, int col_offset)
Copy matrix A^t to the location in *this at row_offset, col_offset.
void Diag(double c, int n)
Creates n x n diagonal matrix with diagonal elements c.
void Mult(int m, int n, double *X) const
void MultADBt(const DenseMatrix &A, const Vector &D, const DenseMatrix &B, DenseMatrix &ADBt)
ADBt = A D B^t, where D is diagonal.
static const int ipiv_base
void GradToCurl(DenseMatrix &curl)
DenseMatrixInverse()
Default constructor.
double CalcSingularvalue(const int i) const
Return the i-th singular value (decreasing order) of NxN matrix, N=1,2,3.
void GetRowSums(Vector &l) const
Compute the row sums of the DenseMatrix.
void GetRow(int r, Vector &row)
void CalcEigenvalues(double *lambda, double *vec) const
void Eigenvalues(Vector &ev, DenseMatrix &evect)
DenseMatrixEigensystem(DenseMatrix &m)
int Rank(double tol) const
LUFactors(double *data_, int *ipiv_)
void AddMult_a(double a, const Vector &x, Vector &y) const
y += a * A.x
void RightScaling(const Vector &s)
RightScaling: this = this * diag(s);.
void MultAtB(const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &AtB)
Multiply the transpose of a matrix A with a matrix B: At*B.
void Mult(const double *x, double *y) const
Matrix vector multiplication.
void AddMultTranspose_a(double a, const Vector &x, Vector &y) const
void AddMultADAt(const DenseMatrix &A, const Vector &D, DenseMatrix &ADAt)
ADAt += A D A^t, where D is diagonal.
void GetFromVector(int offset, const Vector &v)
Get the matrix 'data' from the Vector 'v' at the given 'offset'.
void CopyMN(const DenseMatrix &A, int m, int n, int Aro, int Aco)
Copy the m x n submatrix of A at row/col offsets Aro/Aco to *this.
void InvLeftScaling(const Vector &s)
InvLeftScaling this = diag(1./s) * this.
void UseExternalData(double *d, int h, int w)
void SetCol(int c, const Vector &col)
void Eigensystem(Vector &ev, DenseMatrix &evect)
void SetSize(int s)
Change the size of the DenseMatrix to s x s.
int Size() const
Get the size of the inverse matrix.
Vector & Singularvalues()
Rank 3 tensor (array of matrices)
double InnerProduct(const Vector &x, const Vector &y) const
Compute y^t A x.
virtual double & Elem(int i, int j)
Returns reference to a_{ij}.
void AdjustDofDirection(Array< int > &dofs)
void GradToDiv(Vector &div)
void AddMult_a_AAt(double a, const DenseMatrix &A, DenseMatrix &AAt)
AAt += a * A * A^t.