Tatooine
syev.h
Go to the documentation of this file.
1#ifndef TATOOINE_LAPACK_SYEV_H
2#define TATOOINE_LAPACK_SYEV_H
3//==============================================================================
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);
8//==============================================================================
10//==============================================================================
11#include <concepts>
12#include <memory>
13//==============================================================================
14namespace tatooine::lapack {
15//==============================================================================
16template <std::floating_point Float>
17auto syev(job j, uplo u, int N, Float* A, int LDA, Float* W, Float* WORK,
18 int LWORK) -> int {
19 auto INFO = int{};
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);
26 }
27 return INFO;
28}
29//------------------------------------------------------------------------------
30template <std::floating_point Float>
31auto syev(job j, uplo u, int N, Float* A, int LDA, Float* W) -> int {
32 auto LWORK = int{-1};
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);
38}
39//==============================================================================
46//==============================================================================
49template <typename Real, size_t N>
50auto syev(job jobz, uplo const u, tensor<Real, N, N>& A,
51 tensor<Real, N>& W) {
52 return syev(jobz, u, N, A.data(), N, W.data());
53}
54//==============================================================================
56//==============================================================================
57} // namespace tatooine::lapack
58//==============================================================================
59#endif
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
Definition: base.h:6
auto syev(job j, uplo u, int N, Float *A, int LDA, Float *W, Float *WORK, int LWORK) -> int
Definition: syev.h:17
job
Definition: base.h:55
Definition: tensor.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)