12 #ifndef QMCPLUSPLUS_CUSOLVER_H 13 #define QMCPLUSPLUS_CUSOLVER_H 15 #include <cusolverDn.h> 21 #define cusolverErrorCheck(ans, cause) \ 23 cusolverAssert((ans), cause, __FILE__, __LINE__); \ 27 const std::string& cause,
32 if (code != CUSOLVER_STATUS_SUCCESS)
34 std::string cusolver_error;
37 case CUSOLVER_STATUS_NOT_INITIALIZED:
38 cusolver_error =
"CUSOLVER_STATUS_NOT_INITIALIZED";
40 case CUSOLVER_STATUS_ALLOC_FAILED:
41 cusolver_error =
"CUSOLVER_STATUS_ALLOC_FAILED";
43 case CUSOLVER_STATUS_INVALID_VALUE:
44 cusolver_error =
"CUSOLVER_STATUS_INVALID_VALUE";
46 case CUSOLVER_STATUS_ARCH_MISMATCH:
47 cusolver_error =
"CUSOLVER_STATUS_ARCH_MISMATCH";
49 case CUSOLVER_STATUS_EXECUTION_FAILED:
50 cusolver_error =
"CUSOLVER_STATUS_EXECUTION_FAILED";
52 case CUSOLVER_STATUS_INTERNAL_ERROR:
53 cusolver_error =
"CUSOLVER_STATUS_INTERNAL_ERROR";
55 case CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED:
56 cusolver_error =
"CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED";
59 cusolver_error =
"<unknown>";
62 std::ostringstream err;
63 err <<
"cusolverAssert: " << cusolver_error <<
", file " << file <<
" , line " << line << std::endl
64 << cause << std::endl;
65 std::cerr << err.str();
67 throw std::runtime_error(cause);
79 return cusolverDnDgetrf_bufferSize(handle,
m,
n,
A,
lda, lwork);
85 std::complex<double>*
A,
92 inline cusolverStatus_t
getrf(cusolverDnHandle_t& handle,
101 return cusolverDnDgetrf(handle,
m,
n,
A,
lda, work, ipiv, info);
104 inline cusolverStatus_t
getrf(cusolverDnHandle_t& handle,
107 std::complex<double>*
A,
109 std::complex<double>* work,
116 inline cusolverStatus_t
getrs(cusolverDnHandle_t& handle,
127 return cusolverDnDgetrs(handle, transa,
m,
n,
A,
lda, ipiv,
B, ldb, info);
130 inline cusolverStatus_t
getrs(cusolverDnHandle_t& handle,
134 const std::complex<double>*
A,
137 std::complex<double>*
B,
146 #endif // QMCPLUSPLUS_CUSOLVER_H cusolverStatus_t getrs(cusolverDnHandle_t &handle, const cublasOperation_t &transa, int m, int n, const double *A, int lda, int *ipiv, double *B, int ldb, int *info)
helper functions for EinsplineSetBuilder
#define cublasOperation_t
cusolverStatus_t getrf_bufferSize(cusolverDnHandle_t &handle, int m, int n, double *A, int lda, int *lwork)
double B(double x, int k, int i, const std::vector< double > &t)
void cusolverAssert(cusolverStatus_t code, const std::string &cause, const char *file, int line, bool abort=true)
prints cusolver error messages. Always use cusolverErrorCheck macro.
cusolverStatus_t getrf(cusolverDnHandle_t &handle, int m, int n, double *A, int lda, double *work, int *ipiv, int *info)