1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441 DOUBLE PRECISION ZERO
1442 parameter( zero = 0.0d0 )
1443
1444 DOUBLE PRECISION EPS, THRESH
1445 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
1446 LOGICAL FATAL, REWI, TRACE
1447 CHARACTER*13 SNAME
1448
1449 DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1450 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
1451 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
1452 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
1453 $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
1454 INTEGER IDIM( NIDIM )
1455
1456 DOUBLE PRECISION ALPHA, ALS, BETA, BETS, ERR, ERRMAX
1457 INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,
1458 $ LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,
1459 $ NARGS, NC, NS
1460 LOGICAL NULL, RESET, SAME, TRAN, UPPER
1461 CHARACTER*1 TRANS, TRANSS, UPLO, UPLOS
1462 CHARACTER*2 ICHU
1463 CHARACTER*3 ICHT
1464
1465 LOGICAL ISAME( 13 )
1466
1467 LOGICAL LDE, LDERES
1469
1471
1472 INTRINSIC max
1473
1474 INTEGER INFOT, NOUTC
1475 LOGICAL OK
1476
1477 COMMON /infoc/infot, noutc, ok
1478
1479 DATA icht/'NTC'/, ichu/'UL'/
1480
1481
1482 nargs = 10
1483 nc = 0
1484 reset = .true.
1485 errmax = zero
1486
1487 DO 100 in = 1, nidim
1488 n = idim( in )
1489
1490 ldc = n
1491 IF( ldc.LT.nmax )
1492 $ ldc = ldc + 1
1493
1494 IF( ldc.GT.nmax )
1495 $ GO TO 100
1496 lcc = ldc*n
1497 null = n.LE.0
1498
1499 DO 90 ik = 1, nidim
1500 k = idim( ik )
1501
1502 DO 80 ict = 1, 3
1503 trans = icht( ict: ict )
1504 tran = trans.EQ.'T'.OR.trans.EQ.'C'
1505 IF( tran )THEN
1506 ma = k
1507 na = n
1508 ELSE
1509 ma = n
1510 na = k
1511 END IF
1512
1513 lda = ma
1514 IF( lda.LT.nmax )
1515 $ lda = lda + 1
1516
1517 IF( lda.GT.nmax )
1518 $ GO TO 80
1519 laa = lda*na
1520
1521
1522
1523 CALL dmake(
'GE',
' ',
' ', ma, na, a, nmax, aa, lda,
1524 $ reset, zero )
1525
1526 DO 70 icu = 1, 2
1527 uplo = ichu( icu: icu )
1528 upper = uplo.EQ.'U'
1529
1530 DO 60 ia = 1, nalf
1531 alpha = alf( ia )
1532
1533 DO 50 ib = 1, nbet
1534 beta = bet( ib )
1535
1536
1537
1538 CALL dmake(
'SY', uplo,
' ', n, n, c, nmax, cc,
1539 $ ldc, reset, zero )
1540
1541 nc = nc + 1
1542
1543
1544
1545 uplos = uplo
1546 transs = trans
1547 ns = n
1548 ks = k
1549 als = alpha
1550 DO 10 i = 1, laa
1551 as( i ) = aa( i )
1552 10 CONTINUE
1553 ldas = lda
1554 bets = beta
1555 DO 20 i = 1, lcc
1556 cs( i ) = cc( i )
1557 20 CONTINUE
1558 ldcs = ldc
1559
1560
1561
1562 IF( trace )
1563 $
CALL dprcn4( ntra, nc, sname, iorder, uplo,
1564 $ trans, n, k, alpha, lda, beta, ldc)
1565 IF( rewi )
1566 $ rewind ntra
1567 CALL cdsyrk( iorder, uplo, trans, n, k, alpha,
1568 $ aa, lda, beta, cc, ldc )
1569
1570
1571
1572 IF( .NOT.ok )THEN
1573 WRITE( nout, fmt = 9993 )
1574 fatal = .true.
1575 GO TO 120
1576 END IF
1577
1578
1579
1580 isame( 1 ) = uplos.EQ.uplo
1581 isame( 2 ) = transs.EQ.trans
1582 isame( 3 ) = ns.EQ.n
1583 isame( 4 ) = ks.EQ.k
1584 isame( 5 ) = als.EQ.alpha
1585 isame( 6 ) =
lde( as, aa, laa )
1586 isame( 7 ) = ldas.EQ.lda
1587 isame( 8 ) = bets.EQ.beta
1588 IF( null )THEN
1589 isame( 9 ) =
lde( cs, cc, lcc )
1590 ELSE
1591 isame( 9 ) =
lderes(
'SY', uplo, n, n, cs,
1592 $ cc, ldc )
1593 END IF
1594 isame( 10 ) = ldcs.EQ.ldc
1595
1596
1597
1598
1599 same = .true.
1600 DO 30 i = 1, nargs
1601 same = same.AND.isame( i )
1602 IF( .NOT.isame( i ) )
1603 $ WRITE( nout, fmt = 9998 )i
1604 30 CONTINUE
1605 IF( .NOT.same )THEN
1606 fatal = .true.
1607 GO TO 120
1608 END IF
1609
1610 IF( .NOT.null )THEN
1611
1612
1613
1614 jc = 1
1615 DO 40 j = 1, n
1616 IF( upper )THEN
1617 jj = 1
1618 lj = j
1619 ELSE
1620 jj = j
1621 lj = n - j + 1
1622 END IF
1623 IF( tran )THEN
1624 CALL dmmch(
'T',
'N', lj, 1, k, alpha,
1625 $ a( 1, jj ), nmax,
1626 $ a( 1, j ), nmax, beta,
1627 $ c( jj, j ), nmax, ct, g,
1628 $ cc( jc ), ldc, eps, err,
1629 $ fatal, nout, .true. )
1630 ELSE
1631 CALL dmmch(
'N',
'T', lj, 1, k, alpha,
1632 $ a( jj, 1 ), nmax,
1633 $ a( j, 1 ), nmax, beta,
1634 $ c( jj, j ), nmax, ct, g,
1635 $ cc( jc ), ldc, eps, err,
1636 $ fatal, nout, .true. )
1637 END IF
1638 IF( upper )THEN
1639 jc = jc + ldc
1640 ELSE
1641 jc = jc + ldc + 1
1642 END IF
1643 errmax = max( errmax, err )
1644
1645
1646 IF( fatal )
1647 $ GO TO 110
1648 40 CONTINUE
1649 END IF
1650
1651 50 CONTINUE
1652
1653 60 CONTINUE
1654
1655 70 CONTINUE
1656
1657 80 CONTINUE
1658
1659 90 CONTINUE
1660
1661 100 CONTINUE
1662
1663
1664
1665 IF( errmax.LT.thresh )THEN
1666 IF ( iorder.EQ.0) WRITE( nout, fmt = 10000 )sname, nc
1667 IF ( iorder.EQ.1) WRITE( nout, fmt = 10001 )sname, nc
1668 ELSE
1669 IF ( iorder.EQ.0) WRITE( nout, fmt = 10002 )sname, nc, errmax
1670 IF ( iorder.EQ.1) WRITE( nout, fmt = 10003 )sname, nc, errmax
1671 END IF
1672 GO TO 130
1673
1674 110 CONTINUE
1675 IF( n.GT.1 )
1676 $ WRITE( nout, fmt = 9995 )j
1677
1678 120 CONTINUE
1679 WRITE( nout, fmt = 9996 )sname
1680 CALL dprcn4( nout, nc, sname, iorder, uplo, trans, n, k, alpha,
1681 $ lda, beta, ldc)
1682
1683 130 CONTINUE
1684 RETURN
1685
168610003 FORMAT( ' ', a13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1687 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1688 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
168910002 FORMAT( ' ', a13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1690 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1691 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
169210001 FORMAT( ' ', a13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1693 $ ' (', i6, ' CALL', 'S)' )
169410000 FORMAT( ' ', a13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1695 $ ' (', i6, ' CALL', 'S)' )
1696 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
1697 $ 'ANGED INCORRECTLY *******' )
1698 9996 FORMAT( ' ******* ', a13,' FAILED ON CALL NUMBER:' )
1699 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', i3 )
1700 9994 FORMAT( 1x, i6, ': ', a13,'(', 2( '''', a1, ''',' ), 2( i3, ',' ),
1701 $ f4.1, ', A,', i3, ',', f4.1, ', C,', i3, ') .' )
1702 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1703 $ '******' )
1704
1705
1706
subroutine dprcn4(nout, nc, sname, iorder, uplo, transa, n, k, alpha, lda, beta, ldc)
logical function lde(ri, rj, lr)
logical function lderes(type, uplo, m, n, aa, as, lda)
subroutine dmake(type, uplo, diag, m, n, a, nmax, aa, lda, kl, ku, reset, transl)
subroutine dmmch(transa, transb, m, n, kk, alpha, a, lda, b, ldb, beta, c, ldc, ct, g, cc, ldcc, eps, err, fatal, nout, mv)