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