193
  194
  195
  196
  197
  198
  199      LOGICAL            TSTERR
  200      INTEGER            NM, NN, NNB, NNS, NOUT
  201      REAL               THRESH
  202
  203
  204      LOGICAL            DOTYPE( * )
  205      INTEGER            MVAL( * ), NBVAL( * ), NSVAL( * ),
  206     $                   NVAL( * ), NXVAL( * )
  207      REAL               COPYS( * ), S( * )
  208      COMPLEX            A( * ), B( * ), C( * ), COPYA( * ), COPYB( * )
  209
  210
  211
  212
  213
  214      INTEGER            NTESTS
  215      parameter( ntests = 18 )
  216      INTEGER            SMLSIZ
  217      parameter( smlsiz = 25 )
  218      REAL               ONE, ZERO
  219      parameter( one = 1.0e+0, zero = 0.0e+0 )
  220      COMPLEX            CONE, CZERO
  221      parameter( cone = ( 1.0e+0, 0.0e+0 ),
  222     $                   czero = ( 0.0e+0, 0.0e+0 ) )
  223
  224
  225      CHARACTER          TRANS
  226      CHARACTER*3        PATH
  227      INTEGER            CRANK, I, IM, IMB, IN, INB, INFO, INS, IRANK,
  228     $                   ISCALE, ITRAN, ITYPE, J, K, LDA, LDB, LDWORK,
  229     $                   LWLSY, LWORK, M, MNMIN, N, NB, NCOLS, NERRS,
  230     $                   NFAIL, NRHS, NROWS, NRUN, RANK, MB,
  231     $                   MMAX, NMAX, NSMAX, LIWORK, LRWORK,
  232     $                   LWORK_CGELS, LWORK_CGELST, LWORK_CGETSLS,
  233     $                   LWORK_CGELSS, LWORK_CGELSY,  LWORK_CGELSD,
  234     $                   LRWORK_CGELSY, LRWORK_CGELSS, LRWORK_CGELSD
  235      REAL               EPS, NORMA, NORMB, RCOND
  236
  237
  238      INTEGER            ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 )
  239      REAL               RESULT( NTESTS ), RWQ( 1 )
  240      COMPLEX            WQ( 1 )
  241
  242
  243      COMPLEX, ALLOCATABLE :: WORK (:)
  244      REAL, ALLOCATABLE :: RWORK (:), WORK2 (:)
  245      INTEGER, ALLOCATABLE :: IWORK (:)
  246
  247
  248      REAL               CQRT12, CQRT14, CQRT17, SASUM, SLAMCH
  250
  251
  256
  257
  258      INTRINSIC          max, min, int, real, sqrt
  259
  260
  261      LOGICAL            LERR, OK
  262      CHARACTER*32       SRNAMT
  263      INTEGER            INFOT, IOUNIT
  264
  265
  266      COMMON             / infoc / infot, iounit, ok, lerr
  267      COMMON             / srnamc / srnamt
  268
  269
  270      DATA               iseedy / 1988, 1989, 1990, 1991 /
  271
  272
  273
  274
  275
  276      path( 1: 1 ) = 'Complex precision'
  277      path( 2: 3 ) = 'LS'
  278      nrun = 0
  279      nfail = 0
  280      nerrs = 0
  281      DO 10 i = 1, 4
  282         iseed( i ) = iseedy( i )
  283   10 CONTINUE
  285
  286
  287
  288      rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
  289
  290
  291
  293      IF( tsterr )
  294     $   
CALL cerrls( path, nout )
 
  295
  296
  297
  298      IF( ( nm.EQ.0 .OR. nn.EQ.0 ) .AND. thresh.EQ.zero )
  299     $   
CALL alahd( nout, path )
 
  300      infot = 0
  301
  302
  303
  304      nmax = 0
  305      mmax = 0
  306      nsmax = 0
  307      DO i = 1, nm
  308         IF ( mval( i ).GT.mmax ) THEN
  309            mmax = mval( i )
  310         END IF
  311      ENDDO
  312      DO i = 1, nn
  313         IF ( nval( i ).GT.nmax ) THEN
  314            nmax = nval( i )
  315         END IF
  316      ENDDO
  317      DO i = 1, nns
  318         IF ( nsval( i ).GT.nsmax ) THEN
  319            nsmax = nsval( i )
  320         END IF
  321      ENDDO
  322      m = mmax
  323      n = nmax
  324      nrhs = nsmax
  325      mnmin = max( min( m, n ), 1 )
  326
  327
  328
  329
  330      lwork = max( 1, ( m+n )*nrhs,
  331     $      ( n+nrhs )*( m+2 ), ( m+nrhs )*( n+2 ),
  332     $      max( m+mnmin, nrhs*mnmin,2*n+m ),
  333     $      max( m*n+4*mnmin+max(m,n), m*n+2*mnmin+4*n ) )
  334      lrwork = 1
  335      liwork = 1
  336
  337
  338
  339
  340
  341      DO im = 1, nm
  342         m = mval( im )
  343         lda = max( 1, m )
  344         DO in = 1, nn
  345            n = nval( in )
  346            mnmin = max(min( m, n ),1)
  347            ldb = max( 1, m, n )
  348            DO ins = 1, nns
  349               nrhs = nsval( ins )
  350               DO irank = 1, 2
  351                  DO iscale = 1, 3
  352                     itype = ( irank-1 )*3 + iscale
  353                     IF( dotype( itype ) ) THEN
  354                        IF( irank.EQ.1 ) THEN
  355                           DO itran = 1, 2
  356                              IF( itran.EQ.1 ) THEN
  357                                 trans = 'N'
  358                              ELSE
  359                                 trans = 'C'
  360                              END IF
  361
  362
  363                              CALL cgels( trans, m, n, nrhs, a, lda,
 
  364     $                                    b, ldb, wq, -1, info )
  365                              lwork_cgels = int( wq( 1 ) )
  366
  367                              CALL cgelst( trans, m, n, nrhs, a, lda,
 
  368     $                                    b, ldb, wq, -1, info )
  369                              lwork_cgelst = int( wq( 1 ) )
  370
  371                              CALL cgetsls( trans, m, n, nrhs, a, lda,
 
  372     $                                      b, ldb, wq, -1, info )
  373                              lwork_cgetsls = int( wq( 1 ) )
  374                           ENDDO
  375                        END IF
  376
  377                        CALL cgelsy( m, n, nrhs, a, lda, b, ldb,
 
  378     $                               iwq, rcond, crank, wq, -1, rwq,
  379     $                               info )
  380                        lwork_cgelsy = int( wq( 1 ) )
  381                        lrwork_cgelsy = 2*n
  382
  383                        CALL cgelss( m, n, nrhs, a, lda, b, ldb, s,
 
  384     $                               rcond, crank, wq, -1, rwq, info )
  385                        lwork_cgelss = int( wq( 1 ) )
  386                        lrwork_cgelss = 5*mnmin
  387
  388                        CALL cgelsd( m, n, nrhs, a, lda, b, ldb, s,
 
  389     $                               rcond, crank, wq, -1, rwq, iwq,
  390     $                               info )
  391                        lwork_cgelsd = int( wq( 1 ) )
  392                        lrwork_cgelsd = int( rwq( 1 ) )
  393
  394                        liwork = max( liwork, n, iwq( 1 ) )
  395
  396                        lrwork = max( lrwork, lrwork_cgelsy,
  397     $                                lrwork_cgelss, lrwork_cgelsd )
  398
  399                        lwork = max( lwork, lwork_cgels, lwork_cgetsls,
  400     $                               lwork_cgelsy, lwork_cgelss,
  401     $                               lwork_cgelsd )
  402                     END IF
  403                  ENDDO
  404               ENDDO
  405            ENDDO
  406         ENDDO
  407      ENDDO
  408
  409      lwlsy = lwork
  410
  411      ALLOCATE( work( lwork ) )
  412      ALLOCATE( iwork( liwork ) )
  413      ALLOCATE( rwork( lrwork ) )
  414      ALLOCATE( work2( 2 * lwork ) )
  415
  416      DO 140 im = 1, nm
  417         m = mval( im )
  418         lda = max( 1, m )
  419
  420         DO 130 in = 1, nn
  421            n = nval( in )
  422            mnmin = max(min( m, n ),1)
  423            ldb = max( 1, m, n )
  424            mb = (mnmin+1)
  425
  426            DO 120 ins = 1, nns
  427               nrhs = nsval( ins )
  428
  429               DO 110 irank = 1, 2
  430                  DO 100 iscale = 1, 3
  431                     itype = ( irank-1 )*3 + iscale
  432                     IF( .NOT.dotype( itype ) )
  433     $                  GO TO 100
  434
  435
  436
  437                     IF( irank.EQ.1 ) THEN
  438
  439
  440
  441                        CALL cqrt13( iscale, m, n, copya, lda, norma,
 
  442     $                               iseed )
  443
  444
  445
  446                        DO inb = 1, nnb
  447                           nb = nbval( inb )
  449                           CALL xlaenv( 3, nxval( inb ) )
 
  450
  451
  452
  453                           DO itran = 1, 2
  454                              IF( itran.EQ.1 ) THEN
  455                                 trans = 'N'
  456                                 nrows = m
  457                                 ncols = n
  458                              ELSE
  459                                 trans = 'C'
  460                                 nrows = n
  461                                 ncols = m
  462                              END IF
  463                              ldwork = max( 1, ncols )
  464
  465
  466
  467                              IF( ncols.GT.0 ) THEN
  468                                 CALL clarnv( 2, iseed, ncols*nrhs,
 
  469     $                                        work )
  471     $                                        one / real( ncols ), work,
  472     $                                        1 )
  473                              END IF
  474                              CALL cgemm( trans, 
'No transpose', nrows,
 
  475     $                                    nrhs, ncols, cone, copya, lda,
  476     $                                    work, ldwork, czero, b, ldb )
  477                              CALL clacpy( 
'Full', nrows, nrhs, b, ldb,
 
  478     $                                     copyb, ldb )
  479
  480
  481
  482                              IF( m.GT.0 .AND. n.GT.0 ) THEN
  483                                 CALL clacpy( 
'Full', m, n, copya, lda,
 
  484     $                                        a, lda )
  485                                 CALL clacpy( 
'Full', nrows, nrhs,
 
  486     $                                        copyb, ldb, b, ldb )
  487                              END IF
  488                              srnamt = 'CGELS '
  489                              CALL cgels( trans, m, n, nrhs, a, lda, b,
 
  490     $                                    ldb, work, lwork, info )
  491
  492                              IF( info.NE.0 )
  493     $                           
CALL alaerh( path, 
'CGELS ', info, 0,
 
  494     $                                        trans, m, n, nrhs, -1, nb,
  495     $                                        itype, nfail, nerrs,
  496     $                                        nout )
  497
  498
  499
  500
  501
  502
  503                              IF( nrows.GT.0 .AND. nrhs.GT.0 )
  504     $                           
CALL clacpy( 
'Full', nrows, nrhs,
 
  505     $                                        copyb, ldb, c, ldb )
  506                              CALL cqrt16( trans, m, n, nrhs, copya,
 
  507     $                                     lda, b, ldb, c, ldb, rwork,
  508     $                                     result( 1 ) )
  509
  510
  511
  512
  513                              IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
  514     $                            ( itran.EQ.2 .AND. m.LT.n ) ) THEN
  515
  516
  517
  518                                 result( 2 ) = 
cqrt17( trans, 1, m, n,
 
  519     $                                         nrhs, copya, lda, b, ldb,
  520     $                                         copyb, ldb, c, work,
  521     $                                         lwork )
  522                              ELSE
  523
  524
  525
  526                                 result( 2 ) = 
cqrt14( trans, m, n,
 
  527     $                                         nrhs, copya, lda, b, ldb,
  528     $                                         work, lwork )
  529                              END IF
  530
  531
  532
  533
  534                              DO k = 1, 2
  535                                 IF( result( k ).GE.thresh ) THEN
  536                                    IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  537     $                                 
CALL alahd( nout, path )
 
  538                                    WRITE( nout, fmt = 9999 )trans, m,
  539     $                                 n, nrhs, nb, itype, k,
  540     $                                 result( k )
  541                                    nfail = nfail + 1
  542                                 END IF
  543                              END DO
  544                              nrun = nrun + 2
  545                           END DO
  546                        END DO
  547                     END IF
  548
  549
  550
  551
  552
  553
  554                     IF( irank.EQ.1 ) THEN
  555
  556
  557
  558                        CALL cqrt13( iscale, m, n, copya, lda, norma,
 
  559     $                               iseed )
  560
  561
  562
  563                        DO inb = 1, nnb
  564                           nb = nbval( inb )
  566                           CALL xlaenv( 3, nxval( inb ) )
 
  567
  568
  569
  570                           DO itran = 1, 2
  571                              IF( itran.EQ.1 ) THEN
  572                                 trans = 'N'
  573                                 nrows = m
  574                                 ncols = n
  575                              ELSE
  576                                 trans = 'C'
  577                                 nrows = n
  578                                 ncols = m
  579                              END IF
  580                              ldwork = max( 1, ncols )
  581
  582
  583
  584                              IF( ncols.GT.0 ) THEN
  585                                 CALL clarnv( 2, iseed, ncols*nrhs,
 
  586     $                                        work )
  588     $                                        one / real( ncols ), work,
  589     $                                        1 )
  590                              END IF
  591                              CALL cgemm( trans, 
'No transpose', nrows,
 
  592     $                                    nrhs, ncols, cone, copya, lda,
  593     $                                    work, ldwork, czero, b, ldb )
  594                              CALL clacpy( 
'Full', nrows, nrhs, b, ldb,
 
  595     $                                     copyb, ldb )
  596
  597
  598
  599                              IF( m.GT.0 .AND. n.GT.0 ) THEN
  600                                 CALL clacpy( 
'Full', m, n, copya, lda,
 
  601     $                                        a, lda )
  602                                 CALL clacpy( 
'Full', nrows, nrhs,
 
  603     $                                        copyb, ldb, b, ldb )
  604                              END IF
  605                              srnamt = 'CGELST'
  606                              CALL cgelst( trans, m, n, nrhs, a, lda, b,
 
  607     $                                    ldb, work, lwork, info )
  608
  609                              IF( info.NE.0 )
  610     $                           
CALL alaerh( path, 
'CGELST', info, 0,
 
  611     $                                        trans, m, n, nrhs, -1, nb,
  612     $                                        itype, nfail, nerrs,
  613     $                                        nout )
  614
  615
  616
  617
  618
  619
  620                              IF( nrows.GT.0 .AND. nrhs.GT.0 )
  621     $                           
CALL clacpy( 
'Full', nrows, nrhs,
 
  622     $                                        copyb, ldb, c, ldb )
  623                              CALL cqrt16( trans, m, n, nrhs, copya,
 
  624     $                                     lda, b, ldb, c, ldb, rwork,
  625     $                                     result( 3 ) )
  626
  627
  628
  629
  630                              IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
  631     $                            ( itran.EQ.2 .AND. m.LT.n ) ) THEN
  632
  633
  634
  635                                 result( 4 ) = 
cqrt17( trans, 1, m, n,
 
  636     $                                         nrhs, copya, lda, b, ldb,
  637     $                                         copyb, ldb, c, work,
  638     $                                         lwork )
  639                              ELSE
  640
  641
  642
  643                                 result( 4 ) = 
cqrt14( trans, m, n,
 
  644     $                                         nrhs, copya, lda, b, ldb,
  645     $                                         work, lwork )
  646                              END IF
  647
  648
  649
  650
  651                              DO k = 3, 4
  652                                 IF( result( k ).GE.thresh ) THEN
  653                                    IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  654     $                                 
CALL alahd( nout, path )
 
  655                                    WRITE( nout, fmt = 9999 )trans, m,
  656     $                                 n, nrhs, nb, itype, k,
  657     $                                 result( k )
  658                                    nfail = nfail + 1
  659                                 END IF
  660                              END DO
  661                              nrun = nrun + 2
  662                           END DO
  663                        END DO
  664                     END IF
  665
  666
  667
  668
  669
  670
  671                     IF( irank.EQ.1 ) THEN
  672
  673
  674
  675                        CALL cqrt13( iscale, m, n, copya, lda, norma,
 
  676     $                               iseed )
  677
  678
  679
  680                        DO inb = 1, nnb
  681                           mb = nbval( inb )
  683
  684
  685
  686                           DO imb = 1, nnb
  687                              nb = nbval( imb )
  689
  690
  691
  692
  693                              DO itran = 1, 2
  694                                 IF( itran.EQ.1 ) THEN
  695                                    trans = 'N'
  696                                    nrows = m
  697                                    ncols = n
  698                                 ELSE
  699                                    trans = 'C'
  700                                    nrows = n
  701                                    ncols = m
  702                                 END IF
  703                                 ldwork = max( 1, ncols )
  704
  705
  706
  707                                 IF( ncols.GT.0 ) THEN
  708                                    CALL clarnv( 2, iseed, ncols*nrhs,
 
  709     $                                           work )
  710                                    CALL cscal( ncols*nrhs,
 
  711     $                                          cone / real( ncols ),
  712     $                                          work, 1 )
  713                                 END IF
  714                                 CALL cgemm( trans, 
'No transpose',
 
  715     $                                       nrows, nrhs, ncols, cone,
  716     $                                       copya, lda, work, ldwork,
  717     $                                       czero, b, ldb )
  718                                 CALL clacpy( 
'Full', nrows, nrhs,
 
  719     $                                        b, ldb, copyb, ldb )
  720
  721
  722
  723                                 IF( m.GT.0 .AND. n.GT.0 ) THEN
  724                                    CALL clacpy( 
'Full', m, n,
 
  725     $                                           copya, lda, a, lda )
  726                                    CALL clacpy( 
'Full', nrows, nrhs,
 
  727     $                                           copyb, ldb, b, ldb )
  728                                 END IF
  729                                 srnamt = 'CGETSLS '
  730                                 CALL cgetsls( trans, m, n, nrhs, a,
 
  731     $                                    lda, b, ldb, work, lwork,
  732     $                                    info )
  733                                 IF( info.NE.0 )
  734     $                              
CALL alaerh( path, 
'CGETSLS ', info,
 
  735     $                                           0, trans, m, n, nrhs,
  736     $                                           -1, nb, itype, nfail,
  737     $                                           nerrs, nout )
  738
  739
  740
  741
  742
  743
  744                                 IF( nrows.GT.0 .AND. nrhs.GT.0 )
  745     $                              
CALL clacpy( 
'Full', nrows, nrhs,
 
  746     $                                           copyb, ldb, c, ldb )
  747                                 CALL cqrt16( trans, m, n, nrhs,
 
  748     $                                        copya, lda, b, ldb,
  749     $                                        c, ldb, work2,
  750     $                                        result( 5 ) )
  751
  752
  753
  754
  755                                 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
  756     $                               ( itran.EQ.2 .AND. m.LT.n ) ) THEN
  757
  758
  759
  760
  761
  762                                    result( 6 ) = 
cqrt17( trans, 1, m,
 
  763     $                                             n, nrhs, copya, lda,
  764     $                                             b, ldb, copyb, ldb,
  765     $                                             c, work, lwork )
  766                                 ELSE
  767
  768
  769
  770                                    result( 6 ) = 
cqrt14( trans, m, n,
 
  771     $                                             nrhs, copya, lda, b,
  772     $                                             ldb, work, lwork )
  773                                 END IF
  774
  775
  776
  777
  778                                 DO k = 5, 6
  779                                    IF( result( k ).GE.thresh ) THEN
  780                                       IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  781     $                                    
CALL alahd( nout, path )
 
  782                                       WRITE( nout, fmt = 9997 )trans,
  783     $                                    m, n, nrhs, mb, nb, itype, k,
  784     $                                    result( k )
  785                                          nfail = nfail + 1
  786                                    END IF
  787                                 END DO
  788                                 nrun = nrun + 2
  789                              END DO
  790                           END DO
  791                        END DO
  792                     END IF
  793
  794
  795
  796
  797
  798
  799
  800                     CALL cqrt15( iscale, irank, m, n, nrhs, copya, lda,
 
  801     $                            copyb, ldb, copys, rank, norma, normb,
  802     $                            iseed, work, lwork )
  803
  804
  805
  806                     ldwork = max( 1, m )
  807
  808
  809
  810                     DO 90 inb = 1, nnb
  811                        nb = nbval( inb )
  813                        CALL xlaenv( 3, nxval( inb ) )
 
  814
  815
  816
  817
  818
  819
  820
  821
  822                        CALL clacpy( 
'Full', m, n, copya, lda, a, lda )
 
  823                        CALL clacpy( 
'Full', m, nrhs, copyb, ldb, b,
 
  824     $                               ldb )
  825
  826
  827
  828                        DO 70 j = 1, n
  829                           iwork( j ) = 0
  830   70                   CONTINUE
  831
  832                        srnamt = 'CGELSY'
  833                        CALL cgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
 
  834     $                               rcond, crank, work, lwlsy, rwork,
  835     $                               info )
  836                        IF( info.NE.0 )
  837     $                     
CALL alaerh( path, 
'CGELSY', info, 0, 
' ', m,
 
  838     $                                  n, nrhs, -1, nb, itype, nfail,
  839     $                                  nerrs, nout )
  840
  841
  842
  843
  844
  845
  846                        result( 7 ) = 
cqrt12( crank, crank, a, lda,
 
  847     $                                copys, work, lwork, rwork )
  848
  849
  850
  851
  852                        CALL clacpy( 
'Full', m, nrhs, copyb, ldb, work,
 
  853     $                               ldwork )
  854                        CALL cqrt16( 
'No transpose', m, n, nrhs, copya,
 
  855     $                               lda, b, ldb, work, ldwork, rwork,
  856     $                               result( 8 ) )
  857
  858
  859
  860
  861                        result( 9 ) = zero
  862                        IF( m.GT.crank )
  863     $                     result( 9 ) = 
cqrt17( 
'No transpose', 1, m,
 
  864     $                                   n, nrhs, copya, lda, b, ldb,
  865     $                                   copyb, ldb, c, work, lwork )
  866
  867
  868
  869
  870                        result( 10 ) = zero
  871
  872                        IF( n.GT.crank )
  873     $                     result( 10 ) = 
cqrt14( 
'No transpose', m, n,
 
  874     $                                   nrhs, copya, lda, b, ldb,
  875     $                                   work, lwork )
  876
  877
  878
  879
  880
  881
  882
  883                        CALL clacpy( 
'Full', m, n, copya, lda, a, lda )
 
  884                        CALL clacpy( 
'Full', m, nrhs, copyb, ldb, b,
 
  885     $                               ldb )
  886                        srnamt = 'CGELSS'
  887                        CALL cgelss( m, n, nrhs, a, lda, b, ldb, s,
 
  888     $                               rcond, crank, work, lwork, rwork,
  889     $                               info )
  890
  891                        IF( info.NE.0 )
  892     $                     
CALL alaerh( path, 
'CGELSS', info, 0, 
' ', m,
 
  893     $                                  n, nrhs, -1, nb, itype, nfail,
  894     $                                  nerrs, nout )
  895
  896
  897
  898
  899
  900
  901                        IF( rank.GT.0 ) THEN
  902                           CALL saxpy( mnmin, -one, copys, 1, s, 1 )
 
  903                           result( 11 ) = 
sasum( mnmin, s, 1 ) /
 
  904     $                                    
sasum( mnmin, copys, 1 ) /
 
  905     $                                    ( eps*real( mnmin ) )
  906                        ELSE
  907                           result( 11 ) = zero
  908                        END IF
  909
  910
  911
  912                        CALL clacpy( 
'Full', m, nrhs, copyb, ldb, work,
 
  913     $                               ldwork )
  914                        CALL cqrt16( 
'No transpose', m, n, nrhs, copya,
 
  915     $                               lda, b, ldb, work, ldwork, rwork,
  916     $                               result( 12 ) )
  917
  918
  919
  920                        result( 13 ) = zero
  921                        IF( m.GT.crank )
  922     $                     result( 13 ) = 
cqrt17( 
'No transpose', 1, m,
 
  923     $                                    n, nrhs, copya, lda, b, ldb,
  924     $                                    copyb, ldb, c, work, lwork )
  925
  926
  927
  928                        result( 14 ) = zero
  929                        IF( n.GT.crank )
  930     $                     result( 14 ) = 
cqrt14( 
'No transpose', m, n,
 
  931     $                                    nrhs, copya, lda, b, ldb,
  932     $                                    work, lwork )
  933
  934
  935
  936
  937
  938
  939
  941
  942                        CALL clacpy( 
'Full', m, n, copya, lda, a, lda )
 
  943                        CALL clacpy( 
'Full', m, nrhs, copyb, ldb, b,
 
  944     $                               ldb )
  945
  946                        srnamt = 'CGELSD'
  947                        CALL cgelsd( m, n, nrhs, a, lda, b, ldb, s,
 
  948     $                               rcond, crank, work, lwork, rwork,
  949     $                               iwork, info )
  950                        IF( info.NE.0 )
  951     $                     
CALL alaerh( path, 
'CGELSD', info, 0, 
' ', m,
 
  952     $                                  n, nrhs, -1, nb, itype, nfail,
  953     $                                  nerrs, nout )
  954
  955
  956
  957                        IF( rank.GT.0 ) THEN
  958                           CALL saxpy( mnmin, -one, copys, 1, s, 1 )
 
  959                           result( 15 ) = 
sasum( mnmin, s, 1 ) /
 
  960     $                                    
sasum( mnmin, copys, 1 ) /
 
  961     $                                    ( eps*real( mnmin ) )
  962                        ELSE
  963                           result( 15 ) = zero
  964                        END IF
  965
  966
  967
  968                        CALL clacpy( 
'Full', m, nrhs, copyb, ldb, work,
 
  969     $                               ldwork )
  970                        CALL cqrt16( 
'No transpose', m, n, nrhs, copya,
 
  971     $                               lda, b, ldb, work, ldwork, rwork,
  972     $                               result( 16 ) )
  973
  974
  975
  976                        result( 17 ) = zero
  977                        IF( m.GT.crank )
  978     $                     result( 17 ) = 
cqrt17( 
'No transpose', 1, m,
 
  979     $                                    n, nrhs, copya, lda, b, ldb,
  980     $                                    copyb, ldb, c, work, lwork )
  981
  982
  983
  984                        result( 18 ) = zero
  985                        IF( n.GT.crank )
  986     $                     result( 18 ) = 
cqrt14( 
'No transpose', m, n,
 
  987     $                                    nrhs, copya, lda, b, ldb,
  988     $                                    work, lwork )
  989
  990
  991
  992
  993                        DO 80 k = 7, 18
  994                           IF( result( k ).GE.thresh ) THEN
  995                              IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  996     $                           
CALL alahd( nout, path )
 
  997                              WRITE( nout, fmt = 9998 )m, n, nrhs, nb,
  998     $                           itype, k, result( k )
  999                              nfail = nfail + 1
 1000                           END IF
 1001   80                   CONTINUE
 1002                        nrun = nrun + 12
 1003
 1004   90                CONTINUE
 1005  100             CONTINUE
 1006  110          CONTINUE
 1007  120       CONTINUE
 1008  130    CONTINUE
 1009  140 CONTINUE
 1010
 1011
 1012
 1013      CALL alasvm( path, nout, nfail, nrun, nerrs )
 
 1014
 1015 9999 FORMAT( ' TRANS=''', a1, ''', M=', i5, ', N=', i5, ', NRHS=', i4,
 1016     $      ', NB=', i4, ', type', i2, ', test(', i2, ')=', g12.5 )
 1017 9998 FORMAT( ' M=', i5, ', N=', i5, ', NRHS=', i4, ', NB=', i4,
 1018     $      ', type', i2, ', test(', i2, ')=', g12.5 )
 1019 9997 FORMAT( ' TRANS=''', a1,' M=', i5, ', N=', i5, ', NRHS=', i4,
 1020     $      ', MB=', i4,', NB=', i4,', type', i2,
 1021     $      ', test(', i2, ')=', g12.5 )
 1022
 1023      DEALLOCATE( work )
 1024      DEALLOCATE( rwork )
 1025      DEALLOCATE( iwork )
 1026      RETURN
 1027
 1028
 1029
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine cerrls(path, nunit)
CERRLS
real function cqrt12(m, n, a, lda, s, work, lwork, rwork)
CQRT12
subroutine cqrt13(scale, m, n, a, lda, norma, iseed)
CQRT13
real function cqrt14(trans, m, n, nrhs, a, lda, x, ldx, work, lwork)
CQRT14
subroutine cqrt15(scale, rksel, m, n, nrhs, a, lda, b, ldb, s, rank, norma, normb, iseed, work, lwork)
CQRT15
subroutine cqrt16(trans, m, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
CQRT16
real function cqrt17(trans, iresid, m, n, nrhs, a, lda, x, ldx, b, ldb, c, work, lwork)
CQRT17
real function sasum(n, sx, incx)
SASUM
subroutine saxpy(n, sa, sx, incx, sy, incy)
SAXPY
subroutine cgels(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info)
CGELS solves overdetermined or underdetermined systems for GE matrices
subroutine cgelsd(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, lwork, rwork, iwork, info)
CGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices
subroutine cgelss(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, lwork, rwork, info)
CGELSS solves overdetermined or underdetermined systems for GE matrices
subroutine cgelst(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info)
CGELST solves overdetermined or underdetermined systems for GE matrices using QR or LQ factorization ...
subroutine cgelsy(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, work, lwork, rwork, info)
CGELSY solves overdetermined or underdetermined systems for GE matrices
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
subroutine cgetsls(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info)
CGETSLS
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
real function slamch(cmach)
SLAMCH
subroutine clarnv(idist, iseed, n, x)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine csscal(n, sa, cx, incx)
CSSCAL
subroutine cscal(n, ca, cx, incx)
CSCAL