Tatooine
lange.h
Go to the documentation of this file.
1#ifndef TATOOINE_LAPACK_LANGE_H
2#define TATOOINE_LAPACK_LANGE_H
3//==============================================================================
4extern "C" {
5//==============================================================================
6auto dlange_(char* NORM, int* M, int* N, double* A, int* LDA, double* WORK)
7 -> double;
8auto slange_(char* NORM, int* M, int* N, float* A, int* LDA, float* WORK)
9 -> float;
10//==============================================================================
11} // extern "C"
12//==============================================================================
14//==============================================================================
15namespace tatooine::lapack {
16//==============================================================================
21//==============================================================================
22template <std::floating_point Float>
23auto lange(norm n, int M, int N, Float* A, int LDA, Float* WORK) -> Float {
24 auto ret = Float{};
25 if constexpr (std::same_as<Float, double>) {
26 ret = dlange_(reinterpret_cast<char*>(&n), &M, &N, A, &LDA, WORK);
27 } else if constexpr (std::same_as<Float, float>) {
28 ret = slange_(reinterpret_cast<char*>(&n), &M, &N, A, &LDA, WORK);
29 }
30 return ret;
31}
32//------------------------------------------------------------------------------
33template <std::floating_point Float>
34auto lange(norm n, int M, int N, Float* A, int LDA) -> Float {
35 auto ret = Float{};
36 auto WORK = std::unique_ptr<Float>{nullptr};
37 if (n == norm::inf) {
38 WORK = std::unique_ptr<Float>{new Float[M]};
39 }
40 if constexpr (std::same_as<Float, double>) {
41 ret = dlange_(reinterpret_cast<char*>(&n), &M, &N, A, &LDA, WORK.get());
42 } else if constexpr (std::same_as<Float, float>) {
43 ret = slange_(reinterpret_cast<char*>(&n), &M, &N, A, &LDA, WORK.get());
44 }
45 return ret;
46}
47//------------------------------------------------------------------------------
51template <typename T, size_t M, size_t N>
53 return lange(n, M, N, A.data(), M);
54}
55//==============================================================================
57//==============================================================================
58} // namespace tatooine::lapack
59//==============================================================================
60#endif
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
auto lange(norm n, int M, int N, Float *A, int LDA, Float *WORK) -> Float
Definition: lange.h:23
auto slange_(char *NORM, int *M, int *N, float *A, int *LDA, float *WORK) -> float
auto dlange_(char *NORM, int *M, int *N, double *A, int *LDA, double *WORK) -> double
Definition: base.h:6
norm
Definition: base.h:70
Definition: tensor.h:17