1#ifndef TATOOINE_LAPACK_GEEV_H
2#define TATOOINE_LAPACK_GEEV_H
5auto dgeev_(
char* JOBVL,
char* JOBVR,
int* N,
double* A,
int* LDA,
double* WR,
6 double* WI,
double* VL,
int* LDVL,
double* VR,
int* LDVR,
7 double* WORK,
int* LWORK,
int* INFO) -> void;
9auto sgeev_(
char* JOBVL,
char* JOBVR,
int* N,
float* A,
int* LDA,
float* WR,
10 float* WI,
float* VL,
int* LDVL,
float* VR,
int* LDVR,
float* WORK,
11 int* LWORK,
int* INFO) -> void;
43template <std::
floating_po
int Float>
44auto geev(
job JOBVL,
job JOBVR,
int N, Float* A,
int LDA, Float* WR,
45 Float* WI, Float* VL,
int LDVL, Float* VR,
int LDVR, Float* WORK,
48 if constexpr (std::same_as<Float, double>) {
49 dgeev_(
reinterpret_cast<char*
>(&JOBVL),
reinterpret_cast<char*
>(&JOBVR), &N,
50 A, &LDA, WR, WI, VL, &LDVL, VR, &LDVR, WORK, &LWORK, &INFO);
51 }
else if constexpr (std::same_as<Float, float>) {
52 sgeev_(
reinterpret_cast<char*
>(&JOBVL),
reinterpret_cast<char*
>(&JOBVR), &N,
53 A, &LDA, WR, WI, VL, &LDVL, VR, &LDVR, WORK, &LWORK, &INFO);
58template <std::
floating_po
int Float>
59auto geev(
job const JOBVL,
job const JOBVR,
int N, Float* A,
int LDA, Float* WR,
60 Float* WI, Float* VL,
int LDVL, Float* VR,
int LDVR) ->
int {
62 auto WORK = std::unique_ptr<Float[]>{
new Float[1]};
63 geev<Float>(JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR, LDVR, WORK.get(),
65 LWORK =
static_cast<int>(WORK[0]);
66 WORK = std::unique_ptr<Float[]>{
new Float[LWORK]};
67 return geev<Float>(JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR, LDVR,
71template <std::
floating_po
int Float>
73 std::complex<Float>* W, Float* VL,
int LDVL, Float* VR,
int LDVR,
74 Float* WORK,
int LWORK) ->
int {
76 auto WRI = std::unique_ptr<Float[]>{
new Float[N*2]};
77 if constexpr (std::same_as<Float, double>) {
78 dgeev_(
reinterpret_cast<char*
>(&JOBVL),
reinterpret_cast<char*
>(&JOBVR), &N,
79 A, &LDA, WRI.get(), WRI.get() + N, VL, &LDVL, VR, &LDVR, WORK,
81 }
else if constexpr (std::same_as<Float, float>) {
82 sgeev_(
reinterpret_cast<char*
>(&JOBVL),
reinterpret_cast<char*
>(&JOBVR), &N,
83 A, &LDA, WRI.get(), WRI.get() + N, VL, &LDVL, VR, &LDVR, WORK,
86 for (
int i = 0; i < N; ++i) {
93template <std::
floating_po
int Float>
94auto geev(
job const JOBVL,
job const JOBVR,
int N, Float* A,
int LDA,
95 std::complex<Float>* W, Float* VL,
int LDVL, Float* VR,
int LDVR)
98 auto WORK = std::unique_ptr<Float[]>{
new Float[1]};
99 geev<Float>(JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR, LDVR, WORK.get(),
101 LWORK =
static_cast<int>(WORK[0]);
102 WORK = std::unique_ptr<Float[]>{
new Float[LWORK]};
103 return geev<Float>(JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR, LDVR, WORK.get(),
107template <std::
floating_po
int Float,
size_t N>
113template <std::
floating_po
int Float,
size_t N>
120template <std::
floating_po
int Float,
size_t N>
127template <std::
floating_po
int Float,
size_t N>
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
auto sgeev_(char *JOBVL, char *JOBVR, int *N, float *A, int *LDA, float *WR, float *WI, float *VL, int *LDVL, float *VR, int *LDVR, float *WORK, int *LWORK, int *INFO) -> void
auto dgeev_(char *JOBVL, char *JOBVR, int *N, double *A, int *LDA, double *WR, double *WI, double *VL, int *LDVL, double *VR, int *LDVR, double *WORK, int *LWORK, int *INFO) -> void
auto geev(job JOBVL, job JOBVR, int N, Float *A, int LDA, Float *WR, Float *WI, Float *VL, int LDVL, Float *VR, int LDVR, Float *WORK, int LWORK) -> int
Definition: geev.h:44
auto geev_left(tensor< Float, N, N > &A, tensor< std::complex< Float >, N > &W, tensor< Float, N, N > &VL)
Definition: geev.h:114
auto geev_right(tensor< Float, N, N > &A, tensor< std::complex< Float >, N > &W, tensor< Float, N, N > &VR)
Definition: geev.h:121