YAC 3.18.0
Yet Another Coupler
Loading...
Searching...
No Matches
yac_lapack_interface.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
6
7#if YAC_LAPACK_INTERFACE_ID == 3 // ATLAS CLAPACK
8
9#include <assert.h>
10
11#if 0
12lapack_int LAPACKE_dgels_work( int matrix_layout, char trans, lapack_int m,
13 lapack_int n, lapack_int nrhs, double* a,
14 lapack_int lda, double* b, lapack_int ldb,
15 double* work, lapack_int lwork )
16{
17 assert(matrix_layout == LAPACK_COL_MAJOR);
18 return (lapack_int) clapack_dgels(LAPACK_COL_MAJOR,
19 trans == 'N' ? CblasNoTrans : CblasTrans,
20 (ATL_INT) m, (ATL_INT) n, (ATL_INT) nrhs,
21 a, (ATL_INT) lda, b, (int) ldb);
22}
23#endif
24
25lapack_int LAPACKE_dgesv( int matrix_layout, lapack_int n, lapack_int nrhs,
26 double* a, lapack_int lda, lapack_int* ipiv,
27 double* b, lapack_int ldb )
28{
29 assert(matrix_layout == LAPACK_COL_MAJOR);
30 if (sizeof(int) == sizeof(lapack_int))
31 {
32 return (lapack_int) clapack_dgesv(LAPACK_COL_MAJOR, (int) n, (int) nrhs,
33 a, (int) lda, (int*) ipiv, b, (int) ldb);
34 }
35 else
36 {
37 int i, result, ipiv_size = (int) n;
38 int ipiv_[ipiv_size];
39 result = clapack_dgesv(LAPACK_COL_MAJOR, (int) n, (int) nrhs,
40 a, (int) lda, ipiv_, b, (int) ldb);
41 for (i = 0; i != ipiv_size; ++i) { ipiv[i] = (lapack_int) ipiv_[i]; }
42 return (lapack_int) result;
43 }
44}
45
46lapack_int LAPACKE_dgetrf( int matrix_layout, lapack_int m, lapack_int n,
47 double* a, lapack_int lda, lapack_int* ipiv )
48{
49 assert(matrix_layout == LAPACK_COL_MAJOR);
50 if (sizeof(int) == sizeof(lapack_int))
51 {
52 return (lapack_int) clapack_dgetrf(LAPACK_COL_MAJOR, (int) m, (int) n,
53 a, (int) lda, (int*) ipiv);
54 }
55 else
56 {
57 int i, result, ipiv_size = (int) (n < m ? n : m);
58 int ipiv_[ipiv_size];
59 result = clapack_dgetrf(LAPACK_COL_MAJOR, (int) m, (int) n,
60 a, (int) lda, ipiv_);
61 for (i = 0; i != ipiv_size; ++i) { ipiv[i] = (lapack_int) ipiv_[i]; }
62 return (lapack_int) result;
63 }
64}
65
66lapack_int LAPACKE_dgetri_work( int matrix_layout, lapack_int n, double* a,
67 lapack_int lda, const lapack_int* ipiv,
68 double* work, lapack_int lwork )
69{
70 assert(matrix_layout == LAPACK_COL_MAJOR);
71 if (sizeof(int) == sizeof(lapack_int))
72 {
73 return (lapack_int) clapack_dgetri(LAPACK_COL_MAJOR, (int) n, a,
74 (int) lda, (int*) ipiv);
75 }
76 else
77 {
78 int i, ipiv_size = (int) n;
79 int ipiv_[n];
80 for (i = 0; i != ipiv_size; ++i) { ipiv_[i] = (int) ipiv[i]; }
81 return (lapack_int) clapack_dgetri(LAPACK_COL_MAJOR, (int) n, a,
82 (int) lda, ipiv_);
83 }
84}
85
86#elif YAC_LAPACK_INTERFACE_ID == 4 // Netlib CLAPACK
87
88#include <assert.h>
89#include <clapack.h>
90
91#if 0
92lapack_int LAPACKE_dgels_work( int matrix_layout, char trans, lapack_int m,
93 lapack_int n, lapack_int nrhs, double* a,
94 lapack_int lda, double* b, lapack_int ldb,
95 double* work, lapack_int lwork )
96{
97 integer info = 0;
98 assert(matrix_layout == LAPACK_COL_MAJOR &&
99 sizeof(doublereal) == sizeof(double));
100 if (sizeof(integer) == sizeof(lapack_int))
101 {
102 dgels_(&trans, (integer*) &m, (integer*) &n, (integer*) &nrhs,
103 (doublereal*) a, (integer*) &lda,
104 (doublereal*) b, (integer*) &ldb,
105 (doublereal*) work, (integer*) &lwork,
106 &info);
107 }
108 else
109 {
110 integer m_ = (integer) m, n_ = (integer) n,
111 nrhs_ = (integer) nrhs, lda_ = (integer) lda,
112 ldb_ = (integer) ldb, lwork_ = (integer) lwork;
113 dgels_(&trans, &m_, &n_, &nrhs_,
114 (doublereal*) a, &lda_,
115 (doublereal*) b, &ldb_,
116 (doublereal*) work, &lwork_,
117 &info);
118 }
119 return (lapack_int) info;
120}
121#endif
122
123lapack_int LAPACKE_dgesv( int matrix_layout, lapack_int n, lapack_int nrhs,
124 double* a, lapack_int lda, lapack_int* ipiv,
125 double* b, lapack_int ldb )
126{
127 integer info = 0;
128 assert(matrix_layout == LAPACK_COL_MAJOR &&
129 sizeof(doublereal) == sizeof(double));
130 if (sizeof(integer) == sizeof(lapack_int))
131 {
132 dgesv_((integer*) &n, (integer*) &nrhs,
133 (doublereal*) a, (integer*) &lda , (integer*) ipiv,
134 (doublereal*) b, (integer*) &ldb, &info);
135 }
136 else
137 {
138 int i, ipiv_size = (int) n;
139 integer n_ = (integer) n, nrhs_ = (integer) nrhs,
140 lda_ = (integer) lda, ldb_ = (integer) ldb,
141 ipiv_[n];
142 dgesv_(&n_, &nrhs_,
143 (doublereal*) a, &lda_, ipiv_,
144 (doublereal*) b, &ldb_, &info);
145 for (i = 0; i != ipiv_size; ++i) { ipiv[i] = (lapack_int) ipiv_[i]; }
146 }
147 return (lapack_int) info;
148}
149
150lapack_int LAPACKE_dgetrf( int matrix_layout, lapack_int m, lapack_int n,
151 double* a, lapack_int lda, lapack_int* ipiv )
152{
153 integer info = 0;
154 assert(matrix_layout == LAPACK_COL_MAJOR &&
155 sizeof(doublereal) == sizeof(double));
156 if (sizeof(integer) == sizeof(lapack_int))
157 {
158 dgetrf_((integer*) &m, (integer*) &n,
159 (doublereal*) a, (integer*) &lda , (integer*) ipiv,
160 &info);
161 }
162 else
163 {
164 int i, ipiv_size = (int) (n < m ? n : m);
165 integer m_ = (integer) m, n_ = (integer) n,
166 lda_ = (integer) lda, ipiv_[ipiv_size];
167 dgetrf_(&m_, &n_,
168 (doublereal*) a, &lda_, ipiv_,
169 &info);
170 for (i = 0; i != ipiv_size; ++i) {ipiv[i] = (lapack_int) ipiv_[i]; }
171 }
172 return (lapack_int) info;
173}
174
175lapack_int LAPACKE_dgetri_work( int matrix_layout, lapack_int n, double* a,
176 lapack_int lda, const lapack_int* ipiv,
177 double* work, lapack_int lwork )
178{
179 integer info = 0;
180 assert(matrix_layout == LAPACK_COL_MAJOR &&
181 sizeof(doublereal) == sizeof(double));
182 if (sizeof(integer) == sizeof(lapack_int))
183 {
184 dgetri_((integer*) &n, (doublereal*) a,
185 (integer*) &lda , (integer*) ipiv,
186 (doublereal*) work, (integer*) &lwork,
187 &info);
188 }
189 else
190 {
191 int i, size_ipiv = (int) n;
192 integer n_ = (integer) n, lda_ = (integer) lda,
193 lwork_ = (integer) lwork, ipiv_[size_ipiv];
194 for (i = 0; i != size_ipiv; ++i) { ipiv_[i] = (integer) ipiv[i]; }
195 dgetri_(&n_, (doublereal*) a,
196 &lda_, ipiv_,
197 (doublereal*) work, &lwork_,
198 &info);
199 }
200 return (lapack_int) info;
201}
202
203lapack_int LAPACKE_dsytrf_work( int matrix_layout, char uplo, lapack_int n,
204 double* a, lapack_int lda, lapack_int* ipiv,
205 double* work, lapack_int lwork )
206{
207 integer info = 0;
208 assert(matrix_layout == LAPACK_COL_MAJOR &&
209 sizeof(doublereal) == sizeof(double));
210 if (sizeof(integer) == sizeof(lapack_int))
211 {
212 dsytrf_(&uplo, (integer*) &n,
213 (doublereal*) a, (integer*) &lda, (integer*) ipiv,
214 (doublereal*) work, (integer*) &lwork, &info);
215 }
216 else
217 {
218 int i, size_ipiv = (int) n;
219 integer n_ = (integer) n, lda_ = (integer) lda,
220 lwork_ = (integer) lwork, ipiv_[size_ipiv];
221 dsytrf_(&uplo, &n_,
222 (doublereal*) a, &lda_, ipiv_,
223 (doublereal*) work, &lwork_, &info);
224 for (i = 0; i != size_ipiv; ++i) { ipiv[i] = (lapack_int) ipiv_[i]; }
225 }
226 return (lapack_int) info;
227}
228
229lapack_int LAPACKE_dsytri_work( int matrix_layout, char uplo, lapack_int n,
230 double* a, lapack_int lda,
231 const lapack_int* ipiv, double* work )
232{
233 integer info = 0;
234 assert(matrix_layout == LAPACK_COL_MAJOR &&
235 sizeof(doublereal) == sizeof(double));
236 if (sizeof(integer) == sizeof(lapack_int))
237 {
238 dsytri_(&uplo, (integer*) &n,
239 (doublereal*) a, (integer*) &lda, (integer*) ipiv,
240 (doublereal*) work, &info);
241 }
242 else
243 {
244 int i, size_ipiv = (int) n;
245 integer n_ = (integer) n, lda_ = (integer) lda,
246 ipiv_[size_ipiv];
247 for (i = 0; i != size_ipiv; ++i) { ipiv_[i] = (integer) ipiv[i]; }
248 dsytri_(&uplo, &n_,
249 (doublereal*) a, &lda_, ipiv_,
250 (doublereal*) work, &info);
251 }
252 return (lapack_int) info;
253}
254
255#elif YAC_LAPACK_INTERFACE_ID == 5 // Fortran LAPACK
256
257#include <assert.h>
258
259#ifdef __cplusplus
260extern "C" {
261#endif
262
263#ifndef YAC_FC_GLOBAL
264 // CMake generates the "FC.h" header instead of having it in the config.h
265 #include "FC.h"
266#endif
267
268#define LAPACK_dgels YAC_FC_GLOBAL(dgels,DGELS)
269#define LAPACK_dgesv YAC_FC_GLOBAL(dgesv,DGESV)
270#define LAPACK_dgetrf YAC_FC_GLOBAL(dgetrf,DGETRF)
271#define LAPACK_dgetri YAC_FC_GLOBAL(dgetri,DGETRI)
272#define LAPACK_dsytrf YAC_FC_GLOBAL(dsytrf,DSYTRF)
273#define LAPACK_dsytri YAC_FC_GLOBAL(dsytri,DSYTRI)
274
275#if 0
276void LAPACK_dgels( char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs,
277 double* a, lapack_int* lda, double* b, lapack_int* ldb,
278 double* work, lapack_int* lwork, lapack_int *info );
279#endif
280void LAPACK_dgesv( lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda,
281 lapack_int* ipiv, double* b, lapack_int* ldb,
282 lapack_int *info );
283void LAPACK_dgetrf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
284 lapack_int* ipiv, lapack_int *info );
285void LAPACK_dgetri( lapack_int* n, double* a, lapack_int* lda,
286 const lapack_int* ipiv, double* work, lapack_int* lwork,
287 lapack_int *info );
288void LAPACK_dsytrf( char* uplo, lapack_int* n, double* a, lapack_int* lda,
289 lapack_int* ipiv, double* work, lapack_int* lwork,
290 lapack_int *info );
291void LAPACK_dsytri( char* uplo, lapack_int* n, double* a, lapack_int* lda,
292 const lapack_int* ipiv, double* work, lapack_int *info );
293
294#ifdef __cplusplus
295}
296#endif
297
298
299#if 0
300lapack_int LAPACKE_dgels_work( int matrix_layout, char trans, lapack_int m,
301 lapack_int n, lapack_int nrhs, double* a,
302 lapack_int lda, double* b, lapack_int ldb,
303 double* work, lapack_int lwork )
304{
305 lapack_int info = 0;
306 assert(matrix_layout == LAPACK_COL_MAJOR);
307 LAPACK_dgels(&trans, &m, &n, &nrhs, a, &lda, b, &ldb, work, &lwork, &info);
308 if( info < 0 ) { info = info - 1; }
309 return info;
310}
311#endif
312
313lapack_int LAPACKE_dgesv( int matrix_layout, lapack_int n, lapack_int nrhs,
314 double* a, lapack_int lda, lapack_int* ipiv,
315 double* b, lapack_int ldb )
316{
317 lapack_int info = 0;
318 assert(matrix_layout == LAPACK_COL_MAJOR);
319 LAPACK_dgesv( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info );
320 if( info < 0 ) { info = info - 1; }
321 return info;
322}
323
324lapack_int LAPACKE_dgetrf( int matrix_layout, lapack_int m, lapack_int n,
325 double* a, lapack_int lda, lapack_int* ipiv )
326{
327 lapack_int info = 0;
328 assert(matrix_layout == LAPACK_COL_MAJOR);
329 LAPACK_dgetrf( &m, &n, a, &lda, ipiv, &info );
330 if( info < 0 ) { info = info - 1; }
331 return info;
332}
333
334lapack_int LAPACKE_dgetri_work( int matrix_layout, lapack_int n, double* a,
335 lapack_int lda, const lapack_int* ipiv,
336 double* work, lapack_int lwork )
337{
338 lapack_int info = 0;
339 assert(matrix_layout == LAPACK_COL_MAJOR);
340 LAPACK_dgetri( &n, a, &lda, ipiv, work, &lwork, &info );
341 if( info < 0 ) { info = info - 1; }
342 return info;
343}
344
345lapack_int LAPACKE_dsytrf_work( int matrix_layout, char uplo, lapack_int n,
346 double* a, lapack_int lda, lapack_int* ipiv,
347 double* work, lapack_int lwork )
348{
349 lapack_int info = 0;
350 assert(matrix_layout == LAPACK_COL_MAJOR);
351 LAPACK_dsytrf( &uplo, &n, a, &lda, ipiv, work, &lwork, &info );
352 if( info < 0 ) { info = info - 1; }
353 return info;
354}
355
356lapack_int LAPACKE_dsytri_work( int matrix_layout, char uplo, lapack_int n,
357 double* a, lapack_int lda,
358 const lapack_int* ipiv, double* work )
359{
360 lapack_int info = 0;
361 assert(matrix_layout == LAPACK_COL_MAJOR);
362 LAPACK_dsytri( &uplo, &n, a, &lda, ipiv, work, &info );
363 if( info < 0 ) { info = info - 1; }
364 return info;
365}
366
367#endif
int info