1#ifndef TATOOINE_LAPACK_SYSV_H
2#define TATOOINE_LAPACK_SYSV_H
6auto dsysv_(
char* UPLO,
int* N,
int* NRHS,
double* A,
int* LDA,
int* IPIV,
7 double* B,
int* LDB,
double* WORK,
int* LWORK,
int* INFO) -> void;
9auto ssysv_(
char* UPLO,
int* N,
int* NRHS,
float* A,
int* LDA,
int* IPIV,
10 float* B,
int* LDB,
float* WORK,
int* LWORK,
int* INFO) -> void;
38template <std::
floating_po
int Float>
39auto sysv(uplo u,
int N,
int NRHS, Float* A,
int LDA,
int* IPIV, Float* B,
40 int LDB, Float* WORK,
int LWORK) ->
int {
42 if constexpr (std::same_as<Float, double>) {
43 dsysv_(
reinterpret_cast<char*
>(&u), &N, &NRHS, A, &LDA, IPIV, B, &LDB, WORK, &LWORK, &INFO);
44 }
else if constexpr (std::same_as<Float, float>) {
45 ssysv_(
reinterpret_cast<char*
>(&u), &N, &NRHS, A, &LDA, IPIV, B, &LDB, WORK,
51template <std::
floating_po
int Float>
52auto sysv(uplo u,
int N,
int NRHS, Float* A,
int LDA,
int* IPIV, Float* B,
55 auto WORK = std::unique_ptr<Float[]>{
new Float[1]};
56 sysv<Float>(u, N, NRHS, A, LDA, IPIV, B, LDB, WORK.get(), LWORK);
57 LWORK =
static_cast<int>(WORK[0]);
58 WORK = std::unique_ptr<Float[]>{
new Float[LWORK]};
59 return sysv<Float>(u, N, NRHS, A, LDA, IPIV, B, LDB, WORK.get(), LWORK);
62template <std::
floating_po
int Float,
size_t N>
64 auto ipiv = std::unique_ptr<std::int64_t[]>(
new std::int64_t[N]);
65 return sysv<Float>(u, N, 1, A.
data(), N, ipiv.get(), b.
data(),
69template <std::
floating_po
int Float>
71 assert(A.
rank() == 2);
72 assert(B.
rank() == 1 || B.
rank() == 2);
76 auto ipiv = std::unique_ptr<int[]>(
new int[N]);
78 return sysv<Float>(u,
static_cast<int>(N),
80 A.
data(),
static_cast<int>(N), ipiv.get(), B.
data(),
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
auto sysv(uplo u, int N, int NRHS, Float *A, int LDA, int *IPIV, Float *B, int LDB, Float *WORK, int LWORK) -> int
Definition: sysv.h:39
static auto constexpr rank()
Definition: base_tensor.h:41
static auto constexpr dimension(std::size_t const i)
Definition: base_tensor.h:49
auto dsysv_(char *UPLO, int *N, int *NRHS, double *A, int *LDA, int *IPIV, double *B, int *LDB, double *WORK, int *LWORK, int *INFO) -> void
auto ssysv_(char *UPLO, int *N, int *NRHS, float *A, int *LDA, int *IPIV, float *B, int *LDB, float *WORK, int *LWORK, int *INFO) -> void