Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 80 additions & 39 deletions lapack-netlib/LAPACKE/src/lapacke_cgesvdq_work.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,42 @@ lapack_int LAPACKE_cgesvdq_work( int matrix_layout, char joba, char jobp,
info = info - 1;
}
} else if( matrix_layout == LAPACK_ROW_MAJOR ) {
lapack_int nrows_u = ( LAPACKE_lsame( jobu, 'a' ) ||
LAPACKE_lsame( jobu, 's' ) ) ? m : 1;
lapack_int ncols_u = LAPACKE_lsame( jobu, 'a' ) ? m :
(LAPACKE_lsame( jobu, 's' ) ? MIN(m,n) : 1);
lapack_int nrows_v = LAPACKE_lsame( jobv, 'a' ) ? n :
( LAPACKE_lsame( jobv, 's' ) ? MIN(m,n) : 1);

lapack_int nrows_u;
lapack_int ncols_u;
lapack_int nrows_v;
lapack_int ncols_v;

if( LAPACKE_lsame( jobu, 'a' ) ) {
nrows_u = m;
ncols_u = m;
}
else if( LAPACKE_lsame( jobu, 's' ) ||
LAPACKE_lsame( jobu, 'u' ) ||
LAPACKE_lsame( jobu, 'r' ) ) {
nrows_u = m;
ncols_u = n;
}
else if( LAPACKE_lsame( jobu, 'f' ) ) {
nrows_u = n;
ncols_u = n;
} else {
nrows_u = 1;
ncols_u = 1;
}

/* in the case joba == 'e', v_t is used as a workspace */
if( LAPACKE_lsame( jobv, 'a' ) ||
LAPACKE_lsame( jobv, 'v' ) ||
LAPACKE_lsame( jobv, 'r' ) ||
LAPACKE_lsame( joba, 'e' ) ) {
nrows_v = n;
ncols_v = n;
} else {
nrows_v = 1;
ncols_v = 1;
}

lapack_int lda_t = MAX(1,m);
lapack_int ldu_t = MAX(1,nrows_u);
lapack_int ldv_t = MAX(1,nrows_v);
Expand All @@ -73,69 +103,80 @@ lapack_int LAPACKE_cgesvdq_work( int matrix_layout, char joba, char jobp,
LAPACKE_xerbla( "LAPACKE_cgesvdq_work", info );
return info;
}
if( ldv < n ) {
if( ldv < ncols_v ) {
info = -14;
LAPACKE_xerbla( "LAPACKE_cgesvdq_work", info );
return info;
}
/* Query optimal working array(s) size if requested */
if( lcwork == -1 ) {
if ( ( liwork == -1 ) || ( lcwork == -1 ) || ( lrwork == -1 ) ) {
LAPACK_cgesvdq( &joba, &jobp, &jobr, &jobu, &jobv, &m, &n, a, &lda_t,
s, u, &ldu_t, v, &ldv_t, numrank, iwork, &liwork,
cwork, &lcwork, rwork, &lrwork, &info );
return (info < 0) ? (info - 1) : info;
}
/* Allocate memory for temporary array(s) */
a_t = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * lda_t * MAX(1,n) );
if( a_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_0;
}
if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) {
u_t = (lapack_complex_float*)
LAPACKE_malloc( sizeof(lapack_complex_float) * ldu_t * MAX(1,ncols_u) );
if ( ( m > 0 ) && ( n > 0 ) ){
a_t = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * lda_t * MAX(1,n) );
if( a_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_0;
}

u_t = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * ldu_t * MAX(1,ncols_u) );
if( u_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_1;
}
}
if( LAPACKE_lsame( jobv, 'a' ) || LAPACKE_lsame( jobv, 's' ) ) {
v_t = (lapack_complex_float*)
LAPACKE_malloc( sizeof(lapack_complex_float) * ldv_t * MAX(1,n) );

v_t = (lapack_complex_float*)LAPACKE_malloc( sizeof(lapack_complex_float) * ldv_t * MAX(1,ncols_v) );
if( v_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_2;
}
}

/* Transpose input matrices */
LAPACKE_cge_trans( matrix_layout, m, n, a, lda, a_t, lda_t );
if ( ( m > 0 ) && ( n > 0 ) ){
LAPACKE_cge_trans( matrix_layout, m, n, a, lda, a_t, lda_t );
}

/* Call LAPACK function and adjust info */
LAPACK_cgesvdq( &joba, &jobp, &jobr, &jobu, &jobv, &m, &n, a, &lda_t,
s, u, &ldu_t, v, &ldv_t, numrank, iwork, &liwork,
cwork, &lcwork, rwork, &lrwork, &info );
LAPACK_cgesvdq( &joba, &jobp, &jobr, &jobu, &jobv, &m, &n, a, &lda_t,
s, u, &ldu_t, v, &ldv_t, numrank, iwork, &liwork,
cwork, &lcwork, rwork, &lrwork, &info );
if( info < 0 ) {
info = info - 1;
}

/* Transpose output matrices */
LAPACKE_cge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda );
if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) {
LAPACKE_cge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t,
u, ldu );
}
if( LAPACKE_lsame( jobv, 'a' ) || LAPACKE_lsame( jobv, 's' ) ) {
LAPACKE_cge_trans( LAPACK_COL_MAJOR, nrows_v, n, v_t, ldv_t, v,
ldv );
if ( ( m > 0 ) && ( n > 0 ) ){
LAPACKE_cge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda );

if( LAPACKE_lsame( jobu, 'a' ) ||
LAPACKE_lsame( jobu, 's' ) ||
LAPACKE_lsame( jobu, 'u' ) ||
LAPACKE_lsame( jobu, 'r' ) ||
LAPACKE_lsame( jobu, 'f' ) ) {
LAPACKE_cge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t,
u, ldu );
}

/* we do not transpose v_t back to v in the case (joba == 'e') because, in this case, v_t is used as a workspace */
if( LAPACKE_lsame( jobv, 'a' ) ||
LAPACKE_lsame( jobv, 'v' ) ||
LAPACKE_lsame( jobv, 'r' )) {
LAPACKE_cge_trans( LAPACK_COL_MAJOR, nrows_v, ncols_v, v_t, ldv_t, v,
ldv );
}
}

/* Release memory and exit */
if( LAPACKE_lsame( jobv, 'a' ) || LAPACKE_lsame( jobv, 's' ) ) {
LAPACKE_free( v_t );
}
if ( ( m > 0 ) && ( n > 0 ) ) { LAPACKE_free( v_t ); v_t = NULL; }
exit_level_2:
if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) {
LAPACKE_free( u_t );
}
if ( ( m > 0 ) && ( n > 0 ) ) { LAPACKE_free( u_t ); u_t = NULL; }
exit_level_1:
LAPACKE_free( a_t );
if ( ( m > 0 ) && ( n > 0 ) ) { LAPACKE_free( a_t ); a_t = NULL; }
exit_level_0:
if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
LAPACKE_xerbla( "LAPACKE_cgesvdq_work", info );
Expand Down
115 changes: 79 additions & 36 deletions lapack-netlib/LAPACKE/src/lapacke_dgesvdq_work.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,42 @@ lapack_int LAPACKE_dgesvdq_work( int matrix_layout, char joba, char jobp,
info = info - 1;
}
} else if( matrix_layout == LAPACK_ROW_MAJOR ) {
lapack_int nrows_u = ( LAPACKE_lsame( jobu, 'a' ) ||
LAPACKE_lsame( jobu, 's' ) ) ? m : 1;
lapack_int ncols_u = LAPACKE_lsame( jobu, 'a' ) ? m :
(LAPACKE_lsame( jobu, 's' ) ? MIN(m,n) : 1);
lapack_int nrows_v = LAPACKE_lsame( jobv, 'a' ) ? n :
( LAPACKE_lsame( jobv, 's' ) ? MIN(m,n) : 1);

lapack_int nrows_u;
lapack_int ncols_u;
lapack_int nrows_v;
lapack_int ncols_v;

if( LAPACKE_lsame( jobu, 'a' ) ) {
nrows_u = m;
ncols_u = m;
}
else if( LAPACKE_lsame( jobu, 's' ) ||
LAPACKE_lsame( jobu, 'u' ) ||
LAPACKE_lsame( jobu, 'r' ) ) {
nrows_u = m;
ncols_u = n;
}
else if( LAPACKE_lsame( jobu, 'f' ) ) {
nrows_u = n;
ncols_u = n;
} else {
nrows_u = 1;
ncols_u = 1;
}

/* in the case joba == 'e', v_t is used as a workspace */
if( LAPACKE_lsame( jobv, 'a' ) ||
LAPACKE_lsame( jobv, 'v' ) ||
LAPACKE_lsame( jobv, 'r' ) ||
LAPACKE_lsame( joba, 'e' ) ) {
nrows_v = n;
ncols_v = n;
} else {
nrows_v = 1;
ncols_v = 1;
}

lapack_int lda_t = MAX(1,m);
lapack_int ldu_t = MAX(1,nrows_u);
lapack_int ldv_t = MAX(1,nrows_v);
Expand All @@ -73,69 +103,82 @@ lapack_int LAPACKE_dgesvdq_work( int matrix_layout, char joba, char jobp,
LAPACKE_xerbla( "LAPACKE_dgesvdq_work", info );
return info;
}
if( ldv < n ) {
if( ldv < ncols_v ) {
info = -14;
LAPACKE_xerbla( "LAPACKE_dgesvdq_work", info );
return info;
}

/* Query optimal working array(s) size if requested */
if( lwork == -1 ) {
if ( ( liwork == -1 ) || ( lwork == -1 ) || ( lrwork == -1 ) ) {
LAPACK_dgesvdq( &joba, &jobp, &jobr, &jobu, &jobv, &m, &n, a, &lda_t,
s, u, &ldu_t, v, &ldv_t, numrank, iwork, &liwork,
work, &lwork, rwork, &lrwork, &info );
return (info < 0) ? (info - 1) : info;
}

/* Allocate memory for temporary array(s) */
a_t = (double*)LAPACKE_malloc( sizeof(double) * lda_t * MAX(1,n) );
if( a_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_0;
}
if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) {
u_t = (double*)
LAPACKE_malloc( sizeof(double) * ldu_t * MAX(1,ncols_u) );
if ( ( m > 0 ) && ( n > 0 ) ){
a_t = (double*)LAPACKE_malloc( sizeof(double) * lda_t * MAX(1,n) );
if( a_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_0;
}

u_t = (double*)LAPACKE_malloc( sizeof(double) * ldu_t * MAX(1,ncols_u) );
if( u_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_1;
}
}
if( LAPACKE_lsame( jobv, 'a' ) || LAPACKE_lsame( jobv, 's' ) ) {
v_t = (double*)
LAPACKE_malloc( sizeof(double) * ldv_t * MAX(1,n) );

v_t = (double*)LAPACKE_malloc( sizeof(double) * ldv_t * MAX(1,ncols_v) );
if( v_t == NULL ) {
info = LAPACK_TRANSPOSE_MEMORY_ERROR;
goto exit_level_2;
}
}

/* Transpose input matrices */
LAPACKE_dge_trans( matrix_layout, m, n, a, lda, a_t, lda_t );
if ( ( m > 0 ) && ( n > 0 ) ){
LAPACKE_dge_trans( matrix_layout, m, n, a, lda, a_t, lda_t );
}

/* Call LAPACK function and adjust info */
LAPACK_dgesvdq( &joba, &jobp, &jobr, &jobu, &jobv, &m, &n, a, &lda_t,
s, u, &ldu_t, v, &ldv_t, numrank, iwork, &liwork,
work, &lwork, rwork, &lrwork, &info );
if( info < 0 ) {
info = info - 1;
}

/* Transpose output matrices */
LAPACKE_dge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda );
if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) {
LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t,
u, ldu );
}
if( LAPACKE_lsame( jobv, 'a' ) || LAPACKE_lsame( jobv, 's' ) ) {
LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrows_v, n, v_t, ldv_t, v,
ldv );
if ( ( m > 0 ) && ( n > 0 ) ){
LAPACKE_dge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda );

if( LAPACKE_lsame( jobu, 'a' ) ||
LAPACKE_lsame( jobu, 's' ) ||
LAPACKE_lsame( jobu, 'u' ) ||
LAPACKE_lsame( jobu, 'r' ) ||
LAPACKE_lsame( jobu, 'f' ) ) {
LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t,
u, ldu );
}

/* we do not transpose v_t back to v in the case (joba == 'e') because, in this case, v_t is used as a workspace */
if( LAPACKE_lsame( jobv, 'a' ) ||
LAPACKE_lsame( jobv, 'v' ) ||
LAPACKE_lsame( jobv, 'r' )) {
LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrows_v, ncols_v, v_t, ldv_t, v,
ldv );
}
}

/* Release memory and exit */
if( LAPACKE_lsame( jobv, 'a' ) || LAPACKE_lsame( jobv, 's' ) ) {
LAPACKE_free( v_t );
}
if ( ( m > 0 ) && ( n > 0 ) ) { LAPACKE_free( v_t ); v_t = NULL; }
exit_level_2:
if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) {
LAPACKE_free( u_t );
}
if ( ( m > 0 ) && ( n > 0 ) ) { LAPACKE_free( u_t ); u_t = NULL; }
exit_level_1:
LAPACKE_free( a_t );
if ( ( m > 0 ) && ( n > 0 ) ) { LAPACKE_free( a_t ); a_t = NULL; }
exit_level_0:
if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
LAPACKE_xerbla( "LAPACKE_dgesvdq_work", info );
Expand Down
Loading
Loading