LAPACKE: fix incorrect value of lda_t in lapacke_?laswp_work
authorVladimir Chalupecky <vladimir.chalupecky@gmail.com>
Tue, 7 Feb 2017 08:21:46 +0000 (09:21 +0100)
committerVladimir Chalupecky <vladimir.chalupecky@gmail.com>
Tue, 7 Feb 2017 08:21:46 +0000 (09:21 +0100)
Fixed in Reference LAPACK in commit:

https://github.com/Reference-LAPACK/lapack/pull/118/commits/07e1fbd89752bed74d35c48e92287d467646a158

lapack-netlib/LAPACKE/src/lapacke_claswp_work.c
lapack-netlib/LAPACKE/src/lapacke_dlaswp_work.c
lapack-netlib/LAPACKE/src/lapacke_slaswp_work.c
lapack-netlib/LAPACKE/src/lapacke_zlaswp_work.c

index 582c6db..599e72f 100644 (file)
@@ -46,7 +46,11 @@ lapack_int LAPACKE_claswp_work( int matrix_layout, lapack_int n,
             info = info - 1;
         }
     } else if( matrix_layout == LAPACK_ROW_MAJOR ) {
-        lapack_int lda_t = MAX(1,lda);
+        lapack_int lda_t = MAX(1,k2);
+        lapack_int i;
+        for( i = k1; i <= k2; i++ ) {
+            lda_t = MAX( lda_t, ipiv[k1 + ( i - k1 ) * ABS( incx ) - 1] );
+        }
         lapack_complex_float* a_t = NULL;
         /* Check leading dimension(s) */
         if( lda < n ) {
@@ -62,12 +66,12 @@ lapack_int LAPACKE_claswp_work( int matrix_layout, lapack_int n,
             goto exit_level_0;
         }
         /* Transpose input matrices */
-        LAPACKE_cge_trans( matrix_layout, lda, n, a, lda, a_t, lda_t );
+        LAPACKE_cge_trans( matrix_layout, lda_t, n, a, lda, a_t, lda_t );
         /* Call LAPACK function and adjust info */
         LAPACK_claswp( &n, a_t, &lda_t, &k1, &k2, ipiv, &incx );
         info = 0;  /* LAPACK call is ok! */
         /* Transpose output matrices */
-        LAPACKE_cge_trans( LAPACK_COL_MAJOR, lda, n, a_t, lda_t, a, lda );
+        LAPACKE_cge_trans( LAPACK_COL_MAJOR, lda_t, n, a_t, lda_t, a, lda );
         /* Release memory and exit */
         LAPACKE_free( a_t );
 exit_level_0:
index 5aa2219..027c25f 100644 (file)
@@ -45,7 +45,11 @@ lapack_int LAPACKE_dlaswp_work( int matrix_layout, lapack_int n, double* a,
             info = info - 1;
         }
     } else if( matrix_layout == LAPACK_ROW_MAJOR ) {
-        lapack_int lda_t = MAX(1,lda);
+        lapack_int lda_t = MAX(1,k2);
+        lapack_int i;
+        for( i = k1; i <= k2; i++ ) {
+            lda_t = MAX( lda_t, ipiv[k1 + ( i - k1 ) * ABS( incx ) - 1] );
+        }
         double* a_t = NULL;
         /* Check leading dimension(s) */
         if( lda < n ) {
@@ -60,12 +64,12 @@ lapack_int LAPACKE_dlaswp_work( int matrix_layout, lapack_int n, double* a,
             goto exit_level_0;
         }
         /* Transpose input matrices */
-        LAPACKE_dge_trans( matrix_layout, lda, n, a, lda, a_t, lda_t );
+        LAPACKE_dge_trans( matrix_layout, lda_t, n, a, lda, a_t, lda_t );
         /* Call LAPACK function and adjust info */
         LAPACK_dlaswp( &n, a_t, &lda_t, &k1, &k2, ipiv, &incx );
         info = 0;  /* LAPACK call is ok! */
         /* Transpose output matrices */
-        LAPACKE_dge_trans( LAPACK_COL_MAJOR, lda, n, a_t, lda_t, a, lda );
+        LAPACKE_dge_trans( LAPACK_COL_MAJOR, lda_t, n, a_t, lda_t, a, lda );
         /* Release memory and exit */
         LAPACKE_free( a_t );
 exit_level_0:
index 01abf59..1faadbb 100644 (file)
@@ -45,7 +45,11 @@ lapack_int LAPACKE_slaswp_work( int matrix_layout, lapack_int n, float* a,
             info = info - 1;
         }
     } else if( matrix_layout == LAPACK_ROW_MAJOR ) {
-        lapack_int lda_t = MAX(1,lda);
+        lapack_int lda_t = MAX(1,k2);
+        lapack_int i;
+        for( i = k1; i <= k2; i++ ) {
+            lda_t = MAX( lda_t, ipiv[k1 + ( i - k1 ) * ABS( incx ) - 1] );
+        }
         float* a_t = NULL;
         /* Check leading dimension(s) */
         if( lda < n ) {
@@ -60,12 +64,12 @@ lapack_int LAPACKE_slaswp_work( int matrix_layout, lapack_int n, float* a,
             goto exit_level_0;
         }
         /* Transpose input matrices */
-        LAPACKE_sge_trans( matrix_layout, lda, n, a, lda, a_t, lda_t );
+        LAPACKE_sge_trans( matrix_layout, lda_t, n, a, lda, a_t, lda_t );
         /* Call LAPACK function and adjust info */
         LAPACK_slaswp( &n, a_t, &lda_t, &k1, &k2, ipiv, &incx );
         info = 0;  /* LAPACK call is ok! */
         /* Transpose output matrices */
-        LAPACKE_sge_trans( LAPACK_COL_MAJOR, lda, n, a_t, lda_t, a, lda );
+        LAPACKE_sge_trans( LAPACK_COL_MAJOR, lda_t, n, a_t, lda_t, a, lda );
         /* Release memory and exit */
         LAPACKE_free( a_t );
 exit_level_0:
index e9a282c..0ab0aae 100644 (file)
@@ -46,7 +46,11 @@ lapack_int LAPACKE_zlaswp_work( int matrix_layout, lapack_int n,
             info = info - 1;
         }
     } else if( matrix_layout == LAPACK_ROW_MAJOR ) {
-        lapack_int lda_t = MAX(1,lda);
+        lapack_int lda_t = MAX(1,k2);
+        lapack_int i;
+        for( i = k1; i <= k2; i++ ) {
+            lda_t = MAX( lda_t, ipiv[k1 + ( i - k1 ) * ABS( incx ) - 1] );
+        }
         lapack_complex_double* a_t = NULL;
         /* Check leading dimension(s) */
         if( lda < n ) {
@@ -62,12 +66,12 @@ lapack_int LAPACKE_zlaswp_work( int matrix_layout, lapack_int n,
             goto exit_level_0;
         }
         /* Transpose input matrices */
-        LAPACKE_zge_trans( matrix_layout, lda, n, a, lda, a_t, lda_t );
+        LAPACKE_zge_trans( matrix_layout, lda_t, n, a, lda, a_t, lda_t );
         /* Call LAPACK function and adjust info */
         LAPACK_zlaswp( &n, a_t, &lda_t, &k1, &k2, ipiv, &incx );
         info = 0;  /* LAPACK call is ok! */
         /* Transpose output matrices */
-        LAPACKE_zge_trans( LAPACK_COL_MAJOR, lda, n, a_t, lda_t, a, lda );
+        LAPACKE_zge_trans( LAPACK_COL_MAJOR, lda_t, n, a_t, lda_t, a, lda );
         /* Release memory and exit */
         LAPACKE_free( a_t );
 exit_level_0: