@@ -137,6 +137,7 @@ REAL FUNCTION CLANHB( NORM, UPLO, N, K, AB, LDAB,
137137* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
138138* December 2016
139139*
140+ IMPLICIT NONE
140141* .. Scalar Arguments ..
141142 CHARACTER NORM, UPLO
142143 INTEGER K, LDAB, N
@@ -154,14 +155,17 @@ REAL FUNCTION CLANHB( NORM, UPLO, N, K, AB, LDAB,
154155* ..
155156* .. Local Scalars ..
156157 INTEGER I, J, L
157- REAL ABSA, SCALE, SUM, VALUE
158+ REAL ABSA, SUM, VALUE
159+ * ..
160+ * .. Local Arrays ..
161+ REAL SSQ( 2 ), COLSSQ( 2 )
158162* ..
159163* .. External Functions ..
160164 LOGICAL LSAME, SISNAN
161165 EXTERNAL LSAME, SISNAN
162166* ..
163167* .. External Subroutines ..
164- EXTERNAL CLASSQ
168+ EXTERNAL CLASSQ, SCOMBSSQ
165169* ..
166170* .. Intrinsic Functions ..
167171 INTRINSIC ABS, MAX, MIN, REAL , SQRT
@@ -233,39 +237,57 @@ REAL FUNCTION CLANHB( NORM, UPLO, N, K, AB, LDAB,
233237 ELSE IF ( ( LSAME( NORM, ' F' ) ) .OR. ( LSAME( NORM, ' E' ) ) ) THEN
234238*
235239* Find normF(A).
240+ * SSQ(1) is scale
241+ * SSQ(2) is sum-of-squares
242+ * For better accuracy, sum each column separately.
243+ *
244+ SSQ( 1 ) = ZERO
245+ SSQ( 2 ) = ONE
246+ *
247+ * Sum off-diagonals
236248*
237- SCALE = ZERO
238- SUM = ONE
239249 IF ( K.GT. 0 ) THEN
240250 IF ( LSAME( UPLO, ' U' ) ) THEN
241251 DO 110 J = 2 , N
252+ COLSSQ( 1 ) = ZERO
253+ COLSSQ( 2 ) = ONE
242254 CALL CLASSQ( MIN ( J-1 , K ), AB( MAX ( K+2 - J, 1 ), J ),
243- $ 1 , SCALE, SUM )
255+ $ 1 , COLSSQ( 1 ), COLSSQ( 2 ) )
256+ CALL SCOMBSSQ( SSQ, COLSSQ )
244257 110 CONTINUE
245258 L = K + 1
246259 ELSE
247260 DO 120 J = 1 , N - 1
248- CALL CLASSQ( MIN ( N- J, K ), AB( 2 , J ), 1 , SCALE,
249- $ SUM )
261+ COLSSQ( 1 ) = ZERO
262+ COLSSQ( 2 ) = ONE
263+ CALL CLASSQ( MIN ( N- J, K ), AB( 2 , J ), 1 ,
264+ $ COLSSQ( 1 ), COLSSQ( 2 ) )
265+ CALL SCOMBSSQ( SSQ, COLSSQ )
250266 120 CONTINUE
251267 L = 1
252268 END IF
253- SUM = 2 * SUM
269+ SSQ( 2 ) = 2 * SSQ( 2 )
254270 ELSE
255271 L = 1
256272 END IF
273+ *
274+ * Sum diagonal
275+ *
276+ COLSSQ( 1 ) = ZERO
277+ COLSSQ( 2 ) = ONE
257278 DO 130 J = 1 , N
258279 IF ( REAL ( AB( L, J ) ).NE. ZERO ) THEN
259280 ABSA = ABS ( REAL ( AB( L, J ) ) )
260- IF ( SCALE .LT. ABSA ) THEN
261- SUM = ONE + SUM * ( SCALE / ABSA )** 2
262- SCALE = ABSA
281+ IF ( COLSSQ( 1 ) .LT. ABSA ) THEN
282+ COLSSQ( 2 ) = ONE + COLSSQ( 2 ) * ( COLSSQ( 1 ) / ABSA )** 2
283+ COLSSQ( 1 ) = ABSA
263284 ELSE
264- SUM = SUM + ( ABSA / SCALE )** 2
285+ COLSSQ( 2 ) = COLSSQ( 2 ) + ( ABSA / COLSSQ( 1 ) )** 2
265286 END IF
266287 END IF
267288 130 CONTINUE
268- VALUE = SCALE* SQRT ( SUM )
289+ CALL SCOMBSSQ( SSQ, COLSSQ )
290+ VALUE = SSQ( 1 )* SQRT ( SSQ( 2 ) )
269291 END IF
270292*
271293 CLANHB = VALUE
0 commit comments