Tatooine
gesv.h
Go to the documentation of this file.
1#ifndef TATOOINE_LAPACK_GESV_H
2#define TATOOINE_LAPACK_GESV_H
3//==============================================================================
4extern "C" {
5auto dgesv_(int* N, int* NRHS, double* A, int* LDA, int* IPIV, double* B,
6 int* LDB, int* INFO) -> void;
7auto sgesv_(int* N, int* NRHS, float* A, int* LDA, int* IPIV, float* B,
8 int* LDB, int* INFO) -> void;
9}
10//==============================================================================
12#include <concepts>
13//==============================================================================
14namespace tatooine::lapack {
15//==============================================================================
36//==============================================================================
37template <std::floating_point Float>
38auto gesv(int N, int NRHS, Float* A, int LDA, int* IPIV, Float* B, int LDB)
39 -> int {
40 auto INFO = int{};
41 if constexpr (std::same_as<Float, double>) {
42 dgesv_(&N, &NRHS, A, &LDA, IPIV, B, &LDB, &INFO);
43 } else if constexpr (std::same_as<Float, float>) {
44 sgesv_(&N, &NRHS, A, &LDA, IPIV, B, &LDB, &INFO);
45 }
46 return INFO;
47}
48//------------------------------------------------------------------------------
49template <typename T, size_t N>
51 tensor<T, N>& b,
52 tensor<int, N>& ipiv) {
53 return gesv(N, 1, A.data(), N, ipiv.data(), b.data(), N);
54}
55//------------------------------------------------------------------------------
56template <typename T, size_t N, size_t K>
59 tensor<int, N>& ipiv) {
60 return gesv(N, K, A.data(), N, ipiv.data(), B.data(),
61 N);
62}
63//------------------------------------------------------------------------------
64template <typename T>
65auto gesv(tensor<T>& A, tensor<T>& B, tensor<int>& ipiv) {
66 assert(A.rank() == 2);
67 assert(A.dimension(0) == A.dimension(1));
68
69 assert(B.rank() > 0);
70 assert(B.rank() <= 2);
71
72 assert(A.dimension(0) == B.dimension(0));
73
74 ipiv.resize(A.dimension(0));
75 return gesv(static_cast<int>(A.dimension(0)),
76 static_cast<int>(B.rank() == 1 ? 1 : B.dimension(1)), A.data(),
77 static_cast<int>(A.dimension(0)), ipiv.data(), B.data(),
78 static_cast<int>(A.dimension(0)));
79}
80//==============================================================================
82//==============================================================================
83} // namespace tatooine::lapack
84//==============================================================================
85#endif
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
auto dgesv_(int *N, int *NRHS, double *A, int *LDA, int *IPIV, double *B, int *LDB, int *INFO) -> void
auto sgesv_(int *N, int *NRHS, float *A, int *LDA, int *IPIV, float *B, int *LDB, int *INFO) -> void
auto gesv(int N, int NRHS, Float *A, int LDA, int *IPIV, Float *B, int LDB) -> int
Definition: gesv.h:38
Definition: base.h:6
Definition: tensor.h:17
static auto constexpr rank()
Definition: base_tensor.h:41
static auto constexpr dimension(std::size_t const i)
Definition: base_tensor.h:49