15 #include "../config/config.hpp"
16 #include "../general/globals.hpp"
36 void FNorm(
double &scale_factor,
double &scaled_fnorm2)
const;
63 template <
int M,
int N>
67 for (
int i = 0; i < M; i++)
69 for (
int j = 0; j < N; j++)
71 (*this)(i,j) = values[i][j];
82 data.
Wrap(d, h*w,
false);
90 void Reset(
double *d,
int h,
int w)
112 {
return const_cast<double*
>((
const double*)data);}
127 inline const double &
operator()(
int i,
int j)
const;
133 double Trace()
const;
136 virtual double &
Elem(
int i,
int j);
139 virtual const double &
Elem(
int i,
int j)
const;
142 void Mult(
const double *x,
double *y)
const;
166 double InnerProduct(
const double *x,
const double *y)
const;
183 {
return InnerProduct((
const double *)x, (
const double *)y); }
202 void Set(
double alpha,
const double *A);
215 void Add(
const double c,
const double *A);
237 void Norm2(
double *v)
const;
243 double FNorm()
const {
double s, n2;
FNorm(s, n2);
return s*sqrt(n2); }
254 { Eigensystem(ev, &evect); }
258 { Eigensystem(ev, &evect); }
263 { Eigensystem(b, ev); }
267 { Eigensystem(b, ev, &evect); }
272 { Eigensystem(b, ev, &evect); }
275 int Rank(
double tol)
const;
292 void SetRow(
int r,
const double* row);
295 void SetCol(
int c,
const double* col);
300 void SetRow(
int row,
double value);
302 void SetCol(
int col,
double value);
312 void Diag(
double c,
int n);
314 void Diag(
double *diag,
int n);
354 int row_offset,
int col_offset);
356 void CopyMNDiag(
double c,
int n,
int row_offset,
int col_offset);
358 void CopyMNDiag(
double *diag,
int n,
int row_offset,
int col_offset);
443 const double *
Read(
bool on_dev =
true)
const
473 void Add(
const DenseMatrix &A,
const DenseMatrix &B,
474 double alpha, DenseMatrix &C);
477 void Add(
double alpha,
const double *A,
478 double beta,
const double *B, DenseMatrix &C);
481 void Add(
double alpha,
const DenseMatrix &A,
482 double beta,
const DenseMatrix &B, DenseMatrix &C);
498 bool LinearSolve(DenseMatrix& A,
double* X,
double TOL = 1.e-9);
501 void Mult(
const DenseMatrix &
b,
const DenseMatrix &c, DenseMatrix &
a);
504 void AddMult(
const DenseMatrix &
b,
const DenseMatrix &c, DenseMatrix &
a);
507 void AddMult_a(
double alpha,
const DenseMatrix &
b,
const DenseMatrix &c,
520 void CalcInverse(
const DenseMatrix &
a, DenseMatrix &inva);
528 void CalcOrtho(
const DenseMatrix &J, Vector &n);
531 void MultAAt(
const DenseMatrix &
a, DenseMatrix &aat);
534 void MultADAt(
const DenseMatrix &A,
const Vector &D, DenseMatrix &ADAt);
537 void AddMultADAt(
const DenseMatrix &A,
const Vector &D, DenseMatrix &ADAt);
540 void MultABt(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &ABt);
543 void MultADBt(
const DenseMatrix &A,
const Vector &D,
544 const DenseMatrix &B, DenseMatrix &ADBt);
547 void AddMultABt(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &ABt);
550 void AddMultADBt(
const DenseMatrix &A,
const Vector &D,
551 const DenseMatrix &B, DenseMatrix &ADBt);
554 void AddMult_a_ABt(
double a,
const DenseMatrix &A,
const DenseMatrix &B,
558 void MultAtB(
const DenseMatrix &A,
const DenseMatrix &B, DenseMatrix &AtB);
561 void AddMult_a_AAt(
double a,
const DenseMatrix &A, DenseMatrix &AAt);
564 void Mult_a_AAt(
double a,
const DenseMatrix &A, DenseMatrix &AAt);
567 void MultVVt(
const Vector &v, DenseMatrix &vvt);
569 void MultVWt(
const Vector &v,
const Vector &w, DenseMatrix &VWt);
572 void AddMultVWt(
const Vector &v,
const Vector &w, DenseMatrix &VWt);
575 void AddMultVVt(
const Vector &v, DenseMatrix &VWt);
578 void AddMult_a_VWt(
const double a,
const Vector &v,
const Vector &w,
582 void AddMult_a_VVt(
const double a,
const Vector &v, DenseMatrix &VVt);
586 void RAP(
const DenseMatrix &A,
const DenseMatrix &P, DenseMatrix &
RAP);
590 void RAP(
const DenseMatrix &Rt,
const DenseMatrix &A,
591 const DenseMatrix &P, DenseMatrix &
RAP);
605 virtual bool Factor(
int m,
double TOL = 0.0)
611 virtual double Det(
int m)
const
617 virtual void Solve(
int m,
int n,
double *X)
const
637 #ifdef MFEM_USE_LAPACK
661 virtual bool Factor(
int m,
double TOL = 0.0);
665 virtual double Det(
int m)
const;
669 void Mult(
int m,
int n,
double *X)
const;
673 void LSolve(
int m,
int n,
double *X)
const;
677 void USolve(
int m,
int n,
double *X)
const;
681 virtual void Solve(
int m,
int n,
double *X)
const;
685 void RightSolve(
int m,
int n,
double *X)
const;
692 static void SubMult(
int m,
int n,
int r,
const double *A21,
693 const double *X1,
double *X2);
705 void BlockFactor(
int m,
int n,
double *A12,
double *A21,
double *A22)
const;
723 double *B1,
double *B2)
const;
732 const double *X2,
double *Y1)
const;
760 virtual bool Factor(
int m,
double TOL = 0.0);
764 virtual double Det(
int m)
const;
768 void LMult(
int m,
int n,
double *X)
const;
772 void UMult(
int m,
int n,
double *X)
const;
776 void LSolve(
int m,
int n,
double *X)
const;
780 void USolve(
int m,
int n,
double *X)
const;
784 virtual void Solve(
int m,
int n,
double *X)
const;
788 void RightSolve(
int m,
int n,
double *X)
const;
807 bool own_data =
false;
831 void Mult(
const double *x,
double *y)
const;
855 #ifdef MFEM_USE_LAPACK
905 bool left_eigen_vectors =
false,
906 bool right_eigen_vectors =
false);
925 #ifdef MFEM_USE_LAPACK
934 bool left_singular_vectors=
false,
935 bool right_singlular_vectors=
false);
937 bool left_singular_vectors=
false,
938 bool right_singlular_vectors=
false);
947 #endif // if MFEM_USE_LAPACK
977 tdata.
Wrap(d, i*j*k,
false);
984 tdata.
New(i*j*k, mt);
989 : Mk(NULL, other.Mk.height, other.Mk.width), nk(other.nk)
1011 tdata.
New(i*j*k, mt);
1019 tdata.
Wrap(ext_data, i*j*k,
false);
1030 MFEM_ASSERT_INDEX_IN_RANGE(k, 0,
SizeK());
1036 MFEM_ASSERT_INDEX_IN_RANGE(k, 0,
SizeK());
1044 MFEM_ASSERT_INDEX_IN_RANGE(i, 0,
SizeI());
1045 MFEM_ASSERT_INDEX_IN_RANGE(j, 0,
SizeJ());
1046 MFEM_ASSERT_INDEX_IN_RANGE(k, 0,
SizeK());
1052 MFEM_ASSERT_INDEX_IN_RANGE(i, 0,
SizeI());
1053 MFEM_ASSERT_INDEX_IN_RANGE(j, 0,
SizeJ());
1054 MFEM_ASSERT_INDEX_IN_RANGE(k, 0,
SizeK());
1060 MFEM_ASSERT_INDEX_IN_RANGE(k, 0,
SizeK());
1066 MFEM_ASSERT_INDEX_IN_RANGE(k, 0,
SizeK());
1072 const double *
Data()
const {
return tdata; }
1087 const double *
Read(
bool on_dev =
true)
const
1129 void BatchLUFactor(DenseTensor &Mlu, Array<int> &P,
const double TOL = 0.0);
1140 void BatchLUSolve(
const DenseTensor &Mlu,
const Array<int> &P, Vector &X);
1147 MFEM_ASSERT(data && i >= 0 && i < height && j >= 0 && j <
width,
"");
1153 MFEM_ASSERT(data && i >= 0 && i < height && j >= 0 && j <
width,
"");
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.
DenseMatrix & operator-=(const DenseMatrix &m)
void SymmetricScaling(const Vector &s)
SymmetricScaling this = diag(sqrt(s)) * this * diag(sqrt(s))
void SquareRootInverse()
Replaces the current matrix with its square root inverse.
int CheckFinite(const double *v, const int n)
void BatchLUFactor(DenseTensor &Mlu, Array< int > &P, const double TOL)
Compute the LU factorization of a batch of matrices.
void AddMultVWt(const Vector &v, const Vector &w, DenseMatrix &VWt)
VWt += v w^t.
void Mult(DenseMatrix &X) const
Multiply the inverse matrix by another matrix: X <- A^{-1} X.
DenseMatrix & operator*=(double c)
void GetDiag(Vector &d) const
Returns the diagonal of the matrix.
void SetCol(int c, const double *col)
void UseExternalData(double *ext_data, int i, int j, int k)
DenseTensor & operator=(double c)
Sets the tensor elements equal to constant c.
void MultVWt(const Vector &v, const Vector &w, DenseMatrix &VWt)
double * HostWrite()
Shortcut for mfem::Write(GetMemory(), TotalSize(), false).
Memory< double > & GetMemory()
void SetRow(int r, const double *row)
void InvRightScaling(const Vector &s)
InvRightScaling: this = this * diag(1./s);.
const DenseMatrix & operator()(int k) const
void Eigenvalues(Vector &ev)
Compute eigenvalues of A x = ev x where A = *this.
void SingularValues(Vector &sv) const
void Delete()
Delete the owned pointers and reset the Memory object.
DenseMatrix & operator()(int k)
void Eigensystem(DenseMatrix &b, Vector &ev, DenseMatrix &evect)
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().
virtual void GetInverseMatrix(int m, double *X) const
Assuming L.L^t = A factored data of size (m x m), compute X <- A^{-1}.
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.
std::size_t MemoryUsage() const
void CalcAdjugate(const DenseMatrix &a, DenseMatrix &adja)
DenseMatrixSVD(DenseMatrix &M, bool left_singular_vectors=false, bool right_singlular_vectors=false)
const double * Read(bool on_dev=true) const
Shortcut for mfem::Read( GetMemory(), TotalSize(), on_dev).
double EigenvalueImagPart(int i)
T * Write(Memory< T > &mem, int size, bool on_dev=true)
Get a pointer for write access to mem with the mfem::Device's DeviceMemoryClass, if on_dev = true...
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.
DenseMatrix & LeftSingularvectors()
void CopyRows(const DenseMatrix &A, int row1, int row2)
Copy rows row1 through row2 from A to *this.
virtual double Det(int m) const
void Swap(DenseTensor &t)
virtual void GetInverseMatrix(int m, double *X) const
void Eval(DenseMatrix &M)
const double * Data() const
Abstract data type for matrix inverse.
void AddMult_a_ABt(double a, const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &ABt)
ABt += a * A * B^t.
void LMult(int m, int n, double *X) const
double * HostReadWrite()
Shortcut for mfem::ReadWrite(GetMemory(), TotalSize(), false).
void GetInverseMatrix(DenseMatrix &Ainv) const
Compute and return the inverse matrix in Ainv.
void Factor()
Factor the current DenseMatrix, *a.
void CopyFrom(const Memory &src, int size)
Copy size entries from src to *this.
void GradToVectorCurl2D(DenseMatrix &curl)
virtual void GetInverseMatrix(int m, double *X) const
Assuming L.U = P.A factored data of size (m x m), compute X <- A^{-1}.
double * GetData() const
Returns the matrix data array.
const Memory< double > & GetMemory() const
Vector & EigenvaluesImagPart()
void CalcOrtho(const DenseMatrix &J, Vector &n)
DenseMatrix & operator=(double c)
Sets the matrix elements equal to constant c.
void Set(double alpha, const double *A)
Set the matrix to alpha * A, assuming that A has the same dimensions as the matrix and uses column-ma...
int Capacity() const
Return the size of the allocated memory.
void Mult_a_AAt(double a, const DenseMatrix &A, DenseMatrix &AAt)
AAt = a * A * A^t.
MemoryType GetMemoryType() const
Return a MemoryType that is currently valid. If both the host and the device pointers are currently v...
static void SubMult(int m, int n, int r, const double *A21, const double *X1, double *X2)
void USolve(int m, int n, double *X) const
const Vector & Eigenvector(int i)
virtual void Print(std::ostream &out=mfem::out, int width_=4) const
Prints matrix to stream out.
const double & operator()(int i, int j, int k) const
void Set(double alpha, const DenseMatrix &A)
Set the matrix to alpha * A.
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 Wrap(T *ptr, int size, bool own)
Wrap an externally allocated host pointer, ptr with the current host memory type returned by MemoryMa...
void USolve(int m, int n, double *X) const
double FNorm() const
Compute the Frobenius norm of the matrix.
const double * HostRead() const
Shortcut for mfem::Read(GetMemory(), TotalSize(), false).
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 RightSolve(int m, int n, double *X) const
DenseMatrix & RightEigenvectors()
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)
void Reset(double *d, int h, int w)
Change the data array and the size of the DenseMatrix.
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
DenseMatrix(const double(&values)[M][N])
void Add(const double c, const DenseMatrix &A)
Adds the matrix A multiplied by the number c to the matrix.
void mfem_error(const char *msg)
Function called when an error is encountered. Used by the macros MFEM_ABORT, MFEM_ASSERT, MFEM_VERIFY.
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 GetRow(int r, Vector &row) const
void BlockForwSolve(int m, int n, int r, const double *L21, double *B1, double *B2) const
Abstract data type matrix.
const double * GetColumn(int col) const
void Norm2(double *v) const
Take the 2-norm of the columns of A and store in v.
void MultADBt(const DenseMatrix &A, const Vector &D, const DenseMatrix &B, DenseMatrix &ADBt)
ADBt = A D B^t, where D is diagonal.
void Invert()
Replaces the current matrix with its inverse.
bool LinearSolve(DenseMatrix &A, double *X, double TOL)
Solves the dense linear system, A * X = B for X
virtual ~DenseMatrixInverse()
Destroys dense inverse matrix.
void LSolve(int m, int n, double *X) const
DenseTensor(int i, int j, int k, MemoryType mt)
DenseTensor(double *d, int i, int j, int k)
DenseMatrixGeneralizedEigensystem(DenseMatrix &a, DenseMatrix &b, bool left_eigen_vectors=false, bool right_eigen_vectors=false)
void LeftScaling(const Vector &s)
LeftScaling this = diag(s) * this.
double Det() const
Compute the determinant of the original DenseMatrix using the LU factors.
void AddMultVVt(const Vector &v, DenseMatrix &VVt)
VVt += v v^t.
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 double Det(int m) const
bool OwnsHostPtr() const
Return true if the host pointer is owned. Ownership indicates whether the pointer will be deleted by ...
DenseMatrix & LeftEigenvectors()
~DenseMatrixEigensystem()
void AddMult_a_VVt(const double a, const Vector &v, DenseMatrix &VVt)
VVt += a * v v^t.
void Neg()
(*this) = -(*this)
void SetSize(int i, int j, int k, MemoryType mt_=MemoryType::PRESERVE)
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
virtual void Solve(int m, int n, double *X) const
double * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(GetMemory(), TotalSize(), on_dev).
void Getl1Diag(Vector &l) const
Returns the l1 norm of the rows of the matrix v_i = sum_j |a_ij|.
void RAP(const DenseMatrix &A, const DenseMatrix &P, DenseMatrix &RAP)
void AddToVector(int offset, Vector &v) const
Add the matrix 'data' to the Vector 'v' at the given 'offset'.
const T * Read(const Memory< T > &mem, int size, bool on_dev=true)
Get a pointer for read access to mem with the mfem::Device's DeviceMemoryClass, if on_dev = true...
DenseMatrix & Eigenvectors()
void Reset()
Reset the memory to be empty, ensuring that Delete() will be a no-op.
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 the matrix data array.
void Swap(Array< T > &, Array< T > &)
void LSolve(int m, int n, double *X) const
void Transpose()
(*this) = (*this)^t
void MultVVt(const Vector &v, DenseMatrix &vvt)
Make a matrix from a vector V.Vt.
ComplexDenseMatrix * MultAtB(const ComplexDenseMatrix &A, const ComplexDenseMatrix &B)
Multiply the complex conjugate transpose of a matrix A with a matrix B. A^H*B.
double Trace() const
Trace of a square matrix.
void AddMultABt(const DenseMatrix &A, const DenseMatrix &B, DenseMatrix &ABt)
ABt += A * B^t.
void BatchLUSolve(const DenseTensor &Mlu, const Array< int > &P, Vector &X)
Solve batch linear systems.
virtual bool Factor(int m, double TOL=0.0)
Compute the Cholesky factorization of the current matrix.
MemoryType
Memory types supported by MFEM.
DenseTensor(int i, int j, int k)
Vector & EigenvaluesRealPart()
void MultAAt(const DenseMatrix &a, DenseMatrix &aat)
Calculate the matrix A.At.
void GetColumnReference(int c, Vector &col)
void Swap(DenseMatrix &other)
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)
Construct a DenseMatrix using an existing data array.
double * HostWrite()
Shortcut for mfem::Write(GetMemory(), TotalSize(), false).
void Clear()
Delete the matrix data array (if owned) and reset the matrix state.
void Mult(const double *x, double *y) const
Matrix vector multiplication with the inverse of dense matrix.
void CalcInverseTranspose(const DenseMatrix &a, DenseMatrix &inva)
Calculate the inverse transpose of a matrix (for NxN matrices, N=1,2,3)
double * HostReadWrite()
Shortcut for mfem::ReadWrite(GetMemory(), TotalSize(), false).
A class to initialize the size of a Tensor.
void SetDataAndSize(double *d, int s)
Set the Vector data and size.
void SetSubMatrix(const Array< int > &idx, const DenseMatrix &A)
Set (*this)(idx[i],idx[j]) = A(i,j)
void MultADAt(const DenseMatrix &A, const Vector &D, DenseMatrix &ADAt)
ADAt = A D A^t, where D is diagonal.
void Eigenvalues(DenseMatrix &b, Vector &ev)
int height
Dimension of the output / number of rows in the matrix.
double * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(GetMemory(), TotalSize(), on_dev).
virtual void PrintT(std::ostream &out=mfem::out, int width_=4) const
Prints the transpose matrix to stream out.
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.
double * GetColumn(int col)
bool OwnsData() const
Return the DenseMatrix data (host pointer) ownership flag.
void AddMultADBt(const DenseMatrix &A, const Vector &D, const DenseMatrix &B, DenseMatrix &ADBt)
ADBt = A D B^t, where D is diagonal.
virtual ~DenseMatrix()
Destroys dense matrix.
T * ReadWrite(Memory< T > &mem, int size, bool on_dev=true)
Get a pointer for read+write access to mem with the mfem::Device's DeviceMemoryClass, if on_dev = true, or the mfem::Device's HostMemoryClass, otherwise.
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 AddMultTranspose(const Vector &x, Vector &y) const
y += A^t x
void CopyExceptMN(const DenseMatrix &A, int m, int n)
Copy All rows and columns except m and n from A.
virtual double Det(int m) const
void New(int size)
Allocate host memory for size entries with the current host memory type returned by MemoryManager::Ge...
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
virtual bool Factor(int m, double TOL=0.0)
Compute the LU factorization of the current matrix.
DenseMatrixInverse(bool spd_=false)
Default constructor.
double EigenvalueRealPart(int i)
static const int ipiv_base
void GradToCurl(DenseMatrix &curl)
virtual void Solve(int m, int n, double *X) const
const double * GetData(int k) const
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 CalcEigenvalues(double *lambda, double *vec) const
virtual bool Factor(int m, double TOL=0.0)
const Memory< double > & GetMemory() const
DenseMatrix & RightSingularvectors()
void RightSolve(int m, int n, double *X) const
void Eigenvalues(Vector &ev, DenseMatrix &evect)
Compute eigenvalues and eigenvectors of A x = ev x where A = *this.
DenseMatrixEigensystem(DenseMatrix &m)
const double * HostRead() const
Shortcut for mfem::Read(GetMemory(), TotalSize(), false).
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);.
DenseTensor(const DenseTensor &other)
Copy constructor: deep copy.
void Mult(const double *x, double *y) const
Matrix vector multiplication.
void AddMultTranspose_a(double a, const Vector &x, Vector &y) const
y += a * A^t x
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'.
Memory< double > & GetMemory()
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.
double * Write(bool on_dev=true)
Shortcut for mfem::Write(GetMemory(), TotalSize(), on_dev).
void GetSubMatrix(const Array< int > &idx, DenseMatrix &A) const
double * Write(bool on_dev=true)
Shortcut for mfem::Write(GetMemory(), TotalSize(), on_dev).
~DenseMatrixGeneralizedEigensystem()
void InvLeftScaling(const Vector &s)
InvLeftScaling this = diag(1./s) * this.
void UseExternalData(double *d, int h, int w)
Change the data array and the size of the DenseMatrix.
void Eigensystem(Vector &ev, DenseMatrix &evect)
Compute eigenvalues and eigenvectors of A x = ev x where A = *this.
void SetSize(int s)
Change the size of the DenseMatrix to s x s.
std::size_t MemoryUsage() const
OutStream out(std::cout)
Global stream used by the library for standard output. Initially it uses the same std::streambuf as s...
void AddMult_a(double alpha, const DenseMatrix &b, const DenseMatrix &c, DenseMatrix &a)
Matrix matrix multiplication. A += alpha * B * C.
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.
double FNorm2() const
Compute the square of the Frobenius norm of the matrix.
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.
int width
Dimension of the input / number of columns in the matrix.
void AddSubMatrix(const Array< int > &idx, const DenseMatrix &A)
(*this)(idx[i],idx[j]) += A(i,j)
void Eigenvalues(DenseMatrix &b, Vector &ev, DenseMatrix &evect)
Compute generalized eigenvalues of A x = ev B x, where A = *this.
const double * Read(bool on_dev=true) const
Shortcut for mfem::Read( GetMemory(), TotalSize(), on_dev).
virtual void PrintMatlab(std::ostream &out=mfem::out) const
Prints operator in Matlab format.
virtual void Solve(int m, int n, double *X) const
DenseMatrix & operator+=(const double *m)
CholeskyFactors(double *data_)
void UMult(int m, int n, double *X) const