TRIQS/nda 2.0.0
Multi-dimensional array library for C++
Loading...
Searching...
No Matches
cxx_interface.cpp
Go to the documentation of this file.
1// Copyright (c) 2019--present, The Simons Foundation
2// This file is part of TRIQS/nda and is licensed under the Apache License, Version 2.0.
3// SPDX-License-Identifier: Apache-2.0
4// See LICENSE in the root of this distribution for details.
5
10
11// Extracted from Reference Lapack (https://github.com/Reference-LAPACK):
12#include "./lapack.h"
13#include "./cxx_interface.hpp"
14
15#include <complex>
16
17namespace nda::lapack::f77 {
18
19 void gelss(int m, int n, int nrhs, float *a, int lda, float *b, int ldb, float *s, float rcond, int &rank, float *work, int lwork,
20 [[maybe_unused]] float *rwork, int &info) {
21 LAPACK_sgelss(&m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, &lwork, &info);
22 }
23 void gelss(int m, int n, int nrhs, std::complex<float> *a, int lda, std::complex<float> *b, int ldb, float *s, float rcond, int &rank,
24 std::complex<float> *work, int lwork, float *rwork, int &info) {
25 LAPACK_cgelss(&m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, &lwork, rwork, &info);
26 }
27 void gelss(int m, int n, int nrhs, double *a, int lda, double *b, int ldb, double *s, double rcond, int &rank, double *work, int lwork,
28 [[maybe_unused]] double *rwork, int &info) {
29 LAPACK_dgelss(&m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, &lwork, &info);
30 }
31 void gelss(int m, int n, int nrhs, std::complex<double> *a, int lda, std::complex<double> *b, int ldb, double *s, double rcond, int &rank,
32 std::complex<double> *work, int lwork, double *rwork, int &info) {
33 LAPACK_zgelss(&m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, &lwork, rwork, &info);
34 }
35
36 void gesvd(char jobu, char jobvt, int m, int n, float *a, int lda, float *s, float *u, int ldu, float *vt, int ldvt, float *work, int lwork,
37 [[maybe_unused]] float *rwork, int &info) {
38 LAPACK_sgesvd(&jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, &info);
39 }
40 void gesvd(char jobu, char jobvt, int m, int n, std::complex<float> *a, int lda, float *s, std::complex<float> *u, int ldu, std::complex<float> *vt,
41 int ldvt, std::complex<float> *work, int lwork, float *rwork, int &info) {
42 LAPACK_cgesvd(&jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, rwork, &info);
43 }
44 void gesvd(char jobu, char jobvt, int m, int n, double *a, int lda, double *s, double *u, int ldu, double *vt, int ldvt, double *work, int lwork,
45 [[maybe_unused]] double *rwork, int &info) {
46 LAPACK_dgesvd(&jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, &info);
47 }
48 void gesvd(char jobu, char jobvt, int m, int n, std::complex<double> *a, int lda, double *s, std::complex<double> *u, int ldu,
49 std::complex<double> *vt, int ldvt, std::complex<double> *work, int lwork, double *rwork, int &info) {
50 LAPACK_zgesvd(&jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, rwork, &info);
51 }
52
53 void geqp3(int m, int n, float *a, int lda, int *jpvt, float *tau, float *work, int lwork, [[maybe_unused]] float *rwork, int &info) {
54 LAPACK_sgeqp3(&m, &n, a, &lda, jpvt, tau, work, &lwork, &info);
55 }
56 void geqp3(int m, int n, std::complex<float> *a, int lda, int *jpvt, std::complex<float> *tau, std::complex<float> *work, int lwork, float *rwork,
57 int &info) {
58 LAPACK_cgeqp3(&m, &n, a, &lda, jpvt, tau, work, &lwork, rwork, &info);
59 }
60 void geqp3(int m, int n, double *a, int lda, int *jpvt, double *tau, double *work, int lwork, [[maybe_unused]] double *rwork, int &info) {
61 LAPACK_dgeqp3(&m, &n, a, &lda, jpvt, tau, work, &lwork, &info);
62 }
63 void geqp3(int m, int n, std::complex<double> *a, int lda, int *jpvt, std::complex<double> *tau, std::complex<double> *work, int lwork,
64 double *rwork, int &info) {
65 LAPACK_zgeqp3(&m, &n, a, &lda, jpvt, tau, work, &lwork, rwork, &info);
66 }
67
68 void geqrf(int m, int n, float *a, int lda, float *tau, float *work, int lwork, int &info) {
69 LAPACK_sgeqrf(&m, &n, a, &lda, tau, work, &lwork, &info);
70 }
71 void geqrf(int m, int n, std::complex<float> *a, int lda, std::complex<float> *tau, std::complex<float> *work, int lwork, int &info) {
72 LAPACK_cgeqrf(&m, &n, a, &lda, tau, work, &lwork, &info);
73 }
74 void geqrf(int m, int n, double *a, int lda, double *tau, double *work, int lwork, int &info) {
75 LAPACK_dgeqrf(&m, &n, a, &lda, tau, work, &lwork, &info);
76 }
77 void geqrf(int m, int n, std::complex<double> *a, int lda, std::complex<double> *tau, std::complex<double> *work, int lwork, int &info) {
78 LAPACK_zgeqrf(&m, &n, a, &lda, tau, work, &lwork, &info);
79 }
80
81 void orgqr(int m, int n, int k, float *a, int lda, float const *tau, float *work, int lwork, int &info) {
82 LAPACK_sorgqr(&m, &n, &k, a, &lda, tau, work, &lwork, &info);
83 }
84 void orgqr(int m, int n, int k, double *a, int lda, double const *tau, double *work, int lwork, int &info) {
85 LAPACK_dorgqr(&m, &n, &k, a, &lda, tau, work, &lwork, &info);
86 }
87
88 void ungqr(int m, int n, int k, std::complex<float> *a, int lda, std::complex<float> const *tau, std::complex<float> *work, int lwork, int &info) {
89 LAPACK_cungqr(&m, &n, &k, a, &lda, tau, work, &lwork, &info);
90 }
91 void ungqr(int m, int n, int k, std::complex<double> *a, int lda, std::complex<double> const *tau, std::complex<double> *work, int lwork,
92 int &info) {
93 LAPACK_zungqr(&m, &n, &k, a, &lda, tau, work, &lwork, &info);
94 }
95
96 void getrf(int m, int n, float *a, int lda, int *ipiv, int &info) { LAPACK_sgetrf(&m, &n, a, &lda, ipiv, &info); }
97 void getrf(int m, int n, std::complex<float> *a, int lda, int *ipiv, int &info) { LAPACK_cgetrf(&m, &n, a, &lda, ipiv, &info); }
98 void getrf(int m, int n, double *a, int lda, int *ipiv, int &info) { LAPACK_dgetrf(&m, &n, a, &lda, ipiv, &info); }
99 void getrf(int m, int n, std::complex<double> *a, int lda, int *ipiv, int &info) { LAPACK_zgetrf(&m, &n, a, &lda, ipiv, &info); }
100
101 void getrs(char op, int n, int nrhs, float const *a, int lda, int const *ipiv, float *b, int ldb, int &info) {
102 LAPACK_sgetrs(&op, &n, &nrhs, a, &lda, ipiv, b, &ldb, &info);
103 }
104 void getrs(char op, int n, int nrhs, std::complex<float> const *a, int lda, int const *ipiv, std::complex<float> *b, int ldb, int &info) {
105 LAPACK_cgetrs(&op, &n, &nrhs, a, &lda, ipiv, b, &ldb, &info);
106 }
107 void getrs(char op, int n, int nrhs, double const *a, int lda, int const *ipiv, double *b, int ldb, int &info) {
108 LAPACK_dgetrs(&op, &n, &nrhs, a, &lda, ipiv, b, &ldb, &info);
109 }
110 void getrs(char op, int n, int nrhs, std::complex<double> const *a, int lda, int const *ipiv, std::complex<double> *b, int ldb, int &info) {
111 LAPACK_zgetrs(&op, &n, &nrhs, a, &lda, ipiv, b, &ldb, &info);
112 }
113
114 void getri(int n, float *a, int lda, int const *ipiv, float *work, int lwork, int &info) { LAPACK_sgetri(&n, a, &lda, ipiv, work, &lwork, &info); }
115 void getri(int n, std::complex<float> *a, int lda, int const *ipiv, std::complex<float> *work, int lwork, int &info) {
116 LAPACK_cgetri(&n, a, &lda, ipiv, work, &lwork, &info);
117 }
118 void getri(int n, double *a, int lda, int const *ipiv, double *work, int lwork, int &info) {
119 LAPACK_dgetri(&n, a, &lda, ipiv, work, &lwork, &info);
120 }
121 void getri(int n, std::complex<double> *a, int lda, int const *ipiv, std::complex<double> *work, int lwork, int &info) {
122 LAPACK_zgetri(&n, a, &lda, ipiv, work, &lwork, &info);
123 }
124
125 void gtsv(int n, int nrhs, float *dl, float *d, float *du, float *b, int ldb, int &info) { LAPACK_sgtsv(&n, &nrhs, dl, d, du, b, &ldb, &info); }
126 void gtsv(int n, int nrhs, std::complex<float> *dl, std::complex<float> *d, std::complex<float> *du, std::complex<float> *b, int ldb, int &info) {
127 LAPACK_cgtsv(&n, &nrhs, dl, d, du, b, &ldb, &info);
128 }
129 void gtsv(int n, int nrhs, double *dl, double *d, double *du, double *b, int ldb, int &info) { LAPACK_dgtsv(&n, &nrhs, dl, d, du, b, &ldb, &info); }
130 void gtsv(int n, int nrhs, std::complex<double> *dl, std::complex<double> *d, std::complex<double> *du, std::complex<double> *b, int ldb,
131 int &info) {
132 LAPACK_zgtsv(&n, &nrhs, dl, d, du, b, &ldb, &info);
133 }
134
135 void stev(char j, int n, float *d, float *e, float *z, int ldz, float *work, int &info) { LAPACK_sstev(&j, &n, d, e, z, &ldz, work, &info); }
136 void stev(char j, int n, double *d, double *e, double *z, int ldz, double *work, int &info) { LAPACK_dstev(&j, &n, d, e, z, &ldz, work, &info); }
137
138 void syev(char jobz, char uplo, int n, float *a, int lda, float *w, float *work, int lwork, int &info) {
139 LAPACK_ssyev(&jobz, &uplo, &n, a, &lda, w, work, &lwork, &info);
140 }
141 void syev(char jobz, char uplo, int n, double *a, int lda, double *w, double *work, int lwork, int &info) {
142 LAPACK_dsyev(&jobz, &uplo, &n, a, &lda, w, work, &lwork, &info);
143 }
144
145 void heev(char jobz, char uplo, int n, std::complex<float> *a, int lda, float *w, std::complex<float> *work, int lwork, float *rwork, int &info) {
146 LAPACK_cheev(&jobz, &uplo, &n, a, &lda, w, work, &lwork, rwork, &info);
147 }
148 void heev(char jobz, char uplo, int n, std::complex<double> *a, int lda, double *w, std::complex<double> *work, int lwork, double *rwork,
149 int &info) {
150 LAPACK_zheev(&jobz, &uplo, &n, a, &lda, w, work, &lwork, rwork, &info);
151 }
152
153 void sygv(int itype, char jobz, char uplo, int n, float *a, int lda, float *b, int ldb, float *w, float *work, int lwork, int &info) {
154 LAPACK_ssygv(&itype, &jobz, &uplo, &n, a, &lda, b, &ldb, w, work, &lwork, &info);
155 }
156 void sygv(int itype, char jobz, char uplo, int n, double *a, int lda, double *b, int ldb, double *w, double *work, int lwork, int &info) {
157 LAPACK_dsygv(&itype, &jobz, &uplo, &n, a, &lda, b, &ldb, w, work, &lwork, &info);
158 }
159
160 void hegv(int itype, char jobz, char uplo, int n, std::complex<float> *a, int lda, std::complex<float> *b, int ldb, float *w,
161 std::complex<float> *work, int lwork, float *rwork, int &info) {
162 LAPACK_chegv(&itype, &jobz, &uplo, &n, a, &lda, b, &ldb, w, work, &lwork, rwork, &info);
163 }
164 void hegv(int itype, char jobz, char uplo, int n, std::complex<double> *a, int lda, std::complex<double> *b, int ldb, double *w,
165 std::complex<double> *work, int lwork, double *rwork, int &info) {
166 LAPACK_zhegv(&itype, &jobz, &uplo, &n, a, &lda, b, &ldb, w, work, &lwork, rwork, &info);
167 }
168
169 void geev(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,
170 int &info) {
171 LAPACK_sgeev(&jobvl, &jobvr, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info);
172 }
173 void geev(char jobvl, char jobvr, int n, std::complex<float> *a, int lda, std::complex<float> *w, std::complex<float> *vl, int ldvl,
174 std::complex<float> *vr, int ldvr, std::complex<float> *work, int lwork, float *rwork, int &info) {
175 LAPACK_cgeev(&jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, work, &lwork, rwork, &info);
176 }
177 void geev(char jobvl, char jobvr, int n, double *a, int lda, double *wr, double *wi, double *vl, int ldvl, double *vr, int ldvr, double *work,
178 int lwork, int &info) {
179 LAPACK_dgeev(&jobvl, &jobvr, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info);
180 }
181 void geev(char jobvl, char jobvr, int n, std::complex<double> *a, int lda, std::complex<double> *w, std::complex<double> *vl, int ldvl,
182 std::complex<double> *vr, int ldvr, std::complex<double> *work, int lwork, double *rwork, int &info) {
183 LAPACK_zgeev(&jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, work, &lwork, rwork, &info);
184 }
185
186 void ggev(char jobvl, char jobvr, int n, float *a, int lda, float *b, int ldb, float *alphar, float *alphai, float *beta, float *vl, int ldvl,
187 float *vr, int ldvr, float *work, int lwork, int &info) {
188 LAPACK_sggev(&jobvl, &jobvr, &n, a, &lda, b, &ldb, alphar, alphai, beta, vl, &ldvl, vr, &ldvr, work, &lwork, &info);
189 }
190 void ggev(char jobvl, char jobvr, int n, std::complex<float> *a, int lda, std::complex<float> *b, int ldb, std::complex<float> *alpha,
191 std::complex<float> *beta, std::complex<float> *vl, int ldvl, std::complex<float> *vr, int ldvr, std::complex<float> *work, int lwork,
192 float *rwork, int &info) {
193 LAPACK_cggev(&jobvl, &jobvr, &n, a, &lda, b, &ldb, alpha, beta, vl, &ldvl, vr, &ldvr, work, &lwork, rwork, &info);
194 }
195 void ggev(char jobvl, char jobvr, int n, double *a, int lda, double *b, int ldb, double *alphar, double *alphai, double *beta, double *vl, int ldvl,
196 double *vr, int ldvr, double *work, int lwork, int &info) {
197 LAPACK_dggev(&jobvl, &jobvr, &n, a, &lda, b, &ldb, alphar, alphai, beta, vl, &ldvl, vr, &ldvr, work, &lwork, &info);
198 }
199 void ggev(char jobvl, char jobvr, int n, std::complex<double> *a, int lda, std::complex<double> *b, int ldb, std::complex<double> *alpha,
200 std::complex<double> *beta, std::complex<double> *vl, int ldvl, std::complex<double> *vr, int ldvr, std::complex<double> *work, int lwork,
201 double *rwork, int &info) {
202 LAPACK_zggev(&jobvl, &jobvr, &n, a, &lda, b, &ldb, alpha, beta, vl, &ldvl, vr, &ldvr, work, &lwork, rwork, &info);
203 }
204
205} // namespace nda::lapack::f77
Provides a C++ interface for various LAPACK routines.