@@ -169,18 +169,21 @@ SUBROUTINE DORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
169169* =====================================================================
170170*
171171* .. Parameters ..
172+ DOUBLE PRECISION REALZERO
173+ PARAMETER ( REALZERO = 0.0D0 )
172174 DOUBLE PRECISION ONE, ZERO
173175 PARAMETER ( ONE = 1.0D0 , ZERO = 0.0D0 )
174176* ..
175177* .. Local Scalars ..
176178 INTEGER CHILDINFO, I, J
179+ DOUBLE PRECISION EPS, NORM, SCL, SSQ
177180* ..
178181* .. External Subroutines ..
179- EXTERNAL DORBDB6, XERBLA
182+ EXTERNAL DLASSQ, DORBDB6, DSCAL , XERBLA
180183* ..
181184* .. External Functions ..
182- DOUBLE PRECISION DNRM2
183- EXTERNAL DNRM2
185+ DOUBLE PRECISION DLAMCH, DNRM2
186+ EXTERNAL DLAMCH, DNRM2
184187* ..
185188* .. Intrinsic Function ..
186189 INTRINSIC MAX
@@ -213,16 +216,33 @@ SUBROUTINE DORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
213216 RETURN
214217 END IF
215218*
216- * Project X onto the orthogonal complement of Q
219+ EPS = DLAMCH( ' Precision ' )
217220*
218- CALL DORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2,
219- $ WORK, LWORK, CHILDINFO )
221+ * Project X onto the orthogonal complement of Q if X is nonzero
220222*
221- * 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 )
222228*
223- IF ( DNRM2(M1,X1,INCX1) .NE. ZERO
224- $ .OR. DNRM2(M2,X2,INCX2) .NE. ZERO ) THEN
225- RETURN
229+ IF ( NORM .GT. N * EPS ) THEN
230+ * Scale vector to unit norm to avoid problems in the caller code.
231+ * Computing the reciprocal is undesirable but
232+ * * xLASCL cannot be used because of the vector increments and
233+ * * the round-off error has a negligible impact on
234+ * orthogonalization.
235+ CALL DSCAL( M1, ONE / NORM, X1, INCX1 )
236+ CALL DSCAL( M2, ONE / NORM, X2, INCX2 )
237+ CALL DORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
238+ $ LDQ2, WORK, LWORK, CHILDINFO )
239+ *
240+ * If the projection is nonzero, then return
241+ *
242+ IF ( DNRM2(M1,X1,INCX1) .NE. REALZERO
243+ $ .OR. DNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
244+ RETURN
245+ END IF
226246 END IF
227247*
228248* Project each standard basis vector e_1,...,e_M1 in turn, stopping
@@ -238,8 +258,8 @@ SUBROUTINE DORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
238258 END DO
239259 CALL DORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
240260 $ LDQ2, WORK, LWORK, CHILDINFO )
241- IF ( DNRM2(M1,X1,INCX1) .NE. ZERO
242- $ .OR. DNRM2(M2,X2,INCX2) .NE. ZERO ) THEN
261+ IF ( DNRM2(M1,X1,INCX1) .NE. REALZERO
262+ $ .OR. DNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
243263 RETURN
244264 END IF
245265 END DO
@@ -257,8 +277,8 @@ SUBROUTINE DORBDB5( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
257277 X2(I) = ONE
258278 CALL DORBDB6( M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2,
259279 $ LDQ2, WORK, LWORK, CHILDINFO )
260- IF ( DNRM2(M1,X1,INCX1) .NE. ZERO
261- $ .OR. DNRM2(M2,X2,INCX2) .NE. ZERO ) THEN
280+ IF ( DNRM2(M1,X1,INCX1) .NE. REALZERO
281+ $ .OR. DNRM2(M2,X2,INCX2) .NE. REALZERO ) THEN
262282 RETURN
263283 END IF
264284 END DO
0 commit comments