31#ifndef __TASMANIAN_LINEAR_SOLVERS_HPP
32#define __TASMANIAN_LINEAR_SOLVERS_HPP
34#include "tsgAcceleratedDataStructures.hpp"
72namespace TasmanianDenseSolver{
84 void solveLeastSquares(
int n,
int m,
const double A[],
double b[],
double *x);
86 void solveLeastSquares(AccelerationContext
const *acceleration,
int n,
int m,
double A[],
double b[],
double *x);
93 template<
typename scalar_type>
94 void solvesLeastSquares(AccelerationContext
const *acceleration,
int n,
int m, scalar_type A[],
int nrhs, scalar_type B[]);
96 template<
typename scalar_type>
97 void solvesLeastSquaresGPU(AccelerationContext
const *acceleration,
int n,
int m, scalar_type A[],
int nrhs, scalar_type B[]);
104namespace TasmanianTridiagonalSolver{
106 std::vector<double> getSymmetricEigenvalues(
int n, std::vector<double>
const &diag, std::vector<double>
const &offdiag);
109 static constexpr int decompose_version = 1;
115 void decompose(std::vector<double> &diag, std::vector<double> &off_diag,
const double mu0, std::vector<double> &nodes,
116 std::vector<double> &weights);
119 void decompose1(
int n, std::vector<double> &d, std::vector<double> &e, std::vector<double> &z);
122 void decompose2(std::vector<double> &diag, std::vector<double> &off_diag,
const double mu0, std::vector<double> &nodes,
123 std::vector<double> &weights);
129namespace TasmanianFourierTransform{
139 void fast_fourier_transform(std::vector<std::vector<std::complex<double>>> &data, std::vector<int> &num_points);
147 void fast_fourier_transform1D(std::vector<std::vector<std::complex<double>>> &data, std::vector<int> &indexes);
158class WaveletBasisMatrix{
161 WaveletBasisMatrix() : tol(Maths::num_tol), num_rows(0){}
163 WaveletBasisMatrix(AccelerationContext
const *acceleration,
const std::vector<int> &lpntr,
const std::vector<std::vector<int>> &lindx,
const std::vector<std::vector<double>> &lvals);
165 WaveletBasisMatrix(AccelerationContext
const *acceleration,
int cnum_rows, GpuVector<double> &&matrix)
166 : tol(Maths::num_tol), num_rows(cnum_rows), gpu_dense(std::move(matrix)) { factorize(acceleration); }
168 ~WaveletBasisMatrix() =
default;
171 WaveletBasisMatrix(WaveletBasisMatrix
const&) =
delete;
173 WaveletBasisMatrix(WaveletBasisMatrix &&) =
default;
175 WaveletBasisMatrix& operator =(WaveletBasisMatrix
const&) =
delete;
177 WaveletBasisMatrix& operator =(WaveletBasisMatrix &&) =
default;
180 static bool useDense(AccelerationContext
const *acceleration,
int nrows){
181 return ((acceleration->algorithm_select != AccelerationContext::algorithm_sparse)
182 and not (acceleration->algorithm_select == AccelerationContext::algorithm_autoselect and nrows > 10000));
186 bool isSparse()
const{
return (num_rows > 0) and dense.empty(); }
188 bool isDense()
const{
return (num_rows > 0) and not dense.empty(); }
191 int getNumRows()
const{
return num_rows; }
194 void invertTransposed(AccelerationContext
const *acceleration,
double b[])
const;
197 void invert(AccelerationContext
const *acceleration,
int num_colums,
double B[]);
200 template<
bool transpose,
bool blas>
void solve(
const double b[],
double x[])
const;
204 void factorize(AccelerationContext
const *acceleration);
208 template<
bool transpose>
void applyILU(
double x[])
const;
210 template<
bool transpose>
void apply(
double const x[],
double r[])
const;
212 void residual(
double const x[],
double const b[],
double r[])
const;
214 static constexpr bool use_transpose =
true;
216 static constexpr bool no_transpose =
false;
218 static constexpr bool use_blas =
true;
220 static constexpr bool no_blas =
false;
225 std::vector<int> pntr, indx, indxD;
226 std::vector<double> vals, ilu;
227 std::vector<double> dense;
228 std::vector<int> ipiv;
230 GpuVector<double> gpu_dense;
231 GpuVector<int_gpu_lapack> gpu_ipiv;
Encapsulates the Tasmanian Sparse Grid module.
Definition TasmanianSparseGrid.hpp:68