Skip to content

Commit 7eb4057

Browse files
xORBDB5/xUNBDB5: detect numerically zero vectors
Do not call xORBDB6/xUNBDB6 with input vectors x that are numerically zero because this can cause problems at the call sites (xLARFGP computations might underflow) leading to, e.g., the computation of nonunitary matrices in the xORCSD2BY1/xUNCSD2BY1 output.
1 parent 80d7c69 commit 7eb4057

File tree

4 files changed

+84
-40
lines changed

4 files changed

+84
-40
lines changed

SRC/cunbdb5.f

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,14 @@ SUBROUTINE CUNBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
176176
* ..
177177
* .. Local Scalars ..
178178
INTEGER CHILDINFO, I, J
179+
REAL EPS, NORM, SCL, SSQ
179180
* ..
180181
* .. External Subroutines ..
181-
EXTERNAL CUNBDB6, XERBLA
182+
EXTERNAL CLASSQ, CUNBDB6, XERBLA
182183
* ..
183184
* .. External Functions ..
184-
REAL SCNRM2
185-
EXTERNAL SCNRM2
185+
REAL SLAMCH, SCNRM2
186+
EXTERNAL SLAMCH, SCNRM2
186187
* ..
187188
* .. Intrinsic Function ..
188189
INTRINSIC MAX
@@ -215,16 +216,26 @@ SUBROUTINE CUNBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
215216
RETURN
216217
END IF
217218
*
218-
* Project X onto the orthogonal complement of Q
219+
EPS = SLAMCH( 'Precision' )
219220
*
220-
CALL CUNBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2,
221-
$ WORK, LWORK, CHILDINFO )
221+
* Project X onto the orthogonal complement of Q if X is nonzero
222222
*
223-
* If the projection is nonzero, then return
223+
SCL = REALZERO
224+
SSQ = REALZERO
225+
CALL CLASSQ( M1, X1, INCX1, SCL, SSQ )
226+
CALL CLASSQ( M2, X2, INCX2, SCL, SSQ )
227+
NORM = SCL * SQRT( SSQ )
224228
*
225-
IF( SCNRM2(M1,X1,INCX1) .NE. REALZERO
226-
$ .OR. SCNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
227-
RETURN
229+
IF( NORM .GT. N * EPS ) THEN
230+
CALL CUNBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
231+
$ LDQ2, WORK, LWORK, CHILDINFO )
232+
*
233+
* If the projection is nonzero, then return
234+
*
235+
IF( SCNRM2(M1,X1,INCX1) .NE. REALZERO
236+
$ .OR. SCNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
237+
RETURN
238+
END IF
228239
END IF
229240
*
230241
* Project each standard basis vector e_1,...,e_M1 in turn, stopping

SRC/dorbdb5.f

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,14 @@ SUBROUTINE DORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
176176
* ..
177177
* .. Local Scalars ..
178178
INTEGER CHILDINFO, I, J
179+
DOUBLE PRECISION EPS, NORM, SCL, SSQ
179180
* ..
180181
* .. External Subroutines ..
181-
EXTERNAL DORBDB6, XERBLA
182+
EXTERNAL DLASSQ, DORBDB6, XERBLA
182183
* ..
183184
* .. External Functions ..
184-
DOUBLE PRECISION DNRM2
185-
EXTERNAL DNRM2
185+
DOUBLE PRECISION DLAMCH, DNRM2
186+
EXTERNAL DLAMCH, DNRM2
186187
* ..
187188
* .. Intrinsic Function ..
188189
INTRINSIC MAX
@@ -215,16 +216,26 @@ SUBROUTINE DORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
215216
RETURN
216217
END IF
217218
*
218-
* Project X onto the orthogonal complement of Q
219+
EPS = DLAMCH( 'Precision' )
219220
*
220-
CALL DORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2,
221-
$ WORK, LWORK, CHILDINFO )
221+
* Project X onto the orthogonal complement of Q if X is nonzero
222222
*
223-
* If the projection is nonzero, then return
223+
SCL = REALZERO
224+
SSQ = REALZERO
225+
CALL DLASSQ( M1, X1, INCX1, SCL, SSQ )
226+
CALL DLASSQ( M2, X2, INCX2, SCL, SSQ )
227+
NORM = SCL * SQRT( SSQ )
224228
*
225-
IF( DNRM2(M1,X1,INCX1) .NE. REALZERO
226-
$ .OR. DNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
227-
RETURN
229+
IF( NORM .GT. N * EPS ) THEN
230+
CALL DORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
231+
$ LDQ2, WORK, LWORK, CHILDINFO )
232+
*
233+
* If the projection is nonzero, then return
234+
*
235+
IF( DNRM2(M1,X1,INCX1) .NE. REALZERO
236+
$ .OR. DNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
237+
RETURN
238+
END IF
228239
END IF
229240
*
230241
* Project each standard basis vector e_1,...,e_M1 in turn, stopping

SRC/sorbdb5.f

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,14 @@ SUBROUTINE SORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
176176
* ..
177177
* .. Local Scalars ..
178178
INTEGER CHILDINFO, I, J
179+
REAL EPS, NORM, SCL, SSQ
179180
* ..
180181
* .. External Subroutines ..
181-
EXTERNAL SORBDB6, XERBLA
182+
EXTERNAL SLASSQ, SORBDB6, XERBLA
182183
* ..
183184
* .. External Functions ..
184-
REAL SNRM2
185-
EXTERNAL SNRM2
185+
REAL SLAMCH, SNRM2
186+
EXTERNAL SLAMCH, SNRM2
186187
* ..
187188
* .. Intrinsic Function ..
188189
INTRINSIC MAX
@@ -215,16 +216,26 @@ SUBROUTINE SORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
215216
RETURN
216217
END IF
217218
*
218-
* Project X onto the orthogonal complement of Q
219+
EPS = SLAMCH( 'Precision' )
219220
*
220-
CALL SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2,
221-
$ WORK, LWORK, CHILDINFO )
221+
* Project X onto the orthogonal complement of Q if X is nonzero
222222
*
223-
* If the projection is nonzero, then return
223+
SCL = REALZERO
224+
SSQ = REALZERO
225+
CALL SLASSQ( M1, X1, INCX1, SCL, SSQ )
226+
CALL SLASSQ( M2, X2, INCX2, SCL, SSQ )
227+
NORM = SCL * SQRT( SSQ )
224228
*
225-
IF( SNRM2(M1,X1,INCX1) .NE. REALZERO
226-
$ .OR. SNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
227-
RETURN
229+
IF( NORM .GT. N * EPS ) THEN
230+
CALL SORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
231+
$ LDQ2, WORK, LWORK, CHILDINFO )
232+
*
233+
* If the projection is nonzero, then return
234+
*
235+
IF( SNRM2(M1,X1,INCX1) .NE. REALZERO
236+
$ .OR. SNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
237+
RETURN
238+
END IF
228239
END IF
229240
*
230241
* Project each standard basis vector e_1,...,e_M1 in turn, stopping

SRC/zunbdb5.f

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,14 @@ SUBROUTINE ZUNBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
176176
* ..
177177
* .. Local Scalars ..
178178
INTEGER CHILDINFO, I, J
179+
DOUBLE PRECISION EPS, NORM, SCL, SSQ
179180
* ..
180181
* .. External Subroutines ..
181-
EXTERNAL ZUNBDB6, XERBLA
182+
EXTERNAL ZLASSQ, ZUNBDB6, XERBLA
182183
* ..
183184
* .. External Functions ..
184-
DOUBLE PRECISION DZNRM2
185-
EXTERNAL DZNRM2
185+
DOUBLE PRECISION DLAMCH, DZNRM2
186+
EXTERNAL DLAMCH, DZNRM2
186187
* ..
187188
* .. Intrinsic Function ..
188189
INTRINSIC MAX
@@ -215,16 +216,26 @@ SUBROUTINE ZUNBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
215216
RETURN
216217
END IF
217218
*
218-
* Project X onto the orthogonal complement of Q
219+
EPS = DLAMCH( 'Precision' )
219220
*
220-
CALL ZUNBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2,
221-
$ WORK, LWORK, CHILDINFO )
221+
* Project X onto the orthogonal complement of Q if X is nonzero
222222
*
223-
* If the projection is nonzero, then return
223+
SCL = REALZERO
224+
SSQ = REALZERO
225+
CALL ZLASSQ( M1, X1, INCX1, SCL, SSQ )
226+
CALL ZLASSQ( M2, X2, INCX2, SCL, SSQ )
227+
NORM = SCL * SQRT( SSQ )
224228
*
225-
IF( DZNRM2(M1,X1,INCX1) .NE. REALZERO
226-
$ .OR. DZNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
227-
RETURN
229+
IF( NORM .GT. N * EPS ) THEN
230+
CALL ZUNBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
231+
$ LDQ2, WORK, LWORK, CHILDINFO )
232+
*
233+
* If the projection is nonzero, then return
234+
*
235+
IF( DZNRM2(M1,X1,INCX1) .NE. REALZERO
236+
$ .OR. DZNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
237+
RETURN
238+
END IF
228239
END IF
229240
*
230241
* Project each standard basis vector e_1,...,e_M1 in turn, stopping

0 commit comments

Comments
 (0)