1       SUBROUTINE SCHKRQ( DOTYPE, NM, MVAL, NN, NVAL, NNB, NBVAL, NXVAL,
  2      $                   NRHS, THRESH, TSTERR, NMAX, A, AF, AQ, AR, AC,
  3      $                   B, X, XACT, TAU, WORK, RWORK, IWORK, NOUT )
  4 *
  5 *  -- LAPACK test routine (version 3.1) --
  6 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  7 *     June 2010
  8 *
  9 *     .. Scalar Arguments ..
 10       LOGICAL            TSTERR
 11       INTEGER            NM, NMAX, NN, NNB, NOUT, NRHS
 12       REAL               THRESH
 13 *     ..
 14 *     .. Array Arguments ..
 15       LOGICAL            DOTYPE( * )
 16       INTEGER            IWORK( * ), MVAL( * ), NBVAL( * ), NVAL( * ),
 17      $                   NXVAL( * )
 18       REAL               A( * ), AC( * ), AF( * ), AQ( * ), AR( * ),
 19      $                   B( * ), RWORK( * ), TAU( * ), WORK( * ),
 20      $                   X( * ), XACT( * )
 21 *     ..
 22 *
 23 *  Purpose
 24 *  =======
 25 *
 26 *  SCHKRQ tests SGERQF, SORGRQ and SORMRQ.
 27 *
 28 *  Arguments
 29 *  =========
 30 *
 31 *  DOTYPE  (input) LOGICAL array, dimension (NTYPES)
 32 *          The matrix types to be used for testing.  Matrices of type j
 33 *          (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
 34 *          .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
 35 *
 36 *  NM      (input) INTEGER
 37 *          The number of values of M contained in the vector MVAL.
 38 *
 39 *  MVAL    (input) INTEGER array, dimension (NM)
 40 *          The values of the matrix row dimension M.
 41 *
 42 *  NN      (input) INTEGER
 43 *          The number of values of N contained in the vector NVAL.
 44 *
 45 *  NVAL    (input) INTEGER array, dimension (NN)
 46 *          The values of the matrix column dimension N.
 47 *
 48 *  NNB     (input) INTEGER
 49 *          The number of values of NB and NX contained in the
 50 *          vectors NBVAL and NXVAL.  The blocking parameters are used
 51 *          in pairs (NB,NX).
 52 *
 53 *  NBVAL   (input) INTEGER array, dimension (NNB)
 54 *          The values of the blocksize NB.
 55 *
 56 *  NXVAL   (input) INTEGER array, dimension (NNB)
 57 *          The values of the crossover point NX.
 58 *
 59 *  NRHS    (input) INTEGER
 60 *          The number of right hand side vectors to be generated for
 61 *          each linear system.
 62 *
 63 *  THRESH  (input) REAL
 64 *          The threshold value for the test ratios.  A result is
 65 *          included in the output file if RESULT >= THRESH.  To have
 66 *          every test ratio printed, use THRESH = 0.
 67 *
 68 *  TSTERR  (input) LOGICAL
 69 *          Flag that indicates whether error exits are to be tested.
 70 *
 71 *  NMAX    (input) INTEGER
 72 *          The maximum value permitted for M or N, used in dimensioning
 73 *          the work arrays.
 74 *
 75 *  A       (workspace) REAL array, dimension (NMAX*NMAX)
 76 *
 77 *  AF      (workspace) REAL array, dimension (NMAX*NMAX)
 78 *
 79 *  AQ      (workspace) REAL array, dimension (NMAX*NMAX)
 80 *
 81 *  AR      (workspace) REAL array, dimension (NMAX*NMAX)
 82 *
 83 *  AC      (workspace) REAL array, dimension (NMAX*NMAX)
 84 *
 85 *  B       (workspace) REAL array, dimension (NMAX*NRHS)
 86 *
 87 *  X       (workspace) REAL array, dimension (NMAX*NRHS)
 88 *
 89 *  XACT    (workspace) REAL array, dimension (NMAX*NRHS)
 90 *
 91 *  TAU     (workspace) REAL array, dimension (NMAX)
 92 *
 93 *  WORK    (workspace) REAL array, dimension (NMAX*NMAX)
 94 *
 95 *  RWORK   (workspace) REAL array, dimension (NMAX)
 96 *
 97 *  IWORK   (workspace) INTEGER array, dimension (NMAX)
 98 *
 99 *  NOUT    (input) INTEGER
100 *          The unit number for output.
101 *
102 *  =====================================================================
103 *
104 *     .. Parameters ..
105       INTEGER            NTESTS
106       PARAMETER          ( NTESTS = 7 )
107       INTEGER            NTYPES
108       PARAMETER          ( NTYPES = 8 )
109       REAL               ZERO
110       PARAMETER          ( ZERO = 0.0E0 )
111 *     ..
112 *     .. Local Scalars ..
113       CHARACTER          DIST, TYPE
114       CHARACTER*3        PATH
115       INTEGER            I, IK, IM, IMAT, IN, INB, INFO, K, KL, KU, LDA,
116      $                   LWORK, M, MINMN, MODE, N, NB, NERRS, NFAIL, NK,
117      $                   NRUN, NT, NX
118       REAL               ANORM, CNDNUM
119 *     ..
120 *     .. Local Arrays ..
121       INTEGER            ISEED( 4 ), ISEEDY( 4 ), KVAL( 4 )
122       REAL               RESULT( NTESTS )
123 *     ..
124 *     .. External Subroutines ..
125       EXTERNAL           ALAERH, ALAHD, ALASUM, SERRRQ, SGERQS, SGET02,
126      $                   SLACPY, SLARHS, SLATB4, SLATMS, SRQT01, SRQT02,
127      $                   SRQT03, XLAENV
128 *     ..
129 *     .. Intrinsic Functions ..
130       INTRINSIC          MAXMIN
131 *     ..
132 *     .. Scalars in Common ..
133       LOGICAL            LERR, OK
134       CHARACTER*32       SRNAMT
135       INTEGER            INFOT, NUNIT
136 *     ..
137 *     .. Common blocks ..
138       COMMON             / INFOC / INFOT, NUNIT, OK, LERR
139       COMMON             / SRNAMC / SRNAMT
140 *     ..
141 *     .. Data statements ..
142       DATA               ISEEDY / 1988198919901991 /
143 *     ..
144 *     .. Executable Statements ..
145 *
146 *     Initialize constants and the random number seed.
147 *
148       PATH( 11 ) = 'Single precision'
149       PATH( 23 ) = 'RQ'
150       NRUN = 0
151       NFAIL = 0
152       NERRS = 0
153       DO 10 I = 14
154          ISEED( I ) = ISEEDY( I )
155    10 CONTINUE
156 *
157 *     Test the error exits
158 *
159       IF( TSTERR )
160      $   CALL SERRRQ( PATH, NOUT )
161       INFOT = 0
162       CALL XLAENV( 22 )
163 *
164       LDA = NMAX
165       LWORK = NMAX*MAX( NMAX, NRHS )
166 *
167 *     Do for each value of M in MVAL.
168 *
169       DO 70 IM = 1, NM
170          M = MVAL( IM )
171 *
172 *        Do for each value of N in NVAL.
173 *
174          DO 60 IN = 1, NN
175             N = NVAL( IN )
176             MINMN = MIN( M, N )
177             DO 50 IMAT = 1, NTYPES
178 *
179 *              Do the tests only if DOTYPE( IMAT ) is true.
180 *
181                IF.NOT.DOTYPE( IMAT ) )
182      $            GO TO 50
183 *
184 *              Set up parameters with SLATB4 and generate a test matrix
185 *              with SLATMS.
186 *
187                CALL SLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
188      $                      CNDNUM, DIST )
189 *
190                SRNAMT = 'SLATMS'
191                CALL SLATMS( M, N, DIST, ISEED, TYPE, RWORK, MODE,
192      $                      CNDNUM, ANORM, KL, KU, 'No packing', A, LDA,
193      $                      WORK, INFO )
194 *
195 *              Check error code from SLATMS.
196 *
197                IF( INFO.NE.0 ) THEN
198                   CALL ALAERH( PATH, 'SLATMS', INFO, 0' ', M, N, -1,
199      $                         -1-1, IMAT, NFAIL, NERRS, NOUT )
200                   GO TO 50
201                END IF
202 *
203 *              Set some values for K: the first value must be MINMN,
204 *              corresponding to the call of SRQT01; other values are
205 *              used in the calls of SRQT02, and must not exceed MINMN.
206 *
207                KVAL( 1 ) = MINMN
208                KVAL( 2 ) = 0
209                KVAL( 3 ) = 1
210                KVAL( 4 ) = MINMN / 2
211                IF( MINMN.EQ.0 ) THEN
212                   NK = 1
213                ELSE IF( MINMN.EQ.1 ) THEN
214                   NK = 2
215                ELSE IF( MINMN.LE.3 ) THEN
216                   NK = 3
217                ELSE
218                   NK = 4
219                END IF
220 *
221 *              Do for each value of K in KVAL
222 *
223                DO 40 IK = 1, NK
224                   K = KVAL( IK )
225 *
226 *                 Do for each pair of values (NB,NX) in NBVAL and NXVAL.
227 *
228                   DO 30 INB = 1, NNB
229                      NB = NBVAL( INB )
230                      CALL XLAENV( 1, NB )
231                      NX = NXVAL( INB )
232                      CALL XLAENV( 3, NX )
233                      DO I = 1, NTESTS
234                         RESULT( I ) = ZERO
235                      END DO
236                      NT = 2
237                      IF( IK.EQ.1 ) THEN
238 *
239 *                       Test SGERQF
240 *
241                         CALL SRQT01( M, N, A, AF, AQ, AR, LDA, TAU,
242      $                               WORK, LWORK, RWORK, RESULT1 ) )
243                      ELSE IF( M.LE.N ) THEN
244 *
245 *                       Test SORGRQ, using factorization
246 *                       returned by SRQT01
247 *
248                         CALL SRQT02( M, N, K, A, AF, AQ, AR, LDA, TAU,
249      $                               WORK, LWORK, RWORK, RESULT1 ) )
250                      END IF
251                      IF( M.GE.K ) THEN
252 *
253 *                       Test SORMRQ, using factorization returned
254 *                       by SRQT01
255 *
256                         CALL SRQT03( M, N, K, AF, AC, AR, AQ, LDA, TAU,
257      $                               WORK, LWORK, RWORK, RESULT3 ) )
258                         NT = NT + 4
259 *
260 *                       If M>=N and K=N, call SGERQS to solve a system
261 *                       with NRHS right hand sides and compute the
262 *                       residual.
263 *
264                         IF( K.EQ..AND. INB.EQ.1 ) THEN
265 *
266 *                          Generate a solution and set the right
267 *                          hand side.
268 *
269                            SRNAMT = 'SLARHS'
270                            CALL SLARHS( PATH, 'New''Full',
271      $                                  'No transpose', M, N, 00,
272      $                                  NRHS, A, LDA, XACT, LDA, B, LDA,
273      $                                  ISEED, INFO )
274 *
275                            CALL SLACPY( 'Full', M, NRHS, B, LDA,
276      $                                  X( N-M+1 ), LDA )
277                            SRNAMT = 'SGERQS'
278                            CALL SGERQS( M, N, NRHS, AF, LDA, TAU, X,
279      $                                  LDA, WORK, LWORK, INFO )
280 *
281 *                          Check error code from SGERQS.
282 *
283                            IF( INFO.NE.0 )
284      $                        CALL ALAERH( PATH, 'SGERQS', INFO, 0' ',
285      $                                     M, N, NRHS, -1, NB, IMAT,
286      $                                     NFAIL, NERRS, NOUT )
287 *
288                            CALL SGET02( 'No transpose', M, N, NRHS, A,
289      $                                  LDA, X, LDA, B, LDA, RWORK,
290      $                                  RESULT7 ) )
291                            NT = NT + 1
292                         END IF
293                      END IF
294 *
295 *                    Print information about the tests that did not
296 *                    pass the threshold.
297 *
298                      DO 20 I = 1, NTESTS
299                         IFRESULT( I ).GE.THRESH ) THEN
300                            IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
301      $                        CALL ALAHD( NOUT, PATH )
302                            WRITE( NOUT, FMT = 9999 )M, N, K, NB, NX,
303      $                        IMAT, I, RESULT( I )
304                            NFAIL = NFAIL + 1
305                         END IF
306    20                CONTINUE
307                      NRUN = NRUN + NT
308    30             CONTINUE
309    40          CONTINUE
310    50       CONTINUE
311    60    CONTINUE
312    70 CONTINUE
313 *
314 *     Print a summary of the results.
315 *
316       CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
317 *
318  9999 FORMAT' M=', I5, ', N=', I5, ', K=', I5, ', NB=', I4, ', NX=',
319      $      I5, ', type ', I2, ', test(', I2, ')='G12.5 )
320       RETURN
321 *
322 *     End of SCHKRQ
323 *
324       END