1       SUBROUTINE DLATM5( PRTYPE, M, N, A, LDA, B, LDB, C, LDC, D, LDD,
  2      $                   E, LDE, F, LDF, R, LDR, L, LDL, ALPHA, QBLCKA,
  3      $                   QBLCKB )
  4 *
  5 *  -- LAPACK test routine (version 3.1) --
  6 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  7 *     November 2006
  8 *
  9 *     .. Scalar Arguments ..
 10       INTEGER            LDA, LDB, LDC, LDD, LDE, LDF, LDL, LDR, M, N,
 11      $                   PRTYPE, QBLCKA, QBLCKB
 12       DOUBLE PRECISION   ALPHA
 13 *     ..
 14 *     .. Array Arguments ..
 15       DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * ),
 16      $                   D( LDD, * ), E( LDE, * ), F( LDF, * ),
 17      $                   L( LDL, * ), R( LDR, * )
 18 *     ..
 19 *
 20 *  Purpose
 21 *  =======
 22 *
 23 *  DLATM5 generates matrices involved in the Generalized Sylvester
 24 *  equation:
 25 *
 26 *      A * R - L * B = C
 27 *      D * R - L * E = F
 28 *
 29 *  They also satisfy (the diagonalization condition)
 30 *
 31 *   [ I -L ] ( [ A  -C ], [ D -F ] ) [ I  R ] = ( [ A    ], [ D    ] )
 32 *   [    I ] ( [     B ]  [    E ] ) [    I ]   ( [    B ]  [    E ] )
 33 *
 34 *
 35 *  Arguments
 36 *  =========
 37 *
 38 *  PRTYPE  (input) INTEGER
 39 *          "Points" to a certian type of the matrices to generate
 40 *          (see futher details).
 41 *
 42 *  M       (input) INTEGER
 43 *          Specifies the order of A and D and the number of rows in
 44 *          C, F,  R and L.
 45 *
 46 *  N       (input) INTEGER
 47 *          Specifies the order of B and E and the number of columns in
 48 *          C, F, R and L.
 49 *
 50 *  A       (output) DOUBLE PRECISION array, dimension (LDA, M).
 51 *          On exit A M-by-M is initialized according to PRTYPE.
 52 *
 53 *  LDA     (input) INTEGER
 54 *          The leading dimension of A.
 55 *
 56 *  B       (output) DOUBLE PRECISION array, dimension (LDB, N).
 57 *          On exit B N-by-N is initialized according to PRTYPE.
 58 *
 59 *  LDB     (input) INTEGER
 60 *          The leading dimension of B.
 61 *
 62 *  C       (output) DOUBLE PRECISION array, dimension (LDC, N).
 63 *          On exit C M-by-N is initialized according to PRTYPE.
 64 *
 65 *  LDC     (input) INTEGER
 66 *          The leading dimension of C.
 67 *
 68 *  D       (output) DOUBLE PRECISION array, dimension (LDD, M).
 69 *          On exit D M-by-M is initialized according to PRTYPE.
 70 *
 71 *  LDD     (input) INTEGER
 72 *          The leading dimension of D.
 73 *
 74 *  E       (output) DOUBLE PRECISION array, dimension (LDE, N).
 75 *          On exit E N-by-N is initialized according to PRTYPE.
 76 *
 77 *  LDE     (input) INTEGER
 78 *          The leading dimension of E.
 79 *
 80 *  F       (output) DOUBLE PRECISION array, dimension (LDF, N).
 81 *          On exit F M-by-N is initialized according to PRTYPE.
 82 *
 83 *  LDF     (input) INTEGER
 84 *          The leading dimension of F.
 85 *
 86 *  R       (output) DOUBLE PRECISION array, dimension (LDR, N).
 87 *          On exit R M-by-N is initialized according to PRTYPE.
 88 *
 89 *  LDR     (input) INTEGER
 90 *          The leading dimension of R.
 91 *
 92 *  L       (output) DOUBLE PRECISION array, dimension (LDL, N).
 93 *          On exit L M-by-N is initialized according to PRTYPE.
 94 *
 95 *  LDL     (input) INTEGER
 96 *          The leading dimension of L.
 97 *
 98 *  ALPHA   (input) DOUBLE PRECISION
 99 *          Parameter used in generating PRTYPE = 1 and 5 matrices.
100 *
101 *  QBLCKA  (input) INTEGER
102 *          When PRTYPE = 3, specifies the distance between 2-by-2
103 *          blocks on the diagonal in A. Otherwise, QBLCKA is not
104 *          referenced. QBLCKA > 1.
105 *
106 *  QBLCKB  (input) INTEGER
107 *          When PRTYPE = 3, specifies the distance between 2-by-2
108 *          blocks on the diagonal in B. Otherwise, QBLCKB is not
109 *          referenced. QBLCKB > 1.
110 *
111 *
112 *  Further Details
113 *  ===============
114 *
115 *  PRTYPE = 1: A and B are Jordan blocks, D and E are identity matrices
116 *
117 *             A : if (i == j) then A(i, j) = 1.0
118 *                 if (j == i + 1) then A(i, j) = -1.0
119 *                 else A(i, j) = 0.0,            i, j = 1...M
120 *
121 *             B : if (i == j) then B(i, j) = 1.0 - ALPHA
122 *                 if (j == i + 1) then B(i, j) = 1.0
123 *                 else B(i, j) = 0.0,            i, j = 1...N
124 *
125 *             D : if (i == j) then D(i, j) = 1.0
126 *                 else D(i, j) = 0.0,            i, j = 1...M
127 *
128 *             E : if (i == j) then E(i, j) = 1.0
129 *                 else E(i, j) = 0.0,            i, j = 1...N
130 *
131 *             L =  R are chosen from [-10...10],
132 *                  which specifies the right hand sides (C, F).
133 *
134 *  PRTYPE = 2 or 3: Triangular and/or quasi- triangular.
135 *
136 *             A : if (i <= j) then A(i, j) = [-1...1]
137 *                 else A(i, j) = 0.0,             i, j = 1...M
138 *
139 *                 if (PRTYPE = 3) then
140 *                    A(k + 1, k + 1) = A(k, k)
141 *                    A(k + 1, k) = [-1...1]
142 *                    sign(A(k, k + 1) = -(sin(A(k + 1, k))
143 *                        k = 1, M - 1, QBLCKA
144 *
145 *             B : if (i <= j) then B(i, j) = [-1...1]
146 *                 else B(i, j) = 0.0,            i, j = 1...N
147 *
148 *                 if (PRTYPE = 3) then
149 *                    B(k + 1, k + 1) = B(k, k)
150 *                    B(k + 1, k) = [-1...1]
151 *                    sign(B(k, k + 1) = -(sign(B(k + 1, k))
152 *                        k = 1, N - 1, QBLCKB
153 *
154 *             D : if (i <= j) then D(i, j) = [-1...1].
155 *                 else D(i, j) = 0.0,            i, j = 1...M
156 *
157 *
158 *             E : if (i <= j) then D(i, j) = [-1...1]
159 *                 else E(i, j) = 0.0,            i, j = 1...N
160 *
161 *                 L, R are chosen from [-10...10],
162 *                 which specifies the right hand sides (C, F).
163 *
164 *  PRTYPE = 4 Full
165 *             A(i, j) = [-10...10]
166 *             D(i, j) = [-1...1]    i,j = 1...M
167 *             B(i, j) = [-10...10]
168 *             E(i, j) = [-1...1]    i,j = 1...N
169 *             R(i, j) = [-10...10]
170 *             L(i, j) = [-1...1]    i = 1..M ,j = 1...N
171 *
172 *             L, R specifies the right hand sides (C, F).
173 *
174 *  PRTYPE = 5 special case common and/or close eigs.
175 *
176 *  =====================================================================
177 *
178 *     .. Parameters ..
179       DOUBLE PRECISION   ONE, ZERO, TWENTY, HALF, TWO
180       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0, TWENTY = 2.0D+1,
181      $                   HALF = 0.5D+0, TWO = 2.0D+0 )
182 *     ..
183 *     .. Local Scalars ..
184       INTEGER            I, J, K
185       DOUBLE PRECISION   IMEPS, REEPS
186 *     ..
187 *     .. Intrinsic Functions ..
188       INTRINSIC          DBLEMODSIN
189 *     ..
190 *     .. External Subroutines ..
191       EXTERNAL           DGEMM
192 *     ..
193 *     .. Executable Statements ..
194 *
195       IF( PRTYPE.EQ.1 ) THEN
196          DO 20 I = 1, M
197             DO 10 J = 1, M
198                IF( I.EQ.J ) THEN
199                   A( I, J ) = ONE
200                   D( I, J ) = ONE
201                ELSE IF( I.EQ.J-1 ) THEN
202                   A( I, J ) = -ONE
203                   D( I, J ) = ZERO
204                ELSE
205                   A( I, J ) = ZERO
206                   D( I, J ) = ZERO
207                END IF
208    10       CONTINUE
209    20    CONTINUE
210 *
211          DO 40 I = 1, N
212             DO 30 J = 1, N
213                IF( I.EQ.J ) THEN
214                   B( I, J ) = ONE - ALPHA
215                   E( I, J ) = ONE
216                ELSE IF( I.EQ.J-1 ) THEN
217                   B( I, J ) = ONE
218                   E( I, J ) = ZERO
219                ELSE
220                   B( I, J ) = ZERO
221                   E( I, J ) = ZERO
222                END IF
223    30       CONTINUE
224    40    CONTINUE
225 *
226          DO 60 I = 1, M
227             DO 50 J = 1, N
228                R( I, J ) = ( HALF-SINDBLE( I / J ) ) )*TWENTY
229                L( I, J ) = R( I, J )
230    50       CONTINUE
231    60    CONTINUE
232 *
233       ELSE IF( PRTYPE.EQ.2 .OR. PRTYPE.EQ.3 ) THEN
234          DO 80 I = 1, M
235             DO 70 J = 1, M
236                IF( I.LE.J ) THEN
237                   A( I, J ) = ( HALF-SINDBLE( I ) ) )*TWO
238                   D( I, J ) = ( HALF-SINDBLE( I*J ) ) )*TWO
239                ELSE
240                   A( I, J ) = ZERO
241                   D( I, J ) = ZERO
242                END IF
243    70       CONTINUE
244    80    CONTINUE
245 *
246          DO 100 I = 1, N
247             DO 90 J = 1, N
248                IF( I.LE.J ) THEN
249                   B( I, J ) = ( HALF-SINDBLE( I+J ) ) )*TWO
250                   E( I, J ) = ( HALF-SINDBLE( J ) ) )*TWO
251                ELSE
252                   B( I, J ) = ZERO
253                   E( I, J ) = ZERO
254                END IF
255    90       CONTINUE
256   100    CONTINUE
257 *
258          DO 120 I = 1, M
259             DO 110 J = 1, N
260                R( I, J ) = ( HALF-SINDBLE( I*J ) ) )*TWENTY
261                L( I, J ) = ( HALF-SINDBLE( I+J ) ) )*TWENTY
262   110       CONTINUE
263   120    CONTINUE
264 *
265          IF( PRTYPE.EQ.3 ) THEN
266             IF( QBLCKA.LE.1 )
267      $         QBLCKA = 2
268             DO 130 K = 1, M - 1, QBLCKA
269                A( K+1, K+1 ) = A( K, K )
270                A( K+1, K ) = -SIN( A( K, K+1 ) )
271   130       CONTINUE
272 *
273             IF( QBLCKB.LE.1 )
274      $         QBLCKB = 2
275             DO 140 K = 1, N - 1, QBLCKB
276                B( K+1, K+1 ) = B( K, K )
277                B( K+1, K ) = -SIN( B( K, K+1 ) )
278   140       CONTINUE
279          END IF
280 *
281       ELSE IF( PRTYPE.EQ.4 ) THEN
282          DO 160 I = 1, M
283             DO 150 J = 1, M
284                A( I, J ) = ( HALF-SINDBLE( I*J ) ) )*TWENTY
285                D( I, J ) = ( HALF-SINDBLE( I+J ) ) )*TWO
286   150       CONTINUE
287   160    CONTINUE
288 *
289          DO 180 I = 1, N
290             DO 170 J = 1, N
291                B( I, J ) = ( HALF-SINDBLE( I+J ) ) )*TWENTY
292                E( I, J ) = ( HALF-SINDBLE( I*J ) ) )*TWO
293   170       CONTINUE
294   180    CONTINUE
295 *
296          DO 200 I = 1, M
297             DO 190 J = 1, N
298                R( I, J ) = ( HALF-SINDBLE( J / I ) ) )*TWENTY
299                L( I, J ) = ( HALF-SINDBLE( I*J ) ) )*TWO
300   190       CONTINUE
301   200    CONTINUE
302 *
303       ELSE IF( PRTYPE.GE.5 ) THEN
304          REEPS = HALF*TWO*TWENTY / ALPHA
305          IMEPS = ( HALF-TWO ) / ALPHA
306          DO 220 I = 1, M
307             DO 210 J = 1, N
308                R( I, J ) = ( HALF-SINDBLE( I*J ) ) )*ALPHA / TWENTY
309                L( I, J ) = ( HALF-SINDBLE( I+J ) ) )*ALPHA / TWENTY
310   210       CONTINUE
311   220    CONTINUE
312 *
313          DO 230 I = 1, M
314             D( I, I ) = ONE
315   230    CONTINUE
316 *
317          DO 240 I = 1, M
318             IF( I.LE.4 ) THEN
319                A( I, I ) = ONE
320                IF( I.GT.2 )
321      $            A( I, I ) = ONE + REEPS
322                IFMOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
323                   A( I, I+1 ) = IMEPS
324                ELSE IF( I.GT.1 ) THEN
325                   A( I, I-1 ) = -IMEPS
326                END IF
327             ELSE IF( I.LE.8 ) THEN
328                IF( I.LE.6 ) THEN
329                   A( I, I ) = REEPS
330                ELSE
331                   A( I, I ) = -REEPS
332                END IF
333                IFMOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
334                   A( I, I+1 ) = ONE
335                ELSE IF( I.GT.1 ) THEN
336                   A( I, I-1 ) = -ONE
337                END IF
338             ELSE
339                A( I, I ) = ONE
340                IFMOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
341                   A( I, I+1 ) = IMEPS*2
342                ELSE IF( I.GT.1 ) THEN
343                   A( I, I-1 ) = -IMEPS*2
344                END IF
345             END IF
346   240    CONTINUE
347 *
348          DO 250 I = 1, N
349             E( I, I ) = ONE
350             IF( I.LE.4 ) THEN
351                B( I, I ) = -ONE
352                IF( I.GT.2 )
353      $            B( I, I ) = ONE - REEPS
354                IFMOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
355                   B( I, I+1 ) = IMEPS
356                ELSE IF( I.GT.1 ) THEN
357                   B( I, I-1 ) = -IMEPS
358                END IF
359             ELSE IF( I.LE.8 ) THEN
360                IF( I.LE.6 ) THEN
361                   B( I, I ) = REEPS
362                ELSE
363                   B( I, I ) = -REEPS
364                END IF
365                IFMOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
366                   B( I, I+1 ) = ONE + IMEPS
367                ELSE IF( I.GT.1 ) THEN
368                   B( I, I-1 ) = -ONE - IMEPS
369                END IF
370             ELSE
371                B( I, I ) = ONE - REEPS
372                IFMOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
373                   B( I, I+1 ) = IMEPS*2
374                ELSE IF( I.GT.1 ) THEN
375                   B( I, I-1 ) = -IMEPS*2
376                END IF
377             END IF
378   250    CONTINUE
379       END IF
380 *
381 *     Compute rhs (C, F)
382 *
383       CALL DGEMM( 'N''N', M, N, M, ONE, A, LDA, R, LDR, ZERO, C, LDC )
384       CALL DGEMM( 'N''N', M, N, N, -ONE, L, LDL, B, LDB, ONE, C, LDC )
385       CALL DGEMM( 'N''N', M, N, M, ONE, D, LDD, R, LDR, ZERO, F, LDF )
386       CALL DGEMM( 'N''N', M, N, N, -ONE, L, LDL, E, LDE, ONE, F, LDF )
387 *
388 *     End of DLATM5
389 *
390       END