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