165
166
167
168
169
170
171 DOUBLE PRECISION ALPHA, BETA
172 INTEGER K, LDA, N
173 CHARACTER TRANS, TRANSR, UPLO
174
175
176 DOUBLE PRECISION A( LDA, * ), C( * )
177
178
179
180
181
182
183 DOUBLE PRECISION ONE, ZERO
184 parameter( one = 1.0d+0, zero = 0.0d+0 )
185
186
187 LOGICAL LOWER, NORMALTRANSR, NISODD, NOTRANS
188 INTEGER INFO, NROWA, J, NK, N1, N2
189
190
191 LOGICAL LSAME
193
194
196
197
198 INTRINSIC max
199
200
201
202
203
204 info = 0
205 normaltransr =
lsame( transr,
'N' )
206 lower =
lsame( uplo,
'L' )
207 notrans =
lsame( trans,
'N' )
208
209 IF( notrans ) THEN
210 nrowa = n
211 ELSE
212 nrowa = k
213 END IF
214
215 IF( .NOT.normaltransr .AND. .NOT.
lsame( transr,
'T' ) )
THEN
216 info = -1
217 ELSE IF( .NOT.lower .AND. .NOT.
lsame( uplo,
'U' ) )
THEN
218 info = -2
219 ELSE IF( .NOT.notrans .AND. .NOT.
lsame( trans,
'T' ) )
THEN
220 info = -3
221 ELSE IF( n.LT.0 ) THEN
222 info = -4
223 ELSE IF( k.LT.0 ) THEN
224 info = -5
225 ELSE IF( lda.LT.max( 1, nrowa ) ) THEN
226 info = -8
227 END IF
228 IF( info.NE.0 ) THEN
229 CALL xerbla(
'DSFRK ', -info )
230 RETURN
231 END IF
232
233
234
235
236
237
238 IF( ( n.EQ.0 ) .OR. ( ( ( alpha.EQ.zero ) .OR. ( k.EQ.0 ) ) .AND.
239 $ ( beta.EQ.one ) ) )RETURN
240
241 IF( ( alpha.EQ.zero ) .AND. ( beta.EQ.zero ) ) THEN
242 DO j = 1, ( ( n*( n+1 ) ) / 2 )
243 c( j ) = zero
244 END DO
245 RETURN
246 END IF
247
248
249
250
251
252 IF( mod( n, 2 ).EQ.0 ) THEN
253 nisodd = .false.
254 nk = n / 2
255 ELSE
256 nisodd = .true.
257 IF( lower ) THEN
258 n2 = n / 2
259 n1 = n - n2
260 ELSE
261 n1 = n / 2
262 n2 = n - n1
263 END IF
264 END IF
265
266 IF( nisodd ) THEN
267
268
269
270 IF( normaltransr ) THEN
271
272
273
274 IF( lower ) THEN
275
276
277
278 IF( notrans ) THEN
279
280
281
282 CALL dsyrk(
'L',
'N', n1, k, alpha, a( 1, 1 ), lda,
283 $ beta, c( 1 ), n )
284 CALL dsyrk(
'U',
'N', n2, k, alpha, a( n1+1, 1 ),
285 $ lda,
286 $ beta, c( n+1 ), n )
287 CALL dgemm(
'N',
'T', n2, n1, k, alpha, a( n1+1,
288 $ 1 ),
289 $ lda, a( 1, 1 ), lda, beta, c( n1+1 ), n )
290
291 ELSE
292
293
294
295 CALL dsyrk(
'L',
'T', n1, k, alpha, a( 1, 1 ), lda,
296 $ beta, c( 1 ), n )
297 CALL dsyrk(
'U',
'T', n2, k, alpha, a( 1, n1+1 ),
298 $ lda,
299 $ beta, c( n+1 ), n )
300 CALL dgemm(
'T',
'N', n2, n1, k, alpha, a( 1,
301 $ n1+1 ),
302 $ lda, a( 1, 1 ), lda, beta, c( n1+1 ), n )
303
304 END IF
305
306 ELSE
307
308
309
310 IF( notrans ) THEN
311
312
313
314 CALL dsyrk(
'L',
'N', n1, k, alpha, a( 1, 1 ), lda,
315 $ beta, c( n2+1 ), n )
316 CALL dsyrk(
'U',
'N', n2, k, alpha, a( n2, 1 ),
317 $ lda,
318 $ beta, c( n1+1 ), n )
319 CALL dgemm(
'N',
'T', n1, n2, k, alpha, a( 1, 1 ),
320 $ lda, a( n2, 1 ), lda, beta, c( 1 ), n )
321
322 ELSE
323
324
325
326 CALL dsyrk(
'L',
'T', n1, k, alpha, a( 1, 1 ), lda,
327 $ beta, c( n2+1 ), n )
328 CALL dsyrk(
'U',
'T', n2, k, alpha, a( 1, n2 ),
329 $ lda,
330 $ beta, c( n1+1 ), n )
331 CALL dgemm(
'T',
'N', n1, n2, k, alpha, a( 1, 1 ),
332 $ lda, a( 1, n2 ), lda, beta, c( 1 ), n )
333
334 END IF
335
336 END IF
337
338 ELSE
339
340
341
342 IF( lower ) THEN
343
344
345
346 IF( notrans ) THEN
347
348
349
350 CALL dsyrk(
'U',
'N', n1, k, alpha, a( 1, 1 ), lda,
351 $ beta, c( 1 ), n1 )
352 CALL dsyrk(
'L',
'N', n2, k, alpha, a( n1+1, 1 ),
353 $ lda,
354 $ beta, c( 2 ), n1 )
355 CALL dgemm(
'N',
'T', n1, n2, k, alpha, a( 1, 1 ),
356 $ lda, a( n1+1, 1 ), lda, beta,
357 $ c( n1*n1+1 ), n1 )
358
359 ELSE
360
361
362
363 CALL dsyrk(
'U',
'T', n1, k, alpha, a( 1, 1 ), lda,
364 $ beta, c( 1 ), n1 )
365 CALL dsyrk(
'L',
'T', n2, k, alpha, a( 1, n1+1 ),
366 $ lda,
367 $ beta, c( 2 ), n1 )
368 CALL dgemm(
'T',
'N', n1, n2, k, alpha, a( 1, 1 ),
369 $ lda, a( 1, n1+1 ), lda, beta,
370 $ c( n1*n1+1 ), n1 )
371
372 END IF
373
374 ELSE
375
376
377
378 IF( notrans ) THEN
379
380
381
382 CALL dsyrk(
'U',
'N', n1, k, alpha, a( 1, 1 ), lda,
383 $ beta, c( n2*n2+1 ), n2 )
384 CALL dsyrk(
'L',
'N', n2, k, alpha, a( n1+1, 1 ),
385 $ lda,
386 $ beta, c( n1*n2+1 ), n2 )
387 CALL dgemm(
'N',
'T', n2, n1, k, alpha, a( n1+1,
388 $ 1 ),
389 $ lda, a( 1, 1 ), lda, beta, c( 1 ), n2 )
390
391 ELSE
392
393
394
395 CALL dsyrk(
'U',
'T', n1, k, alpha, a( 1, 1 ), lda,
396 $ beta, c( n2*n2+1 ), n2 )
397 CALL dsyrk(
'L',
'T', n2, k, alpha, a( 1, n1+1 ),
398 $ lda,
399 $ beta, c( n1*n2+1 ), n2 )
400 CALL dgemm(
'T',
'N', n2, n1, k, alpha, a( 1,
401 $ n1+1 ),
402 $ lda, a( 1, 1 ), lda, beta, c( 1 ), n2 )
403
404 END IF
405
406 END IF
407
408 END IF
409
410 ELSE
411
412
413
414 IF( normaltransr ) THEN
415
416
417
418 IF( lower ) THEN
419
420
421
422 IF( notrans ) THEN
423
424
425
426 CALL dsyrk(
'L',
'N', nk, k, alpha, a( 1, 1 ), lda,
427 $ beta, c( 2 ), n+1 )
428 CALL dsyrk(
'U',
'N', nk, k, alpha, a( nk+1, 1 ),
429 $ lda,
430 $ beta, c( 1 ), n+1 )
431 CALL dgemm(
'N',
'T', nk, nk, k, alpha, a( nk+1,
432 $ 1 ),
433 $ lda, a( 1, 1 ), lda, beta, c( nk+2 ),
434 $ n+1 )
435
436 ELSE
437
438
439
440 CALL dsyrk(
'L',
'T', nk, k, alpha, a( 1, 1 ), lda,
441 $ beta, c( 2 ), n+1 )
442 CALL dsyrk(
'U',
'T', nk, k, alpha, a( 1, nk+1 ),
443 $ lda,
444 $ beta, c( 1 ), n+1 )
445 CALL dgemm(
'T',
'N', nk, nk, k, alpha, a( 1,
446 $ nk+1 ),
447 $ lda, a( 1, 1 ), lda, beta, c( nk+2 ),
448 $ n+1 )
449
450 END IF
451
452 ELSE
453
454
455
456 IF( notrans ) THEN
457
458
459
460 CALL dsyrk(
'L',
'N', nk, k, alpha, a( 1, 1 ), lda,
461 $ beta, c( nk+2 ), n+1 )
462 CALL dsyrk(
'U',
'N', nk, k, alpha, a( nk+1, 1 ),
463 $ lda,
464 $ beta, c( nk+1 ), n+1 )
465 CALL dgemm(
'N',
'T', nk, nk, k, alpha, a( 1, 1 ),
466 $ lda, a( nk+1, 1 ), lda, beta, c( 1 ),
467 $ n+1 )
468
469 ELSE
470
471
472
473 CALL dsyrk(
'L',
'T', nk, k, alpha, a( 1, 1 ), lda,
474 $ beta, c( nk+2 ), n+1 )
475 CALL dsyrk(
'U',
'T', nk, k, alpha, a( 1, nk+1 ),
476 $ lda,
477 $ beta, c( nk+1 ), n+1 )
478 CALL dgemm(
'T',
'N', nk, nk, k, alpha, a( 1, 1 ),
479 $ lda, a( 1, nk+1 ), lda, beta, c( 1 ),
480 $ n+1 )
481
482 END IF
483
484 END IF
485
486 ELSE
487
488
489
490 IF( lower ) THEN
491
492
493
494 IF( notrans ) THEN
495
496
497
498 CALL dsyrk(
'U',
'N', nk, k, alpha, a( 1, 1 ), lda,
499 $ beta, c( nk+1 ), nk )
500 CALL dsyrk(
'L',
'N', nk, k, alpha, a( nk+1, 1 ),
501 $ lda,
502 $ beta, c( 1 ), nk )
503 CALL dgemm(
'N',
'T', nk, nk, k, alpha, a( 1, 1 ),
504 $ lda, a( nk+1, 1 ), lda, beta,
505 $ c( ( ( nk+1 )*nk )+1 ), nk )
506
507 ELSE
508
509
510
511 CALL dsyrk(
'U',
'T', nk, k, alpha, a( 1, 1 ), lda,
512 $ beta, c( nk+1 ), nk )
513 CALL dsyrk(
'L',
'T', nk, k, alpha, a( 1, nk+1 ),
514 $ lda,
515 $ beta, c( 1 ), nk )
516 CALL dgemm(
'T',
'N', nk, nk, k, alpha, a( 1, 1 ),
517 $ lda, a( 1, nk+1 ), lda, beta,
518 $ c( ( ( nk+1 )*nk )+1 ), nk )
519
520 END IF
521
522 ELSE
523
524
525
526 IF( notrans ) THEN
527
528
529
530 CALL dsyrk(
'U',
'N', nk, k, alpha, a( 1, 1 ), lda,
531 $ beta, c( nk*( nk+1 )+1 ), nk )
532 CALL dsyrk(
'L',
'N', nk, k, alpha, a( nk+1, 1 ),
533 $ lda,
534 $ beta, c( nk*nk+1 ), nk )
535 CALL dgemm(
'N',
'T', nk, nk, k, alpha, a( nk+1,
536 $ 1 ),
537 $ lda, a( 1, 1 ), lda, beta, c( 1 ), nk )
538
539 ELSE
540
541
542
543 CALL dsyrk(
'U',
'T', nk, k, alpha, a( 1, 1 ), lda,
544 $ beta, c( nk*( nk+1 )+1 ), nk )
545 CALL dsyrk(
'L',
'T', nk, k, alpha, a( 1, nk+1 ),
546 $ lda,
547 $ beta, c( nk*nk+1 ), nk )
548 CALL dgemm(
'T',
'N', nk, nk, k, alpha, a( 1,
549 $ nk+1 ),
550 $ lda, a( 1, 1 ), lda, beta, c( 1 ), nk )
551
552 END IF
553
554 END IF
555
556 END IF
557
558 END IF
559
560 RETURN
561
562
563
subroutine xerbla(srname, info)
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
DSYRK
logical function lsame(ca, cb)
LSAME