Skip to content

Commit 84e5ab0

Browse files
SORBDB6: fix indexing, set vectors to zero
This patch was authored by Brian D. Sutton and posted to the discussion of LAPACK pull request Reference-LAPACK#406. * fix indexing for vector increments different from one * always set vectors that are numerically zero to zero Previously SORBDB6 would only set vectors to zero if a second iteration of Gram-Schmidt was necessary. This would cause problems on the caller site if the test for a zero vector differed from the SORBDB6 test for zero.
1 parent e86cbeb commit 84e5ab0

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

SRC/sorbdb6.f

+28-14
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,13 @@ SUBROUTINE SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
167167
* =====================================================================
168168
*
169169
* .. Parameters ..
170-
REAL ALPHASQ, REALONE, REALZERO
171-
PARAMETER ( ALPHASQ = 0.01E0, REALONE = 1.0E0,
172-
$ REALZERO = 0.0E0 )
170+
REAL ALPHASQ, REALZERO
171+
PARAMETER ( ALPHASQ = 0.01E0, REALZERO = 0.0E0 )
173172
REAL NEGONE, ONE, ZERO
174173
PARAMETER ( NEGONE = -1.0E0, ONE = 1.0E0, ZERO = 0.0E0 )
175174
* ..
176175
* .. Local Scalars ..
177-
INTEGER I
176+
INTEGER I, IX
178177
REAL NORMSQ1, NORMSQ2, SCL1, SCL2, SSQ1, SSQ2
179178
* ..
180179
* .. External Subroutines ..
@@ -215,12 +214,21 @@ SUBROUTINE SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
215214
* space
216215
*
217216
SCL1 = REALZERO
218-
SSQ1 = REALONE
217+
SSQ1 = REALZERO
219218
CALL SLASSQ( M1, X1, INCX1, SCL1, SSQ1 )
220219
SCL2 = REALZERO
221-
SSQ2 = REALONE
220+
SSQ2 = REALZERO
222221
CALL SLASSQ( M2, X2, INCX2, SCL2, SSQ2 )
223222
NORMSQ1 = SCL1**2*SSQ1 + SCL2**2*SSQ2
223+
IF ( NORMSQ1 .EQ. 0 ) THEN
224+
DO IX = 1, 1 + (M1-1)*INCX1, INCX1
225+
X1( IX ) = ZERO
226+
END DO
227+
DO IX = 1, 1 + (M2-1)*INCX2, INCX2
228+
X2( IX ) = ZERO
229+
END DO
230+
RETURN
231+
END IF
224232
*
225233
IF( M1 .EQ. 0 ) THEN
226234
DO I = 1, N
@@ -239,10 +247,10 @@ SUBROUTINE SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
239247
$ INCX2 )
240248
*
241249
SCL1 = REALZERO
242-
SSQ1 = REALONE
250+
SSQ1 = REALZERO
243251
CALL SLASSQ( M1, X1, INCX1, SCL1, SSQ1 )
244252
SCL2 = REALZERO
245-
SSQ2 = REALONE
253+
SSQ2 = REALZERO
246254
CALL SLASSQ( M2, X2, INCX2, SCL2, SSQ2 )
247255
NORMSQ2 = SCL1**2*SSQ1 + SCL2**2*SSQ2
248256
*
@@ -255,6 +263,12 @@ SUBROUTINE SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
255263
END IF
256264
*
257265
IF( NORMSQ2 .EQ. ZERO ) THEN
266+
DO IX = 1, 1 + (M1-1)*INCX1, INCX1
267+
X1( IX ) = ZERO
268+
END DO
269+
DO IX = 1, 1 + (M2-1)*INCX2, INCX2
270+
X2( IX ) = ZERO
271+
END DO
258272
RETURN
259273
END IF
260274
*
@@ -281,10 +295,10 @@ SUBROUTINE SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
281295
$ INCX2 )
282296
*
283297
SCL1 = REALZERO
284-
SSQ1 = REALONE
298+
SSQ1 = REALZERO
285299
CALL SLASSQ( M1, X1, INCX1, SCL1, SSQ1 )
286300
SCL2 = REALZERO
287-
SSQ2 = REALONE
301+
SSQ2 = REALZERO
288302
CALL SLASSQ( M1, X1, INCX1, SCL1, SSQ1 )
289303
NORMSQ2 = SCL1**2*SSQ1 + SCL2**2*SSQ2
290304
*
@@ -293,11 +307,11 @@ SUBROUTINE SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
293307
* truncate it to zero.
294308
*
295309
IF( NORMSQ2 .LT. ALPHASQ*NORMSQ1 ) THEN
296-
DO I = 1, M1
297-
X1(I) = ZERO
310+
DO IX = 1, 1 + (M1-1)*INCX1, INCX1
311+
X1(IX) = ZERO
298312
END DO
299-
DO I = 1, M2
300-
X2(I) = ZERO
313+
DO IX = 1, 1 + (M2-1)*INCX2, INCX2
314+
X2(IX) = ZERO
301315
END DO
302316
END IF
303317
*

0 commit comments

Comments
 (0)