LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ sorhr_col02()

subroutine sorhr_col02 ( integer  m,
integer  n,
integer  mb1,
integer  nb1,
integer  nb2,
real, dimension(6)  result 
)

SORHR_COL02

Purpose:
 SORHR_COL02 tests SORGTSQR_ROW and SORHR_COL inside SGETSQRHRT
 (which calls SLATSQR, SORGTSQR_ROW and SORHR_COL) using SGEMQRT.
 Therefore, SLATSQR (part of SGEQR), SGEMQRT (part of SGEMQR)
 have to be tested before this test.
Parameters
[in]M
          M is INTEGER
          Number of rows in test matrix.
[in]N
          N is INTEGER
          Number of columns in test matrix.
[in]MB1
          MB1 is INTEGER
          Number of row in row block in an input test matrix.
[in]NB1
          NB1 is INTEGER
          Number of columns in column block an input test matrix.
[in]NB2
          NB2 is INTEGER
          Number of columns in column block in an output test matrix.
[out]RESULT
          RESULT is REAL array, dimension (6)
          Results of each of the six tests below.

            A is a m-by-n test input matrix to be factored.
            so that A = Q_gr * ( R )
                               ( 0 ),

            Q_qr is an implicit m-by-m orthogonal Q matrix, the result
            of factorization in blocked WY-representation,
            stored in SGEQRT output format.

            R is a n-by-n upper-triangular matrix,

            0 is a (m-n)-by-n zero matrix,

            Q is an explicit m-by-m orthogonal matrix Q = Q_gr * I

            C is an m-by-n random matrix,

            D is an n-by-m random matrix.

          The six tests are:

          RESULT(1) = |R - (Q**H) * A| / ( eps * m * |A| )
            is equivalent to test for | A - Q * R | / (eps * m * |A|),

          RESULT(2) = |I - (Q**H) * Q| / ( eps * m ),

          RESULT(3) = | Q_qr * C - Q * C | / (eps * m * |C|),

          RESULT(4) = | (Q_gr**H) * C - (Q**H) * C | / (eps * m * |C|)

          RESULT(5) = | D * Q_qr - D * Q | / (eps * m * |D|)

          RESULT(6) = | D * (Q_qr**H) - D * (Q**H) | / (eps * m * |D|),

          where:
            Q_qr * C, (Q_gr**H) * C, D * Q_qr, D * (Q_qr**H) are
            computed using SGEMQRT,

            Q * C, (Q**H) * C, D * Q, D * (Q**H)  are
            computed using SGEMM.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 119 of file sorhr_col02.f.

120 IMPLICIT NONE
121*
122* -- LAPACK test routine --
123* -- LAPACK is a software package provided by Univ. of Tennessee, --
124* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
125*
126* .. Scalar Arguments ..
127 INTEGER M, N, MB1, NB1, NB2
128* .. Return values ..
129 REAL RESULT(6)
130*
131* =====================================================================
132*
133* ..
134* .. Local allocatable arrays
135 REAL , ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:),
136 $ RWORK(:), WORK( : ), T1(:,:), T2(:,:), DIAG(:),
137 $ C(:,:), CF(:,:), D(:,:), DF(:,:)
138*
139* .. Parameters ..
140 REAL ONE, ZERO
141 parameter( zero = 0.0e+0, one = 1.0e+0 )
142* ..
143* .. Local Scalars ..
144 LOGICAL TESTZEROS
145 INTEGER INFO, J, K, L, LWORK, NB2_UB, NRB
146 REAL ANORM, EPS, RESID, CNORM, DNORM
147* ..
148* .. Local Arrays ..
149 INTEGER ISEED( 4 )
150 REAL WORKQUERY( 1 )
151* ..
152* .. External Functions ..
153 REAL SLAMCH, SLANGE, SLANSY
154 EXTERNAL slamch, slange, slansy
155* ..
156* .. External Subroutines ..
157 EXTERNAL slacpy, slarnv, slaset, sgetsqrhrt,
159* ..
160* .. Intrinsic Functions ..
161 INTRINSIC ceiling, real, max, min
162* ..
163* .. Scalars in Common ..
164 CHARACTER(LEN=32) SRNAMT
165* ..
166* .. Common blocks ..
167 COMMON / srmnamc / srnamt
168* ..
169* .. Data statements ..
170 DATA iseed / 1988, 1989, 1990, 1991 /
171*
172* TEST MATRICES WITH HALF OF MATRIX BEING ZEROS
173*
174 testzeros = .false.
175*
176 eps = slamch( 'Epsilon' )
177 k = min( m, n )
178 l = max( m, n, 1)
179*
180* Dynamically allocate local arrays
181*
182 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
183 $ c(m,n), cf(m,n),
184 $ d(n,m), df(n,m) )
185*
186* Put random numbers into A and copy to AF
187*
188 DO j = 1, n
189 CALL slarnv( 2, iseed, m, a( 1, j ) )
190 END DO
191 IF( testzeros ) THEN
192 IF( m.GE.4 ) THEN
193 DO j = 1, n
194 CALL slarnv( 2, iseed, m/2, a( m/4, j ) )
195 END DO
196 END IF
197 END IF
198 CALL slacpy( 'Full', m, n, a, m, af, m )
199*
200* Number of row blocks in SLATSQR
201*
202 nrb = max( 1, ceiling( real( m - n ) / real( mb1 - n ) ) )
203*
204 ALLOCATE ( t1( nb1, n * nrb ) )
205 ALLOCATE ( t2( nb2, n ) )
206 ALLOCATE ( diag( n ) )
207*
208* Begin determine LWORK for the array WORK and allocate memory.
209*
210* SGEMQRT requires NB2 to be bounded by N.
211*
212 nb2_ub = min( nb2, n)
213*
214 CALL sgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
215 $ workquery, -1, info )
216*
217 lwork = int( workquery( 1 ) )
218*
219* In SGEMQRT, WORK is N*NB2_UB if SIDE = 'L',
220* or M*NB2_UB if SIDE = 'R'.
221*
222 lwork = max( lwork, nb2_ub * n, nb2_ub * m )
223*
224 ALLOCATE ( work( lwork ) )
225*
226* End allocate memory for WORK.
227*
228*
229* Begin Householder reconstruction routines
230*
231* Factor the matrix A in the array AF.
232*
233 srnamt = 'SGETSQRHRT'
234 CALL sgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
235 $ work, lwork, info )
236*
237* End Householder reconstruction routines.
238*
239*
240* Generate the m-by-m matrix Q
241*
242 CALL slaset( 'Full', m, m, zero, one, q, m )
243*
244 srnamt = 'SGEMQRT'
245 CALL sgemqrt( 'L', 'N', m, m, k, nb2_ub, af, m, t2, nb2, q, m,
246 $ work, info )
247*
248* Copy R
249*
250 CALL slaset( 'Full', m, n, zero, zero, r, m )
251*
252 CALL slacpy( 'Upper', m, n, af, m, r, m )
253*
254* TEST 1
255* Compute |R - (Q**T)*A| / ( eps * m * |A| ) and store in RESULT(1)
256*
257 CALL sgemm( 'T', 'N', m, n, m, -one, q, m, a, m, one, r, m )
258*
259 anorm = slange( '1', m, n, a, m, rwork )
260 resid = slange( '1', m, n, r, m, rwork )
261 IF( anorm.GT.zero ) THEN
262 result( 1 ) = resid / ( eps * max( 1, m ) * anorm )
263 ELSE
264 result( 1 ) = zero
265 END IF
266*
267* TEST 2
268* Compute |I - (Q**T)*Q| / ( eps * m ) and store in RESULT(2)
269*
270 CALL slaset( 'Full', m, m, zero, one, r, m )
271 CALL ssyrk( 'U', 'T', m, m, -one, q, m, one, r, m )
272 resid = slansy( '1', 'Upper', m, r, m, rwork )
273 result( 2 ) = resid / ( eps * max( 1, m ) )
274*
275* Generate random m-by-n matrix C
276*
277 DO j = 1, n
278 CALL slarnv( 2, iseed, m, c( 1, j ) )
279 END DO
280 cnorm = slange( '1', m, n, c, m, rwork )
281 CALL slacpy( 'Full', m, n, c, m, cf, m )
282*
283* Apply Q to C as Q*C = CF
284*
285 srnamt = 'SGEMQRT'
286 CALL sgemqrt( 'L', 'N', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
287 $ work, info )
288*
289* TEST 3
290* Compute |CF - Q*C| / ( eps * m * |C| )
291*
292 CALL sgemm( 'N', 'N', m, n, m, -one, q, m, c, m, one, cf, m )
293 resid = slange( '1', m, n, cf, m, rwork )
294 IF( cnorm.GT.zero ) THEN
295 result( 3 ) = resid / ( eps * max( 1, m ) * cnorm )
296 ELSE
297 result( 3 ) = zero
298 END IF
299*
300* Copy C into CF again
301*
302 CALL slacpy( 'Full', m, n, c, m, cf, m )
303*
304* Apply Q to C as (Q**T)*C = CF
305*
306 srnamt = 'SGEMQRT'
307 CALL sgemqrt( 'L', 'T', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
308 $ work, info )
309*
310* TEST 4
311* Compute |CF - (Q**T)*C| / ( eps * m * |C|)
312*
313 CALL sgemm( 'T', 'N', m, n, m, -one, q, m, c, m, one, cf, m )
314 resid = slange( '1', m, n, cf, m, rwork )
315 IF( cnorm.GT.zero ) THEN
316 result( 4 ) = resid / ( eps * max( 1, m ) * cnorm )
317 ELSE
318 result( 4 ) = zero
319 END IF
320*
321* Generate random n-by-m matrix D and a copy DF
322*
323 DO j = 1, m
324 CALL slarnv( 2, iseed, n, d( 1, j ) )
325 END DO
326 dnorm = slange( '1', n, m, d, n, rwork )
327 CALL slacpy( 'Full', n, m, d, n, df, n )
328*
329* Apply Q to D as D*Q = DF
330*
331 srnamt = 'SGEMQRT'
332 CALL sgemqrt( 'R', 'N', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
333 $ work, info )
334*
335* TEST 5
336* Compute |DF - D*Q| / ( eps * m * |D| )
337*
338 CALL sgemm( 'N', 'N', n, m, m, -one, d, n, q, m, one, df, n )
339 resid = slange( '1', n, m, df, n, rwork )
340 IF( dnorm.GT.zero ) THEN
341 result( 5 ) = resid / ( eps * max( 1, m ) * dnorm )
342 ELSE
343 result( 5 ) = zero
344 END IF
345*
346* Copy D into DF again
347*
348 CALL slacpy( 'Full', n, m, d, n, df, n )
349*
350* Apply Q to D as D*QT = DF
351*
352 srnamt = 'SGEMQRT'
353 CALL sgemqrt( 'R', 'T', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
354 $ work, info )
355*
356* TEST 6
357* Compute |DF - D*(Q**T)| / ( eps * m * |D| )
358*
359 CALL sgemm( 'N', 'T', n, m, m, -one, d, n, q, m, one, df, n )
360 resid = slange( '1', n, m, df, n, rwork )
361 IF( dnorm.GT.zero ) THEN
362 result( 6 ) = resid / ( eps * max( 1, m ) * dnorm )
363 ELSE
364 result( 6 ) = zero
365 END IF
366*
367* Deallocate all arrays
368*
369 DEALLOCATE ( a, af, q, r, rwork, work, t1, t2, diag,
370 $ c, d, cf, df )
371*
372 RETURN
373*
374* End of SORHR_COL02
375*
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
Definition sgemm.f:188
subroutine sgemqrt(side, trans, m, n, k, nb, v, ldv, t, ldt, c, ldc, work, info)
SGEMQRT
Definition sgemqrt.f:168
subroutine sgetsqrhrt(m, n, mb1, nb1, nb2, a, lda, t, ldt, work, lwork, info)
SGETSQRHRT
Definition sgetsqrhrt.f:179
subroutine ssyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
SSYRK
Definition ssyrk.f:169
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
Definition slacpy.f:103
real function slamch(cmach)
SLAMCH
Definition slamch.f:68
real function slange(norm, m, n, a, lda, work)
SLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
Definition slange.f:114
real function slansy(norm, uplo, n, a, lda, work)
SLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
Definition slansy.f:122
subroutine slarnv(idist, iseed, n, x)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
Definition slarnv.f:97
subroutine slaset(uplo, m, n, alpha, beta, a, lda)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
Definition slaset.f:110
subroutine sscal(n, sa, sx, incx)
SSCAL
Definition sscal.f:79
Here is the call graph for this function:
Here is the caller graph for this function: