1#ifndef TATOOINE_LAPACK_SYEV_H
2#define TATOOINE_LAPACK_SYEV_H
4extern "C" void dsyev_(
char* JOBZ,
char* UPLO,
int* N,
double* A,
int* LDA,
5 double* W,
double* WORK,
int* LWORK,
int* INFO);
6extern "C" void ssyev_(
char* JOBZ,
char* UPLO,
int* N,
float* A,
int* LDA,
7 float* W,
float* WORK,
int* LWORK,
int* INFO);
16template <std::
floating_po
int Float>
17auto syev(
job j, uplo u,
int N, Float* A,
int LDA, Float* W, Float* WORK,
20 if constexpr (std::same_as<Float, double>) {
21 dsyev_(
reinterpret_cast<char*
>(&j),
reinterpret_cast<char*
>(&u), &N, A,
22 &LDA, W, WORK, &LWORK, &INFO);
23 }
else if constexpr (std::same_as<Float, float>) {
24 ssyev_(
reinterpret_cast<char*
>(&j),
reinterpret_cast<char*
>(&u), &N, A,
25 &LDA, W, WORK, &LWORK, &INFO);
30template <std::
floating_po
int Float>
31auto syev(
job j, uplo u,
int N, Float* A,
int LDA, Float* W) ->
int {
33 auto WORK = std::unique_ptr<Float[]>{
new Float[1]};
34 syev<Float>(j, u, N, A, LDA, W, WORK.get(), LWORK);
35 LWORK =
static_cast<int>(WORK[0]);
36 WORK = std::unique_ptr<Float[]>{
new Float[LWORK]};
37 return syev<Float>(j, u, N, A, LDA, W, WORK.get(), LWORK);
49template <
typename Real,
size_t N>
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
auto syev(job j, uplo u, int N, Float *A, int LDA, Float *W, Float *WORK, int LWORK) -> int
Definition: syev.h:17
void dsyev_(char *JOBZ, char *UPLO, int *N, double *A, int *LDA, double *W, double *WORK, int *LWORK, int *INFO)
void ssyev_(char *JOBZ, char *UPLO, int *N, float *A, int *LDA, float *W, float *WORK, int *LWORK, int *INFO)