Skip to content

Commit 1575bb8

Browse files
authored
Update LAPACKE interfaces for Dynamic Mode Decomposition
1 parent 308bf2f commit 1575bb8

16 files changed

+264
-203
lines changed

LAPACKE/src/lapacke_cgedmd.c

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,25 @@
3232

3333
#include "lapacke_utils.h"
3434

35-
lapack_int LAPACKE_cgedmd( int matrix_layout, char jobs, char jobz, char jobf,
36-
lapack_int whtsvd, lapack_int m, lapack_int n,
37-
lapack_complex_float* x, lapack_int ldx,
38-
lapack_complex_float* y, lapack_int ldy, lapack_int k,
39-
lapack_complex_float* reig, lapack_complex_float* imeig,
35+
lapack_int LAPACKE_cgedmd( int matrix_layout, char jobs, char jobz, char jobr,
36+
char jobf, lapack_int whtsvd, lapack_int m,
37+
lapack_int n, lapack_complex_float* x,
38+
lapack_int ldx, lapack_complex_float* y,
39+
lapack_int ldy, lapack_int nrnk, float* tol,
40+
lapack_int k, lapack_complex_float* eigs,
4041
lapack_complex_float* z, lapack_int ldz,
41-
lapack_complex_float* res, lapack_complex_float* b,
42+
float* res, lapack_complex_float* b,
4243
lapack_int ldb, lapack_complex_float* w,
4344
lapack_int ldw, lapack_complex_float* s, lapack_int lds)
4445
{
4546
lapack_int info = 0;
4647
lapack_int lwork = -1;
4748
lapack_int liwork = -1;
48-
lapack_complex_float* work = NULL;
49+
lapack_int lzwork = -1;
50+
lapack_complex_float* zwork = NULL;
51+
float* work = NULL;
4952
lapack_int* iwork = NULL;
53+
lapack_complex_float zwork_query;
5054
lapack_complex_float work_query;
5155
lapack_int iwork_query;
5256
if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
@@ -77,36 +81,44 @@ lapack_int LAPACKE_cgedmd( int matrix_layout, char jobs, char jobz, char jobf,
7781
}
7882
#endif
7983
/* Query optimal working array(s) size */
80-
info = LAPACKE_cgedmd_work( matrix_layout, jobs, jobz, jobf, whtsvd, m, n,
81-
x, ldx, y, ldy, k, reig, imeig, z, ldz, res,
82-
b, ldb, w, ldw, s, lds, &work_query, lwork,
83-
&iwork_query, liwork );
84+
info = LAPACKE_cgedmd_work( matrix_layout, jobs, jobz, jobr, jobf, whtsvd,
85+
m, n, x, ldx, y, ldy, nrnk, tol, k, eigs, z, ldz,
86+
res, b, ldb, w, ldw, s, lds, &zwork_query,
87+
lzwork, &work_query, lwork, &iwork_query, liwork );
8488

8589
if( info != 0 ) {
8690
goto exit_level_0;
8791
}
92+
lzwork = LAPACK_C2INT( zwork_query );
8893
lwork = LAPACK_C2INT( work_query );
8994
liwork = iwork_query;
9095
/* Allocate memory for work arrays */
91-
work = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * lwork );
92-
if( work == NULL ) {
96+
zwork = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * lzwork );
97+
if( zwork == NULL ) {
9398
info = LAPACK_WORK_MEMORY_ERROR;
9499
goto exit_level_0;
95100
}
101+
work = (float*)LAPACKE_malloc( sizeof(float) * lwork );
102+
if( work == NULL ) {
103+
info = LAPACK_WORK_MEMORY_ERROR;
104+
goto exit_level_1;
105+
}
96106
iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * liwork );
97107
if( iwork == NULL ) {
98108
info = LAPACK_WORK_MEMORY_ERROR;
99-
goto exit_level_1;
109+
goto exit_level_2;
100110
}
101111
/* Call middle-level interface */
102-
info = LAPACKE_cgedmd_work( matrix_layout, jobs, jobz, jobf, whtsvd, m, n,
103-
x, ldx, y, ldy, k, reig, imeig, z, ldz, res,
104-
b, ldb, w, ldw, s, lds, work, lwork, iwork,
105-
liwork );
112+
info = LAPACKE_cgedmd_work( matrix_layout, jobs, jobz, jobr, jobf, whtsvd,
113+
m, n, x, ldx, y, ldy, nrnk, tol, k, eigs, z, ldz,
114+
res, b, ldb, w, ldw, s, lds, zwork, lzwork,
115+
work, lwork, iwork, liwork );
106116
/* Release memory and exit */
107117
LAPACKE_free( iwork );
108-
exit_level_1:
118+
exit_level_2:
109119
LAPACKE_free( work );
120+
exit_level_1:
121+
LAPACKE_free( zwork );
110122
exit_level_0:
111123
if( info == LAPACK_WORK_MEMORY_ERROR ) {
112124
LAPACKE_xerbla( "LAPACKE_cgedmd", info );

LAPACKE/src/lapacke_cgedmd_work.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,25 @@
3333
#include "lapacke_utils.h"
3434

3535
lapack_int LAPACKE_cgedmd_work( int matrix_layout, char jobs, char jobz,
36-
char jobf, lapack_int whtsvd, lapack_int m,
36+
char jobr, char jobf, lapack_int whtsvd, lapack_int m,
3737
lapack_int n, lapack_complex_float* x, lapack_int ldx,
38-
lapack_complex_float* y, lapack_int ldy, lapack_int k,
39-
lapack_complex_float* reig, lapack_complex_float* imeig,
38+
lapack_complex_float* y, lapack_int ldy, lapack_int nrnk,
39+
float* tol, lapack_int k, lapack_complex_float* eigs,
4040
lapack_complex_float* z, lapack_int ldz,
41-
lapack_complex_float* res, lapack_complex_float* b,
41+
float* res, lapack_complex_float* b,
4242
lapack_int ldb, lapack_complex_float* w,
4343
lapack_int ldw, lapack_complex_float* s, lapack_int lds,
44-
lapack_complex_float* work, lapack_int lwork,
44+
lapack_complex_float* zwork, lapack_int lzwork,
45+
float* work, lapack_int lwork,
4546
lapack_int* iwork, lapack_int liwork )
4647
{
4748
lapack_int info = 0;
4849
if( matrix_layout == LAPACK_COL_MAJOR ) {
4950
/* Call LAPACK function and adjust info */
50-
LAPACK_cgedmd( &jobs, &jobz, &jobf, &whtsvd, &m, &n, x, &ldx, y, &ldy,
51-
&k, reig, imeig, z, &ldz, res, b, &ldb, w, &ldw, s, &lds,
52-
work, &lwork, iwork, &liwork, &info );
51+
LAPACK_cgedmd( &jobs, &jobz, &jobr, &jobf, &whtsvd, &m, &n, x, &ldx, y,
52+
&ldy, &nrnk, tol, &k, eigs, z, &ldz, res, b, &ldb, w, &ldw,
53+
s, &lds, zwork, &lzwork, work, &lwork, iwork, &liwork,
54+
&info );
5355
if( info < 0 ) {
5456
info = info - 1;
5557
}
@@ -99,9 +101,10 @@ lapack_int LAPACKE_cgedmd_work( int matrix_layout, char jobs, char jobz,
99101
}
100102
/* Query optimal working array(s) size if requested */
101103
if( lwork == -1 ) {
102-
LAPACK_cgedmd( &jobs, &jobz, &jobf, &whtsvd, &m, &n, x, &ldx, y, &ldy,
103-
&k, reig, imeig, z, &ldz, res, b, &ldb, w, &ldw, s, &lds,
104-
work, &lwork, iwork, &liwork, &info );
104+
LAPACK_cgedmd( &jobs, &jobz, &jobr, &jobf, &whtsvd, &m, &n, x,
105+
&ldx, y, &ldy, &nrnk, tol, &k, eigs, z, &ldz, res, b,
106+
&ldb, w, &ldw, s, &lds, zwork, &lzwork,
107+
work, &lwork, iwork, &liwork, &info );
105108
return (info < 0) ? (info - 1) : info;
106109
}
107110
/* Allocate memory for temporary array(s) */
@@ -143,9 +146,10 @@ lapack_int LAPACKE_cgedmd_work( int matrix_layout, char jobs, char jobz,
143146
LAPACKE_cge_trans( matrix_layout, m, n, w, ldw, w_t, ldw_t );
144147
LAPACKE_cge_trans( matrix_layout, m, n, s, lds, s_t, lds_t );
145148
/* Call LAPACK function and adjust info */
146-
LAPACK_cgedmd( &jobs, &jobz, &jobf, &whtsvd, &m, &n, x_t, &ldx_t, y_t,
147-
&ldy_t, &k, reig, imeig, z_t, &ldz_t, res, b_t, &ldb_t,
148-
w_t, &ldw_t, s_t, &lds_t, work, &lwork, iwork, &liwork, &info );
149+
LAPACK_cgedmd( &jobs, &jobz, &jobr, &jobf, &whtsvd, &m, &n, x_t,
150+
&ldx_t, y_t, &ldy_t, &nrnk, tol, &k, eigs, z_t, &ldz_t,
151+
res, b_t, &ldb_t, w_t, &ldw_t, s_t, &lds_t, zwork,
152+
&lzwork, work, &lwork, iwork, &liwork, &info );
149153
if( info < 0 ) {
150154
info = info - 1;
151155
}

LAPACKE/src/lapacke_cgedmdq.c

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,21 @@ lapack_int LAPACKE_cgedmdq( int matrix_layout, char jobs, char jobz, char jobr,
3737
lapack_int m, lapack_int n, lapack_complex_float* f,
3838
lapack_int ldf, lapack_complex_float* x,
3939
lapack_int ldx, lapack_complex_float* y,
40-
lapack_int ldy, lapack_int nrnk, float tol,
41-
lapack_int k, lapack_complex_float* reig,
42-
lapack_complex_float* imeig,
40+
lapack_int ldy, lapack_int nrnk, float* tol,
41+
lapack_int k, lapack_complex_float* eigs,
4342
lapack_complex_float* z, lapack_int ldz,
44-
lapack_complex_float* res, lapack_complex_float* b,
43+
float* res, lapack_complex_float* b,
4544
lapack_int ldb, lapack_complex_float* v,
4645
lapack_int ldv, lapack_complex_float* s, lapack_int lds)
4746
{
4847
lapack_int info = 0;
4948
lapack_int lwork = -1;
5049
lapack_int liwork = -1;
50+
lapack_int lzwork = -1;
51+
lapack_complex_float* zwork = NULL;
5152
lapack_complex_float* work = NULL;
5253
lapack_int* iwork = NULL;
54+
lapack_complex_float zwork_query;
5355
lapack_complex_float work_query;
5456
lapack_int iwork_query;
5557
if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
@@ -85,36 +87,44 @@ lapack_int LAPACKE_cgedmdq( int matrix_layout, char jobs, char jobz, char jobr,
8587
/* Query optimal working array(s) size */
8688
info = LAPACKE_cgedmdq_work( matrix_layout, jobs, jobz, jobr, jobq, jobt,
8789
jobf, whtsvd, m, n, f, ldf, x, ldx, y, ldy,
88-
nrnk, tol, k, reig, imeig, z, ldz, res,
89-
b, ldb, v, ldv, s, lds, &work_query, lwork,
90-
&iwork_query, liwork );
90+
nrnk, tol, k, eigs, z, ldz, res,
91+
b, ldb, v, ldv, s, lds, &zwork_query, lzwork,
92+
&work_query, lwork, &iwork_query, liwork );
9193

9294
if( info != 0 ) {
9395
goto exit_level_0;
9496
}
97+
lzwork = LAPACK_C2INT( zwork_query );
9598
lwork = LAPACK_C2INT( work_query );
9699
liwork = iwork_query;
97100
/* Allocate memory for work arrays */
101+
zwork = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * lzwork );
102+
if( zwork == NULL ) {
103+
info = LAPACK_WORK_MEMORY_ERROR;
104+
goto exit_level_0;
105+
}
98106
work = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * lwork );
99107
if( work == NULL ) {
100108
info = LAPACK_WORK_MEMORY_ERROR;
101-
goto exit_level_0;
109+
goto exit_level_1;
102110
}
103111
iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * liwork );
104112
if( iwork == NULL ) {
105113
info = LAPACK_WORK_MEMORY_ERROR;
106-
goto exit_level_1;
114+
goto exit_level_2;
107115
}
108116
/* Call middle-level interface */
109117
info = LAPACKE_cgedmdq_work( matrix_layout, jobs, jobz, jobr, jobq, jobt,
110118
jobf, whtsvd, m, n, f, ldf, x, ldx, y, ldy,
111-
nrnk, tol, k, reig, imeig, z, ldz, res,
112-
b, ldb, v, ldv, s, lds, work, lwork, iwork,
113-
liwork );
119+
nrnk, tol, k, eigs, z, ldz, res,
120+
b, ldb, v, ldv, s, lds, zwork, lzwork,
121+
work, lwork, iwork, liwork );
114122
/* Release memory and exit */
115123
LAPACKE_free( iwork );
116-
exit_level_1:
124+
exit_level_2:
117125
LAPACKE_free( work );
126+
exit_level_1:
127+
LAPACKE_free( zwork );
118128
exit_level_0:
119129
if( info == LAPACK_WORK_MEMORY_ERROR ) {
120130
LAPACKE_xerbla( "LAPACKE_cgedmdq", info );

LAPACKE/src/lapacke_cgedmdq_work.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,25 @@ lapack_int LAPACKE_cgedmdq_work( int matrix_layout, char jobs, char jobz,
3838
lapack_complex_float* f, lapack_int ldf,
3939
lapack_complex_float* x, lapack_int ldx,
4040
lapack_complex_float* y, lapack_int ldy,
41-
lapack_int nrnk, float tol, lapack_int k,
42-
lapack_complex_float* reig,
43-
lapack_complex_float* imeig,
41+
lapack_int nrnk, float* tol, lapack_int k,
42+
lapack_complex_float* eigs,
4443
lapack_complex_float* z,
45-
lapack_int ldz, lapack_complex_float* res,
44+
lapack_int ldz, float* res,
4645
lapack_complex_float* b,
4746
lapack_int ldb, lapack_complex_float* v,
4847
lapack_int ldv, lapack_complex_float* s,
49-
lapack_int lds, lapack_complex_float* work,
48+
lapack_int lds, lapack_complex_float *zwork,
49+
lapack_int lzwork, lapack_complex_float* work,
5050
lapack_int lwork, lapack_int* iwork,
5151
lapack_int liwork )
5252
{
5353
lapack_int info = 0;
5454
if( matrix_layout == LAPACK_COL_MAJOR ) {
5555
/* Call LAPACK function and adjust info */
5656
LAPACK_cgedmdq( &jobs, &jobz, &jobr, &jobq, &jobt, &jobf, &whtsvd, &m,
57-
&n, f, &ldf, x, &ldx, y, &ldy, &nrnk, &tol, &k, reig,
58-
imeig, z, &ldz, res, b, &ldb, v, &ldv, s, &lds,
59-
work, &lwork, iwork, &liwork, &info );
57+
&n, f, &ldf, x, &ldx, y, &ldy, &nrnk, &tol, &k, eigs,
58+
z, &ldz, res, b, &ldb, v, &ldv, s, &lds,
59+
zwork, &lzwork, work, &lwork, iwork, &liwork, &info );
6060
if( info < 0 ) {
6161
info = info - 1;
6262
}
@@ -112,11 +112,11 @@ lapack_int LAPACKE_cgedmdq_work( int matrix_layout, char jobs, char jobz,
112112
return info;
113113
}
114114
/* Query optimal working array(s) size if requested */
115-
if( lwork == -1 || liwork == -1 ) {
115+
if( lzwork == -1 || lwork == -1 || liwork == -1 ) {
116116
LAPACK_cgedmdq( &jobs, &jobz, &jobr, &jobq, &jobt, &jobf, &whtsvd, &m,
117-
&n, f, &ldf, x, &ldx, y, &ldy, &nrnk, &tol, &k, reig,
118-
imeig, z, &ldz, res, b, &ldb, v, &ldv, s, &lds,
119-
work, &lwork, iwork, &liwork, &info );
117+
&n, f, &ldf, x, &ldx, y, &ldy, &nrnk, &tol, &k, eigs,
118+
z, &ldz, res, b, &ldb, v, &ldv, s, &lds,
119+
zwork, &lzwork, work, &lwork, iwork, &liwork, &info );
120120
return (info < 0) ? (info - 1) : info;
121121
}
122122
/* Allocate memory for temporary array(s) */
@@ -165,9 +165,9 @@ lapack_int LAPACKE_cgedmdq_work( int matrix_layout, char jobs, char jobz,
165165
LAPACKE_cge_trans( matrix_layout, m, n, s, lds, s_t, lds_t );
166166
/* Call LAPACK function and adjust info */
167167
LAPACK_cgedmdq( &jobs, &jobz, &jobr, &jobq, &jobt, &jobf, &whtsvd, &m,
168-
&n, f, &ldf, x, &ldx, y, &ldy, &nrnk, &tol, &k, reig,
169-
imeig, z, &ldz, res, b, &ldb, v, &ldv, s, &lds,
170-
work, &lwork, iwork, &liwork, &info );
168+
&n, f, &ldf, x, &ldx, y, &ldy, &nrnk, &tol, &k, eigs,
169+
z, &ldz, res, b, &ldb, v, &ldv, s, &lds,
170+
zwork, &lzwork, work, &lwork, iwork, &liwork, &info );
171171
if( info < 0 ) {
172172
info = info - 1;
173173
}

LAPACKE/src/lapacke_dgedmd.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@
3232

3333
#include "lapacke_utils.h"
3434

35-
lapack_int LAPACKE_dgedmd( int matrix_layout, char jobs, char jobz, char jobf,
36-
lapack_int whtsvd, lapack_int m, lapack_int n,
37-
double* x, lapack_int ldx, double* y, lapack_int ldy,
38-
lapack_int k, double* reig, double* imeig, double* z,
39-
lapack_int ldz, double* res, double* b, lapack_int ldb,
35+
lapack_int LAPACKE_dgedmd( int matrix_layout, char jobs, char jobz, char jobr,
36+
char jobf, lapack_int whtsvd, lapack_int m,
37+
lapack_int n, double* x, lapack_int ldx, double* y,
38+
lapack_int ldy, lapack_int nrnk, double* tol,
39+
lapack_int k, double* reig, double* imeig,
40+
double* z, lapack_int ldz,
41+
double* res, double* b, lapack_int ldb,
4042
double* w, lapack_int ldw, double* s, lapack_int lds)
4143
{
4244
lapack_int info = 0;
@@ -74,10 +76,10 @@ lapack_int LAPACKE_dgedmd( int matrix_layout, char jobs, char jobz, char jobf,
7476
}
7577
#endif
7678
/* Query optimal working array(s) size */
77-
info = LAPACKE_dgedmd_work( matrix_layout, jobs, jobz, jobf, whtsvd, m, n,
78-
x, ldx, y, ldy, k, reig, imeig, z, ldz, res,
79-
b, ldb, w, ldw, s, lds, &work_query, lwork,
80-
&iwork_query, liwork );
79+
info = LAPACKE_dgedmd_work( matrix_layout, jobs, jobz, jobr, jobf, whtsvd,
80+
m, n, x, ldx, y, ldy, nrnk, tol, k, reig, imeig, z, ldz,
81+
res, b, ldb, w, ldw, s, lds, &work_query,
82+
lwork, &iwork_query, liwork );
8183

8284
if( info != 0 ) {
8385
goto exit_level_0;
@@ -96,10 +98,10 @@ lapack_int LAPACKE_dgedmd( int matrix_layout, char jobs, char jobz, char jobf,
9698
goto exit_level_1;
9799
}
98100
/* Call middle-level interface */
99-
info = LAPACKE_dgedmd_work( matrix_layout, jobs, jobz, jobf, whtsvd, m, n,
100-
x, ldx, y, ldy, k, reig, imeig, z, ldz, res,
101-
b, ldb, w, ldw, s, lds, work, lwork, iwork,
102-
liwork );
101+
info = LAPACKE_dgedmd_work( matrix_layout, jobs, jobz, jobr, jobf, whtsvd,
102+
m, n, x, ldx, y, ldy, nrnk, tol, k, reig, imeig, z, ldz,
103+
res, b, ldb, w, ldw, s, lds, work, lwork,
104+
iwork, liwork );
103105
/* Release memory and exit */
104106
LAPACKE_free( iwork );
105107
exit_level_1:

0 commit comments

Comments
 (0)