37 #ifndef NEKTAR_LIB_UTILITIES_LINEAR_ALGEBRA_MATRIX_FUNCS_H 38 #define NEKTAR_LIB_UTILITIES_LINEAR_ALGEBRA_MATRIX_FUNCS_H 54 static unsigned int GetRequiredStorageSize(
unsigned int totalRows,
unsigned int totalColumns,
55 unsigned int subDiags,
unsigned int superDiags);
57 static unsigned int CalculateNumberOfDiags(
unsigned int totalRows,
unsigned int diags);
59 static unsigned int CalculateNumberOfRows(
unsigned int totalRows,
unsigned int subDiags,
unsigned int superDiags);
61 static unsigned int CalculateIndex(
unsigned int totalRows,
62 unsigned int totalColumns,
63 unsigned int row,
unsigned int column,
64 unsigned int sub,
unsigned int super);
67 static std::tuple<unsigned int, unsigned int>
68 Advance(
const unsigned int totalRows,
const unsigned int totalColumns,
69 const unsigned int curRow,
const unsigned int curColumn);
75 static unsigned int GetRequiredStorageSize(
unsigned int rows,
unsigned int columns);
76 static unsigned int CalculateIndex(
unsigned int totalRows,
unsigned int totalColumns,
unsigned int curRow,
unsigned int curColumn);
79 static std::tuple<unsigned int, unsigned int>
80 Advance(
const unsigned int totalRows,
const unsigned int totalColumns,
81 const unsigned int curRow,
const unsigned int curColumn);
83 template<
typename DataType>
84 static void Invert(
unsigned int rows,
unsigned int columns,
88 ASSERTL0(rows==columns,
"Only square matrices can be inverted.");
89 ASSERTL0(transpose==
'N',
"Only untransposed matrices may be inverted.");
101 std::string message =
"ERROR: The " + std::to_string(-info) +
"th parameter had an illegal parameter for dgetrf";
106 std::string message =
"ERROR: Element u_" + std::to_string(info) + std::to_string(info) +
" is 0 from dgetrf";
111 work.
get(), n, info);
115 std::string message =
"ERROR: The " + std::to_string(-info) +
"th parameter had an illegal parameter for dgetri";
120 std::string message =
"ERROR: Element u_" + std::to_string(info) + std::to_string(info) +
" is 0 from dgetri";
131 int lda = n,info = 0;
145 &work[0],lwork,info);
157 &work[0],lwork,info);
159 ASSERTL0(info == 0,
"Info is not zero");
166 static unsigned int GetRequiredStorageSize(
unsigned int rows,
unsigned int columns);
171 static unsigned int CalculateIndex(
unsigned int curRow,
unsigned int curColumn);
173 static std::tuple<unsigned int, unsigned int>
174 Advance(
const unsigned int totalRows,
const unsigned int totalColumns,
175 const unsigned int curRow,
const unsigned int curColumn);
181 static unsigned int CalculateIndex(
unsigned int totalColumns,
unsigned int curRow,
unsigned int curColumn);
183 static std::tuple<unsigned int, unsigned int>
184 Advance(
const unsigned int totalRows,
const unsigned int totalColumns,
185 const unsigned int curRow,
const unsigned int curColumn,
186 char transpose =
'N');
195 static unsigned int CalculateIndex(
unsigned int curRow,
unsigned int curColumn);
197 template<
typename DataType>
198 static void Invert(
unsigned int rows,
unsigned int columns,
201 ASSERTL0(rows==columns,
"Only square matrices can be inverted.");
212 std::string message =
"ERROR: The " + std::to_string(-info) +
"th parameter had an illegal parameter for dsptrf";
217 std::string message =
"ERROR: Element u_" + std::to_string(info) + std::to_string(info) +
" is 0 from dsptrf";
226 std::string message =
"ERROR: The " + std::to_string(-info) +
"th parameter had an illegal parameter for dsptri";
231 std::string message =
"ERROR: Element u_" + std::to_string(info) + std::to_string(info) +
" is 0 from dsptri";
236 static std::tuple<unsigned int, unsigned int>
237 Advance(
const unsigned int totalRows,
const unsigned int totalColumns,
238 const unsigned int curRow,
const unsigned int curColumn);
243 static std::tuple<unsigned int, unsigned int>
244 Advance(
const unsigned int totalRows,
const unsigned int totalColumns,
245 const unsigned int curRow,
const unsigned int curColumn);
247 template<
typename DataType>
248 static void Invert(
unsigned int rows,
unsigned int columns,
251 ASSERTL0(rows==columns,
"Only square matrices can be inverted.");
252 for(
unsigned int i = 0; i < rows; ++i)
254 data[i] = 1.0/data[i];
258 static unsigned int GetRequiredStorageSize(
unsigned int rows,
unsigned int columns);
260 static unsigned int CalculateIndex(
unsigned int row,
unsigned int col);
266 static unsigned int GetRequiredStorageSize(
unsigned int rows,
unsigned int columns,
267 unsigned int nSubSuperDiags);
284 static unsigned int CalculateIndex(
unsigned int curRow,
unsigned int curColumn,
285 unsigned int nSuperDiags);
290 #endif //NEKTAR_LIB_UTILITIES_LINEAR_ALGEBRA_MATRIX_FUNCS_H
static void Dgetrf(const int &m, const int &n, double *a, const int &lda, int *ipiv, int &info)
General matrix LU factorisation.
#define ASSERTL0(condition, msg)
static void Dgetri(const int &n, double *a, const int &lda, const int *ipiv, double *wk, const int &lwk, int &info)
Generate matrix inverse.
static Array< OneD, NekDouble > NullNekDouble1DArray
static void Invert(unsigned int rows, unsigned int columns, Array< OneD, DataType > &data, const char transpose)
static unsigned int GetRequiredStorageSize(unsigned int rows, unsigned int columns)
static void Dgeev(const char &uplo, const char &lrev, const int &n, const double *a, const int &lda, double *wr, double *wi, double *rev, const int &ldr, double *lev, const int &ldv, double *work, const int &lwork, int &info)
Solve general real matrix eigenproblem.
static void Dsptri(const char &uplo, const int &n, const double *ap, const int *ipiv, double *work, int &info)
Invert a real symmetric matrix problem.
#define LIB_UTILITIES_EXPORT
static unsigned int GetRequiredStorageSize(unsigned int rows, unsigned int columns, unsigned int nSubSuperDiags)
static void EigenSolve(unsigned int n, const Array< OneD, const double > &A, Array< OneD, NekDouble > &EigValReal, Array< OneD, NekDouble > &EigValImag, Array< OneD, NekDouble > &EigVecs=NullNekDouble1DArray)
static void Dsptrf(const char &uplo, const int &n, double *ap, int *ipiv, int &info)
factor a real packed-symmetric matrix using Bunch-Kaufman pivoting.
static void Invert(unsigned int rows, unsigned int columns, Array< OneD, DataType > &data)
static void Invert(unsigned int rows, unsigned int columns, Array< OneD, DataType > &data)