summaryrefslogtreecommitdiff
path: root/SRC/stfsm.f
diff options
context:
space:
mode:
authorlangou <langou@users.noreply.github.com>2009-01-12 05:17:21 +0000
committerlangou <langou@users.noreply.github.com>2009-01-12 05:17:21 +0000
commit3cff0c0c7d6f581bb14e645fbd5d035a53581446 (patch)
treeb16f6163f51de9ac12a691dcb407c55cb5086ed0 /SRC/stfsm.f
parentdc20e8382624a09011f4f57fac2f0dd543a0522d (diff)
downloadlapack-3cff0c0c7d6f581bb14e645fbd5d035a53581446.tar.gz
lapack-3cff0c0c7d6f581bb14e645fbd5d035a53581446.tar.bz2
lapack-3cff0c0c7d6f581bb14e645fbd5d035a53581446.zip
============================================================================
Bug in RFP routines xTFSM for N=1 independently reported by Jason and Julie. ============================================================================ See Jason's email DEC/27/2009: "Similar problem in xTFSM". Jason used gfortran with -fbounds-check and got: > At line 328 of file stfsm.f > Fortran runtime error: Array reference out of bounds for array 'b', upper bound of dimension 1 exceeded (1 > 0) Julie also observed the bug with MS Visual Studio. See ticket http://icl.cs.utk.edu/trac/lapack-dev/ticket/46 The problem is the following. Sometimes in the RFP routines, we call routines like for example DGEMM ( M, N, K, ... A( I, J), ...) where M or N is 0 and A( I, J ) is out-of-bound. The rationale was since M or N is 0, DGEMM simply exits without doing anything, therefore the out-of-bound A(I,J) is not an issue. Well, this is not Fortran correct. In this commit, I have fix the problem for xTFSM. This is a fix. This is not rocket-science and one can certainly do something more elegant ... This bug is blocking Julie from porting on Windows so the matter was urgent. Now RFP + ( gfortan -fbounds-check ) works fine. TODO: find a cleaner way to fix this, TODO: Unfortunately I believe there are other bugs like this one in other RFP routines, always when N=1. See for example xPFTRF. I do not understand why the TESTING with gfortran -fbounds-check do not trigger an error though ...
Diffstat (limited to 'SRC/stfsm.f')
-rw-r--r--SRC/stfsm.f70
1 files changed, 46 insertions, 24 deletions
diff --git a/SRC/stfsm.f b/SRC/stfsm.f
index 2ca36fb0..05ca537c 100644
--- a/SRC/stfsm.f
+++ b/SRC/stfsm.f
@@ -322,24 +322,34 @@
* SIDE ='L', N is odd, TRANSR = 'N', UPLO = 'L', and
* TRANS = 'N'
*
- CALL STRSM( 'L', 'L', 'N', DIAG, M1, N, ALPHA,
- + A( 0 ), M, B, LDB )
- CALL SGEMM( 'N', 'N', M2, N, M1, -ONE, A( M1 ), M,
- + B, LDB, ALPHA, B( M1, 0 ), LDB )
- CALL STRSM( 'L', 'U', 'T', DIAG, M2, N, ONE,
- + A( M ), M, B( M1, 0 ), LDB )
+ IF( M.EQ.1 ) THEN
+ CALL STRSM( 'L', 'L', 'N', DIAG, M1, N, ALPHA,
+ + A, M, B, LDB )
+ ELSE
+ CALL STRSM( 'L', 'L', 'N', DIAG, M1, N, ALPHA,
+ + A( 0 ), M, B, LDB )
+ CALL SGEMM( 'N', 'N', M2, N, M1, -ONE, A( M1 ),
+ + M, B, LDB, ALPHA, B( M1, 0 ), LDB )
+ CALL STRSM( 'L', 'U', 'T', DIAG, M2, N, ONE,
+ + A( M ), M, B( M1, 0 ), LDB )
+ END IF
*
ELSE
*
* SIDE ='L', N is odd, TRANSR = 'N', UPLO = 'L', and
* TRANS = 'T'
*
- CALL STRSM( 'L', 'U', 'N', DIAG, M2, N, ALPHA,
- + A( M ), M, B( M1, 0 ), LDB )
- CALL SGEMM( 'T', 'N', M1, N, M2, -ONE, A( M1 ), M,
- + B( M1, 0 ), LDB, ALPHA, B, LDB )
- CALL STRSM( 'L', 'L', 'T', DIAG, M1, N, ONE,
- + A( 0 ), M, B, LDB )
+ IF( M.EQ.1 ) THEN
+ CALL STRSM( 'L', 'L', 'T', DIAG, M1, N, ALPHA,
+ + A( 0 ), M, B, LDB )
+ ELSE
+ CALL STRSM( 'L', 'U', 'N', DIAG, M2, N, ALPHA,
+ + A( M ), M, B( M1, 0 ), LDB )
+ CALL SGEMM( 'T', 'N', M1, N, M2, -ONE, A( M1 ), M,
+ + M, B( M1, 0 ), LDB, ALPHA, B, LDB )
+ CALL STRSM( 'L', 'L', 'T', DIAG, M1, N, ONE,
+ + A( 0 ), M, B, LDB )
+ END IF
*
END IF
*
@@ -388,24 +398,36 @@
* SIDE ='L', N is odd, TRANSR = 'T', UPLO = 'L', and
* TRANS = 'N'
*
- CALL STRSM( 'L', 'U', 'T', DIAG, M1, N, ALPHA,
- + A( 0 ), M1, B, LDB )
- CALL SGEMM( 'T', 'N', M2, N, M1, -ONE, A( M1*M1 ),
- + M1, B, LDB, ALPHA, B( M1, 0 ), LDB )
- CALL STRSM( 'L', 'L', 'N', DIAG, M2, N, ONE,
- + A( 1 ), M1, B( M1, 0 ), LDB )
+ IF( M.EQ.1 ) THEN
+ CALL STRSM( 'L', 'U', 'T', DIAG, M1, N, ALPHA,
+ + A( 0 ), M1, B, LDB )
+ ELSE
+ CALL STRSM( 'L', 'U', 'T', DIAG, M1, N, ALPHA,
+ + A( 0 ), M1, B, LDB )
+ CALL SGEMM( 'T', 'N', M2, N, M1, -ONE,
+ + A( M1*M1 ), M1, B, LDB, ALPHA,
+ + B( M1, 0 ), LDB )
+ CALL STRSM( 'L', 'L', 'N', DIAG, M2, N, ONE,
+ + A( 1 ), M1, B( M1, 0 ), LDB )
+ END IF
*
ELSE
*
* SIDE ='L', N is odd, TRANSR = 'T', UPLO = 'L', and
* TRANS = 'T'
*
- CALL STRSM( 'L', 'L', 'T', DIAG, M2, N, ALPHA,
- + A( 1 ), M1, B( M1, 0 ), LDB )
- CALL SGEMM( 'N', 'N', M1, N, M2, -ONE, A( M1*M1 ),
- + M1, B( M1, 0 ), LDB, ALPHA, B, LDB )
- CALL STRSM( 'L', 'U', 'N', DIAG, M1, N, ONE,
- + A( 0 ), M1, B, LDB )
+ IF( M.EQ.1 ) THEN
+ CALL STRSM( 'L', 'U', 'N', DIAG, M1, N, ALPHA,
+ + A( 0 ), M1, B, LDB )
+ ELSE
+ CALL STRSM( 'L', 'L', 'T', DIAG, M2, N, ALPHA,
+ + A( 1 ), M1, B( M1, 0 ), LDB )
+ CALL SGEMM( 'N', 'N', M1, N, M2, -ONE,
+ + A( M1*M1 ), M1, B( M1, 0 ), LDB,
+ + ALPHA, B, LDB )
+ CALL STRSM( 'L', 'U', 'N', DIAG, M1, N, ONE,
+ + A( 0 ), M1, B, LDB )
+ END IF
*
END IF
*