These are two fixes in [S,C,D,Z]-LAGGE.
authorlangou <langou@users.noreply.github.com>
Fri, 19 Jun 2015 02:56:27 +0000 (02:56 +0000)
committerlangou <langou@users.noreply.github.com>
Fri, 19 Jun 2015 02:56:27 +0000 (02:56 +0000)
(1) The routine was writing ZEROs out of bound in some specific cases. This is
corrected. Thanks to Yi Meng (CU Denver) for finding the bug.

(2) Quick exit when KL=KU=0 in this case, the user wants a diagonal matrix,
there is probably no reason to call this routine if one simply wants a diagonal
matrix, but that said we still ought to return a correct answer. A quick exit
makes the trick. The routine was not working otherwise.

TESTING/MATGEN/clagge.f
TESTING/MATGEN/dlagge.f
TESTING/MATGEN/slagge.f
TESTING/MATGEN/zlagge.f

index dade717990b942b7675e15e074e58cb30cf2e2ad..cc2a7cfd00fe9faee6fbf0eff1888bb9b3c711dd 100644 (file)
          A( I, I ) = D( I )
    30 CONTINUE
 *
+*     Quick exit if the user wants a diagonal matrix
+*
+      IF(( KL .EQ. 0 ).AND.( KU .EQ. 0)) RETURN
+*
 *     pre- and post-multiply A by random unitary matrices
 *
       DO 40 I = MIN( M, N ), 1, -1
             END IF
          END IF
 *
-         DO 50 J = KL + I + 1, M
-            A( J, I ) = ZERO
-   50    CONTINUE
+         IF (I .LE. N) THEN
+            DO 50 J = KL + I + 1, M
+               A( J, I ) = ZERO
+   50       CONTINUE
+         END IF
 *
-         DO 60 J = KU + I + 1, N
-            A( I, J ) = ZERO
-   60    CONTINUE
+         IF (I .LE. M) THEN
+            DO 60 J = KU + I + 1, N
+               A( I, J ) = ZERO
+   60       CONTINUE
+         END IF
    70 CONTINUE
       RETURN
 *
index 34d4800302997fccaf306f105fef961abe581693..fb86f79358f2cb6e8ffbb7955ca85fad4d13dd7e 100644 (file)
          A( I, I ) = D( I )
    30 CONTINUE
 *
+*     Quick exit if the user wants a diagonal matrix
+*
+      IF(( KL .EQ. 0 ).AND.( KU .EQ. 0)) RETURN
+*
 *     pre- and post-multiply A by random orthogonal matrices
 *
       DO 40 I = MIN( M, N ), 1, -1
             END IF
          END IF
 *
-         DO 50 J = KL + I + 1, M
-            A( J, I ) = ZERO
-   50    CONTINUE
+         IF (I .LE. N) THEN
+            DO 50 J = KL + I + 1, M
+               A( J, I ) = ZERO
+   50       CONTINUE
+         END IF
 *
-         DO 60 J = KU + I + 1, N
-            A( I, J ) = ZERO
-   60    CONTINUE
+         IF (I .LE. M) THEN
+            DO 60 J = KU + I + 1, N
+               A( I, J ) = ZERO
+   60       CONTINUE
+         END IF
    70 CONTINUE
       RETURN
 *
index 295311cceb98de030881f5f5ad73ea221e96c341..a7107c1a99a1f850b154481a57ae9809c901d714 100644 (file)
          A( I, I ) = D( I )
    30 CONTINUE
 *
+*     Quick exit if the user wants a diagonal matrix
+*
+      IF(( KL .EQ. 0 ).AND.( KU .EQ. 0)) RETURN
+*
 *     pre- and post-multiply A by random orthogonal matrices
 *
       DO 40 I = MIN( M, N ), 1, -1
             END IF
          END IF
 *
-         DO 50 J = KL + I + 1, M
-            A( J, I ) = ZERO
-   50    CONTINUE
+         IF (I .LE. N) THEN
+            DO 50 J = KL + I + 1, M
+               A( J, I ) = ZERO
+   50       CONTINUE
+         END IF
 *
-         DO 60 J = KU + I + 1, N
-            A( I, J ) = ZERO
-   60    CONTINUE
+         IF (I .LE. M) THEN
+            DO 60 J = KU + I + 1, N
+               A( I, J ) = ZERO
+   60       CONTINUE
+         END IF
    70 CONTINUE
       RETURN
 *
index da7d62722c3cdc5dbaacadde4abc001f25064abd..f87bd83eb2af4cd2fd6a7d7ad6ef4a8a6e8dc328 100644 (file)
          A( I, I ) = D( I )
    30 CONTINUE
 *
+*     Quick exit if the user wants a diagonal matrix
+*
+      IF(( KL .EQ. 0 ).AND.( KU .EQ. 0)) RETURN
+*
 *     pre- and post-multiply A by random unitary matrices
 *
       DO 40 I = MIN( M, N ), 1, -1
             END IF
          END IF
 *
-         DO 50 J = KL + I + 1, M
-            A( J, I ) = ZERO
-   50    CONTINUE
+         IF (I .LE. N) THEN
+            DO 50 J = KL + I + 1, M
+               A( J, I ) = ZERO
+   50       CONTINUE
+         END IF
 *
-         DO 60 J = KU + I + 1, N
-            A( I, J ) = ZERO
-   60    CONTINUE
+         IF (I .LE. M) THEN
+            DO 60 J = KU + I + 1, N
+               A( I, J ) = ZERO
+   60       CONTINUE
+         END IF
    70 CONTINUE
       RETURN
 *